/*
  -------------------------------------------------------------------------
	                    JavaScript Form Validator 
                                Version 2.0.2
	Copyright 2003 JavaScript-coder.com. All rights reserved.
	You use this script in your Web pages, provided these opening credit
    lines are kept intact.
	The Form validation script is distributed free from JavaScript-Coder.com

	You may please add a link to JavaScript-Coder.com, 
	making it easy for others to find this script.
	Checkout the Give a link and Get a link page:
	http://www.javascript-coder.com/links/how-to-link.php

    You may not reprint or redistribute this code without permission from 
    JavaScript-Coder.com.
	
	JavaScript Coder
	It precisely codes what you imagine!
	Grab your copy here:
		http://www.javascript-coder.com/
		
	
	Enhanced by Jeff Hirschey, Docutek Solutions
	
	if you want some code to be executed upon successful validation but
	before the form is submitted, set the forms onsubmit event.
	
	create validationTip element if you want to display a generic message
	upon validation error. If it exists, it will be displayed when form does
	not validate.
    -------------------------------------------------------------------------  
*/

var errors;
var formname = '';
onsuccess = function() {};

function Validator(frmname)
{
  this.formobj=document.forms[frmname];
  formname = frmname;
	if(!this.formobj)
	{
	  alert("BUG: could not 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;
	this.genError = generateError;
	onsuccess = this.formobj.old_onsubmit;
}
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 hasError = 0;
	errors = new Array;
	var eListElem = document.getElementById('errors');
	var eList = '';
	
	if (eList == null || eList == 'undefined') {
		alert("BUG: No element exists with ID 'errors'");
		return false;
	}

	for(var itr=0;itr < this.elements.length;itr++)
	{
		if(this.elements[itr].validationset && is_displayed(this.elements[itr]))
		{
			if (!this.elements[itr].validationset.validate()) {
				hasError++;
			}
		}
	}

	if(this.addnlvalidation)
	{
	  str =" var ret = "+this.addnlvalidation+"()";
	  eval(str);
      if(!ret) hasError++;
	}
	
	if (hasError >= 1) {
		var validationWrapperEl = document.getElementById('validationWrapper');
		if (validationWrapperEl != null) {
			validationWrapperEl.style.display = "";
		}
		var validationTipEl = document.getElementById('validationTip');
		if (validationTipEl != null) {
			validationTipEl.style.display = "";
		}
		var validationHeaderEl = document.getElementById('validationHeader');
		if (validationHeaderEl != null) {
			validationHeaderEl.style.display = "";
		}
		for (var j = 0; j < errors.length; j++) {
			eList += '<li>' + errors[j] + '</li>\n';
		}
		eListElem.innerHTML = eList;
		return false;
	}
	if (onsuccess != null) onsuccess();
	return true;
}
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: Could not get the input object named: "+itemname);
		return;
	}
	var type = itemobj.type;
  	if (itemobj.length == null || type.indexOf("select") >= 0) {
		if(!itemobj.validationset) {
			itemobj.validationset = new ValidationSet(itemobj);
		}
		itemobj.validationset.add(descriptor,errstr);
  	}
	// add for arrays of elements with the same name
  	else {
		for (var k = 0; k < itemobj.length; k++) {
			var itemElem = itemobj[k];
			if (!itemElem.validationset) {
				itemElem.validationset = new ValidationSet(itemElem);
			}
			itemElem.validationset.add(descriptor,errstr);
		}
  	}
}
function ValidationDesc(inputitem,desc,error)
{
    this.desc=desc;
	this.error=error;
	this.itemobj = inputitem;
	this.validate=vdesc_validate;
}
function setSelectionRange(input, selectionStart, selectionEnd) {
    if (input.setSelectionRange) {
		input.focus();
        input.setSelectionRange(selectionStart, selectionEnd);
    } else if (input.createTextRange) {
		input.focus();
        var range = input.createTextRange();
        range.collapse(true);
        range.moveEnd('character', selectionEnd);
        range.moveStart('character', selectionStart);
        range.select();
    }
}
function vdesc_validate()
{
 if(!V2validateData(this.desc,this.itemobj,this.error))
 {
		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 generateError(objName, str, pos)
{
	var obj = this.itemobj;
	if (objName.indexOf('[]') >= 0) {
		errors[errors.length] = str.replace(/\[\]/,'');
	}
	else if (pos != null) {
		var startPos = pos-1;
		var endPos = startPos+1;
		errors[errors.length] = '<a href="#' + objName + '" style="text-decoration:none;" title="Click to select the problematic character in this field" onclick="setSelectionRange(document.' + formname + '.' + objName + ',' + startPos + ', ' + endPos + ');">' + str.replace(/\[\]/,'') + '</a>';
	}
	else {
		errors[errors.length] = '<a href="#' + objName + '" style="text-decoration:none;" title="Click to move the cursor to this problem field" onclick="document.' + formname + '.' + objName + '.focus(); document.' + formname + '.' + objName + '.select()">' + str.replace(/\[\]/,'') + '</a>';
	}
}

function V2validateData(strValidateStr,objValue,strError) 
{ 
    var  epos = strValidateStr.search("="); 
    var  command  = ""; 
    var  cmdvalue = ""; 

	//objValue.value = objValue.trim(objValue.value);
    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 = objValue.name + " : Required Field"; 
              }//if 
			  generateError(objValue.name, strError);
			  return false; 
           }//if 
           break;             
         }//case required 
        case "maxlength": 
        case "maxlen": 
          { 
             if(eval(objValue.value.length) > eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : "+cmdvalue+" characters maximum [Current length = " + objValue.value.length + " ]"; 
               }//if 
               generateError(objValue.name, strError); 
               return false; 
             }//if 
             break; 
          }//case maxlen 
        case "minlength": 
        case "minlen": 
           { 
             if(eval(objValue.value.length) > 0 && eval(objValue.value.length) < eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : " + cmdvalue + " characters minimum [Current length = " + objValue.value.length + " ]"; 
               }//if               
               generateError(objValue.name, strError); 
               return false;                 
             }//if 
             break; 
            }//case minlen 
        case "alnum": 
        case "alphanumeric": 
           { 
              var re = /[^A-Za-z0-9]/;
			  var m = re.exec(objValue.value);
			  if(m != null) 
              { 
               if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+" : Only alpha-numeric characters allowed [Error character position " + eval(m.index+1)+"]"; 
                }//if 
                generateError(objValue.name, strError, m.index+1); 
                return false; 
              }//if 
              break; 
           }//case alphanumeric 
        case "num": 
        case "numeric": 
           {  
              var re = /[^0-9]/;
			  var m = re.exec(objValue.value);
			  if(m != null)   
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+" : Only digits allowed [Error character position " + eval(m.index+1)+"]"; 
                }//if               
                generateError(objValue.name, strError, m.index+1); 
                return false; 
              }//if 
              break;               
           }//numeric
		case "float": 
           {  
			  if (isNaN(parseFloat(objValue.value)))   
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+" : Only digits allowed [Error character position " + eval(m.index+1)+"]"; 
                }//if               
                generateError(objValue.name, strError, m.index+1); 
                return false; 
              }//if 
              break;               
           }//numeric 
        case "alphabetic": 
        case "alpha": 
           {
				var re = /[^A-Za-z]/;
			    var m = re.exec(objValue.value);
			    if(m != null)  
              	{	 
                  	if(!strError || strError.length ==0) 
                	{ 
                  		strError = objValue.name+" : Only alphabetic characters allowed [Error character position " + eval(m.index+1)+"]"; 
                	}//if                             
                	generateError(objValue.name, strError, m.index+1); 
                	return false; 
                }//if 
              break; 
           }//alpha 
        case "alphaplus": 
           {
				var re = /[^A-Za-z\s ]/;
			    var m = re.exec(objValue.value);
			    if(m != null)  
              	{	 
                  	if(!strError || strError.length ==0) 
                	{ 
                  		strError = objValue.name+" : Only alphabetic characters and spaces are allowed [Error character position " + eval(m.index+1)+"]"; 
                	}//if                             
                	generateError(objValue.name, strError, m.index+1); 
                	return false; 
                }//if 
              break; 
           }//alpha 
		case "alnumplus":
			{
				var re = /[^A-Za-z0-9\-_\.\,\s\(\)\#]/;
			    var m = re.exec(objValue.value);
			    if(m != null) 
                { 
                  	if(!strError || strError.length ==0)
				  	{
                  		strError = objValue.name+" : characters allowed are a-z,0-9,-,_,.,#, parentheses, commas, and spaces [Error character position " + eval(m.index+1)+"]";
	                }//if                             
                	generateError(objValue.name, strError, m.index+1); 
                	return false; 
                }//if 			
			break;
			}
		case "phone":
			{
				//any phone format with optional extension (ext must begin with 'x', e.g. 800-888-8888 x123)
				//var re = /^(((\(\d{3}\))|(\d{3}))(-|\s)?)?(\d{3})(-|\s)?(\d{4})((\s?x)(\d{1,5}))?$/; //regex for when area code is optional
				var re = /^(((\(\d{3}\))|(\d{3}))(-|\s)?)(\d{3})(-|\s)?(\d{4})((\s?x)(\d{1,5}))?$/;
				var m = re.exec(objValue.value);
				if (objValue.value != "" && m == null)
				{
  					if(!strError || strError.length ==0) 
					{ 
						strError = objValue.name+" : Please enter a valid Phone Number. Any valid format is allowed (e.g. ###-###-####)"; 
					}//if                             
					generateError(objValue.name, strError); 
					return false; 
              	}//if 
					
			}
			break;
		case "zip":
			{
				var re = /^(\d{5})(-\d{4})?$/;
			    var m = re.exec(objValue.value);
			    if(objValue.value != "" && m == null) 
				{
  					if(!strError || strError.length ==0) 
					{ 
						strError = objValue.name+" : Please enter a valid zip code in the format XXXXX or XXXXX-XXXX"; 
					}//if                             
					generateError(objValue.name, strError); 
					return false; 
              	}//if 
					
			}
			break;
		case "cc": 
        case "creditcard": 
           {  
              var re = /[^0-9\*]/;
			  var m = re.exec(objValue.value);
			  if(m != null)   
              { 
                if(!strError || strError.length ==0) 
                { 
                  strError = objValue.name+" : Only digits allowed [Error character position " + eval(m.index+1)+"]"; 
                }//if               
                generateError(objValue.name, strError, m.index+1); 
                return false; 
              }//if 
              break;               
           }//numeric 
        case "email": 
          {
			  	var re = /^[\_]*([a-zA-Z0-9\-]+(\.|\_*)?)+@([a-zA-Z0-9\-]+(\.|\-*\.))+[a-zA-Z]{2,6}$/;
			  	var m = re.exec(objValue.value);
			  	if(m == null && objValue.value != '') 
               	{ 
                 	if(!strError || strError.length ==0) 
                 	{ 
                    	strError = objValue.name+" : Please enter a valid Email address "; 
                 	}
                 	generateError(objValue.name, strError); 
                 	return false; 
               	}
           break; 
          }//case email
		case "url": 
          {
			  	var re = /((ftp|http|https):\/\/)?(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
			  	var m = re.exec(objValue.value);
			  	if(m == null && objValue.value != '') 
               	{ 
                 	if(!strError || strError.length ==0) 
                 	{ 
                    	strError = objValue.name+" : Please enter a valid Url "; 
                 	}
                 	generateError(objValue.name, strError); 
                 	return false; 
               	}
           break; 
          }//case url 
        case "username": //allows full email address or just username portion of email
          { 
			   var re = /^([\_]*([a-z0-9]+(\.|\_*)?)+@([a-z][a-z0-9\-]+(\.|\-*\.))+[a-z]{2,6})|([a-zA-Z0-9\_\-\.]{5,64})$/;
			   var m = re.exec(objValue.value);
			   if(m == null) 
               { 
                 if(!strError || strError.length ==0) 
                 { 
                    strError = objValue.name+" : Please enter a valid username (you may use your email address or something like the username portion of an email address)"; 
                 }//if
                 generateError(objValue.name, strError); 
                 return false; 
               }//if 
           break; 
          }//case file
        case "file": //checks that valid file has beeb selected with an allowed filename extension
          {
				var filenameLen = objValue.value.lastIndexOf(".");
				var ext = objValue.value.substring(objValue.value.lastIndexOf(".")+1);
				//do case-insensitive compare
				ext = ext.toLowerCase();
				cmdvalue = cmdvalue.toLowerCase();
				var allowed = cmdvalue.split(",");
				
				if (!allowed.in_array(ext) || filenameLen < 1)
				{
                 	if(!strError || strError.length ==0) 
                 	{ 
                   	 	strError = objValue.name+" : Please select a valid file (must be one of these types : " + cmdvalue + ")"; 
                 	}//if
                 	generateError(objValue.name, strError); 
                 	return false; 
               }//if 
           break; 
          }//case file 
        case "lt": 
        case "lessthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              generateError(objValue.name, objValue.name+": Should be a number "); 
              return false; 
            }//if 
            if(eval(objValue.value) >=  eval(cmdvalue)) 
            { 
              if(!strError || strError.length ==0) 
              { 
                strError = objValue.name + " : value should be less than "+ cmdvalue; 
              }//if               
              generateError(objValue.name, strError); 
              return false;                 
             }//if             
            break; 
         }//case lessthan 
        case "gt": 
        case "greaterthan": 
         { 
            if(isNaN(objValue.value)) 
            { 
              generateError(objValue.name, objValue.name+": Should be a number "); 
              return false; 
            }//if 
             if(eval(objValue.value) <=  eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + " : value should be greater than "+ cmdvalue; 
               }//if               
               generateError(objValue.name, strError); 
               return false;                 
             }//if             
            break; 
         }//case greaterthan
        case "equal": 
         { 
			 if(objValue.value != eval(cmdvalue)) 
             { 
               if(!strError || strError.length ==0) 
               { 
                 strError = objValue.name + "s : do not match"; 
               }//if               
               generateError(objValue.name, strError); 
               return false;                 
             }//if             
            break; 
         }//case equal 
        case "regexp": 
         { 
		 	if(objValue.value.length > 0)
			{
	            if(!objValue.value.match(cmdvalue)) 
	            { 
	              if(!strError || strError.length ==0) 
	              { 
	                strError = objValue.name+": Invalid characters found "; 
	              }//if                                                               
	              generateError(objValue.name, strError); 
	              return false;                   
	            }//if 
			}
           break; 
         }//case regexp 
        case "dontselect": 
         { 
            if(objValue.selectedIndex == null) 
            { 
              alert("BUG: dontselect command for non-select Item"); 
              return false; 
            } 
            if(objValue.selectedIndex == eval(cmdvalue) || objValue.value == "") 
            { 
             if(!strError || strError.length ==0) 
              { 
              strError = objValue.name+": Please Select one option "; 
              }//if                                                               
              generateError(objValue.name, strError); 
              return false;                                   
             } 
             break; 
         }//case dontselect 
    }//switch 
    return true; 
}
/*
	Copyright 2003 JavaScript-coder.com. All rights reserved.
*/