/*****************************************************************************************************
* Easy Javascript Validation by Jarvis Liu
* Copyright 2010, All Rights reserved by Jarvis Liu
* Contact: liuqingdong123@gmail.com - wwww.globaloutsoftware.com
* In any form element add the following form attributes to validate
* required ="yes"
* validate = { "int", "float", "text", "email" }
* message = "Error Message for Element"
* Example: <input type="text" validate="int" message="Please enter valid zip code" name="zip">
*
* It is required that you add the following to any submit button
*     onClick="validate(this.form); return document.formSubmit;"
******************************************************************************************************/

	function validate(form){
		var error = "";
		var errorElement = "";
		//for each form element
		for(var i=0; i<form.length; i++){
			var element = form[i];
			var tempError = "";
			//if required
			if(element.getAttribute("required") == "yes"){
				//if form element if empty
				var value = element.value;
				if(element.getAttribute("replacedChars") != null && element.getAttribute("replacedChars") != "")
				{
					value = ReplaceCharacter(value, element.getAttribute("replacedChars"));
				}
				value = trim(value);
				var returnMes = valid(value,element.getAttribute("validate"),element);
					if(returnMes != "")
					{
					 tempError = element.getAttribute("message") + returnMes+ "\r\n";
					 if(errorElement == "")
						errorElement = element;
					}
			}
			else if(element.getAttribute("validate") != null && element.getAttribute("validate") != ""){
				//if validation is need by not required
				var value = element.value;
				if(element.getAttribute("replacedChars") != null && element.getAttribute("replacedChars") != "")
				{
					value = ReplaceCharacter(value, element.getAttribute("replacedChars"));
				}
				value = trim(value);
				if(value != ""){
					var returnMes = valid(value,element.getAttribute("validate"),element);
					if(returnMes != "")
					{
						tempError = element.getAttribute("message") + returnMes + "\r\n";
						if(errorElement == "")
							errorElement = element;
					}
				}
			}
			if(tempError == "")
			{
				if(element.getAttribute("default") != null && element.getAttribute("required") == "yes")
				{
					var selectedValue = "";
					if(element.type == 'select-one')
					{
						selectedValue = element.options[element.selectedIndex].text;
					}else if(element.type == 'radio')
					{
						var elements = document.getElementsByName(element.name);
						for( j = 0; j < elements.length; j++ )
						{
							if( elements[j].checked == true )
								selectedValue = elements[j].value;
						}
						i = i + j-1;
					}else
					{
						selectedValue = trim(element.value);
					}
					if(element.getAttribute("default") == selectedValue)
					{
						tempError = element.getAttribute("message") + ", Please choose one value!\r\n";
						if(errorElement == "")
							errorElement = element;
					}
				}
			}
			if(tempError == "")
			{
				var returnMes = check_length(element.getAttribute("min"),element.getAttribute("max"),element);
				if(returnMes != "")
				{
					if(element.getAttribute("message") != null)
					{
						tempError = element.getAttribute("message") + returnMes + "\r\n";	
						if(errorElement == "")
							errorElement = element;
					}
				}
			}
			if(tempError == "")
			{
				if(element.getAttribute("decimalPoint") != null && element.getAttribute("decimalPoint") != "")
				{
					var point = parseFloat(element.getAttribute("decimalPoint"));

					var value = element.value;
				if(element.getAttribute("replacedChars") != null && element.getAttribute("replacedChars") != "")
				{
					value = ReplaceCharacter(value, element.getAttribute("replacedChars"));
				}
				value = trim(value);
					var pos = value.indexOf(".");
					if(pos != -1 && pos != 0)
					{
						var subvalue = value.substring(pos+1, value.length);
						if(subvalue == "")
						{
						//do nothing
						}else
						{
							if(subvalue.length < 3)
							{
								if(subvalue.length == 1) subvalue = parseFloat(subvalue * 10)
								var quyu = parseFloat(subvalue)%point;
								if(quyu != 0) 
								{
									tempError = element.getAttribute("message") + ", e.g 36, 36.25, 36.75, Its decimal point value should be multiple of ." + element.getAttribute("decimalPoint") + "\r\n";
									if(errorElement == "")
										errorElement = element;							
								}
							}else
							{
								tempError = element.getAttribute("message") + ", e.g 36, 36.25, 36.75, Its decimal point value should be multiple of ." + element.getAttribute("decimalPoint") + "\r\n";
								if(errorElement == "")
									errorElement = element;	
							}
						}
					}else if(pos == 0)
					{
						tempError = element.getAttribute("message") + ", It need numberic part!\r\n";
						if(errorElement == "")
							errorElement = element;						
					}
				}
			}
			if(tempError == "")
			{
				if(element.getAttribute("CheckDependent") != null && element.getAttribute("CheckDependent") != "")
				{
					var evalFunction = element.getAttribute("CheckDependent");
					tempError = eval(evalFunction);
					if(tempError != "")
						errorElement = element;
				}
			}
			error += tempError;
		}
		if(error != ""){
			alert(error);
			errorElement.focus();
			document.formSubmit = false;
		}
		else
			document.formSubmit = true;
	}	
	
	function valid(value,type,element){
		if(value == "")
			return ", It is required!";
			
		switch(type){
			case "int":
				if(isNaN(parseInt(value)))
					return ", It must be numeric value!";
				break;
			case "float":
				if(isNaN(value))
					return ", It must be numeric value(Ex: 1.4, 1)!";
				break;
			case "email":
				var p = value.indexOf('@');
				if(p<1 || p==(value.length-1))
					return ", The email format does not right!";
				break;
			case "checked":
				if(!element.checked)
					return ", Please check one value";
				break;
			case "checkbox":
			case "radiobutton":
				var checked = true;
				var isfirst = false;
				if(element.getAttribute("optionid") != null && element.getAttribute("optionid") != "")
				{
					if(element.getAttribute("optionvalueid") != null && element.getAttribute("optionvalueid") != "")
					{
						checked = false;
						var optionid = element.getAttribute("optionid");
						var optionvalueids = element.getAttribute("optionvalueid");
						var items = optionvalueids.split(',');
						var firstItem = items[0];
						for (var num=0; num<items.length; num++)
						{
							var item=items[num];
							var id = "attrib-" + optionid + "-" + item;
							var currentObj = document.getElementById(id);
							if(firstItem == currentObj.value) isfirst = true;
							if(currentObj.checked)
							{
								checked = true;
								break;
							}
						}
					}
				}
				if(isfirst && !checked) return ", Please check one value";
				break;
			default://string
				break;
		}
		return "";
	}	

    function check_length(minchars,maxchars,element){
    	var len = parseFloat(trim(element.value));
        if((minchars != null || maxchars != null)&& len != 0)
		{
	        if(len>maxchars){
			   return ", It should be less than " + maxchars + "!";
	        }
	        if(len<minchars){
			   return ", It should be more than " + minchars + "!";
	        }
		}
		return "";
    }
	
	function trim(str, chars) {
		return ltrim(rtrim(str, chars), chars);
	}
	 
	function ltrim(str, chars) {
		chars = chars || "\\s";
		return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
	}
	 
	function rtrim(str, chars) {
		chars = chars || "\\s";
		return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
	}

	function autoRemoveSpaces(element, string)
	{
		element.value = string.split(' ').join('');
	}
	
	function checkDependent(currentId, dependId, rule, emptyMessage, lessThanMessage){
		var depend = "attrib-" + dependId + "-0";
		var dependObj = document.getElementById(depend);
		var dependValue = trim(dependObj.value);
		var error = "";
		var errorElement = "";
		
		var current = "attrib-" + currentId + "-0";
		var currentObj = document.getElementById(current);
		currentValue = trim(currentObj.value);
		if(isNaN(dependValue) || isNaN(currentValue))
		{
			//do nothing
		}
		else
		{
			if(dependValue == "")
			{
				error = emptyMessage + "\r\n";
				errorElement = dependObj;
				currentObj.value = "";
			}else
			{
				var replacedRule = rule.replace("DependValue", dependValue);
				var result = eval(replacedRule);
				lessThanMessage = lessThanMessage.replace("DependValue", result);
				if(currentValue < result)
				{
					error = lessThanMessage + "\r\n";
					errorElement = currentObj;
				}
			}
		}
		return error;
	}

function ReplaceCharacter(origChars, replaced)
{
	chars = replaced.split(",");
	for(num=0; num<chars.length; num++)
	{
		origChars = origChars.replace(chars[num],"");
	}
	return origChars;
}

function SwitchOptionRequire(currentValue, defaultValue, effectItems)
	{
		if(currentValue == defaultValue){
			var items = effectItems.split(',');
			for (var num=0; num<items.length; num++)
			{
				var item=items[num];
				var id = "attrib-" + item + "-0";
				var currentObj = document.getElementById(id);
				if(currentObj == null || currentObj == "")
				{
					var id = "attrib-" + item;
					currentObj = document.getElementById(id);
				}
				currentObj.setAttribute("required","yes"); 
			}
		}else {
			var items = effectItems.split(',');
			for (var num=0; num<items.length; num++)
			{
				var item=items[num];
				var id = "attrib-" + item + "-0";
				var currentObj = document.getElementById(id);
				if(currentObj == null || currentObj == "")
				{
					var id = "attrib-" + item;
					currentObj = document.getElementById(id);
				}
				currentObj.removeAttribute("required"); 
			}
		}
	}
