


// Configuration
var errorColor = "#F00";
var goodColor = "#6C3";
var topErrorHTML = "<img src='css/candlepower/error.gif' alt='!' /> There are errors in the form.";
var preErrorHTML = "<img src='css/candlepower/error.gif' alt='!' />&nbsp;";
var requiredHTML = "<em>*</em>";
var postErrorHTML = "<br />";
var errorPrefix = "error-";
var labelPrefix = "label-";

// Messages
var requiredError = "This is a required field.";
var maxError = "Must be less than #max# characters.";
var minError = "Must be at least #min# characters.";
var alphaNumError = "Only alpha-numeric characters allowed."; 
var numberError = "Only numbers allowed."; 
var alphaError = "Only alphabetic characters allowed."; 
var hyphenError = "Characters allowed are A-Z,a-z,0-9,- and _"; 
var emailError = "Enter a valid Email address."; 
var urlError = "Enter a valid website (including the http://)."; 
var lessError = "Must be less than #num#."; 
var greaterError = "Must be greater than #num#."; 
var equalsError = "Must match the value of #name#."; 
var zipError = "Format 12345 or 12345-1234 only."; 
var regExError = "Invalid characters found."; 
var selectError = "Please select one option."; 
var filenameError = "#file# has problems."; 
var submitOKValue = "Please wait"; 
var submitErrorValue = "I've fixed the problems."; 




function Validator(frmname)
{
	formname = frmname;
	this.formobj=document.forms[frmname];
	if(!this.formobj)
	{
		alert("BUG: couldnot get Form object "+frmname);
		return;
	}
	if(this.formobj.onsubmit)
	{
		this.formobj.old_onsubmit = this.formobj.onsubmit;
		this.formobj.onsubmit=null;
	}
	else
	{
		this.formobj.old_onsubmit = null;
	}
	this.formobj.onsubmit=form_submit_handler;
	this.addValidation = add_validation;
	this.setAddnlValidationFunction=set_addnl_vfunction;
	this.clearAllValidations = clear_all_validations;
}

function set_addnl_vfunction(functionname)
{
	this.formobj.addnlvalidation = functionname;
}

function clear_all_validations()
{
	for(var itr=0;itr < this.formobj.elements.length;itr++)
	{
		this.formobj.elements[itr].validationset = null;
	}
}

function form_submit_handler()
{
	var Errors=0;
	for(var itr=0;itr < this.elements.length;itr++)
	{
		if(this.elements[itr].validationset && !this.elements[itr].validationset.validate()) 
		{
			// There has been an error
			Errors++;
		}
	}
	if(this.addnlvalidation)
	{
		str =" var ret = "+this.addnlvalidation+"()";
		eval(str);
		if(!ret) return ret;
	}

	if(Errors==0)
	{
		document.getElementById(errorPrefix+''+formname).innerHTML = '';
		document.getElementById(errorPrefix+''+formname).style.display = 'none';
		document.getElementById('submit').value = submitOKValue;
		submitted = true;
		return true;
	}
	document.getElementById(errorPrefix+''+formname).innerHTML = topErrorHTML;
	document.getElementById(errorPrefix+''+formname).style.display = 'block';
	document.getElementById('submit').value = submitErrorValue;
	return false;
}

function add_validation(itemname,descriptor,errstr)
{
	if(!this.formobj)
	{
		alert("BUG: the form object is not set properly");
		return;
	}
	var itemobj = this.formobj[itemname];
	if(!itemobj)
	{
		alert("BUG: Couldnot get the input object named: "+itemname);
		return;
	}
	if(!itemobj.validationset)
	{
		itemobj.validationset = new ValidationSet(itemobj);
	}
	if(descriptor=='req'||descriptor.search('minlen')!=-1||descriptor=='required'||descriptor=='checked'||descriptor=='selected')
	{
		document.getElementById(labelPrefix+itemname).innerHTML += requiredHTML;
		document.getElementById(labelPrefix+itemname).className="required";
	}
	itemobj.validationset.add(descriptor,errstr);
}

function ValidationDesc(inputitem,desc,error)
{
	this.desc=desc;
	this.error=error;
	this.itemobj = inputitem;
	this.validate=vdesc_validate;
}

function vdesc_validate()
{
	if(!V2validateData(this.desc,this.itemobj,this.error))
	{
		this.itemobj.focus();
		return false;
	}
	return true;
}

