﻿var pageDefinedValidationFunctions = new Array();
var arrErrors = new Array();
var validationFunctions = new Object();

validationFunctions.currency    = function(v) { return /^(\d+(\.|,)\d{1,2})$|^(\d+)$/.exec(v); }	// valeur prix.
validationFunctions.currencyNull= function(v) { return /^(\d+(\.|,)\d{1,2})$|^(\d+)$|^$/.exec(v); }// valeur prix or Null.

validationFunctions.val         = function(v) { return /^\S+[\W\w]+$|\S+/.exec(v) ;}              // valeur length > 0.

validationFunctions.digit       = function(v) { return /^\d+$/.exec(v);}                         // integer.
validationFunctions.digit2      = function(v) { return /^\d{1,2}$/.exec(v);}                     // integer 0-99.
validationFunctions.digit3      = function(v) { return /^\d{1,3}$/.exec(v); }                    // integer 0-999.
validationFunctions.digit3Null  = function(v) { return /^\d{1,3}$|^$/.exec(v);}                  // integer 0-999 or Null.
validationFunctions.digit4      = function(v) { return /^\d{1,4}$/.exec(v); }                    // integer 0-9999.
validationFunctions.digit4Null  = function(v) { return /^\d{1,4}$|^$/.exec(v);}                  // integer 0-9999 or Null.
validationFunctions.digitGreaterThan0 = function(v) { return /^([1-9]|\d\d+)$/.exec(v); }        // integer greater than zero (but digits '01','001', etc. are allowed)
validationFunctions.digitBetween0And999 = function(v) { return /^[1-9]\d?\d?$/.exec(v); }        // integer greater than zero and less than 999
validationFunctions.digitBetween0And9999 = function(v) { return /^[1-9]\d?\d?\d?$/.exec(v); }        // integer greater than zero and less than 999

validationFunctions.ifloat      = function(v) { return /^[0-9]+$|^[0-9]+(\.[0-9]+$|\,[0-9]+$)/.exec(v); }        // validate float
validationFunctions.ifloatNull  = function(v) { return /^[0-9]+$|^[0-9]+(\.[0-9]+$|\,[0-9]+$)|^$/.exec(v); }     // validate float or Null

validationFunctions.pCodeCanada = function(v) { return /^\s*[a-zA-Z]\d[a-zA-Z]\s*\d[a-zA-Z]\d\s*$/.exec(v); }//validate postal code to format H1H1H1 or H1H 1H1

validationFunctions.chainChar = function (v) { return /^\w+$/.exec(v); }            // string with no special characters or numbers
validationFunctions.chainCharPlus = function (v) { return /^[\w\-\s]+$/.exec(v); }  // string with no special characters or numbers except _ - and space

validationFunctions.htmlTags   = function(v) { return !(/[<>]/.exec(v));}


validationFunctions.email       = function(v) { return /^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/.exec(v); }
validationFunctions.zeroOneDigit = function(v) { return /^[0-1]$/.exec(v); }                     // bit (0 or 1)
validationFunctions.none         = function(v) { return /^.*$/.exec(v); } // a value that can be used in XML form definition file to accommodate the <pattern> node
                                     // which requires a value but is not used because an Extender is providing the
                                     // complete validation process for a specific control.
                                     // the regExp accepts anything including empty string.


validationFunctions.floatFrom0To100 = function(v) 
{
    return (this.ifloat(v) && parseFloat(v) <= 100 && parseFloat(v) >= 0)
}

validationFunctions.dynamicNumericNull = function(v) 
{
    if(this.ifloatNull(v) && v != "") 
    {
        v = parseFloat(v.replace(",","."));
        return (v < 100000);
    }
    else if (v == "")
    {
        return true;
    } 
    else
    {
        return false;
    }
    
}

validationFunctions.dynamicNumeric = function(v)  
{ 
    return (this.dynamicNumericNull(v) && this.val(v)) 
}

