var spDoValidate = true;
var spMessageBuild = false;
var questionInfoPrefix = "info_q_";
var infoSeparator = ":";
var phoneRegEx = "\\d{3}-\\d{3}-\\d{4}";
var zipRegEx = "\\d{5}(-\\d{4})?";
var emailRegEx = "[A-Za-z0-9\\-_.]+@[a-zA-Z0-9.\\-_]+\\.[a-zA-Z]{2,4}";
var rankingArr = new Array();

function submitPage() {
    if (validateForm())
    {
        document.forms[0].submit();
    }
}

function validateForm() {
    if (!spDoValidate || !spMessageBuild) {
        return true;
    }

    buildRankingResults();

	var element = document.forms[0].elements;

	for (i = 0; i < element.length; i ++) {
		var elementName = element[i].name;
		if (elementName.substring(0,7) == questionInfoPrefix) {
			var fieldName = elementName.substring(5, elementName.length);
			if (!checkField(fieldName, element[i].value)) {
				return false;
			}
		}
	}
	return true;
}

function checkField(a_fieldName, a_value) {
	var arr = a_value.split(infoSeparator);
	var type = arr[0];
	var required = arr[1];
	var maxLength = arr[2];
	var question = arr[3];
    var validation = arr[4];
    var i;

    var q = getQuestion(a_fieldName);
    if (q != null) {
        question = q;
    }

    if (type == 3 || type == 4) {
		var field = document.forms[0].elements[a_fieldName];
		if (field) {
			var value = field.value;

			if (required == 1) {
				if (value.length == 0) {
					alertMessage(messageRequiredError, question, maxLength);
					field.focus();
					return false;
				}
			}

			if (maxLength > 0) {
				if (value.length > maxLength) {
				    alertMessage(messageMaxLength, question, maxLength);
				    field.focus();
					return false;
				}
			}
            if (validation == 1 && value.length > 0) {
                eval("var validationRegExp = valid_" + a_fieldName);
                if (validationRegExp && validationRegExp.length > 0) {
                    if (!matches(value, validationRegExp)) {
                        alertMessage(messageInvalidFormat, question, maxLength);
                        field.focus();
                        return false;
                    }
                }
            }
        }
    } else if (type == 7 || type == 8 || type == 10 || type == 11) {
		var fields = document.forms[0].elements[a_fieldName];
		if (fields) {
			if (required == 1) {
				if (!checkForChecked(fields)) {
					alertMessage(messageRequiredError, question, maxLength);
					return false;
				}
				if (!checkForOther(fields)) {
                    alertMessage(messageRequiredError, question, maxLength);
                    return false;
                }
			}
		}
	} else if (type == 9) {
	    var field = document.forms[0].elements[a_fieldName];
	    if (field) {
	        var value = field.value;
	        if (required == 1) {
	            if (value.length == 0) {
	                alertMessage(messageRequiredError, question, maxLength);
	                return false;
	            }
	            if (value.length > 0) {
                    var otherField = document.forms[0].elements[a_fieldName + "_" + value];
                    if (otherField) {
                        if (otherField.value.length == 0) {
                            alertMessage(messageRequiredError, question, maxLength);
                            otherField.focus();
                            return false;
                        }
                    }
                }
	        }
	    }
	} else if (type == 12) {
	    if (required == 1) {
	        if (document.forms[0].elements[a_fieldName]) {
	        } else {
	            var fields = getFieldsStartWith(a_fieldName + "_");
                for(var i = 0; i < fields.length; i++) {
                    if (fields[i].value == "") {
                        alertMessage(messageRequiredError, question, maxLength);
                        return false;
                    }
                }
            }
        }
	} else if (type == 13) {
	    if (required == 1) {
            var fields = getFieldsStartWith(a_fieldName + "_");
            var uniqueNames = getUniqueName(fields);
            for(var i = 0; i < uniqueNames.length; i++) {
                if (!getChecked(fields, uniqueNames[i])) {
                    alertMessage(messageRequiredError, question, maxLength);
                    return false;
                }
            }
        }
    } else if (type == 16 || type == 17) {
        for (var i = 0; i < 11; i++) {
            if (i != 1 && i != 3 && (i != 7 || type == 17)) {
                var field = document.forms[0].elements[a_fieldName + "_" + i];
                if (field) {
                    if (required == 1) {
                        if (i < 8) {
                            if (field.value.length == 0) {
                                alertMessage(messageRequiredError, question, maxLength);
                                field.focus();
                                return false;
                            }
                        }
                    }
                    switch (i) {
                        case 6:
                            if (type == 16 && field.value.length != 0) {
                                if (!isValidZip(field.value)) {
                                    alertMessage(messageInvalidFormat, question, maxLength);
                                    field.focus();
                                    return false;
                                }
                            }
                            break;
                        case 8:
                            if (field.value.length != 0) {
                                if (!isValidEmail(field.value)) {
                                    alertMessage(messageInvalidFormat, question, maxLength);
                                    field.focus();
                                    return false;
                                }
                            }
                            break;
                        case 9:
                        case 10:
                            if (type == 16 && field.value.length != 0) {
                                if (!isValidPhone(field.value)) {
                                    alertMessage(messageInvalidFormat, question, maxLength);
                                    field.focus();
                                    return false;
                                }
                            }
                            break;
                    }
                }
            }
        }
    } else if (type == 18) {
		var field = document.forms[0].elements[a_fieldName];
		if (field) {
			var value = field.value;

			if (required == 1) {
				if (value.length == 0) {
					alertMessage(messageRequiredError, question, maxLength);
					field.focus();
					return false;
				}
			}
			if (maxLength > 0) {
				if (value.length > maxLength) {
				    alertMessage(messageMaxLength, question, maxLength);
				    field.focus();
					return false;
				}
			}

			if (!f_isValidEmail(value)) {
			    alertMessage(messageInvalidEmail, question, maxLength);
                field.focus();
                return false;
			}
		}
	} else if (type == 21) {
	    if (document.forms[0].elements[a_fieldName]) {
            var obj = document.forms[0].elements["sel_" + a_fieldName];
            if (obj) {
                //select object (type 21)
                if (obj.touched && obj.touched == "1") {
                } else {
                    var ans = confirm(buildMessage(messageQuestionNotOrdered, question, maxLength));
                    if (ans) {
                        obj.touched = "1";
                    } else {
                        return false;
                    }
                }
            }
	    } else {
	        if (required == 1) {
	            var fields = getFieldsStartWith(a_fieldName + "_");
                for(var i = 0; i < fields.length; i++) {
                    if (fields[i].value == "") {
                        alertMessage(messageRequiredError, question, maxLength);
                        return false;
                    }
                }
            }
        }
	}
	return true;
}

