/*
see swafcjquery-README.txt for help
*/
var swafc = {}; //new namespace
swafc.$ = jQuery.noConflict(true); //used to prevent conflicts with other javascript libraries

function HideHtmlObjects() {
    var formFields = document.getElementsByTagName("input");
    for (i = 0; i < formFields.length; i++) {
        formFields[i].disabled = true;
    }
    var selectFields = document.getElementsByTagName("select");
    for (i = 0; i < selectFields.length; i++) {
        selectFields[i].disabled = true;
    }
    var links = document.getElementsByTagName("a");
    for (i = 0; i < links.length; i++) {
        if (links[i].id != "printwindowlink" && links[i].id != "closewindowlink") {
            links[i].removeAttribute("href");
            links[i].style.color = "gray";
        }
    }
}
function HideMessages() {
    if (swafc.$("span.message-error").length !== 0) {
        swafc.$("span.message-error").animate({ opacity: "hide", height: "hide" }, "slow"); return false;
    }
    if (swafc.$("span.message-info").length !== 0) {
        swafc.$("span.message-info").animate({ opacity: "hide", height: "hide" }, "slow"); return false;
    }
}
function ShowRefresh() {
    swafc.$("div.refreshScale").animate({ opacity: "show", height: "show" }, "slow");
}
/*HELPER FUNCTIONS*/
function GetCurrentUrl() { return window.location.pathname; }
function StripOutQueryStringFromUrl(url) {
    if (url.indexOf('?') == -1) {
        return "";
    }
    else {
        return url.substring(url.indexOf('?') + 1);
    }
}
function GetCurrentUrlQuery() {
    return StripOutQueryStringFromUrl(window.location.href);
}
function StripOutBaseUrlFromUrl(url) {
    if (url.indexOf('?') == -1) {
        return url;
    }
    else {
        return url.substring(0, url.indexOf('?'));
    }
}
function QueryStringToStruct(queryString) {
    var objURL = {};
    queryString.replace(
   new RegExp("([^?=&]+)(=([^&]*))?", "g"),
   function ($0, $1, $2, $3) {
       objURL[$1] = $3;
   }
   );
    return objURL;
}
function QueryStringToStructNoCase(queryString) {
    var objURL = {};
    queryString.replace(
   new RegExp("([^?=&]+)(=([^&]*))?", "g"),
   function ($0, $1, $2, $3) {
       objURL[$1.toLowerCase()] = $3;
   }
  );
    return objURL;
}
function StructToQueryString(urlQueryStringStruct) {
    var urlString = "";
    for (var strKey in urlQueryStringStruct) {
        if (0 === 0) {
            urlString += strKey + "=" + urlQueryStringStruct[strKey] + "&";
        }
    }
    return urlString.substring(0, urlString.length - 1);
}
function GetCurrentInputsAsStruct(target) {
    var inputFieldsStruct = {};
    swafc.$.each(swafc.$(target + " .includeItem"), function (e, element) {
        if (element.value) {
            if (element.type == "radio" && !element.checked) { /*do nothing*/ }
            else if (element.type == "checkbox" && !element.checked) { /*do nothing*/ }
            else if (element.type == "select" && !element.selected) { /*do nothing*/ }
            else {
                inputFieldsStruct[element.name] = element.value;
            }
        }
    });
    return inputFieldsStruct;
}
function IsVariableInQueryStringStruct(variableName, queryStringStruct) {
    if (queryStringStruct[variableName.toLowerCase()] === undefined) {
        return false;
    }
    else {
        return true;
    }
}

String.prototype.ReplaceAll = function (stringToFind, stringToReplace) {
    var temp = this;
    var index = temp.indexOf(stringToFind);
    while (index != -1) {
        temp = temp.replace(stringToFind, stringToReplace);
        index = temp.indexOf(stringToFind);
    }
    return temp;
}

