// Form Validation
// ###################################################
// requires prototype v1.6.0.2+
//
// Joe Pelosi (ilgstudio.com)
//
// 8/23/2006 	- photoProofPro v2.5.0
// 2/11/2008 	- Added Optional Inline Feedback
//				- Added Additional Validation Types
// ###################################################


// set up array.push() function for older browsers
function Array_push() {
  var A_p = 0
  for (A_p = 0; A_p < arguments.length; A_p++) {
   this[this.length] = arguments[A_p]
   }
  return this.length
}
	
if (typeof Array.prototype.push == "undefined") {
 Array.prototype.push = Array_push
 }
 

// ######################################
	Array.prototype.inArray = function (value)
		// Returns true if the passed value is found in the
		// array.  Returns false if it is not.
		{
			var i;
			for (i=0; i < this.length; i++) {
				// Matches identical (===), not just similar (==).
				if (this[i] === value) {
					return true;
				}
			}
			return false;
		};
		
// FORM VALIDATION




function validate(formName, validationArr, useAlert, noAnchor){
	
	//return false;
	//alert(validationArr)
	//alert(validationArr);
	clearMsgs();
	//alert ('validate');
	
	val_errors = new Array();
	val_fields = new Array();
	
	//errors = new Array();
	if (validationArr!=null){
		for (i=0; i<validationArr.length; i++){
			var myParts = validationArr[i].split("|");
			//alert(myParts);
		
			type = myParts[0];
			field = myParts[1];
			msgStr = myParts[2];
		 //  alert (field);
			
			switch (type){
				
				case "zero":
				
				if ($F(field) == 0 || $F(field) == "0"){
					//errors.push(msgStr);
					addError(field, msgStr);
				}
				break;
				
				case "email":
				if (!isValidEmail($F(field))){
					if (trim(msgStr)==""||!msgStr||msgStr==null){
					//errors.push("A Valid Email Address");
					addError(field,"A Valid Email Address");
					} else {
					//errors.push(msgStr);	
					addError(field, msgStr);
					}
				}
				break;
				
				case "emailMulti":
				var addys = $F(field).split(",");
				addys.each(function(s, index) {
						
					if (!isValidEmail(trim(s))){
						if (trim(msgStr)==""||!msgStr||msgStr==null){
						//errors.push("A Valid Email Address");
						addError(field,"A Valid Email Address");
						} else {
						addError(field, msgStr);
						//errors.push(msgStr);
						//
						throw $break;
						}
					}
				});	
				
				break;
				
				case "emailIfNotEmpty":
				if (emptyFieldCheck($F(field))){
					if (!isValidEmail($F(field))){
						if (trim(msgStr)=="" || !msgStr || msgStr==null){
							//errors.push("A Valid Email Address");
							addError(field,"A Valid Email Address");
						} else {
							//errors.push(msgStr);	
							addError(field, msgStr);
						}
					}
				}
				break;
				// -------------
				case "empty":
				if (!emptyFieldCheck($F(field))){
					addError(field, msgStr);
					//errors.push(msgStr);
				}
				break;
				
				case "emptySelect":
				
				if(hasOptions(field)){
					if (!emptyFieldCheck($F(field))){
						addError(field, msgStr);
						//errors.push(msgStr);
					}
					
				}
				
				break;
				
				
				// -------------
				case "time":
				 if (document.forms[0].eventTime){
				 	if (!isValidTime(document.forms[0].eventTime.value)){
						//errors.push("A Valid time, use HH:MM");
						addError(field, "A Valid time, use HH:MM");
					}
				}
				break;
				// -------------
				case "date":
				if ($(field) && $(field).disabled!=true){
					//alert(isDate($F(field)))
					if (!isDate($F(field))){
						//errors.push(msgStr);	
						addError(field, msgStr);
					}
				
				}
				break;
				// -------------
				case "title":
				if (!emptyFieldCheck('detail', 'title')){
						//errors.push("Title is required");
						addError(field, "Title is required");
					}
				break;
				// -------------
				case "match":
				fArr = field.split(",");
				if (trim($F(fArr[0]))!=trim($F(fArr[1]))){
					//errors.push(msgStr);
					addError(field, msgStr);
				}
				break;
				// -------------
				case "zip":
				
				if (!isZip($F(field))){
					//errors.push(msgStr);
					addError(field, msgStr);
				}
				break;
				
				case "checkGroupNotNull" :
				var checked = Form.getInputs($(formName), "checkbox", element.field).findAll(function(item) 
{ return item.checked; }).pluck("value");
				alert(checked);
				
				break;
				
				case "radioGroupNotNull":
				
				if (radioGroupVal(formName, field)==null){
					//errors.push(msgStr);
					addError(field, msgStr);
				}
				break;
				
				case "MM-YYYY":
				fArr = field.split(",");
				var s = trim($F(fArr[0]))+"-"+trim($F(fArr[1]));
				//alert(s);
				var regex = new RegExp(/(^\d{2}\-\d{4}$)/);
				//alert(s);
 				 if (!regex.test(s)) {
					 addError(fArr[0], '');
					 addError(fArr[1], msgStr);
				 }
				break;
					
				
			}
		}
	}

	if (val_errors.length > 0){
		
		if(useAlert==null || useAlert == true){
			alertMsg = "The following required fields were incomplete:\n\n";
			for (i=0; i<val_errors.length; i++){
				alertMsg += "  - "+val_errors[i]+"\n";
			}
			alertMsg += "\nPlease correct and try again."
			
			//if (focField!=null){
				//$(focField).focus();
				//$(focField).select();
			//}
			alert (alertMsg);
		} else {
			
			
			for (i=0; i<val_errors.length; i++){
				if (feedbackTag==null){ feedbackTag="div"; }
				if (feedbackClass==null){ feedbackClass="error"; }
				
				var errorMsg = "<"+feedbackTag+" class='"+feedbackClass+"'>" + val_errors[i] + "</"+feedbackTag+">";
				//alert("field: "+val_fields[i]);
				
				if (isArray(val_fields[i])){
					
					var arr = val_fields[i];
					if (val_errors[i] != ''){
						$(arr.last()).insert({'after': errorMsg });
					}
					arr.each(function(s) {
					  $(s).addClassName("error");
					});
					
				} else {
					if (val_errors[i] != ''){
						
					
						$(val_fields[i]).insert({'after': errorMsg });
					}
					$(val_fields[i]).addClassName("error");
				}
		
				//after
				//alertMsg += "  - "+errors[i]+"\n";
				
			}
			if (!noAnchor){
			$(formName).scrollTo();
			}
			
			if($(formFeedbackID)){
				$(formFeedbackID).addClassName('error');
				$(formFeedbackID).update('There were errors with the form. Please correct them below.');
			}
			
			
		}
		
		return false;
	} else {
		//MM_showHideLayers('loadingMsg','','show');
		//document.detail.Button.disabled=true;
		if ($('loadingMsg')){
			showHideLayer('loadingMsg', 'show');
			if($('submitButton')){
				$('submitButton').disabled=true;
			}
		}
		return true;
		//$(formName).submit();
	}
}
	
	
var feedbackTag;
var feedbackClass;
var formFeedbackID;

