/// <reference path="Scripts/jquery-1.3.2.js" />

String.repeat = function(chr, count) {
    var str = "";
    for (var x = 0; x < count; x++) { str += chr };
    return str;
}

String.prototype.padL = function(width, pad) {
    if (!width || width < 1)
        return this;

    if (!pad) pad = " ";
    var length = width - this.length
    if (length < 1) return this.substr(0, width);

    return (String.repeat(pad, length) + this).substr(0, width);
}
/// <reference path="../../Extensions/" />

String.prototype.padR = function(width, pad) {
    if (!width || width < 1)
        return this;

    if (!pad) pad = " ";
    var length = width - this.length
    if (length < 1) this.substr(0, width);

    return (this + String.repeat(pad, length)).substr(0, width);
}

Date.prototype.formatDate = function(format) {
    var date = this;
    if (!format)
        format = "MM/dd/yyyy";

    var month = date.getMonth() + 1;
    var year = date.getFullYear();

    format = format.replace("MM", month.toString().padL(2, "0"));

    if (format.indexOf("yyyy") > -1)
        format = format.replace("yyyy", year.toString());
    else if (format.indexOf("yy") > -1)
        format = format.replace("yy", year.toString().substr(2, 2));

    format = format.replace("dd", date.getDate().toString().padL(2, "0"));

    var hours = date.getHours();
    if (format.indexOf("t") > -1) {
        if (hours > 11)
            format = format.replace("t", "pm")
        else
            format = format.replace("t", "am")
    }
    if (format.indexOf("HH") > -1)
        format = format.replace("HH", hours.toString().padL(2, "0"));
    if (format.indexOf("hh") > -1) {
        if (hours > 12) hours - 12;
        if (hours == 0) hours = 12;
        format = format.replace("hh", hours.toString().padL(2, "0"));
    }
    if (format.indexOf("mm") > -1)
        format = format.replace("mm", date.getMinutes().toString().padL(2, "0"));
    if (format.indexOf("ss") > -1)
        format = format.replace("ss", date.getSeconds().toString().padL(2, "0"));
    return format;
}

