/* validateThis, 1.1                             
 * A generic form validator, based on classname. 
 * Currently validates:   
 *   vt_int                                    
 *   vt_req              | Makes the input a required field
 *   vt_date             | Must be a date
 *   vt_dateSQLShort                                   
 *   vt_dateSQL    
 *   vt_dateIntlShort                                   
 *   vt_dateIntl           
 *   vt_dateISO8601Short
 *   vt_dateISO8601                         
 *   vt_real             | Must be a real number        
 *   vt_phone            | Must be a phone number 
 *   vt_email            | Must be an email address
 *   vt_email_confirm    | Must be an email address which matches the previous email address
 *   vt_prevPack         | The value cannot be greater than 1
 *   vt_min              | To enforce a minimum value in the input          
 *                                        
 * Make sure and set the input title! The alert  
 * uses this a meaningful explanation of the form element.        
 * http://code.google.com/p/validatethis
 */

function validateThis(form) {
  var theForm;
  var isValid = true;
  var formsArray = new Array();
  if (form) 
    formsArray[0] = document.forms[form];
  else
    formsArray = document.getElementsByTagName("FORM");
		
  for (f=0; f<formsArray.length; f++)
    theForm = formsArray[f];
 
  var max = 0;
  if (theForm != null && theForm.elements != null && theForm.elements.length != null)
	max = theForm.elements.length;
  
  for (i=0; i < (max); i++) {	    	
      var e = theForm.elements[i];	    	 
      e.style.borderStyle='';
      e.style.borderColor='';
      e.parentNode.style.color='';
      e.parentNode.style.fontWeight='normal';            
            
      /* Do not process form elements which are hidden */
      var container = e.parentNode;
      var test = (container.style.display == 'none') ? false : true;
                                                            
            if (test && (e.tagName == "INPUT" || e.tagName == "TEXTAREA")) {
            	
                if (e.type == "text" || e.type == "password" || e.type == "textarea" || e.type == "hidden" ) {
                    /* vt_req and vt_min can be combined with other validators, so must be evaluated separately */
                    if (e.className.match(/vt_req/) && (isValid == true)) { 
                        if (e.value == "") {
                            isValid = badInputHandler(e);                          
                        }
                    } 
                    if (e.className.match(/vt_int/) && (isValid == true)) {
                        if (!validateInt(e))
                            isValid = badInputHandler2(e);
                    }     
                    if (e.className.match(/vt_min/) && (isValid == true)) {
                        if (!validateMinimumNumber(e))
                            isValid = badInputHandler2(e);                    
                    }
                      
                      
                    if (e.className.match(/vt_real/) && (isValid == true)) { 
                        if (!validateReal(e.value)) {
                            isValid = badInputHandler2(e);
                        }
                    } else if (e.className.match(/vt_dateSQLShort/) && (isValid == true)) { 
                        if (!validateDateSQLShort(e)) {
                            isValid = badInputHandler2(e);
                        }
                    } else if (e.className.match(/vt_dateSQL/) && (isValid == true)) { 
                        if (!validateDateSQL(e)) {
                            isValid = badInputHandler2(e);
                        }
                    } else if (e.className.match(/vt_dateISO8601Short/) && (isValid == true)) { 
                        if (!validateDateISO8601Short(e)) {
                            isValid = badInputHandler2(e);
                        }
                    } else if (e.className.match(/vt_dateISO8601/) && (isValid == true)) { 
                        if (!validateDateISO8601(e)) {
                            isValid = badInputHandler2(e);
                        }
                    } else if (e.className.match(/vt_dateIntlShort/) && (isValid == true)) { 
                        if (!validateDateIntlShort(e)) {
                            isValid = badInputHandler2(e);
                        }
                    } else if (e.className.match(/vt_dateIntl/) && (isValid == true)) { 
                        if (!validateDateIntl(e)) {
                            isValid = badInputHandler2(e);
                        }                        
                    } else if (e.className.match(/vt_date/) && (isValid == true)) { 
                        if (!validateDate(e)) {
                            isValid = badInputHandler2(e);
                        }
                    } else if (e.className.match(/vt_phone/) && (isValid == true)) { 
                        if (!validatePhone(e)) {
                            isValid = badInputHandler2(e);                 
                        }
                    } else if (e.className.match(/vt_nospaces/) && (isValid == true)) { 
                        if (!validateNoSpaces(e)) {
                            isValid = badInputHandler2(e);                 
                        }                                             
                    } else if (e.className.match(/vt_emailMult/) && (isValid == true)) { 
                        if (!validateEmailMult(e)) {
                            isValid = badInputHandler2(e);                 
                        }                                             
                    } else if (e.className.match(/vt_prevPack/) && (isValid == true)) { 
	                    if (!validatePreviewPack(e)) {
	                        isValid = badInputHandler2(e);                 
	                    }	                                         
	                } else if (e.className.match(/vt_email/) && (isValid == true)) { 
                        if (!validateEmail(e)) {
                            isValid = badInputHandler2(e);                        
                        } else if (e.className.match(/vt_email_confirm/) && (isValid == true)) {
                    	    if (!validateEmailConfirm(e))
                    		    isValid = badInputHandler2(e);
                        } 
                    }
            }
           
            if (isValid && theForm.elements[i].type == "checkbox") {            	
            	if (theForm.elements[i].className.match(/vt_req/)) {
	                if (!theForm.elements[i].checked) {
	                	isValid = badInputHandler(theForm.elements[i]);
	                }	
            	}            
            }
                  
            // for radio button group validation, the vt_req is only required on the first radio input element
            if (isValid && theForm.elements[i].type == "radio") {
            	
                if (theForm.elements[i].className.match(/vt_req/)) {
                	
                   var buttonGroup = new Array();	
                   
                   for (var k=0; k < theForm.elements.length; k++) {
                	 if (theForm.elements[k].type == "radio" && theForm.elements[k].name == theForm.elements[i].name) {
                		buttonGroup.push(theForm.elements[k]);
                	 }	 
                	   
                   }
                   
                   var isChecked = false;

                   if (buttonGroup[0]) { 
            		   
        		      for (k=0; k < buttonGroup.length; k++) {
        		         if (buttonGroup[k].checked) {
        		            isChecked = true;
        		         }
        		      }
        		      
            	   } else {
            		      if (buttonGroup.checked) { isChecked = true; } 
            	   }
            	   
            	   if (isChecked == false) {
            	       isValid = badInputHandler(theForm.elements[i]);
            	   }
 
                }
               
            }
    
	    }     
            
        if (isValid && theForm.elements[i].tagName == "SELECT") {
        	
            var sel = theForm.elements[i];
            
            if (theForm.elements[i].className.match(/vt_req/)) {
            	if (sel.value=="") {
            		isValid = badInputHandler(theForm.elements[i]);
            	}	
            }
            //getstr += sel.name + "=" + sel.options[sel.selectedIndex].value + "&";
        }
    } 
    return isValid;
}

