/*** document.onmousemove = function () { return (false); } document.onmousedown = function () { return (false); } document.onmouseup = function () { return (false); } document.onclick = null; document.Dblclick = null; ***/ var _sys_userAgent = navigator.userAgent; var _sys_browser = ""; if (chk_browser("Safari")) _sys_browser = "Safari"; else if (chk_browser("Firefox")) _sys_browser = "Firefox"; else if (chk_browser("MSIE 7")) _sys_browser = "MSIE7"; else if (chk_browser("MSIE 6")) _sys_browser = "MSIE6"; else _sys_browser = "Others"; if (chk_browser("Firefox")) document.onmousemove = FF_mouse_point; function chk_browser(str) { if (_sys_userAgent.toUpperCase().indexOf(str.toUpperCase()) != -1) return (true); else return (false); } //add by islds getElementsByClassName 20090220 function getElementsByClassName(str_class){ _el = document.getElementsByTagName("*"); var _arr = new Array; for (var i=0; i<_el.length; i++ ) { if ((" " + _el[i].className + " ").indexOf(" " + str_class + " ") != -1) { _arr.push(_el[i]); } } return _arr; } //add by islds getElementsByClassName 20090220 function _$(str_className){ return getElementsByClassName(str_className); } function FF_mouse_point(_event) { if (chk_browser("Firefox")) { try { MOUSE_X = _event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; MOUSE_Y = _event.clientY + document.body.scrollTop + document.documentElement.scrollTop; } catch (e) { window.status = e.Message + " (" + MOUSE_X + ", " + MOUSE_Y + ")"; return (false); } } } function get_mouse_point() { var point = new Array(); var e = window.event; if (chk_browser("Firefox")) { point.push(MOUSE_X); point.push(MOUSE_Y); return (point); } if (e) { if (e.pageX || e.pageY) { point.push(e.pageX); point.push(e.pageY); } else if (e.clientX || e.clientY) { point.push(e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft ); point.push(e.clientY + document.body.scrollTop + document.documentElement.scrollTop ); } } if (point[0] < 10) point[0] = 10; if (point[1] < 10) point[1] = 10; return (point); } String.prototype.ReplaceAll = function (AFindText,ARepText) { if (ARepText.toString().indexOf("$") == 0) ARepText = "$" + ARepText ; raRegExp = new RegExp(AFindText,"g"); return this.replace(raRegExp,ARepText) } String.prototype.Left = function (n) { if (n <= 0) return ""; else if (n > String(this).length) return this; else return String(this).substring(0,n); } String.prototype.Right = function (n) { if (n <= 0) return ""; else if (n > String(this).length) return this; else { var iLen = String(this).length; return String(this).substring(iLen, iLen - n); } } String.prototype.url_encode = function () { var str = this.ReplaceAll("<", "<"); str = str.ReplaceAll(">", ">"); str = str.ReplaceAll("\"", """); return (str); } function asc(str) { return (str.charCodeAt(0)); } function chr(i) { return (String.fromCharCode(i)); } if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt) { var len = this.length; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === elt) return from; } return -1; }; } function setOpacity(obj_name, value) { $(obj_name).style.opacity = value/10; $(obj_name).style.filter = 'alpha(opacity=' + value*10 + ')'; } function $(id_name) { // return (document.getElementById(id_name)); var _ele = document.getElementById(id_name); if (_ele != null) return (_ele); else { var _eles = document.getElementsByName(id_name); if (_eles.length > 0) return (_eles[0]); else return (null); } } function $parent(id_name) { return (parent.document.getElementById(id_name)); } function $$(element_name) { return (document.getElementsByName(element_name)); } function $$parent(element_name) { return (parent.document.getElementsByName(element_name)); } function set_id_event(ele_name, event_name, _event) { var _ele = document.getElementById(ele_name); set_obj_event(_ele, event_name, _event); } function add_element_event(ele_name, event_name, _event) { elements = ele_name.split(","); for (var k = 0; k < elements.length; k++) { var _element = document.getElementsByName(elements[k]); for (var i = 0; i < _element.length; i++) { var _ele = _element[i]; // set_obj_event(_ele, event_name, _event); addEvent(_ele,event_name.substring(2,event_name.length),_event); } } } function set_element_event(ele_name, event_name, _event) { var _element = document.getElementsByName(ele_name); for (var i = 0; i < _element.length; i++) { var _ele = _element[i]; set_obj_event(_ele, event_name, _event); } } function set_obj_event(_ele, event_name, _event) { switch(event_name) { case "onabort": _ele.onabort = _event; break; case "onblur": _ele.onblur = _event; break; case "onchange": _ele.onchange = _event; break; case "onclick": _ele.onclick = _event; break; case "ondblclick": _ele.ondblclick = _event; break; case "onerror": _ele.onerror = _event; break; case "onfocus": _ele.onfocus = _event; break; case "onkeydown": _ele.onkeydown = _event; break; case "onkeypress": _ele.onkeypress = _event; break; case "onkeyup": _ele.onkeyup = _event; break; case "onload": _ele.onload = _event; break; case "onmousedown": _ele.onmousedown = _event; break; case "onmousemove": _ele.onmousemove = _event; break; case "onmouseout": _ele.onmouseout = _event; break; case "onmouseover": _ele.onmouseover = _event; break; case "onmouseup": _ele.onmouseup = _event; break; case "onreset": _ele.onreset = _event; break; case "onresize": _ele.onresize = _event; break; case "onselect": _ele.onselect = _event; break; case "onsubmit": _ele.onsubmit = _event; break; case "onunload": _ele.onunload = _event; break; } } // addEvent function addEvent(obj,type,fn){ if(obj.addEventListener) obj.addEventListener(type,fn,false); else if(obj.attachEvent){ obj["e"+type+fn]=fn; obj[type+fn]=function(){obj["e"+type+fn](window.event);} obj.attachEvent("on"+type,obj[type+fn]); } } //------------------------------------ // removeEvent function removeEvent(obj,type,fn){ if(obj.removeEventListener) obj.removeEventListener(type,fn,false); else if(obj.detachEvent){ obj.detachEvent("on"+type,obj[type+fn]); obj[type+fn]=null; obj["e"+type+fn]=null; } } function set_id_innerHTML(_name, _value) { var _element = document.getElementById(_name); _element.innerHTML = _value; } function get_id_innerHTML(_name) { var _element = document.getElementById(_name); return (_element.innerHTML); } function set_id_visible(_name, _boolValue) { if (_boolValue == true) set_id_visibility(_name, "visible"); else set_id_visibility(_name, "hidden"); } function set_id_visibility(_name, _visibility) { // visibility = 'visible' // visibility = 'hidden' var _element = document.getElementById(_name); _element.style.visibility = _visibility; } function get_id_visibility(_name) { var _element = document.getElementById(_name); return (_element.style.visibility); } //設定元素是否啟用 //boolValue = true 代表 關閉 //boolValue = false 代表 啟用 function set_element_disabled(_name, boolValue) { var _element = document.getElementsByName(_name); try { if ($j("[name='" + _name + "']").attr("type") == "address") { if (boolValue) $j("[name='" + _name + "']").address("disable"); else $j("[name='" + _name + "']").address("enable"); return; } for (var i = 0; i < _element.length; i++) { var _ele = _element[i]; _ele.disabled = boolValue; // check date picker if ($j("[name='" + _name + "']").data("datepicker") != null) { if (boolValue) $j("[name='" + _name + "']").datepicker("disable"); else $j("[name='" + _name + "']").datepicker("enable"); } } } catch (e) { alert("set_element_disabled(" + _name + ", " + boolValue + ") error : " + "\n Error Message = " + e.Message ); } } //取得元素是否啟用 function get_element_disabled(_name) { var _element = document.getElementsByName(_name); try { return (_element[0].disabled); } catch (e) { return ("取得元素是否啟用:get_element_disabled()" + "\n 元素名稱:" + _name + "\n 錯誤訊息:" + e.Message ); } } function set_element_focus(_name) { try { var _element = document.getElementsByName(_name); var _ele = _element[0]; _ele.focus(); } catch (e) { alert("set_element_focus(" + _name + ") error : " + e.Message); return (false); } } /*********************************************** *** 函數名稱:get_element_value () *** 取得元素值 ************************************************/ function get_element_value(ele_name, str_name) { try { var _element = document.getElementsByName(ele_name); // Date Range if (controls.found(ele_name)) { return controls.getValue(ele_name); } var _ele = _element[0]; switch(_ele.type) { case "button": case "hidden": case "password": case "text": case "textarea": case "file": return(_ele.value); break; case "select-one": var id = _ele.selectedIndex if (str_name == "label") return(_ele.options[id].text); if ( ele_name.substring(ele_name.length - 1,ele_name.length) == "$" && ele_name.substring(0,6) == "Search") // 用 list 方式回傳 { if (_ele.options[id].value == "") { var _value = []; for (var i = 1; i < _ele.options.length; i++) _value.push("'" + _ele.options[i].value + "'"); return (_value.join(",")) } else return("'" + _ele.options[id].value + "'"); } return(_ele.options[id].value); break; case "select-multiple": var _value = new Array(); for(var i = 0; i < _ele.options.length; i++) { if (_ele.options[i].selected == true) { var str_value = _ele.options[i].value var str_label = _ele.options[i].text if (str_name == "label") _value.push(str_label); else _value.push(str_value); } } return (_value.join(",")); break; case 'radio': var index_value = ""; for(var i = 0; i < _element.length; i++) { _ele = _element[i]; if (_ele.checked == true) { if (str_name == "label") index_value = _ele.title; else index_value = _ele.value; break; } } return (index_value); break; case 'checkbox': var index_value = new Array(); for(var i = 0; i < _element.length; i++) { _ele = _element[i]; if (_ele.checked == true) { if (str_name == "label") index_value.push(_ele.title); else index_value.push(_ele.value); } } return (index_value.join(",")); break; default: alert("type = " + _ele.type + ", value access not defined in get_element_value()"); return(""); } } catch (e) { ret = $j("[id='" + ele_name + "']").val(); if (typeof(ret) == "undefined") ret = "err!"; return(ret); } } // no_space 表示是否label中包含值, 並用 function get_select_label(ele_name, no_space) { try { if (typeof(no_space) == "undefined") no_space = false; if (no_space) return $(ele_name).options[$(ele_name).selectedIndex].text; var _labels = $(ele_name).options[$(ele_name).selectedIndex].text.split(" "); _labels.splice(0,1); return (_labels.join(" ")); } catch (e) { return null; } } /*********************************************** *** 函數名稱:set_element_value () *** 設定元素值 ************************************************/ function set_element_value(ele_name, _value) { try { if (controls.found(ele_name)) // 判斷是否在 controls 之中 { return controls.setValue(ele_name, _value); } var _element = document.getElementsByName(ele_name); var _ele = _element[0]; switch(_ele.type) { case "button": case "hidden": case "text": case "password": case "textarea": case "file": if (_ele.type == "button" && _value == "") break; _ele.value = _value; break; case "select-one": var id = -1 for (var i = 0; i < _ele.options.length; i++) { _ele.options[i].selected = false; if ($j.trim(_ele.options[i].value) == $j.trim(_value)) id = i; } if (id != -1) _ele.options[id].selected = true; else { _ele.options[0].selected = true; // if (ele_name.indexOf("Search.") == -1) // jalert("Element : " + ele_name + ", Value : \"" + _value + "\" not found!!"); } break; case "select-multiple": _value = _value.split(","); for(var i = 0; i < _ele.options.length; i++) { _ele.options[i].selected = false; for (var j = 0; j < _value.length; j++) { if (_ele.options[i].value == _value[j]) _ele.options[i].selected = true; } } break; case 'radio': var id = -1; for(var i = 0; i < _element.length; i++) { _ele = _element[i]; _ele.checked = false; if (_ele.value == _value) id = i; } if (id != -1) { _ele = _element[id]; _ele.checked = true; } break; case 'checkbox': var buf = _value.split(",") for(var i = 0; i < _element.length; i++) { _ele = _element[i]; _ele.checked = false; for (var j = 0; j < buf.length; j++) if (_ele.value == buf[j]) { _ele.checked = true; break; } } break; default: } } catch (e) { return ("err"); } } function get_json_object(str_json) { var func = new Function(str_json); return (new func()); } function get_id_posistion(id_name) { var position = new Array(); var x = 0; var y = 0; try { x = $(id_name).style.left.ReplaceAll("px", ""); y = $(id_name).style.top.ReplaceAll("px", ""); } catch (e) {} position.push(x); position.push(y); return (position); } function set_id_position(id_name, x, y) { try { var e = window.event; $(id_name).style.position = "absolute"; $(id_name).style.left = x + "px"; $(id_name).style.top = y + "px"; } catch (e) { // alert("set position error : " + e.Message); } } function show_div(id_name) { $(id_name).style.display = ""; } function hide_div(id_name) { try { $j($(id_name)).hide();} catch (e) {}; } function is_hide(id_name) { if ($(id_name).style.display == "none") return (true); else return (false); } function show(id_name) { $j($(id_name)).show(); } function hide(id_name) { try {$j($(id_name)).hide();} catch (e) {}; } function show_element(name) { var _ele = $$(name); for (var i = 0; i < _ele.length; i++) { _ele[i].style.display = ""; } } function hide_element(name) { var _ele = $$(name); for (var i = 0; i < _ele.length; i++) { _ele[i].style.display = "none"; } } /****************************************************************************************** *** 函數名稱:textarea_resize() *** ******************************************************************************************* *** 說明: *** *** 設定多行文字框,具有根據輸入的文字列數以及行數 *** *** 自動變換多行文字框大小 *** *** 參數: *** *** obj_name 多行文字框 元素名稱 *** *** 是用來指定哪個多行文字框(TextArea)要具備自動改變大小的能力 *** *** min_col 最小行數 *** *** 如果輸入的單列字數小於min_col,則寬度固定為 min_col *** *** max_col 最大行數 *** *** 如果輸入的單列字數大於max_col,則寬度固定為 max_col *** *** min_row 最小列數 *** *** 如果輸入的列數小於 min_row,則高度固定為 min_row *** *** max_row 最大列數 *** *** 如果輸入的列數大於 max_row,則高度固定為 max_row *** *******************************************************************************************/ function textarea_resize(obj_name, min_col, max_col, min_row, max_row) { set_element_event(obj_name , "onkeydown" , function () { var TextValue = get_element_value(obj_name); var _column = TextValue.split("\n"); var _rows = _column.length; var _cols = 0; var _ele = $$(obj_name)[0]; for (var i = 0; i < _column.length; i ++) { if (_column[i].length > _cols) _cols = _column[i].length; } _cols = _cols * 1.25; if (_cols < min_col) _cols = min_col; if (_cols > max_col) _cols = max_col; if (_rows < min_row) _rows = min_row; if (_rows > max_row) _rows = max_row; _rows++; _cols++; _ele.rows = _rows; _ele.cols = _cols * 1; } ); $$(obj_name)[0].onkeydown(); } function get_xml_obj(str_xml_data) { try { var xmlDom = load_xml(str_xml_data); return (xmlDom); } catch (e) { alert("form_element.get_xml_obj() 發生錯誤!" + "\n XML原始碼:" + str_xml_data ); } } function return_json_object(str_json_msg) { var func = new Function(str_json_msg); return (new func()); } function load_xml(str_xml_data) { try { var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.loadXML(str_xml_data); return (xmlDoc) } catch (e) {} try { var parser=new DOMParser(); var xmlDoc=parser.parseFromString(text,"text/xml"); return (xmlDoc) } catch (e) {} return null; } function get_xml_node(xmlDom, tag_name, attribute_name, attribute_value) { try { root_node = xmlDom.getElementsByTagName(tag_name); if (attribute_name != "") { for (var i = 0; i < root_node.length; i++) { var _name = root_node.item(i).getAttribute(attribute_name); if (_name == attribute_value) return (root_node.item(i)); } return (null); } else { return (root_node); } } catch (e) { alert("form_element.get_xml_node() 發生錯誤!" + "\n 標籤名稱:" + tag_name + "\n 屬性名稱:" + attribute_name + "\n 屬性值:" + attribute_value + "\n 錯誤訊息:" + e.Message ); } } function createXMLDom(){ if(window.ActiveXObject) var xmldoc=new ActiveXObject("Microsoft.XMLDOM"); else if(document.implementation&&document.implementation.createDocument) var xmldoc=document.implementation.createDocument("","doc",null); xmldoc.async=true; xmldoc.preserveWhiteSpace=true; return xmldoc; } function createXMLHttp(){ var xmlHttp; if(window.ActiveXObject) xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); else xmlHttp=new XMLHttpRequest(); return xmlHttp; } function show_hide_control(_ele_name, display_name) { set_element_event(_ele_name, "onclick", function () { var _value = get_element_value(_ele_name); if (_value.indexOf("顯示") != -1) { show(display_name); _value = _value.ReplaceAll("顯示", "隱藏"); set_element_value(_ele_name, _value); } else { hide(display_name); _value = _value.ReplaceAll("隱藏", "顯示"); set_element_value(_ele_name, _value); } } ); } function get_DataTableSchema(str_xml_data, str_table_name) { var xmlDom = get_xml_obj(str_xml_data); var table_node = get_xml_node(xmlDom, "xs:element", "name", str_table_name); var column_node = null; var str_result = ""; var field_info = new Array(); column_node = table_node.getElementsByTagName("xs:element"); for (var col = 0; col < column_node.length; col++) { var field_name = column_node.item(col).getAttribute("name"); var field_type = column_node.item(col).getAttribute("type"); var _info = new Array(); field_type = field_type.split(":")[1]; _info.push(field_name); _info.push(field_type); field_info.push(_info); } return (field_info); } function Arithmetic(arg1,operator,arg2){ var r1,r2,mul,size; try{ r1=arg1.toString().split(".")[1].length; }catch(e){ r1=0; } try{ r2=arg2.toString().split(".")[1].length; }catch(e){ r2=0; } size = Math.max(r1,r2); switch(operator){ case "+": case "-": mul = size; break; case "*": mul = 2 * size; break; case "/": mul = 0; break; } return eval((arg1*Math.pow(10, size)) + operator + "(" + (arg2*Math.pow(10, size)) + ")") / Math.pow(10, mul); } function toPage(str_url) { if (str_url == "") return; $("iframe.action").src = str_url; } function toNewPage(str_url) { if (str_url == "") return; $("iframe.action").src = str_url; } function checkWord(str) { var Reg = /^[A-Za-z0-9_.$@]+$/; return (Reg.test(str)); } function checkEmail(strEmail) { //var emailReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/; var emailReg = /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/; return (emailReg.test(strEmail)); } function load_SYS_ListItem(ListItem_SN, str_page_name, req_name, str_ele_list, str_option) { var str_url = str_page_name + "?AJAX=1&do_action=ajax_get_SYS_ListItem&ListItem_SN=%ListItem_SN%&req_name=%req_name%" var str_result = ""; var dt = new DataTable(); str_url = str_url.ReplaceAll("%ListItem_SN%", ListItem_SN); str_url = str_url.ReplaceAll("%req_name%", req_name); str_url += str_option; //alert(str_url + "\n" + str_ele_list); str_result = dt.connect(str_url, str_ele_list); return (dt); } function isDate(str) { try { str = str.Left(10) var op = "/"; if (str.indexOf("/") > -1) op = "/"; else if (str.indexOf("-") > -1) op = "-"; else return (false); var _date = new Date(str); var _buf = str.split(op); var _year; var _mon; var _day; _year = _date.getYear(); _mon = _date.getMonth()+1; _day = _date.getDate(); if (_year < 2000) _year += 1900; _year += ""; _mon += ""; _day += ""; if (_mon.length < 2) _mon = "0" + _mon; if (_day.length < 2) _day = "0" + _day; if (_buf[1].length < 2) _buf[1] = "0" + _buf[1]; if (_buf[2].length < 2) _buf[2] = "0" + _buf[2]; if (_buf.length < 3) return (false); if (_buf[0] == "" || _buf[1] == "" || _buf[2] == "") return (false); if (_date == "NaN") return (false); if (_year + "/" + _mon + "/" + _day != _buf[0] + "/" + _buf[1] + "/" + _buf[2]) return (false); } catch(e) { //alert(e.Message); return (false); } return (true); } function isNumeric(str) { var Reg = /^[0-9.-]+$/; return (Reg.test(str)); } function isInteger(str) { var Reg = /^[0-9]+$/; return (Reg.test(str)); } function isABC(str) { var Reg = /^[A-Za-z]+$/; return (Reg.test(str)); } var undefined; function isUndefined(property) { return (typeof property == 'undefined'); } /****************************************************************************************\ Date.DateAdd(interval, number) 說明 傳回內容為某個基準日期加上數個時間間隔單位後的日期。 語法 object.DateAdd(interval, number) 參數 說明 interval 必要項。字串運算式,表示所要加上去之時間間隔單位。其值請參考設定部份。 number 必要項。數值運算式,表示要加上之時間間隔單位的次數。 其數值可以為正數(可得未來日期),亦可以為負數(可得過去的日期)。 設定 引數 interval 的設定值如下: 設定 說明 設定 說明 yyyy 西元年 w 一週的日數 q 季 ww 週 m 月 h 時 y 一年的日數 n 分 d 日 s 秒 註解 您可以使用 DateAdd 函數計算基準日期加上或減去您所指定的時間間隔後的結果。 例如,您可以用 DateAdd 來計算從今天起三十天後或三十天前的日期是那一天; 或者計算距離現在 45 分鐘前或 45 分鐘後的時間。 如果時間間隔是以 [天] 來計算,interval 引數可以是 [一年的日數] ("y"),[日] ("d"),或 [一週的日數] ("w")。 \****************************************************************************************/ if (isUndefined(Date.prototype.DateAdd) == true) { Date.prototype.DateAdd = function (interval, number) { var nd = new Date(this); switch (interval) { case 'y': case 'd': case 'w': nd.setDate(nd.getDate() + number); break; case 'yyyy': nd.setYear(nd.getFullYear() + number); break; case 'q': nd.setMonth(nd.getMonth() + number * 3); break; case 'm': nd.setMonth(nd.getMonth() + number); break; case 'ww': nd.setDate(nd.getDate() + number * 7); break; case 'h': nd.setHour(nd.getHours() + number); break; case 'n': nd.setMinutes(nd.getMinutes() + number); break; case 's': nd.setSeconds(nd.getSeconds() + number); break; default: } return nd; }; } /****************************************************************************************\ Date.toFormatString(interval, isAddZeroChar, index, iLength) 說明 傳回格式化的日期字串。 語法 object.toFormatString(interval, isAddZeroChar, index, iLength) 參數 說明 interval 必要項。字串運算式,表示所要回傳的方式。其值請參考設定部份。 isAddZeroChar 必要項。布林運算式,表示是否以雙位數字回傳;即只有個位數時,於十位數補零。 index 非必要項。數值運算式,要回傳字串的起始索引值,由零開始;預設為0。 當index小於零時,則由右邊起算傳回特定數量的字元。 iLength 非必要項。數值運算式,要回傳字串的長度;預設為字串原長度。 設定 引數 interval 的設定值如下: 設定 說明 備註 ed yyyy/mm/dd et24 hh:nn:ss (24hr) et12 hh:nn:ss am/pm (12hr) edt24 yyyy/mm/dd hh:nn:ss (24hr) edt12 yyyy/mm/dd hh:nn:ss am/pm (12hr) cd yyyy年mm月dd日 ct24 hh時nn分ss秒 (24hr) ct12 上午/下午 hh時nn分ss秒 (12hr) ct12e 上午/下午 hh:nn:ss (12hr) cdt24 yyyy年mm月dd日 hh時nn分ss秒 (24hr) cdt12 yyyy年mm月dd日 上午/下午 hh時nn分ss秒 (12hr) td 民國yyy年mm月dd日 tdt24 民國yyy年mm月dd日 hh時nn分ss秒 (24hr) tdt12 民國yyy年mm月dd日 上午/下午 hh時nn分ss秒 (12hr) esd mm/dd csd mm月dd日 備註 以日期時間Wed Mar-9-2005 14:6:43為例: 當interval為ed、isAddZeroChar為true時,將回傳2005/03/09; 當interval為ed、isAddZeroChar為false時,將回傳2005/3/9; 當interval為cdt24、isAddZeroChar為false時,將回傳2005年3月9日 14時6分43秒。 \****************************************************************************************/ if (isUndefined(Date.prototype.toFormatString) == true) { Date.prototype.toFormatString = function (interval, isAddZeroChar, index, iLength) { var n = new Date(this); var s = ''; var t = ''; switch (interval) { case 'ed': case 'edt24': case 'edt12': s = n.getFullYear() + '/' + (isAddZeroChar ? (new String(n.getMonth() + 101).substr(1, 2)) : (n.getMonth() + 1)) + '/' + (isAddZeroChar ? (new String(n.getDate() + 100).substr(1, 2)) : (n.getDate())); break; case 'cd': case 'cdt24': case 'cdt12': s = n.getFullYear() + '年' + (isAddZeroChar ? (new String(n.getMonth() + 101).substr(1, 2)) : (n.getMonth() + 1)) + '月' + (isAddZeroChar ? (new String(n.getDate() + 100).substr(1, 2)) : (n.getDate())) + '日'; break; case 'td': case 'tdt24': case 'tdt12': if (isAddZeroChar) { s = '民國' + new String(n.getFullYear() - 911).substr(1, 3) + '年' + new String(n.getMonth() + 101).substr(1, 2) + '月' + new String(n.getDate() + 100).substr(1, 2) + '日'; } else { s = '民國' + (n.getFullYear() - 1911) + '年' + (n.getMonth() + 1) + '月' + n.getDate() + '日'; } break; case 'esd': if (isAddZeroChar) { s = new String(n.getMonth() + 101).substr(1, 2) + '/' + new String(n.getDate() + 100).substr(1, 2); } else { s = (n.getMonth() + 1) + '/' + n.getDate(); } break; case 'csd': if (isAddZeroChar) { s = new String(n.getMonth() + 101).substr(1, 2) + '月' + new String(n.getDate() + 100).substr(1, 2) + '日'; } else { s = (n.getMonth() + 1) + '月' + n.getDate() + '日'; } break; default: break; } var hh = n.getHours(); var h1 = (isAddZeroChar ? new String(hh + 100).substr(1, 2) : hh); var h2 = hh % 12; if (h2 == 0) { h2 = 12; } else { h2 = (isAddZeroChar ? new String(h2 + 100).substr(1, 2) : h2); } var nn = (isAddZeroChar ? new String(n.getMinutes() + 100).substr(1, 2) : n.getMinutes()); var ss = (isAddZeroChar ? new String(n.getSeconds() + 100).substr(1, 2) : n.getSeconds()); switch (interval) { case 'et24': case 'edt24': t = h1 + ':' + nn + ':' + ss; break; case 'et12': case 'edt12': t = h2 + ':' + nn + ':' + ss + ' ' + ((Math.floor(hh / 12) == 0) ? 'AM' : 'PM'); break; case 'ct24': case 'cdt24': case 'tdt24': t = h1 + '時' + nn + '分' + ss + '秒'; break; case 'ct12': case 'cdt12': case 'tdt12': t = ((Math.floor(hh / 12) == 0) ? '上午' : '下午') + ' ' + h2 + '時' + nn + '分' + ss + '秒'; break; case 'ct12e': t = ((Math.floor(hh / 12) == 0) ? '上午' : '下午') + ' ' + h2 + ':' + nn + ':' + ss; default: } switch (interval) { case 'edt24': case 'cdt24': case 'tdt24': case 'edt12': case 'cdt12': case 'tdt12': s += ' ' + t; break; case 'ed': case 'cd': case 'td': case 'esd': case 'csd': break; default: s = t; } if (typeof(index) == 'undefined') index = 0; if (index < 0) index = s.length + index; if (typeof(iLength) == 'undefined') iLength = s.length - index; if (iLength > s.length - index) iLength = s.length; return s.substr(index, iLength); }; } /****************************************************************************************\ Date.toFormat(interval) 說明 傳回使用者定義日期/時間格式字串。 語法 object.toFormat(interval) 參數 說明 interval 必要項。字串運算式,表示所要回傳的方式。其值請參考設定部份。 設定 yy 將年份顯示成兩位數的數值格式,並且加上前置零 (如果需要的話)。 yyy 將年份顯示成四位數的數值格式。 yyyy 將年份顯示成四位數的數值格式。 d 將日期顯示成數字,且不需要前置零 (例如,1)。如果這是使用者定義數值格式中的唯一字元,請使用 %d。 dd 將日期顯示成數字,並且加上前置零 (例如,01)。 ddd 用縮寫來顯示星期幾 (例如,Sun)。 dddd 用完整名稱來顯示星期幾 (例如,Sunday)。 m 將月份顯示成數字,且不需要前置零 (例如,以 1 表示一月)。如果這是使用者定義數值格式中的唯一字元,請使用 %m。 mm 將月份顯示成數字,並且加上前置零 (例如,01/12/01)。 mmm 用縮寫來顯示月份 (例如,Jan)。 mmmm 用完整名稱來顯示月份 (例如,January)。 h 使用 12 小時制將小時顯示成數字,且不需要前置零 (例如,1:15:15 PM)。如果這是使用者定義數值格式中的唯一字元,請使用 %h。 hh 使用 12 小時制將小時顯示成數字,並且加上前置零 (例如,01:15:15 PM)。 H 使用 24 小時制將小時顯示成數字,且不需要前置零 (例如:1:15:15)。如果這是使用者定義數值格式中的唯一字元,請使用 %H。 HH 使用 24 小時制將小時顯示成數字,並且加上前置零 (例如:01:15:15)。 n 將分鐘顯示成數字,且不需要前置零 (例如,12:1:15)。如果這是使用者定義數值格式中的唯一字元,請使用 %n。 nn 將分鐘顯示成數字,並且加上前置零 (例如,12:01:15)。 s 將秒數顯示成數字,且不需要前置零 (例如,12:15:5)。如果這是使用者定義數值格式中的唯一字元,請使用 %s。 ss 將秒數顯示成數字,並且加上前置零 (例如,12:15:05)。 T 使用 12 小時制,並且在正午之前的任何小時加上顯示大寫 A;在正午與 11:59 PM 之前的任何小時加上顯示大寫 P。如果這是使用者定義數值格式中的唯一字元,請使用 %T。 TT 使用 12 小時制,並且在正午之前的任何小時加上顯示大寫 AM;在正午與 11:59 PM 之前的任何小時加上顯示大寫 PM。 t 使用 12 小時制,並且在正午之前的任何小時加上顯示小寫 a;在正午與 11:59 PM 之前的任何小時加上顯示小寫 p。如果這是使用者定義數值格式中的唯一字元,請使用 %t。 tt 使用 12 小時制,並且在正午之前的任何小時加上顯示小寫 am;在正午與 11:59 PM 之前的任何小時加上顯示小寫 pm。 z 顯示時區時差,且不需要前置零 (例如,-8)。如果這是使用者定義數值格式中的唯一字元,請使用 %z。 zz 顯示時區時差,並且加上前置零 (例如,-08) zzz 顯示完整時區時差 (例如,-08:00) \****************************************************************************************/ if (isUndefined(Date.prototype.toFormat) == true) { Date.prototype.toFormat = function (interval) { var s = interval; var n = new Date(this); if (s.indexOf('yyyy', 0) != -1) { s = s.replace(/yyyy/g, n.getFullYear()); } else if (s.indexOf('yyy', 0) != -1) { s = s.replace(/yyy/g, n.getFullYear() - 1911); } else if (s.indexOf('yy', 0) != -1) { s = s.replace(/yy/g, new String(n.getFullYear()).substr(2, 2)); } if (s.indexOf('mmmm', 0) != -1) { s = s.replace(/mmmm/g, n.getMonthString(false)); } else if (s.indexOf('mmm', 0) != -1) { s = s.replace(/mmm/g, n.getMonthString(true)); } else if (s.indexOf('mm', 0) != -1) { s = s.replace(/mm/g, new String(n.getMonth() + 101).substr(1, 2)); } else if (s.indexOf('%m', 0) != -1) { return n.getMonth() + 1; } else if (s.indexOf('m', 0) != -1) { s = s.replace(/m/g, (n.getMonth() + 1)); } if (s.indexOf('dddd', 0) != -1) { s = s.replace(/dddd/g, n.getWeekString(false)); } else if (s.indexOf('ddd', 0) != -1) { s = s.replace(/ddd/g, n.getWeekString(true)); } else if (s.indexOf('dd', 0) != -1) { s = s.replace(/dd/g, new String(n.getDate() + 100).substr(1, 2)); } else if (s.indexOf('%d', 0) != -1) { return n.getDate(); } else if (s.indexOf('d', 0) != -1) { s = s.replace(/d/g, n.getDate()); } if (s.indexOf('hh', 0) != -1) { s = s.replace(/hh/g, ((n.getHours() % 12 == 0) ? '12' : new String(n.getHours() % 12 + 100).substr(1, 2))); } else if (s.indexOf('%h', 0) != -1) { return ((n.getHours() % 12 == 0) ? '12' : n.getHours() % 12); } else if (s.indexOf('h', 0) != -1) { s = s.replace(/h/g, ((n.getHours() % 12 == 0) ? '12' : n.getHours() % 12)); } else if (s.indexOf('HH', 0) != -1) { s = s.replace(/HH/g, new String(n.getHours() + 100).substr(1, 2)); } else if (s.indexOf('%H', 0) != -1) { return n.getHours(); } else if (s.indexOf('H', 0) != -1) { s = s.replace(/H/g, n.getHours()); } if (s.indexOf('nn', 0) != -1) { s = s.replace(/nn/g, new String(n.getMinutes() + 100).substr(1, 2)); } else if (s.indexOf('%n', 0) != -1) { return n.getMinutes(); } else if (s.indexOf('n', 0) != -1) { s = s.replace(/n/g, n.getMinutes()); } if (s.indexOf('ss', 0) != -1) { s = s.replace(/ss/g, new String(n.getSeconds() + 100).substr(1, 2)); } else if (s.indexOf('%s', 0) != -1) { return n.getSeconds(); } else if (s.indexOf('s', 0) != -1) { s = s.replace(/s/g, n.getSeconds()); } if (s.indexOf('TT', 0) != -1) { s = s.replace(/TT/g, ((n.getHours() < 12) ? 'AM' : 'PM')); } else if (s.indexOf('%T', 0) != -1) { return ((n.getHours() < 12) ? 'A' : 'P'); } else if (s.indexOf('T', 0) != -1) { s = s.replace(/T/g, ((n.getHours() < 12) ? 'A' : 'P')); } else if (s.indexOf('tt', 0) != -1) { s = s.replace(/tt/g, ((n.getHours() < 12) ? 'am' : 'pm')); } else if (s.indexOf('%t', 0) != -1) { return ((n.getHours() < 12) ? 'a' : 'p'); } else if (s.indexOf('t', 0) != -1) { s = s.replace(/t/g, ((n.getHours() < 12) ? 'a' : 'p')); } var u = ''; if (n.getTime() > new Date(n.toUTCString()).getTime()) { u = '+'; var utc = n.getTime() - new Date(n.toUTCString()).getTime(); } else { u = '-'; var utc = new Date(n.toUTCString()).getTime() - n.getTime(); } if (s.indexOf('zzz', 0) != -1) { s = s.replace(/zzz/g, u + new String(utc.getHours() + 100).substr(1, 2) + ':' + new String(utc.getMinutes()).substr(1, 2)); } else if (s.indexOf('zz', 0) != -1) { s = s.replace(/zz/g, u + new String(utc.getHours() + 100).substr(1, 2)); } else if (s.indexOf('%z', 0) != -1) { return (u + utc.getHours()); } else if (s.indexOf('z', 0) != -1) { s = s.replace(/z/g, u + utc.getHours()); } return s; }; } /****************************************************************************************\ Date.getMonthString(bShort) 說明 傳回月份字串。 語法 object.getMonthString(bShort) 參數 說明 bShort 必要項。布林運算式,表示回傳方式是否為簡稱格式。 \****************************************************************************************/ if (isUndefined(Date.prototype.getMonthString) == true) { Date.prototype.getMonthString = function (bShort) { var ms = new Array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'); if (bShort) { return ms[this.getMonth()].substr(0, 3); } else { return ms[this.getMonth()]; } }; } /****************************************************************************************\ Date.getWeekString(bShort) 說明 傳回星期字串。 語法 object.getWeekString(bShort) 參數 說明 bShort 必要項。布林運算式,表示回傳方式是否為簡稱格式。 \****************************************************************************************/ if (isUndefined(Date.prototype.getWeekString) == true) { Date.prototype.getWeekString = function (bShort) { var ws = new Array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'); if (bShort) { return ws[this.getDay()].substr(0, 3); } else { return ws[this.getDay()]; } }; } /****************************************************************************************\ Date.getWeekNo() 說明 傳回週別。第一週索引值為零。 語法 object.getWeekNo() \****************************************************************************************/ if (isUndefined(Date.prototype.getWeekNo) == true) { Date.prototype.getWeekNo = function () { var n = new Date(this); var firstDay = new Date(n.getFullYear() + '/1/1'); var iWeek = Math.ceil((n.getDayNo() - ((7 - firstDay.getDay()) % 7)) / 7); // Week No. (First Index Is 0) return iWeek; }; } /****************************************************************************************\ Date.getChtWeek() 說明 傳回中文星期字串。 語法 object.getChtWeek() \****************************************************************************************/ if (isUndefined(Date.prototype.getChtWeek) == true) { Date.prototype.getChtWeek = function () { var cws = new Array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'); return cws[this.getDay()]; }; } /****************************************************************************************\ Date.getDayMilliseconds() 說明 傳回一天的豪秒數。 語法 object.getDayMilliseconds() \****************************************************************************************/ if (isUndefined(Date.prototype.getDayMilliseconds) == true) { Date.prototype.getDayMilliseconds = function () { return 24 * 60 * 60 * 1000; }; } /****************************************************************************************\ Date.getDayNo() 說明 傳回該年到當日的天數。一月一日為第一天。 語法 object.getDayNo() \****************************************************************************************/ if (isUndefined(Date.prototype.getDayNo) == true) { Date.prototype.getDayNo = function () { var n = new Date(this); var firstDay = new Date(n.getFullYear() + '/1/1'); var iDay = Math.ceil((n.getTime() - firstDay.getTime()) / n.getDayMilliseconds()); // Day No.(First Index Is 1) return iDay; }; } /****************************************************************************************\ Date.DateDiff(interval, dateValue) 說明 傳回本體(this)與傳入日期間相差的時間間隔單位數目。 語法 object.DateDiff(interval, dateValue) DateDiff 函數語法中有下列幾部份: 組成部分 說明 interval 必要項。字串運算式,用來計算本體及 dateValue 之時間差的時間間隔單位。請參閱設定部份。 dateValue 必要項。日期運算式。您要用來計算的日期。 設定 引數 interval 的設定值如下: 設定 說明 設定 說明 yyyy 西元年 w 一週的日數 q 季 ww 週 m 月 h 時 y 一年的日數 n 分 d 日 s 秒 註解 您可以使用 DateDiff 函數來決定兩個日期之間的時間間隔單位數目。 例如,您可以使用 DateDiff 來計算某兩個日期之間相隔幾日,或計算從今天起到年底還有多少個星期。 如果想知道本體與 dateValue 相差的 [日] 數,interval 可以是 [一年的日數] ("y") 或 [日] ("d")。 如果 interval 是 [一週的日數] ("w"),DateDiff 會傳回兩日期間相差的週數。 如果本體是星期一,DateDiff 會計算到 dateValue 為止之星期一的個數,包含 dateValue 但不包含本體。 不過,如果 interval 是 [週] ("ww"),DateDiff 函數會藉由計算本體與 dateValue 之間星期天的個數,會傳回兩日期間的 [日歷週] 數。 如果 dateValue 剛好是星期天,則 dateValue 也會被加進計數結果中;但不論本體是否為星期天,它都不會被算進去。 如果本體比 dateValue 來得晚,DateDiff 函數傳回值為負數。 但若計算十二月三十一日和來年的一月一日的年份差,DateDiff 會傳回 1 表示相差一個年份,雖然實際上只相差一天而已。 以下範例即使用 DateDiff 函數來表示指定的日期與今天相差的天數: alert('Days from today: ' + new Date('2005/01/01').DiffDate('d', new Date())); \****************************************************************************************/ if (isUndefined(Date.prototype.DateDiff) == true) { Date.prototype.DateDiff = function (interval, dateValue) { var n = new Date(this); var d = new Date(dateValue); switch (interval) { case 'yyyy': return d.getFullYear() - n.getFullYear(); break; case 'q': return Math.ceil((d.getMonth() + 1) / 3) - Math.ceil((n.getMonth() + 1) / 3) ; break; case 'm': return d.getMonth() - n.getMonth(); break; case 'y': case 'd': case 'w': return Math.floor((d.getTime() - n.getTime()) / n.getDayMilliseconds()); break; case 'ww': var fWeek = new Date(n.DateAdd('d', (7 - n.getDay()) % 7)); return Math.floor(fWeek.DateDiff('d', dateValue) / 7); break; case 'h': return Math.floor((d.getTime() - n.getTime()) / (n.getDayMilliseconds() / 24)); break; case 'n': return Math.floor((d.getTime() - n.getTime()) / (n.getDayMilliseconds() / 24 / 60)); break; case 's': return Math.floor((d.getTime() - n.getTime()) / 1000); break; default: break; } }; } function FormatKendo(str_number, len, decimal) { if (str_number == "") return ""; str_number = str_number.ReplaceAll(",", ""); var format = "#,###"; if (decimal != "" || decimal != 0) { format += "." + "00000000000000000000000".Right(decimal); } // return Format(str_number, format); return kendo.toString(parseFloat(str_number), format); } function Format(str_number, str_format) { if (str_format.toString().toUpperCase() == "YYYY/MM/DD") { return str_number.toString().substring(0,4) + "/" + str_number.toString().substring(4,6) + "/" + str_number.toString().substring(6,8); } if (str_format.toString().toUpperCase() == "DD/MM/YYYY") { return str_number.toString().substring(0,2) + "/" + str_number.toString().substring(2,4) + "/" + str_number.toString().substring(4,8); } str_number = stripNonNumeric(str_number); number_array = ("" + str_format).split("."); if (number_array.length > 1) str_number = FormatNumber(str_number, number_array[1].length); var digits = ("" + str_number).split("."); var zero_count = 0; for (var i = 0; i < number_array[0].length; i++) { if (number_array[0].substring(i, i+1) == "0") zero_count++; } if (zero_count - digits[0].length > 0) str_number = "00000000000000000000000".substring(0, zero_count - digits[0].length) + str_number ; if (str_format.indexOf(",") >= 0) str_number = addCommas(str_number); if (str_format.indexOf("$") >= 0 && str_number.indexOf("$") == -1) str_number = "$" + str_number //if (("" + str_number).indexOf(".") == -1 && number_array.length > 1 && number_array[1].indexOf("0") >= 0) // str_number = str_number + "." + "00000000000000000000000".substring(0, number_array[1].length); return (str_number); } function addCommas(nStr) { nStr += ''; x = nStr.split('.'); x1 = x[0]; x2 = x.length > 1 ? '.' + x[1] : ''; var rgx = /(\d+)(\d{3})/; while (rgx.test(x1)) { x1 = x1.replace(rgx, '$1' + ',' + '$2'); } return x1 + x2; } function stripNonNumeric( str ) { str += ''; var rgx = /^\d|\.|-$/; var out = ''; for( var i = 0; i < str.length; i++ ) { if( rgx.test( str.charAt(i) ) ){ if( !( ( str.charAt(i) == '.' && out.indexOf( '.' ) != -1 ) || ( str.charAt(i) == '-' && out.length != 0 ) ) ){ out += str.charAt(i); } } } return out; } function FormatNumber(srcStr,nAfterDot){ var srcStr,nAfterDot; var resultStr,nTen; srcStr = ""+srcStr+""; strLen = srcStr.length; dotPos = srcStr.indexOf(".",0); if (dotPos == -1){ resultStr = srcStr+"."; for (var i=0;i= nAfterDot){ nAfter = dotPos + nAfterDot + 1; nTen =1; for(j=0;j 0) open_by_window = true; } } if (_linkurl_addnew != "") { var t = _linkurl_addnew.split(";"); for (var i = 0; i < t.length; i++) { var p = t[i].split("="); if (p[1].substring(0, 1) == "$") var v = get_element_value(p[1].substring(1, p[1].length)); else var v = p[1]; url += "&" + p[0] + "=" + v; } url += "&LINKURL_ADDNEW=1" ; } if (_linkurl_edit != "") url += "&LINKURL_EDIT=1" ; if (linkurl_iframe != "") { try { if (! before_linkurl_button()) return false; } catch (e) {}; $(linkurl_iframe).src=url; } else { if (open_by_window) { var win = window.open(url,"", "location=no,menubar=no,status=no,toolbar=no,height=" + options.height + ",width=" + options.width + ",resizable=yes,left=0,top=0,scrollbars=yes"); win.moveTo(0,0); win.focus(); } else { // var ret = window.showModalDialog(url, "", "resizable:yes;dialogWidth:" + options.width + "px;dialogHeight:" + options.height + ",px;status:no"); $j("#_LINK_RETURN_VALUE").val(""); $j("#_LINKFRAME").attr("dialog", "Y"); //$j("#_LINKIFRAME").attr("src", url); //$j("#_LINKIFRAME").attr("width",options.width - 50); //$j("#_LINKIFRAME").attr("height",options.height -70); //if (!$j("#_LINKFRAME").is(':data(dialog)')) { // $j("#_LINKFRAME").dialog({ // autoOpen : false, // modal : true, // height : options.height, // width : options.width, // title : _linkurl, // minHeight : 200, // maxHeight : 2000, // resizable : true, // close : function () {$j("#_LINKIFRAME").attr("src", "about:blank");options.onclose();} // } //); //} // $j("#_LINKFRAME").dialog("open"); var _linkRedirect = (options.redirect === undefined) ? false : options.redirect; if(_linkRedirect==true) url = options.program_id; $j("#_LINKFRAME").kendoWindow({ actions: ["Close"], draggable: true, height: options.height, modal: true, position : { top : 100 }, pinned: false, iframe : true, content:url , resizable: true, title: (options.title === undefined) ? _linkurl : options.title, width: options.width, close: function () {options.onclose();} }).data("kendoWindow").center().open(); // try {data_search();} catch(e) {}; } } return true; } function create_listbox (dt, form, element_name) { var row = dt.Search("ELE_NAME", element_name); if (row != -1) { var str_url = dt.getValueByRow(row, "URL"); var str_element_list = dt.getValueByRow(row, "ELE_LIST"); var element_param = dt.getValueByRow(row, "ELE_PARAM"); var _dt = form.create_listbox(row, element_name, element_param, str_url, str_element_list); dt.setValueByRow(row, "DATA", _dt); if (dt.getValueByRow(row,"ELE_DISABLED") != "") set_element_disabled(element_name); return (true); } else { return (false); } } function set_not_null (element_name, value) { var action = element_name.split(".")[0]; var dt = null; var index; if (action.indexOf("Detail") > 0) { if (action.Right(1) == "l") index = 0 else index = parseInt(action.Right(1)); dt = (action.Left(1) == "E") ? o_EditForm.form.dt_detail_schemas[index] : o_AddNewForm.form.dt_detail_schemas[index]; } else dt = (action == "Edit") ? o_EditForm.dt_schema : o_AddNewForm.form.dt_schema; if (value == "0") { $j($(element_name)).css("border-color", ""); var spans = $j($(element_name)).parent().has("span"); if (spans.size() > 0) spans.find("span").html(""); else $j(" ").insertAfter($j($(element_name))); dt.setValueByIndex("ELE_NAME", element_name, "NOT_NULL", "0"); } else { $j($(element_name)).css("border-color", "red"); var spans = $j($(element_name)).parent().has("span"); if (spans.size() > 0) spans.find("span").html(" *"); else $j(" *").insertAfter($j($(element_name))); dt.setValueByIndex("ELE_NAME", element_name, "NOT_NULL", "1"); } } function countLength(stringToCount) { var c; //計算有幾個全型字、中文字... if(is_length_semantics == 'BYTE' && is_character_set.match('UTF') == null){ c = stringToCount.match(/[^ -~]/g); return stringToCount.length + (c ? c.length : 0); } else if(is_length_semantics == 'BYTE' && is_character_set.match('UTF') != null) { c = encodeURIComponent(stringToCount); return c.replace(/%[A-F\d]{2}/g, 'U').length; } return stringToCount.length; } (function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else { // Browser globals factory(jQuery); } }(function ($) { $.timeago = function(timestamp) { if (timestamp instanceof Date) { return inWords(timestamp); } else if (typeof timestamp === "string") { return inWords($.timeago.parse(timestamp)); } else if (typeof timestamp === "number") { return inWords(new Date(timestamp)); } else { return inWords($.timeago.datetime(timestamp)); } }; var $t = $.timeago; $.extend($.timeago, { settings: { refreshMillis: 60000, allowFuture: false, localeTitle: false, cutoff: 0, strings: { prefixAgo: null, prefixFromNow: null, suffixAgo: "前", suffixFromNow: "from now", seconds: "1分鐘", minute: "1分鐘", minutes: "%d分鐘", hour: "1小時", hours: "%d小時", day: "1天", days: "%d天", month: "1月", months: "%d月", year: "1年", years: "%d年", wordSeparator: "", numbers: [] } }, inWords: function(distanceMillis) { var $l = this.settings.strings; var prefix = $l.prefixAgo; var suffix = $l.suffixAgo; if (this.settings.allowFuture) { if (distanceMillis < 0) { prefix = $l.prefixFromNow; suffix = $l.suffixFromNow; } } var seconds = Math.abs(distanceMillis) / 1000; var minutes = seconds / 60; var hours = minutes / 60; var days = hours / 24; var years = days / 365; function substitute(stringOrFunction, number) { var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction; var value = ($l.numbers && $l.numbers[number]) || number; return string.replace(/%d/i, value); } var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) || seconds < 90 && substitute($l.minute, 1) || minutes < 45 && substitute($l.minutes, Math.round(minutes)) || minutes < 90 && substitute($l.hour, 1) || hours < 24 && substitute($l.hours, Math.round(hours)) || hours < 42 && substitute($l.day, 1) || days < 30 && substitute($l.days, Math.round(days)) || days < 45 && substitute($l.month, 1) || days < 365 && substitute($l.months, Math.round(days / 30)) || years < 1.5 && substitute($l.year, 1) || substitute($l.years, Math.round(years)); var separator = $l.wordSeparator || ""; if ($l.wordSeparator === undefined) { separator = " "; } return $.trim([prefix, words, suffix].join(separator)); }, parse: function(iso8601) { var s = $.trim(iso8601); s = s.replace(/\.\d+/,""); // remove milliseconds s = s.replace(/-/,"/").replace(/-/,"/"); s = s.replace(/T/," ").replace(/Z/," UTC"); s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400 return new Date(s); }, datetime: function(elem) { var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title"); return $t.parse(iso8601); }, isTime: function(elem) { // jQuery's `is()` doesn't play well with HTML5 in IE return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time"); } }); // functions that can be called via $(el).timeago('action') // init is default when no action is given // functions are called with context of a single element var functions = { init: function(){ var refresh_el = $.proxy(refresh, this); refresh_el(); var $s = $t.settings; if ($s.refreshMillis > 0) { setInterval(refresh_el, $s.refreshMillis); } }, update: function(time){ $(this).data('timeago', { datetime: $t.parse(time) }); refresh.apply(this); }, updateFromDOM: function(){ $(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) }); refresh.apply(this); } }; $.fn.timeago = function(action, options) { var fn = action ? functions[action] : functions.init; if(!fn){ throw new Error("Unknown function name '"+ action +"' for timeago"); } // each over objects here and call the requested function this.each(function(){ fn.call(this, options); }); return this; }; function refresh() { var data = prepareData(this); var $s = $t.settings; if (!isNaN(data.datetime)) { if ( $s.cutoff == 0 || distance(data.datetime) < $s.cutoff) { $(this).text(inWords(data.datetime)); } } return this; } function prepareData(element) { element = $(element); if (!element.data("timeago")) { element.data("timeago", { datetime: $t.datetime(element) }); var text = $.trim(element.text()); if ($t.settings.localeTitle) { element.attr("title", element.data('timeago').datetime.toLocaleString()); } else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) { element.attr("title", text); } } return element.data("timeago"); } function inWords(date) { return $t.inWords(distance(date)); } function distance(date) { return (new Date().getTime() - date.getTime()); } // fix for IE6 suckage document.createElement("abbr"); document.createElement("time"); }));