function clearMsgs(){

	//if (feedbackTag != null && feedbackClass != null){
		$$(feedbackTag+'.'+feedbackClass).each(function(s) {
			//s.remove();
			s.removeClassName(feedbackClass);	
			s.removeClassName('success');	
			s.update('');
		});
		
		$$('input.error').each(function(s) {
			s.removeClassName('error');							
		});
		
		$$('select.error').each(function(s) {
			s.removeClassName('error');							
		});
		
		$$('textarea.error').each(function(s) {
			s.removeClassName('error');							
		});
	//}
	
	
}


function addError(field, msg){
	val_errors.push(msg);
	multifield = field.split(',');
	if (multifield.length > 1){
		val_fields.push(multifield[0]);
		val_fields.push(multifield[1]);
		val_errors.push('');
	} else {
		val_fields.push(field);
	
	}
	//alert(val_fields);
}

function hasOptions(field){
	
	var opts = 	$(field).select('option');
	if (opts.length > 0){
		return true;
	}
	return false;
	
}

function isValidEmail(email){
	//var email = document.forms[0].email.value; 

	var objRegExp  = /(^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$)/i;

	  if(objRegExp.test(email)){
		return true;
	  } else {
		//alert("Please enter a valid email address.");
		return false;
	  }

}
function emptyFieldCheck(val){
	if(trim(val) == '' || val == ' ' || val == null){ 
		return false;
	} else {
		return true;
	}
}	

