addEvent(window,"load",formRegistration, true);
addEvent(window,"resize",clearErrors,true);
function formRegistration(){
    //alert("ValidateForm");
    var forms = document.getElementsByTagName("form");
    for (var i=0; i<forms.length; i++){
        if (forms[i].className=="validateForm"){
            var validation = new FormValidator(forms[i],"right");
        }
    }
    isFormRegistered = true;
}

/**
    
 * CONSTANTS

 */

var ICON_WIDTH = 20; //px
var ICON_HEIGHT = 20; //px
/**
 * Preload
 */
var isFormRegistered = false;
var ok = new Image();
ok.src = "/images/validate_form/correct.gif";

var error = new Image();
error.src = "/images/validate_form/error.gif";

var errPop = new Image();
errPop.src = "/images/validate_form/error_pop.png";

var errPop = new Image();
errPop.src = "/images/validate_form/working.gif";

/** THIS NEEDS TO BE FINISHED. THE IDEA IS TO KEEP THIS OBJECT A STATIC LIST OF ALL ERROR COPY SO THAT WE CAN PASS DIFFRENT ERROR COPY LISTS TO THE VALIDATE FORM OBJECT IN THE FUTURE **/

var errorMessages = {
    username:"Please enter your Username containing 5 to 15 characters.",
    password:"Please enter your Password.",
    passwordFormat:"Please note that your password should be 6 to 9 characters long, letters and numbers only and is case-sensitive.",
    confirmPassword:"Please re-enter your Password.",
    confirmPasswordNoMatch:"The password you have entered do not match.",
    accountNumber:"Please enter your Account Number.",
    hintQuestion:"Please enter your Reminder question.",
    hintAnswer:"Please enter your Reminder answer.",
    emailAddress:"Please enter your Email Address.",
    emailAddressFormat:"The email address you entered is not valid. Please enter a valid, correctly-formatted email address. <span style=\"color:#333333\">use@domain.com</span>",
    confirmEmailAddress:"The e-mail addresses you have entered do not match.",
    recipientEmails:"One or more recipient email addess are not valid. Please enter a valid, correctly-formatted email address. <span style=\"color:#333333\">use@domain.com</span>",
    firstName:"Please enter your First Name.",
    lastName:"Please enter your Last Name.",
    address1:"Please enter your Mailing Address 1.",
    city:"Please enter your City.",
    subdivisionCode:"Please enter your State.",
    postalCode:"Please enter your Zip code.",
    postalCodeFormat:"The zip code you entered is not valid. Please enter a valid zip code.",
    creditCardNumber:"Please enter your credit card number.",
    creditCardName:"Please enter the name on your credit card.",
    creditCardType:"Please select your Card Type.",
    creditCardExpireMonth:"Please enter your Expiration Date.",
    creditCardCCVCode:"Please enter your CCV Code.",
    paymentType:"Please choose your payment option.",
    affiliateCode:"Please enter your Pastor Code.",
    quantity:"Please enter your Number of Gift Cards between 1 and 100."
};


/**

 * FormValidator object is the form validation control per each form on a page.

 * @param {Object} form

 * @param {Object} requiredFieldsValidation

 */

function FormValidator(form,iconPosition){

    this.validationArray = ValidationDefinitionArray;

    this.form = form;

    this.icoPos = iconPosition;

    // Validates Each Field
    this.setFieldValidation();
    // Validates All Form fields
    this.setFormValidation();

}