function badInputHandler2(input) {
    input.style.borderStyle='solid';
    input.style.borderColor='#BE2F21';
    input.focus();
    return false;
}

function badInputHandler(input) {	
	if (input.type == "radio" || input.type == "checkbox") {
      input.parentNode.style.color='#BE2F21';
	  input.parentNode.style.fontWeight='bold'; 
	} else {
	  input.style.borderStyle='solid';
	  input.style.borderColor='#BE2F21';
	}
	
    input.focus();
    
    var str1 = "";
    
    if (input.title !=null && input.title > " ") {
    	str1 = input.title
    } else {
    	str1 = input.name 
    }
    
    if (input.tagName == "SELECT" || input.type == "radio" || input.type == "checkbox"){
      alert("Please select a " + str1)	
    } else {
      alert("Please fill in the " + str1 + " field." )
    }
    
    return false;
}

function validateReal (strng) {
  var error = "";
  if (!strng.match(/^[\d]*[/.]{0,1}\d{0,2}$/)) {
    alert(strng + " is not a valid number.\n Please do not include spaces.");
    return false;
  }
  return true;
}

function validateMinimumNumber(e) {
  var error = "";
  var name = e.name;
  var value = e.value;
  var title = e.title;
  var a = 'vt_min_' + name.substring(3,name.length);
  var i = document.getElementById(a);
  var q = i.value;

  if (e.value=='')
    value = 0;    
      
  if (Number(q) > Number(value)) {
    alert("You must enter at least " + q + " " + title);
    return false;
  } else if (!Number(value)) {    
    return false;  
  }
  return true;
}

