﻿// ======== 加強firefox與ie之相容性 =======================================
if(window.addEventListener) {
	FixPrototypeForGecko();
}
function FixPrototypeForGecko() {
	HTMLElement.prototype.__defineGetter__("runtimeStyle",element_prototype_get_runtimeStyle);
	window.constructor.prototype.__defineGetter__("event",window_prototype_get_event);
	Event.prototype.__defineGetter__("srcElement",event_prototype_get_srcElement);
}
function element_prototype_get_runtimeStyle() {
	return this.style;
}
function window_prototype_get_event() {
	return SearchEvent();
}
function event_prototype_get_srcElement() {
	return this.target;
}

function SearchEvent() {
	//IE
	if(document.all)
		return window.event;
	func=SearchEvent.caller;
	while(func!=null) {
		var arg0=func.arguments[0];
		if(arg0) {
			if(arg0.constructor==Event || arg0.constructor==KeyboardEvent)
				return arg0;
		}
		func=func.caller;
	}
	return null;
}
//=================================

//message configuration
var MSG_ERR_REQUIRED = "欄位不可為空白!";
var MSG_ERR_DATEFORMAT = "日期格式錯誤!";
var MSG_ERR_NUMBERFORMAT = "請輸入數字!"
var MSG_ERR_NUMBERLIMIT_MIN = "輸入值不可小於[%1]";
var MSG_ERR_NUMBERLIMIT_MAX = "輸入值不可大於[%1]";
var MSG_ERR_NUMBERLIMIT = "輸入值必須介於[%1]至[%2]";
var MSG_ERR_LENGTH = "輸入長度必須為[%1]";
var MSG_ERR_IDNO = "身分證字號錯誤!";
var MSG_ERR_EMAIL = "E-Mail格式錯誤!";
//=================================

//Browser Type 0:IE 1:Other(Firefox)
var browserType = getBrowserType();
//=================================

//String.trim()
String.prototype.trim = function() { 
	return this.replace(/(^\s*)|(\s*$)/g, ""); 
}
String.prototype.ltrim = function() {
	return this.replace(/(^\s*)/g, ""); 
} 

String.prototype.rrim = function() { 
	return this.replace(/(\s*$)/g, ""); 
} 
//==================================

function showMessage() {
	var msg = arguments[0];
	if (arguments.length > 1) {
		for (i=0;i<arguments.length;i++) {
			msg = msg.replace("[%" + i + "]",arguments[i]);
		}
	}
	alert(msg);
}

//event configuration
var EVENT_CHECK_REQUIRED = (browserType ==0?"onsubmit":"submit");
var EVENT_CHECK_FOCUSOUT = (browserType ==0?"onblur":"blur");
var EVENT_LOCK_NUM = (browserType ==0?"onkeypress":"keypress");
var EVENT_CHECK_NUM = (browserType ==0?"onblur":"blur");
var EVENT_LOCK_UPPER = (browserType ==0?"onkeypress":"blur");
var EVENT_BUTTON_CLICK = (browserType ==0?"onclick":"click");
//===================================
function addInvokedButton(formid,objid) {
	var buttonObj = getElement(objid);
	try {
		attachEvent(buttonObj,EVENT_BUTTON_CLICK,function(){setInvoke(formid)});
	} catch (e) {
		//alert(e.description);
	}
}
function setInvoke(formid) {
	eval(invokeCheckPrefix + formid + "=true");
}


function addConstraint(formid,objid,checkType,pattern) {
	var func = new Array();
	var eventName = new Array() ;
	switch (checkType) {
		case "REQUIRED" :
			func[0] = function(){checkRequired()};
			eventName[0] = EVENT_CHECK_REQUIRED;
			break;
		case "DATE" :
			func[0] = function() {checkDate(pattern)};
			eventName[0] = EVENT_CHECK_FOCUSOUT;
			break;
		case "CDATE" :
			func[0] = function() {checkCDate(pattern)};
			eventName[0] = EVENT_CHECK_FOCUSOUT;
			break;
		case "LONG" :
			func[0] = function() {lockLong();};
			eventName[0] = EVENT_LOCK_NUM;
			func[1] = function() {checkNumberPattern(pattern)}
			eventName[1] = EVENT_CHECK_NUM;
			break;
		case "DOUBLE" :
			func[0] = function() {lockDouble();};
			eventName[0] = EVENT_LOCK_NUM;
			func[1] = function() {checkNumberPattern(pattern)}
			eventName[1] = EVENT_CHECK_NUM;
			break;
		case "UPPER" :
			func[0] = function() {lockUpper();};
			eventName[0] = EVENT_LOCK_UPPER;
			break;
		case "IDNO" :
			func[0] = function() {checkIdno();};
			eventName[0] = EVENT_CHECK_FOCUSOUT;
			break;
		case "EMAIL" :
			func[0] = function() {checkEmail();};
			eventName[0] = EVENT_CHECK_FOCUSOUT;
			break;
		case "LENGTH" :
			func[0] = function() {checkLength(pattern);};
			eventName[0] = EVENT_CHECK_FOCUSOUT;
			break;
		case "CONFIRM" :
			func[0] = function() {showConfirm(pattern);};
			eventName[0] = 'onsubmit';
			break;	
		default :
			return;			
	}
	var formObj = getElement(formid);
	if (formObj == null) return;
	for (i=0;i<func.length;i++) {		
		if (formid == objid) {
			attachEvent(formObj,eventName[i], func[i]);
		} else {
			attachEvent(getFormElement(formObj,objid),eventName[i], func[i]);				
		}				
	}
}



