Object.extend(Date, {
    
    /**
     * Vytvoreni objektu Date z datoveho nebo datoveho + casoveho retezce MySQL
     *
     * @param {String} dbDateString
     * @return {Date|boolean} Objekt date; nebo false pokud retezec neobsahuje platne
     * databazove datum.
     */
    fromDbDateString: function(dbDateString) {
        if (dbDateString == undefined || dbDateString == false) {
            return false;
        }
        var date = new Date(0,0,1,0,0,0,0);
        try {
            var matches = dbDateString.match(/(\d{4})-(\d{2})-(\d{2})( (\d{2}):(\d{2}):(\d{2}))?/);
            if (matches) {
                date.setFullYear(matches[1], matches[2] - 1, matches[3]);
                if (matches[4]) {
                    date.setHours(matches[5], matches[6]);    
                } 
            } else {
                return false;    
            }
            return date;
        } catch (e) {
            return false;
        }
    },
    
    /**
     * vytvoreni datumu z DB 100% ok - bez testu
     */
    fromDbDateStringTrust: function(dbDateString) {
        var date = new Date(0,0,1,0,0,0,0);
        if (dbDateString) {
            date.setFullYear(dbDateString.substr(0,4), dbDateString.substr(5,2) - 1, dbDateString.substr(8,2));
            date.setHours(dbDateString.substr(11,2), dbDateString.substr(14,2));    
            return date;
        } 
        return false;
    },
    
    
    /**
     * Vytvoreni objektu Date z datoveho nebo datoveho + casoveho retezce formatovaneho
     * dle mistnich zvyklosti
     *
     * @param {String} locDateString Datovy nebo datovy + casovy retezec formatovany
     * dle mistnich zvyklosti
     * @return {Date|boolean} Objekt date; nebo false pokud retezec neobsahuje platne
     * datum nebo platne datum + cas
     */
    fromLocDateString: function(locDateString, lan) {
        var lan = lan || LAN;
        var daysInMonth = {0: 31, 1: 28, 2: 31, 3: 30, 4: 31, 5: 30, 6: 31, 7: 31, 8: 30, 9: 31, 10: 30, 11: 31};
        var year, month, day, hour = 0, minute = 0;         
        function daysInFebruary(year) {
            return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
        }
        switch (lan) {
            case "cs":
            case "sk":
            case "en":
            case "de":
            default:
                var matches = locDateString.match(/([0-9]{1,2})[\.,:/\- ]+([0-9]{1,2})[\.,:/\- ]+([0-9]{4}|[0-9]{2})([\.,:/\- ]+(.+))?/);
                //var matches = locDateString.match(/([0-9]{1,2})\D+([0-9]{1,2})\D+([0-9]{4}|[0-9]{2})(\D+(\d.*))?/);
                if (matches) {
                    year  = matches[3] * 1;
                    month = matches[2] - 1;
                    day   = matches[1];
                    if (matches[4]) {
                        var time = Date.fromLocTimeString(matches[4]);
                        if (time) {
                            hour = time.getHours();
                            minute = time.getMinutes();
                        } else {
                            return false;
                        }
                    }
                } else {
                    return false;
                }
                
                if ((month < 0) || (month > 11)) {
                    return false;
                }
                if (year < 100) {
                    if (year < 10) {
                        year += 2000;
                    } else {
                        year += 1900;
                    }
                }
                if ((year < 1620) || (year > 3000)) {
                    return false;
                }
                daysInMonth[1] = daysInFebruary(year);
                if ((day < 1) || (day > daysInMonth[month])) {
                    return false;
                }
            break;
            /*default:
                return false;
            break;*/
        }
        return new Date(year, month, day, hour, minute, 0, 0);
    },

    /**
     * Vytvoreni objektu Date z casoveho retezce formatovaneho dle mistnich zvyklosti
     *
     * Datumova cast objektu bude nastavena na 1. 1. 1900.
     * @param {String} locTimeString
     * @param {String} lan Zkratka jazyka, pokud neuvedena, pouzije se
     * globalni systemova.
     * @return {Date|boolean} Objekt date pokud casovy retezec obsahuje platny
     * cas; false pokud ne.
     */ 
    fromLocTimeString: function(locTimeString, lan) {
        var lan = lan || LAN;
        var hour, minute = 0;         
        switch (lan) {
            case "cs":
            case "sk":
            case "en":
            case "de":
            default:
                var matches = locTimeString.match(/([0-9]{1,2})([\.,:/\- ]+([0-9]{1,2}))?/);
                if (matches) {
                    hour = matches[1];
                    if (matches[2]) {
                        minute = matches[3];
                    }
                } else {
                    return false;
                }
                if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
                    return false;
                }
                break;
            /*default:
                return false;
                break;*/
        }
        return new Date(0, 0, 1, hour, minute, 0, 0);
    }
    
});

