﻿Element.addMethods({
    getFirst: function (element, id) {
        if (!(element = $(element))) return;
        if (id.charAt(0) == '#') {
            id = id.substring(1);

            return element.select('[id=' + id + ']')[0];
        }

        return element.select(id)[0];
    },
    onClick: function (element, f) {
        if (!(element = $(element))) return;

        element.observe('click', f);
    },
    onClickWithContext: function (element, context, f) {
        if (!(element = $(element))) return;

        element.observe('click', f.bind(context));
    }
});

var JSHelper = Class.create({
    initialize: function () {
    },
    permitOnlyDigits: function (el) {
        el.observe('keydown', function (e) {
            e = (e) ? e : window.event;
            var charCode = (e.which) ? e.which : e.keyCode;
            var specialChars = [8, 9, 27, 37, 38, 39, 40, 46, 116];
            // if (charCode >= 48 && charCode <= 57) {
            if ((charCode >= 48 && charCode <= 57) || (charCode >= 96 && charCode <= 105)) {
                return true;
            }
            else {
                var exist = false;
                specialChars.each(function (c) {
                    if (charCode == c) {
                        exist = true;
                    }
                });
                if (exist) {
                    return true;
                }
                else {
                    e.stop();
                }
            }
        });
    },
    limitSize: function (el, maxSize) {
        el.writeAttribute({ maxlength: maxSize });
    },
    toInt: function (value) {
        var newValue = parseInt(value, 10);
        if (isNaN(newValue)) {
            newValue = 0;
        }
        return newValue;
    },
    language: {
        'days': {
            'char': ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
            'short': ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'],
            'mid': ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],
            'long': ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']
        },
        'months': {
            'short': ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
            'long': ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        },
        'am_pm': {
            'lowerCase': ['am', 'pm'],
            'upperCase': ['AM', 'PM']
        }
    },
    isLeapYear: function (date) {
        var newDate = new Date(date.getFullYear(), 1, 29);
        return (newDate.getMonth() == 1);
    },
    daysInMonth: function (date) {
        var newDate = new Date(date.getFullYear(), date.getMonth(), 28);
        var i = 28;
        for (i = 28; i <= 32; i++) {
            newDate.setDate(i);
            if (newDate.getMonth() != date.getMonth())
                return (i - 1);
        }
    },
    toSwatchInternetTime: function (date) {
        var sec = (date.getHours() * 3600) + (date.getMinutes() * 60) + date.getSeconds() + ((date.getTimezoneOffset() + 60) * 60);
        var beat = Math.floor(sec / 86.4);
        return ("@" + beat);
    },
    timeDifference: function (date, date2) {
        return date.getTime() - date2.getTime();
    },
    formatDate: function (date, format) {
        var lang = this.language;

        var i = 0;
        var re = "";
        var ch = "";

        for (i = 0; i < format.length; i++) {
            ch = format.charAt(i);
            if (ch == "d") {
                if (date.getDate() < 10) re += "0";
                re += date.getDate();
            }
            else if (ch == "D")
                re += lang.days['mid'][date.getDay()];
            else if (ch == "j")
                re += day;
            else if (ch == "l")
                re += lang.days['long'][date.getDay()];
            else if (ch == "N") {
                var num = date.getDay();
                if (num == 0) num = 7;
                re += num;
            }
            else if (ch == "S") {
                if ((date.getDate() == "1") || (date.getDate() == "21") || (date.getDate() == "31"))
                    re += "st";
                else if ((date.getDate() == "2") || (date.getDate() == "22"))
                    re += "nd";
                else if ((date.getDate() == "3") || (date.getDate() == "23"))
                    re += "rd";
                else
                    re += "th";
            }
            else if (ch == "w")
                re += date.getDay();
            else if (ch == "z")
                re += date.getDayInYear();
            else if (ch == "F")
                re += lang.months['long'][date.getMonth()];
            else if (ch == "M")
                re += lang.months['short'][date.getMonth()];
            else if (ch == "m") {
                if (date.getMonth() + 1 < 10) re += 0;
                re += date.getMonth() + 1;
            }
            else if (ch == "n")
                re += date.getMonth();
            else if (ch == "t")
                re += date.daysInMonth();
            else if (ch == "L") {
                if (this.isLeapYear(date))
                    re += 1;
                else
                    re += 0;
            }
            else if ((ch == "Y") || (ch == "o"))
                re += date.getFullYear();
            else if (ch == "y")
                re += date.getFullYear().toString().substr(2, 2);
            else if (ch == "a") {
                if (date.getHours() < 12)
                    re += lang.am_pm['lowerCase'][0];
                else
                    re += lang.am_pm['lowerCase'][1];
            }
            else if (ch == "A") {
                if (date.getHours() < 12)
                    re += lang.am_pm['upperCase'][0];
                else
                    re += lang.am_pm['upperCase'][1];
            }

            else if (ch == "B")
                re += this.toSwatchInternetTime();
            else if (ch == "g") {
                var hr = (date.getHours() % 12);
                if (hr == 0) hr = 12;
                re += hr;
            }
            else if (ch == "G")
                re += date.getHours();
            else if (ch == "h") {
                var hr = (date.getHours() % 12);
                if (hr == 0) hr = 12;
                if (h < 10) r += 0;
                re += hr;
            }
            else if (ch == "H") {
                if (date.getHours() < 10) re += 0;
                re += date.getHours();
            }
            else if (ch == "i") {
                if (date.getMinutes() < 10) re += 0;
                re += date.getMinutes();
            }
            else if (ch == "s") {
                if (date.getSeconds() < 10) re += 0;
                re += date.getSeconds();
            }
            else if (ch == "u")
                re += date.getMilliseconds();
            else if ((ch == "O") || (ch == "P")) {
                var hr = (this.getTimezoneOffset()) / 60;
                var mn = hr - Math.floor(hr);
                mn = mn * 60;
                hr = Math.floor(hr);
                mn = Math.floor(mn);
                if (hr == 0) hr = "00";
                else if ((hr > -10) && (hr < 0)) hr = "-0" + Math.abs(hr);
                else if ((hr < 10) && (hr > 0)) hr = "0" + hr;
                else hr = hr.toString();
                if (hr > 0) re += "+";
                if (mn < 10) mn = "0" + mn;
                else mn = mn.toString();
                if (ch == "P") var sep = ":";
                else var sep = "";
                re += hr + sep + mn;
            }
            else if (ch == "Z")
                re += this.getTimezoneOffset();
            else if (ch == "c") {
                format = format.substr(0, i - 0) + "Y-m-dTH:i:sP" + format.substr(0, i);
                i--;
            }
            else if (ch == "r") {
                format = format.substr(0, i - 0) + "D, d M Y H:i:s O" + format.substr(0, i);
                i--;
            }
            else if (ch == "U")
                re += Math.floor(this.timeDifference(date, new Date(1970, 0, 1)) / 1000);
            else
                re += ch;
        }

        return re;
    },
    fromString: function (str) {
       
        var date = new Date();
        var prs_dt = Date.parse(str.replace(/[-|\\]/g, "/"));
        
        //if (isNaN(prs_dt)) {
            str = str.toLowerCase();
            str = str.replace(/(\s)*([\+|-])(\s)*/g, "$2");
            var y = date.getFullYear();
            var m = date.getMonth();
            var d = date.getDate();
            str = str.replace("yesterday", "today-1")
					.replace("tomorrow", "today+1")
					.replace("last month", "month-1")
					.replace("next month", "month+1")
					.replace("last year", "year-1")
					.replace("next year", "year+1");
            if (str.indexOf("today+") >= 0)
                d = d + parseInt(str.replace("today+", ""));
            else if (str.indexOf("today-") >= 0)
            //d = d-str.replace("today-","").toInt();
                d = d - parseInt(str.replace("today-", ""));
            else if (str.indexOf("month+") >= 0) {
                m = m + parseInt(str.replace("month+", ""));
                if (m > 11) {
                    m -= 12;
                    y += 1;
                }
                var mx_dys = new Date(y, m, 1).daysInMonth();
                if (d > mx_dys) d = mx_dys;
            }
            else if (str.indexOf("month-") >= 0) {
                m = date.getMonth() - parseInt(str.replace("month-", ""));
                var mx_dys = new Date(y, m, 1).daysInMonth();
                if (d > mx_dys) d = mx_dys;
            }
            else if (str.indexOf("year+") >= 0) {
                y = y + parseInt(str.replace("year+", ""));
                var mx_dys = new Date(y, m, 1).daysInMonth();
                if (d > mx_dys) d = mx_dys;
            }
            else if (str.indexOf("year-") >= 0) {
                y = date.getFullYear() - parseInt(str.replace("year-", ""));
                var mx_dys = new Date(y, m, 1).daysInMonth();
                if (d > mx_dys) d = mx_dys;
            }

            var dt = new Date(y, m, d, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());
        //}
        //else {
            //var dt = new Date(prs_dt);
        //}

        return dt;
    }
});

var jsHelper = new JSHelper();


