﻿function addValidation(answerElemID, question, answer)
{
    var rules = "";
    var msgError = question.QuestionError;
    var messages = {};
            
    //add any custom validation here
    
    //TODO:
    //-----------------------------------------------------------------------------------
    // 1. Radio with Text. Make sure text is filled in when a radio with text is checked
    //
    switch(question.AnswerTypeName)
    {
        case "Date":
            
            if (!hasValue(msgError))
            {
                switch(question.AnswerTypeExtra)
                {
                    case "UK":
                        $("#"+answerElemID).rules("add", "gftae_dateUK");
                        break;
                    
                    default:
                        $("#"+answerElemID).rules("add", "gftae_dateUS");
                        break;
                }
            }
            else
            {
                switch(question.AnswerTypeExtra)
                {
                    case "UK":
                        jQuery.validator.addMethod("gftae_dateUK"+answerElemID, function(value, element) {
                            return this.optional(element) || rxDateUK.test(value);
                        }, msgError);
                        
                        $("#"+answerElemID).rules("add", "gftae_dateUK"+answerElemID);
                        break;
                    
                    default:
                        jQuery.validator.addMethod("gftae_dateUS"+answerElemID, function(value, element) {
                            return this.optional(element) || rxDateUS.test(value);
                        }, msgError);
                        
                        $("#"+answerElemID).rules("add", "gftae_dateUS"+answerElemID);
                        break;
                }
            }            
            
            break;
           
        case "MultiDate":        
            //use localization to determine date validation
            var dtRules = gftApp._dateFormat.split("/");
            $("#"+answerElemID).rules("add", "gftae_date_" + dtRules[answerElemID.split("_")[4]]);                        
            break;

        case "Phone":
            var country = answer;

            if (answerElemID.substring(answerElemID.length - 1) == 0) {
                if (!hasValue(msgError)) {
                    switch (country) {
                        case "JP":
                            $("#" + answerElemID).rules("add", "gftae_JpPhoneCountryCode");
                            break;
                        default:
                            $("#" + answerElemID).rules("add", "gftae_phoneCountryCode");
                            break;
                    }
                }
                else {
                    switch (country) {
                        case "JP":
                            jQuery.validator.addMethod("gftae_JpPhoneCountryCode", function(value, element) {
                                value = $.trim(value);
                                return (this.optional(element) || rxPhoneCountryCode.test(value)) && value.length < 5;
                            }, msgError);

                            $("#" + answerElemID).rules("add", "gftae_JpPhoneCountryCode" + answerElemID);
                            break;
                        default:
                            jQuery.validator.addMethod("gftae_phoneCountryCode", function(value, element) {
                                value = $.trim(value);
                                return (this.optional(element) || rxPhoneCountryCode.test(value)) && value.length < 4;
                            }, msgError);

                            $("#" + answerElemID).rules("add", "gftae_phoneCountryCode" + answerElemID);
                            break;
                    }

                }
            }
            else if (answerElemID.substring(answerElemID.length - 1) == 1) {
                if (!hasValue(msgError)) {
                    switch (country) {
                        case "US":
                            $("#" + answerElemID).rules("add", "gftae_USPhone");
                            //$("#" + answerElemID).mask("(999)999-9999");
                            break;
                        case "AU":
                            $("#" + answerElemID).rules("add", "gftae_USPhone");
                            //$("#" + answerElemID).mask("(99)99999999");
                        default:
                            $("#" + answerElemID).rules("add", "gftae_phone");
                            break;
                    }
                }
                else {
                    switch (answer) {
                        case "US":
                            jQuery.validator.addMethod("gftae_USPhone", function(value, element) {
                                value = value.replace(/[-' '().]/g, "");
                                return (this.optional(element) || value.match(rxPhone1US)) && value.length < 11;
                            }, msgError);
                            //$("#" + answerElemID).mask("(999)999-9999");
                            break;
                        case "AU":
                            jQuery.validator.addMethod("gftae_USPhone", function(value, element) {
                                value = value.replace(/[-' '().]/g, "");
                                return (this.optional(element) || value.match(rxPhone1US)) && value.length < 11;
                            }, msgError);
                            //$("#" + answerElemID).mask("(99)99999999");
                            break;
                        default:
                            jQuery.validator.addMethod("gftae_USPhone", function(value, element) {
                                return (this.optional(element) || rxPhone1US.test(value));
                            }, msgError);

                            $("#" + answerElemID).rules("add", "gftae_phone" + answerElemID);
                            break;
                    }
                }
            }
            else {
                if (!hasValue(msgError)) {
                    $("#" + answerElemID).rules("add", "gftae_phone");
                }
                else {
                    Query.validator.addMethod("gftae_phone" + answerElemID, function(value, element) {
                        return this.optional(element) || rxPhone.test(value);
                    }, msgError);

                    $("#" + answerElemID).rules("add", "gftae_phone" + answerElemID);
                }
            }

            break;

        case "SocialSecurity":
            $("#" + answerElemID).unmask();
            if (!hasValue(msgError)) {
                if (answer == "corporate" || answer == "corporate_llc") {
                    $("#" + answerElemID).rules("add", "gftae_TaxID");
                    $("#" + answerElemID).mask("99-9999999");
                }
                else {
                    $("#" + answerElemID).rules("add", "gftae_SSN");
                    $("#" + answerElemID).mask("999-99-9999");
                }
            }
            else {
                if (answer == "corporate" || answer == "corporate_llc") {
                    jQuery.validator.addMethod("gftae_TaxID" + answerElemID, function(value, element) {
                        return this.optional(element) || rxSocialSecurity.test(value);
                    }, msgError);

                    $("#" + answerElemID).rules("add", "gftae_TaxID" + answerElemID);
                    $("#" + answerElemID).mask("99-9999999");
                }
                else {
                    jQuery.validator.addMethod("gftae_SSN" + answerElemID, function(value, element) {
                        return this.optional(element) || rxSocialSecurity.test(value);
                    }, msgError);

                    $("#" + answerElemID).rules("add", "gftae_SSN" + answerElemID);
                    $("#" + answerElemID).mask("999-99-9999");
                }
            }
            break;

        case "TextOnly":
        if (!hasValue(msgError)) {
            $("#" + answerElemID).rules("add", "gftae_TextOnly");
        }
        else {
            jQuery.validator.addMethod("gftae_TextOnly" + answerElemID, function(value, element) {
                return this.optional(element) || rxTextOnly.test(value);
            }, msgError);

            $("#" + answerElemID).rules("add", "gftae_TextOnly" + answerElemID);
        }
        
            //$("#" + answerElemID).mask("a*");
            break;
        case "Number":           
            if (!hasValue(msgError))
            {
                $("#"+answerElemID).rules("add", "gftae_numeric");
            }
            else
            {
                jQuery.validator.addMethod("gftae_numeric"+answerElemID, function(value, element) {               
                    return this.optional(element) || rxNumeric.test(value);
                }, msgError);
            
                $("#"+answerElemID).rules("add", "gftae_numeric"+answerElemID);
            }
            break;

        case "MultiNumber":
            if (!hasValue(msgError))
            {
                $("#"+answerElemID).rules("add", "gftae_numeric");
            }
            else
            {
                jQuery.validator.addMethod("gftae_numeric"+answerElemID, function(value, element) {               
                    return this.optional(element) || rxNumeric.test(value);
                }, msgError);
            
                $("#"+answerElemID).rules("add", "gftae_numeric"+answerElemID);
            }
            break;

        case "MultiZipCode":
            if (!hasValue(msgError)) {
                $("#" + answerElemID).rules("add", "gftae_numeric");
            }
            else {
                jQuery.validator.addMethod("gftae_numeric" + answerElemID, function(value, element) {
                    return this.optional(element) || rxNumeric.test(value);
                }, msgError);

                $("#" + answerElemID).rules("add", "gftae_numeric" + answerElemID);
            }
            break;          
            
        case "Currency":
            if (!hasValue(msgError))
            {
                $("#"+answerElemID).rules("add", "gftae_currency");
            }
            else
            {
                jQuery.validator.addMethod("gftae_currency"+answerElemID, function(value, element) {
                    return this.optional(element) || rxCurrency.test(value);
                }, msgError);
            
                $("#"+answerElemID).rules("add", "gftae_currency"+answerElemID);
            }                       
            break;

        case "Percent":
            if (!hasValue(msgError))
            {
                $("#"+answerElemID).rules("add", "gftae_percent");  
            }
            else
            {
                jQuery.validator.addMethod("gftae_percent"+answerElemID, function(value, element) {
                    return this.optional(element) || rxPercent.test(value);
                }, msgError);
            
                $("#"+answerElemID).rules("add", "gftae_percent"+answerElemID);
            }              
            break;
                                                
        case "Passport":
        
            if (!hasValue(msgError))
            {
                switch(question.AnswerTypeExtra)
                {
                    case "UK":
                        $("#"+answerElemID).rules("add", "gftae_passport_uk");
                        break;
                    
                    default:
                        $("#"+answerElemID).rules("add", "gftae_passport_international");
                        break;
                } 
            }
            else
            {
                switch(question.AnswerTypeExtra)
                {
                    case "UK":
                        jQuery.validator.addMethod("gftae_passport_uk"+answerElemID, function(value, element) {
                            return this.optional(element) || rxPassportUK.test(value);
                        }, msgError);
                        
                        $("#"+answerElemID).rules("add", "gftae_passport_uk"+answerElemID);
                        break;
                    
                    default:
                        jQuery.validator.addMethod("gftae_passport_international"+answerElemID, function(value, element) {
                            return this.optional(element) || rxPassportInternational.test(value);
                        }, msgError);
                        
                        $("#"+answerElemID).rules("add", "gftae_passport_international"+answerElemID);
                        break;
                }
            }                
            break;
                        
        case "Email":
            if (!hasValue(msgError))
            {
                $("#"+answerElemID).rules("add", "gftae_email");
            }
            else
            {
                jQuery.validator.addMethod("gftae_email"+answerElemID, function(value, element) {    
                    return this.optional(element) || rxEmail.test(value);
                }, msgError);
                
                $("#"+answerElemID).rules("add", "gftae_email"+answerElemID);
            }
            break;
   
        case "Checkbox":            
            //for checkboxes we want to validate each checkbox individually
            //if one of them contains IsRequired on the Answer Level
            //if not we can use the Question level IsRequired
            //
            //only use this if we have more than 1 checkbox
            //           
            if ( question.RequiredName != "None" )
            {
                if ( question.AnswerLength > 1)
                {
                    //TODO: find out how many checkboxes must be checked to pass
                    //      validation. tblRequired
                    var elem = "#"+answerElemID;
                    var minLength = 1;
                    $("#"+answerElemID).rules("add", {required:true, 
                                                      minlength: minLength,
                                                      messages:{                                                        
                                                            required: jQuery.format("You must select at least {0} option(s).", minLength),
                                                            minlength: jQuery.format("Please, select at least {0} option(s).", minLength)
                                                        }
                                                      });
                }
                else //use this when we have only 1 checkbox
                {
                    $("#"+answerElemID).rules("add", "required");
                }
            }
                        
            if ( (answer.IsRequired) )
            {                   
                //if any checkbox has is specifically required, we will no longer
                //use Group Validation on the checkbox
                // you can either validate the entire group OR
                // validate each individual chekbox but not both
                $("#"+answerElemID).rules("remove", "required minlength");
                $("#"+answerElemID).rules("add", "required");
                                 
            }
            break;
            

        case "ShortDate":
            
            if (!hasValue(msgError))
            {               
                $("#"+answerElemID).rules("add", "gftae_shortdate");                       
            }
            else
            {
                jQuery.validator.addMethod("gftae_shortdate"+answerElemID, function(value, element) {
                    return this.optional(element) || rxShortDate.test(value);
                }, msgError);
                
                $("#"+answerElemID).rules("add", "gftae_shortdate"+answerElemID);           
            }            
            
            break;
                             
        case "DropDown":
            if (!hasValue(msgError))
            {
                $("#"+answerElemID).rules("add", "gftae_dropdown");
            }
            else
            {
                jQuery.validator.addMethod("gftae_dropdown"+answerElemID, function(value, element) {    
                    return this.optional(element) || !rxDropDown.test(value);
                }, msgError);
                
                $("#"+answerElemID).rules("add", "gftae_dropdown"+answerElemID);
            }            
            break;
            
        default:
            if (hasAttribute(question.AnswerTypeExtra, "applicationid"))
            {
                //make sure we force a guid in this field
                if (!hasValue(msgError))
                {
                    $("#"+answerElemID).rules("add", "gftae_applicationid");
                }
                else
                {
                    jQuery.validator.addMethod("gftae_applicationid"+answerElemID, function(value, element) {    
                        return this.optional(element) || rxApplicationId.test(value);
                    }, msgError);
                    
                    $("#"+answerElemID).rules("add", "gftae_applicationid"+answerElemID);
                }
            }
            break;      
    }
    
    //apply any required validation. Checkboxes are special (See above)
    if ( (question.RequiredName != "None") && question.AnswerTypeName != "Checkbox")
    {   
        messages = {};
        if (hasValue(msgError))
        {
            messages = {required: msgError};                    
        }

        $("#"+answerElemID).rules("add", {required: true, 
                                        messages: messages
                                    });
                
        //$("label[for='" + $("#"+answerElemID).attr("id") + "']").addClass("required");
        //$("#"+answerElemID).rules("add", "required");
    }
    
    //setup any special verification based on tblQuestionLink
    //these actions should all return some sort of validation message
    //and should not actually run any sort of functions and stuff to modify data    
    jQuery.each(question.ActionList, function(index, item)
    {
        switch(item.QuestionLinkActionCode)
        {              
            case "SHOWERROR":
                $("#"+answerElemID).rules("add", {"gftae_SHOWERROR": item,
                    messages: {gftae_SHOWERROR:translate(item.ActionTextValue)}
                });
                break;

            default:
                break;                
        }
    });    
}

