/**********************************************************************
*          Calendar JavaScript [DOM] v3.10 by Michael Loesler          *
************************************************************************
* Copyright (C) 2005-09 by Michael Loesler, http//derletztekick.com    *
*                                                                      *
*                                                                      *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 3 of the License, or    *
* (at your option) any later version.                                  *
*                                                                      *
* This program is distributed in the hope that it will be useful,      *
* but WITHOUT ANY WARRANTY; without even the implied warranty of       *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
* GNU General Public License for more details.                         *
*                                                                      *
* You should have received a copy of the GNU General Public License    *
* along with this program; if not, see <http://www.gnu.org/licenses/>  *
* or write to the                                                      *
* Free Software Foundation, Inc.,                                      *
* 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.            *
*                                                                      *
 **********************************************************************/

    function CalendarJS() {
        this.now = new Date();
        this.dayname = ["Mo","Di","Mi","Do","Fr","Sa","So"];
        this.prefix = "";
        this.monthname = ["Januar","Februar","März","April","Mai","Juni","Juli","August","September","Oktober","November","Dezember"];  
        this.tooltip = ["vorheriger Monat","nächster Monat","aktuelles Datum"];
        this.monthCell = document.createElement("th");
        this.tableHead = null;
        this.parEl = null;
        this.hldatefromcsv = new Array();
        
        
        this.init = function( id, initDate ) {
            this.now = initDate?initDate:new Date();
            this.date = this.now.getDate();
            this.month = this.mm = this.now.getMonth();
            this.year = this.yy = this.now.getFullYear();
            this.monthCell.colSpan = 5;
            this.monthCell.appendChild(document.createTextNode( this.monthname[this.mm]+" "+this.yy ));
            this.tableHead = this.createTableHead();
            this.parEl = document.getElementById( id );
            this.hldatefromcsv = hldate;
            this.show();
            if (!initDate) this.checkDate();
        },
        
        
        this.checkDate = function() {
            var self = this;
            var today = new Date();
            if (this.date != today.getDate()) {
                this.date  = today.getDate();
                if (this.mm == this.month && this.yy == this.year)
                    this.switchMonth("current");
                this.month = today.getMonth();
                if (this.mm == this.month && this.yy == this.year)
                    this.switchMonth("current");
                this.year  = today.getFullYear();
                if (this.mm == this.month && this.yy == this.year)
                    this.switchMonth("current");
 
            }
            window.setTimeout(function() { self.checkDate(); }, Math.abs(new Date(this.year, this.month, this.date, 24, 0, 0)-this.now));
        },
        
        this.removeElements = function( Obj ) {
            while( Obj.childNodes.length > 0)
                Obj.removeChild(Obj.childNodes[Obj.childNodes.length-1]);
            return Obj;
        },
            
        this.show = function() {
            this.hldatefromcsv = clone(hldate);
            this.parEl = this.removeElements( this.parEl );
            this.monthCell.firstChild.replaceData(0, this.monthCell.firstChild.nodeValue.length, this.prefix+this.monthname[this.mm]+" "+this.yy);
            var table = document.createElement("table");
            table.appendChild( this.createTableBody() );
            table.appendChild( this.tableHead );
            this.parEl.appendChild( table );
        },
                
        this.createTableHead = function() {
            var thead = document.createElement("thead");
            var tr = document.createElement("tr");
            var th = this.getCell( "th", "\u00AB", "last_month" )
            th.Instanz = this;
            th.onclick = function() { this.Instanz.switchMonth("prev"); };
            th.title = this.tooltip[0];
            try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
            tr.appendChild( th );
            this.monthCell.Instanz = this;
            this.monthCell.onclick = function() { this.Instanz.switchMonth("current"); };
            this.monthCell.title = this.tooltip[2];
            try { this.monthCell.style.cursor = "pointer"; } catch(e){ this.monthCell.style.cursor = "hand"; }
            tr.appendChild( this.monthCell );           
            th = this.getCell( "th", "\u00BB", "next_month" )
            th.Instanz = this;
            th.onclick = function() { this.Instanz.switchMonth("next"); };
            th.title = this.tooltip[1];
            try { th.style.cursor = "pointer"; } catch(e){ th.style.cursor = "hand"; }
            tr.appendChild( th );
            thead.appendChild( tr );
            tr = document.createElement('tr');
            for (var i=0; i<this.dayname.length; i++)
                tr.appendChild( this.getCell("th", this.dayname[i], "weekday" ) );
            thead.appendChild( tr );
            return thead;
        },
        
        this.createTableBody = function() {
            var dayspermonth = [31,28,31,30,31,30,31,31,30,31,30,31];
            var sevendaysaweek = 0;
            var begin = new Date(this.yy, this.mm, 1);
            var firstday = begin.getDay()-1;
            if (firstday < 0)
                firstday = 6;
            if ((this.yy%4==0) && ((this.yy%100!=0) || (this.yy%400==0)))
                dayspermonth[1] = 29;
            var tbody = document.createElement("tbody");
            var tr = document.createElement('tr');
            if (firstday == 0) {
                for (var i=0; i<this.dayname.length; i++) {
                    var prevMonth = (this.mm == 0)?11:this.mm-1;
                    tr.appendChild( this.getCell( "td", dayspermonth[prevMonth]-6+i, "last_month" ) );
                }
                tbody.appendChild( tr );
                tr = document.createElement('tr');
            }
            
            for (var i=0; i<firstday; i++, sevendaysaweek++) {
                var prevMonth = (this.mm == 0)?11:this.mm-1;
                tr.appendChild( this.getCell( "td", dayspermonth[prevMonth]-firstday+i+1, "last_month" ) );
                
            }
            
            for (var i=1; i<=dayspermonth[this.mm]; i++, sevendaysaweek++){
                if (this.dayname.length == sevendaysaweek){
                    tbody.appendChild( tr );
                    tr = document.createElement('tr');
                    sevendaysaweek = 0;
                }
                
                var td = null;
                if (i==this.date && this.mm==this.month && this.yy==this.year && (sevendaysaweek == 5 || sevendaysaweek == 6))
                    td = this.getCell( "td", i, "today weekend");
                else if (i==this.date && this.mm==this.month && this.yy==this.year)
                    td = this.getCell( "td", i, "today" );
                else if (sevendaysaweek == 5 || sevendaysaweek == 6)
                    td = this.getCell( "td", i, "weekend" );
                else
                    td = this.getCell( "td", i, null ); 
                    
                td.setDate = this.setDate;
                td.dd = i;
                td.mm = this.mm;
                td.yy = this.yy;
                td.onmouseover = function(e) {
                    this.style.backgroundColor = '#B5A570';
                };
                td.onmouseout = function(e) {
                    this.style.backgroundColor = '#E8E1BA';
                };
                var day = (String(td.dd).length == 1)? '0' + td.dd:td.dd;
                var month = (String(td.mm + 1).length == 1)? '0' + (td.mm + 1):(td.mm + 1);
                var year = td.yy;
                for(ii = 0; ii < this.hldatefromcsv.length; ii++) {
                    if(day+'.'+month+'.'+year == this.hldatefromcsv[ii]) {
                        td.style.textDecoration= 'underline';
                        try { td.style.cursor = "pointer"; } catch(e){ td.style.cursor = "hand"; }
                        td.onclick = function(e) {
                            var currentDate = new Date(this.yy, this.mm, this.dd);
                            this.setDate( currentDate );
                        };
                        this.hldatefromcsv.shift();
                        break;
                    }
                }
                tr.appendChild( td );
            }
    
            var daysNextMonth = 1;
            for (var i=sevendaysaweek; i<this.dayname.length; i++) 
                tr.appendChild( this.getCell( "td", daysNextMonth++, "next_month"  ) );
                
            tbody.appendChild( tr );
            
            while (tbody.getElementsByTagName("tr").length<6) {
                tr = document.createElement('tr');
                for (var i=0; i<this.dayname.length; i++) 
                    tr.appendChild( this.getCell( "td", daysNextMonth++, "next_month"  ) );
                tbody.appendChild( tr );
            }

            return tbody;
            
        },
        
        this.setDate = function(date) {
            // Weiterverarbeitung des geklickten Datums
            var day = (String(date.getDate()).length == 1)? '0' + date.getDate():date.getDate();
            var month = (String(date.getMonth() + 1).length == 1)? '0' + (date.getMonth() + 1):(date.getMonth() + 1);
            var year = date.getFullYear();
            window.location.href='/veranstaltungen/kalender/?datum=' + year + '-' + month + '-' + day;
        }
        
        this.getCell = function(tag, str, cssClass) {
            var El = document.createElement( tag );
            El.appendChild(document.createTextNode( str ));
            if (cssClass != null)
                El.className = cssClass;
            return El;
        },
        
        this.switchMonth = function( s ){
            switch (s) {
                case "prev": 
                    this.yy = (this.mm == 0)?this.yy-1:this.yy;
                    this.mm = (this.mm == 0)?11:this.mm-1;
                break;
                
                case "next":
                    this.yy = (this.mm == 11)?this.yy+1:this.yy;
                    this.mm = (this.mm == 11)?0:this.mm+1;
                break;
                
                case "current":
                    this.yy = this.year;
                    this.mm = this.month;
                break;
            }
            this.show();
        }
    }
    
    var DOMContentLoaded = false;
    function addContentLoadListener (func) {
        if (document.addEventListener) {
            var DOMContentLoadFunction = function () {
                window.DOMContentLoaded = true;
                func();
            };
            document.addEventListener("DOMContentLoaded", DOMContentLoadFunction, false);
        }
        var oldfunc = (window.onload || new Function());
        window.onload = function () {
            if (!window.DOMContentLoaded) {
                oldfunc();
                func();
            }
        };
    }
    
    addContentLoadListener( function() { 
            datum = GET('datum');
            if (!document.getElementById('calendar')){
                return;
            }
            if (datum != 'undefined') {
            
                dateArr = datum.split('-');

                new CalendarJS().init("calendar", new Date(Number(dateArr[0]), (Number(dateArr[1]) - 1), Number(dateArr[2])));
            } else {
                new CalendarJS().init("calendar");
            }
    } );
    
    function clone(obj){
        if(obj == null || typeof(obj) != 'object')
            return obj;
        if(obj.constructor == Array)
            return [].concat(obj);
        var temp = {};
        for(var key in obj)
            temp[key] = clone(obj[key]);
        return temp;
    }
    
    function GET(v)
    {
        var HTTP_GET_VARS=new Array();
        var strGET=document.location.search.substr(1,document.location.search.length);
        if(strGET!='')
        {
            var gArr=strGET.split('&');
            for(i=0;i<gArr.length;++i)
            {
                vi='';vArr=gArr[i].split('=');
                if(vArr.length>1){vi=vArr[1];}
                HTTP_GET_VARS[unescape(vArr[0])]=unescape(vi);
            }
        }
        if(!HTTP_GET_VARS[v]){return 'undefined';}
        return HTTP_GET_VARS[v];
    }