function getChecked(a_fields, a_name) {
    for(var i = 0; i < a_fields.length; i++) {
        if (a_fields[i].name == a_name) {
            if (a_fields[i].checked) {
                return true;
            }
        }
    }
    return false;
}

function getUniqueName(a_elements) {
    var newArray = new Array();
    for(var i = 0; i < a_elements.length; i++) {
        var name = a_elements[i].name;
        var found = false;
        for(var j = 0; j < newArray.length; j++) {
            if (newArray[j] == name) {
                found = true;
                break;
            }
        }
        if (!found) {
            newArray[newArray.length] = name;
        }
    }
    return newArray;
}

function getFieldsStartWith(a_fieldName) {
    var newArray = new Array();
    var e = document.forms[0].elements;
    for(var i = 0; i < e.length; i++) {
        if (e[i].name.substring(0, a_fieldName.length) == a_fieldName) {
            newArray[newArray.length] = e[i];
        }
    }
    return newArray;
}

function checkForChecked(a_fields) {
	if (a_fields.length) {
		for(var i = 0; i < a_fields.length; i++) {
			if (a_fields[i].checked) {
				return true;
			}
		}
	} else {
		return a_fields.checked;
	}
	return false;
}

function checkForOther(a_fields) {
	if (a_fields.length) {
		for(var i = 0; i < a_fields.length; i++) {
			if (a_fields[i].checked) {
				var name = a_fields[i].name;
				var value = a_fields[i].value;
				var otherField = document.forms[0].elements[name + "_" + value];
				if (otherField) {
					if (otherField.value.length == 0) {
					    otherField.focus();
						return false;
					}
				}
			}
		}
	} else {
		if (a_fields.checked) {
			var name = a_fields.name;
			var value = a_fields.value;
			var otherField = document.forms[0].elements[name + "_" + value];
			if (otherField) {
				if (otherField.value.length == 0) {
				    otherField.focus();
					return false;
				}
			}
		}
	}
	return true;
}