FormValidator.prototype = {

    // Adds Final onSubmit validation to form

    setFormValidation: function(){

        this.form.getErrorList = getErrorList;

        this.form.onsubmit = ValidateForm;
    },

    // Adds onKeyup validation to all fields

    setFieldValidation: function(){

        var formFields = this.form.elements;

        for (var i = 0; i < formFields.length; i++) {

            if (this.validationArray[formFields[i].name]) {

                var eventType = "keyup";

                if (formFields[i].tagName == "SELECT"){

                    eventType = "change";

                }

                if (formFields[i].id == "") formFields[i].id = createID(); // Creates a generic id

                formFields[i].isValid = isValid;

                // Creating timers

                formFields[i].workingTimer = null;

                formFields[i].preFadeTimer = null;

                formFields[i].icoPos = this.icoPos;

                if (formFields[i].type != "radio") {

                    addEvent(formFields[i], eventType, ValidateField, true);

                    if (formFields[i].name == "cc_exp_mo") {

                        addEvent(formFields[i].form["cc_exp_yr"], "change", ValidateField, true);

                    }

                    else if (formFields[i].name == "creditCardExpireMonth") {

                        addEvent(formFields[i].form["creditCardExpireYear"], "change", ValidateField, true);

                    }

                }

                else {

                    if (formFields[i].name == "paymentType" && formFields[i].value != "credit") {

                        addEvent(formFields[i], "change", hideCreditFieldsErrors, true);

                    }

                }

            }

        }

    },

    setLabelsRequired:function(form, field){

        var labels = form.getElementsByTagName("label");

        for (var i = 0; i < labels.length; i++) {

            if (labels[i].getAttribute("for") == field.id) {

                labels[i].setAttribute("class","required");

            }

        }

    },

    setIconPosition:function(position){

        this.icoPos = position;

    }

}

function isValid(){

    // this == Field

    this.label = ValidationDefinitionArray[this.name][0];

    this.message = ValidationDefinitionArray[this.name][1];

    this.validationFunction = ValidationDefinitionArray[this.name][2];

    return this.validationFunction();

}

function getErrorList(){
    try{
        // this == form

        var errors = new Array();

        var formFields = this.elements;

        for (var i=0; i<formFields.length;i++){

            if (formFields[i].type != "hidden" &&                
                ValidationDefinitionArray[formFields[i].name]){
                
                if (formFields[i].isValid != undefined) {
                    
                    if(!formFields[i].isValid()){

                        // Review for radio buttons

                        if (formFields[i].type == "radio") {

                            var radios = formFields[i].form[formFields[i].name];

                            if (formFields[i] == radios[0]) {

                                for (var j = 0; j < radios.length; j++) {

                                    addEvent(radios[j], "change", ValidateField, false);

                                }

                                errors.push(radios[0]);

                            }

                        } 

                        else {
                            //alert(formFields[i].name);
                            errors.push(formFields[i]);

                        }

                    }

                }

            }

        }

        return errors;
    }catch(e){}
}

function ValidateField(e){
    try{
        var evt = new Event(e);

        var field = evt.target;

        if (field.type == "radio") {

            var radios = field.form[field.name];

            for (var j = 0; j < radios.length; j++) {

                removeEvent(radios[j], "change", ValidateField, false);

            }

            field = radios[0];

        } else if (field.name == "cc_exp_yr"){

            field =  field.form["cc_exp_mo"];

        } else if(field.name == "creditCardExpireYear"){

            field =  field.form["creditCardExpireMonth"];

        }

        clearTimeout(field.workingTimer);

        displayWorking(field);

        field.workingTimer = setTimeout("doFieldValidation('" + field.id + "')", 800);
    }catch(e){}
}



function doFieldValidation(id){
    try{
        var field = $(id);

        if (!field.isValid()) {

            displayFieldError(field);

        } else {

            displayFieldCorrect(field);

        }
    }catch(e){}
}



/**

 * Field Specific Error Message

 * @param {Object} form

 */

function displayWorking(field){
    try{
        clearTimeout(field.preFadeTimer);

        var label = $(field.id + "_err");

        if (!label) {

            label = $c("label");

            label.setAttribute("for", field.id);

            label.id = field.id + "_err";

            $t("body").item(0).appendChild(label);

            positionIcons(label,field);

        }

        label.style.opacity=10;

        label.style.filter="alpha(opacity=100)";

        label.className="working";
    }catch(e){}
}

var ids = 0;

function createID(){

    var id = "genericid_" + ids;

    ids ++;

    return id;

}