/*FUNCTION FOR REDIRECTION AFTER MODAL FORM SUBMIT*/
function CreateNewQueryString(queryStringStruct, target) {
    var fieldsQueryString = StructToQueryString(GetCurrentInputsAsStruct(target));
    var fieldsQueryStringStruct = QueryStringToStructNoCase(fieldsQueryString);
    var queryStringArray = StructToQueryString(queryStringStruct).split("&");
    var uniqueQueryStringArray = [];
    var keyValuePair = "";

    for (i = 0; i < queryStringArray.length; i++) {
        keyValuePair = queryStringArray[i].split("=");
        if (!IsVariableInQueryStringStruct(keyValuePair[0], fieldsQueryStringStruct)) {
            uniqueQueryStringArray.push(queryStringArray[i]);
        }
    }

    if (fieldsQueryString.length > 0) {
        fieldsQueryString = "&" + fieldsQueryString;
    }

    return uniqueQueryStringArray.join("&") + fieldsQueryString;
}
function RedirectToUrl(target) {
    var redirectUrl = swafc.$("input[name='submitUrl']").val();
    var url;
    if (redirectUrl === undefined) {
        //Run Default behavior
        url = GetCurrentUrl() + "?" + CreateNewQueryString(QueryStringToStruct(GetCurrentUrlQuery()), target);

    }
    else {
        //Append to redirectUrl
        url = StripOutBaseUrlFromUrl(redirectUrl) + "?" + CreateNewQueryString(QueryStringToStruct(StripOutQueryStringFromUrl(redirectUrl)), target);
    }

    return url;
}

