﻿(typeof console === 'object' && typeof console.log === 'function') || (console = { log: function () {} });

(function () {

    function displaySystemMessage(message, cssClass) {

        var systemMessages = $("<div />").addClass('systemMessages');
        var systemMessage = $("<div />").addClass('systemMessage').addClass(cssClass).text(message);
        var closeButton = $("<a href='javascript:' />").addClass('systemMessageCloseButton').text("X");

        systemMessage.append(closeButton);
        systemMessages.append(systemMessage);

        $("#systemMessageContainer").html(systemMessages);
    }

    NSM = {

        init: function () {

            $(".systemMessage").livequery(function () {
                var message = $(this);
                setTimeout(function () { message.fadeOut('slow'); }, 5000);
            });

            $("#systemMessageContainer").ajaxError(function (e, jqxhr, settings, exception) {

                if (jqxhr == null || !jqxhr.responseText)
                    return;
                else
                    var error = jqxhr.responseText.split("<title>")[1].split("</title>")[0];

                displaySystemMessage(error, "error");

                if (typeof ($.blockUI) == "function")
                    $(".blockUI").parent().unblock();
            });

            $(".javascriptHref").click(function () {
                window.location = $(this).attr("href");
            });

            $(".ajaxForm").livequery(function () {
                var form = $(this);
                var callback = form.attr("callback");
                var onbegin = form.attr("begin");
                var onbeginFunction = eval(onbegin);
                var callBackFunction = eval(callback);

                form.ajaxForm({ beforeSubmit: onbeginFunction, success: callBackFunction });
            });

            var delimiter = "_";
            var randomNumber = function () { return Math.floor(Math.random() * 10000000) };
            function makeFormInputNamesUnique(form) {
                $(form).find("input").each(function () {
                    var input = $(this);
                    var name = input.attr("name") + delimiter + randomNumber();
                    input.attr("name", name);
                });
            }

            function removeUniqueFormInputNames(form) {
                $(form).find("input").each(function () {
                    var input = $(this);
                    var name = input.attr("name");
                    input.attr("name", name.substring(0, name.indexOf(delimiter)));
                });
            }

            $("form.complexForm").livequery(function () {
                var form = $(this);
                var validationForm = form.hasClass("clientSideValidation");
                var contentContainer = form.attr("contentContainer");
                var successCallback = function (result) {
                    if (validationForm)
                        makeFormInputNamesUnique(form);
                }

                if (validationForm)
                    form.submit(function () {
                        var validForm = $(".error:visible").length === 0;
                        if (validForm === true)
                            removeUniqueFormInputNames(this);
                    });

                form.complexForm({ success: successCallback });
            });

            $("form.clientSideValidation").livequery(function () {
                var form = $(this);
                if (form.hasClass("complexForm"))
                    makeFormInputNamesUnique(form);

                form.validate();
                form.find("input").each(function () {
                    var input = $(this);
                    var name = input.attr("name");
                    name = name.substring(0, name.indexOf(delimiter));
                    switch (name) {
                        case 'EmailAddress':
                            input.rules("add", "email");
                            break;
                        case 'ConfirmPassword':
                            input.rules("add", { equalTo: "#Password" });
                            break;
                        case 'MaxItemPerEmail':
                            input.rules("add", { required: true, number: true, max: 50, min: 0 });
                            break;
                    }
                });
            });

            //TODO: Add handler for javascript event window.onerror
            window.onerror = function (message, url, line_number) {
                //displaySystemMessage('There was an error: ' + message);
                console.log(arguments);
                return true;
            };
        },

        createSystemMessage: function (message) {
            displaySystemMessage(message, "");
        },

        blockWhileLoading: function (el, message) {
            message = message || "Loading..."
            $(el).block({
                message: "<strong>" + message + "</strong>",
                css: { backgroundColor: 'transparent', border: 'none' },
                overlayCSS: { backgroundColor: 'white', opacity: 0.7 },
                centerX: true,
                centerY: true
            });
        },

        timeZoneOffset: function () {
            var rightNow = new Date();
            var jan1 = new Date(rightNow.getFullYear(), 0, 1, 0, 0, 0, 0);
            var temp = jan1.toGMTString();
            var jan2 = new Date(temp.substring(0, temp.lastIndexOf(" ") - 1));
            return 0 - (jan1 - jan2) / (1000 * 60);
        },

        reloadPage: function () {
            window.location.href = window.location.href;
        },

        setMinWindowSize: function (width, height) {
            var winH = $(window).height();
            var winW = $(window).width();
            if (winH < height || winW < width) {
                window.resizeTo(
                    width > winW ? width : winW,
                    height > winH ? height: winH
                );
            }
        }
    };

})();
