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