var $jq = jQuery.noConflict();

String.prototype.flatHTMLTags = function () {
    return this.replace(/</g, "_lt_")
        .replace(/%3C/g, "_lt_")
        .replace(/>/g, "_gt_")
        .replace(/%3E/g, "_gt_");
}

Array.prototype.contains = function (id) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] == id) {
            return true;
        }
    }

    return false;
}

Array.prototype.flatHTMLTags = function (ids) {
    for (var i = 0; i < this.length; i++) {
        if (ids.contains(this[i].name)) {
            this[i].value = this[i].value.flatHTMLTags();
        }
    }

    return this;
}

String.prototype.cut = function (length, fake) {
    if (this.length > length) {
        return this.substring(0, length) + fake;
    }

    return this.toString();
}


Guid = new function () {
    var _self = this;

    _self.get = function (format) {
        var guid = (_s4() + _s4()
			+ "-" + _s4()
			+ "-" + _s4()
			+ "-" + _s4()
			+ "-" + _s4() + _s4() + _s4()).toLowerCase();

        return _format(guid, format);
    }

    var _s4 = function () {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    }

    var _format = function (guid, format) {
        switch (format) {
            default:return guid;
        }
    }
}

ValidationHelper = new function () {
    var _self = this;

    _self.isEmpty = function (text) {
        return (text == null) || (text.length == 0);
    }

    _self.isEmail = function (text) {
        var re = /^[^\s()<>@,;:\/]+@\w[\w\.-]+\.[a-z]{2,}$/i;
        return !_self.isEmpty(text) && re.test(text);
    }

    _self.isInteger = function (text) {
        var re = /[\D]/g;
        return !_self.isEmpty(text) && !re.test(text);
    }

    _self.isFloat = function (text) {
        var re = /^[0-9]*\.?[0-9]+$/;
        return !_self.isEmpty(text) && re.test(text);
    }

    _self.isCurrency = function (text) {
        var re = /^\$?([0-9]{1,3},([0-9]{3},)*[0-9]{3}|[0-9]+)(.[0-9][0-9])?$/i;
        return !_self.isEmpty(text) && re.test(text);
    }

    _self.isDate = function (text) {
        var re = /^(\d{1,2})[\s\.\/-](\d{1,2})[\s\.\/-](\d{4})$/;

        if (!re.test(text)) {
            return false;
        }

        var result = text.match(re);
        var m = parseInt(result[1]);
        var d = parseInt(result[2]);
        var y = parseInt(result[3]);

        if (m < 1 || m > 12 || y < 1900 || y > 2100) {
            return false;
        }

        if (m == 2) {
            var days = ((y % 4) == 0) ? 29 : 28;
        } else if (m == 4 || m == 6 || m == 9 || m == 11) {
            var days = 30;
        } else {
            var days = 31;
        }

        return (d >= 1 && d <= days);
    }
}

MessageBox = new function () {
    var _self = this;

    _self.info = function (title, message) {
        _show(title, message, null, "info");
    }

    _self.error = function (title, message) {
        _show(title, message, null, "alert");
    }

    _self.alert = function (title, message, buttons) {
        _show(title, message, buttons, "alert");
    }

    var _show = function (title, message, buttons, icon) {
        if (buttons != null) {
            buttons.Cancel = function () {$jq(this).dialog("close");}
        } else {
            buttons = {"Close": function () {$jq(this).dialog("close");}}
        }

        $jq("<div>")
            .addClass("message-box")
            .html("<span class='ui-icon ui-icon-" + icon
                    + "'></span><span class='ui-message'>" + message + "</span>")
            .appendTo("body")
            .dialog({
                title: title,
                resizable: false,
                modal: true,
                buttons: buttons,
                close: function () {$jq(this).dialog("destroy").remove();}
            });
    }
}

PromptBox = new function () {
    var _self = this;

    _self.prompt = function (title, content, buttons) {
        _show(title, content, buttons, "alert");
    }

    var _show = function (title, content, buttons) {
        if (buttons != null) {
            buttons.Cancel = function () {$jq(this).dialog("close");}
        } else {
            buttons = {"Close": function () {$jq(this).dialog("close");}}
        }

        $jq("<div>")
            .addClass("message-box")
            .html("<div class='ui-content'>" + content + "</div>")
            .appendTo("body")
            .dialog({
                title: title,
                resizable: false,
                modal: true,
                buttons: buttons,
                close: function () {$jq(this).dialog("destroy").remove();}
            });
    }
}

SystemErrorMessage = new function () {
    var _self = this;

    _self.show = function () {
        MessageBox.error("Internal Error!",
            "There is an unexpected error on the system. "
            + "This event has been registered and it will be analyzed by Technical Support."
            + "<br/><br/>If you like, you can <a href='"
            + Environment_APP_PATH + "contact-us'>click here</a> to contact us.");
    }
}

