/** * @name CeL function for API * @fileoverview * 本檔案包含了 include API 專用的 functions。 * @since 2010/6/20 13:28:50 */ /* */ 'use strict'; if (typeof CeL === 'function') CeL.run({name:'data.code.API', code:function(library_namespace) { // nothing required /** * null module constructor * @class 相容性 test 專用的 functions */ var _// JSDT:_module_ = function() { // null module constructor }; /** * for JSDT: 有 prototype 才會將之當作 Class */ _// JSDT:_module_ .prototype = { }; /* 2008/5/29 20:6:23-6/4 2:10:21 7/3 13:34 showNeighbor: 可拖曳 loc->name/address, 有資料的提高優先權, bug fix: 有些太遠的還是會被列入, 有些近的可能因為不是住址而不會被列入 7/9 13:9:15 context menu 7/9 21:12:3 getLocations 2009/7/20 20:27:58 稍作修正 bug: 名稱相同時會出現被覆蓋的情況! TO TEST: showClass.setRepository('_ev_'); sC=showClass.showOnScope; sC('mp',GLog.write); sC('Fb','mp'); sC('y','Fb'); sC('A','y'); to use: TODO: 分類(Categories)&分顏色顯示 Auto Zoom Out http://esa.ilmari.googlepages.com/sorry.htm search data only preload map & markers GDirections 圈選 用經緯度查詢 c.f. http://jmaps.digitalspaghetti.me.uk/ http://www.ascc.sinica.edu.tw/nl/90/1706/02.txt 臺灣地區地名網站 http://tgnis.ascc.net http://placesearch.moi.gov.tw/index_tw.php 地名學名詞解釋彙編 http://webgis.sinica.edu.tw/geo/Termquery.asp 臺灣地區地名相關文獻查詢系統 http://webgis.sinica.edu.tw/geo/reference.html 經濟部中央地質調查所-地質資料整合查詢 http://datawarehouse.moeacgs.gov.tw/geo/index/GISSearch/MSDefault.htm http://gissrv3.sinica.edu.tw/tgnis_query/link.php?cid=1 http://www.edu.geo.ntnu.edu.tw/modules/wordpress/2008/06/08/yxaewaweaeobmh/ http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=1&d_database=25k_2002 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=1085&d_database=5000_1 http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=01663&d_database=chen_quo http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=1663&d_database=chen_jen http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=11880&d_database=tw_fort http://gissrv3.sinica.edu.tw/search/left2_detail.php?d_number=02713&d_database=ching http://gissrv3.sinica.edu.tw/input/detail.php?input_id=45875 資料庫 編號 類型(類別) 名稱 地理座標(經緯度) 所屬縣市鄉鎮(所屬行政區,地點) 別稱 註記(所在圖號) 意義(說明) http://www.isp.tw/zip.php 小工具 1.溫度轉換 2.進位換算 3.BMI值及熱量需求計算 4.角度徑度換算 5.度量衡計算 6.區碼國碼查詢 7.郵遞區號查詢 8.金融機構代號查詢 9.色彩表示法查詢 10.摩斯密碼及字母述語 11.生肖星座查詢 12.婦女安全期計算 13.花言花語查詢 14.常用機關電話查詢 15.航空公司機場代碼查詢 16.簡易匯率換算 17.國曆農曆換算 18.急救及疾病忌口寶典 19.尺碼對照表 20.自訂公式計算 21.股票投資組合管理 */ /* 初始化 Google Gears http://code.google.com/apis/gears/gears_init.js http://blog.ericsk.org/archives/978 http://chuiwenchiu.spaces.live.com/blog/cns!CA5D9227DF9E78E8!1063.entry Google Gears退休: Gears功能正被整合到HTML5規格中 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. http://it.solidot.org/article.pl?sid=09/12/03/0539248 */ function init_Google_Gears() { // 檢查是否已經定義 Google Gear if (window.google && google.gears) return; var factory = null; // 依據不同的瀏覽器,採用不同方式產生 GearFactory if (typeof GearsFactory != 'undefined') // Firefox factory = new GearsFactory(); else try { // IE factory = new ActiveXObject('Gears.Factory'); // privateSetGlobalObject is only required and supported on WinCE. if (factory.getBuildInfo().indexOf('ie_mobile') != -1) factory.privateSetGlobalObject(this); } catch (e) { // Safari if (typeof navigator.mimeTypes != 'undefined' && navigator.mimeTypes["application/x-googlegears"]) { factory = document.createElement("object"); factory.style.display = "none"; factory.width = factory.height = 0; factory.type = "application/x-googlegears"; document.documentElement.appendChild(factory); } } if (!factory) return 1; if (!window.google) window.google = {}; if (!google.gears) google.gears = { factory : factory }; } /* f={catch:true/false/update, restore:false/true.} */ catchFile.ls=0; // localServer catchFile.sn='catch-files'; // storeName: 定義 Managed Store 的名稱,這個名稱可用於 createManagedStore, removeManagedStore 和 openManagedStore 三個 API catchFile.s=0; // managed store // catchFile.f=function(url,success,captureId){}; catchFile.fL=[location.pathname]; // file list catchFile.doCache=1; catchFile.noAsk=1; function catchFile(fList, f) { var _f = arguments.callee; if (!_f.doCache) return; if (window.location.protocol == 'file:') { sl('catchFile: Google Gears 不能在本機上執行或測試!'); return 0; } if (init_Google_Gears()) { if (_f.answered) return 0; _f.answered = 1; if (!_f.noAsk && confirm('使用本功能必須安裝 Google Gears,請問您要安裝嗎?')) // ?action=install&message=加入你的訊息&return=安裝後要導回的網址 window.location.href = 'http://gears.google.com/'; else sl('catchFile: 若不安裝 Google Gears 則將無法使用本功能!'); return 1; } if (!_f.ls) try { // 建立 Local Server _f.ls = window.google.gears.factory.create('beta.localserver', '1.0'); } catch (e) { sl('catchFile: Could not create local server: [' + (e.number & 0xFFFF) + '] ' + e.message); return 2; } if (!_f.s) try { // 建立儲存空間 _f.s = _f.ls.createManagedStore(_f.sn); _f.s = _f.ls.createStore(_f.sn); } catch (e) { if (window.location.protocol == 'file:') sl('Google Gears 不能在本機上執行測試!'); else sl('catchFile: Could not create managed store: [' + (e.number & 0xFFFF) + '] ' + e.message); return 3; } if ((fList instanceof String) && fList) { // TODO: untested!! // 指定 json 的 url _f.s.manifestUrl(fList); // 開始確定版本及同步 _f.s.checkForUpdate(); // 為了確認是否同步結束了,可以加入下列的 timer 來檢查: var timer = google.gears.factory.create('beta.timer'); // 每 500ms 檢查一下 var timerId = timer.setInterval(function() { // 同步完成 if (store.currentVersion) { timer.clearInterval(timerId); sl('同步完成'); } }, 500); } else { //_f.fL.append(fList); if (fList && fList.length) { _f.fL = _f.fL.concat(fList); } } // If the store already exists, it will be opened if (_f.s) try { _f.s.capture(_f.fL, _f.f); } catch (e) { if (e.message == 'Url is not from the same origin') sl('需要在同樣的 domain!'); else sl('catchFile: Could not capture file: [' + (e.number & 0xFFFF) + '] ' + e.message); return 4; } /* // uncapture for ( var i = 0; i < fList.length; i++) { _f.s.remove(fList[i]); } // removeStore if (localServer.openStore(storeName)) { localServer.removeStore(storeName); _f.s = null; } */ }; /* http://blog.wctang.info/2007/07/use-google-map-api-without-api-key.html 驗證的程式叫 GValidateKey,是定義在 main.js,但呼叫的動作是寫在 maps.js 裡 */ _// JSDT:_module_ . /** * 自動挑選 domain * @param API API name * @param callback null: do NOT load * @return [ API url, API key ] * @since 2010/6/20 22:12:23 * @see * */ use_API = function(API, callback) { var _s = _.use_API, url_set = _s.API_URL, url = window.location, key_set = _s.API_keys || (_s.API_keys = library_namespace.data.code.API_keys), API_keys; if (!key_set) { throw 'MUST including or setup CeL.data.code.API_keys first!'; } if ( !Array.isArray(url_set = url_set[API]) || typeof url_set[1] !== 'function' || !library_namespace.is_Object(key_set = key_set[url_set[0]]) ){ CeL.error(url = 'use_API: The kind of API [' + API + '] is not included in the code pool!'); throw new Error(url); } if (url.protocol === 'file:') // 取得任何 legal key for (url in key_set){ if (typeof key_set[url] === 'string') break; } // this is for domain + path //else if ((url = url.href.replace(/[^\/]+$/, '')) in key_set) ; // this is for domain. 不能用 .pathname: IE 會作特殊處置 else if (!(url = url.href.match(/^([a-z-]+:\/\/[^\/]+\/)/)) || !((url = url[1]) in key_set)){ CeL.error(url = 'use_API: This domain [' + url + '] is not included in ' + url_set[0] + ' code pool!'); throw new Error(url); } //library_namespace.debug('[' + url + ']\n' + key_set[url] + '\n' + location.href + '\n' + location.pathname); url = url_set[1](API_keys = key_set[url] || '', _s.language || ''); if (callback !== null){ library_namespace.run(url, callback); library_namespace.debug('load [' + url_set[0] + '] ' + API + ': [' + url + '].'); } return [ url, API_keys ]; }; _// JSDT:_module_ . /** * 語系. e.g., zh-TW, ja, en */ use_API.language = 'zh-TW'; _// JSDT:_module_ . use_API.API_URL = { Gmap : [ 'Google', function(k, l) { return 'http://maps.google.com/maps?file=api&v=2&hl=' + l + '&key=' + k; } ], GAPI : [ 'Google', function(k, l) { return 'http://www.google.com/jsapi?hl=' + l + '&key=' + k; } ], YMap : [ 'Yahoo', function(k) { return 'http://api.maps.yahoo.com/ajaxymap?v=3.8&appid=' + k; } ], twYMap : [ 'Yahoo', function(k) { return 'http://tw.api.maps.yahoo.com/ajaxymap?v=3.8&appid=' + k; } ], Bing: [ 'Microsoft', function(k) { return 'http://api.microsofttranslator.com/V1/Ajax.svc/Embed?appId=' + k; } ] }; _// JSDT:_module_ . /** * 為 Microsoft Translator 設置 * @param text test to translate * @param callback callback(from text,to text) * @param [from_enc] * @param [to_enc] * @return * @see * Translate Method, * JSONP for cross-site Callbacks - Rick Strahl's Web Log */ add_Microsoft_translate = function(text, callback, from_enc, to_enc) { if (!text || !callback) return; var _s = _.add_Microsoft_translate, url = _s.url, name = _s.reference_name, count; // 初始化 initialization if (!url) _s.url = url = 'http://api.microsofttranslator.com/V2/Ajax.svc/Translate?appId=' + _.use_API('Bing', null)[1]; //library_namespace.debug('' + url + encodeURIComponent(text) + ''); _s.buffer[count = _s.counter++] = [ text, callback ]; // response, count, function name of add_Microsoft_translate _s['c' + count] = new Function('r', name + '.callback(r,' + count + ',"' + name + '");' ); library_namespace.run( url + '&from=' + (from_enc || _s.from) + '&to=' + (to_enc || _s.to) + '&text=' + encodeURIComponent(text) + '&oncomplete=' + name + '.c' + count ); }; _// JSDT:_module_ . add_Microsoft_translate.from = 'en'; _// JSDT:_module_ . add_Microsoft_translate.to = 'zh-cht'; _// JSDT:_module_ . add_Microsoft_translate.reference_name = library_namespace.Class + '.add_Microsoft_translate'; _// JSDT:_module_ . /** * @inner * @private */ add_Microsoft_translate.counter = 0; _// JSDT:_module_ . /** * @inner * @private */ add_Microsoft_translate.buffer = []; var ELEMENT_NODE = 1; _// JSDT:_module_ . /** * @inner * @private */ add_Microsoft_translate.callback = function(response, count, name) { try{ var _s = library_namespace.get_various(name), origin = _s.buffer[count], callback = origin[1]; origin = origin[0]; delete _s.buffer[count]; delete _s['c' + count]; if (typeof callback === 'function') { callback(response, origin); } else { if (typeof callback === 'string') callback = document.getElementById(callback); if (typeof callback === 'object' && callback.nodeType === ELEMENT_NODE) callback.appendChild(document.createTextNode(response)); } }catch (e) { library_namespace.warn('add_Microsoft_translate.callback: '+name+': error!'); } }; return ( _// JSDT:_module_ ); } });