/**
 * DHTML date validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */
// Declaring valid date character, minimum year and maximum year
var dtCh= "/";
//var minYear=1900;
//var maxYear=2100;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isZip(s) 
{
 
     // Check for correct zip code
     reZip = new RegExp(/(^\d{5}$)|(^\d{5}-\d{4}$)/);
 
     if (!reZip.test(s)) {
          //alert("Zip Code Is Not Valid");
          return false;
     }
 
return true;
}
function isDate(dtStr){
	//alert(dtStr);
	if (!emptyFieldCheck(dtStr)){
		return false;		
	}
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strMonth=dtStr.substring(0,pos1)
	var strDay=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	//alert("hello");
	if (pos1==-1 || pos2==-1){
		//alert("The date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		//alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		///alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0){
		//strYear.length != 4 || year==0 || year<minYear || year>maxYear
		//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		//alert("Please enter a valid date")
		return false
	}
return true
}

function trim(str){
	if (str!=null){
   return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
	 //return str.replace(/^\s*|\s*$/g,"");
	}
	return '';
}

function radioGroupVal(el, radioGroup) {
/**
* Returns the value of the selected radio button in the radio group, null if
* none are selected, and false if the button group doesn't exist
*
* @param {radio Object} or {radio id} el
* OR
* @param {form Object} or {form id} el
* @param {radio group name} radioGroup
*/
	if($(el).type && $(el).type.toLowerCase() == 'radio') {
		var radioGroup = $(el).name;
		var el = $(el).form;
	} else if ($(el).tagName.toLowerCase() != 'form') {
		return false;
	}

	var checked = $(el).getInputs('radio', radioGroup).find(
		function(re) {return re.checked;}
	);
	return (checked) ? $F(checked) : null;
}

function validateSurvey(formName){
	var total = $F('totalQuestions');
	var paramStr = '';
	for (i=0; i<total; i++){
		var thisField = 'surveyChoice_'+i;	
		var radVal = radioGroupVal(formName, thisField);
		if (radVal == null){
			alert ("Please answer all "+total+" survey questions");
			return false;
		} else {
			paramStr += "&surveyChoice_"+i+"="+radVal;
		}
	}
	
	var requestOptions = {
	method : 'post',
	parameters : "action=castVote"+paramStr+
		"&surveyID=" + $F('surveyID') +
		"&totalQuestions=" + $F('totalQuestions'),
	
	onComplete: surveyComplete
  };
		//alert (requestOptions.parameters)	  
	new Ajax.Request('/int/phpinc/process_survey_ajax.php', requestOptions);
	return false;
	
}

function surveyComplete(originalRequest){
	//alert(originalRequest.responseText);
	eval("var response = ("+originalRequest.responseText+")");
	var theform = "spuSurvey_"+response.id;
	
	if(response.success==1){
	// show thank you	
	
		var msg = "<div class='sideSurveySuccess'><b>Thank you for your input.</b><br>";
		 msg += "Watch  for the results in an upcoming issue of our eNewsletter!</div><br />";
		 msg += "<div class='link'><a href='/newsletter.php'>Sign up to receive our biweekly eNewsletter here</a></div>";
		//$('surveyContent').update('thank you');
		$('surveyQuestions').update(msg);
		$('surveyResponse').update('');
		//puSurvey_.$surveyID
		
	
	} else {
	// show no vote	
		//$('surveyContent').update('error');
		$('surveyResponse').update('You have already voted.');
	}
	
	
	//alert("?course="+$F('cid')+"&section=evaluation");
	//document.location.href = "?course="+$F('cid')+"&section=assessment";	
	//alert(pagePath);
}

function isArray(obj) {
    return obj.constructor == Array;
}

function restrict_nums(field){
	$(field).value = $F(field).replace(/[^0-9]/g,"");	
}

function restrict_numsdashes(field){
	$(field).value = $F(field).replace(/[^0-9\-]/g,"");	
}

function restrict_alpha(field){
	$(field).value = $F(field).replace(/[^A-Za-z]/g,"");	
}

function restrict_alphanum(field){
	$(field).value = $F(field).replace(/[^0-9A-Za-z]/g,"");
}