/*
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;
    }
}
/*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=\"clearthis 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() {

        var pWindow = window.open('', 'PrintWindow', popupOptions);
        var html = '<html><head>' + headContents + ' <link href="/_styles/print.css" rel="stylesheet" type="text/css" media="all" /></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 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.");
        }

        //Needed to prevent modal window from closing after validation is fixed.
        var failedValidation = false;

        /*Initialize error prompt verbage.*/
        swafc.$.tools.validator.localize("en", {
            '*': 'Please correct invalid data.',
            ':email': 'Please enter a valid email address.',
            ':number': 'Please enter a number.',
            ':url': 'Please enter a valid URL.',
            '[required]': 'This field is required.'
        });
        //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 parseFloat(value) > min ? true : {
                en: "Please enter a number above " + min + "."
            };
        });

        //Initialize validator & it's api
        swafc.$(target + " :input").validator({
            message: '<div><em/></div>'

        });

        var api = swafc.$(target + " :input").data("validator");

        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();
            },
            onBeforeClose: function() {
                if (api) {
                    api.reset();
                }
            },
            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();
                }
            });

        //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' });
                    });
                });

            });
        }
    }

    swafc.$.each(swafc.$(".jQueryModal"), function() {
        ModalFactory.createModal(this.id, this.attributes.rel.value);
    });
});