function FormUtils()
{
	var xmlObj=null;
	var dateUtils=new DateUtils();
	var numberUtils=new NumberUtils();
	var gRoot;
	this.loadXml=function loadXml(xmlId)
	{
		xmlObj=xmlId;
		//------- ตรวจสอบความถูกต้องของเอกสาร xml--------------
		if (xmlObj.parseError != 0)
		{
			alert("กรุณาตรวจสอบความถูกต้องของ XML เพราะว่าเกิดความผิดพลาดในเอกสาร XML");
			return false;
		}
		//-------------------------------------------------------------
		gRoot=xmlObj.documentElement; 
		setEvent(gRoot.nodeName,"onkeydown","methodForForm");	//---------ทำการกำหนด event ตอนที่ key ให้ key enter แล้วกลายเป็น tab
		for (var i=0;i<gRoot.childNodes.length;i++)
		{
			var textNode=gRoot.childNodes[i];	//-------- object node
			var textName=textNode.nodeName;	//-----name 
			var att=textNode.attributes;	//-------- get ค่า attribute
			if (att.getNamedItem("type")==null) continue;
			var typeValue=att.getNamedItem("type").value;	//-------- get ค่า attribute ชนิด type เพือที่จะกำหนด event ให้ถูกต้อง
			try
			{
				switch (typeValue.toUpperCase())
				{
					case "DATE"://------ type เป็น date 
							setEvent(textName,"onkeypress","methodForDate");	//---------ทำการกำหนด event ตอนที่ key ให้ key ได้แค่้ตัวเลขอย่างเดียว
							var validateValue=true;
							var validate=att.getNamedItem("validate");
							if (validate != null) 
							{
								if (validate.value=="" || validate.value=="false") validateValue=false;
							}
							if (validateValue) setEvent(textName,"onblur","validateDate");//------- ทำการกำหนด event ตอน lostfocus ให้ validate วันที่
							break;
					case "INTEGER":	//------- type เป็น inrteger 
							setEvent(textName,"onkeypress","methodForInteger");	
							break;
					case "CURRENCY":
							setEvent(textName,"onkeypress","methodForCurrency");	
							setEvent(textName,"onblur","validateCurrency");	
							break;
					case "KEYTHAI":
							setEvent(textName,"onkeypress","methodForKeyThai");	
							break;
					case "KEYENGLISH":
							setEvent(textName,"onkeypress","methodForKeyEnglish");	
							break;
				}
			}
			catch(e)
			{
				alert(e.number+"   "+e.message+"  เกิดการ error ใน XML เนื่องจากไม่มี "+textName+" อยู่ใน Form");

			}
		}
	}

	function setEvent(textName,eventType,methodName)
	{
		var boundEvent="document.all('"+textName+"')."+eventType+"="+methodName;
		eval(boundEvent);
	}

	function methodForForm()
	{
		var firstFocusValue="";
		var lastFocusValue="";
		var att=gRoot.attributes;
		var firstFocus=att.getNamedItem("first_focus");
		var lastFocus=att.getNamedItem("last_focus");
		if (firstFocus != null) firstFocusValue=firstFocus.value;
		if (lastFocus != null) lastFocusValue=lastFocus.value;
		autoTab(firstFocusValue,lastFocusValue);
	}

	function methodForDate()
	{
		keyDate();
	}

	function validateDate()
	{
		var objText=window.event.srcElement;
		var dateValue=objText.value;
		if (!dateUtils.validateDate(dateValue))
		{
			objText.select();
		}
	}

	function methodForInteger()
	{
		var zeroFrontValue=false;
		var extendValue="";
		var att=getAttributesForTextFocus();
		var zeroFront=att.getNamedItem("zero_front");
		var extend=att.getNamedItem("extend_value");
		if (zeroFront != null) 
		{
			if (zeroFront.value=="true") zeroFrontValue=true;	
		}
		if (extend != null)
		{
			extendValue=extend.value;
		}
		keyNumberPlusChar(extendValue,zeroFrontValue);
	}

	function methodForCurrency()
	{
		var negativeValue=false;
		var showCommaValue=true;
		var att=getAttributesForTextFocus();
		var negative=att.getNamedItem("negative");
		var showComma=att.getNamedItem("show_comma"); 
		if (negative != null) 
		{
			if (negative.value=="true") negativeValue=true;
		}
		if (showComma != null)
		{
			if (showComma.value=="false" || showComma.value=="") showCommaValue=false;
		}
		keyCurrency(negativeValue,-1,showCommaValue);
	}

	function validateCurrency()
	{
		var numAfterDotValue=0;
		var numBeforeDotValue=0;
		var showCommaValue=true;
		var validateValue=true;
		var objText=window.event.srcElement;
		var att=getAttributesForTextFocus();
		var numAfterDot=att.getNamedItem("num_after_dot");
		var numBeforeDot=att.getNamedItem("num_before_dot");
		var showComma=att.getNamedItem("show_comma"); 
		var validate=att.getNamedItem("validate");
		if (numAfterDot != null) 
		{
			numAfterDotValue=parseFloat("0"+numAfterDot.value);
		}

		if (numBeforeDot != null) 
		{
			numBeforeDotValue=parseFloat("0"+numBeforeDot.value);
		}
		
		if (validate != null) 
		{
			if (validate.value=="" || validate.value=="false") validateValue=false;	
		}
		if (showComma != null)
		{
			if (showComma.value=="false" || showComma.value=="") showCommaValue=false;
		}
		if (validate && numBeforeDotValue > 0)
		{
			if (!numberUtils.validateCurrency(objText.value,numBeforeDotValue,numAfterDotValue))
			{
				alert("กรุณากรอกจำนวนเงินให้ถูกต้อง (จำนวนก่อนทศนิยมมีจำนวน "+(numBeforeDotValue)+
						" และจำนวนหลังทศนิยมมีจำนวน "+numAfterDotValue);
				objText.select();
				return false;
			}
		}
		if (showCommaValue)
			objText.value=numberUtils.formatCurrency(objText.value,numAfterDotValue);
		else
			objText.value = 	objText.value;
	}

	function methodForKeyThai()
	{
		keyThai();
	}

	function methodForKeyEnglish()
	{
		keyEnglish();
	}

	function getAttributesForTextFocus()
	{
		var objText=window.event.srcElement;
		var textId=objText.id;
		if (textId=="") textId=objText.name;
		var textNode=gRoot.selectSingleNode(textId);
		var att=textNode.attributes;
		return att;
	}
	
	this.autoTab=function autoTab(firstFocus,lastFocus)
	{
		if (window.event.srcElement.skipTab=="true") return;
		if (window.event.keyCode==13) 
		{
			if (window.event.srcElement==document.getElementsByName(lastFocus)[0])
			{
				if (!document.getElementsByName(firstFocus)[0].disabled) document.getElementsByName(firstFocus)[0].focus();
			}
			else
				window.event.keyCode=9;
		}
	}//end method scAutoTab

	this.keyNumber=function keyNumber(zeroFront)
	{
		if (zeroFront==null) zeroFront=false;
		return keyNumberPlusChar("",zeroFront);
	}

	this.keyNumberPlusChar=function keyNumberPlusChar(extendValidate,zeroFront)
	{
		if (extendValidate==null) extendValidate="";
		var number="0123456789"+extendValidate;
		if (zeroFront==null || zeroFront==false)
		{
			if (String.fromCharCode(window.event.keyCode)=="0")
			{
				//check ว่าสามารถใส่ 0 ข้างหน้าได้หรือเปล่า
				if (window.event.srcElement.value=="")
				{
					window.event.keyCode="";
					return false;
				}
			}
		}
		var strValue=String.fromCharCode(window.event.keyCode);
		if (number.indexOf(strValue,0)==-1)
		{
			window.event.keyCode="";
			return false;
		}
		return true;
	}

	this.keyDate=function keyDate()
	{
		var objText=window.event.srcElement;
		keyNumber(true);
		var separator = '/';
		var rg = new RegExp(separator,"gi")
		var value=objText.value.replace(rg,"");
		if (value.length % 2==0 && value.length!=0 && (value.length==2 || value.length==4))
		{
			if (objText.value.substring(objText.value.length-1,objText.value.length)=="/")
				objText.value=objText.value;
			else
				objText.value=objText.value+"/";	
		}
	}

	this.keyCurrency=function keyCurrency(isNegative,decimal,showComma)
	{
		var objText=window.event.srcElement;
		var returnValue="";
		if (isNegative==null) isNegative=false;
		if (decimal==null) decimal=0;
		if (showComma==null) showComma=true;
		var number="0123456789.";
		// *********** check ว่าที่ key เข้ามาเป็น "." หรือเปล่า***************
		if (String.fromCharCode(window.event.keyCode)==".")
		{
			//********* check ให้ ใส่จุดได้แค่ครั้งเดียว ***************
			if (objText.value.indexOf(".",0)!=-1)
			{
				window.event.keyCode="";
				return false;
			}
		}
		// *********** check ว่าที่ key เข้ามาเป็น "0" หรือเปล่า***************
		if (objText.value=="0" || objText.value=="-0")
		{
			if (String.fromCharCode(window.event.keyCode)!=".")
			{
				window.event.keyCode="";
				return false;
			}
		}

		if (isNegative==true)
		{
			number=number+"-";
			// *********** check ว่าที่ key เข้ามาเป็น "-" หรือเปล่า***************
			 if (String.fromCharCode(window.event.keyCode)=="-")
			{
				//********* check ให้ ใส่"-"ได้แค่ครั้งเดียวและต้องอยู่หน้าสุด ***************
				if (objText.value.substring(0,1)=="-" || objText.value.substring(0,1)!="")
				{
					window.event.keyCode="";
					return false;
				}
			}
		}
		var strValue=String.fromCharCode(window.event.keyCode);
		if (number.indexOf(strValue,0)==-1)
		{
			window.event.keyCode="";
			return false;
		}
		returnValue=objText.value+strValue;
		window.event.keyCode="";
		//----- ส่ง numDec=-1 ไปเพื่อบอกว่าตอนที่เกิด event keypress นั้นยังไม่ต้องเติมจำนวนหลังจุดทศนิยม
		if (showComma) 
			objText.value=numberUtils.formatCurrency(returnValue,-1);
		else
			objText.value=returnValue;	
		return true;
	}

	this.keyThai=function keyThai()
	{
		var objText=window.event.srcElement;
		window.status=window.event.keyCode+"::"+String.fromCharCode(window.event.keyCode);
		var thaiValue="กขค";
	}

	this.keyEnglish=function keyEnglish(alertMsg)
	{
		if (alertMsg==null) alertMsg=false;
		var engValue=" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.'0123456789";
		var charValue=String.fromCharCode(window.event.keyCode);
		if (engValue.indexOf(charValue)==-1)
		{
			if (alertMsg) alert("ช่องนี้กรอกได้แต่ภาษาอังกฤษเท่านั้น");
			window.event.keyCode="";
			return false;
		}
		return true;
	}

	this.modeChange=function scModeChange(argMode)
	{
	   var root=xmlObj.documentElement;
	   var rootNodeList=root.childNodes;
	   var inputName="";
	   try
	   {
		   for (var i=0;i<rootNodeList.length;i++)
		   {
				var objNode=root.childNodes.item(i);
				inputName=objNode.nodeName;
				var objAtt=objNode.attributes;
				var attMode=objAtt.getNamedItem("mode")
				if (attMode !=null)
				{
					var valueMode=new Array();
					valueMode=attMode.value.split("|");
					if (valueMode.length<=1)
					{
						if (argMode==valueMode)
							isEnabled(inputName,true);
						else
							isEnabled(inputName,false);
					} // if (valueMode.length<=1)
					else
					{
						for(var k=0;k<valueMode.length;k++)
						{
							if (argMode==valueMode[k])
							{
								isEnabled(inputName,true);
								break;
							}
							else
							{
								isEnabled(inputName,false);
							}
						}// end for(var k=0;k<valueMode.length;k++)
					}// end if (valueMode.length<=1)
				}
		   }//  for
		}// try
		catch (e)
		{
				alert("xml error !");
		}
	 }// end Method scModePanel

	 function isEnabled(strName,flag)
	{
		 var j=0;
		 var typeDisable;
		 var typeInput;
		 var inputDisabled = "button,checkbox,file,password,radio,reset,submit,select-multiple,select-one";
		 var inputReadOnly = "text,textarea";
		 for (obj in document.getElementsByName(strName))
		 {
				 if (document.getElementsByName(strName)[j]!= null)
				 {
                    typeInput = document.getElementsByName(strName)[j].type
                    if (inputDisabled.indexOf(typeInput) !=-1)
                    {
                        typeDisable = "disabled";
                    }
                    else
                    {
                        if (inputReadOnly.indexOf(typeInput) !=-1) typeDisabled = "readOnly"
                    }
					if (flag)
					{
						document.getElementsByName(strName)[j].className="enabled";
						if (typeDisable=="readOnly")
							document.getElementsByName(strName)[j].readOnly=false;
						else
							document.getElementsByName(strName)[j].disabled=false;
					}
					else
					{
						document.getElementsByName(strName)[j].className="disabled";
						if (typeDisable=="readOnly")
							document.getElementsByName(strName)[j].readOnly=true;
						else
							document.getElementsByName(strName)[j].disabled=true;
					}
				 }
			 j++
		  }
	}// end private Method isEnable 
	
	this.clearAll=function clearAll(objId)
	{
		var tagType="";
		var inputText = "hidden,password,text,textarea,select-multiple,select-one";
		var inputCheck = "checkbox,radio";
		if (objId.length == null)
		{
            for (var i=0;i<objId.all.length;i++)
            {
                tagType=objId.all(i).type;
                if (inputText.indexOf(tagType) !=-1)
                {
                    objId.all(i).value="";
                    continue;
                }
                if (inputCheck.indexOf(tagType) !=-1) objId.all(i).checked=false;
            }
        }
        else
        {
            for (var j=0;j<objId.length;j++)
            {
                var objTagDivChild = objId[j];
                for (var i=0;i<objTagDivChild.all.length;i++)
                {
                    tagType=objTagDivChild.all(i).type;
                    if (inputText.indexOf(tagType) !=-1)
                    {
                        objTagDivChild.all(i).value="";continue;
                    }
                    if (inputCheck.indexOf(tagType) !=-1) objTagDivChild.all(i).checked=false;
                }
            }
        }
	}

	this.checkedAll=function checkedAll(objId,flag)
	{
		var tagType="";
		if (flag==null) flag=false;
		for (var i=0;i<objId.all.length;i++)
		{
			tagType=objId.all(i).type;
			if (tagType=="checkbox" || tagType=="radio") objId.all(i).checked=flag;
		}
	}

	this.enabledAll=function enabledAll(objId,flag,className)
	{
		var tagType="";
		var inputText = "text,textarea,hidden,password";
		var inputNonText = "button,checkbox,file,radio,reset,submit";
		var inputSelect = "select-multiple,select-one";
		if (flag==null) flag=false;
		if (className == null ) className = "";
		if (objId.length == null)
		{
            for (var i=0;i<objId.all.length;i++)
            {
                tagType=objId.all(i).type;
                if (inputText.indexOf(tagType) !=-1)
                {
                    objId.all(i).readOnly=!flag;
                    if (className != "") objId.all(i).className=className;
                    continue;
                }
                if (inputSelect.indexOf(tagType) !=-1)
                {
                    objId.all(i).disabled=!flag;
                    if (className != "") objId.all(i).className=className;
                }
                if (inputNonText.indexOf(tagType) !=-1)
                {
                    objId.all(i).disabled=!flag;
                }
            }
        }
        else
        {
            for (j=0;j<objId.length;j++)
            {
                var objTagDivChild = objId[j];
                for (var i=0;i<objTagDivChild.all.length;i++)
                {
                    tagType=objTagDivChild.all(i).type;
                     if (inputText.indexOf(tagType) !=-1)
                    {
                        objTagDivChild.all(i).readOnly=!flag;
                        if (className != "") objTagDivChild.all(i).className=className;
                        continue;
                    }
                    if (inputSelect.indexOf(tagType) !=-1)
                    {
                        objTagDivChild.all(i).disabled=!flag;
                        if (className !="") objTagDivChild.all(i).className=className;
                    }
                    if (inputNonText.indexOf(tagType) !=-1)
                    {
                        objTagDivChild.all(i).disabled=!flag;
                    }
                }
            }
        }
	}

	this.validateObj=function validateObj(obj,message)
	{
		if (obj.value != "") return true;
		alert(message);
		obj.focus();
		return false;
	}

	this.radioChecked=function radioChecked(objRadio)
	{
		if (objRadio.length != null)
		{
			for (var i=0;i<objRadio.length;i++)
			{
				if (objRadio[i].checked) return i;
			}
		}
		else
		{
			if (objRadio.checked) return 1;
		}
		return -1;
	}

	this.checkBoxChecked=function checkBoxChecked(objCheckBox)
	{
		if (objCheckBox.length != null)
		{
			for (var i=0;i<objCheckBox.length;i++)
			{
				if (objCheckBox[i].checked) return true;
			}
		}
		else
		{
			if (objCheckBox.checked) return true;
		}
		return false
	}
}