var requiredFieldPrefix = "REQUIRED_";
var requiredLabelPrefix = "LABEL_";
var invokeCheckPrefix = "INVOKEIMMEDIATE_";
var invokeDefaultPrefix = "INVOKEDEFAULT_";
function showConfirm(pattern){
  var formObj = event.srcElement;
  var invoke = eval(invokeCheckPrefix + formObj.name);
  eval(invokeCheckPrefix + formObj.name + " = " + invokeDefaultPrefix + formObj.name);
  if (!invoke) {
	return;
  }
  if(!window.confirm(pattern)){
     event.returnValue = false;
  }
}
//檢查欄位是否空白
function checkRequired() {
	var msg = "";
	var formObj = event.srcElement;	
	try {
		var invoke = eval(invokeCheckPrefix + formObj.name);
		eval(invokeCheckPrefix + formObj.name + " = " + invokeDefaultPrefix + formObj.name);
		if (!invoke) {
			return;
		}
		var objid = eval(requiredFieldPrefix + formObj.name + ".split(',')");
		var label = eval(requiredLabelPrefix + formObj.name + ".split(',')");
		for (i=0;i<objid.length;i++) {
			if (objid[i] == "") continue;
			var obj = getFormElement(formObj,objid[i]);
			if (obj == null) continue;
			if (obj.length == null) {
				if (obj.readOnly || obj.disabled) continue;
				if (obj.value.trim() == "") {
					msg = msg + "【" + label[i] + "】" + MSG_ERR_REQUIRED + "\r\n";
				}
			} else {
				if (!checkSubObjectValue(obj)) {
					msg = msg + "【" + label[i] + "】" + MSG_ERR_REQUIRED + "\r\n";
				}				
			}
		}
		if (msg != "") {
			alert(msg);
			if (browserType == 0) {
				event.returnValue = false;
			} else {
				event.preventDefault(); 	
			}
		}
	} catch (e) {
		alert(e.description);
	}
}


//檢查西元日期格式
function checkDate(pattern) {
	var obj = event.srcElement;
	var str = obj.value;
	if (str == "") return;
	var result = false;
	if (str.length == pattern.length) {
		var _y = "";
		var _m = "";
		var _d = "";
		var _split = "";
		for (i=0;i<pattern.length;i++) {
			var c = pattern.charAt(i);
			switch (c) {
				case "y":
					_y += str.charAt(i);
					break;
				case "M":
					_m += str.charAt(i);
					break;
				case "d":
					_d += str.charAt(i);
					break;
				default:
					if (c != str.charAt(i)) {
						_split = null;
					}
			}
		}
		if (_split != null) {
			result = isDate(_y,_m,_d);	
		}
			
	}
	if (!result) {
		showMessage(MSG_ERR_DATEFORMAT);
		setFocus(obj);
	}
}

//檢查民國日期格式
function checkCDate(pattern) {
	var obj = event.srcElement;
	var str = obj.value;
	if (str == "") return;
	var result = false;
	if (str.length == pattern.length) {
		var _y = "";
		var _m = "";
		var _d = "";
		var _split = "";
		for (i=0;i<pattern.length;i++) {
			var c = pattern.charAt(i);
			switch (c) {
				case "y":
					_y += str.charAt(i);
					break;
				case "M":
					_m += str.charAt(i);
					break;
				case "d":
					_d += str.charAt(i);
					break;
				default:
					if (c != str.charAt(i)) {
						_split = null;
					}
			}
		}
		if (_split != null) {
			try {
				_y = parseInt(_y,10) + 1911;
				result = isDate(_y,_m,_d);
			} catch (e) {
			}	
		}
			
	}
	if (!result) {
		showMessage(MSG_ERR_DATEFORMAT);
		setFocus(obj);
	}
}

