/* Validate.js
*  Package to validate various data :
*  hasValidChars
*  isSimpleIP
*  isAlphaLatin
*  isNotEmpty
*  isIntegerInRange
*  isNum
*  isEMailAddr
*  isZipCode
*  isDate
*  isMD5
*  isURL
*  isGuid
*  isISBN
*  isSSN
*  isDecimal
*  isplatform
*  addRules
*  Apply
/*--------------------------------------------------------------------------*/
var Class = {
	create: function() {
		return function() {
			this.initialize.apply(this, arguments);
		}
	}
}

function format_as_phonenumber( e,box )
{
	var flag;
	if((e.keyCode==46)||(e.keyCode==37)||(e.keyCode==39)) return true;
	
	if((box.value.length == 0) && (e.keyCode==8))
	{
		return;
	}
	else
	{
		str = box.value;
		str = str.replace(/\(/g,"");
		str = str.replace(/\)/g,"");
		str = str.replace(/\-/g,"");
		str = str.replace(/\s/g,"");
		str = str.match(/[0-9]/g);
		str = str.join("");
	
		if( str.length > 3 &&  str.length < 7 )
		{
			pat = /(...)(.*)/;
			box.value = str.replace( pat, "$1-$2");
			prevvalue = box.value;
			return;
		}
		else if( str.length == 7 )
		{
			pat = /(...)(....)/;
			box.value = str.replace( pat, "$1-$2");
			prevvalue = box.value;
			return;
		}
	   
		else if( str.length > 7 && str.length < 11)
		{
			pat = /(...)(...)(....)/;
			box.value = str.replace( pat, "($1) $2-$3");
			prevvalue = box.value;
			return;
		}
		else
		{
			str = str.substring(0,10);
			pat = /(...)(...)(....)/;
			box.value = str.replace( pat, "($1) $2-$3");
			prevvalue = box.value;
			return;
		}
	}
}

function format_as_date( e,box )
{
	if((e.keyCode==8)||(e.keyCode==46)||(e.keyCode==37)||(e.keyCode==39)) return true;
	str = box.value;
	box.value = "";
	str = str.match(/[0-9]/g);
	str = str.join("");
	if(str.length > 8)
	{
		str = str.substring(0,8);
	}
	//This pattern is dd/mm/yyyy
	//To change this format in yyyy/mm/dd
	//use pat = /(....)(..)(..)/;
	pat = /(..)(..)(....)/;
	box.value = str.replace( pat, "$1/$2/$3");
	return;
}

function format_as_ssnnumber( e,box )
{
	var flag;
	if((e.keyCode==46)||(e.keyCode==37)||(e.keyCode==39)) return true;
	
	if((box.value.length == 0) && (e.keyCode==8))
	{
		return;
	}
	else
	{
		str = box.value;
		str = str.replace(/\(/g,"");
		str = str.replace(/\)/g,"");
		str = str.replace(/\-/g,"");
		str = str.replace(/\s/g,"");
		str = str.match(/[0-9]/g);
		str = str.join("");
	
		if( str.length > 3 &&  str.length < 7 )
		{
			pat = /(...)(.*)/;
			box.value = str.replace( pat, "$1-$2");
			prevvalue = box.value;
			return;
		}
		else if( str.length == 7 )
		{
			pat = /(...)(....)/;
			box.value = str.replace( pat, "$1-$2");
			prevvalue = box.value;
			return;
		}
	   
		else if( str.length > 7 && str.length < 11)
		{
			pat = /(...)(...)(....)/;
			box.value = str.replace( pat, "$1-$2-$3");
			prevvalue = box.value;
			return;
		}
		else
		{
			str = str.substring(0,10);
			pat = /(...)(...)(....)/;
			box.value = str.replace( pat, "$1-$2-$3");
			prevvalue = box.value;
			return;
		}
	}
}

function getValue(s){return document.getElementById(s).value}