function validateInt(obj) {
  var v = obj.value;
  var t = obj.title;
 
  if ((v.length > 0) && (!Number(v)) || (v.indexOf('.') > 0)) {
    alert(t + ' must be a whole number.');
    return false; 
  }
  return true;
}

function validateDate(obj) {
  if (!obj.value == "") {
	 obj.value = obj.value.replace(/-/g,"/");  
    if (!obj.value.match(/^[0-1]\d[\/][0-3]\d[\/](19|20)\d\d$/)) {
      if ( (obj.title == "") || (obj.title == null) ) {
        alert("Please enter a date using the mm/dd/yyyy format.");
      } else {
        alert("Please enter a valid " + obj.title + " using the mm/dd/yyyy format.");
      }
      return false;
    }
  }
  return true;
}

function validateDateIntl (obj) {
	  if (!obj.value == "") {
		obj.value = obj.value.replace(/-/g,"/");
	    if (!obj.value.match(/^[0-3]\d[\/][0-1]\d[\/](19|20)\d\d$/)) {
	      if ( (obj.title == "") || (obj.title == null) ) {
	        alert("Please enter a date using the dd/mm/yyyy format.");
	      } else {
	        alert("Please enter a valid " + obj.title + " using the dd/mm/yyyy format.");
	      }
	      return false;
	    }
	  }
	  return true;
	}
function validateDateIntlShort (obj) {
	  if (!obj.value == "") {
		obj.value = obj.value.replace(/-/g,"/");  
	    if (!obj.value.match(/^[0-3]\d[\/][0-1]\d[\/]\d\d$/)) {
	      if ( (obj.title == "") || (obj.title == null) ) {
	        alert("Please enter a date using the dd/mm/yy format.");
	      } else {
	        alert("Please enter a valid " + obj.title + " using the dd/mm/yy format.");
	      }
	      return false;
	    }
	  }
	  return true;
	}

function validateDateSQLShort (obj) {
	  if (!obj.value == "") {
		  if (!obj.value.match(/^[0-3][0-9]-[a-zA-Z]{3}-[0-9]{2}$/)) {
	      if ( (obj.title == "") || (obj.title == null) ) {
	        alert("Please enter a date using the dd-mmm-yy format.");
	      } else {
	        alert("Please enter a valid " + obj.title + " using the dd-mmm-yy format.");
	      }
	      return false;
	    }
	  }
	  return true;

	}
function validateDateSQL (obj) {
	  if (!obj.value == "") {
	    if (!obj.value.match(/^[0-3][0-9]-[a-zA-Z]{3}-(19|20)[0-9]{2}$/)) {
	      if ( (obj.title == "") || (obj.title == null) ) {
	        alert("Please enter a date using the dd-mmm-yyyy format.");
	      } else {
	        alert("Please enter a valid " + obj.title + " using the dd-mmm-yyyy format.");
	      }
	      return false;
	    }
	  }
	  return true;

	}
function validateDateISO8601Short (obj) {
	  if (!obj.value == "") {
		  if (!obj.value.match(/^[0-9]{2}[0-1][0-9][0-3][0-9]$/)) {
	      if ( (obj.title == "") || (obj.title == null) ) {
	        alert("Please enter a date using the yymmdd format.");
	      } else {
	        alert("Please enter a valid " + obj.title + " using the yymmdd format.");
	      }
	      return false;
	    }
	  }
	  return true;

	}
