function FormValidator()
{
	this.strAlert = "";
	this.valid = true;
	this.headAlert = "The form can not be submitted because it is not properly filled.\n"
	this.Check=Check;
	this.Set=Set;
}

function Set(msg)
{
	this.strAlert += "- " + msg+"\n";
	this.valid = false;
}

function Check(val,rule,msg)
{
	var cond = true;
	aRule = rule.split(",");

	for(var i=0; i<aRule.length; i++) {
		switch(aRule[i])
		{
			case "IsEmail"			:	{	cond = IsEmail(val); break;	}
			case "IsNotEmpty"		:	{	cond = IsNotEmpty(val);	break;	}
			case "IsNumber"			:	{	cond = IsNumber(val);break;	}
			case "IsWeekdayNumber"	:	{	cond = IsWeekdayNumber(val);break;	}
			case "IsSSN"			:	{	cond = IsSSN(val); break;	}
			case "IsTime"			:	{	cond = IsTime(val); break;	}
			case "IsDate"			:	{	cond = IsDate(val); break;	}
			case "IsUSPhone"		:	{	cond = IsUSPhone(val); break;	}
			case "IsASTPhone"		:	{	cond = IsASTPhone(val); break;	}
			case "IsMobilePhone"	:	{	cond = IsMobilePhone(val); break;	}
			case "IsAreaCode"		:	{	cond = IsAreaCode(val); break;	}
			case "IsPostCode"		:	{	cond = IsPostCode(val); break;	}
			case "IsHTTP"			:	{	cond = IsHTTP(val); break;	}
			case "IsMoney"			:	{	cond = IsMoney(val); break;	}
			case "IsIP"				:	{	cond = IsIP(val); break;	}
			case "IsPercent"		:	{	cond = IsPercent(val); break;	}
			case "IsSelected"	    :	{	cond = IsSelected(val); break;	}
			case "IsValidImage"		:	{	cond = IsValidImage(val); break;	}
			default					:	{	cond = eval(aRule[i]); break;	}
		}
		if(!cond) break;
	}
	if(!cond) this.Set(msg);
}

//Validation Rules Functions
function IsValidImage(val) //Checkes whether the image that is about to be uploaded is JPG, JPEG, GIF OR PNG
{
	var image_ext;
	if(val!='')
	{
		if(val.lastIndexOf('.')==-1)
			return false
		
		image_ext=val.substring(val.lastIndexOf('.')+1,val.length).toLowerCase();
		if(image_ext!='jpg' && image_ext!='jpeg' && image_ext!='png' && image_ext!='gif')
			return false;
		else
			return true;
	}
	else
		return true;
}

function IsNotEmpty(val) 
{
	return (trim(val) != "");
}

function IsEmail(val) 
{
	return (!IsNotEmpty(val) || !(val.indexOf('@')<0 || val.indexOf('.')<0))
}
function IsUSPhone(val) 
{
		var matchArr2 = val.match(/^\d{10}$/);
		var matchArr3 = val.match(/^(\d{3})\-\d{3}-\d{4}$/);
		var status = true;
	
	if (matchArr2 == null && matchArr3 == null && IsNotEmpty(val)) 
		status = false;
		return status;
	
}

function IsSelected(val) 
{ 
	return (val != "0");
}

function IsAreaCode(val) 
{	
	var matchArr = val.match(/^0\d{1}$/);
	var status = true;
	
	if(matchArr == null && IsNotEmpty(val))
		status = false;
	
	return status;
}

function IsASTPhone(val) 
{	
	var matchArr = val.match(/^\d{8}$/);
	var status = true;
	
	if(matchArr == null && IsNotEmpty(val))
		status = false;
	
	return status;
}

function IsMobilePhone(val) 
{	
	var matchArr = val.match(/^0\d{9}$/);
	var status = true;
	
	if(matchArr == null && IsNotEmpty(val))
		status = false;
	
	return status;
}

function IsPostCode(val) 
{	
	var matchArr = val.match(/^\d{4}$/);
	var status = true;
	
	if(matchArr == null && IsNotEmpty(val))
		status = false;
	
	return status;
}

function IsNumber(val) 
{
	return (!(isNaN(val)));
}

function IsWeekdayNumber(val)
{
	return (!(isNaN(val)) && (val==1 || val==2 || val==3 || val==4 || val==5 || val==6 || val==7));
}