function positionIcons(icon,field){
    try{
        var pos = findPosition(field);

        icon.style.top = pos[1] + "px";



        if (field.icoPos.toLowerCase() == "left"){

            icon.style.left = (pos[0]-(ICON_WIDTH + 2)) + "px";

        }

        else {

            icon.style.left = (pos[0]+field.offsetWidth + 2) + "px";

        }
    }catch(e){}

}



function displayFieldError(field){
    
    try{
        var label = $(field.id + "_err");

        label.className="error";

        removeEvent(label, "click", displayErrorMsgPopup, false);

        addEvent(label,"click",displayErrorMsgPopup,false);
    }catch(e){}

}



function clearErrors(formElement,fieldNameErrorsArray){
    try{
    
        var id = null;

        if (fieldNameErrorsArray) {

            for (var i = 0; i <fieldNameErrorsArray.length;i++) {
                
                var el = formElement[fieldNameErrorsArray[i]];
                if (el!= undefined) {
                    if (el.length > 1 && el.tagName == undefined){

                        for (var j=0; j<el.length;j++){

                            if (el[j].name == fieldNameErrorsArray[i]){

                                id = el[j].id + "_err";

                                break;

                            }

                        }

                    } else {

                        id = formElement[fieldNameErrorsArray[i]].id + "_err";

                    }



                    if ($(id)) {

                        $(id).parentNode.removeChild($(id));

                    }

                }

            }

        }

        var labels = $t("label");

        for (var i=0; i<labels.length;i++){

            if (labels[i].className=="error"){

                positionIcons(labels[i],$(labels[i].getAttribute("for")));

            }

        }
    } catch(e){
       // alert("ERROR: " + e);
    }

}

function hideCreditFieldsErrors(e){
    try{
        var evt = new Event(e);

        var form = evt.target.form;

        clearErrors(form, new Array("cc_type", "cc_name", "cc_number", "cc_exp_mo", "cc_code"));

        clearErrors(form, new Array("creditCardType", "creditCardName", "creditCardNumber", "creditCardExpireMonth", "creditCardCCVCode"));
    }catch(e){}
}



function displayFieldCorrect(field){
    try{
        var label = $(field.id + "_err");

        label.className = "correct";

        field.preFadeTimer = setTimeout("fadout('"+label.id+"',100)",800);

        removeEvent(label, "click", displayErrorMsgPopup, false);
    }catch(e){}
}



function ValidateForm(e){
    try{
        var evt = new Event(e);

        var errors = evt.target.getErrorList();

        if(errors.length>0){

            // Display Field Error Message

            displayAlertMessage(errors);

            return false;

        }
    }catch(e){}
    return true;
    
}



/**

 * 

 * @param {Object} errorList

 */

function displayAlertMessage(errorList){

    var msg = "Oops! \n\nWe have detected one or more errors on this form. Please take the time to correct them.\n\n";

    for (var i = 0; i<errorList.length; i++){

        msg += " - " + errorList[i].message + "\n";

        displayWorking(errorList[i]);

        doFieldValidation(errorList[i].id);

        errorList[i].workingTimer = setTimeout("doFieldValidation('"+errorList[i].id+"')",1);
        errorList[0].focus();
    }

    alert(msg);

}





/**

 * Default Validaiton scripts

 * This is an object that contains all the methods that will validate the indivitual fields

 */