// return true if all went well
function validateForm(theForm) {

    while(arrErrors.length > 0)
    {
        removeError(arrErrors.pop()[0].parentNode);
    }
    var elArr = theForm.elements;
    var blnResult = true;
    var blnErrorDisplayed = false;
    var firstError = false;
    var alertToShow = false;
    for (var i = 0; i < elArr.length; i++) {

        with (elArr[i]) {
        
            if (elArr[i].type.toLowerCase() == "hidden" ) //Do not remove this, it cause validation to take 10 seconds when ComponentArt is loaded
            {
                continue;
            }        
            
            
            if(elArr[i].type == "textarea") {
                LimitTextArea(elArr[i]);
            }
            
            // cannot use isMandatory as variable name because it already exists as part of
            // elArr[x]. Setting isMandatory while using with (elArr[i]) affects
            // elArr[i].isMandatory and not isMandatory.
            var b_isMandatory = false;
            
            if(HasMandatoryAttribute(elArr[i]))
            {
                b_isMandatory = IsMandatoryField(elArr[i]);
            }

            var v = elArr[i].getAttribute("validator");
            
            if (v) 
            {

                var alertUser = false;

                if (b_isMandatory && value == "")
                {
                    alertUser = true;
                }
                else if  (!b_isMandatory && value == "" && HasMandatoryAttribute(elArr[i]))
                {
                    alertUser = false;
                }
                else
                {
                    alertUser = !validationFunctions[v](value)
                }
            }
            else
            {
                alertUser = (b_isMandatory && value == "");
            }
            
            if (alertUser)
            {

                   

                showError(elArr[i],1);
                blnResult = false;

                // displays only the first error message for form
                if (!blnErrorDisplayed) {
                    if (typeof(msgDisplay) != "undefined"
                            && typeof(msgDisplay.contextMsg) != "undefined"
                            && typeof(msgDisplay.contextMsg[getAttribute("desc")]) != "undefined") {

                        alertToShow = msgDisplay.contextMsg[getAttribute("desc")];
                        blnErrorDisplayed = true;
                        firstError = elArr[i];
                    }
                }

            } 
            else 
            {
                // check required otherwise the error icon is remove at next form element
                // validation iteration.
                if(v || b_isMandatory )
                {
                        removeError(parentNode);
                }
            }
        }
    }

    for (i = 0; i < pageDefinedValidationFunctions.length; i++)
    {
        pageDefinedValidationFunctions[i]();
    }
    
    for (i = 0; i < arrErrors.length; i++)
    {
        blnResult = false;
        if(!blnErrorDisplayed)
        {
            alertToShow=arrErrors[i][1];
            blnErrorDisplayed = true;
            firstError = arrErrors[i][0];
        }

        showError(arrErrors[i][0],1)
        
    }
    
    
    if (firstError)
    {
        try // cheap way to trap the error
        {
            firstError.focus();
        }
        catch (ex)
        {
        }
    }
    if (alertToShow)
    {
        alert(alertToShow);
    }
    if (firstError)
    {
        try // cheap way to trap the error
        {
            firstError.focus();
        }
        catch (ex)
        {
        }
    }

    return blnResult;
 }
 
 function throwError(element,message)
 {
     arrErrors.push(Array(element,message))
 }
 
 function IsMandatoryField(el)
 {
    var att = el.getAttribute("isMandatory");
    if (att.toString().toLowerCase() == "false") return false; 
    return true;
 }
 
 function HasMandatoryAttribute (el)
 {
    return el.getAttribute("isMandatory") != null;
 }
 
 //this function allows for individual elements in the form to be validated instead all elements of the form at one time
 function  validateFormElement(formElement)
 {
    var validator = formElement.getAttribute("validator");
    //limit text area form elements
    if (formElement.type == "textarea")
        LimitTextArea(formElement);
    
    // if element does not have a validator return false
    if (!validator)
        return false;
    
    else
    {
    
        var validated = validationFunctions[validator](formElement.value);
        
        if(!validated)
        {
            alert(msgDisplay.contextMsg[formElement.getAttribute("desc")]);
            showError(formElement);
            return false;
        }
        else
        {
            removeError(formElement.parentNode);
        }
    }
    return true;
 }
 
 function LimitTextArea(theTextArea){
    var maxLength = getMaxLengthForElement(theTextArea);
    
    if (theTextArea.value.length > maxLength) {
        theTextArea.value = theTextArea.value.substr(0,maxLength);
    }
 }
 
function addValidationFunction(f)
{
pageDefinedValidationFunctions.push(f)
}
 
function removeError(node){
    for (var x=0; x < node.childNodes.length; x++)
        if (node.childNodes[x].id == "errImg")
        {
            var childToDelete = node.childNodes[x]
            node.removeChild(childToDelete)
        }
        else if (node.childNodes[x].childNodes.length > 0)
        {
            removeError(node.childNodes[x])
        }
}

function showWarning(element, sWarningText,withoutfocus){ showImage(element, "/client/img/Icons/MessageIcons/warning.gif", sWarningText,withoutfocus); }
function showError(element,withoutfocus)  { showImage(element, "/client/img/Manager/error.gif", "",withoutfocus); }

function showImage(element, strImg, sAltText, withoutfocus){
    var imgErr = document.createElement("img")
    imgErr.setAttribute('id','errImg')
    imgErr.setAttribute('src', strImg)
    imgErr.setAttribute('alt', sAltText)
    if (element.tagName == "TD") {
        if(!withoutfocus)
        {
            element.focus()
        }
        removeError(element)    
        element.appendChild(imgErr)
    } else {        
        if(!withoutfocus)
        {
            element.parentNode.focus()
        }
        removeError(element.parentNode) 
        element.parentNode.appendChild(imgErr)
    }
}
 