function getLastChunk(str) {
    var index = str.indexOf("_");
    if (index != -1) {
        return str.substring(index, str.length);
    } else {
        return "";
    }
}

function rankingSelectionChange(obj) {
    var objName = obj.name;
    var index = objName.lastIndexOf("_");
    if (index != -1) {
        var searchName = objName.substring(0, index) + "_";
        var searchValue = getLastChunk(obj.value);
        if (searchValue == "_N/A") {
            return;
        }
        var elements = document.forms[0].elements;
        if (elements && elements.length) {
            for(var i = 0; i < elements.length; i++) {
                var curObj = elements[i];
                if (curObj.name != objName) {
                    if (curObj.name.substring(0, searchName.length) == searchName) {
                        if (searchValue == getLastChunk(curObj.value)) {
                            curObj.checked = false;
                        }
                    }
                }
            }
        }
    }
}

function rankingSelectionChange2(obj, lastItemNA) {
    var objName = obj.name;
    var index = objName.lastIndexOf("_");
    if (index != -1) {
        if (lastItemNA && obj.selectedIndex == obj.options.length - 1) {
            return;
        }
        var searchName = objName.substring(0, index) + "_";
        var searchValue = getLastChunk(obj.value);
        var elements = document.forms[0].elements;
        if (elements && elements.length) {
            for(var i = 0; i < elements.length; i++) {
                var curObj = elements[i];
                if (curObj.name != objName) {
                    if (curObj.name.substring(0, searchName.length) == searchName) {
                        if (searchValue == getLastChunk(curObj.value)) {
                            curObj.options.selectedIndex = 0;
                        }
                    }
                }
            }
        }
    }
}

function previousAction() {
    spDoValidate = false;
    return true;
}

function nextAction() {
    spDoValidate = true;
    return true;
}



/* The following are common validation routines used by any screens that need to
 * validate user input.
 */