//只允許輸入整數
function lockLong() {	
	var allow = new Array(0,8,13,45);
	var _key = (browserType==0?event.keyCode:event.which);
	for (i=0;i<allow.length;i++) {
		if (_key == allow[i]) return;
	}
	if ((_key < 48) || (_key > 58)) {				
		browserType==0?event.returnValue=false:event.preventDefault();	
	}
}
//只允許輸入數字
function lockDouble() {
	var allow = new Array(0,8,13,45,46);
	var _key = (browserType==0?event.keyCode:event.which);
	for (i=0;i<allow.length;i++) {
		if (_key == allow[i]) return;
	}
	if ((_key < 48) || (_key > 58)) {		
		browserType==0?event.returnValue=false:event.preventDefault();	
	}
}
//檢查輸入數字是否符合格式
function checkNumberPattern(pattern) {	
	var obj = event.srcElement;
	var val = obj.value;
	if (val == "") return;
	var isValid = true;
	var limit = pattern.split("|");
	var limit_min = limit[0];
	var limit_max = limit[1];
		val = parseFloat(val);
		if (isNaN(val)) {
			showMessage(MSG_ERR_NUMBERFORMAT);
			isValid = false;
		} else {
			if (limit_min != "" && limit_max != "") {
				if (val < parseFloat(limit_min) || val > parseFloat(limit_max)) {
					showMessage(MSG_ERR_NUMBERLIMIT,limit_min,limit_max);
					isValid = false;
				}
			} else if (limit_min != "") {
				if (val < parseFloat(limit_min)) {
					showMessage(MSG_ERR_NUMBERLIMIT_MIN,limit_min);
					isValid = false;
				}
			} else if (limit_max != "") {
				if (val > parseFloat(limit_max)) {
					showMessage(MSG_ERR_NUMBERLIMIT_MAX,limit_max);
					isValid = false;
				}
			}			
		}
	if (!isValid) {
		setFocus(obj);
	}
}

//資料必要長度檢核
function checkLength(len) {
	var obj = event.srcElement;
	var str = obj.value;
	if (str == "") return;
	if(str.trim().length != parseInt(len)) {
		showMessage(MSG_ERR_LENGTH,len);
		setFocus(obj);
	}	
}


//轉大寫
function lockUpper() {
	if (browserType == 0) {
		var _key = (browserType==0?event.keyCode:event.which);
		if ((_key >= 97) && (_key <= 122)) {
			event.keyCode = event.keyCode-32;
		}
	} else {
		event.srcElement.value = event.srcElement.value.toUpperCase();
	}
}

//email格式檢核
function checkEmail() {
	var obj = event.srcElement;
	var str = obj.value;
	if (str == "") return;
	//var filter=/^w+((-w+)|(.w+))*@[A-Za-z0-9]+((.|-)[A-Za-z0-9]+)*.[A-Za-z0-9]+$/;
	var filter = /^([_\w\.\-])+\@(([\w\-])+\.)+([\w]{2,4})+$/;
	var result = filter.test(str);
	if (!result) {
		showMessage(MSG_ERR_EMAIL);
		setFocus(obj);
	}
}

//身分證字號檢核
function checkIdno() {
	var obj = event.srcElement;
	var str = obj.value;
	if (str == "") return;
	if (!checkPID(str)) {
		showMessage(MSG_ERR_IDNO);
		setFocus(obj);
	}
}
		
		



//===================================  以下為輔助使用的function  ====================================================
var ALP_STR = "ABCDEFGHJKLMNPQRSTUVXYWZIO";
var NUM_STR = "0123456789";
// ------------------------------------------------------------
// 去字串前後空白
function trim(str) {
	while (str.indexOf(" ")==0) {
		str = str.substring(1, str.length);
	}
	while ((str.length>0) && (str.indexOf(" ")==(str.length-1))) {
		str = str.substring(0, str.length-1);
	}
	return str;
}
// ------------------------------------------------------------
//身份證字號檢查器 - 累加檢查碼
function getPID_SUM(sPID) {
	var iChkNum = 0;

	// 第 1 碼
	iChkNum = ALP_STR.indexOf(sPID.substr(0,1)) + 10;
	iChkNum = Math.floor(iChkNum/10) + (iChkNum%10*9);

	// 第 2 - 9 碼
	for(var i=1; i<sPID.length-1; i++) {
		iChkNum += sPID.substr(i,1) * (9-i);
	}

	// 第 10 碼
	iChkNum += sPID.substr(9,1)*1;

	return iChkNum;
}