var Validate = Class.create();
Validate.prototype = {
	/*--------------------------------------------------------------------------*/
	initialize:function(){
		this.error_array = []
		this.rules_array = [];
		this.e = true;
	},
	/*--------------------------------------------------------------------------*/
	validateForm:function(objForm)
	{	
		var validation_type;
		var control_id;
		var validation_value;
		var message_control;
		
		var obj = new Validate;
		
		if(objForm.length)
		{
			for(count=0;count<objForm.length;count++)
			{
				validation_type=objForm.elements[count].getAttribute('validation');
				//alert(validation_type);
				if(validation_type)
				{
					control_id=objForm.elements[count].getAttribute('id');
					//alert(control_id);
					validation_value=document.getElementById(control_id).value;
					message_control=objForm.elements[count].getAttribute('errorcontrol');
				
					if (validation_type=='alph_m')
						obj.isAlphaMandatory(validation_value,message_control);
					else if (validation_type=='alph_o')
						obj.isAlphaOptional(validation_value,message_control);
					else if (validation_type=='num_m')
						obj.isNumMandatory(validation_value,message_control);
					else if(validation_type=='num_o')
						obj.isNumOptional(validation_value,message_control);

					//For date we have to decide the date format
					//Formats available are
					/*
						1. dd/mm/yyyy (26/06/2007)
						2. dd/mm/yy (26/06/07)
						3. yyyy-mm-dd (2007-06-26)
						4. yy-mm-dd (07-06-26)
						5. MMM dd, yyyy (June 26, 2007)
					*/
					else if (validation_type=='date_m')
						obj.isDateMandatory(validation_value,'dd/mm/yyyy',message_control);
					else if(validation_type=='date_o')
						obj.isDateOptional(validation_value,'dd/mm/yyyy',message_control);
					else if (validation_type=='email_m')
						obj.isEMailMandatory(validation_value,message_control);
					else if (validation_type=='email_o')
						obj.isEMailOptional(validation_value,message_control);
					else if (validation_type=='url_m')
						obj.isURLMandatory(validation_value,message_control);
					else if (validation_type=='url_o')
						obj.isURLOptional(validation_value,message_control);
					else if (validation_type=='ip_m')
						obj.isIPMandatory(validation_value,message_control);
					else if (validation_type=='ip_o')
						obj.isIPptional(validation_value,message_control);
					else if (validation_type=='alphnum_m')
						obj.isAlphaNumericMandatory(validation_value,message_control);
					else if (validation_type=='alphnum_o')
						obj.isAlphaNumericOptional(validation_value,message_control);

					//For Zip we have to decide Zip format
					/*Available zip formats are
						1. US 12345 or 12345-2345
						2. IND 123456
					*/
					else if (validation_type=='zip_m')
						obj.isZipCodeMandatory(validation_value,'IND',message_control);
					else if (validation_type=='zip_o')
						obj.isZipCodeOptional(validation_value,'IND',message_control);					
					
					//For Phone we have to decide Phone format
					/*Availabe Phone formats are
						1. US e.g (NNN)NNN-NNNN
					*/
					else if (validation_type=='phone_m')
						obj.isPhoneMandatory(validation_value,'US',message_control);
					else if (validation_type=='phone_o')
						obj.isPhoneOptional(validation_value,'US',message_control);
					else if (validation_type=='urt_m')
						obj.isUnRestrictedMandatory(validation_value,message_control);
					else if (validation_type=='urt_o')
						obj.isUnRestrictedOptional(validation_value,message_control);
					else if (validation_type=='dec_m')
						obj.isDecimalMandatory(validation_value,message_control);
					else if (validation_type=='dec_o')
						obj.isDecimalOptional(validation_value,message_control);
					else if (validation_type=='ssn_m')
						obj.isSSNMandatory(validation_value,message_control);
					else if (validation_type=='ssn_o')
						obj.isSSNOptional(validation_value,message_control);
				}
			}
		}
	},
	/*--------------------------------------------------------------------------*/

	hasValidChars:function(s, characters, caseSensitive){
		function escapeSpecials(s){
			return s.replace(new RegExp("([\\\\-])", "g"), "\\$1");
		}
		return new RegExp("^[" + escapeSpecials(characters) + "]+$",(!caseSensitive ? "i" : "")).test(s);
	},
	/*--------------------------------------------------------------------------*/
	isSimpleIP:function(ip){
		ipRegExp = /^(([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+))$/
		return ipRegExp.test(ip);
	},
	
	isIPMandatory:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(string))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		ipRegExp = /^(([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+))$/

		if(!ipRegExp.test(string))
		{
			element.innerHTML="Not a valid IP address";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isIPOptional:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(string))
		{
			element.innerHTML="";
			return true;
		}
		ipRegExp = /^(([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+)\.([0-2]*[0-9]+[0-9]+))$/

		if(!ipRegExp.test(string))
		{
			element.innerHTML="Not a valid IP address";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	isAlphaLatin:function(string){
		alphaRegExp = /^[0-9a-z]+$/i
		return alphaRegExp.test(string);
	},
	
	isUnRestrictedMandatory:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		//alert(string);
		if(obj.isEmpty(string))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;	
		}
	},
	
	isUnRestrictedOptional:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(string))
		{
			element.innerHTML="";
			return true;
		}
		else
		{
			element.innerHTML="";
			return true;	
		}
	},
	
	isAlphaNumericMandatory:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		alphaRegExp = /^[ 0-9a-z]+$/i
		if(obj.isEmpty(string))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		if(!alphaRegExp.test(string))
		{
			element.innerHTML="Not a valid emtry";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isAlphaNumericOptional:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		alphaRegExp = /^[ 0-9a-z]+$/i
		if(obj.isEmpty(string))
		{
			element.innerHTML="";
			return true;
		}
		if(!alphaRegExp.test(string))
		{
			element.innerHTML="Not a valid emtry";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	
	isAlpha:function(string){
		alphaRegExp = /^[a-z]+$/i
		return alphaRegExp.test(string);
	},
	
	isAlphaMandatory:function(string,outputelement)
	{ 
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isNotEmpty(string))
		{
			alphaRegExp = /^[ a-z]+$/i
			if(!alphaRegExp.test(string))
			{
				element.innerHTML="Only Alphabets are allowed";
				return false;
			}
			else
			{
				element.innerHTML="";	
				return true;
			}
		}
		else
		{
			element.innerHTML="Mandatory field";
			return false;
		}
	},
	
	isAlphaOptional:function(string,outputelement)
	{ 
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		alphaRegExp = /^[ a-z]+$/i
		if(!obj.isEmpty(string))
		{
			if(!alphaRegExp.test(string))
			{
				element.innerHTML="Only Alphabets are allowed";
				return false;
			}
			else
			{
				element.innerHTML="";	
				return true;
			}
		}
		else
		{
			element.innerHTML="";	
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	isNotEmpty:function (string){
		return /\S/.test(string);
	},
	
	
	/*--------------------------------------------------------------------------*/
	isEmpty:function(s){
		return !/\S/.test(s);
	},
	/*--------------------------------------------------------------------------*/
	isIntegerInRange:function(n,Nmin,Nmax){
		var num = Number(n);
		if(isNaN(num)){
			return false;
		}
		if(num != Math.round(num)){
			return false;
		}
		return (num >= Nmin && num <= Nmax);
	},
	/*--------------------------------------------------------------------------*/
	isNum:function(number){
		numRegExp = /^[0-9]+$/
		return numRegExp.test(number);
	},
	
	isNumMandatory:function(string,outputelement)
	{ 
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isNotEmpty(string))
		{
			numRegExp = /^[ 0-9]+$/
			if(!numRegExp.test(string))
			{
				element.innerHTML="Only Numerics are allowed";
				return false;
			}
			else
			{
				element.innerHTML="";	
				return true;
			}
		}
		else
		{
			element.innerHTML="Mandatory field";
			return false;
		}
	},
	
	isNumOptional:function(string,outputelement)
	{ 
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(!obj.isEmpty(string))
		{
			numRegExp = /^[ 0-9]+$/
			if(!numRegExp.test(string))
			{
				element.innerHTML="Only Numerics are allowed";
				return false;
			}
			else
			{
				element.innerHTML="";	
				return true;
			}
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	
	/*--------------------------------------------------------------------------*/
	isEMailAddr:function(string){
		emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
		return emailRegExp.test(string);
	},
	
	isEMailMandatory:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
		if(obj.isEmpty(string))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		if(!emailRegExp.test(string))
		{
			element.innerHTML="Not a valid E-Mail Id";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isEMailOptional:function(string,outputelement)
	{ 
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		emailRegExp = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/
		if(obj.isEmpty(string))
		{
			element.innerHTML="";
			return true;
		}
		if(!emailRegExp.test(string))
		{
			element.innerHTML="Not a valid E-Mail Id";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	isZipCode:function(zipcode,country){
		if(!zipcode) return false;
		if(!country) format = 'US';
		switch(country){
			case'US': zpcRegExp = /^\d{5}$|^\d{5}-\d{4}$/; break;
			case'MA': zpcRegExp = /^\d{6}$/; break;
			case'CA': zpcRegExp = /^[A-Z]\d[A-Z] \d[A-Z]\d$/; break;
			case'DU': zpcRegExp = /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/; break;
			case'FR': zpcRegExp = /^\d{5}$/; break;
			case'Monaco':zpcRegExp = /^(MC-)\d{5}$/; break;
		}
		return zpcRegExp.test(zipcode);
	},
	
	isZipCodeMandatory:function(zipcode,format,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		
		if(obj.isEmpty(zipcode))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		//If zip format is not defined then US will be set default
		if(!format) 
		{
			format = 'US';
		}
		
		switch(format)
		{
			case'US': zpcRegExp = /^\d{5}$|^\d{5}-\d{4}$/; break;
			case'IND': zpcRegExp = /^\d{6}$/; break;
		}
		
		if(!zpcRegExp.test(zipcode))
		{
			element.innerHTML="Not a valid ZIP";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isZipCodeOptional:function(zipcode,format,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		
		if(obj.isEmpty(zipcode))
		{
			element.innerHTML="";
			return true;
		}
		//If zip format is not defined then US will be set default
		if(!format) 
		{
			format = 'US';
		}
		
		switch(format)
		{
			case'US': zpcRegExp = /^\d{5}$|^\d{5}-\d{4}$/; break;
			case'IND': zpcRegExp = /^\d{6}$/; break;
		}
		
		if(!zpcRegExp.test(zipcode))
		{
			element.innerHTML="Not a valid ZIP";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	isDate:function(date,format){
		if(!date) return false;
		if(!format) format = 'FR';
		
		switch(format){
			case'dd/mm/yyyy': RegExpformat = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([2][0]|[1][9])\d{2})$/; break;
			case'yyyy-mm-dd': RegExpformat = /^([2][0]|[1][9])\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'dd/mm/yy': RegExpformat = /^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/\d{2}$/; break;
			case'yy-mm-dd': RegExpformat = /^\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'MMM dd, yyyy':RegExpformat = /^(J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)\s([0-2]\d|[3][0-1])\,\s([2][0]|[1][9])\d{2}$/; break;
		}
		
		return RegExpformat.test(date);
	},
	
	isDateMandatory:function(date,format,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(date))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		//If format is not set then dd/mm/yyyy format will be default format.
		if(!format) 
			format = 'dd/mm/yyyy';

		switch(format){
			case'dd/mm/yyyy': RegExpformat = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([2][0]|[1][9])\d{2})$/; break;
			case'yyyy-mm-dd': RegExpformat = /^([2][0]|[1][9])\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'dd/mm/yy': RegExpformat = /^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/\d{2}$/; break;
			case'yy-mm-dd': RegExpformat = /^\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'MMM dd, yyyy':RegExpformat = /^(J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)\s([0-2]\d|[3][0-1])\,\s([2][0]|[1][9])\d{2}$/; break;
		}
		
		if(!RegExpformat.test(date))
		{
			element.innerHTML="Not a valid date";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isDateOptional:function(date,format,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(date))
		{
			element.innerHTML="";
			return true;
		}
		//If format is not set then dd/mm/yyyy format will be default format.
		if(!format) 
			format = 'dd/mm/yyyy';

		switch(format){
			case'dd/mm/yyyy': RegExpformat = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([2][0]|[1][9])\d{2})$/; break;
			case'yyyy-mm-dd': RegExpformat = /^([2][0]|[1][9])\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'dd/mm/yy': RegExpformat = /^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/\d{2}$/; break;
			case'yy-mm-dd': RegExpformat = /^\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
			case'MMM dd, yyyy':RegExpformat = /^(J(anuary|u(ne|ly))|February|Ma(rch|y)|A(pril|ugust)|(((Sept|Nov|Dec)em)|Octo)ber)\s([0-2]\d|[3][0-1])\,\s([2][0]|[1][9])\d{2}$/; break;
		}
		
		if(!RegExpformat.test(date))
		{
			element.innerHTML="Not a valid date";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	isMD5:function(string){
		if(!string) return false;
		md5RegExp = /^[a-f0-9]{32}$/;
		return md5RegExp.test(string);
	},
	/*--------------------------------------------------------------------------*/
	isURL:function(string){
		if(!string) return false;
		string = string.toLowerCase();
		urlRegExp = /^(((ht|f)tp(s?))\:\/\/)|((www)\.)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/
		return urlRegExp.test(string);
	},
	
	isURLMandatory:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(string))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		string = string.toLowerCase();
		urlRegExp = /^(((ht|f)tp(s?))\:\/\/)|((www)\.)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/
		if(!urlRegExp.test(string))
		{
			element.innerHTML="Not a valid URL";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isURLOptional:function(string,outputelement)
	{
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(string))
		{
			element.innerHTML="";
			return true;
		}
		string = string.toLowerCase();
		urlRegExp = /^(((ht|f)tp(s?))\:\/\/)|((www)\.)([0-9a-zA-Z\-]+\.)+[a-zA-Z]{2,6}(\:[0-9]+)?(\/\S*)?$/
		if(!urlRegExp.test(string))
		{
			element.innerHTML="Not a valid URL";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	
	/*--------------------------------------------------------------------------*/
	isGuid:function(guid){//guid format : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx or xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
		if(!guid) return false;
		GuidRegExp = /^[{|\(]?[0-9a-fA-F]{8}[-]?([0-9a-fA-F]{4}[-]?){3}[0-9a-fA-F]{12}[\)|}]?$/
		return GuidRegExp.test(guid);
	},
	/*--------------------------------------------------------------------------*/
	isISBN:function(number){
		if(!number) return false;
		ISBNRegExp = /ISBN\x20(?=.{13}$)\d{1,5}([- ])\d{1,7}\1\d{1,6}\1(\d|X)$/
		return ISBNRegExp.test(number);
	},
	/*--------------------------------------------------------------------------*/
	isSSN:function(number){//Social Security Number format : NNN-NN-NNNN
		if(!number) return false;
		ssnRegExp = /^\d{3}-\d{2}-\d{4}$/
		return ssnRegExp.test(number);
	},
	
	isSSNMandatory:function(SSNnumber,outputelement)
	{
		//Social Security Number format : NNN-NN-NNNN
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(SSNnumber))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		ssnRegExp = /^\d{3}-\d{2}-\d{4}$/
		if(!ssnRegExp.test(SSNnumber))
		{
			element.innerHTML="Not a valid SSN Number";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isSSNOptional:function(SSNnumber,outputelement)
	{
		//Social Security Number format : NNN-NN-NNNN
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(SSNnumber))
		{
			element.innerHTML="";
			return true;
		}
		ssnRegExp = /^\d{3}-\d{2}-\d{4}$/
		if(!ssnRegExp.test(SSNnumber))
		{
			element.innerHTML="Not a valid SSN Number";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	
	isPhoneMandatory:function(phonenumber,format,outputelement)
	{
		//Phone Number format : (NNN)NNN-NNNN
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(phonenumber))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		if(format=='US')
			//phoneRegExp = /^\(\d{3}\)\x20\d{3}-\d{4}$/
			phoneRegExp = /\(\d{3}\)\x20\d{3}-\d{4}$/
			
		if(!phoneRegExp.test(phonenumber))
		{
			element.innerHTML="Not a valid Phone Number";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isPhoneOptional:function(phonenumber,format,outputelement)
	{
		//Phone Number format : (NNN)NNN-NNNN
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(phonenumber))
		{
			element.innerHTML="";
			return true;
		}
		
		if(format=='US')
			//phoneRegExp = /^\(\d{3}\)\d{3}-\d{4}$/
			phoneRegExp = /\(\d{3}\)\x20\d{3}-\d{4}$/
			
		if(!phoneRegExp.test(phonenumber))
		{
			element.innerHTML="Not a valid Phone Number";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	
	isDecimal:function(number){// positive or negative decimal
		if(!number) return false;
		decimalRegExp = /^-?(0|[1-9]{1}\d{0,})(\.(\d{1}\d{0,}))?$/
		return decimalRegExp.test(number);
	},
	
	isDecimalMandatory:function(number,outputelement)
	{
		// positive or negative decimal
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(number))
		{
			element.innerHTML="Mandatory field";
			return false;
		}
		decimalRegExp = /^-?(0|[1-9]{1}\d{0,})(\.(\d{1}\d{0,}))?$/
		if(!decimalRegExp.test(number))
		{
			element.innerHTML="Not a valid entry";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	isDecimalOptional:function(number,outputelement)
	{
		// positive or negative decimal
		var obj = new Validate;
		var element = document.getElementById(outputelement);
		if(obj.isEmpty(number))
		{
			element.innerHTML="";
			return true;
		}
		decimalRegExp = /^-?(0|[1-9]{1}\d{0,})(\.(\d{1}\d{0,}))?$/
		if(!decimalRegExp.test(number))
		{
			element.innerHTML="Not a valid entry";
			return false;
		}
		else
		{
			element.innerHTML="";
			return true;
		}
	},
	
	/*--------------------------------------------------------------------------*/
	isplatform:function(platform){
		//win, mac, nix
		if(!platform) return false;
		var os;
		winRegExp = /\win/i
		if(winRegExp.test(window.navigator.platform)) os = 'win';
		
		macRegExp = /\mac/i
		if(macRegExp.test(window.navigator.platform)) os = 'mac';
		
		nixRegExp = /\unix|\linux|\sun/i
		if(nixRegExp.test(window.navigator.platform)) os = 'nix';
		
		if(platform == os) return true;
		else return false;
	},
	/*--------------------------------------------------------------------------*/
	getValue:function(id){
		document.getElementById(id).value;
	},
	/*--------------------------------------------------------------------------*/
	addRules:function(rules){
		this.rules_array.push(rules);
	},
	/*--------------------------------------------------------------------------*/
	check:function(){
		this.error_array = [];
		for(var i=0;i<this.rules_array.length;i++){
			switch(this.rules_array[i].option){
				/*--------------------------------------------------------------------------*/
				case'ValidChars':
					if(!this.hasValidChars(getValue(this.rules_array[i].id),this.rules_array[i].chars,false)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'AlphaLatin':
					if (this.isAlphaLatin(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'required':
					if (this.isEmpty(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'integerRange':
					if (!this.isIntegerInRange(getValue(this.rules_array[i].id),this.rules_array[i].Min,this.rules_array[i].Max)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'Number':
					if (!this.isNum(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'email':
					if (!this.isEMailAddr(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'zipCode':
					if (!this.isZipCode(getValue(this.rules_array[i].id),this.rules_array[i].country)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'date':
					if(!this.isDate(getValue(this.rules_array[i].id),this.rules_array[i].format)){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'url':
					if(!this.isURL(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
				case'Decimal':
					if(!this.isDecimal(getValue(this.rules_array[i].id))){
						this.error_array.push(this.rules_array[i].error);
						this.e = false;
					}
				break;
				/*--------------------------------------------------------------------------*/
			}
		}
	},
	/*--------------------------------------------------------------------------*/
	Apply:function(el){
		this.check();
		if(this.e){
			return true;
		}else{
			var endMsg = this.error_array;
			if(!el){
				alert(this.error_array.toString().replace(/\,/gi,"\n"));
			}else{
				document.getElementById(el).innerHTML = this.error_array.toString().replace(/\,/gi,"<br/>");
			}
			return false;
		}
	}
	/*--------------------------------------------------------------------------*/
}

