


function CheckFormFields( eForm)	{

	var oErrCol = new cBuildErr();
	var oFormFieldService = new cJsVarService();

	var oProgErrStr = new Array();
	oProgErrStr['notempty'] = '必須不是空白。';
	oProgErrStr['numeric'] = '必須是數值型別。';
	oProgErrStr['int'] = '必須是整數型別。';
	oProgErrStr['positiveint'] = '必須是正整數型別。';
	oProgErrStr['date'] = '必須是日期型別。(y-m-d)';
	oProgErrStr['shortdate'] = '必須是日期型別。(y-m)';
	oProgErrStr['shorterdate'] = '必須是日期型別。(m-d)';
	oProgErrStr['time'] = '必須是時間型別。(h:m:s)';
	oProgErrStr['shorttime'] = '必須是時間型別。(h:m)';
	oProgErrStr['shortertime'] = '必須是時間型別。(m:s)';
	oProgErrStr['email'] = '必須是 E-Mail 型別。';
	oProgErrStr['identitycard'] = '必須是身分證號碼型別。';
	oProgErrStr['denyeval'] = '必須不是 ';
	oProgErrStr['denytext'] = '必須不包含 ';
	oProgErrStr['limitedmax'] = '必須小於或等於 ';
	oProgErrStr['limitedmin'] = '必須大於或等於 ';
	oProgErrStr['limitmax'] = '必須小於 ';
	oProgErrStr['limitmin'] = '必須大於 ';
	oProgErrStr['xml'] = '必須是 WellForm 格式。';
	oProgErrStr['account'] = '必須是帳號格式（字母或數字）。';
	
	

	
	var oAttCol;
	var sValue;
	
	
	for( var nIndex=0; nIndex < eForm.elements.length; nIndex++)	{
		
		sValue = eForm.elements[nIndex].value;
		if( sValue == null)			continue;
		
		oAttCol = new _cBuildAtt( eForm.elements[nIndex] );			
		if( oAttCol.length == 0)	continue;		
		
		
		// notEmpty
		if( oAttCol.notempty != null)		{

			if( oFormFieldService.isEmpty( sValue) )	{
				oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr.notempty, "notEmpty");
			}
		}

		if( ! oFormFieldService.isEmpty( sValue) )		{ // sValue = "   " and allow empty ==> pass!


			// trim
			if( oAttCol.trim_left != null)	{
				eForm.elements[nIndex].value = oFormFieldService.getTrim( sValue, "left");
				sValue = eForm.elements[nIndex].value;
			}
			if( oAttCol.trim_right != null)	{
				eForm.elements[nIndex].value = oFormFieldService.getTrim( sValue, "right");
				sValue = eForm.elements[nIndex].value;
			}
			if( oAttCol.trim_both != null)	{
				eForm.elements[nIndex].value = oFormFieldService.getTrim( sValue, "both");
				sValue = eForm.elements[nIndex].value;
			}
			if( oAttCol.trim_all != null)	{
				eForm.elements[nIndex].value = oFormFieldService.getTrim( sValue, "all");
				sValue = eForm.elements[nIndex].value;
			}



			// varType
			if( oAttCol.vartype != null)	{
		
				switch( oAttCol.vartype)		{
				
				case "numeric":
					if( ! oFormFieldService.isNumeric( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;

				case "int":
					if( ! oFormFieldService.isInt( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;

				case "positiveint":
					if( ! oFormFieldService.isPositiveInt( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;

				case "date":
					// dateFromTaiwan
					if( oAttCol.datefromtaiwan != null)		{
						var sTwDate = oFormFieldService.convFromTaiwanDate( sValue);
						eForm.elements[nIndex].value = ( sTwDate == "NaN" ? "" : sTwDate);
						sValue = eForm.elements[nIndex].value;
					}
					
					if( ! oFormFieldService.isDate( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;
					

				case "shortdate":
					if( ! oFormFieldService.isShortdate( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;


				case "shorterdate":
					if( ! oFormFieldService.isShortdate( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;


				case "time":
					if( ! oFormFieldService.isTime( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;
					

				case "shorttime":
					if( ! oFormFieldService.isShortTime( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;
					

				case "shortertime":
					if( ! oFormFieldService.isShortTime( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;
					

				case "email":
					if( ! oFormFieldService.isEMail( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;

				case "identitycard":
					if( ! oFormFieldService.isIdentityCard( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;
					
				case "xml":
					if( ! oFormFieldService.isWellForm( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;

				case "account":
					if( ! oFormFieldService.isAccount( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ oAttCol.vartype], oAttCol.vartype);
					}
					break;

				default: // conmon text

				} 
			}



			// deny
			if( oAttCol.deny != null)		{
				
				switch( oAttCol.vartype )		{
				
				case "numeric":
				case "int":
				case "positiveint":
					if( parseFloat( oAttCol.deny)  != parseFloat( sValue) )		{
						oErrCol.addErr( nIndex, oAttCol.title, oProgErrStr[ "denyeval"] + oAttCol.deny, "denyeval");
					}
					break;
					
				case "date":
				case "shortdate":
				case "shorterdate":
					var nDiff = oFormFieldService.diffDate( sValue, oAttCol.deny, oAttCol.vartype);
					if(  nDiff == 0 )		{
						oErrCol.addErr( nIndex, oAttCol.title, oProgErrStr[ "denyeval"] + oAttCol.deny, "denyeval");
					}
					break;

				case "time":
				case "shorttime":
				case "shortertime":
					var nDiff = oFormFieldService.diffTime( sValue, oAttCol.deny, oAttCol.vartype);
					if(  nDiff == 0 )		{
						oErrCol.addErr( nIndex, oAttCol.title, oProgErrStr[ "denyeval"] + oAttCol.deny, "denyeval");
					}
					break;

				default:
					if( sValue.indexOf( oAttCol.deny) != -1)	{
						oErrCol.addErr( nIndex, oAttCol.title, oProgErrStr[ "denytext"] + oAttCol.deny, "denytext");
					}
				}
			}



			// limitedMax			
			if( oAttCol.limitedmax != null)		{
				if( ! _isFitLimit( sValue, oAttCol.limitedmax, oAttCol.vartype, "limitedmax") )		{
					oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ "limitedmax"] + oAttCol.limitedmax, "limitedmax");
				}
			}


			// limitMax			
			if( oAttCol.limitmax != null)		{
				if( ! _isFitLimit( sValue, oAttCol.limitmax, oAttCol.vartype, "limitmax") )		{
					oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ "limitmax"] + oAttCol.limitmax, "limitmax");
				}
			}


			// limitedMin
			if( oAttCol.limitedmin != null)		{
				if( ! _isFitLimit( sValue, oAttCol.limitedmin, oAttCol.vartype, "limitedmin") )		{
					oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ "limitedmin"] + oAttCol.limitedmin, "limitedmin");
				}
			}


			// limitMin			
			if( oAttCol.limitMin != null)		{
				if( ! _isFitLimit( sValue, oAttCol.limitmin, oAttCol.vartype, "limitmin") )		{
					oErrCol.addErr( nIndex, oAttCol.title , oProgErrStr[ "limitmin"] + oAttCol.limitmin, "limitmin");
				}
			}


			
			// replaceChar
			if( oAttCol.replacechar != null)	{
					eForm.elements[nIndex].value = oFormFieldService.replaceSpecialChar( sValue);
					sValue = eForm.elements[nIndex].value;
			}
			
			
			// fullSize
			if( oAttCol.fullsize != null)	{
			
				switch( oAttCol.vartype)	{
					
				case "positiveint":
					if( oFormFieldService.isInt( oAttCol.fullsize) )	{
						eForm.elements[nIndex].value = oFormFieldService.getFullSizePositiveInt( sValue, oAttCol.fullsize);
					}
					break;

				case "date":
				case "shortdate":
				case "shorterdate":
				case "time":
				case "shorttime":
				case "shortertime":
					eForm.elements[nIndex].value = oFormFieldService.getFullSizeDateTime( sValue);
					break;
					
				default:
				}
			}

		
		} // end isEmpty

	}// end for nIndex
	
	return oErrCol.errCol;

} // end function



function _isFitLimit( sValue, sLimit, varType, limitType)		{

	switch( varType)		{
	case "numeric":
	case "int":
	case "positiveint":
	
		if( ! _isNumeric( sLimit) )		break;
		
		switch( limitType)		{
		case "limitmax":		return ( parseFloat( sValue) < parseFloat( sLimit) );
		case "limitedmax":		return ( parseFloat( sValue) <= parseFloat( sLimit) );
		case "limitmin":		return ( parseFloat( sValue) > parseFloat( sLimit) );
		case "limitedmin":		return ( parseFloat( sValue) >= parseFloat( sLimit) );
		}
		
		break;
	
	case "date":
	case "shortdate":
	case "shorterdate":
	
		switch( limitType)		{
		case "limitmax":		return ( _diffDate( sValue, sLimit, varType) < 0 );
		case "limitedmax":		return ( _diffDate( sValue, sLimit, varType) <= 0 );
		case "limitmin":		return ( _diffDate( sValue, sLimit, varType) > 0 );
		case "limitedmin":		return ( _diffDate( sValue, sLimit, varType) >= 0 );
		}
		
		break;

	case "time":
	case "shorttime":
	case "shortertime":
	
		switch( limitType)		{
		case "limitmax":		return ( _diffTime( sValue, sLimit, varType) < 0 );
		case "limitedmax":		return ( _diffTime( sValue, sLimit, varType) <= 0 );
		case "limitmin":		return ( _diffTime( sValue, sLimit, varType) > 0 );
		case "limitedmin":		return ( _diffTime( sValue, sLimit, varType) >= 0 );
		}

		break;
	
	default:

	} // end switch
	
	return true;
}



function _cBuildAtt( eField)		{
	
	this.length = 0;
	var sAttribute = eField.getAttribute( "LD_varService");
	
	if( sAttribute != null)		{
		sAttribute = sAttribute.toString().toLowerCase();
		
		var aSplit1 = sAttribute.split( ";") ;
		var aSplit2;
		
		for( var iFor = 0; iFor < aSplit1.length; iFor++)		{
			
			aSplit2 = aSplit1[ iFor].split("=");			
			if( aSplit2.length > 2 )	continue;
			
			aSplit2[0] = _getTrim( aSplit2[0], "both");
			if( aSplit2[1] == null)		{
				aSplit2[1] = "";
			}else{
				aSplit2[1] = _getTrim( aSplit2[1], "both");
			}
			
			if( aSplit2[0] == "")	continue;
			
			this[ aSplit2[0] ] = aSplit2[1];
			this.length ++;
		}
	}
	

	
	sAttribute = eField.getAttribute( "LD_varType");
	if( sAttribute != null)		{
		sAttribute = sAttribute.toString().toLowerCase();
		
		var aSplit = sAttribute.split(";");
		for( var iFor=0; iFor < aSplit.length; iFor++)		{
			aSplit[ iFor] = _getTrim( aSplit[ iFor], "both");
			
			if( aSplit[ iFor] == "notempty")	{
				this.notempty = ""; // != null
			
			}else{
				this.vartype = aSplit[ iFor];
			}
		}
		this.length ++;
	}


	sAttribute = eField.getAttribute( "LD_Domain");
	if( sAttribute != null)		{
		sAttribute = sAttribute.toString().toLowerCase();
		
		var aSplit = sAttribute.split(";");
		var bSplit;
		
		for( var iFor=0; iFor < aSplit.length; iFor++)		{

			bSplit = aSplit[iFor].split("=");
			if( bSplit.length == 2)		{

				bSplit[0] = _getTrim( bSplit[0], "both");
				bSplit[1] = _getTrim( bSplit[1], "both");
			
				this[ bSplit[0]] = bSplit[1];
				this.length ++;
			}
		}
	}


	sAttribute = eField.getAttribute( "LD_Title");
	if( sAttribute != null)		{
		//this.title = sAttribute.toString().toLowerCase();
		this.title = sAttribute.toString();
		this.length ++;
	
	}else{
		this.title = "";
	}
	
}




function _display( eForm, sWrongColor, sCurectColor)		{

	if( eForm == null)			return false;
	if( sWrongColor == null)	sWrongColor = "#EE9F9F";
	if( sCurectColor == null)	sCurectColor = "#ffffff";
	
	
	// remark by dino 2003/5/30
//	for( var nIndex=0; nIndex < eForm.elements.length; nIndex++)
//		eForm.elements[nIndex].style.background = sCurectColor;

	//////////////////////////////////////////
	// Start Add by dino 2003/5/30
	//////////////////////////////////////////

	// only when original color == sWrongColor
	//   reset color to correct color
	for( var nIndex=0; nIndex < eForm.elements.length; nIndex++) {
//		trace(eForm.elements[nIndex].style.background,nIndex,true);
		if (sWrongColor.toUpperCase() == String(eForm.elements[nIndex].style.background).toUpperCase()) {
			eForm.elements[nIndex].style.background = sCurectColor;
		}
	}
	//////////////////////////////////////////
	// End Update by dino 2003/5/30
	//////////////////////////////////////////

	if( this.length == 0)	{
		return true;

	}else{
		var sErrMsg = "";
		var eField;
		//  modify by robin block 
		/*  here is coding by gary 
		for( var iFor = this.length-1; iFor >= 0; iFor--)	{
			eField = eForm.elements[ this[iFor].index ];
			eField.style.background = sWrongColor;
			if(eField.type!="hidden"){
				try{
					eField.focus();
				}catch(e){}
			}
			sErrMsg += "\n" + this[iFor].title + this[iFor].description;
		}
		*/
		// here is coding by robin 
		var bCheck=true;
		for( var iFor = 0;iFor < this.length;iFor++)	{
			eField = eForm.elements[ this[iFor].index ];
			eField.style.background = sWrongColor;
			if(eField.type!="hidden" && bCheck){
				try{
					eField.focus();
					bCheck=false;
				}catch(e){}
			}
			sErrMsg += "\n" + this[iFor].title + this[iFor].description;
		}
		//  end of modify by robin block 
		alert( sErrMsg);
		return false;
	}

}



function _addErr( nIndex, sTitle, sDescription, sErrID)	{

	var nLen = this.errCol.length;
	this.errCol[ nLen] = new Array();
	this.errCol[ nLen].index = nIndex;
	this.errCol[ nLen].title = sTitle;
	this.errCol[ nLen].description = sDescription;
	this.errCol[ nLen].errID = sErrID;
}





function cBuildErr( nIndex, sTitle, sDescription, sErrID)	{

	this.errCol = new Array();
	this.errCol.display = _display;
	this.addErr = _addErr;
	
}






function cJsVarService()	{

	this.getTrim = _getTrim;
	this.getSeparater = _getSeparater;
	this.getFullSizeDateTime = _getFullSizeDateTime;
	this.getFullSizePositiveInt = _getFullSizePositiveInt;
	this.cutTail = _cutTail;
	this.getRedomnStr = _getRedomnStr;
	this.parseDate = _parseDate;
	this.parseStrDate = _parseStrDate;
	this.convToTaiwanDate = _convToTaiwanDate;
	this.convFromTaiwanDate = _convFromTaiwanDate;
	this.convToChineseNumber = _convToChineseNumber;
	this.evalDate = _evalDate;
	this.diffDate = _diffDate;
	this.diffTime = _diffTime;
	this.diffWorkDate = _diffWorkDate;
	this.diffXmlWorkDate = _diffXmlWorkDate;
	this.getWorkDateList = _getWorkDateList
	this.getBetweenWorkDateList = _getBetweenWorkDateList
	this.isEmpty = _isEmpty;
	this.isNumeric = _isNumeric;
	this.isInt = _isInt;
	this.isPositiveInt = _isPositiveInt;
	this.isDate = _isDate;
	this.isShortDate = _isShortDate;
	this.isShorterDate = _isShorterDate;
	this.isTime = _isTime;
	this.isShortTime = _isShortTime;
	this.isShorterTime = _isShorterTime;
	this.isEMail = _isEMail;
	this.isIdentityCard = _isIdentityCard;
	this.isWellForm = _isWellForm;
	this.isAccount = _isAccount;
//	this.replaceSpecialChar = _replaceSpecialChar;
//	this.unreplaceSpecialChar = _unreplaceSpecialChar;

}





function _getTrim( sArgValue, sArgType, sArgChar)	{

	if( sArgValue == null )	throw "argument at function(doTrim) is mission!";
	if( sArgType == null)		sArgType = "both";
	if( sArgChar == null)		sArgChar = " ";

	sValue = sArgValue.toString();
	sArgType = sArgType.toString().toLowerCase();	

	var nFore = 0;
	var nTail = sValue.length - 1;
	var sChar;
	
	switch( sArgType)		{
	
	case "all":
	case "both":
	case "left":
		for( ; nFore< sValue.length; nFore++)		{
			sChar = sValue.charAt( nFore);
			if( sChar != sArgChar)	break;
		}
		if( sArgType == "left")	break;
		
	case "right":
		for( ; nTail>=nFore; nTail--)		{
			sChar = sValue.charAt( nTail);
			if( sChar != sArgChar)	break;
		}
		break;
	
	default:
		return sArgValue;
	} // end switch
	
	
	var sRtn = sValue.substring( nFore, nTail+1);
	if( sArgType == "all")		{

		var aSplit = sRtn.split( sArgChar);
		sRtn = "";

		for( var iFor =0; iFor < aSplit.length; iFor++)	{
			sRtn += aSplit[iFor];
		}
	}
	
	return sRtn;
}



function _getSeparater( sArgValue)	{
	if( sArgValue == null)	throw "argument at function(getSeparater) is mission!";

	if( sArgValue.indexOf("-") != -1)	return "-";
	if( sArgValue.indexOf("/") != -1)	return "/";
	return null;
/*
	var sValue = sArgValue.toString();
	var sSeparater = null;
	var sChar;
	
	for( var iFor = 0; iFor < sValue.length; iFor++)	{

		sChar =  sValue.charAt( iFor);
		if( sChar < "0" || sChar > "9" )		{
			
			sSeparater = sChar;
			break;
		}
	}
	return sSeparater;
*/	
}



function _getFullSizeDateTime( sArgValue)	{
	if( sArgValue == null)	throw "argument at function(doFullSize) is mission!";
	
	var sValue = sArgValue.toString();
	var sSeparater = _getSeparater( sArgValue);

	if( sSeparater == null)	{
		return sArgValue;

	}else{
		var aSplit = sValue.split( sSeparater);
		var sRtn;
		var nNum;

		if( _isPositiveInt( aSplit[0]) )	{
			nNum = parseFloat( aSplit[0]);
			sRtn = ( nNum > 9 ? nNum : "0"+nNum );
	
		}else{
			sRtn = aSplit[0];
		}
		
		for( var iFor=1; iFor < aSplit.length; iFor++)	{
			if( _isPositiveInt( aSplit[ iFor]) )	{

				nNum = parseFloat( aSplit[ iFor]);
				sRtn += sSeparater + ( nNum > 9 ? nNum : "0"+nNum );
		
			}else{
				sRtn += sSeparater + aSplit[ iFor];
			}
		}
	
		return sRtn;
	}
}



function _getFullSizePositiveInt( sArgValue, nArgPositiveInt)	{
	if( sArgValue == null || nArgPositiveInt == null)	throw "argument at function(doFullSize) is mission!";

	var nPositiveInt = ( _isPositiveInt( nArgPositiveInt) ? parseFloat( nArgPositiveInt) : 0 );
	if( nPositiveInt > 20)		nPositiveInt = 20;
	var nLen = sArgValue.toString().length;

	if( nLen >= nPositiveInt)	return sArgValue;	
	return( "00000000000000000000".substring( 0, nPositiveInt - nLen) + sArgValue );
}



function _cutTail( nArgValue, nArgPositiveInt)	{
	if( nArgValue == null || nArgPositiveInt == null)	throw "argument at function(cutTail) is mission!";
	
	if( ! _isNumeric( nArgValue) )				return "NaN";
	if( ! _isPositiveInt( nArgPositiveInt) )		return "NaN";

	var nValue = parseFloat( nArgValue);

	var aSplit = nValue.toString().split(".");
	if( aSplit.length == 1)		return nArgValue;		
	if( aSplit[1].length <= nArgPositiveInt)		return nArgValue;

	var nDesigner = parseFloat( aSplit[1].charAt( nArgPositiveInt) );
	if( nDesigner < 5)	{

		return( aSplit[0] + "." + aSplit[1].substr( 0, nArgPositiveInt) );
	}else{

		var nCutTail = parseFloat( aSplit[0] + aSplit[1].substr( 0, nArgPositiveInt) ) + 1;
		nCutTail = nCutTail.toString();
		nLength = nCutTail.length;
		
		return( nCutTail.substr( 0, nLength - nArgPositiveInt) + "." + nCutTail.substr( nLength - nArgPositiveInt, nArgPositiveInt) );
	}
}



function _getRedomnStr( nArgPositiveInt)	{
	if( nArgPositiveInt == null)	throw "argument at function(getRedomnStr) is mission!";

	if( ! _isPositiveInt( nArgPositiveInt) )	return "NaN";

	nArgPositiveInt = parseFloat( nArgPositiveInt);
	return( Math.random().toString().substr( 2, nArgPositiveInt));
}



function _parseDate( sArgDate)	{
	if( sArgDate == null) throw "argument(sArgDate) at function(parseDate) is missing!";
	
	if( ! _isDate( sArgDate)) return "NaN";
	
	var sDate = sArgDate.toString();
	if( sDate.indexOf("-") != -1)	{

		var aSplit = sDate.split("-");
		if( aSplit.length == 3)		{
			sDate = aSplit[0] + "/" + aSplit[1] + "/" + aSplit[2];
		}
	}
	return new Date( sDate);
}



function _parseStrDate( dDate, sSeparater, bFullSize)		{

	if( typeof( dDate) != "object")		return "";
	if( isNaN( dDate) )					return "";
	if( sSeparater == null)			sSeparater = "-";

	var nYear = dDate.getFullYear();
	var nMonth = dDate.getMonth() + 1;
	var nDate = dDate.getDate();
	
	if( bFullSize == true)		{
		if( nMonth < 10)	nMonth = "0" + nMonth;
		if( nDate < 10)		nDate = "0" + nDate;
	}
	
	return (nYear + sSeparater + nMonth + sSeparater + nDate);
}



/*
this.parseSeparater = function( sArgValue, sArgSeparater)	{
	if( sArgValue == null) throw "argument(sArgValue) at function(parseSeparater) is missing!";
	if( sArgSeparater == null) sArgSeparater= "/";
	
	var sSeparater = this.getSeparater( sArgValue);
	if( sSeparater == null)		return sArgValue;
	
	var aSplit = sArgValue.toString().split( sSeparater);
	var sRtn = aSplit[0];

	for( var iFor=1; iFor < aSplit.length; iFor++)		{
		sRtn += sArgSeparater + aSplit[ iFor];
	}
	
	return sRtn;
}
*/


function _convToTaiwanDate( sArgDate)	{
	if( sArgDate == null) throw "argument(sArgDate) at function(convToTaiwanDate) is missing!";

	if( ! _isDate( sArgDate) )	return "NaN";
	
	var sSeparater = _getSeparater( sArgDate);
	var sDate = sArgDate.toString();
	
	var nSeparater = sDate.indexOf( sSeparater);
	var nYear = parseFloat( sDate.substr( 0, nSeparater) );
	
	return( (nYear -1911) + sDate.substring( nSeparater) );
}



function _convFromTaiwanDate( sArgTaiwanDate)	{
	if( sArgTaiwanDate == null) throw "argument(sArgTaiwanDate) at function(convFromTaiwanDate) is missing!";

	var sSeparater = _getSeparater( sArgTaiwanDate);
	if( sSeparater == null)		return "NaN";
	
	var sDate = sArgTaiwanDate.toString();	
	var nSeparater = sDate.indexOf( sSeparater);
	
	if( ! _isPositiveInt( nSeparater) )		return "NaN";
	nSeparater = parseFloat( nSeparater);
	
	var nYear = parseFloat( sDate.substr( 0, nSeparater) );
	if( nYear > 999)	return sArgTaiwanDate;
	
	var sRtnDate = (nYear +1911) + sDate.substring( nSeparater);
	if( ! _isDate( sRtnDate) )	return "NaN";
	return( sRtnDate);
}



function _convToChineseNumber( nNum, sStyle)	{


	if( ! _isPositiveInt( nNum))		return "NaN";
	nNum = parseFloat( nNum);
	
	if( sStyle == null)		sStyle = "simple";
	sStyle = sStyle.toString().toLowerCase();
	

	var twUnit1, twUnit2, twNum;
		twUnit2 = new Array( "", "萬", "億", "兆", "京");
	
	if( sStyle == "simple")	{
		twUnit1 = new Array( "千", "", "十", "百");
		twNum = new Array( "零", "一", "二", "三", "四", "五", "六", "七", "八", "九");
		
	}else if( sStyle == "formal")	{
		twUnit1 = new Array( "仟", "", "拾", "佰");
		twNum = new Array( "零", "壹", "貳", "參", "肆", "伍", "陸", "柒", "捌", "玖");
	
	}else {
		return "NaN";
	}
	

	if( nNum < 10)
		return twNum[ nNum];
	
	else	{
		var rtnVal = "";
		var sNum = nNum.toString();
		var nEachNum;
		var bZeroMode = false;
		var bZeroUnit = false;
		
		for( var i=0; i< sNum.length; i++)	{

			nEachNum = parseInt( sNum.charAt( i));
			if( nEachNum == 0)	{
				bZeroMode = true;

			}else{
				if( bZeroMode == true)	{
					bZeroMode = false;
					bZeroUnit = false;
					rtnVal += twNum[0];
				}
				rtnVal += twNum[ nEachNum];
			}

			if( bZeroMode == false)		{
				rtnVal += twUnit1[ (sNum.length-i) % 4];
			
			}
			if( (sNum.length -i) %4 == 1)	{
				if( bZeroMode == false)			{
					rtnVal += twUnit2[ Math.floor( (sNum.length-i-1)/4)];
				
				}else if( bZeroUnit == false)		{
					rtnVal += twUnit2[ Math.floor( (sNum.length-i-1)/4)];
					bZeroUnit = true;
				}
			}
		}
		return rtnVal;
	}
}

/*
// senyann checkInput.js
function _replaceSpecialChar( x){	

	reg=/&/g
		x=x.replace(reg, "＆");
    reg=/</g
		x=x.replace(reg, "＜");
  	reg=/>/g
		x=x.replace(reg, "＞");
  	reg=/"/g
		x=x.replace(reg, '”');
	reg=/'/g
		x=x.replace(reg, "’");
	//x=this.convertLineBreak(x);
	return x;

}

function _unreplaceSpecialChar( x){	

	reg=/＆/g
		x=x.replace(reg, "&");
    reg=/＜/g
		x=x.replace(reg, "<");
  	reg=/＞/g
		x=x.replace(reg, ">");
  	reg=/”/g
		x=x.replace(reg, '"');
  	reg=/’/g
  		x=x.replace(reg,"'");
    //x=this.convertLineBreak(x);
 return x;

}
*/



function _evalDate( sArgDate, nArgMoveNum, sArgMoveType)		{

	if( ! _isDate( sArgDate) )		return "";
	if( ! _isInt( nArgMoveNum) )	nArgMoveNum = 0;
	sArgMoveType = ( (sMoveType = null) ? "d" : sArgMoveType.toString().toLowerCase() );

	var sSeparater = _getSeparater( sArgDate);
	aSplit = sArgDate.toString().split( sSeparater);
	
	var nYear = parseFloat( aSplit[0]);
	var nMonth =parseFloat( aSplit[1]) -1;
	var nDate = parseFloat( aSplit[2]);
	
	switch( sArgMoveType)		{	
	case "y":	nYear	+= nArgMoveNum;		break;
	case "m":	nMonth	+= nArgMoveNum;		break;
	case "d":	nDate	+= nArgMoveNum;		break;
	default:	throw "argument(sArgMoveType) at function(evalDate) is error!";
	}
	
	var dDate = new Date( nYear, nMonth, nDate);
	return( dDate.getFullYear() + sSeparater + (dDate.getMonth() +1) + sSeparater + dDate.getDate() );
}



function _diffDate( sArgDateFore, sArgDateTail, sArgType)	{
	if( sArgDateFore == null || sArgDateTail == null) throw "arguments at function(diffDate) is missing!";
	if( sArgType == null)	sArgType = "date";

	var sDateFore;
	var sDateTail;
	var sSeparaterFore = _getSeparater( sArgDateFore);
	var sSeparaterTail = _getSeparater( sArgDateTail);

	var sType = sArgType.toString().toLowerCase();
	switch( sType)	{
	
	case "date":
		sDateFore = sArgDateFore;
		sDateTail = sArgDateTail;
		break;

	case "shortdate":
		sDateFore = sArgDateFore + sSeparaterFore + "01";
		sDateTail = sArgDateTail + sSeparaterTail + "01";
		break;
	
	case "shorterdate":
		sDateFore = "1970" + sSeparaterFore + sArgDateFore;
		sDateTail = "1970" + sSeparaterTail + sArgDateTail;
		break;
	
	default:
		return "NaN";
	} // end switch

	if( ! _isDate( sDateFore) )		return "NaN";
	if( ! _isDate( sDateTail) )		return "NaN";
	
	var nDateFore = _parseDate( sDateFore).valueOf();
	var nDateTail = _parseDate( sDateTail).valueOf();	

	if( sType == "date" || sType == "shorterdate")	{
		return( (nDateFore - nDateTail) / 86400000 );
	
	}else{
		return( (nDateFore - nDateTail) / 2678400000 );
	}
}



function _diffTime( sArgTimeFore, sArgTimeTail, sArgType)	{
	if( sArgTimeFore == null || sArgTimeTail == null) throw "arguments at function(diffTime) is missing!";
	if( sArgType == null)	sArgType = "time";

	var sTimeFore;
	var sTimeTail;

	var sType = sArgType.toString().toLowerCase();
	switch( sType)	{
	
	case "time":
		sTimeFore = sArgTimeFore;
		sTimeTail = sArgTimeTail;
		break;

	case "shorttime":
		sTimeFore = sArgTimeFore + ":00";
		sTimeTail = sArgTimeTail + ":00";
		break;
	
	case "shortertime":
		sTimeFore = "00:" + sArgTimeFore;
		sTimeTail = "00:" + sArgTimeTail;
		break;
	
	default:
		return "NaN";
	} // end switch
	
	if( ! _isTime( sTimeFore) )		return "NaN";
	if( ! _isTime( sTimeTail) )		return "NaN";

	var aSplitFore = sTimeFore.toString().split(":");
	var aSplitTail = sTimeTail.toString().split(":");

	var nTimeFore = ( parseFloat(aSplitFore[0])*60 + parseFloat(aSplitFore[1]) ) *60 + parseFloat(aSplitFore[2]) ;
	var nTimeTail = ( parseFloat(aSplitTail[0])*60 + parseFloat(aSplitTail[1]) ) *60 + parseFloat(aSplitTail[2]) ;
	
	if( sType == "time" || sType == "shortertime")	{
		return( nTimeFore - nTimeTail);
	
	}else{
		return( (nTimeFore - nTimeTail) / 60 );
	}
}




function _diffWorkDate( sArgDateFore, sArgDateTail, nColFull, nColHalf)	{
	if( nColFull == null)	{
		nColFull = new Array();
		nColFull[0] = 0;
		nColFull[1] = 6;
	}
	if( nColHalf == null)	nColHalf = new Array();
	if( _parseDate( sArgDateFore).valueOf() > _parseDate( sArgDateTail).valueOf() )		{
		var sTemp = sArgDateFore;
		sArgDateFore = sArgDateTail;
		sArgDateTail = sTemp;
	}
	
	var nDiff = _diffDate( sArgDateTail, sArgDateFore, "date");
	var nDayFore = _parseDate( sArgDateFore).getDay();
	var nDayTail = _parseDate( sArgDateTail).getDay();
	
	
	// a part of, not a full week, how much work and rest days
	var nDays;
	var nRestDays;
	
	if( nDayFore < nDayTail)	{
		nDays = nDayTail - nDayFore + 1;
		nRestDays = _getRestDays( nDayFore, nDayTail, nColFull, nColHalf);
	
	}else if( nDayFore > nDayTail)	{
		nDays = nDayTail + 7 - nDayFore + 1;
		nRestDays = _getRestDays( 0, nDayTail, nColFull, nColHalf);
		nRestDays+= _getRestDays( nDayFore, 6, nColFull, nColHalf);
	
	}else{
		nDays = 1;
		nRestDays = _getRestDays( nDayFore, nDayTail, nColFull, nColHalf);
	}
	
	var nWeeks = ( nDiff - nDiff % 7 ) / 7;
	var nWeekWorkDays = 7 - nColFull.length - nColHalf.length/2;

	return nDays - nRestDays + nWeeks * nWeekWorkDays ;
}


function _getRestDays( nDayFore, nDayTail, nColFull, nColHalf)		{ // for _diffWorkDate

	var nRestDate = 0;
	for( var iFor = nDayFore; iFor <= nDayTail; iFor++)		{
		
		for( var jFor in nColFull)		{
			if( iFor == nColFull[ jFor] )		nRestDate++;
		}

		for( var jFor in nColHalf)		{
			if( iFor == nColHalf[ jFor] )		nRestDate = nRestDate + 0.5;
		}
	}
	
	return nRestDate;
}



function __getNextHoliday( dDate, oEnum, bFirst)	{ 
 
	var dRest;
	for( ; oEnum.atEnd() == false; oEnum.moveNext() )	{		
		dRest = _parseDate( oEnum.item().getAttribute("date"));		
		if( bFirst == true)		{
			if( dDate.valueOf() <= dRest.valueOf())	return dRest;
		}else{
			if( dDate.valueOf() < dRest.valueOf())	return dRest;
		}
	}
	
	return null;
}



function __initHoliday( nColFull, nColHalf)	{


	var oXmlHttp = new ActiveXObject("MSXML2.XMLHTTP.3.0");
	oXmlHttp.open("GET", "/_lib/include/holiday.xml", false);	
	oXmlHttp.send();
	var xRest = oXmlHttp.responseXML.documentElement;
/*
	var xmlRest = new ActiveXObject("MSXML2.DOMDocument.3.0");
		xmlRest.async = false;
		xmlRest.load( "holiday.xml");
		
	var xRest = xmlRest.documentElement;
*/

	var xRestCol = xRest.selectSingleNode("meta/restFull");
	for( var xNode = xRestCol.firstChild; xNode != null; xNode = xNode.nextSibling)	{
		nColFull[ nColFull.length] = parseFloat( xNode.text );
	}

	xRestCol = xRest.selectSingleNode("meta/restHalf");
	for( var xNode = xRestCol.firstChild; xNode != null; xNode = xNode.nextSibling)	{
		nColHalf[ nColHalf.length] = parseFloat( xNode.text );
	}

	return new Enumerator( xRest.selectNodes("holiday"));
}



function _diffXmlWorkDate(  sArgDateFore, sArgDateTail)		{

	if( _isDate( sArgDateFore) == false || _isDate( sArgDateTail) == false)	{
		throw new Error( 1, "arguments at function( diffXmlWorkDate) is wronging!");
	}

	if( _parseDate( sArgDateFore).valueOf() > _parseDate( sArgDateTail).valueOf() )		{
		var sTemp = sArgDateFore;
		sArgDateFore = sArgDateTail;
		sArgDateTail = sTemp;
	}


	var nColFull = new Array();
	var nColHalf = new Array();
	var oEnum = __initHoliday( nColFull, nColHalf);

	var dFore = _parseDate( sArgDateFore);
	var dTail = _parseDate( sArgDateTail);
	var dRest;
	var nHolidays = 0; // holiday days in xml, not contain rest day
	
	for( ; oEnum.atEnd() == false; oEnum.moveNext()) {
		dRest = _parseDate( oEnum.item().getAttribute("date"));
		
		if( dRest < dFore)	{
			continue;		
		}else if( dRest > dTail)	{
			break;
		
		}else{			
			nHolidays += 1 - _getRestDays( dRest, dRest, nColFull, nColHalf);
		}
	}

	return _diffWorkDate( sArgDateFore, sArgDateTail, nColFull, nColHalf) - nHolidays;
}



function _getBetweenWorkDateList( sArgDateFore, sArgDateTail)		{
	if( _isDate( sArgDateFore) == false || _isDate( sArgDateTail) == false)	{
		throw new Error( 1, "arguments at function( _getBetweenWorkDateList) is wronging!");
	}

	if( _parseDate( sArgDateFore).valueOf() > _parseDate( sArgDateTail).valueOf() )		{
		var sTemp = sArgDateFore;
		sArgDateFore = sArgDateTail;
		sArgDateTail = sTemp;
	}

	var nColFull = new Array();
	var nColHalf = new Array();
	var oEnum = __initHoliday( nColFull, nColHalf);

	
	var dFore = _parseDate( sArgDateFore);
	var dTail = _parseDate( sArgDateTail);
	var sWorkDateList = "<dateList>";
	var nTotal = 0;
	var dNextHoliday = __getNextHoliday( dFore, oEnum, true);

	for( var dFor = dFore; dFor.valueOf() <= dTail.valueOf(); dFor = new Date( dFor.valueOf() + 86400000) )		{
		if( dNextHoliday == null || dFor.valueOf() < dNextHoliday.valueOf() )	{

			var nRest = _getRestDays( dFor.getDay(), dFor.getDay(), nColFull, nColHalf);
			if( nRest == 0)		{ // not rest day
				sWorkDateList += "<item date='" + _parseStrDate( dFor, null, true) + "' day='" + dFor.getDay() + "' mode='full' />";
				nTotal++;
			}else if( nRest == 0.5)	{
				sWorkDateList += "<item date='" + _parseStrDate( dFor, null, true) + "' day='" + dFor.getDay() + "' mode='half' />";
				nTotal++;
			}
		}else{ // ==
			dNextHoliday = __getNextHoliday( dNextHoliday, oEnum);
		}
	}

	sWorkDateList += "</dateList>";
	
	var xWorkDateList = new ActiveXObject("MSXML2.DOMDocument.3.0");
		xWorkDateList.async = false;
		xWorkDateList.loadXML( sWorkDateList);
		
	xWorkDateList.documentElement.setAttribute("total", nTotal);
	return xWorkDateList;
}


function _getWorkDateList( sArgStartDate, nStep)		{
	if( _isDate( sArgStartDate) == false || _isInt( nStep) == false)	{
		throw new Error( 1, "arguments at function( _getWorkDateList) is wronging!");
	}

	var nColFull = new Array();
	var nColHalf = new Array();;
	var oEnum = __initHoliday( nColFull, nColHalf);

	var sWorkDateList = "<dateList>";
	var dDate = _parseDate( sArgStartDate);
	var dNextHoliday = __getNextHoliday( dDate, oEnum, true);
	
	dDate = new Date( dDate.valueOf() - 86400000 );
	for( var iFor = 0; iFor < nStep; iFor++)		{

		dDate = new Date( dDate.valueOf() + 86400000);
		if( dNextHoliday == null || dDate.valueOf() < dNextHoliday.valueOf() )	{
			
			var nRest = _getRestDays( dDate.getDay(), dDate.getDay(), nColFull, nColHalf);
			if( nRest == 0)		{ // not rest day
				sWorkDateList += "<item date='" + _parseStrDate( dDate, null, true) + "' day='" + dDate.getDay() + "' mode='full' />";
			}else if( nRest == 0.5)	{
				sWorkDateList += "<item date='" + _parseStrDate( dDate, null, true) + "' day='" + dDate.getDay() + "' mode='half' />";
			}else{
				iFor--;
			}
		
		}else{
			dNextHoliday = __getNextHoliday( dDate, oEnum);
			iFor--;
		}
	}
	
	sWorkDateList += "</dateList>";
	
	var xWorkDateList = new ActiveXObject("MSXML2.DOMDocument.3.0");
		xWorkDateList.async = false;
		xWorkDateList.loadXML( sWorkDateList);

	return xWorkDateList;
}



function cWorkDateList()	{

	var sStartDate;
	var nStep;
	this.getList = function()	{
		if( _isDate( sStartDate) == false || _isInt( nStep) == false )	{
			return _getWorkDateList(  this.sStartDate, this.nStep);
		}else{
			throw new Error( -1, "arguments at cWorkDateList error");
		}
	}
}


function _isEmpty( sArgValue)		{
	if( sArgValue == null) return true;
	return ( _getTrim( sArgValue, "right") == "");
}



function _isNumeric( nArgValue)	{
	if( nArgValue == null) return false;

	nArgValue = _getTrim( nArgValue);
	if( nArgValue == "")		return false;
	if( isNaN( nArgValue) )		return false;

	var aNum = nArgValue.toString().split(".");

	if( aNum.length == 2) 
		if( aNum[0] == "" || aNum[0] == "-" || aNum[1] == "")		return false;
	
	return true;
}



function _isInt( nArgValue)		{

	if( _isNumeric( nArgValue) == false )	return false;	
	return ( Math.floor( nArgValue) == nArgValue);
}



function _isPositiveInt( nArgValue)	{

	if( _isInt( nArgValue) == false )	return false;	
	return ( nArgValue >= 0 );
}



function _isDate( dArgValue)		{
	if( dArgValue == null) return false;
	
	sDate = dArgValue.toString();

	var sSeparater = null;
	if( sDate.indexOf("-") != -1)	sSeparater = "-";
	if( sDate.indexOf("/") != -1)	sSeparater = "/";
	if( sSeparater == null)		return false;
	
	var aSplit = sDate.split( sSeparater);
	if( aSplit.length != 3)	return false;

	if( isNaN( aSplit[0]))	return false;
	if( isNaN( aSplit[1]))	return false;
	if( isNaN( aSplit[2]))	return false;

	var dDate = new Date( aSplit[0] + "/" + aSplit[1] + "/" + aSplit[2]);
	if( isNaN( dDate))		return false;
	
	if( dDate.getFullYear() != parseFloat( aSplit[0]) )		return false;
	if( dDate.getMonth() +1 != parseFloat( aSplit[1]) )		return false;
	if( dDate.getDate() != parseFloat( aSplit[2]) )			return false;

	return true;
}



function _isShortDate( dArgValue)	{
	if( dArgValue == null) return false;

	var sSeparater = _getSeparater( dArgValue);
	return _isDate( dArgValue + sSeparater + "01");
}



function _isShorterDate( dArgValue)	{
	if( dArgValue == null) return false;

	var sSeparater = _getSeparater( dArgValue);
	return _isDate( "1970" + sSeparater + dArgValue );
}



function _isTime( tArgValue)		{
	if( tArgValue == null) return false;
	
	var aSplit = tArgValue.toString().split(":");
	if( aSplit.length != 3)		return false;
	if( (! _isPositiveInt( aSplit[0])) || (! _isPositiveInt( aSplit[1])) || (! _isPositiveInt( aSplit[2])) )	return false;
	
	var nH = parseFloat( aSplit[0]);
	var nM = parseFloat( aSplit[1]);
	var nS = parseFloat( aSplit[2]);

	if( nH < 0 || nH > 23)	return false; 
	if( nM < 0 || nM > 59)	return false; 
	if( nS < 0 || nS > 59)	return false; 
	
	return true;
}



function _isShortTime( tArgValue)	{
	if( tArgValue == null) return false;

	return _isTime( tArgValue + ":00");
}



function _isShorterTime( tArgValue)	{
	if( tArgValue == null) throw "argument(tArgValue) at function(isShorterTime) is missing!";

	return _isTime( "00:" + tArgValue );
}



function _isEMail( sArgMail)		{
	
	if( sArgMail == null) return false;

	var sMail = sArgMail.toString();
	if( sMail.indexOf( " ") != -1 )		return false;
	if( sMail.indexOf("@") == -1)		return false;
	
	var aCol = sMail.split("@");
	if( aCol.length != 2)						return false;
	if( aCol[0] == "" || aCol[1] == "")			return false;
	
	return true;
}



function _isIdentityCard( sCID)	{

	if( sCID == null )		return false;
	
	sCID = sCID.toString();
	if( sCID.length != 10 ) return false;

	var sChar = sCID.substr( 0,1);
	var nSex = parseFloat( sCID.substr( 1,1));

	if( sChar > "Z" || sChar < "A" )				return false; 
	if( isNaN( nSex) || nSex > 2 || nSex < 1 )		return false; 
	if( ! _isPositiveInt( sCID.substr( 2, 8)))		return false; 

	var nChar = "ABCDEFGHJKLMNPQRSTUVXYWZIO".indexOf( sChar) + 10;
	var nSum = parseInt( nChar.toString().substr(0,1))
			 + parseInt( nChar.toString().substr(1,1))*9
			 + nSex*8 ;

	for( var i=7; i>=1 ; i--)	{
		nSum += parseInt( sCID.charAt( 9-i)) *i ;
	}
	
	nSum += parseInt( sCID.charAt(9) );
	if( nSum % 10 != 0)	return false
	
	return true;
}



function _isWellForm( sContent)		{
	
	if( sContent == null || sContent == "")		return false;
	
	var oXml = new ActiveXObject("MSXML2.DOMDocument.3.0");
	oXml.async = false;
	return( oXml.loadXML( "<root>" + sContent + "</root>") );
}



// from senyann
function _isAccount( sArgValue)		{
  
	if( sArgValue == null)		return false;
	if( sArgValue == "")		return false;
  
	var sValue = sArgValue.toString();
	var reg = /^[A-Za-z0-9]*$/g;
	if( sValue.match( reg) == null)		return false;
	
	return true;
}







