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