//for couting words in textarea
var wordcount;
var wordcount2;
var wordtotal=0;
var wclen = 10000000;
var wctest = false;

//for couting charaters in textarea
var charcount;
var chartotal=0;
var cclen = 10000000;
var cctest = false;

function monitorText(x,len,theform,thefield){
        wclen=len;
	wordcount = x.value.split(" ").length;//spaces
	wordcount2 = (x.value.split("  ").length)-1;//double spaces
	wordtotal=wordcount-wordcount2;
	document[theform][thefield].value=wordtotal;
	wctest=true;
}

function monitorText_char(x,len,theform,thefield){
        cclen=len;
	chartotal = x.value.length;//len of charcters
	
	document[theform][thefield].value=chartotal;
	cctest=true;
}

function ValidateForm(SubjectForm)
{
	var counter = 0;
	//Perfixes for inputs
	//Text Field = "txt"
	//Address Field = "add"
	//Non-Negative Integer Numeric Field = "num"
	//Positive Integer Numeric Field = "nu1"
	//Numeric Field = "nu2", allow negative, fload number
	//Numeric Field = "nu3", allow only non-negative fload number
	//Date Field = "dat"
	//Email Field = "ema"
	//Phone Field = "pho"
	//Other Field = "oth"
	
	var e;
	var TempField;
	var FieldTitle = "";
	var bValid = true;
	var txtMessage = ""; //keep type violation error
	var txtMessage2 = ""; //keep required field missing error
	var sDelimeter="", lCount=0;
	for (counter = 0; counter < SubjectForm.length; counter++)
	{
		e = SubjectForm.elements[counter];
		TempField = e.name;
		FieldTitle = e.title;		
		if (typeof(FieldTitle) == 'undefined' || FieldTitle=='')
			FieldTitle = TempField.substring(5);
			
		//the 1st letter of the name a field indicate: 'r' - required; 'o' - 'optional'
		if (TempField.substring(0, 1) == "r")		    
		    if (!TestHasValue(e))
		    {    
		        bValid = false;
				txtMessage2 += sDelimeter + FieldTitle;
				lCount++;
				sDelimeter = ", "
				continue;
		    }
		if (e.value != "")
		{
			TempField = TempField.substring(2,5)
			switch(TempField)
			{
			case "txt":
				if(!TestTextOnly(e.value))
				{
					bValid = false;
					txtMessage += "\nentered text in '" + FieldTitle + "' field";
				}
				break;			
			case "add":
				if(!TestAddOnly(e.value))
				{
					bValid = false;
					txtMessage += "\nentered a valid address in '" + FieldTitle + "' field";
				}
				break;
			case "num":
			   
				if(!TestNonnegativeIntNumOnly(e.value))
				{
					bValid = false;
					txtMessage += "\nentered non-negative integer numbers in '" + FieldTitle + "' field";
				}
				break;	
			case "nu1":
			   
				if(!TestPositiveIntNumOnly(e.value))
				{
					bValid = false;
					txtMessage += "\nentered positive integer numbers in '" + FieldTitle + "' field";
				}
				break;	
			case "nu2":
			   
				if(!TestNumOnly(e.value))
				{
					bValid = false;
					txtMessage += "\nentered a valid numbers in '" + FieldTitle + "' field";
				}
				break;
			case "nu3":
			   
				if(!TestNonnegativeNumOnly(e.value))
				{
					bValid = false;
					txtMessage += "\nentered a non-negative numbers in '" + FieldTitle + "' field";
				}
				break;								
			case "dat":
				if(!TestDate(e.value))
				{
					bValid = false;
					txtMessage += "\nused a valid mm/dd/yyyy format date in '" + FieldTitle + "' field";
				}
				break;			
			case "ema":
				if(!TestEmail(e.value))
				{
					bValid = false;
					txtMessage += "\nentered a valid email address in '" + FieldTitle + "' field";
				}
				break;	
			case "pho":
				if(!TestPhone(e.value))
				{
					bValid = false;
					txtMessage += "\nentered a valid number in '" + FieldTitle + "' field";
				}
				break;
			default:
				break;
			}	
		}	
	}
	if(wctest){		
		if(wordtotal>wclen){
				bValid=false;
				txtMessage += "\nUsed "+ wclen +" words or less in the text field";
		}
	}
	
	if(cctest){		
		if(chartotal>cclen){
				bValid=false;
				txtMessage += "\nUsed "+ cclen +" characters or less in the text field";
		}
	}
	if (!bValid)
	{			
			
		if (lCount > 0)
		{
			if (lCount == 1)
				txtMessage2 = "The following field is required: " + txtMessage2 + ".";
			else
				txtMessage2 = "The following fields are required: " + txtMessage2 + ".";
			
			if (txtMessage != "")
				txtMessage2 += "\n\n";
		}
		
		if (txtMessage != "")
			txtMessage2 += "Please make sure that you have only" + txtMessage + ".";
					
		alert (txtMessage2)
		return false;
	}
	return true;
}