function compareDates(value1, value2) {
    //returns
    //0 if the dates are same 
    //-1 if the first one is an earlier date 
    //1 if the first one is a later date 

    var date1, date2;
    var month1, month2;
    var year1, year2;

    month1 = value1.substring (0, value1.indexOf ("/"));
    date1 =  value1.substring (value1.indexOf ("/")+1, value1.lastIndexOf ("/"));
    year1 =  value1.substring (value1.lastIndexOf ("/")+1, value1.length);

    month2 = value2.substring (0, value2.indexOf ("/"));
    date2 =  value2.substring (value2.indexOf ("/")+1, value2.lastIndexOf ("/"));
    year2 =  value2.substring (value2.lastIndexOf ("/")+1, value2.length);
    
    if   (parseInt(year1) > parseInt(year2)) return 1;
    else if (parseInt(year1) < parseInt(year2)) return -1;
    else if (parseInt(month1) > parseInt(month2)) return 1;
    else if (parseInt(month1) < parseInt(month2)) return -1;
    else if (parseInt(date1) > parseInt(date2)) return 1;
    else if (parseInt(date1) < parseInt(date2)) return -1;
    else return 0;
}


// ---- Credit card validation (mastercard, visa & amex) ----
//return true or false
function validateCardNumber(cardNumber,cardType)
{
  var isValid = false;
  var ccCheckRegExp = /[^\d ]/;
  isValid = !ccCheckRegExp.test(cardNumber);
    
  if (isValid)
  {
        var cardNumbersOnly = cardNumber.replace(/ /g,"");
        var cardNumberLength = cardNumbersOnly.length;
        var lengthIsValid = false;
        var prefixIsValid = false;
        var prefixRegExp;
    
        switch(cardType)
        {
          case "mastercard":
            lengthIsValid = (cardNumberLength == 16);
            prefixRegExp = /^5[1-5]/;
            break;
    
          case "visa":
            lengthIsValid = (cardNumberLength == 16 || cardNumberLength == 13);
            prefixRegExp = /^4/;
            break;
    
          case "amex":
            lengthIsValid = (cardNumberLength == 15);
            prefixRegExp = /^3(4|7)/;
            break;
    
          default:
            prefixRegExp = /^$/;
        }
        prefixIsValid = prefixRegExp.test(cardNumbersOnly);
        isValid = prefixIsValid && lengthIsValid;
  }
      
  if (isValid)
  {
        var numberProduct;
        var numberProductDigitIndex;
        var checkSumTotal = 0;
    
        for (digitCounter = cardNumberLength - 1; 
          digitCounter >= 0; 
          digitCounter--)
        {
              checkSumTotal += parseInt (cardNumbersOnly.charAt(digitCounter));
              digitCounter--;
              numberProduct = String((cardNumbersOnly.charAt(digitCounter) * 2));
              for (var productDigitCounter = 0;
                productDigitCounter < numberProduct.length; 
                productDigitCounter++)
              {
                checkSumTotal += 
                  parseInt(numberProduct.charAt(productDigitCounter));
              }
        }
    
        isValid = (checkSumTotal % 10 == 0);
  }
    
  return isValid;
}


        var NavEvent = new Object();
        NavEvent.key37 = true; // left
        NavEvent.key38 = true; // up
        NavEvent.key39 = true; // right
        NavEvent.key40 = true; // down
        NavEvent.key16 = true; // shift
        NavEvent.key17 = true; // ctrl
        NavEvent.key33 = true; // Page up
        NavEvent.key34 = true; // Page Down
        NavEvent.key35 = true; // End
        NavEvent.key36 = true; // Home
        NavEvent.key45 = true; // Insert
        NavEvent.key46 = true; // Delete
        NavEvent.key8 = true; // BackSpace



        function getMaxLengthForElement(Element){
            var maxLength = Element.getAttribute("maxlength");
            if (!maxLength) maxLength = 500;
            return maxLength;
        }



        //Even to use is onKeyDown
        function handleKPMaxLength(pDiv) {
            var maxLength = getMaxLengthForElement(pDiv);

			if (NavEvent["key" + event.keyCode]) {
				return true;
			}

			if (pDiv.value != undefined) {
				return (pDiv.value.length < maxLength);
			} else {
				return (pDiv.innerHTML.length < maxLength);
			}
        }
        

        //Even to use is onChange
        function handleOCMaxLength(pDiv) {
            var maxLength = getMaxLengthForElement(pDiv);
			
			if (pDiv.value != undefined) {
	            if (pDiv.value.length > maxLength) {
		            pDiv.value = pDiv.value.substr(0, maxLength);
			    }
			} else {
	            if (pDiv.innerHTML.length > maxLength) {
		            pDiv.innerHTML = pDiv.innerHTML.substr(0, maxLength);
			    }
			}

        }

        function convertInputToNumber(input, maximumNumber, numberOfDigitAfterDecimalPoint) {
            var num = input.value.replace(",", ".");
            if (!isNaN(num) && parseFloat(num) <= maximumNumber && parseFloat(num) >= 0) {
                input.value = parseFloat(num).toFixed(numberOfDigitAfterDecimalPoint);
            }
            else if(parseFloat(num) > maximumNumber) {
            input.value = parseFloat(maximumNumber).toFixed(numberOfDigitAfterDecimalPoint);
            }
            else {
                input.value = parseFloat(0).toFixed(numberOfDigitAfterDecimalPoint);
            }

        }