var defaultFormFieldValidation = {

    validateInput:function(){

        if(defaultFormFieldValidation.isEmpty(this.value, this.label)){

            return false;

        } else {

            if (!defaultFormFieldValidation.isValidChar(this.value)){

                this.message = "only valid characters will be accepted.";

                return false;

            } 

        }

        return true;

    },

    validateSelect:function(){

        if(this.selectedIndex < 1){

            return false;

        }

        return true;

    },

    validateRadioArray:function(){

        var radioArray = this.form[this.name];

        if(!defaultFormFieldValidation.getRadioSelectedValue(radioArray)){

            return false;

        }

        return true;

    },

    validatePostalCode:function(){
        if(defaultFormFieldValidation.isEmpty(this.value, this.label)){
            return false;
        } else {
            if (!defaultFormFieldValidation.isValidChar(this.value)){
                return false;
            } 

            if(!defaultFormFieldValidation.isValidZipCodeFormat(this.value)){
                this.message = errorMessages.postalCodeFormat;
                return false;
            }
        }

        return true;

    },

    validateEmailAddress:function(){
       if(defaultFormFieldValidation.isEmpty(this.value, this.label)){
            return false;
        } else {
            if (!defaultFormFieldValidation.isValidChar(this.value)){
                return false;
            } 
            if(!defaultFormFieldValidation.isValidEmailAddressFormat(this.value)){
                this.message = errorMessages.emailAddressFormat;
                return false;
            }
        }
        return true;
    },

    validateConfEmailAddress:function(){
        if(defaultFormFieldValidation.isEmpty(this.value, this.label)){
            return false;
        } else {
            if (this.value!=this.form["bill_email"].value){
                return false;
            } 
        }
        return true;
    },
    
    validateMultipleEmailAddress:function(){
        if(defaultFormFieldValidation.isEmpty(this.value, this.label)){
            return false;
        }else{
             var emails = this.value.split(",");
             for (var i=0; i<emails.length; i++){
                if(!defaultFormFieldValidation.isEmpty(emails[i], this.label)){
                    var tempObj = {};
                    tempObj.value = Trim(emails[i]);
                    if(!defaultFormFieldValidation.validateEmailAddress.call(tempObj)){
                        return false;
                    }
                }
             }
        }
        return true;
    },
    isValidFreshAddress:function(email){
        // Run the Fresh Address request if there is a response, display it, else display entered value.
        
        if (email != fa_responseObj.email){
            fa_responseObj = {}; //Resetting obj to null;
            exeAjaxCall("POST", email);

            //Wait 5000 ms before doing cancelling the loop
            var date = new Date();
            var curDate = null;       
            do{
                //if Ajax returns an error object
                if (fa_responseObj.email != ""){
                    return false;
                }
                curDate = new Date();
            } while(curDate-date < 5000);
        }
        
        return true;
    },

    validateCCType:function(){

        if (defaultFormFieldValidation.isPaymentOptionValid(this) != false){

            if (this.selectedIndex < 1)

                return false;

        } 

        return true;

    },

    validateCCName:function(){

        if (defaultFormFieldValidation.isPaymentOptionValid(this) != false){

            if (defaultFormFieldValidation.isEmpty(this.value, this.label)){

                return false;

            }else{

                if (!defaultFormFieldValidation.isValidChar(this.value)) {

                    return false;

                }

            }

        }

        return true;

    },

    validateCCNumber:function(){

        if (defaultFormFieldValidation.isPaymentOptionValid(this) != false){

            return defaultFormFieldValidation.isValidCCNumber(this.value);

        }

        return true;

    },

    validateCCDate:function(){

        if (defaultFormFieldValidation.isPaymentOptionValid(this) != false){

            var year;

            if (this.form["cc_exp_yr"] != undefined)

                year = this.form["cc_exp_yr"];

            else if (this.form["creditCardExpireYear"] != undefined)

                    year = this.form["creditCardExpireYear"];

            if (!defaultFormFieldValidation.isValidDate(defaultFormFieldValidation.createDate((year.value), (this.value-1)))){

                return false;

            }

        }

        return true;

    },

    validateUsername:function(){

        if (defaultFormFieldValidation.isEmpty(this.value, this.label)){
            return false;
        }else{
            var regEx = /^[a-zA-Z0-9_\.]{5,15}$/
            if (this.value.match(regEx)){
                return true;
            }
        }

        return false;

    },
    
    validatePassword:function(){
    
            if (defaultFormFieldValidation.isEmpty(this.value, this.label)){
                return false;
            }else{
                var regEx = /^[a-zA-Z0-9]{6,9}$/
                if (!this.value.match(regEx)){
                    this.message = errorMessages.passwordFormat;
                    return false;
                }
            }
            return true;
            
    
    },

    validateConfPassword:function(){

            if(defaultFormFieldValidation.isEmpty(this.value, this.label)){

                return false;

            } else {

                if (this.value!=this.form["password"].value){

                    this.message = errorMessages.confirmPasswordNoMatch;

                    return false;

                } 

            }

            return true;

    },

    validateQte:function(){

        if (defaultFormFieldValidation.isValidNumeric(this.value)){

            if (this.value >=1 && this.value <=100){

                return true;

            }

        }

        return false;

    },

    validateAffiliateCode:function(){

         if(defaultFormFieldValidation.isEmpty(this.value, this.label)){

            return false;

        } else{

            return true;

        }

    },

    isEmpty:function(value, label){

         if(value==null|| Trim(value)=="" || value==label){

            return true;

         }

         return false;

    },

    isValidZipCodeFormat:function(number){

        if(defaultFormFieldValidation.isValidPostalCodeFormat(number)) {

            return true;

        } else if(defaultFormFieldValidation.isValidZipCodeFormatLong(number) || defaultFormFieldValidation.isValidZipCodeFormatShort(number)) {

            return true;

        }

        return false;

    },

    isValidZipCodeFormatShort:function(number) {

        var regEx = /^[0-9]{5}$/

        if (number.match(regEx)){

            return true;

        }

        return false;

    },

    isValidZipCodeFormatLong:function(number) {

        var regEx = /^[0-9]{5}[-][0-9]{4}$/

        if (number.match(regEx)){

            return true;

        }

        return false;

    },

    isValidPostalCodeFormat:function(number) {

        var regEx = /^[a-zA-Z][0-9][a-zA-Z][ -]?[0-9][a-zA-Z][0-9]$/

        if (number.match(regEx)){

            return true;

        }

        return false;

    },

    isValidEmailAddressFormat:function(email){
        var regEx = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9_.-]+[.][a-zA-Z][a-zA-Z]+$/

        if (email.match(regEx)){
            return true;
        }
        return false;
    },

    isValidCCNumber:function(number){

        if(number.match(/^[0-9]+$/)){

            return true;

        } else {

            return false;

        }

    },

    isValidNumeric:function(number){

        if(number.match(/^[0-9]+$/)){

            return true;

        } else {

            return false;

        }

    },

    isValidDate:function(date){

        var today = new Date();

        if (date>today){

            return true;

        }else{

            return false;

        }

    },

    getRadioSelectedValue:function(radioArray){

        for (var i=0;i<radioArray.length;i++){

            if (radioArray[i].checked)

                return radioArray[i].value;

        }

        return null;

    },

    isPaymentOptionValid:function(field){

        if (field.form["paymentType"]){

            // RadioButton

            if (defaultFormFieldValidation.getRadioSelectedValue(field.form["paymentType"])=="credit"){

                return true;

            }

        } else {

            // No Radio Buttons

            var ccType;

            if (field.form["cc_type"])

                ccType = field.form["cc_type"];

            else if(field.form["creditCardType"])

                ccType = field.form["creditCardType"];

            

            if (ccType){

                if(ccType.value =="" || ccType.value > 0 ){

                    return true;

                }

            }

        }

        return false;

    },

    createDate:function(year, month){

        var date = new Date();
        
        if(year.length == 2){
            year = "20" + year;
        }

        date.setFullYear(year,month,01);

        return date;

    },

    isValidChar:function(value){

    var invalidRegExList = new Array();

    value = value.toUpperCase(); 

    invalidRegExList.push(/DECLARE /); //DECLARE

    invalidRegExList.push(/CHAR\(/); //CHAR(

    invalidRegExList.push(/CAST\(/); //CAST(

    invalidRegExList.push(/EXEC\(/); //EXEC(

    invalidRegExList.push(/DROP\(/); //DROP(

    invalidRegExList.push(/SELECT \(/); //SELECT

    invalidRegExList.push(/"/);

    invalidRegExList.push(/'/);

    invalidRegExList.push(/;/);



    invalidRegExList.push(/\(/);



    for (var i=0; i<invalidRegExList.length;i++){

        if(value.search(invalidRegExList[i])!= -1){

            return false;

        }

    }

    return true;

}

}



/**

 * ValidationDefinitionArray

 */

var ValidationDefinitionArray = {

    username:new Array("Username", errorMessages.username,defaultFormFieldValidation.validateUsername),
    password:new Array("Password", errorMessages.password,defaultFormFieldValidation.validatePassword), // Password format RD.com
    confirmPassword:new Array("Password", errorMessages.confirmPassword,defaultFormFieldValidation.validateConfPassword), // Password format RD.com
    accountNumber:new Array("Account Number", errorMessages.accountNumber ,defaultFormFieldValidation.validateInput), 
    hintQuestion:new Array("Reminder question", errorMessages.hintQuestion,defaultFormFieldValidation.validateInput),
    hintAnswer:new Array("Reminder answer", errorMessages.hintAnswer,defaultFormFieldValidation.validateInput),
    bill_first_name:new Array("First Name", errorMessages.firstName,defaultFormFieldValidation.validateInput),
    bill_last_name:new Array("Last Name", errorMessages.lastName,defaultFormFieldValidation.validateInput),
    bill_address1:new Array("Mailing Address 1", errorMessages.address1,defaultFormFieldValidation.validateInput),
    bill_city:new Array("City", errorMessages.city,defaultFormFieldValidation.validateInput),
    subdivisionCode:new Array("State", errorMessages.subdivisionCode,defaultFormFieldValidation.validateSelect),
    bill_postalCode:new Array("Zip", errorMessages.postalCode,defaultFormFieldValidation.validatePostalCode),
    bill_email:new Array("Email", errorMessages.emailAddress,defaultFormFieldValidation.validateEmailAddress),
    confirmEmailAddress:new Array("Confirm Email", errorMessages.confirmEmailAddress ,defaultFormFieldValidation.validateConfEmailAddress),
    creditCardNumber:new Array("Credit Card Number", errorMessages.creditCardNumber,defaultFormFieldValidation.validateCCNumber),
    creditCardName:new Array("Name on Card", errorMessages.creditCardName,defaultFormFieldValidation.validateCCName),
    creditCardType:new Array("Card Type", errorMessages.creditCardType,defaultFormFieldValidation.validateCCType),
    creditCardExpireMonth:new Array("Expiration month", errorMessages.creditCardExpireMonth,defaultFormFieldValidation.validateCCDate),
    creditCardCCVCode:new Array("CCV Code", errorMessages.creditCardCCVCode,defaultFormFieldValidation.validateCCNumber),
    paymentType: new Array("Payment Option", errorMessages.paymentType, defaultFormFieldValidation.validateRadioArray),
    affiliateCode:new Array("Pastor Code", errorMessages.affiliateCode,defaultFormFieldValidation.validateAffiliateCode),
    quantity:new Array("Number of Gift Cards", errorMessages.quantity,defaultFormFieldValidation.validateQte),
    donorEmail:new Array("Your Email", errorMessages.emailAddress,defaultFormFieldValidation.validateEmailAddress),
    recipientEmails:new Array("Recipients Email", errorMessages.recipientEmails,defaultFormFieldValidation.validateMultipleEmailAddress),
    setField:function(fieldName, fieldLabel, errorMsg, validationFunction){
        var label = fieldLabel || "";
        var msg = errorMsg || "";
        this[fieldName] = new Array(label, msg, validationFunction);
    },
    setFieldByArray:function(fieldsArray){
        for (var i=0; i<fieldsArray.length(); i++){
            this.setField(fieldsArray[0],fieldsArray[1],fieldsArray[2],fieldsArray[3]);
        }
    }
}

//Trims spaces left and right of a string

function Trim(str){

    str = str.replace(/^[ \t\n\r\f\v]*/,'');

    str = str.replace(/[ \t\n\r\f\v]*$/,'');

    return str;

}





var fade;

function fadout(id, alpha){
    try{
        var el = $(id);

        el.style.opacity=(alpha/100);

        el.style.filter="alpha(opacity="+alpha+")";

        alpha-=5;

        if (alpha < 0) {

            clearInterval(fade);

            el.parentNode.removeChild(el);

        }else{

            fade = setTimeout("fadout('"+ id +"',"+alpha+")",10);

        }
    }catch(e){}
}



var popoutTimer;

function popout(xPos,yPos, msg){
    var maxWidth = 260;
    var maxHeight = 46;
    var maxFrames = 50; //number of iterations
    var interval = 10; // in Miliseconds
    var tweenWidth = maxWidth / maxFrames;
    var tweenHeight = maxHeight / maxFrames;
    var pop = $("errpop");
    var ieFix = $c("iframe");

    if (pop == null) {
        pop = $c("div");
        pop.id = "errpop";
        $t("body").item(0).appendChild(pop);
        pop.style.display = "none"
    }



    if (pop.style.display == "none") {
        pop.style.display = "block";
        pop.innerHTML = "";
        pop.style.width = 0+"px";
        pop.style.height = 0+"px";
        pop.style.left = xPos+ "px";
        pop.style.top = (yPos-pop.offsetHeight)+"px";
        addEvent(pop,"click",hideErrorMsgPopup,false);
        popoutTimer = setInterval("popout("+xPos+","+yPos+","+msg+")",interval);

    } else{

        if ((pop.offsetWidth + tweenWidth) >= maxWidth) {
            pop.style.width = maxWidth + "px";
            pop.style.height = maxHeight + "px";
            pop.style.top = (yPos - pop.offsetHeight) + "px";
            //pop.innerHTML = msg;
            pop.appendChild(document.createTextNode(msg));
            pop.appendChild(ieFix);
            clearInterval(popoutTimer);

        } else if ((pop.offsetHeight+tweenHeight) >= maxHeight){
            pop.style.width = (pop.offsetWidth + tweenWidth) +"px";
        } else {
            pop.style.width = (pop.offsetWidth + tweenWidth) +"px";
            pop.style.height = (pop.offsetHeight + tweenHeight) +"px";
            pop.style.top = (yPos-pop.offsetHeight)+"px";

        }

    }

}

function displayErrorMsgPopup(e){

    var evt = new Event(e);

    var pos = findPosition(evt.target);

    var field = $(evt.target.getAttribute("for"));

    var errorPop = $("errpop");

    if (errorPop)

        errorPop.style.display="none";

    popout(pos[0]-2,(pos[1]),"'"+field.message+"'");

    var eventType = "keyup";

    if (field.tagName == "SELECT"){

        eventType = "change";

    }

    addEvent(field,eventType,hideErrorMsgPopup,false);

}



function hideErrorMsgPopup(e){

    var evt = new Event(e);

    removeEvent(evt.target,evt.type,hideErrorMsgPopup,false);

    clearInterval(popoutTimer);

    $("errpop").style.display="none";

}



function getFirstFieldByName(name){

    var form = this;

    var el = form[name];

    var fields = new Array();

    if (el.length > 1 && el.tagName == undefined){

        for (var j = 0; j < el.length; j++) {

            if (el[j].name == name) {

                fields.push(el[j]);

            }

        }

        el = fields;

    }

    return el;

}

/*** Fresh Address check script - start ***/ 
//HttpRequest Object as per client browser
var systemTimeinMillis = 0;
var count = 0;
var timeElapsed = 0;
var fa_responseObj={};

function exeAjaxCall(method, email){
    var userEmail = email;
    //Sending Ajax Request
    var Ajax =  new net.ContentLoader("/rd1/surprise/fa_response.jsp",checkFAResponse,null,method,"email=" + userEmail);
    //return true;
}
function checkFAResponse(){   
    var req=this;
    var ready=req.readyState;
    if (ready == net.READY_STATE_COMPLETE){
        var httpStatus=req.status;
        if (httpStatus==200 || httpStatus==0){
            var xmlDoc = req.responseText;                       
            if(xmlDoc){             
                parseFAResponse(xmlDoc);
            }
        }
    }
} //checkFAResponse()

function parseFAResponse(faResponse){                       
    var strFA_Responses = faResponse.match(/<FA_VALID>.*<\/FA_VALID>/);  
    
    var isValid = strFA_Responses.toString().match(new RegExp("no|yes"));
    
    if (isValid == "yes"){
        isValid = 1;
    } else {
        isValid = 0;
    }

    var suggestedEmail = faResponse.match(new RegExp("<FA_SEMAIL>.*<\/FA_SEMAIL>"));
    suggestedEmail = suggestedEmail.toString().substring(11, (suggestedEmail.toString().length-12));
    
    var comment = faResponse.match(/<FA_COMMENT>.*<\/FA_COMMENT>/);
    comment = comment.toString().substring(12, (comment.toString().length-13));

    
    fa_responseObj.isValid = isValid;
    fa_responseObj.suggestedEmail = suggestedEmail;
    fa_responseObj.comment = comment;
    fa_responseObj.email = document.forms[0].bill_email.value;
    
    logResponse(isValid,comment,suggestedEmail, 1);
}
var logResponses = new Array();
var strFA_Responses;
var attempt_num = 0;

function logResponse(fa_valid,fa_comment,fa_semail, semail_used){
    var fa_response = document.getElementById("fa_response");
    var responseStr = "";
    
    // User did not take the previous entry
    if(logResponses.lenght > 0){
        if (logResponses[logResponses.length -1].semail_used < 2){
            logResponses[logResponses.length -1].semail_used = 0;
        }
    }
    // If there is no sugested email semail_used is N/A
    if(fa_semail == ""){
        semail_used = 2;
    }
    
    logResponses.push({attempt_num:attempt_num, fa_valid:fa_valid, fa_comment:fa_comment, fa_semail:fa_semail, semail_used:semail_used});  
    
    
    for (var i=0; i< logResponses.length; i++){
        responseStr += logResponses[i].attempt_num + ";";
        responseStr += logResponses[i].fa_valid + ";";
        responseStr += logResponses[i].fa_comment + ";";
        responseStr += logResponses[i].fa_semail + ";";
        responseStr += logResponses[i].semail_used + "|";
    }
    
    fa_response.value = responseStr;
    attempt_num++;
}

function isEmpty(emailId) {             
    if ((emailId==null)
        ||
        ((emailId.length)==0)) {
        alert("Please provide email address");
        return true;
    } else { return false; }
}   


/**
 * @author pversai
 */
var net = new Object();
net.READY_STATE_UNINITIALIZED=0;
net.READY_STATE_LOADING=1;
net.READY_STATE_LOADED=2;
net.READY_STATE_INTERACTIVE=3;
net.READY_STATE_COMPLETE=4;

net.ContentLoader = function (url,onload,onerror,method,parameters){
    this.url=url;
    this.req=null;
    this.onload=onload;
    this.onerror=(onerror)? onerror : this.defaultError;
    this.loadXMLDoc(url,method,parameters);
}

net.ContentLoader.prototype = {
    loadXMLDoc:function(url,method,parameters){
        if(window.XMLHttpRequest){
            this.req=new XMLHttpRequest();
        }else if (window.ActiveXObject){
            this.req=new ActiveXObject("Microsoft.XMLHTTP");
        }
        if(this.req){
            try{
                var loader=this;
                this.req.onreadystatechange=this.onload;
                if (method == "POST") {
                    this.req.open("POST", url, true);
                    this.req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                    this.req.setRequestHeader("Content-length", parameters.length);
                    this.req.setRequestHeader("Connection", "close");
                    this.req.send(parameters);
                }
                else {
                    this.req.open("GET", url, true);
                    this.req.send(null);
                }
            }catch(err){
                alert(err);
                this.onerror.call(this);
            }
        }
    },
    onReadyState:function(){
        var req=this.req;
        var ready=req.readyState;
        if (ready == net.READY_STATE_COMPLETE){
            var httpStatus=req.status;
            if (httpStatus==200 || httpStatus==0){
                this.onload.call(this);
            }else{
                this.onerror.call(this);
            }
        }
    },
    defaultError:function(){
        alert("error fetching data!"
            + "\n\nreadyState: " + this.req.readyState
            + "\nstatus: " + this.req.status
            + "\nheaders: " + this.req.getAllResponseHeaders());
    }
}

/*** Fresh Address check script - end ***/ 