var rxDateUS = /^\d{2}\/\d{2}\/\d{4}$/;
var rxDateUK = /^\d{2}\/\d{2}\/\d{4}$/;
var rxDateTwoDigit = /^\d{2}$/;
var rxDateFourDigit = /^\d{4}$/;
var rxShortDate = /^\d{2}\/\d{4}$/;

var rxDateDay = /^(0[1-9]|[12][0-9]|3[01])$/;
var rxDateMonth = /^(0[1-9]|1[012])$/;
var rxDateYear = /^(19|20)\d\d$/;

var rxEmail = /^(([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+([;.](([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}){1,25})+)*$/;
//var rxPhone = /^[+]?(\d{1,5})?(-| )?((\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;

var rxNumeric = /^[-+]?(\d|,)*\.?\d*$/;
var rxCurrency = /^(\d|-)?(\d|,)*\.?\d*$/;
var rxPercent = /^-?[0-9]{0,2}(\.[0-9]{1,2})?$|^-?(100)(\.[0]{1,2})?$/;
var rxZipCodeUK = /^(([A-Z]{1,2}[0-9][0-9A-Z]{0,1})\ ([0-9][A-Z]{2}))|(GIR\ 0AA)$/;
var rxZipCodeUS = /^\d{5}(-\d{4})?$/;
var rxPassportUK = /^[0-9]{10}(-| )?GBR(-| )?[0-9]{7}(-| )?[U,M,F]{1}(-| )?[0-9]{7}(-| )?[0-9]{2}$/;
var rxPassportInternational = /^[A-Z0-9<]{9}(-| )?[0-9]{1}(-| )?[A-Z]{3}(-| )?[0-9]{7}(-| )?[U,M,F]{1}(-| )?[0-9]{7}(-| )?[A-Z0-9<]{14}(-| )?[0-9<]{1}(-| )?[0-9<]{1}$/;
var rxDropDown = /^0$/;
var rxApplicationId = /^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$/;
var rxSocialSecurity = /^(\d{3})-?\d{2}-?\d{4}$/;
var rxTaxID = /^(\d{2})-?\d{7}$/;
//var rxPhone1US = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;
var rxPhone1US = /^[0-9]*$/;
var rxPhone = /^[+]?[0-9()\-\. ]*$/;
var rxPhoneUK = /^[+]?[0-9()\-\. ]*$/;
var rxPhoneCountryCode = /^[0-9]*$/;
var rxTextOnly = /^[a-zA-Z]*$/;

function addValidators() {
    jQuery.validator.addMethod("gftae_TextOnly", function(value, element) {
    return this.optional(element) || rxTextOnly.test(value);
    }, "Please enter valid text only"); 

    jQuery.validator.addMethod("gftae_USPhone", function(value, element) {
        value = value.replace(/[-' '().]/g, "");
        return (this.optional(element) || value.match(rxPhone1US)) && value.length < 11;
        //return this.optional(element) || (value.match(rxPhone1US)  || value.test("(___)___-____"));
    }, translate("VALID_PHONENUMBER"));

    jQuery.validator.addMethod("gftae_phoneCountryCode", function(value, element) {
        value = $.trim( value );
        return (this.optional(element) || rxPhoneCountryCode.test(value)) && value.length < 4;
    }, translate("VALID_PHONENUMBER"));

    jQuery.validator.addMethod("gftae_JpPhoneCountryCode", function(value, element) {
        value = $.trim(value);
        return (this.optional(element) || rxPhoneCountryCode.test(value)) && value.length < 5;
    }, translate("VALID_PHONENUMBER"));

    jQuery.validator.addMethod("gftae_phone", function(value, element) {
        return this.optional(element) || rxPhone.test(value);
    }, translate("VALID_PHONENUMBER"));

    jQuery.validator.addMethod("gftae_phoneUK", function(value, element) {
        return this.optional(element) || rxPhoneUK.test(value);
    }, translate("VALID_PHONENUMBER"));

    jQuery.validator.addMethod("gftae_TaxID", function(value, element) {
    return this.optional(element) || rxTaxID.test(value);
    }, "Please Enter a valid Tax ID"); 

    jQuery.validator.addMethod("gftae_SSN", function(value, element) {
    return this.optional(element) || rxSocialSecurity.test(value);
    }, "Please Enter a valid SSN" );

    jQuery.validator.addMethod("gftae_dateUS", function(value, element) {    
        return this.optional(element) || rxDateUS.test(value);
    }, translate("VALID_DATE"));

    jQuery.validator.addMethod("gftae_date_dd", function(value, element) {    
        return this.optional(element) || rxDateDay.test(value);
    }, translate("VALID_DATE"));
    
    jQuery.validator.addMethod("gftae_date_mm", function(value, element) {    
        return this.optional(element) || rxDateMonth.test(value);
    }, translate("VALID_DATE"));
    
    jQuery.validator.addMethod("gftae_date_yyyy", function(value, element) {    
        return this.optional(element) || rxDateYear.test(value);
    }, translate("VALID_DATE"));
            
    jQuery.validator.addMethod("gftae_dateUK", function(value, element) {    
        return this.optional(element) || rxDateUK.test(value);
    }, translate("VALID_DATE"));

    jQuery.validator.addMethod("gftae_shortdate", function(value, element) {    
        return this.optional(element) || rxShortDate.test(value);
    }, translate("VALID_SHORTDATE"));
    
    jQuery.validator.addMethod("gftae_email", function(value, element) {    
        return this.optional(element) || rxEmail.test(value);
    }, translate("VALID_EMAIL"));

    jQuery.validator.addMethod("gftae_numeric", function(value, element) {        
        return this.optional(element) || rxNumeric.test(value);
    }, translate("VALID_NUMBER"));

    jQuery.validator.addMethod("gftae_currency", function(value, element) {
        return this.optional(element) || rxCurrency.test(value);
    }, translate("VALID_CURRENCY"));

    jQuery.validator.addMethod("gftae_percent", function(value, element) {
        return this.optional(element) || rxPercent.test(value);
    }, translate("VALID_PERCENTAGE"));

    jQuery.validator.addMethod("gftae_zipcode_uk", function(value, element) {
        return this.optional(element) || rxZipCodeUK.test(value);
    }, translate("VALID_ZIPCODE"));

    jQuery.validator.addMethod("gftae_zipcode_us", function(value, element) {
        return this.optional(element) || rxZipCodeUS.test(value);
    }, translate("VALID_ZIPCODE"));

    //passports
    jQuery.validator.addMethod("gftae_passport_uk", function(value, element) {
        return this.optional(element) || rxPassportUK.test(value);
    }, translate("VALID_PASSPORT"));

    //must match
    //012345678-1-GBR-5011025-M-0810050-<<<<<<<<<-2-9
    //M030858<<-1-GRC-9999999-F-0310228-A123123<<-3-9
    jQuery.validator.addMethod("gftae_passport_international", function(value, element) { 
        return this.optional(element) || rxPassportInternational.test(value);
    }, translate("VALID_PASSPORTINTL"));
    
    jQuery.validator.addMethod("gftae_dropdown", function(value, element) {
        return this.optional(element) || !rxDropDown.test(value);
    }, translate("VALID_DROPDOWN"));
    
    jQuery.validator.addMethod("gftae_datetwodigit", function(value, element) {    
        return this.optional(element) || rxDateTwoDigit.test(value);
    }, translate("VALID_DATE"));
    
    jQuery.validator.addMethod("gftae_datefourdigit", function(value, element) {    
        return this.optional(element) || rxDateFourDigit.test(value);
    }, translate("VALID_DATE"));
    
    jQuery.validator.addMethod("gftae_applicationid", function(value, element) {
        return this.optional(element) || rxApplicationId.test(value);
    }, translate("VALID_APPNUMBER"));
}

/*********************************************************************************
 custom action validations for handling database validation actions
**********************************************************************************/


//If it matches a specific value show an error message
jQuery.validator.addMethod("gftae_SHOWERROR", function(value, element, param) {    
    if ($(element).attr("type") == "radio")
    {    
        return this.optional(element) || parseInt($("input[name='"+ $(element).attr("name")+"']:checked").val()) == param.MatchIntValue;
    }
    else
    {
        return this.optional(element) || value == param.MatchIntValue;
    }
});

//extra validation/actions based on database
function addActions(actionList)
{    
    var elemType;
    var answerElemId;
    var bindaction;
     //setup any special verification based on tblQuestionLink
    jQuery.each(actionList, function(index, item)
    {      
   
        elemType = $("input[name=answer_"+item.QuestionID+"_"+item.QuestionGroupID+"]").attr("type");
        answerElemId = "answer_"+item.QuestionID+"_"+item.QuestionGroupID;      

        if (elemType == "radio" || item.AnswerTypeName == "Radio" ||
            elemType == "checkbox" || item.AnswerTypeName == "Checkbox")  //onClick for radio
        {
            bindaction = "change click";
        }
        else if (elemType == "dropdown" || item.AnswerTypeName == "DropDown")
        {
            bindaction = "change";            
        }
        else
        {
            if ($.browser.msie)
            {
                bindaction = "keydown change";
            }
            else
            {
                bindaction = "change";
            }
        }
        
        var match;
        
        switch(item.QuestionLinkActionCode)
        {
            case "SETVALUE":
                
                // SETVALUE is sort of the oddball out as far as actions go, so it's a very special case.
                
                // reset the elemType/answerElemId becuase the target of the SETVALUE is a different question
                // than the item.QuestionID. It's the LinkedQuestionID that will be se we used different items to set values here
                answerElemId = "answer_"+item.LinkedQuestionID+"_"+item.LinkedQuestionGroupID;
                
                
                //this is specific to setting the country code when we change a dropdown. It's own special case really
                if (item.ActionTextValue.indexOf("getCountryCode") != -1)
                {
					//2010-05-13 vshin: Read the linked value from the database and set the action only if the value is null:
					var dbValue = gftApp.verifyApplicantResponse(item.LinkedQuestionID);
					if (dbValue[0] == null)
					{
						answerElemId += "_phone_0";
						elemType = $("input[name="+answerElemId+"]").attr("type");
	                                               
						if ($("input[name=" + answerElemId + "]").length > 0)
						{
							$("input[name=" + answerElemId + "]").val(executeFunction(item, null));
						}                    
	                
						$(getInputToBindTo("answer_"+item.QuestionID+"_"+item.QuestionGroupID, item.AnswerTypeName)).bind(bindaction, function(args) {
							var answerElemId = "answer_"+item.LinkedQuestionID+"_"+item.LinkedQuestionGroupID+"_phone_0";
	                        
							if ($("input[name=" + answerElemId + "]").length > 0)
							{
								$("input[name=" + answerElemId + "]").val(executeFunction(item, null));
							}                       
						}); 
					}
                }
                else
                {
                    elemType = $("input[name="+answerElemId+"]").attr("type");
                        
                    if ( isFunction(item.ActionTextValue) )
                    {
                        if (elemType == "radio" || item.AnswerTypeName == "Radio")
                        {                        
                            $("#" + answerElemId + "_" + (executeFunction(item, null)).toString()).attr("checked", true);
                        }
                        else
                        {
                            $("input[name=" + answerElemId + "]").val(executeFunction(item, null));
                        }
                    }
                    else
                    {
                        if (elemType == "radio" || item.AnswerTypeName == "Radio")
                        {
                            $("#" + answerElemId + "_" + item.ActionIntValue+"").attr("checked", true);
                        }
                        else
                        {
                            $("input[name=" + answerElemId + "]").val(item.ActionTextValue);
                        }
                    }
                }
                break;
                
            case "ENABLEQSTGRP":
                match = findMatch(item, elemType, answerElemId);
                //this affects and entire group so always put the action in the queue
                gftApp.addActionToQueue(item);               
                
                $(getInputToBindTo(answerElemId, item.AnswerTypeName)).bind(bindaction, function(args) {                                         
                    //dropdowns are treated special
                    if (args.target.nodeName == "OPTION")
                    {
                        argtype = "select-one"; 
                        argname = args.target.parentNode.name;    
                    }
                    else
                    {
                        argtype = args.target.type;
                        argname = args.target.name;
                    }
                        
                    var match = findMatch(item, argtype, argname);
                    if ( match[0] )
                    {
                        gftApp.fireAction(item, match[1]);
                    }
                });             
               
                break;

            case "DISABLEQSTGRP":
                match = findMatch(item, elemType, answerElemId);
                //this affects and entire group so always put the action in the queue
                gftApp.addActionToQueue(item);
                
                $(getInputToBindTo(answerElemId, item.AnswerTypeName)).bind(bindaction, function(args) {
                    //dropdowns are treated special
                    if (args.target.nodeName == "OPTION")
                    {
                        argtype = "select-one"; 
                        argname = args.target.parentNode.name;    
                    }
                    else
                    {
                        argtype = args.target.type;
                        argname = args.target.name;
                    }
                        
                    var match = findMatch(item, argtype, argname);
                    if ( match[0] )
                    {
                        gftApp.fireAction(item, match[1]);
                    }
                });              
               
                break;   
                
            case "ROUTEENGINEV3":
            case "ROUTEAPPLICATION":                
                //we used different items to set values here
                answerElemId = "answer_"+item.QuestionID+"_"+item.QuestionGroupID;
            
                //tap into the autocomplete object.
                switch (item.AnswerTypeName)                
                {
                    case "AutoComplete":                        
                        $("#" + answerElemId).result(function(event, data, formatted) {                    
                            if (data)
                            {
                                gftApp.fireAction(item, data.country);                            
                            }
                        });
                        break;
                        
                    default:                    
                        //bind the action based on the type (See above)                              
                        $(getInputToBindTo(answerElemId, item.AnswerTypeName)).bind(bindaction, function(args) {                        
                            //dropdowns are treated special
                            if (args.target.nodeName == "OPTION")
                            {
                                argtype = "select-one"; 
                                argname = args.target.parentNode.name;    
                            }
                            else
                            {
                                argtype = args.target.type;
                                argname = args.target.name;
                            }
                            
                            var data = $("#" + argname).val();
                            if (data != "0")
                            {                            
                                gftApp.fireAction(item, $("#" + argname).val());
                            }
                        }); 
                        break;
                }
                
                break;                   
            //
            // Since most instances we'll be comparing string values, make this the default 
            //      we'll be using a lot of GUIDs, that's why we chose string as default
            //
            default:            
               match = findMatch(item, elemType, answerElemId);
               if ( item.QuestionLinkActionCode == "ENABLEQST" || item.QuestionLinkActionCode == "DISABLEQST" ||
                     item.QuestionLinkActionCode == "SHOWQST" || item.QuestionLinkActionCode == "HIDEQST" ||
                     item.QuestionLinkActionCode == "SHOWQSTGRP" || item.QuestionLinkActionCode == "HIDEQSTGRP" ||
                     item.QuestionLinkActionCode == "ENABLEANSWER" || item.QuestionLinkActionCode == "DISABLEANSWER" ||
                     item.QuestionLinkActionCode == "ENABLEREQUIRED" || item.QuestionLinkActionCode == "DISABLEREQUIRED" )
                {
                    //if we found a match and the element we are affecting exists on the screen
                    //then do it now
                    if ( $("#"+match[1]).length > 0 )
                    {
                        if ( match[0] )
                        {
                            gftApp.fireAction(item, match[1]);
                        }
                    }
                    else //otherwise queue this action up for later
                    {
                        gftApp.addActionToQueue(item);
                    }                 
                }
                else
                {
                    if ( match[0] )
                    {
                        gftApp.fireAction(item, match[1]);
                    }                  
                }                
                
                //tap into the autocomplete object                
                if (item.AnswerTypeName == "AutoComplete")
                {
                    //auto complete uses a different method to attach an event
                    //so we don't pass Args like the others. We have to manually set our
                    //elemType and answerElemId or we'll get bad data
                    $("#"+item.QuestionID).result(function(event, data, formatted) {                                      
                        if (data)
                        {
                            var et = $("input[name=answer_"+item.QuestionID+"_"+item.QuestionGroupID+"]").attr("type");
                            var eid = "answer_"+item.QuestionID+"_"+item.QuestionGroupID;
                            
                            var match = findMatch(item, et, eid);
                            if ( match[0] )
                            {
                                gftApp.fireAction(item, match[1]);
                            }
                        }
                    });
                }
                else
                {
                    //bind the action based on the type (See above)                              
                    $(getInputToBindTo(answerElemId, item.AnswerTypeName)).bind(bindaction, function(args) {                     
                        //dropdowns are treated special
                        if (args.target.nodeName == "OPTION")
                        {
                            argtype = "select-one"; 
                            argname = args.target.parentNode.name;
                        }
                        else
                        {
                            argtype = args.target.type;
                            argname = args.target.name;
                        }
                            
                        var match = findMatch(item, argtype, argname);
                        if ( match[0] )
                        {
                            gftApp.fireAction(item, match[1]);
                        }
                    });
                }
              
                break;                  
        }
        
        return true;
    });
}

/******************************************************************************
 pararmeter:
    oAction     = object with all the action information
    elemType    = the type of element we are looking for the value 
                    of (radio, checkbox, etc.)
    elemID      = ID of the element
                        
//TODO: put in checks for all elemTypes we might use
******************************************************************************/
function findMatch(oAction, elemType, elemID)
{
    var match = new Array(false, null);
    
    //dropdown boxes are not registering with $("input[name="+elemID+"]")
    
    var sInput, bFoundInput;
    
    if (hasValue(oAction) && oAction.AnswerTypeName == "Description")   
    {
    //if the question is only of type Description then there will 
    //not be an input. Just see if this question exists here   
        if ( $("#" + oAction.QuestionID).length > 0 )
        {
            sInput = $("#" + oAction.QuestionID);
            bFoundInput = true;
        }
        else
        {
            bFoundInput = false;
        } 
    }
    else
    {         
        if ( $("input[name="+elemID+"]").length > 0 )
        {
            sInput = "input[name="+elemID+"]";
            bFoundInput = true;
        }
        else if ( $("#"+elemID).length > 0 ) //dropdown list
        {
            sInput = "#"+elemID;
            bFoundInput = true;
        }
        else
        {
            bFoundInput = false;
        }        
    }
    
    if ( bFoundInput )
    {
        if ( isFunction(oAction.ActionTextValue) )
        {
            match[0] = executeFunction(oAction, getOnScreenInputValue(sInput));
        }
        else
        {
            if (hasValue(oAction.MatchIntValue))
            {
                match[0] = oAction.MatchIntValue == parseInt(getOnScreenInputValue(sInput));
            }
            else
            {
                match[0] = oAction.MatchTextValue == getOnScreenInputValue(sInput);
            }
        }                              
    }
    else   //find the answer in the database if the element with the answer isn't on the screen
    { 
        var dbValue = gftApp.verifyApplicantResponse(oAction.QuestionID);       
        
        /*****************************************************************
         ** dbValue[0] == the value of the question
         ** dbValue[1] == the typeof of question (checkbox, radio, dropdown, etc)
        *****************************************************************/              
        switch(dbValue[1])
        {        
            case "Radio":
                if ( isFunction(oAction.ActionTextValue) )
                {
                    match[0] = executeFunction(oAction, parseInt(dbValue[0]) );
                }
                else
                {
                    match[0] = oAction.MatchIntValue == parseInt(dbValue[0]);
                }
                break;
            
            case "AccountType":
                if ( isFunction(oAction.ActionTextValue) )
                {
                    match[0] = executeFunction(oAction, parseInt(dbValue[0]) );
                }
                else
                {
                    match[0] = oAction.MatchIntValue == parseInt(dbValue[0]);
                }
                break;
                
            case "Number":
                if ( isFunction(oAction.ActionTextValue) )
                {
                    match[0] = executeFunction(oAction, parseInt(dbValue[0]) );
                }
                else
                {
                    match[0] =  oAction.MatchIntValue == parseInt(dbValue[0]);
                }
                break;
            
            case "Checkbox":
                if ( isFunction(oAction.ActionTextValue) )
                {                
                    match[0] = executeFunction(oAction, dbValue[0]);
                }
                else
                {
                    match[0] = $.inArray((oAction.MatchIntValue).toString(), dbValue[0].split(gftae_delimiter)) != -1;
                }
                break;

            case "MultiText":               
                if ( isFunction(oAction.ActionTextValue) )
                {
                    match[0] = executeFunction(oAction, dbValue[0].split(gftae_delimiter)[0] );
                }
                else
                {
                    match[0] = oAction.MatchTextValue == dbValue[0].split(gftae_delimiter)[0];
                }
                break;
            
            case "MultiNumber":
                if ( isFunction(oAction.ActionTextValue) )
                {
                    match[0] = executeFunction(oAction, dbValue[0].split(gftae_delimiter)[0] );
                }
                else
                {
                    match[0] = oAction.MatchIntValue.toString() == dbValue[0].split(gftae_delimiter)[0];
                }
                break;
                
            case "Phone":
                if ( isFunction(oAction.ActionTextValue) )
                {
                    match[0] = executeFunction(oAction, dbValue[0].split(gftae_delimiter)[0] );
                }
                else
                {
                    match[0] = oAction.MatchIntValue.toString() == dbValue[0].split(gftae_delimiter)[0];
                }
                break;
                
            case "DropDown":
                //dropdowns can be countries or states and sometimes will have a guid or text value
                //normally, a dropdown has an int value
                    
                if ( isFunction(oAction.ActionTextValue) )
                {
                    if (hasValue(oAction.MatchTextValue))
                    {
                        match[0] = executeFunction(oAction, dbValue[0]);
                    }
                    else
                    {                    
                        match[0] = executeFunction(oAction, parseInt(dbValue[0]));
                    }
                }
                else
                {                    
                    if (hasValue(oAction.MatchTextValue))
                    {
                        match[0] = oAction.MatchTextValue == dbValue[0];
                    }
                    else
                    {
                        match[0] = oAction.MatchIntValue == parseInt(dbValue[0]);
                    }
                }
                break;                

            default:
                if ( isFunction(oAction.ActionTextValue) )
                {
                    match[0] = executeFunction(oAction, dbValue[0]);
                }
                else
                {                
                    match[0] = oAction.MatchTextValue == dbValue[0];
                }
                break;
        }                
    }
    
    //figure out what field to return so we have the proper data
    // Question: Should we put this information in the database?
    switch (oAction.QuestionLinkActionCode)
    {
        case "DISABLESTEP":
            match[1] = oAction.LinkedStepID;
            break;

        case "ENABLESTEP":
            match[1] = oAction.LinkedStepID;
            break;
            
        case "SHOWERROR":
            match[1] = oAction.ActionTextValue;
            break;  
                       
        case "REDIRECT":            
            match[1] = oAction.ActionTextValue;
            break;
            
        case "REDIRECTCONFIRM":            
            match[1] = oAction.ActionTextValue;
            break;
                                    
        case "ENABLEQST":
            match[1] = oAction.LinkedQuestionID;
            break;
            
        case "DISABLEQST":
            match[1] = oAction.LinkedQuestionID;
            break;
            
        case "SHOWQST":
            match[1] = oAction.LinkedQuestionID;
            break;
            
        case "HIDEQST":
            match[1] = oAction.LinkedQuestionID;
            break;            
            
        case "ENABLEQSTGRP":
            match[1] = oAction.LinkedQuestionGroupID;
            break;
            
        case "DISABLEREQUIRED":
            match[1] = oAction.LinkedQuestionID;
            break;
            
        case "ENABLEREQUIRED":
            match[1] = oAction.LinkedQuestionID;
            break;
                        
        case "DISABLEQSTGRP":
            match[1] = oAction.LinkedQuestionGroupID;
            break;
            
        case "SHOWQSTGRP":
            match[1] = oAction.LinkedQuestionGroupID;
            break;
            
        case "HIDEQSTGRP":
            match[1] = oAction.LinkedQuestionGroupID;
            break;              

        case "REDIRECTCONFIRM":            
            match[1] = oAction.ActionTextValue;
            break;

        case "ROUTEENGINEV3":            
            match[1] = oAction.ActionTextValue;
            break;
            
        default:
            match[1] = oAction.ActionIntValue;
            break;                       
    }
           
    return match;
}

