function Validator(){

	this.errLog = '';
	this.firstError = '';

	this.showErrors = function(){
		if (this.errLog != ''){alert('The following fields require valid entries before the information can be sent.\n\n' + this.errLog);}
	}

	this.noErrors = function(){		
		if (this.errLog == ''){return true;} else { return false;}
	}

	this.selectFirstError = function(){
		if (this.firstError!=''){ 			
			Field.activate(this.firstError);
		}
	}

	this.Validate = function(ElementID,ElementName,ElementType, Required)
	{
		if (Required && $(ElementID).value.length == 0)
		{
				Element.addClassName(ElementID,'requiredfield-error');
				this.errLog+=ElementName  + '\n';
				if(this.firstError==''){this.firstError=ElementID}
				return;
		// If the value is Zero Length and not required there is nothing to validate
		} else if (!Required && $(ElementID).value.length == 0) {			
				return;	
		}
		var tmpStr = Trim($(ElementID).value);
		$(ElementID).value = tmpStr; // remove leading and trailing spaces
		var errFound=false;
		switch (ElementType) 
			{
			case 'text': 
				errFound=isBlank(tmpStr); 
				break;	
			case 'number': 
				errFound=!isNumeric(removeAllSpaces(tmpStr)); 
				break;
			case 'phone': 
				errFound=!isNumeric(cleanPhone(tmpStr)); 
				break;
			case 'email': 
				errFound=!isEmail(tmpStr); 
				break;
			case 'date': 
				errFound=!isDate(tmpStr); 
				break;
			case 'url': 
				errFound=!isURL(tmpStr); 
				break;
			case 'select':
				errFound=!isSelected($(ElementID));
				break;
			}
			if (errFound){
				Element.addClassName(ElementID,'requiredfield-error');
				this.errLog+=ElementName+ '\n';
				if(this.firstError=='')
					{this.firstError=ElementID;}
				}
			else
				{
				Element.removeClassName(ElementID,'requiredfield-error');
				}
	}	

}

function isNumeric(argvalue) {
	return(parseFloat(argvalue,10)==(argvalue*1));
}

function isBlank(val){
	for(var i=0;i<val.length;i++){if((val.charAt(i)!=' ')&&(val.charAt(i)!='\t')&&(val.charAt(i)!='\n')&&(val.charAt(i)!='\r')){return false;}}return true;}

function IsEmpty(str) {
   if ((str.length==0) ||
   (str==null)) {
      return true;
   }
   else { return false; }
}	

function isDate(str) {
    return !isNaN(Date.parse(str));
} 

function isEmail(argvalue) {
  if (argvalue.indexOf(' ') != -1)
    return false;
  else if (argvalue.indexOf('@') == -1)
    return false;
  else if (argvalue.indexOf('@') == 0)
    return false;
  else if (argvalue.indexOf('@') == (argvalue.length-1))
    return false;

  // arrayString = argvalue.split('@'); (works only in netscape3 and above.)
  var retSize = customSplit(argvalue, '@', 'arrayString');

  if (arrayString[1].indexOf('.') == -1)
    return false;
  else if (arrayString[1].indexOf('.') == 0)
    return false;
  else if (arrayString[1].charAt(arrayString[1].length-1) == '.') {
    return false;
  }

  return true;
}

function isURL(argvalue) {
  if (argvalue.indexOf(' ') != -1)
    return false;
  else if (argvalue.indexOf('http://') == -1)
    return false;
  else if (argvalue == 'http://')
    return false;
  else if (argvalue.indexOf('http://') > 0)
    return false;

  argvalue = argvalue.substring(7, argvalue.length);
  if (argvalue.indexOf('.') == -1)
    return false;
  else if (argvalue.indexOf('.') == 0)
    return false;
  else if (argvalue.charAt(argvalue.length - 1) == '.')
    return false;

  if (argvalue.indexOf('/') != -1) {
    argvalue = argvalue.substring(0, argvalue.indexOf('/'));
    if (argvalue.charAt(argvalue.length - 1) == '.')
      return false;
  }

  if (argvalue.indexOf(':') != -1) {
    if (argvalue.indexOf(':') == (argvalue.length - 1))
      return false;
    else if (argvalue.charAt(argvalue.indexOf(':') + 1) == '.')
      return false;
    argvalue = argvalue.substring(0, argvalue.indexOf(':'));
    if (argvalue.charAt(argvalue.length - 1) == '.')
      return false;
  }

  return true;

}

function isSelected(ElementID) {

	if (ElementID.selectedIndex == 0) {
		return false;
	}
	
	return true;
}
        

function customSplit(strvalue, separator, arrayName) {
  var n = 0;

  if (separator.length != 0) {
    while (strvalue.indexOf(separator) != -1) {
      eval('arr'+n+' = strvalue.substring(0, strvalue.indexOf(separator));');
      strvalue = strvalue.substring(strvalue.indexOf(separator)+separator.length,
          strvalue.length+1);
      n++;
    }
    eval('arr' + n + ' = strvalue;');
    arraySize = n+1;
  }
  else {
    for (var x = 0; x < strvalue.length; x++) {
      eval('arr'+n+' = \'' + strvalue.substring(x, x+1) + '\';');
      n++;
    }
    arraySize = n;
  }

  eval(arrayName + ' = new makeArray(arraySize);');

  for (var i = 0; i < arraySize; i++)
    eval(arrayName + '[' + i + '] = arr' + i + ';');

  return arraySize;
}

function makeArray(IntarrSize) {

  for (var n = 0; n < IntarrSize; n++)
    this[n] = '';

  return this;

}

//-------------------------------------------------------------------
// Trim functions
//   Returns string with whitespace trimmed
//-------------------------------------------------------------------
function LTrim(str){
	if (str==null){return null;}
	for(var i=0;str.charAt(i)==' ';i++);
	return str.substring(i,str.length);
	}
	
function RTrim(str){
	if (str==null){return null;}
	for(var i=str.length-1;str.charAt(i)==' ';i--);
	return str.substring(0,i+1);
	}
	
function Trim(str){return LTrim(RTrim(str));}

function LTrimAll(str) {
	if (str==null){return str;}
	for (var i=0; str.charAt(i)==' ' || str.charAt(i)=='\n' || str.charAt(i)=='\t'; i++);
	return str.substring(i,str.length);
	}
	
function RTrimAll(str) {
	if (str==null){return str;}
	for (var i=str.length-1; str.charAt(i)==' ' || str.charAt(i)=='\n' || str.charAt(i)=='\t'; i--);
	return str.substring(0,i+1);
	}
	
function TrimAll(str) {
	return LTrimAll(RTrimAll(str));
	}
	
function removeAllSpaces(string) {
	var tstring = '';
	string = '' + string;
	splitstring = string.split(' ');
	for(i = 0; i < splitstring.length; i++)
	tstring += splitstring[i];
	return tstring;
}

function cleanPhone(string) {
	var tstring = '';
	string = '' + string;
	
	splitstring = string.split(' ');
	for(i = 0; i < splitstring.length; i++)
	{tstring += splitstring[i]}

	splitstring = tstring.split('(');
	tstring='';
	for(i = 0; i < splitstring.length; i++)
	{tstring += splitstring[i]}
	
	splitstring = tstring.split(')');
	tstring='';
	for(i = 0; i < splitstring.length; i++)
	{tstring += splitstring[i]}

	splitstring = tstring.split('+');
	tstring='';
	for(i = 0; i < splitstring.length; i++)
	{tstring += splitstring[i]}	

	return tstring;
}