/* Checks if an email address is valid, modified from http://javascript.internet.com/forms/check-email.html
*/
function f_isValidEmail(a_sEmail)
{
   if (a_sEmail != null && a_sEmail != "")
   {
      /* The following pattern is used to check if the entered e-mail address
         fits the user@domain format.  It also is used to separate the username
         from the domain. */
      var emailPat=/^(.+)@(.+)$/;
      /* The following string represents the pattern for matching all special
         characters.  We don't want to allow special characters in the address.
         These characters include ( ) < > @ , ; : \ " . [ ]    */
      var specialCharsUser="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
      var specialCharsDomain="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]\\'";

      /* The following string represents the range of characters allowed in a
         username or domainname.  It really states which chars aren't allowed. */
      var validCharsUser="\[^\\s" + specialCharsUser + "\]";
      var validCharsDomain="\[^\\s" + specialCharsDomain + "\]";
      /* The following pattern applies if the "user" is a quoted string (in
         which case, there are no rules about which characters are allowed
         and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
         is a legal e-mail address. */
      var quotedUser="(\"[^\"]*\")";
      /* The following pattern applies for domains that are IP addresses,
         rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
         e-mail address. NOTE: The square brackets are required. */
      var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
      /* The following string represents an atom (basically a series of
         non-special characters.) */
      var atomUser=validCharsUser + '+';
      var atomDomain=validCharsDomain + '+';
      /* The following string represents one word in the typical username.
         For example, in john.doe@somewhere.com, john and doe are words.
         Basically, a word is either an atom or quoted string. */
      var wordUser="(" + atomUser + "|" + quotedUser + ")";
      // The following pattern describes the structure of the user
      var userPat=new RegExp("^" + wordUser + "(\\." + wordUser + ")*$");
      /* The following pattern describes the structure of a normal symbolic
         domain, as opposed to ipDomainPat, shown above. */
      var domainPat=new RegExp("^" + atomDomain + "(\\." + atomDomain +")*$");


      /* Finally, let's start trying to figure out if the supplied address is
         valid. */

      /* Begin with the coarse pattern to simply break up user@domain into
         different pieces that are easy to analyze. */
      var matchArray=a_sEmail.match(emailPat);
      if (matchArray==null)
      {
        /* Too many/few @'s or something; basically, this address doesn't
           even fit the general mould of a valid e-mail address. */
      	//alert("The format of the email address you entered is not valid for email addresses.");
      	return false;
      }
      var user=matchArray[1];
      var domain=matchArray[2];

      // See if "user" is valid
      if (user.match(userPat)==null)
      {
          // user is not valid
          //alert("Email username doesn't seem to be valid.");
          return false;
      }

      /* if the e-mail address is at an IP address (as opposed to a symbolic
         host name) make sure the IP address is valid. */
      var IPArray=domain.match(ipDomainPat);
      if (IPArray!=null)
      {
          // this is an IP address
      	  for (var i=1;i<=4;i++)
           {
      	    if (IPArray[i]>255)
             {
      	        //alert("Email IP address is invalid!");
      		     return false;
      	    }
          }
          return true;
      }

      // Domain is symbolic name
      var domainArray=domain.match(domainPat);
      if (domainArray==null)
      {
      	//alert("Email domain name doesn't seem to be valid.");
         return false;
      }

      /* domain name seems valid, but now make sure that it ends in a
         three-letter word (like com, edu, gov) or a two-letter word,
         representing country (uk, nl), and that there's a hostname preceding
         the domain or country. */

      /* Now we need to break up the domain to get a count of how many atoms
         it consists of. */
      var atomPat=new RegExp(atomDomain,"g");
      var domArr=domain.match(atomPat);
      var len=domArr.length;
      if (domArr[domArr.length-1].length<2 ||
          domArr[domArr.length-1].length>4)
      {
         // the address must end in a two letter or three letter word.
         //alert("Email address must end in a three or four letter domain or a two letter country.");
         return false;
      }

      // Make sure there's a host name preceding the domain.
      if (len<2)
      {
         var errStr="Email address is missing a hostname.";
         //alert(errStr);
         return false;
      }
   }

   // If we've gotten this far, everything's valid!
   return true;
}

function suppressEnter() {
    if (window.event.keyCode == 13) {
        window.event.keyCode = 0;
    }
}




/***************************************************************
 *
 *
 ***************************************************************/
function enableInputFields() {
    var element = document.forms[0].elements;
    if (element && element.length) {
        for (i = 0; i < element.length; i ++) {
            var elementName = element[i].name;
            if (elementName.substring(0,7) == questionInfoPrefix) {

                var fieldName = elementName.substring(5, elementName.length);
                checkInputField(fieldName, element[i].value);
            }
        }
	}
}

function checkInputField(a_fieldName, a_value) {
    var arr = a_value.split(infoSeparator);
	var type = arr[0];
	var required = arr[1];
	var maxLen = arr[2];
	var question = arr[3];

	if (type == 7 || type == 8 || type == 10 || type == 11) {
		var fields = document.forms[0].elements[a_fieldName];
		if (fields) {
			enableOtherInput(fields);
		}
	} else if (type == 9) {
        var field = document.forms[0].elements[a_fieldName];
        if (field) {
            enableSelectOtherInput(field);
        }
    }
}

function enableOther(field) {
    var fields = document.forms[0].elements[field.name];
    if (fields) {
        enableOtherInput(fields);
    }
}

function enableSelectOtherInput(a_field) {
    for(var i = 0; i < a_field.options.length; i++) {
        var value = a_field.options[i].value;
        var otherField = document.forms[0].elements[a_field.name + "_" + value];
        if (otherField) {
            if (value == a_field.value) {
                otherField.disabled = false;
            } else {
                otherField.disabled = true;
            }
        }
    }
}