// ------------------------------------------------------------
// 身分證字號檢查器 - 檢查合法字元
function chkPID_CHAR(sPID) {
	var sMsg = "";
	//sPID = trim(sPID.toUpperCase());
	var iPIDLen = String(sPID).length;

	var sChk = ALP_STR + NUM_STR;
	for(i=0;i<iPIDLen;i++) {
		if (sChk.indexOf(sPID.substr(i,1)) < 0) {
			return false;
		}
	}

	if (sMsg.length == 0) {
		if (ALP_STR.indexOf(sPID.substr(0,1)) < 0) {
			return false;
		} else if ((sPID.substr(1,1) != "1") && (sPID.substr(1,1) != "2")) {
			return false;
		} else {
			for(var i=2; i<iPIDLen; i++) {
				if (NUM_STR.indexOf(sPID.substr(i, 1)) < 0) {
					return false;
				}
			}
		}
	}
		return true;
}

// ------------------------------------------------------------
// 身分證字號檢查器
function checkPID(sPID) {

	if (sPID == '') {
		return false;
	} else if (sPID.length != 10) {
		return false;
	} else {
		sPID = trim(sPID.toUpperCase());
		if (!chkPID_CHAR(sPID)) return false;

		var iChkNum = getPID_SUM(sPID);

		if (iChkNum % 10 != 0) {
			var iLastNum = sPID.substr(9, 1) * 1;
			for (i=0; i<10; i++) {
				var xRightAlpNum = iChkNum - iLastNum + i;
				if ((xRightAlpNum % 10) ==0) {
					return false;
				}
			}
		}
	}
	return true;
}

function getElement(objid) {
	var obj = document.getElementById(objid);
	if (obj == null) {
		try {
			obj = document.getElementsByName(objid)[0];
		} catch (e) {
			return null;
		}
	}
	return obj;
}
function getFormElement(form,objid) {
	try {
		return form.elements[objid];
	} catch (e) {
		return null;
	}
}

function getBrowserType() {
	if (navigator.userAgent.indexOf("MSIE")>0) {
		return 0;
	} else {
		return 1;
	}
}

function setFocus(obj) {
	if (browserType == 0) {
		obj.focus();
	} else {
		var objid = obj.id;
		if (objid == "") objid = obj.name;
		setTimeout("setFocusFF('" + objid + "');",0);
	}
}
function setFocusFF(objid) {
	getElement(objid).focus();
}
function isDate(yy,mm,dd) {
	if (dd == "") dd = "01";
	try {
		var year = parseInt(yy,10);
		var month = parseInt(mm,10);
		var day = parseInt(dd,10);
		
		if (yy.length < 4) {
			year = year + 1911;
		}
		if (month<1 || month>12 || day>31 || day<1)  return false; 
    	if (month == 2 && day > 28) { 
	        if ((year%4==0 && year%100!=0) || (year%400==0)) { // 為閏年 
	            if (day > 29) return false; 
	        } else {  // 非閏年 
	            return false; 
	        } 
	    } 
	    if (day>30 && ((month % 2) == Math.floor(month/8))) return false; 
    	return true; 

	} catch (e) {
		return false;
	}
}

function checkSubObjectValue(obj) {	
	var len = obj.length;
	var isEmpty = true;
	var isDisabled = true;
	if (obj[0].type == "radio" || obj[0].type == "checkbox") {
		for (var i=0;i<len;i++) {		
			if (obj[i].checked) {
				isEmpty = false;
				break;
			}
		} 
		if (isEmpty) {
			for (var i=0;i<len;i++) {
				if (!obj[i].disabled) {
					isDisabled = false;
					break;
				}
			}
			if (isDisabled) isEmpty = false;
		}				
	} else {
		//select
		if (obj.tagName == "SELECT") {
			if (obj.disabled) {
				isEmpty = false;
			} else {
				var val = obj.options[obj.selectedIndex].value;
				if (val != "") isEmpty = false;
			}
		}
	}
	return !isEmpty;
}

function attachEvent(obj,eventName,func) {
	if (browserType == 0) {
		obj.attachEvent(eventName,func);
	} else {
		obj.addEventListener(eventName,func,false);
	}
}


	
	
