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