function IsHTTP(val)
{	
	var status = true;
	if(trim(val).length>0 && trim(val)!="http://")
	{
		var matchArr = val.match(/^http:\/\/[\w\W]+$/); 
		if(matchArr == null)
			status = false;
	}
	return status;	
}
function IsIP(val)
{	
	var status = true;
	var matchArr = val.match(/[^0-9\.]$/gi); 
	if(matchArr != null)
		status = false;
	return status;	
}

function IsMoney(val)
{
	valid = true;
	if(trim(val).length>0)
	{
		allowed = "0123456789()-,.$";
		digits = "0123456789";
		numCount=0;
		for(i=0;i<val.length;i++)
		{
			if(allowed.indexOf(val.charAt(i))<-1)
				valid=false;
			if(digits.indexOf(val.charAt(i))>-1)
				numCount++;	
		}
		if(valid && numCount==0)
			valid=false;
	}		
	return valid;
}

function IsPercent(val)
{
	valid = true;
	if(trim(val).length>0)
	{
		allowed = "0123456789()-,.%";
		digits = "0123456789";
		numCount=0;
		for(i=0;i<val.length;i++)
		{
			if(allowed.indexOf(val.charAt(i))<0)
				valid=false;
			if(digits.indexOf(val.charAt(i))>=0)
				numCount++;	
		}
		if(valid && numCount==0)
			valid=false;
	}		
	return valid;
}

function IsDate(val)
{	//SMENI za proverka na tochen datum
	var status = true;
	if(trim(val).length>0)
	{
	var matchArr = val.match(/^\d{1,2}\s\w{3}\s\d{4}$/); //local settings neutral format (dd Mon yyyy h:m)
	if(matchArr == null)
		status = false;
	}
	return status;	
}

function IsTime(val)
{
	var status = true;
	if(val.indexOf(':')<0)
		status = false;
	else
	{
		 digits = new Array();
		 digits = val.split(":");
		 if(!(digits[0]>=0 && digits[0]<=23))
		 	status = false;
		if(!(digits[1]>=0 && digits[1]<=59))		
		 	status = false;
	}	 
	return status;
}

function IsSSN(val) 
{		var status = true;
	if(trim(val).length>0)
	{
	var matchArr = val.match(/^(\d{3})-?\d{2}-?\d{4}$/);
	var numDashes = val.split('-').length - 1;

	
	if (matchArr == null || numDashes == 1) 
	{
		status = false;
	}
	else 
	if (parseInt(matchArr[1],10)==0) 
	{
		status = false;
	}
	}
	return status;
}

// ******************************************************************
// TASK: Validates the Form fields which definitions are entered in the vArray field
// PARAMETERS:
// frm - form object pointer
// vArray (external Validation array) - contains one array element per form field in the following format: fName, vRule, vMsg
function validate(frm)
{
	fv = new FormValidator();
	for(var i=0;i<vArray.length;i++)
	{
		strEval = "frm." + vArray[i][0] + ".value";
		fv.Check(eval(strEval), vArray[i][1],vArray[i][2]);  
	}
	if(!fv.valid)
		alert(fv.headAlert + fv.strAlert);
	return fv.valid;
}


// ******************************************************************
//Formatting input Functions
function trim(str)
{
     return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}


// ******************************************************************
// TASK: create local settings neutral format (dd Mon yyyy h:m)
// PARAMETERS:
// strType - create Date only="d"; create Time only="t"; create All=""
function setDate(frmElement,strType,m,d,h,n)
{ 
	nameElement = frmElement.name;
	dayElement = "d"+nameElement;
	monElement = "m"+nameElement;
	yrElement = "y"+nameElement;
	hrElement = "h"+nameElement;
	minElement = "n"+nameElement;
	frm = frmElement.form;
	frmElement.value = "";

	if (strType!="t")
	{
		dayEval = "strDay=frm."+dayElement+".options[frm."+dayElement+".selectedIndex].value;"
		monEval = "strMon=frm."+monElement+".options[frm."+monElement+".selectedIndex].value;"
		yrEval = "strYr=frm."+yrElement+".options[frm."+yrElement+".selectedIndex].value;"
		eval(dayEval);
		eval(monEval);
		eval(yrEval);
		var monthAbrv = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
		frmElement.value = strDay+" "+monthAbrv[strMon-1]+" "+strYr;
	}
	if (strType!="d")
	{
		hrEval = "strHr=frm."+hrElement+".options[frm."+hrElement+".selectedIndex].value;"
		minEval = "strMin=frm."+minElement+".options[frm."+minElement+".selectedIndex].value;"
		eval(hrEval);
		eval(minEval);
		frmElement.value = frmElement.value+" "+strHr+":"+strMin;
	}
	else frmElement.value = frmElement.value+" 0:0";
}