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