/**
* @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_
);
}
});