function TestHasValue(oElement)
{
	var bResult=true;
	switch (oElement.type)
	{
		case "text":
		case "password":
		case "textarea":
		case "hidden":
			if (oElement.value == "")
				bResult = false;
			break;
		case "select-one":			
			bResult = true;
			if (oElement[oElement.selectedIndex].value =="")
			{
				bResult = false;
			}
			break;		
		case "select-multiple":
			bResult = false;
			for (var i=0;i<oElement.options.length;i++)
			{
				if (oElement[i].selected)
				{
					bResult=true;
					break;
				}
			}
			break;
		case "radio":
			//-- only if the current element is the first element --
			//-- of the radio button, check the existence, other- --
			//-- wise, skip it.
			if (oElement == oElement.form[oElement.name][0])
			{
				bResult = false;
				var oRadioCollection = oElement.form[oElement.name];
				for (var i=0; i < oRadioCollection.length; i++)
				{
					// If a radio button has been selected it will return true
					// (If not it will return false)
					if (oRadioCollection[i].checked)
					{
						bResult = true; 
						break;
					}
				}
			}
			break;
		case "checkbox":
			//there is no way to enforce click on checkbox, so, just skip ...
			break;
	}
	return bResult;
}

function isChar (str) {
	if(str.length!=1) {return (false)};
	str=str.toLowerCase();
	RefString="abcdefghijklmnopq- r.stuvwxy,'z";
	if (RefString.indexOf (str.toLowerCase(), 0)==-1) 
		return (false);
	return (true);
}

function TestTextOnly(StrToTest)
{
	var counter = 0;
	var bresult = true;
	for (counter = 0; counter < StrToTest.length; counter++)
	{
		if (!isChar(StrToTest.substring(counter, counter + 1)))
		{
			bresult = false;
			break;
		}
	}
	return bresult;
}

function TestAddOnly(StrToTest)
{
	/*
	var counter = 0;
	var bresult = true;
	for (counter = 0; counter < StrToTest.length; counter++)
	{
		if (!isChar(StrToTest.substring(counter, counter + 1)) && isNaN(StrToTest.substring(counter, counter + 1)) 
		    && StrToTest.substring(counter, counter + 1) !='#' && StrToTest.substring(counter, counter + 1) !='&'
			&& StrToTest.substring(counter, counter + 1) !='/')
		{
			bresult = false;
			break;
		}
	}
	return bresult;
	*/
	// address field can have any charater, therefore, no validation is necessary
	// Bo, 5/16/2003
	return true;
}

function TestNonnegativeIntNumOnly(NumToTest)
{	
	var counter = 0;
	var bresult = true;
		
	for (counter = 0; counter < NumToTest.length; counter++)
	{
		if (isNaN(NumToTest.substring(counter, counter + 1)))
		{
			bresult = false;
			break;
		}
	}
	return bresult;
}

function TestPositiveIntNumOnly(NumToTest)
{	
	var counter = 0;
	var bresult = true;
	if (NumToTest==0)
		return false;
		
	for (counter = 0; counter < NumToTest.length; counter++)
	{
		if (isNaN(NumToTest.substring(counter, counter + 1)))
		{
			bresult = false;
			break;
		}
	}
	return bresult;
}