//JQuery code...
swafc.$(document).ready(function () {
    /*PRINTER FRIENDLY*/
    swafc.$("<ul class=\"grid_10 clearthis printcontrols listlinkstobuttons\"><li><a href=\"javascript:window.print();\" id=\"printwindowlink\">Print</a></li><li><a href=\"javascript:window.close();\" id=\"closewindowlink\">Close Window</a></li></ul>").prependTo("#myprintwindow");
    var headContents = swafc.$("head")[0].innerHTML;
    var popupOptions = "toolbar=no,location=no,directories=no,menubar=yes,scrollbars=yes,width=800,height=600,left=100,top=25";
    swafc.$("a.printPageLink").click(function (e) {
        e.preventDefault();
        var pWindow = window.open('', 'PrintWindow', popupOptions);
        var html = '<html><head>' + headContents + ' <link href="/_styles/print.css" rel="stylesheet" type="text/css" media="all" /><link href="/_styles/printcontrols.css" rel="stylesheet" type="text/css" media="print" /></head><body onload=\"javascript:focus();HideHtmlObjects();\""><div id="myprintwindow" class="container_12">' + swafc.$('<div />').append(swafc.$('#printerFriendlyBody').clone()).html() + '</div></body></html>';
        pWindow.document.open();
        pWindow.document.write(html);
        pWindow.document.close();

        return false;

    });
    /*END: PRINTER FRIENDLY*/

    /*STYLING*/
    swafc.$("a[disabled]").addClass("disable");

    setTimeout(HideMessages, 10000);
    swafc.$("<a href=\"#\" class=\"redClose\" alt=\"Close\"></a>").appendTo("span.message-error");
    swafc.$("<a href=\"#\" class=\"greenClose\" alt=\"Close\"></a>").appendTo("span.message-info");
    swafc.$("a.redClose").click(function () { HideMessages(); });
    swafc.$("a.greenClose").click(function () { HideMessages(); });

    swafc.$(".startScaleButton").click(function () {
        setTimeout(ShowRefresh, 10000);

    });


    /*END: STYLING*/

    function ModalFactory() { }
    ModalFactory.createModal = function (triggerId, target) {
        return new ModalAndFormValidationClass(triggerId, target);
    };

    function ResetValidator(target) {
        //Initialize validator & it's api
        swafc.$(target + " :input").validator({
            message: '<div><em/></div>'
        });

        var api = swafc.$(target + " :input").data("validator");
        if (api) {
            api.reset(); 
        }
    }

    //Needed to prevent modal window from closing after validation is fixed.
    var failedValidation = false;

    function EnableValidator(trigger, target) {
        //Initialize validator & it's api
        swafc.$(target + " :input").validator({
            message: '<div><em/></div>'
        });

        var api = swafc.$(target + " :input").data("validator");
        //Submit the form after validation is successful.
        if (api) {
            api.onSuccess(function () {
                if (!failedValidation) {
                    var formAction = RedirectToUrl(target);
                    if (swafc.$(target + " form")[0].tagName == "FORM" && swafc.$(target + " form")[0].method != "get") {

                        swafc.$(target + " form").attr("action", formAction);

                        trigger.overlay().close();
                        return true;
                    }
                    else {
                        trigger.overlay().close();
                        document.location = formAction;
                        return false;
                    }
                }
                return false;
            });
        }

        if (api) {
            api.onFail(function (e, errors) {
                failedValidation = true;
                // loop through Error objects and add the border color
                var firstErrorFound = false;
                swafc.$.each(errors, function () {
                    var input = this.input;
                    if (!firstErrorFound) {
                        input.focus();
                        input.select();
                        firstErrorFound = true;
                    }
                    input.css({ borderColor: 'red' }).focus(function () {
                        input.css({ borderColor: '#444' });
                    });
                });

            });
        }
    }
    function ModalAndFormValidationClass(triggerId, target) {
        //This is a private class... verify this
        if (ModalAndFormValidationClass.caller != ModalFactory.createModal) {
            throw new Error("There is no public constructor for ModalAndFormValidationClass.");
        }

        /*Initialize error prompt verbage.*/
        swafc.$.tools.validator.localize("en", {
            '*': "Translate(MessageResources, CorrectInvalidDataMessage)",
            ':email': "Translate(MessageResources, EnterValidEmailAddressMessage)",
            ':number': "Translate(MessageResources, EnterANumberMessage)",
            ':localizednumber': "Translate(MessageResources, EnterANumberMessage)",
            ':url': "Translate(MessageResources, EnterValidUrlMessage)",
            '[required]': "Translate(MessageResources, FieldRequiredMessage)"
        });

        //custom validator for numbers
        swafc.$.tools.validator.fn("[type=localizednumber]", "Translate(MessageResources, EnterANumberMessage)",
            function (input, value) {
                var reg = new RegExp("Translate(ValidationResources, NumberFormatRegularExpression)");
                return reg.test(value);
            });

        //Needed to prevent modal window from closing as soon as validation is successful.
        swafc.$(target + " input[type='submit']:first").click(function (e) {
            failedValidation = false;
        });
        //Example of a custom validator.
        swafc.$.tools.validator.fn("[numberAboveValue]", function (input, value) {
            var min = input.attr("numberAboveValue");
            return Number.parseLocale(value) > Number.parseLocale(min) ? true : {
                en: "Translate(MessageResources, EnterANumberAboveMessage)".replace("{0}", min)
            };
        });

        var trigger = swafc.$("#" + triggerId).overlay({
            mask: {
                color: '#000',
                loadSpeed: 0,
                opacity: 0.2
            },
            effect: 'apple',
            closeOnClick: true,
            onLoad: function () {
                swafc.$("input.focus:first").focus();
                swafc.$("input.focus:first").select();
                EnableValidator(trigger, target);
            },
            onBeforeClose: function () {
                ResetValidator(target);
            },
            onClose: function () {
            }

        });

        //input type=button is used for multiple fieldset validations.  This way one form does not effect another's validation.
        swafc.$(target + " input[type='button']:first").click(
            function () {
                failedValidation = false;
                if (api) {
                    api.checkValidity();
                }
            });
    }

    swafc.$.each(swafc.$(".jQueryModal"), function () {
        ModalFactory.createModal(this.id, this.attributes.rel.value);
    });
});