function validateDateISO8601 (obj) {
	  if (!obj.value == "") {
   	    if (!obj.value.match(/^[0-9]{4}[0-1][0-9][0-3][0-9]$/)) {
	      if ( (obj.title == "") || (obj.title == null) ) {
	        alert("Please enter a date using the yyyymmdd format.");
	      } else {
	        alert("Please enter a valid " + obj.title + " using the yyyymmdd format.");
	      }
	      return false;
	    }
	  }
	  return true;

	}

function validatePhone(obj) {
  var phone = obj.value;
  var numbersOnly = phone.replace(/[\(\)\.\-\ ]/g, '');
  if (phone != numbersOnly) {
    obj.value = numbersOnly;
  }
  if ((obj.value != "") && 
      !((obj.value.match(/^\d{11}$/) && obj.value.substr(0,1)=="1") ||
        (obj.value.match(/^\d{10}$/)) ||
        (obj.value.match(/^\d{7}$/)))) {
       if ( (obj.title == "") || (obj.title == null) ) {
         alert("Please enter a valid phone number.");
       } else {
       alert("The " + obj.title + " must contain a phone number.");
       }
       return false;
  }
  return true;
}

function validateEmail(obj) {
  if ((obj.value != "") && 
      (!obj.value.match(/^.+@.+\..{2,4}$/))) {
      if ( (obj.title == "") || (obj.title == null) ) {
        alert("Please enter a valid email address.");
      } else {
        alert("The " + obj.title + " must be a valid email address.");
      } 
      return false;
  }
  return true;
}
function validateEmailMult(obj1) {
	obj1.value = obj1.value.replace(/\s/g, "");
	var title = obj1.title;
	var emailArr = obj1.value.split(',');
	var returnVal = true;
	for (var i = 0; i < emailArr.length; i++) {
	  obj = emailArr[i];
	  if ((obj != "") && 
	      (!obj.match(/^.+@.+\..{2,4}$/))) {
	      alert("One of the email addresses entered is not valid.");
	      returnVal = false;
	      break;
	  }
	}
   return returnVal;
}

function validateEmailConfirm(obj) {
	var elements = document.getElementsByClassName('vt_email_confirm');
	for(var i = 0;i < elements.length;i++){
		if (elements[i].value != obj.value) {
	        alert("Your email fields do not match.");
			return false;
		}
	}
	return true;
}

function validateNoSpaces(obj) {
	  if ((obj.value != "") && 
		  (obj.value.indexOf(" ") > 0)) {
	      if ( (obj.title == "") || (obj.title == null) ) {
	        alert("Please enter a username without any spaces.");
	      } else {
	        alert("The " + obj.title + " cannot have spaces.");
	      } 
	      return false;
	  }
	  return true;
	}



function validatePreviewPack (obj) {
	if (!obj.value == "") {
		if (!(obj.value == "1" || obj.value == "0")) {
			alert("Only one preview pack is allowed per organization.");
			return false;
		}
	}
	return true;
}

function comparePassword(form) {
	var is_valid = true;
	var pForm = document.forms[form];
	if (pForm.password.value != pForm.password2.value) {
		alert("Entered passwords do not match");
		pForm.password.style.borderStyle='solid';
		pForm.password.style.borderColor='#BE2F21';
		pForm.password.focus();
		is_valid = false;
	}
	
	return is_valid;
}

function checkAll(formName,fieldName) {
  var nameLength = 0;
  for (i=0; i < (document.forms[formName].elements.length); i++) {		
    nameLength = document.forms[formName].elements[i].name.length;
    if ((nameLength >= fieldName.length) && (document.forms[formName].elements[i].name.substr(0,fieldName.length) == fieldName)) {
      document.forms[formName].elements[i].checked = true;
    }
  }
}

function unCheckAll(formName,fieldName) {
  var nameLength = 0;
  for (i=0; i < (document.forms[formName].elements.length); i++) {
    nameLength = document.forms[formName].elements[i].name.length;
    if ((nameLength >= fieldName.length) && (document.forms[formName].elements[i].name.substr(0,fieldName.length) == fieldName)) {
      document.forms[formName].elements[i].checked = false;
    }
  }
}