String.prototype.formatDate = function(format) {
    var date = new Date(parseInt(this.replace(/\/Date\((\d+)\)\//g, '$1')));
    if (format == null)
        format = "yyyy-MM-ddTHH:mm:ssZ";
    return (format == null) ? date : date.formatDate(format);
}

String.prototype.hasInvalidChars = function() {
    // validate if there are < or >
    if (this.indexOf(">") > -1 || this.indexOf("<") > -1)
        return true;
    return false;
}

String.prototype.hasSpecialChars = function() {
// Esta funcion valida uqe solo se ingresen letras, espacios y numeros , NINGUN SIMBOLO ESPECIAL
    var isInvalid = false;
    for (var i = 0; i < this.length ; i++) {
        var code = this.charCodeAt(i);
        if ((code <= 47 || (code <= 58 && code >= 64) || (code <= 91 && code >= 96) || (code > 122)) && code != 32 && code !=13)
            isInvalid = true;
    }
    return isInvalid;
}

String.prototype.limitTextLength = function(length) {
    return (this.length > length) ? this.substring(0, length) + "..." : this.toString();
}

String.prototype.evalJSONWithDates = function() {
    var jsonWithDates = this.replace(/"\/Date\((\d+)\)\/"/g, 'new Date($1)');
    return jsonWithDates.evalJSON(true);
}

// String.Format emulation Prototype
String.prototype.format = function() {
    var pattern = /\{\d+\}/g;
    var args = arguments;
    return this.replace(pattern, function(capture) { return args[capture.match(/\d+/)]; });
}

// StringBuilder Prototype
function StringBuilder(value) {
    this.strings = new Array("");
    this.append(value);
}
StringBuilder.prototype.append = function(value) {
    if (value) {
        this.strings.push(value);
    }
}
StringBuilder.prototype.clear = function() {
    this.strings.length = 1;
}
StringBuilder.prototype.toString = function() {
    return this.strings.join("");
}
// trim Prototype
String.prototype.trim = function() {
    return this.replace(/^\s*/, "").replace(/\s*$/, "");
}

function processFileName(filename) {
    var lastIndex = filename.lastIndexOf('\\', filename.length - 1)
    if (lastIndex == -1)
        lastIndex = filename.lastIndexOf('/', filename.length - 1)
    if (lastIndex == -1)
        return (filename.toString().length > 30) ? filename.toString().substring(0, 30) + '...' : filename;
    else {
        var file = filename.toString().substr(lastIndex + 1, filename.length - lastIndex - 1);
        return (file.toString().length > 30) ? file.toString().substring(0, 30) + '...' : file;
    }
};

// bool parse prototype
String.prototype.bool = function() { return (/^true$/i).test(this); };

function limitText(e, idControl, limit, idLabel) {
    // 8 - 46 - 9 : BACKSPACE, DELETE, TAB
    // 37, 40 : arrows.
    var $control = $('#' + idControl);
    var $label = $('#' + idLabel);

    keyCode = 0;
    if (e != null)
        keyCode = e.keyCode;

    var textlenght = $control.val().length;
    var l = textlenght;
    
    var enters = $control.val().match(/\n/g);
    if (enters) {
        limit -= enters.length; //ASP.Net counts line break like 2 characters \r and \n
    }

    if ((limit - l) < limit) {
        if ((limit - l) > 0)
            $label.html("Quedan " + (limit - l).toString() + " caracteres disponibles.");
        else {
            $label.html("Quedan 0 caracteres disponibles.");
            if ((keyCode >= 37 && keyCode <= 40) || keyCode == 8 || keyCode == 46 || keyCode == 9)
                return;
            $control.val($control.val().substr(0, limit));
        }
    }
    else
        $label.html("M&aacute;ximo " + limit + " caracteres.");
}

(function($) {
    $.extend({
        doGet: function(url, params) {
            document.location = url + '?' + $.param(params);
        },
        doPost: function(url, params) {
            var newForm = $("<form></form>")
                .attr("method", "POST")
                .attr("action", url);

            $.each(params, function(name, value) {
                $("<input type='hidden'>")
                    .attr("name", name)
                    .attr("value", value)
                    .appendTo(newForm);
            });
            newForm.appendTo("body");
            newForm[0].submit();
        }
    });
})(jQuery);

Number.prototype.FormatWeembaNumber = function FormatWeembaNumber(complete) {
    var numberToFormat = this;
    var sNumber = Math.floor(numberToFormat).toString();
    var sDecimal = "";

    if (numberToFormat % 1 != 0)
        sDecimal = (numberToFormat % 1).toString();

    if (numberToFormat >= 1000000) {
        sNumber = sNumber.substring(0, sNumber.length - 6) + '.' + sNumber.substring(sNumber.length - 6, sNumber.length - 3) + '.' + sNumber.substring(sNumber.length - 3, sNumber.length);
    }
    else {
        if (numberToFormat >= 1000)
            sNumber = sNumber.substring(0, sNumber.length - 3) + '.' + sNumber.substring(sNumber.length - 3);
    }
    
    if (sDecimal != "")
        sDecimal = sDecimal.replace('.', ',').substring(1, 4).padR(3, '0');

    if (complete)
        sNumber = "$ " + sNumber;

    return sNumber + sDecimal;
}

Number.prototype.FormatWeembaRate = function FormatWeembaRate(complete) {
    var numberToFormat = this;
    var sNumber = Math.floor(numberToFormat).toString();
    var sDecimal = "0.00";

    if (numberToFormat % 1 != 0)
        sDecimal = (numberToFormat % 1).toString();

    sDecimal = sDecimal.replace('.', ',').substring(1, 4).padR(3, '0');

    if (complete)
        sDecimal += " %";

    return sNumber + sDecimal;
}

String.prototype.parseWeembaNumber = function() {
    return this.replace(/\$|\.|\%|\s/g, "").replace(/\,/, ".");
}

String.prototype.parseWeembaAmount = function() {
    var parsed = parseInt(this.parseWeembaNumber());
    return isNaN(parsed) ? 0 : parsed;
}

String.prototype.parseWeembaRate = function() {
    var parsed = parseFloat(this.parseWeembaNumber());
    return isNaN(parsed) ? 0 : parsed;
}

jQuery.fn.scrollFix = function(maxLength) {
    if ($(this).val().length > maxLength) {
        var scrollDown = $(".scrolldown");
        if (scrollDown.length > 0)
            scrollDown.click();
    }
    else {
        var scrollUp = $(".scrollup");
        if (scrollUp.length > 0)
            scrollUp.click();
    }
}

//function to exclude chars from a string.
function excludeChars(input, removableChars) {
    text = $("#" + input).val();
    error = false;
    for (i = 0; i <= removableChars.length - 1; i++) {
        varChar = removableChars.charAt(i);
        re = new RegExp(varChar, "g");
        if (text.match(re)) {
            alert("No se permite el uso de caracteres especiales en el nombre del Proyecto. El caracter inv&aacute;lido ser&aacute; eliminado autom&aacute;ticamente.", "Caracter no permitido");
            error = true;
        }
        text = text.replace(re, '');
    }
    if (error)
        $("#" + input).val(text);
};

function isValidDate(date) {
    // If the value is empty
    if (date == "__/__/____")
        return true;
        
    // Validates format [number][number]/[number][number]/[number][number][number][number]
    if(/^\d{1,2}(\/)\d{1,2}\1\d{4}$/.test(date)){
        var dateArray = date.split("/");
        var date = dateArray[0] * 1;
        var month = dateArray[1] * 1;
        var year = dateArray[2] * 1;

        var today = new Date();
        var currentDate = today.getDate();
        var currentMonth = today.getMonth() + 1;
        var currentYear = today.getFullYear();
        var febDays = (year % 4 == 0) && ((!(year % 100 == 0)) || (year % 400 == 0)) ? 29 : 28;
        var monthDays = [31, febDays, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

        // Validates the current mm/dd/yyyy format
        if (month > 12 || month <= 0 || date > 31 || date <= 0 || year < 1753)
        {
            return false;
        }
        else 
        {
            if (date > monthDays[month - 1])
                return false;
        }
               
        // Validates that the date is not greater than today.
        if (year > currentYear) {
            return false;
        }
        else if (year == currentYear) {
            if (month > currentMonth) {
                return false;
            }
            else if (month == currentMonth) {
                if (date > currentDate) {
                    return false;
                }
            }
        }

        return true;
    }
    else
    {
        return false;
    }
}

function isValidDateFormat(date) {
    // If the value is empty
    if (date == "__/__/____")
        return true;

    // Validates format [number][number]/[number][number]/[number][number][number][number]
    if (/^\d{1,2}(\/)\d{1,2}\1\d{4}$/.test(date)) {
        var dateArray = date.split("/");
        var date = dateArray[0] * 1;
        var month = dateArray[1] * 1;
        var year = dateArray[2] * 1;

        var today = new Date();
        today.setHours(0, 0, 0, 0);
        var currentDate = today.getDate();
        var currentMonth = today.getMonth() + 1;
        var currentYear = today.getFullYear();
        var febDays = (year % 4 == 0) && ((!(year % 100 == 0)) || (year % 400 == 0)) ? 29 : 28;
        var monthDays = [31, febDays, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

        // Validates the current mm/dd/yyyy format
        if (month > 12 || month <= 0 || date > 31 || date <= 0 || year < 1753) 
        {
            return false;
        }
        else 
        {
            if (date > monthDays[month - 1])
                return false;
        }

        // Validates date, it should be ALWAYS today + 2 min.
        var paramDate = new Date(month + "/" + date + "/" + year);

        // If we are trying to process during weekend
        if (paramDate.getDay() == 6 || paramDate.getDay() == 0)
            return false;
            
        var dayDif = 2;

        if (today.getDay() == 4 || today.getDay() == 5)
            dayDif = 4;

        if (Math.floor((paramDate.getTime() - today.getTime()) / (1000 * 60 * 60 * 24)) < dayDif)
            return false;

        return true;
    }
    else 
    {
        return false;
    }
}  

postJson = function (url, data, successCallback, errorCallback) {
    $.ajax({
        url: url,
        data: data,
        dataType: 'json',
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            if (errorCallback != undefined)
                errorCallback(XMLHttpRequest, textStatus, errorThrown);
            else
                alert(errorThrown);
        },
        success: function (data, textStatus, XMLHttpRequest) {
            if (successCallback != undefined)
                successCallback(data, textStatus, XMLHttpRequest);
        },
        type: 'POST'
    });
}