function TestNumOnly(NumToTest)
{	
	var counter = 0;
	var bresult = true;
	if (isNaN(NumToTest))
		bresult = false;
	
	return bresult;
}

function TestNonnegativeNumOnly(NumToTest)
{		
	var bresult = true;
	if (isNaN(NumToTest))
		bresult = false;
	else if (NumToTest<=0)
	        bresult = false;
	
    return bresult;
}

function TestDate(DateToTest)
{
	//DateToTest should be in the format of mm/dd/yyyy or mm/dd/yy
	var bresult = true;
	var arrDatePart = new Array();
	arrDatePart = DateToTest.split("/");
	
	var iYear, iMonth, iDay;
	
	if (arrDatePart.length !=3)
		bresult = false;
	else
	{
		iMonth = arrDatePart[0];
		iDay = arrDatePart[1];
		iYear = arrDatePart[2];		
		if (!isDate11 (iYear, iMonth, iDay))
			bresult = false;
	}	
	return bresult;
}

function TestEmail(EmailToTest)
{
	var counter = 0;
	var bdot = false;
	var bamp = false;
	
	if (EmailToTest.length == 0)
	{
      bdot = true;
      bamp = true;	
	}
	else
	{
	   for (counter = 0; counter < EmailToTest.length; counter++)
	   {
	   	if (bamp)
	   	{
	   		if (EmailToTest.substring(counter, counter + 1) == ".")
	   		{
	   			bdot = true;
	   		}
	   	}
	   	else
	   	{
	   		if (EmailToTest.substring(counter, counter + 1) == "@")
	   		{	
	   			bamp = true;
	   		}
	   	}			
	   }
   }
	if (bamp && bdot)
		return true;
	else
		return false;
}

function TestPhone(PhoneToTest)
{
	var counter = 0;
	var InvalidChar = false;
	
	for (counter = 0; counter < PhoneToTest.length; counter++)
	{
	   if (isNaN(PhoneToTest.substring(counter, counter + 1)))
	   {	
	   	if ((PhoneToTest.substring(counter, counter + 1) != "(") && (PhoneToTest.substring(counter, counter + 1) != ")") && (PhoneToTest.substring(counter, counter + 1) != "-") && (PhoneToTest.substring(counter, counter + 1) != ".") )
	         return false;
	   }
	}
	return true;
}

function isDate11 (year, month, day) {
  // month argument must be in the range 1 - 12
  month = month - 1;  // javascript month range : 0- 11  
  var tempDate = new Date(year,month,day);  
  if (getYear11(year) == (getYear11(tempDate.getYear()) ) &&
     (month == tempDate.getMonth()) &&
     (day == tempDate.getDate()))
      return true;     
  else
     return false;    
  }
  
  function getYear11(d) { 
  return (d < 1000) ? d + 1900 : d;
  }

//require zip code/state, if country code is US/Canada --
function ValidateAddr1_notused(thisForm, countryField, stateField, zipField)
{
  var cntry_code = countryField[countryField.selectedIndex].value;
  if (typeof(countryField[countryField.selectedIndex].innerText) != 'undefined') 
   {
       // do stuff with .innerText (IE)
       sTemp   =   'innerText';
   }
   else
   {
       // do stuff with .text (Netscape)
       sTemp   =   'text';
   }
   var cntry_name   =   eval('countryField[countryField.selectedIndex].' + sTemp);
   //if coutry is US, or Canada, then require zip code
	if (cntry_code == '' || cntry_code == '01' || cntry_name.toLowerCase() == 'canada')
   {
       var delimiter = ' and ';
       var usMsg = '';
       var isPrase=' is ';
        var sp_code = stateField[stateField.selectedIndex].value;
        if (sp_code  == '')
            usMsg = 'State';
	    if (thisForm[zipField].value  == '')
       {
           if (usMsg != '')
           {
                usMsg += delimiter + 'Postal Code';
                isPrase = ' are ';
           }
           else
                usMsg = 'Postal Code';
       }
        if (usMsg  != '')
       {
            alert (usMsg + isPrase + 'required for US and Canada.');
            return false
       }
   }
   // if we reach here, then pass the test.
    return true;
}