      1 ﻿
      2 /**
      3  * @name	CeL bank account function
      4  * @fileoverview
      5  * 本檔案包含了輸入 bank account 的 functions。
      6  * @since
      7  */
      8
      9
     10 if (typeof CeL === 'function'){
     11
     12 /**
     13  * 本 module 之 name(id)，<span style="text-decoration:line-through;">不設定時會從呼叫時之 path 取得</span>。
     14  * @type	String
     15  * @constant
     16  * @inner
     17  * @ignore
     18  */
     19 var module_name = 'net.form.bank_account';
     20
     21 //===================================================
     22 /**
     23  * 若欲 include 整個 module 時，需囊括之 code。
     24  * @type	Function
     25  * @param	{Function} library_namespace	namespace of library
     26  * @param	load_arguments	呼叫時之 argument(s)
     27  * @return
     28  * @name	CeL.net.form.bank_account
     29  * @constant
     30  * @inner
     31  * @ignore
     32  */
     33 var code_for_including = function(library_namespace, load_arguments) {
     34
     35 //	requires
     36 if (eval(library_namespace.use_function(
     37 		'net.form.select_input.,data.CSV.parse_CSV')))
     38 	return;
     39
     40 /**
     41  * null module constructor
     42  * @class	輸入 bank account 的 functions
     43  */
     44 CeL.net.form.bank_account
     45 = function() {
     46 	//	null module constructor
     47 };
     48
     49 /**
     50  * for JSDT: 有 prototype 才會將之當作 Class
     51  */
     52 CeL.net.form.bank_account
     53 .prototype = {
     54 };
     55
     56
     57 //	===================================================
     58 /*
     59 	used for bank account & bank id input form
     60
     61 TODO:
     62
     63
     64 HISTORY:
     65 2008/7/26 14:46:14	create
     66 */
     67
     68 _.TW=
     69
     70 (function(){
     71
     72 var
     73
     74
     75 //	class private	-----------------------------------
     76
     77 //	存放 data 的 path
     78 path = library_namespace.get_module_path(module_name, ''),
     79
     80
     81 // 總單位/支單位帳號長度
     82 mainLen=3,
     83 branchLen=7,
     84
     85 /*
     86
     87 //	and, select_input 用
     88 bank[Number(id)]={
     89 	id:'\d'			//	通匯金融代號, 郵局或是銀行代碼
     90 	name:'',		//	總單位名稱
     91 	digital:\d || [\d,..],	//	帳號長度之描述
     92 	maxD:\d,		//	max 長度
     93 	minD:\d,		//	min 長度
     94 	branch:{		//	分行
     95 		通匯金融代號:支單位名稱,..
     96 	}
     97 }
     98
     99 */
    100
    101 bank=[],
    102 bankNow,bankIdNow,
    103
    104 getBankID=function(id,force){
    105  var o=bank[id=Math.floor(id)],l,d;
    106  if(!o)return;
    107  if(!force&&('branch' in o))return o.branch;
    108
    109  //sl('getBankID: load ['+path+'id'+(id>99?'':id>9?'0':'00')+id+'.csv]');
    110  try{
    111   d=library_namespace.get_file(path+'id'+(id>99?'':id>9?'0':'00')+id+'.csv');
    112  }catch(e){
    113   //library_namespace.log('getBankID: <em>Can not get data: ['+url+']!</em> '+e.message);
    114   return;
    115  }
    116  if(!d||!(d=parse_CSV(d))||!d.length){
    117   //sl('getBankID: Can not read data from ['+url+']!');
    118   return;
    119  }
    120
    121
    122  for(i=0,l=o.branch={};i<d.length;i++)
    123   if(!isNaN(d[i][0]))
    124    //sl('getBankID: branch ['+d[i][0]+'] '+d[i][1]),
    125    l[d[i][0]]=d[i][1];
    126
    127  return l;
    128 },
    129
    130 //	將帳號長度之描述轉成帳號長度， return max digital
    131 getDigital=function(id){
    132  var o=bank[id=Math.floor(id)],d,a,i=0,m,max=0,min=Number.MAX_VALUE;
    133  if(!o)return;	//	error
    134  if('maxD' in o)return o.maxD;	//	作過了
    135
    136  //sl('getDigital: get id '+id+', parse ['+o.digital+']');
    137  d=o.digital,a=d.replace(/\n/g,'').match(/\d{1,2}位/g);
    138
    139  if(a)	//	有可能資料錯誤，無法取得。
    140   for(d=[];i<a.length;i++)
    141    if(m=a[i].match(/\d{1,2}/)){
    142     d.push(m=Math.floor(m[0]));
    143     if(min>m)min=m;
    144     if(max<m)max=m;
    145    }
    146
    147  if(!d.length)d=max=min=0;
    148  else if(d.length===1)d=max=min=d[0];
    149
    150  //sl('getDigital: '+o.name+' '+min+'-'+max);
    151  o.maxD=max;
    152  o.minD=min;
    153
    154  return max;
    155 },
    156
    157 //	模擬 inherit
    158 _=library_namespace.inherit('net.form.select_input',function(){
    159 	var _t=this,i;
    160 	if(!_t.loaded)return;
    161
    162 	_t.setClassName('bank_account_input');
    163 	_t.setSearch(function(i,k){
    164 	 //if(k)sl('compare function: ['+k+'], ['+(typeof i)+']'+i);
    165 	 return typeof i=='object'?
    166 	  //	bank
    167 	  i.id.slice(0,k.length)==k||i.name.indexOf(k)!=-1
    168 	  //	bank.branch
    169 	  :i.length<k.length?0/*i==k.slice(0,i.length)*/:i.slice(0,k.length)==k;
    170 	});
    171 	_t.setInputType(1);
    172 	i=_t.onInput;
    173 	(_t.onInput=function(k){
    174 	 //sl('onInput: input ['+k+'] - '+k.slice(0,3))
    175 	 if(_t.inputAs!=2&&k&&k.length>=mainLen){
    176 	  var id=Math.floor(k.slice(0,mainLen)),l;
    177 	  if((bank[id])&&(l=getBankID(id))&&l!==_t.setAllList())
    178 	   bankNow=bank[bankIdNow=id].name,_t.setInputType(0,id),_t.setAllList(l);
    179 	 }else if(bank!==_t.setAllList())bankNow=0,bankIdNow=-1,_t.setInputType(0,-1),_t.setAllList(bank);
    180 	 //	執行主要功能
    181 	 i.apply(_t,arguments);
    182 	 //	若達到標標準，則 triggerToInput。
    183 	 if(!_t.clickNow&&k&&(_t.inputAs==2&&k.length==mainLen||_t.inputAs==3&&k.length==branchLen||k.length==getDigital(bankIdNow)))
    184 	  _t.triggerToInput(0);
    185 	 else _t.focus();
    186 	})();
    187
    188 	//	show arrow
    189 	_t.triggerToInput(1);
    190 	_t.focus(0);
    191 }),
    192 _p=_.prototype;
    193
    194
    195 //	class public interface	---------------------------
    196
    197
    198 //	read bank id data
    199 //	這應該在所有 new 之前先作！
    200 _.readData=function(url){
    201  if(!url)return;
    202  path=url.match(/^(.+\/)?([^\/]+)$/)[1];
    203
    204  var data,i=0,a,b;
    205  try{
    206   a=library_namespace.get_file(url);
    207  }catch(e){
    208   //library_namespace.log('readData: <em>Can not get data: ['+url+']!</em> '+e.message);
    209   return;
    210  }
    211  if(!a||!(data=parse_CSV(a))||data.length<9||data[0].length<3){
    212   //sl('readData: Can not read data from ['+url+']!');
    213   return;
    214  }
    215
    216  //	reset
    217  bank=[];
    218
    219  for(;i<data.length;i++){
    220   a=data[i];
    221   bank[Math.floor(a[0])]={
    222 	id:a[0],	//	通匯金融代號
    223 	name:a[1],	//	總單位名稱
    224 	digital:a[2]	//	帳號長度之描述
    225   };
    226  }
    227
    228 };
    229
    230
    231 //	class constructor	---------------------------
    232
    233 _.readData(path+'bank/id.csv');
    234
    235
    236 //	不再使繼承
    237 delete _.clone;
    238
    239
    240 //	instance public interface	-------------------
    241
    242 //	1: all, 2: 到總單位, 3: 到支單位
    243 _p.setInputType=function(t,i){	//	(type,id)
    244  var _t=this;
    245  if(t)_t.inputAs=t,i=i||-1;
    246  t=_t.inputAs;
    247  //	mainLen+getDigital(i): 看來似乎得加上原來銀行代號 mainLen 碼。最起碼郵局是這樣。
    248  if(i)_t.setMaxLength(t==2?mainLen:t==3?branchLen:i<0?20:getDigital(i)?mainLen+getDigital(i):20);
    249  return t;
    250 };
    251
    252 //	input: (list, index), return [value, title[, key=title||value]]
    253 _p.onList=function(l,i){
    254  if(bankNow)return [l[i],i+' '+bankNow];
    255  else if(i in l)return [l[i].name,l[i].id];
    256 };
    257
    258 //	input: (list, index), return value to set as input key
    259 _p.onSelect=function(l,i){
    260  return bankNow?i:l[i].id;
    261 };
    262
    263 _p.verify = function(k) {
    264 	// sl('verify ['+k+']');
    265 	var m;
    266
    267 	if (!k && k !== 0)
    268 		return 1;
    269
    270 	if (!/^\d+$/.test(k))
    271 		return 2;
    272
    273 	if (k.length >= mainLen)
    274 		if (!bank[m = Math.floor(k.slice(0, mainLen))]
    275 				|| k.length >= branchLen
    276 				&& (m = bank[m].branch)
    277 				&& !(k.slice(0, branchLen) in m)
    278 				//	為郵局(branch length:10)特設
    279 				&& (k.slice(0, 3) !== '700' || !((k.slice(0, 10) in m))))
    280 			return 1;
    281 };
    282
    283 return _;
    284 })();	//	(function(){
    285
    286 //	===================================================
    287
    288
    289
    290
    291
    292 return (
    293 	CeL.net.form.bank_account
    294 );
    295 };
    296
    297 //===================================================
    298
    299 CeL.setup_module(module_name, code_for_including);
    300
    301 };
    302