1 
  2 /**
  3  * @name	CeL function for API
  4  * @fileoverview
  5  * 本檔案包含了 include API 專用的 functions。
  6  * @since	2010/6/20 13:28:50
  7  */
  8 
  9 /*
 10 
 11 */
 12 
 13 if (typeof CeL === 'function')
 14 CeL.setup_module('data.code.API',
 15 function(library_namespace, load_arguments) {
 16 
 17 
 18 //	nothing required
 19 
 20 
 21 /**
 22  * null module constructor
 23  * @class	相容性 test 專用的 functions
 24  */
 25 CeL.data.code.API
 26 = function() {
 27 	//	null module constructor
 28 };
 29 
 30 /**
 31  * for JSDT: 有 prototype 才會將之當作 Class
 32  */
 33 CeL.data.code.API
 34 .prototype = {
 35 };
 36 
 37 
 38 
 39 
 40 
 41 /*	2008/5/29 20:6:23-6/4 2:10:21
 42 7/3 13:34	showNeighbor: 可拖曳 loc->name/address, 有資料的提高優先權, bug fix: 有些太遠的還是會被列入, 有些近的可能因為不是住址而不會被列入
 43 7/9 13:9:15	context menu
 44 7/9 21:12:3	getLocations
 45 2009/7/20 20:27:58	稍作修正
 46 
 47 
 48 bug:
 49 名稱相同時會出現被覆蓋的情況!
 50 
 51 
 52 TO TEST:
 53 
 54 
 55 showClass.setRepository('_ev_');
 56 
 57 sC=showClass.showOnScope;
 58 
 59 sC('mp',GLog.write);
 60 
 61 sC('Fb','mp');
 62 
 63 sC('y','Fb');
 64 
 65 sC('A','y');
 66 
 67 
 68 to use:
 69 
 70 <script type="text/javascript" src="map.js"></script>
 71 <script type="text/javascript">//<![CDATA[
 72 wAPIcode('Gmap');
 73 //]]></script>
 74 
 75 
 76 TODO:
 77 分類(Categories)&分顏色顯示
 78 Auto Zoom Out	http://esa.ilmari.googlepages.com/sorry.htm
 79 search data only
 80 preload map & markers
 81 GDirections
 82 圈選
 83 用經緯度查詢
 84 
 85 c.f. http://jmaps.digitalspaghetti.me.uk/
 86 
 87 http://www.ascc.sinica.edu.tw/nl/90/1706/02.txt
 88 臺灣地區地名網站
 89 http://tgnis.ascc.net
 90 http://placesearch.moi.gov.tw/index_tw.php
 91 
 92 地名學名詞解釋彙編
 93 http://webgis.sinica.edu.tw/geo/Termquery.asp
 94 
 95 臺灣地區地名相關文獻查詢系統
 96 http://webgis.sinica.edu.tw/geo/reference.html
 97 
 98 經濟部中央地質調查所-地質資料整合查詢
 99 http://datawarehouse.moeacgs.gov.tw/geo/index/GISSearch/MSDefault.htm
100 
101 
102 http://gissrv3.sinica.edu.tw/tgnis_query/link.php?cid=1
103 http://www.edu.geo.ntnu.edu.tw/modules/wordpress/2008/06/08/yxaewaweaeobmh/
104 
105 
106 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=1&d_database=25k_2002
107 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=1085&d_database=5000_1
108 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=01663&d_database=chen_quo
109 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=1663&d_database=chen_jen
110 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=11880&d_database=tw_fort
111 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=02713&d_database=ching
112 
113 http://gissrv3.sinica.edu.tw/input/detail.php?input_id=45875
114 
115 資料庫	編號	類型(類別)	名稱	地理座標(經緯度)	所屬縣市鄉鎮(所屬行政區,地點)	別稱	註記(所在圖號)	意義(說明)
116 
117 
118 
119 http://www.isp.tw/zip.php
120 
121 小工具
122 
123 1.溫度轉換
124 2.進位換算
125 3.BMI值及熱量需求計算
126 4.角度徑度換算
127 5.度量衡計算
128 6.區碼國碼查詢
129 7.郵遞區號查詢
130 8.金融機構代號查詢
131 9.色彩表示法查詢
132 10.摩斯密碼及字母述語
133 11.生肖星座查詢
134 12.婦女安全期計算
135 13.花言花語查詢
136 14.常用機關電話查詢
137 15.航空公司機場代碼查詢
138 16.簡易匯率換算
139 17.國曆農曆換算
140 18.急救及疾病忌口寶典
141 19.尺碼對照表
142 20.自訂公式計算
143 21.股票投資組合管理
144 
145 
146 */
147 
148 
149 
150 
151 /*	初始化 Google Gears
152 http://code.google.com/apis/gears/gears_init.js
153 http://blog.ericsk.org/archives/978
154 http://chuiwenchiu.spaces.live.com/blog/cns!CA5D9227DF9E78E8!1063.entry
155 
156 Google Gears退休: Gears功能正被整合到HTML5規格中
157 we expect developers to use HTML5 for these features moving forward as it's a standards-based approach that will be available across all browsers.
158 http://it.solidot.org/article.pl?sid=09/12/03/0539248
159 */
160 function init_Google_Gears() {
161 	// 檢查是否已經定義 Google Gear
162 	if (window.google && google.gears)
163 		return;
164 
165 	var factory = null;
166 	// 依據不同的瀏覽器,採用不同方式產生 GearFactory
167 	if (typeof GearsFactory != 'undefined')
168 		// Firefox
169 		factory = new GearsFactory();
170 	else
171 		try {
172 			// IE
173 			factory = new ActiveXObject('Gears.Factory');
174 			// privateSetGlobalObject is only required and supported on WinCE.
175 			if (factory.getBuildInfo().indexOf('ie_mobile') != -1)
176 				factory.privateSetGlobalObject(this);
177 		} catch (e) {
178 			// Safari
179 			if (typeof navigator.mimeTypes != 'undefined'
180 					&& navigator.mimeTypes["application/x-googlegears"]) {
181 				factory = document.createElement("object");
182 				factory.style.display = "none";
183 				factory.width = factory.height = 0;
184 				factory.type = "application/x-googlegears";
185 				document.documentElement.appendChild(factory);
186 			}
187 		}
188 	if (!factory)
189 		return 1;
190 
191 	if (!window.google)
192 		window.google = {};
193 	if (!google.gears)
194 		google.gears = {
195 			factory : factory
196 		};
197 
198 }
199 
200 
201 /*
202 f={catch:true/false/update, restore:false/true.}
203 */
204 catchFile.ls=0;	//	localServer
205 catchFile.sn='catch-files';	//	storeName: 定義 Managed Store 的名稱,這個名稱可用於 createManagedStore, removeManagedStore 和 openManagedStore 三個 API
206 catchFile.s=0;	//	managed store
207 //
208 catchFile.f=function(url,success,captureId){};
209 catchFile.fL=[location.pathname];	//	file list
210 catchFile.doCache=1;
211 catchFile.noAsk=1;
212 function catchFile(fList, f) {
213 	var _f = arguments.callee;
214 	if (!_f.doCache)
215 		return;
216 
217 	if (window.location.protocol == 'file:') {
218 		sl('catchFile: Google Gears 不能在本機上執行或測試!');
219 		return 0;
220 	}
221 
222 	if (init_Google_Gears()) {
223 		if (_f.answered)
224 			return 0;
225 		_f.answered = 1;
226 		if (!_f.noAsk && confirm('使用本功能必須安裝 Google Gears,請問您要安裝嗎?'))
227 			// ?action=install&message=加入你的訊息&return=安裝後要導回的網址
228 			window.location.href = 'http://gears.google.com/';
229 		else
230 			sl('<em>catchFile: 若不安裝 Google Gears 則將無法使用本功能!</em>');
231 		return 1;
232 	}
233 
234 	if (!_f.ls)
235 		try {
236 			// 建立 Local Server
237 			_f.ls = window.google.gears.factory.create('beta.localserver',
238 			'1.0');
239 		} catch (e) {
240 			sl('catchFile: Could not create local server: ['
241 					+ (e.number & 0xFFFF) + '] ' + e.message);
242 			return 2;
243 		}
244 
245 	if (!_f.s)
246 		try {
247 			// 建立儲存空間
248 			_f.s = _f.ls.createManagedStore(_f.sn);
249 			_f.s = _f.ls.createStore(_f.sn);
250 		} catch (e) {
251 			if (window.location.protocol == 'file:')
252 				sl('Google Gears 不能在本機上執行測試!');
253 			else
254 				sl('catchFile: Could not create managed store: ['
255 						+ (e.number & 0xFFFF) + '] ' + e.message);
256 			return 3;
257 		}
258 
259 	if ((fList instanceof String) && fList) {
260 		// TODO: untested!!
261 		// 指定 json 的 url
262 		_f.s.manifestUrl(fList);
263 		// 開始確定版本及同步
264 		_f.s.checkForUpdate();
265 
266 		// 為了確認是否同步結束了,可以加入下列的 timer 來檢查:
267 		var timer = google.gears.factory.create('beta.timer');
268 		// 每 500ms 檢查一下
269 		var timerId = timer.setInterval(function() {
270 			// 同步完成
271 			if (store.currentVersion) {
272 				timer.clearInterval(timerId);
273 				sl('同步完成');
274 			}
275 		}, 500);
276 	} else if ((fList instanceof Array) && fList.length)
277 		_f.fL = _f.fL.concat(fList);
278 
279 	// If the store already exists, it will be opened
280 	if (_f.s)
281 		try {
282 			_f.s.capture(_f.fL, _f.f);
283 		} catch (e) {
284 			if (e.message == 'Url is not from the same origin')
285 				sl('需要在同樣的 domain!');
286 			else
287 				sl('catchFile: Could not capture file: [' + (e.number & 0xFFFF)
288 						+ '] ' + e.message);
289 			return 4;
290 		}
291 
292 /*
293 	// uncapture
294 	for ( var i = 0; i < fList.length; i++) {
295 		_f.s.remove(fList[i]);
296 	}
297 	// removeStore
298 	if (localServer.openStore(storeName)) {
299 		localServer.removeStore(storeName);
300 		_f.s = null;
301 	}
302  */
303 
304 };
305 
306 
307 
308 /*	http://blog.wctang.info/2007/07/use-google-map-api-without-api-key.html
309 驗證的程式叫 GValidateKey,是定義在 main.js,但呼叫的動作是寫在 maps.js 裡
310 
311 
312 
313 function showClass(c, n) {
314 	var i, sp = '<hr style="width:40%;float:left;"/><br style="clear:both;"/>', h = '<span style="color:#bbb;font-size:.8em;">', p = function(
315 			m, p) {
316 		sl(h + n + (p ? '.prototype' : '') + '.</span><em>' + m + '</em> ' + h
317 				+ '=</span> ' + f(c[m]));
318 	}, f = function(f) {
319 		return (f + '').replace(/\n/g, '<br/>').replace(/ /g, ' ');
320 	};
321 	if (typeof c == 'string') {
322 		if (!n)
323 			n = c;
324 		c = eval(c);
325 	}
326 	if (!n)
327 		n = '';
328 	sl('<hr/>Show class: (' + (typeof c) + ')'
329 			+ (n ? ' [<em>' + n + '</em>]' : '') + '<br/>'
330 			// +(n?'<em>'+n+'</em> '+h+'=</span> ':'')
331 			+ f(c));
332 	if (c) {
333 		sl(sp + 'class member:');
334 		for (i in c)
335 			if (i != 'prototype')
336 				p(i);
337 		sl(sp + 'prototype:');
338 		c = c.prototype;
339 		for (i in c)
340 			p(i, 1);
341 	}
342 	sl('<hr/>');
343 }
344 
345 //showClass('GValidateKey');
346 
347 _v = {};
348 eval('_v.lp=lp;', GValidateKey);
349 //showClass(_v.lp,'lp');
350 
351 eval('_v.j=j;', GValidateKey);
352 //showClass(_v.j,'j');
353 
354 eval('_v.ep=ep;', GValidateKey);
355 showClass(_v.ep, 'ep');
356 
357 //sl(_v.lp('http:', 'lyrics.meicho.com.tw', '/game/index.htm').join('<br/>'));
358 
359 var b = _v.lp('http:', 'lyrics.meicho.com.tw', '/game/index.htm');
360 for ( var c = 0; c < b.length; ++c) {
361 	var d = b[c];
362 	sl(d + '; ' + _v.ep(d));
363 }
364 
365 */
366 
367 
368 
369 
370 
371 CeL.data.code.API
372 .
373 /**
374  * 自動挑選 domain
375  * @param	API	API name
376  * @param	callback	null: do NOT load
377  * @return	[ API url, API key ]
378  * @since	2010/6/20 22:12:23
379  * @see
380  * 
381  */
382 use_API = function(API, callback) {
383 	var _s = _.use_API,
384 	url_set = _s.API_URL, url = window.location,
385 	key_set = _s.API_key, API_key;
386 
387 	if (	!library_namespace.is_Array(url_set = url_set[API]) || typeof url_set[1] !== 'function' ||
388 			!library_namespace.is_Object(key_set = key_set[url_set[0]])
389 			){
390 		CeL.err(url = 'use_API: The kind of API [' + API + '] is not included in the code pool!');
391 		throw new Error(url);
392 	}
393 
394 	if (url.protocol === 'file:')
395 		// 取得任何 legal key
396 		for (url in key_set){
397 			if (typeof key_set[url] === 'string')
398 				break;
399 		}
400 
401 	//	this is for domain + path
402 	//else if ((url = url.href.replace(/[^\/]+$/, '')) in key_set) ;
403 
404 	//	this is for domain. 不能用 .pathname: IE 會作特殊處置
405 	else if (!(url = url.href.match(/^([a-z-]+:\/\/[^\/]+\/)/)) || !((url = url[1]) in key_set)){
406 		CeL.err(url = 'use_API: This domain [' + url + '] is not included in ' + url_set[0] + ' code pool!');
407 		throw new Error(url);
408 	}
409 
410 	//library_namespace.debug('[' + url + ']\n' + key_set[url] + '\n' + location.href + '\n' + location.pathname);
411 
412 	url = url_set[1](API_key = key_set[url] || '', _s.language || '');
413 
414 	if (callback !== null){
415 		library_namespace.include_resource(
416 			url,
417 			callback
418 			//	某些舊版 Firefox 使用 createElement('script') 不被接受,因此可能需要用寫的。
419 			, 0
420 			, 0
421 			);
422 
423 		library_namespace.debug('load [' + url_set[0] + '] ' + API + ': [<a href="' + url + '">' + url + '</a>].');
424 	}
425 
426 	return [ url, API_key ];
427 };
428 
429 CeL.data.code.API
430 .
431 /**
432  * 語系. e.g., zh-TW, ja, en
433  */
434 use_API.language = 'zh-TW';
435 
436 CeL.data.code.API
437 .
438 use_API.API_key = {
439 	Google : {
440 		/*
441 		 * 在本機上試用 Google Map API 並不需要去申請 API Key。
442 		 * 2008/7/15 20:40:49	但幾天前起 GClientGeocoder 需要。而在 Firefox,即使在 file:// 也不可行??
443 		 */
444 
445 		/*
446 		//	by account fan0123321
447 		'http://lyrics.meicho.com.tw/' : 'ABQIAAAAx1BFd-K0IXzdNnudsKfW3BR_OWH2p1vlzGygO-LFq-ywbfjcNBQ4wJpNt5E4VTHG4JLZ_HX8LQxVEQ',
448 		'https://lyrics.meicho.com.tw/' : 'ABQIAAAAx1BFd-K0IXzdNnudsKfW3BQ2grkpcb8ONU70KrnysR7Wz3iAOhQ7rov77Kc_pTW2t8r5-BSiIg5j6w',
449 		'http://kanashimi.meicho.com.tw/' : 'ABQIAAAAx1BFd-K0IXzdNnudsKfW3BSETOz6DhT-d0fFy_mIERGWK3ymyxQKcydi2zFol0W_QslvBsxp3BffQQ',
450 		'https://kanashimi.meicho.com.tw/' : 'ABQIAAAAx1BFd-K0IXzdNnudsKfW3BTFY8WBNAy3k9U7ZNA5kvqHv9VA-BSzdXmlU2Sm9WU6hvuSysY85kLdGw',
451 		 */
452 
453 		// by account cedegree
454 		//	AJAX Search API Key:	http://code.google.com/intl/zh-TW/apis/ajaxsearch/signup.html
455 		'http://meicho.com.tw/' : 'ABQIAAAA8YsRfLuORC22bc07JTNYsBS3JAeykUxPSpDNfPvIbcz6s5aBrRRdn1nyUM_9cYox7ymS-IgI-2CNuA',
456 		'http://211.22.213.114/' : 'ABQIAAAA8YsRfLuORC22bc07JTNYsBQ1Uh1TD6YMX-95u9UsztRVu87z9xSXJOXSHjEtKMQm2v4PGPwji5o2oA',
457 
458 		// by account kanasimi
459 		'http://lyrics.meicho.com.tw/' : 'ABQIAAAAgGipxXX8cQ5RHLEVH9TO-RR_OWH2p1vlzGygO-LFq-ywbfjcNBQcZtd9Bp9zMEQhrEtSnBy9_wJQmg',
460 		// 事實上 domain-key 就夠了。
461 		//'http://lyrics.meicho.com.tw/program/map/' : 'ABQIAAAAgGipxXX8cQ5RHLEVH9TO-RQQofoUntuAmbaLi2tPP0I7mS20HxSIGUQ5BPerzSbJB2mFqHQq07idRg',
462 		'https://lyrics.meicho.com.tw/' : 'ABQIAAAAgGipxXX8cQ5RHLEVH9TO-RQ2grkpcb8ONU70KrnysR7Wz3iAOhS24gkxeP-OqUBmABKA7PZQoacWHQ',
463 		'http://kanashimi.meicho.com.tw/' : 'ABQIAAAAgGipxXX8cQ5RHLEVH9TO-RSETOz6DhT-d0fFy_mIERGWK3ymyxSPw4AHxgM4dHjkgesM0FKx4ui2BQ',
464 		'https://kanashimi.meicho.com.tw/' : 'ABQIAAAAgGipxXX8cQ5RHLEVH9TO-RTFY8WBNAy3k9U7ZNA5kvqHv9VA-BRu-OKx8fvfBtyuqJZfb5PK0HllUQ'
465 
466 /*
467 	事實上 [*.]*.com.tw 用下面這個也行。
468 'http://com.tw/':'ABQIAAAAgGipxXX8cQ5RHLEVH9TO-RTXVjoday36ta5qc6JGQW5WaWldDhTZrWmq9ZDX6Bhhzgk7MlY9qQXvzA',
469 
470 對 http://lyrics.meicho.com.tw/game/ 會檢查的:
471 http://lyrics.meicho.com.tw/game/
472 http://lyrics.meicho.com.tw/
473 http://www.lyrics.meicho.com.tw/game/
474 http://www.lyrics.meicho.com.tw/
475 http://meicho.com.tw/game/
476 http://meicho.com.tw/
477 http://com.tw/game/
478 http://com.tw/
479 */
480 
481 	},
482 
483 	Yahoo : {
484 		// by account colorlessecho for Yahoo! map
485 		'http://lyrics.meicho.com.tw/' : 'XX9YCu_V34G1xvKMy7EOmVkPFtALrHIkVP_qG5ANRAzuTNlQKuoXVssSTBYiGSX9gjssAA--'
486 	},
487 
488 	Microsoft : {
489 		// by account cedegree@hotmail.com for VLS
490 		//	http://www.bing.com/developers/
491 		'' : 'BCBE2B0C4E58461B987145E3EBB1BFAB96FBCCD0',
492 		'http://meicho.com.tw/' : 'BCBE2B0C4E58461B987145E3EBB1BFAB96FBCCD0',
493 		'http://211.22.213.114/' : 'BCBE2B0C4E58461B987145E3EBB1BFAB96FBCCD0'
494 	}
495 };
496 
497 CeL.data.code.API
498 .
499 use_API.API_URL = {
500 	Gmap : [
501 			'Google',
502 			function(k, l) {
503 				return 'http://maps.google.com/maps?file=api&v=2&hl=' + l + '&key=' + k;
504 			} ],
505 	GAPI : [ 'Google', function(k, l) {
506 		return 'http://www.google.com/jsapi?hl=' + l + '&key=' + k;
507 	} ],
508 
509 	YMap : [ 'Yahoo', function(k) {
510 		return 'http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=' + k;
511 	} ],
512 	twYMap : [ 'Yahoo', function(k) {
513 		return 'http://tw.api.maps.yahoo.com/ajaxymap?v=3.8&appid=' + k;
514 	} ],
515 
516 	Bing: [ 'Microsoft', function(k) {
517 		return 'http://api.microsofttranslator.com/V1/Ajax.svc/Embed?appId=' + k;
518 	} ]
519 };
520 
521 
522 
523 
524 
525 
526 CeL.data.code.API
527 .
528 /**
529  * 為 Microsoft Translator 設置
530  * @param text	test to translate
531  * @param callback	callback(from text,to text)
532  * @param [from_enc]
533  * @param [to_enc]
534  * @return
535  * @see
536  * <a href="http://msdn.microsoft.com/en-us/library/ff512406.aspx" accessdate="2010/7/12 20:22">Translate Method</a>,
537  * <a href="http://www.west-wind.com/Weblog/posts/107136.aspx" accessdate="2010/7/12 20:22">JSONP for cross-site Callbacks - Rick Strahl's Web Log</a>
538  */
539 add_Microsoft_translate = function(text, callback, from_enc, to_enc) {
540 	if (!text || !callback)
541 		return;
542 
543 	var _s = _.add_Microsoft_translate, url = _s.url, name = _s.reference_name, count;
544 	// 初始化 initialization
545 	if (!url)
546 		_s.url = url = 'http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId=' +
547 				_.use_API('Bing', null)[1];
548 
549 	//library_namespace.debug('<a href="' + url + encodeURIComponent(text) + '">' + url + encodeURIComponent(text) + '</a>');
550 
551 	_s.buffer[count = _s.counter++] = [ text, callback ];
552 	// response, count, function name of add_Microsoft_translate
553 	_s['c' + count] = new Function('r',
554 			name + '.callback(r,' + count + ',"' + name + '");'
555 			);
556 	library_namespace.include_resource(
557 			url
558 				+ '&from=' + (from_enc || _s.from)
559 				+ '&to=' + (to_enc || _s.to)
560 				+ '&text=' + encodeURIComponent(text)
561 				+ '&oncomplete=' + name + '.c' + count,
562 			0,
563 			0
564 	);
565 };
566 
567 CeL.data.code.API
568 .
569 add_Microsoft_translate.from = 'en';
570 
571 CeL.data.code.API
572 .
573 add_Microsoft_translate.to = 'zh-cht';
574 
575 CeL.data.code.API
576 .
577 add_Microsoft_translate.reference_name = library_namespace.Class + '.add_Microsoft_translate';
578 
579 
580 
581 CeL.data.code.API
582 .
583 /**
584  * @inner
585  * @private
586  */
587 add_Microsoft_translate.counter = 0;
588 
589 CeL.data.code.API
590 .
591 /**
592  * @inner
593  * @private
594  */
595 add_Microsoft_translate.buffer = [];
596 
597 var ELEMENT_NODE = 1;
598 
599 CeL.data.code.API
600 .
601 /**
602  * @inner
603  * @private
604  */
605 add_Microsoft_translate.callback = function(response, count, name) {
606 	try{
607 		var _s = library_namespace.get_various(name),
608 		origin = _s.buffer[count],
609 		callback = origin[1];
610 		origin = origin[0];
611 		delete _s.buffer[count];
612 		delete _s['c' + count];
613 		if (typeof callback === 'function') {
614 			callback(response, origin);
615 		} else {
616 			if (typeof callback === 'string')
617 				callback = document.getElementById(callback);
618 			if (typeof callback === 'object'
619 				&& callback.nodeType === ELEMENT_NODE)
620 				callback.appendChild(document.createTextNode(response));
621 		}
622 	}catch (e) {
623 		library_namespace.warn('add_Microsoft_translate.callback: '+name+': error!');
624 	}
625 };
626 
627 
628 
629 
630 
631 
632 return (
633 	CeL.data.code.API
634 );
635 }
636 
637 
638 );
639 
640