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