function ValidationSet(inputitem)
{
	this.vSet=new Array();
	this.add= add_validationdesc;
	this.validate= vset_validate;
	this.itemobj = inputitem;
}

function add_validationdesc(desc,error)
{
	this.vSet[this.vSet.length]= 
	new ValidationDesc(this.itemobj,desc,error);
}

function vset_validate()
{
	for(var itr=0;itr<this.vSet.length;itr++)
	{
		if(!this.vSet[itr].validate())
		{
		return false;
		}
	}
	return true;
}

function validateEmailv2(email)
{
	// a very simple email validation checking. 
	// you can add more complex email checking if it helps 
	if(email.length <= 0)
	{
		return true;
	}
	var splitted = email.match("^(.+)@(.+)$");
	if(splitted == null) return false;
	if(splitted[1] != null )
	{
		var regexp_user=/^\"?[\w-_\.]*\"?$/;
		if(splitted[1].match(regexp_user) == null) return false;
	}
	if(splitted[2] != null)
	{
		var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
		if(splitted[2].match(regexp_domain) == null) 
		{
			var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
			if(splitted[2].match(regexp_ip) == null) return false;
		}// if
		return true;
	}
	return false;
}

function V2validateData(strValidateStr,objValue,strError) 
{ 
	var epos = strValidateStr.search("="); 
	var  command  = ""; 
	var  cmdvalue = ""; 
	if(epos >= 0) 
	{ 
		command  = strValidateStr.substring(0,epos); 
		cmdvalue = strValidateStr.substr(epos+1); 
	} 
	else 
	{ 
		command = strValidateStr; 
	} 

	switch(command) 
	{ 
		case "req": 
		case "required": 
		{ 
			if(eval(objValue.value.length) == 0) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = requiredError; 
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break;             
		}
		// -------------------------------------- Required 


		case "checked": 
		{ 
			if(!objValue.checked) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = requiredError; 
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break;             
		}
		// -------------------------------------- Checked (checkbox)



		case "maxlength": 
		case "maxlen": 
		{ 
			if(eval(objValue.value.length) >  eval(cmdvalue)) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = maxError.replace(/#max#/,cmdvalue);
				}
				doError(objValue,strError);
				return false;
			}//if 
			undoError(objValue);
			break; 
		}
		// -------------------------------------- Maximum 

		case "minlength": 
		case "minlen": 
		{ 
			if(eval(objValue.value.length) <  eval(cmdvalue)) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = minError.replace(/#min#/,cmdvalue);
				}
				doError(objValue,strError);
				return false;
			} 
			undoError(objValue);
			break; 
		}
		// -------------------------------------- Minimum 

		case "alnum": 
		case "alphanumeric": 
		{ 
			var charpos = objValue.value.search("[^A-Za-z0-9]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = alphaNumError;
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break; 
		}
		// -------------------------------------- Alphanumeric

		case "num": 
		case "numeric": 
		{ 
			var charpos = objValue.value.search("[^0-9]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = numberError; 
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break; 
		}
		// -------------------------------------- Numeric

		case "alphabetic": 
		case "alpha": 
		{ 
			var charpos = objValue.value.search("[^A-Za-z]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = alphaError; 
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break; 
		}
		// -------------------------------------- Alpha

		case "hyphen":
		{
			var charpos = objValue.value.search("[^A-Za-z0-9\-_]"); 
			if(objValue.value.length > 0 &&  charpos >= 0) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = hyphenError; 
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Hyphen

		case "email": 
		{ 
			if(!validateEmailv2(objValue.value)) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = emailError;
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Email

		case "lt": 
		case "lessthan": 
		{ 
			if(isNaN(objValue.value)) 
			{ 
				doError(objValue,"Should be a number");
				return false;
			}
			if(eval(objValue.value) >=  eval(cmdvalue)) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = lessError.replace(/#num#/,cmdvalue);
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Less than


		case "gt": 
		case "greaterthan": 
		{ 
			if(isNaN(objValue.value)) 
			{ 
				doError(objValue,"Should be a number");
				return false;
			}
			if(eval(objValue.value) <=  eval(cmdvalue)) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = greaterError.replace(/#num#/,cmdvalue);
				}
				doError(objValue,strError);
				return false;
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Greater than


		case "zip": 
		case "zipcode": 
		{ 
			if(objValue.value.length > 0)
			{
				if(!objValue.value.match('^([0-9]{5}(-[0-9]{4}){0,1})$')) 
				{ 
					if(!strError || strError.length ==0) 
					{ 
						strError = zipError; 
					}
				doError(objValue,strError);
				return false;
				}
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Zip Code


		case "regexp": 
		{ 
			if(objValue.value.length > 0)
			{
				if(!objValue.value.match(cmdvalue)) 
				{ 
					if(!strError || strError.length ==0) 
					{ 
						strError = regExError; 
					}
				doError(objValue,strError);
				return false;
				}
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Reg Exp.


		case "url": 
		{ 
			if(objValue.value.length > 0)
			{
				if(!objValue.value.match("^(http://|https://|ftp://)")) 
				{ 
					if(!strError || strError.length ==0) 
					{ 
						strError = urlError; 
					}
				doError(objValue,strError);
				return false;
				}
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Reg Exp.


		case "dontselect": 
		{ 
			if(objValue.selectedIndex == null) 
			{ 
				alert("BUG: dontselect command for non-select Item"); 
				return false; 
			} 
			if(objValue.selectedIndex == eval(cmdvalue)) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = "Do not select '"+objValue[eval(cmdvalue)].value+"'"; 
				}
				doError(objValue,strError);
				return false;
			} 
			undoError(objValue);
			break;
		}
		// -------------------------------------- Do Not Select

		case "equals": 
		{ 
			if(objValue.value!=document.getElementById(cmdvalue).value) 
			{ 
				if(!strError || strError.length ==0) 
				{ 
					strError = equalsError.replace(/#name#/,cmdvalue.toUpperCase());
				}
				doError(objValue,strError);
				return false;
			} 
			undoError(objValue);
			break;
		}
		// -------------------------------------- Required (Select)

		case "file": 
		case "filename": 
		{ 
			var err = 0;
			var addmess = '';
			if(objValue.value.length > 0)
			{
				if(objValue.value.indexOf('\\')>-1) var val = objValue.value.substring( objValue.value.lastIndexOf('\\')+1 ); 
				else var val = objValue.value.substring( objValue.value.lastIndexOf('/')+1 ); 

				var suffix = val.substring( val.lastIndexOf('.')+1).toLowerCase();
				if( suffix.length > 3 ) 
				{ 
					err++;
					addmess += " There should only be 3 letters after the dot.";				
				}
				if( cmdvalue.length>0 && cmdvalue.indexOf(suffix)==-1  ) 
				{ 
					err++;
					addmess += (" File appears to be a ."+suffix+". Should be one of the following: ."+cmdvalue.replace(",",", ."));				
				}
				if(err>0)
				{
					if(!strError || strError.length ==0) 
					{ 
						strError = filenameError.replace(/#file#/,val) + addmess;
					}
					doError(objValue,strError);
					return false;
				}
			}
			undoError(objValue);
			break;
		}
		// -------------------------------------- Filename




	}// end of switch 
	return true; 
}

function doError(objValue,strError)
{
	if(document.getElementById(labelPrefix+''+objValue.name)) {
		document.getElementById(labelPrefix+''+objValue.name).style.color = errorColor;
		document.getElementById(errorPrefix+''+objValue.name).innerHTML = preErrorHTML + strError + postErrorHTML;
		return;
	}
	alert( objValue.name + " : " + strError );
}

function undoError(objValue)
{
	if(document.getElementById(labelPrefix+''+objValue.name)) {
		document.getElementById(labelPrefix+''+objValue.name).style.color = goodColor;
		document.getElementById(errorPrefix+''+objValue.name).innerHTML = '';
		return;
	}
}


function makeDate(obj)
{
	var seperator = "-";
	document.getElementById(obj).value = document.getElementById(obj+'-year').value+seperator+document.getElementById(obj+'-month').value+seperator+document.getElementById(obj+'-day').value;
}

function makeTime(obj)
{
	var seperator = "-";
	var h = document.getElementById(obj+'-hour').value
	var m = document.getElementById(obj+'-minute').value
	var a = document.getElementById(obj+'-ampm').value
	if(a=="pm") h=parseFloat(h)+12;
	document.getElementById(obj).value = h+seperator+m+seperator+a;
}