Date.prototype.toLocDateString =
function(lan) {
    lan = lan || LAN;
    switch (lan) {
        case "cs":
        case "sk":
        case "en":
        case "de":
        default:
            return this.getDate() + "." + (this.getMonth() + 1) + "." + this.getFullYear();
            break;
        /*default:
            return this.getDate() + "." + (this.getMonth() + 1) + "." + this.getFullYear();
            //return this.toLocaleString();
            break;*/
    }
};
/**
 * snazi se vytisknout datum co nejusporneji
 * z datumu odrizne rok, pokud patri datum do letosniho roku
 * napr. 10.11.2008 -> 10.11.
 */
Date.prototype.toSimpleLocDateString = 
function(lan) {
       lan = lan || LAN;
       var d = new Date();
       var currentYear = d.getFullYear();
        switch (lan) {
            case "cs":
            case "sk":
            case "en":
            case "de":
            default:
                var dateString = this.getDate() + "." + (this.getMonth() + 1) + ".";
                if (this.getFullYear() != currentYear) {
                    dateString += toString(this.getFullYear()).substring(2);
                }
                return dateString;
                break;
            /*default:
                var dateString = this.getDate() + "." + (this.getMonth() + 1) + ".";
                if (this.getFullYear() != currentYear) {
                    dateString += toString(this.getFullYear()).substring(2);
                }
                return dateString;
                break;*/
        }   
}

Date.prototype.toLocDateTimeString =
function(lan) {
    return this.toLocDateString(lan) + " " + this.toLocTimeString(lan);    
};

Date.prototype.toLocTimeString =
function(lan) {
    lan = lan || LAN;
    switch (lan) {
        case "cs":
        case "sk":
        case "en":
        case "de":
        default:
            var minutes = this.getMinutes();
            if (minutes < 10) {
                minutes = "0" + minutes.toString();
            }
            return this.getHours() + ":" + minutes;
            break;
        /*default:
            return this.toTimeString();
            break;*/
    }
};

Date.prototype.toDbDateString =
function() {
    var month = this.getMonth() + 1;
    var day   = this.getDate();
    if (month < 10) {
        month = "0" + month.toString();    
    }
    if (day < 10) {
        day = "0" + day.toString();    
    }
    return this.getFullYear() + "-" + month + "-" + day;
};

Date.prototype.toDbDateTimeString =
function() {
    var dateString = this.toDbDateString();
    var hours   = this.getHours();
    var minutes = this.getMinutes();
    var seconds = this.getSeconds();
    if (hours < 10) {
        hours = "0" + hours.toString();    
    }
    if (minutes < 10) {
        minutes = "0" + minutes.toString();    
    }
    if (seconds < 10) {
        seconds = "0" + seconds.toString();    
    }
    return dateString + " " + hours + ":" + minutes + ":" + seconds;    
};

Date.prototype.toJSON = function() { return '"' + this.toDbDateTimeString() + '"'};