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