function enableOtherInput(a_fields) {
    if (a_fields.length) {
		for(var i = 0; i < a_fields.length; i++) {
		    var name = a_fields[i].name;
            var value = a_fields[i].value;
            var otherField = document.forms[0].elements[name + "_" + value];
            if (otherField) {
                if (a_fields[i].checked) {
                    otherField.disabled = false;
                } else {
                    otherField.disabled = true;
                }
            }
		}
	} else {
        var name = a_fields.name;
        var value = a_fields.value;
        var otherField = document.forms[0].elements[name + "_" + value];
        if (otherField) {
            if (a_fields[i].checked) {
                otherField.disabled = false;
            } else {
                otherField.disabled = true;
            }
        }
	}
}


function buildRankingResults() {
	for(var i = 0; i < rankingArr.length; i++) {
		document.forms[0].elements[rankingArr[i]].value = getRanking(rankingArr[i]);
	}
}

function getRanking(name) {
	var str = "";

	var obj = document.forms[0].elements["sel_" + name];
	if (obj && obj.type == "select-one") {
		for(var i = 0; i < obj.length; i++) {
			if (i > 0) {
				str += ",";
			}
			str += obj.options[i].value;
		}
	}
	return str;
}

function buildRanking() {
	var argv = buildRanking.arguments;
	var argLen = argv.length;

	var name = argv[0];

	rankingArr[rankingArr.length] = name;

	document.write("<table class=\"surveyRankingTable\" border=\"1\"><tr class=\"Header\">");
	document.write("<input type=\"hidden\" name=\"" + name + "\" value=\"\">");
	document.write("<td><select name=\"sel_" + name + "\" size=\"" + ((argLen-1)/2)+ "\">");
	for(var i = 1; i < argLen; i+=2) {
		document.write("<option value=\"" + argv[i] + "\"" +  (i == 1 ? " selected" : "") + ">" + argv[i+1] + "</option>");
	}
	document.write("</select></td>");
	document.write("<td valign=center align=left width=\"100%\">");
	document.write("<table><tr><td><input type=\"button\" class=\"surveyButton moveUpButton\" onclick=\"moveRankingUp(document.forms[0].sel_" + name + ");\" value=\"" + labelMoveUp + "\"></td></tr>");
	document.write("<tr><td><input type=\"button\" class=\"surveyButton moveDownButton\" onclick=\"moveRankingDown(document.forms[0].sel_" + name + ");\" value=\"" + labelMoveDown + "\"></td></tr></table>");
	document.write("</td>");
	document.write("</tr></table>");
}

function moveRankingUp(obj) {
    obj.touched = "1";
	var index = obj.selectedIndex;
	if (index > 0) {
		var tempValue = obj.options[index].value;
		var tempText = obj.options[index].text;
		obj.options[index].value = obj.options[index - 1].value;
		obj.options[index].text = obj.options[index - 1].text;
		obj.options[index - 1].value = tempValue;
		obj.options[index - 1].text = tempText;
		obj.selectedIndex--;
	}
}

function moveRankingDown(obj) {
    obj.touched = "1";
	var index = obj.selectedIndex;
	if (index < obj.options.length - 1) {
		var tempValue = obj.options[index].value;
		var tempText = obj.options[index].text;
		obj.options[index].value = obj.options[index + 1].value;
		obj.options[index].text = obj.options[index + 1].text;
		obj.options[index + 1].value = tempValue;
		obj.options[index + 1].text = tempText;
		obj.selectedIndex++;
	}
}

function matches(str, regEx) {
    var matchObj = new RegExp(regEx).exec(str);
    return matchObj == null ? false : str == matchObj[0];
}

function getQuestion(name) {
    var elem = document.getElementById(name);
    if (elem && elem.firstChild) {
        return elem.firstChild.nodeValue;
    }
    return null;
}

function buildMessage(message, question, maxSize) {
    message = message.replace("%%SP_MAX_LENGTH%%", maxSize);
    message = message.replace("%%SP_QUESTION_LABEL%%", question);
    return message;
}

function alertMessage(message, question, maxSize) {
    alert(buildMessage(message, question, maxSize));
}

function isValidZip(value) {
    return matches(value, zipRegEx);
}

function isValidEmail(value) {
    return matches(value, emailRegEx);
}

function isValidPhone(value) {
    return matches(value, phoneRegEx);
}