      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