ValidationSummary = new function () {
    var VALIDATION_SUMMARY_SELECTOR = "ul.validation-summary-errors";
    var _self = this;
    var _container = null;


    var _initialize = function (context) {
        _container = $jq(VALIDATION_SUMMARY_SELECTOR, context);
        if (_container.length == 0) {
            _container = $jq("<ul>").addClass("validation-summary-errors").prependTo(context);
        }

        _container.hide().bind("ajaxStart", function () {_container.hide();});
    }

    _self.show = function (context, errorMessages) {
        _initialize(context);

        _container.empty();
        for (var i = 0; i < errorMessages.length; i++) {
            $jq("<li>").text(errorMessages[i]).appendTo(_container);
        }

        _container.show();
    }

    _self.setupClientRules = function (context, validations) {
        _initialize(context);

        context.validate({
            rules: validations.rules,
            messages: validations.messages,
            errorLabelContainer: VALIDATION_SUMMARY_SELECTOR,
            errorElement: 'li'
        });
    }

    _self.alert = function () {
        MessageBox.error("Error !!", $jq(VALIDATION_SUMMARY_SELECTOR).html());
        $jq(VALIDATION_SUMMARY_SELECTOR).hide();
    }

    _self.visualize = function () {
        window.scrollTo(0, $jq(VALIDATION_SUMMARY_SELECTOR).position().top);
    }

    _self.hide = function (context) {
        $jq("ul.validation-summary-errors", context).hide();
    }
}

ProgressMessage = new function () {
    var _self = this;
    var _container = null;

    var _initialize = function () {
        _container = $jq("div#progress-message");
        if (_container.length == 0) {
            _container = $jq("<div>").attr("id", "progress-message").appendTo($jq(document.body));
        }

        _container.hide()
            .bind("ajaxStart", function () {$jq(this).fadeIn("slow");})
            .bind("ajaxStop", function () {$jq(this).fadeOut(4000);});
    }

    _self.showInfo = function (message) {
        _show(message, "info");
    }

    _self.showWarning = function (message) {
        _show(message, "warning");
    }

    _self.showError = function (message) {
        _show(message, "error");
    }

    var _show = function (message, clazz) {
        $jq("#progress-message")
            .attr("class", clazz)
            .css("left", window.screen.width / 2 - message.length - 100 + "px")
            .text(message);
    }

    _self.hide = function () {
        _container.hide();
    }

    _initialize();
}

Button = new function () {
    var _self = this;

    _self.showProgress = function (button, message) {
        $jq(".pic-button", button).hide();

        if ($jq("#progress-message", button).length == 0) {
            button.append("<div id=\"progress-message\">" + message + "</div>");
        }
        else {
            $jq("#progress-message", button).html(message);
        }
    }

    _self.hideProgress = function (button, message) {
        var messageContainer = button.find("#progress-message");

        if (message) {
            messageContainer.html(message);
            setTimeout(function () {_restore(button, messageContainer);}, 2000);
        }
        else {
            _restore(button, messageContainer);
        }
    }

    var _restore = function (button, messageContainer) {
        messageContainer.remove();
        $jq(".pic-button", button).show();
    }
}

Link = new function () {
    var _self = this;

    _self.showProgress = function (link, message) {
        link.data("org-href", link.attr("href"));
        link.removeAttr("href")

        link.data("org-text", link.html());
        link.data("org-color", link.css("color"));
        link.data("org-text-decoration", link.css("text-decoration"));

        link.css("text-decoration", "none");
        link.css("color", "gray");
        link.html(message);
    }

    _self.hideProgress = function (link, message) {
        if (message) {
            link.html(message);
            setTimeout(function () {_restore(link);}, 2000);
        }
        else {
            _restore(link);
        }
    }

    _self.isInProgress = function (link) {
        return link.attr("href") == undefined;
    }

    var _restore = function (link) {
        link.attr("href", link.data("org-href"));
        link.html(link.data("org-text"));
        link.css("color", link.data("org-color"));
        link.css("text-decoration", link.data("org-text-decoration"));
    }
}

function DateDiference(date1, date2) {
    var d1 = GetDate(date1);
    var d2 = GetDate(date2);
    return (d1.getTime() - d2.getTime()) / 86400000;
}

function GetDate(stringDate, addDays)
{
    var date = new Date();
    if (stringDate != null)
    {
        var params = new Array();
        params = stringDate.split('-');
        date = new Date(params[0], params[1]-1, params[2]);
    }
    if (addDays != null)
    {
        date.setDate(date.getDate() + parseInt(addDays));
    }
    return date;
}
