/*
 * CONFIDENTIAL AND PROPRIETARY
 * Copyright 2009 Silverpop Systems, Inc.  All rights reserved.
 * The contents of this material are confidential and proprietary to
 * Silverpop Systems, Inc. Unauthorized use, disclosure, or reproduction
 * is strictly prohibited.
 */

//this code adds an indexOf method to the Array class if it doesn't already exist.  From https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/IndexOf#Compatibility
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt /*, from*/)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

var formErrorContainerId = ""; //"errorMessageContainerId";
var formErrorStyle = "formControlError";

function validateForm(launchValidationAction, localFormErrorContainerId) {
    //alert('test');
	formErrorContainerId = localFormErrorContainerId;
    //clear error message;
    clearErrorMessages();
    //launch the Validation
	return launchValidationAction();
}

function getErrorMessageContainer() {
    return document.getElementById(formErrorContainerId);
}

/*
 *  Clear all the messages from the message container 
 */
function clearErrorMessages() {
    var errorMessages = getErrorMessageContainer();
    errorMessages.innerHTML = "";
    errorMessages.style.display = "none";
}

function containsStyleName(className, styleName) {
    return (" " + className + " ").indexOf(" " + styleName + " ") >= 0;
}

function getControlLabel(controlName) {
    var element = document.getElementById(controlName);
    return element.getAttribute("label");
}

/*
 *  Set the error style on the container and add the message to the message container.
 */
function addErrorMessage(controlContainerId, controlName, messageKey) {
    var controlContainer = document.getElementById(controlContainerId);
    if (controlContainer) {
        if (!containsStyleName(controlContainer.className, formErrorStyle)) {
            controlContainer.className += " " + formErrorStyle;
        }
    }
    var controlLabel = getControlLabel(controlName);
    var controlLabelDisp = "";
    if (controlLabel && controlLabel != "") {
        controlLabelDisp = controlLabel + ": ";
    }

    var errorMessages = getErrorMessageContainer();
    errorMessages.innerHTML += "<div>" + controlLabelDisp + messageMap[messageKey] + "</div>";
    errorMessages.style.display = "inline";
}

/*
 *  Remove the error style from the container
 */
function clearErrorMessage(controlContainerId) {
    var controlContainer = document.getElementById(controlContainerId);
    if (controlContainer) {
        var oldClassName = controlContainer.className;
        if (containsStyleName(oldClassName, formErrorStyle)) {
            oldClassName = " " + oldClassName + " ";
            oldClassName = oldClassName.replace(new RegExp(" " + formErrorStyle + " ", "g"), " ");
            controlContainer.className = oldClassName;
        }
    }
}

function getControlValue(controlName) {
    var element = document.getElementById(controlName);
    return element.value;
}

/*********************************************************
 * validation functions
 ********************************************************/

function validateEmail(controlContainerId, controlName) {
    return validateRegEx(controlContainerId, controlName, "web.form.invalid.email", /^$|\b[A-Za-z0-9\-_.]+@[a-zA-Z0-9.\-_]+\.[a-zA-Z]{2,4}\b/);
}

function validateRequired(controlContainerId, controlName) {
    return validateRegEx(controlContainerId, controlName, "web.form.required.value", /^.+$/);
}

function validateDate_mmddyyyy(controlContainerId, controlName) {
    return validateDate(controlContainerId, controlName, "mm/dd/yyyy", false, "web.form.date.in.mmddyyyy");
}

function validateDate_ddmmyyyy(controlContainerId, controlName) {
    return validateDate(controlContainerId, controlName, "dd/mm/yyyy", false, "web.form.date.in.ddmmyyyy");
}

function validateDate_yyyymmdd(controlContainerId, controlName) {
    return validateDate(controlContainerId, controlName, "yyyy/mm/dd", false, "web.form.date.in.yyyymmdd");
}

function validateRequiredDate_mmddyyyy(controlContainerId, controlName) {
    return validateDate(controlContainerId, controlName, "mm/dd/yyyy", true, "web.form.date.in.mmddyyyy");
}

function validateRequiredDate_ddmmyyyy(controlContainerId, controlName) {
    return validateDate(controlContainerId, controlName, "dd/mm/yyyy", true, "web.form.date.in.ddmmyyyy");
}

function validateRequiredDate_yyyymmdd(controlContainerId, controlName) {
    return validateDate(controlContainerId, controlName, "yyyy/mm/dd", true, "web.form.date.in.yyyymmdd");
}

function validateDate(controlContainerId, controlName, dateFormat, isRequired, invalidFormatMessageKey) {
    var dateValue = getControlValue(controlName);
    if (dateValue == "" || dateFormat == dateValue) {
        if (isRequired) {
            addErrorMessage(controlContainerId, controlName, "web.form.required.value");
            return false;
        } else {
            clearErrorMessage(controlContainerId);
            return true;
        }
    }

    var date_array = dateValue.split('/');
    if (date_array.length != 3) {
        addErrorMessage(controlContainerId, controlName, invalidFormatMessageKey);
        return false;
    }

    var format_array = dateFormat.split('/');
    var day = date_array[format_array.indexOf("dd")];
    var month = date_array[format_array.indexOf("mm")]; // Attention! Javascript consider months in the range 0 - 11
    var year = date_array[format_array.indexOf("yyyy")];
    
    if (!isMatch(day, /\d+/) || parseInt(day, 10) < 1 || parseInt(day, 10) > 31) {
        addErrorMessage(controlContainerId, controlName, "web.form.invalid.date.day");
        return false;
    }
    if (!isMatch(month, /\d+/) || parseInt(month, 10) < 1 || parseInt(month, 10) > 12) {
        addErrorMessage(controlContainerId, controlName, "web.form.invalid.date.month");
        return false;
    }
    if (!isMatch(year, /[0-9]{4}/)) {
        addErrorMessage(controlContainerId, controlName, "web.form.invalid.date.year");
        return false;
    }

    clearErrorMessage(controlContainerId);
    return true;
}

function validateTime(controlContainerId, controlName) {
    return validateRegEx(controlContainerId, controlName, "web.form.invalid.time", /^$|(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23)[:](0|1|2|3|4|5)\d{1}|hh:mm/);
}

function validateRequiredTime(controlContainerId, controlName) {
    return validateRegEx(controlContainerId, controlName, "web.form.invalid.time", /^$|(00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23)[:](0|1|2|3|4|5)\d{1}/);
}

function validateNumber(controlContainerId, controlName) {
    return validateRegEx(controlContainerId, controlName, "web.form.invalid.number", /^$|(^[-+]?[0-9]*\.?[0-9]+$)/);
}

function validateLengthGT(controlContainerId, controlName, length) {
    var value = getControlValue(controlName);
    if (value.length <= length) {
        addErrorMessage(controlContainerId, controlName, "web.form.required.value");
        return false;
    } else {
        clearErrorMessage(controlContainerId);
        return true;
    }
}

function validateLength(controlContainerId, controlName, length) {
    var value = getControlValue(controlName);
    if (value.length > length) {
        addErrorMessage(controlContainerId, controlName, "web.form.invalid.length");
        return false;
    } else {
        clearErrorMessage(controlContainerId);
        return true;
    }
}

function validateRegEx(controlContainerId, controlName, messageKey, regEx) {
    var value = getControlValue(controlName);
    if (isMatch(value, regEx)) {
        clearErrorMessage(controlContainerId);
        return true;
    } else {
        addErrorMessage(controlContainerId, controlName, messageKey);
        return false;
    }
}

function isMatch(value, regEx) {
    var matchObj = regEx.exec(value);
    return matchObj == null ? false : value == matchObj[0];
}

