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