/**
 * 
 * @namespace  Campingwelt
 * @author  Olaf Keding <o.keding@edelweiss72.de>
 * 
 * Data for the Camping Events is generatd by EaseyRed when the Events Index Page is published
 * EaseyRed generates a file /events/js/adac_events_javascript.js
 * which contains an Array 'adaccamping_event' with the following Data:
 *
     * 
     * 0 ->event start date  :string yyy-mm-dd
     * 1 -> event end date   :string yyy-mm-dd
     * 2 -> display date     :string dayStart.monthStart - dayEnd.monthEnd
     * 3 -> headline	     :string
     * 4 -> description		     :string
     * 5 -> organizer		 :string
     * 6 -> street			 :string
     * 7 -> location		 :string
     * 8 -> anzeige			 :int as boolean: 0 = false, 1 = true
     * 9 -> category		 :string
     * 10 -> url to details 	 :string - can be empty
     * 11 -> telephone 	 :string - can be empty
     * 12 -> email  	 :string - can be empty
     * 13 -> url     	 :string - can be empty
     *
     
  * IMPORTANT: each date field has an ID in the following pattern: yyy-mm-ddd
 */

/**
* Array which allows a mapping of month number to germam month namespace
* ex:  CAMPINGGUI.monthStringArray[1] = Januar
* ex:  CAMPINGGUI.monthStringArray[11] = November*/
CAMPINGGUI.monthStringArray = new Array("","Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");

/**
* Array which allows a mapping of month tomber to days in that particular month, first vaule is dummy value
* ex: CAMPINGGUI.monthLenghtArray[2] = 28 (February)
* ex: CAMPINGGUI.monthLenghtArray[12] = 31 (December)
*
*/
CAMPINGGUI.monthLenghtArray = new Array(31,31,28,31,30,31,30,31,31,30,31,30,31);

/**
* Class which conatins parameters an functions to controll camping events generated by EasyRed
*
*/
 CAMPINGGUI.Events = {
	 
     /*-----------CONFIG-------------*/
        /**
     * String to be displayed if there is no event in a selected month, timespan or category
     */
     _noEventsMonthMessage: "<div class='no-result'>Für diesen Monat sind keine Veranstaltungen geplant.</div>",
     _noEventsCategoryMessage: "<div class='no-result'>Für diesen Kategorie ist im gewählen Zeitraum keine Veranstaltung geplant.</div>",
     _noEventsTimespanMessage: "<div class='no-result'>Für den gewählten Zeitraum keine Veranstaltung geplant.</div>",
     _eventOverText:"vorbei",
     
    /**
    * the following variables define the background and font 
    * colors used to hightlight calendar fields
    */
	_hoverBackground: "#ffdd11",
 	_hoverColor: "#000",
 	_selectedBackground: "green",
 	_selectedColor: "#fff",
 	_hasEventBackground: "#CEE6A7",
 	_hasEventColor: "#267D37",
    _defaultBackground: "#fff",
 	_defaultColor: "#000",
    
     /*-----------END CONFIG-------------*/
     
     /**
     * An array which contains all events within the currently selected month 
     * IMPORTANT! this can only be used AFTER method 'highlightMonthFields' has benn called
     */
     _possibleEventsForMonth: new Array(),

     /**
	 * Boolean which registeres whether the mouse was clicked on a caldendar field
	 */
	_mouseButtonPressed: false,
	
	/**
	 * id of the field on which mouse was pressed down
	 */
	_selectStart: "",
	
	/**
	 * id of the field on which mouse was released or of the last field the mouse 3was hovered and the mpuse button pressed
	 */
	_selectEnd: "",

    _mouseIsOver:false,
    _selectedCategory:"default", //default ist "all"
    _eventMouseOver: "",
    _dateFieldsSelected: new Array(),
    _currentMonth: "",
    _redirectOnSelect: false,
    _wasRedirectd: false,
    
    setRedirectOnSelect: function(flag)
    {
        this._redirectOnSelect = flag;
    },

    /**
     * Handles onmousedown event for date field
     * @param fieldId  - string: id of the corresponding field
     */
	handleFieldOnmousedown: function(fieldId)
	{
		this._mouseButtonPressed = true;
		this._selectStart = fieldId;
	},
    
    /**
    * Checks whether url GET parameters were passed, if so, the apropriate timespan is marked
    *
    */
    onLoadAction: function(nowYear, nowMonth, nowDay)
    {   
        var realMonth = nowMonth+1;
        var queryString = window.location.search.substring(1);
        queryString = this.parseQueryString(queryString);
        if(queryString === false) // wenn in der URl keine gültige Query steht, wird der ganez Monat betrachtet
        {
            popCalendarEvent.show(this,{day:'vb_tag',month:'vb_monat',year:'vb_jahr'},'dd.mm.yyyy','de',1);
            //popCalendarEvent.show(this,{day:15,month:10,year:2009},'dd.mm.yyyy','de',1);
            CAMPINGGUI.Events.highlightMonthFields(nowYear,realMonth);
            CAMPINGGUI.Events.buildEventsForMonth(nowMonth);
            $('selected_date').innerHTML = CAMPINGGUI.monthStringArray[realMonth]+" "+currentEventMonthBox[1];
        }
        else
        {   
            queryString[2] = this.makeDayInteger(queryString[2]);
            if(realMonth != queryString[2])
            { //wenn die auswahl nicht auf den akteullen Montat trifft, wird der übergebene Monat anegeziegt
                popCalendarEvent.setToday(false);
                $('vb_tag').value = nowDay;
                $('vb_monat').value = queryString[2];
                $('vb_jahr').value = queryString[3];
            }
            popCalendarEvent.show(this,{day:'vb_tag',month:'vb_monat',year:'vb_jahr'},'dd.mm.yyyy','de',1);
            CAMPINGGUI.Events.highlightMonthFields(nowYear,queryString[2]);
            this._selectStart = queryString[0];
            this.onMouseupAction(queryString[1]);
            $('vb_tag').value = "TT"; //resetten
            $('vb_monat').value = "MM";
            $('vb_jahr').value = "YYYY";
        }
    },
   /**
     * Handles onmouseover event for date field
     * @param fieldId  - string: id of the corresponding field
     */
	handleFieldOnmouseover: function(fieldId)
	{   
        this._selectEnd = fieldId;
		if(this._mouseButtonPressed === true){ // wenn maus gedrückt ist werden felder markiert
			var eventDate = new  CAMPINGGUI.EventDatefield(fieldId);
            //nur ein Feld
			if(fieldId == this.selectStart)
			{
				this.markHover(fieldId);
			}
            //mehrere Felder
			else
			{   
				var fieldsToSelect = this.getDateIdsForSelection(this._selectStart, this._selectEnd);
                this.resetDateFieldBackgrounds();
                for(i=0; i< fieldsToSelect.length; i++){
					var field = $(fieldsToSelect[i]);
					if(field != null)
					{   
						this.markHover(fieldsToSelect[i]);
					}
				}
			}
		}
	},
    
    handleFieldOnmouseup: function(fieldId)
    {
        if(this._redirectOnSelect === true)
        {
            
           var host =window.location.host;
           var url = "http://"+host+"/events/index.php?start="+this._selectStart+"&end="+this._selectEnd;
           window.location = url;
        }
        else
        {
            this.onMouseupAction(fieldId);
        }
    },
    /**
     * Handles onmouseup event for date fields
     * If onmousedonwn and onmouseup are on the same field, that field is selected
     * else all fields between die smallest selected date and the highest selected date are marked.
     * furthermore, all events in the selected timespan  are displayed
     * @param fieldId  - string: id of the corresponding field
     */
	onMouseupAction: function(fieldId)
	{
		this._mouseButtonPressed = false;
		this.resetDateFieldBackgrounds();
		this._selectEnd = fieldId;
        var indexesToShow = new Array(); // Array in dem die Indexe des Array _possibleEventsForMonth gesammlet werden, die später angezeigt werden sollen
        var eventDate = new CAMPINGGUI.EventDatefield(fieldId);
		//nur ein Feld
		if(this._selectEnd == this._selectStart)
		{ 
			
			if(eventDate.day != 0 && eventDate.day <= CAMPINGGUI.monthLenghtArray[eventDate.month]){
				
				this.markSelected(fieldId);
				if($(fieldId).className.match("hasEvent"))
				{
					indexesToShow = this.buildEventsForDate(fieldId); // index werden gesammelt
				}
                
                this._dateFieldsSelected = new Array(); //reset selected
                this._dateFieldsSelected.push(fieldId);
				var dateDisplay = this.getDateDisplay(fieldId); // das Datum unter "Sie haben folgendes Datum / folgenden Zeitraum gewählt: "
				$("selected_date").innerHTML = dateDisplay;
			}
		}
        //meherere Felder
		else
		{
			var fieldsToSelect = this.getDateIdsForSelection(this._selectStart, this._selectEnd);
            this._dateFieldsSelected = new Array(); //reset selected
			for(i=0; i< fieldsToSelect.length; i++){
                this._dateFieldsSelected.push(fieldsToSelect[i]);
				var field = $(fieldsToSelect[i]);
				if(field != null)
				{
					this.markSelected(fieldsToSelect[i]);
					if(field.className.match("hasEvent"))
					{
						var tempIndexes = this.buildEventsForDate(fieldsToSelect[i]);
                        for(l = 0; l < tempIndexes.length; l++)
                         {
                            indexesToShow.push(tempIndexes[l]); //indexe werden gesammelt
                         }
					}
				}
			}
            //das Datum unter "Sie haben folgendes Datum / folgenden Zeitraum gewählt: "
            var startId = fieldsToSelect[0];
            var endId = fieldsToSelect[fieldsToSelect.length -1];
            var dateDisplay = this.getDateDisplay(startId, endId);
            $("selected_date").innerHTML = dateDisplay;
		}
        //HTML für Felder anzeigen
        indexesToShow = indexesToShow.uniq();
        if(indexesToShow.length != 0) // wenn es eienn Event in dem ZeItnraum gibt
        {   
            //this.hideNoResultsMessage(); //etwaige Fehlermeldungen ausblenden
            $("events_container").innerHTML = "";
            var eventNode;
            var eventArray;
            for(m=0; m<indexesToShow.length; m++)
            {  
                eventArray = this._possibleEventsForMonth[indexesToShow[m]];
                eventNode = this.buildEventNode(eventArray);
                $("events_container").appendChild(eventNode); 
            }
            this.showRubrik(this._selectedCategory);
            this.makeZebra();
        }
        else if(eventDate.day != 0 && eventDate.day != 32){ // wenn kein event in diesem zeitraum geplant ist
            $("events_container").innerHTML = this._noEventsTimespanMessage;
        }
        
       
    },
    
    /**
     * Resets the background of all date fields to default or hasEvent if
     * field is marked with the class "hasEvent"
     *
     */
    resetDateFieldBackgrounds: function()
    {
        var calendarNode = $("pcEventIDcontent");
        var dateFields = calendarNode.getElementsByTagName("td");
        for(i=0; i<dateFields.length; i++)
        {	
        	if(dateFields[i].className.match("hasEvent"))
        	{
        		this.markHasEvent(dateFields[i]);
        	}
        	else
        	{
        		this.markDefault(dateFields[i]);
        	}
        }
    },

    /**
     * Generates an array of all ids to be selected
     * @param mouseDownId - Id of the field on which the mouse button was pressed
     * @param mouseUpId - Id of the field on which the mouse button was released OR on which the mouse was last hovered
     * @return - array containg all ids of fields that have to be selected
     */
    getDateIdsForSelection: function(mouseDownId, mouseUpId)
    {
	    var mouseDownArray = mouseDownId.split("-");
		var mouseUpArray = mouseUpId.split("-");
		var month = parseInt(mouseDownArray[1],10); //der Monat und das Jahr sind bei beiden Ids gleich, deshlab könnte man hier auch mouseUpArray[1] benutzen
		var year = parseInt(mouseDownArray[0],10);
		
		mouseDownDay = parseInt(mouseDownArray[2], 10);
		mouseUpDay = parseInt(mouseUpArray[2], 10);
        //der kleinere Wert wird als startwert zugewiesen, der größere als endwert...
	    if(mouseDownDay > mouseUpDay)
	    {
	    	//alert("von hinten nach vorne. down: "+mouseDownDay+" up: "+mouseUpDay);
			selectionStart = mouseUpDay;
			selectionEnd =  mouseDownDay;
		}
		else
		{
			//alert("von vorne nach hinten. down: "+mouseDownDay+" up: "+mouseUpDay);
			selectionStart = mouseDownDay;
			selectionEnd = mouseUpDay;
		}
        
		//...und dann wird gezählt
		var idPrefix = year+"-"+month+"-";
        
		var returnArray = new Array();
		for(i=selectionStart; i<=selectionEnd; i++)
		{	
           
			if(i>0 && i<= CAMPINGGUI.monthLenghtArray[month]){
				returnArray.push(idPrefix+i);
			}
		}
	return returnArray;
    },
    
    /**
     * generates a string which shows the selected date
     * @param startId - the id of the start date, if only one date is selected the id of that date
     * @param endId - the id of the end date, leave out if only one day is selected
     * @return dateDisplay - the string to be displayed 
     */
    getDateDisplay: function(startId, endId)
    {
    	if(typeof(endId) == "undefined")//nur ein Tag ausgewählt
    	{	
    		var eventDate = new CAMPINGGUI.EventDatefield(startId);
    		var dateDisplay = eventDate.day+"."+eventDate.monthString+" "+eventDate.year;
    	}else
    	{
    		var eventStartDate = new CAMPINGGUI.EventDatefield(startId);
    		var eventEndDate = new CAMPINGGUI.EventDatefield(endId);
    		var dateDisplay = eventStartDate.day+"."+eventStartDate.monthString+" "+eventStartDate.year;
    		dateDisplay += " -<br /> "+eventEndDate.day+"."+eventEndDate.monthString+" "+eventEndDate.year;
    	}
    	
    return dateDisplay;
    },
    /**
     * Reads the events from Array adaccamping_events and marks each day
     * of the month with the class "hasEvent" if it has an event
     * IMPORTANT! this method populates the array '_possibleEventsForMonth' so it must be called before
     * any events can be built
     * @param year - selected year
     * @param month - selected month
     *
     */
    highlightMonthFields: function(year, month)
    {	
        this._currentMonth = month;
        this._dateFieldsSelected = new Array();//reset seledted date fields array
		this._possibleEventsForMonth = new Array(); //reset possible events for month array
    	for(i=0; i< adaccamping_events.length; i++) // scan events array
    	{
    		var startInCurrentMonth = false;
    		var endInCurrentMonth = false;
    		var startEvent = 0;
    		var endEvent = 0;
    		var startDateSplitUp = adaccamping_events[i][0].split("-"); //adaccamping_events[i][0] -> start date of an event
    		var endDateSplitUp = adaccamping_events[i][1].split("-"); //adaccamping_events[i][1] -> end date of an event
    		
    		//wenn das start datum in den aktuellen monat fällt...
    		if(year == startDateSplitUp[0] && month == startDateSplitUp[1])
    		{
    			startInCurrentMonth = true;
    		}
    		//wenn das enddatum in den aktullen Monat fällt
    		if (year == endDateSplitUp[0] && month == endDateSplitUp[1])
    		{
    			endInCurrentMonth = true;
    		}
    		// wenn der Event in den aktuellen monat fällt...
           
    		if(startInCurrentMonth === true || endInCurrentMonth === true)
    		{
    			this._possibleEventsForMonth.push(adaccamping_events[i]);
    			var startDay = this.makeDayInteger(startDateSplitUp[2]);
        		var endDay = this.makeDayInteger(endDateSplitUp[2]);
	    		//wenn start nicht, aber Ende schon im aktellen Monat, werden alle Tage vom 1. bis zum Ende makriert
	    		if(startInCurrentMonth === false && endInCurrentMonth === true)
	    		{
	    			startEvent = 1;
	    			endEvent = endDay;
	    		}
	    		// wenn start und ende in den aktuellen monat fallen werden alle Tage markiert, die zwischen start und ende liegen 
	    		else if (startInCurrentMonth === true && endInCurrentMonth === true)
	    		{
	    			startEvent = startDay;
	    			endEvent = endDay;
	    			
	    		}
	    		// wenn start im aktuellen Monat aber Ende nicht werden alle Tage vom start bis zum letzen Tag des Monats markiert
	    		else if (startInCurrentMonth === true && endInCurrentMonth === false)
	    		{
	    			startEvent = startDay;
	    			endEvent = CAMPINGGUI.monthLenghtArray[month];
	    		}
    			for(j=startEvent; j<=endEvent; j++)
    			{   
                    // für jedes Feld zwischen start und Ende wird die Id
                    // im richtigen Format erstellt (yyy-mm-dd) und dann das entsprechende Feld markiert
    				var fieldId = year+"-"+month+"-"+j;
    				this.markHasEvent(fieldId);
    			}
	    	}
    	}
    },
    
    /**
    * marks fields with the 'hover' font-color an background, if field has event, it is marked with the hasEvent font-color
    * @param field Id - field to mark
    */
    markHover: function(fieldId)
    {   
        if($(fieldId).className.match("hasEvent"))
        {
            hoverColor = this._hasEventColor;
        }
        else
        {
            hoverColor = this._hoverColor;
        }
    	this.markField(fieldId, this._hoverBackground, hoverColor);
    },
    /**
    * marks fields with the 'selected' font-color an background, if field has event, it is marked with the hasEvent font-color
    * @param field Id - field to mark
    */
    markSelected: function(fieldId)
    {
        if($(fieldId).className.match("hasEvent"))
        {
            selectColor = this._hasEventBackground;
        }
        else
        {
            selectColor = this._selectedColor;
        }
    	this.markField(fieldId, this._selectedBackground, selectColor);
    },
     /**
    * marks fields with the default font-color an background
    * @param field Id - field to mark
    */
    markDefault: function(fieldId)
    {
    	this.markField(fieldId, this._defaultBackground, this._defaultColor);
    },
    
    /**
    * marks fields with the default font-color an background and events with the class "hasEvent" as events
    * @param field Id - field to mark
    */
    markDefaultIgnoreHasEvent: function(fieldId)
    {
         if($(fieldId).className.match("hasEvent"))
        {
            bg = this._hasEventBackground;
            color = this._hasEventColor;
        }
        else
        {
            bg = this._defaultBackground;
            color = this._defaultColor;
        }
        this.markField(fieldId, bg, color);
    },
     /**
    * marks fields with the 'hasEvent' font-color an background and adds the class "hasEvent"
    * @param field Id - field to mark
    */
    markHasEvent: function(fieldId)
    {
    	this.markField(fieldId, this._hasEventBackground, this._hasEventColor);
    	$(fieldId).addClassName("hasEvent");
    },
    /**
    *function used by the above functions to to the actual work
    * @param fieldId - field to mark
    * @param background - color of the field background, ex. '#3abc78', 'green'
    * @param color - font-color of the field, ex. '#fff', 'red'
    */
    markField: function(fieldId, bg, color)
    {
	    var node = $(fieldId);
		if(node !== null)
		{
			node.style.background = bg;
			node.style.color = color;
		}
    },
    /**
    * converts a string with the format 01, 01 03 etc to an int with teh format 1,2,3 etc
    * @param numberString
    * @return int Value of numberString
    *
    */
    makeDayInteger: function(numberString)
    {
    	
    	if(numberString.substring(0,1) == "0"){
    		return parseInt(numberString.substring(1), 10);
    	}
    	else
    	{
    		return parseInt(numberString, 10);
    	}
    },
  
    
    /**
    * builds an array with the indexes in the array '_possibleEventsForMonth'
    * for events which take place on the date specified
    * @param dateId - date to check for events
    * @retrun arrayReturn - indexes of array '_possibleEventsForMonth' which take place on 'dateId'
    */
    buildEventsForDate: function(dateId)
    {
		var date = new CAMPINGGUI.EventDatefield(dateId);
        var arrayReturn = new Array();
        for(k=0; k<this._possibleEventsForMonth.length; k++){
			var startSplit = this._possibleEventsForMonth[k][0].split("-");
			var endSplit = this._possibleEventsForMonth[k][1].split("-");
			var eventStartDay = this.makeDayInteger(startSplit[2]);
			var eventStartMonth = this.makeDayInteger(startSplit[1]);
			var eventEndDay = this.makeDayInteger(endSplit[2]);
			// wenn das Ende des Events nicht im gesuchten Monat ist
			if(eventEndDay < eventStartDay && eventStartMonth == date.month)
			{
				eventEndDay =32;
			}
            // wenn der Anfang des Events nicht im gesuchten Monat ist.
			else if(eventEndDay < eventStartDay && eventStartMonth != date.month)
			{
				eventStartDay =1;
			}
            //wenn der gesuchte tag zwichen start und ende des event ist wird der event zum array hinzugefügt
			if(eventStartDay<=date.day && eventEndDay >= date.day)
			{   
                arrayReturn.push(k);
			}
        }
        return arrayReturn;
    },
    
    /**
    * Takes an Array from 'adaccamping_events[i]' and builds the HTML respresenting the event
    * @param Array with the following structure:
    * 0 ->event start date  :string yyy-mm-dd
    * 1 -> event end date   :string yyy-mm-dd
    * 2 -> display date     :string dayStart.monthStart - dayEnd.monthEnd
    * 3 -> headline	        :string
    * 4 -> description		:string
    * 5 -> organizer		:string
    * 6 -> street			:string
    * 7 -> location		    :string
    * 8 -> anzeige			:int as boolean: 0 = false, 1 = true
    * 9 -> category		    :string
    * 10 -> url to details 	:string - can be empty
    * 11 -> telephone 	 :string - can be empty
    * 12 -> email  	 :string - can be empty
    * 13 -> url     	 :string - can be empty
    * @return eventNode- Javascript Element Object containign an the event
    */
    buildEventNode: function(eventArray)
    {
        var hasDetailPage = true;
    	if(eventArray[10] === "") // Klasse für den Event setzen
        {
            hasDetailPage = false;
            var eventClassName = "event-entry-nodetails "+"cat-"+eventArray[9];
        }
        else
        {
            var eventClassName = "event-entry-details "+"cat-"+eventArray[9];
        }
    	if(eventArray[8] == 0) //Anzeige oder keine Anzeige
        {
            var eventAnzeige = "";
        }
        else
        {
            var eventAnzeige = '<div class="events-anzeige font-anzeige">&ndash; ANZEIGE &ndash;</div>';
        }
        
        if(eventArray[2]== "") //Wenn Event Datum, wenn schon vorbei...
        {
            var eventDate = this._eventOverText;//"Schon<br />vorbei";
        }
        else
        {
            var eventDate = eventArray[2];
        }
        //alert(eventArray[10]);
        if(eventArray[10] !== "")// Link bekommt nur dann ein href, webb detailseite vorhanden
        {
            eventHref = eventArray[10];
        }
        else
        {
            eventHref = "javascript:void(0);";
        }
    	var onmouseover = "CAMPINGGUI.Events.selectDateFieldsForEvent('"+eventArray[0]+"','"+eventArray[1]+"');";
    	var eventNode = document.createElement("div");

    	innerHtml =		'<a href="'+eventHref+'" class="'+eventClassName+'" title="'+eventArray[3]+'" onmouseover="'+onmouseover+'">';
		innerHtml +=		'<div class="clearfix">';
		innerHtml +=		'<div class="left event-date">';
		innerHtml +=			eventDate; //dispaly date
		innerHtml +=		'</div>';
		innerHtml +=		'<div class="left event-detail">';
		innerHtml +=		eventAnzeige;
		innerHtml +=		'<div class="strong left">'+this.unescapeHtml(eventArray[3])+'</div>'; //überschrift
		innerHtml +=			'<div>';
		innerHtml +=			this.unescapeHtml(eventArray[4]);
		
        
        if(eventArray[11] != "")
		{
			innerHtml += "<br />Telefon: "+eventArray[11]; // Telephone
		}
        if(eventArray[12] != "")
		{
			innerHtml += "<br />E-Mail: <span class=\"moduleEventsEmail\" onclick=\"location.href='mailto:"+eventArray[12]+"'\">"+eventArray[12]+"</span>"; // eMail
		}
        if(eventArray[13] != "")
		{ 
		    if (eventArray[13].indexOf("http")== -1 && eventArray[13].indexOf("https")== -1) {
		    eventArray[13]='http://'+eventArray[13];    
		    }
			innerHtml += "<br /><span class=\"moduleEventsUrl link_open_dialog\" onclick=\"wt.sendinfo(false,'/events/index-"+eventArray[13]+"','click');CAMPINGGUI.targetBlankSpan('"+eventArray[13]+"');return false;\">zur Homepage</span>"; // Link HP
		}

        innerHtml +=    "<br />"+eventArray[5]; //organizer
        
		if(eventArray[6] != "")
		{
			innerHtml += "<br />"+eventArray[6]; //straße
		}
		if(eventArray[7] != "")
		{
			innerHtml += "<br />"+eventArray[7]; // Ort
		}

		innerHtml +=		'</div>';
		if(eventClassName.match("event-entry-details"))
		{
			innerHtml +=  '<div title="Details" class="button right">Detailansicht</div>';//straße
		}
		innerHtml +=	'</div>';					
		innerHtml +='</div>';					
		innerHtml +='</a>';					
    	eventNode.innerHTML = innerHtml;
    	return eventNode;
    },
    
    /**
    * Builds and shows the events for a specified month
    * @param month
    */
    buildEventsForMonth: function(month)
    {
        month = month+1; //popcalendar liefert irgenwie month-1 :(
        var eventsContainerNode =  $("events_container");
        if(eventsContainerNode != null)
        {
            eventsContainerNode.innerHTML = "";
            if(this._possibleEventsForMonth.length == 0) // wenn es keinen event in diesem Monat gibt
            {
                 $("events_container").innerHTML = this._noEventsMonthMessage;
            }
            else{
                for(i=0; i<this._possibleEventsForMonth.length; i++)
                {  
                    eventNode = this.buildEventNode(this._possibleEventsForMonth[i]);
                    eventsContainerNode.appendChild(eventNode); 
                }
                this.showRubrik(this._selectedCategory);
                this.makeZebra();
            }
        }
        
    },
    
    /**
    * if a category is selected with the "category_select" element
    * a class name 'selected' is added to events which fall into that category
    */
    showRubrik: function()
    {
         var selectNode = $("category_select");
         var selectedValue = selectNode.options[selectNode.selectedIndex].value;
         var eventNodes= $("events_container").childNodes;
         var count = 0;
         for(i=0; i<eventNodes.length; i++)
         {
            var newClassName;
            var eventClassName = eventNodes[i].firstChild.className;
            if(typeof(eventClassName) == "undefined"){eventClassName = "";}
            
            if(selectedValue == "default") //resetten aller Klassen
            {
                if(eventClassName.match("selected"))
                {
                    substringIndex = eventClassName.length-14;
                    newClassName = eventClassName.substring(0,substringIndex);
                }
                else{
                    newClassName = eventClassName; //neu = alt
                }
             }
             else if(eventClassName.match(selectedValue)) //selected
             {   
                count++;
                 if(eventClassName.match("selected"))
                 {  
                    substringIndex = eventClassName.length-14;
                    newClassName = eventClassName.substring(0,substringIndex);
                    newClassName = newClassName+" selected-true";
                 }
                 else
                 {
                    newClassName = eventClassName+" selected-true";
                  }
             }
             else // do not seleect
             {  
                if(eventClassName.match("selected"))
                 {  
                    substringIndex = eventClassName.length-14;
                    newClassName = eventClassName.substring(0,substringIndex);
                    newClassName = newClassName+" selected-false";
                  }
                 else
                 {
                    newClassName = eventClassName+" selected-false";
                    
                  }
             }
             eventNodes[i].firstChild.className = newClassName;
         }
         if(count == 0 && selectedValue != "default")
         {
            this.showNoResultsMessage(this._noEventsCategoryMessage);
         }
         else
         {
            this.hideNoResultsMessage();
         }
         
        if(selectedValue != "default")
        {
            $("category_text").innerHTML = selectNode.options[selectNode.selectedIndex].innerHTML+": "+count+" Treffer";
            this._selectedCategory = selectedValue;
        }
        else
        {
            $("category_text").innerHTML = "";
            this._selectedCategory = "default";
        }
        this.makeZebra();
    },
    
    /**
    *  shows text that appears if no event couls be found for a category
    *  @param message - String: Message text
    */
    showNoResultsMessage: function(message)
    {   
        var noResults = $("no_results");
        if(noResults == null)
        {
            var noResults = document.createElement("div");
            noResults.id = "no_results";
            noResults.innerHTML = message;
            
            $("events_container").appendChild(noResults);
        }
    },
    
     /**
    *  hides text genreated by function showNoResultsMessage
    */
    hideNoResultsMessage: function()
    {
        var noResults = $("no_results");
        if(noResults != null)
        {
            $("events_container").removeChild(noResults);
        }
    },
    
    /**
    * Gives a grey background to every second event in list
    *
    */
    
    makeZebra: function()
    {   
        var eventNodes= $("events_container").childNodes;
        var count = 1;
        var nodeLinkClassName = "";
        for(i=0; i<eventNodes.length; i++)
        {   
            nodeLinkClassName = eventNodes[i].firstChild.className;
            if(nodeLinkClassName === null) {nodeLinkClassName = "";}
            if(nodeLinkClassName.match("selected-false") === null)
            {   
                if(count%2 == 0) // wenn gerade
                {   
                    eventNodes[i].className =  "event-even";
                }
                else //wenn unerade
                {
                    eventNodes[i].className =  "event-uneven";
                }
             count++;
            }
           
        } 
    },
    
    /**
    * sets a boolean if mousepointer moves over the calendar element
    */
    handleTableOnmouseover: function()
    {   
        this._mouseIsOver = true;
    },
    
    /**
    * if the mouse pointer moves out of the calendar, 
    * the same action is taken as in "onmouseup" on a calendar field:
    */
    handleTableOnmouseout: function()
    {
        this.selectDateFieldsForEvent('reset');
        if(this._mouseIsOver === true && this._mouseButtonPressed === true)
        {
          this.onMouseupAction(this._selectEnd);
        }  
        this._mouseIsOver = false;
        this._mouseButtonPressed = false;
    }, 
    
    /**
    * Highlights all days on the caldenar on which the event with the specified headline takes place
    * @param headline - headline of the event whoose field should be highlihgtd
    */
    selectDateFieldsForEvent: function(startDate, endDate)
    {
        if(this._eventMouseOver != startDate+endDate) //damit die funtion nicht ständig durchalufen wird
        {
            if(startDate !== "reset")
            {
                this._eventMouseOver = startDate+endDate;
                currentMonth = this._currentMonth;
                var startSplit = startDate.split("-");
                var endSplit = endDate.split("-");
                var eventStartDay = this.makeDayInteger(startSplit[2]);
                var eventStartMonth = this.makeDayInteger(startSplit[1]);
                var eventEndDay = this.makeDayInteger(endSplit[2]);
                // wenn das Ende des Events nicht im gesuchten Monat ist
                if(eventEndDay < eventStartDay && eventStartMonth == currentMonth)
                {
                    eventEndDay =32;
                }
                // wenn der Anfang des Events nicht im gesuchten Monat ist.
                else if(eventEndDay < eventStartDay && eventStartMonth != currentMonth)
                {
                    eventStartDay =1;
                }
                startDate = startSplit[0]+"-"+currentMonth+"-"+eventStartDay;
                endDate = startSplit[0]+"-"+currentMonth+"-"+eventEndDay;
                var idsToSelect = this.getDateIdsForSelection(startDate, endDate);
            }
            else
            {
                this._eventMouseOver = "";
                var idsToSelect = new Array();
            }
            
            var calendarNode = $("pcEventIDcontent");
            var dateFields = calendarNode.getElementsByTagName("td");
            for(i=0; i<dateFields.length; i++)
            {
                if(idsToSelect.contains(dateFields[i].id))
                {   //console.log(dateFields[i].id+" markHover");
                    this.markHover(dateFields[i].id);
                }
                else if(this._dateFieldsSelected.contains(dateFields[i].id))
                {   
                    //console.log(dateFields[i].id+" markSelected");
                    this.markSelected(dateFields[i].id);
                }
                else
                {   
                    //console.log(dateFields[i].id+" markDefault");
                    this.markDefaultIgnoreHasEvent(dateFields[i].id);
                }
            }
        }
     },
     /**
     * Return 'false' if queyr string cannot be converted else an start an array with start and end is returned
     */
     parseQueryString: function(queryString)
     {
        if(queryString == ""){return false;} //wenn kein query string
        var stringSplit = queryString.split("&");
        if(stringSplit[0].match("start="))
        {
            var startDate = stringSplit[0].substring(6);
        }
        else {return false;} // wenn der query streing nicht die richtigen namen enthält
        
        if(stringSplit[1].match("end="))
        {
            var endDate = stringSplit[1].substring(4);
        }
        else {return false;} // wenn der query streing nicht die richtigen namen enthält
        var startSplit = startDate.split("-");
        var endSplit = endDate.split("-");
        
        var startYear = startSplit[0];
        var startMonth = startSplit[1];
        var startDay = parseInt(startSplit[2], 10);
        var endYear = endSplit[0];
        var endMonth = endSplit[1];
        var endDay = parseInt(endSplit[2],10);
        if(startDay === 0)
        {
            startDay = 1;
        }
        
        if(endDay === 32)
        {
            endDay = CAMPINGGUI.monthLenghtArray[startMonth];
        }
        
        var dateIsValidStart = this.validateDate(startYear, startMonth, startDay);
        var dateIsValidEnd = this.validateDate(endYear,endMonth,endDay);
        if(dateIsValidStart === false || dateIsValidEnd === false)
        {
            return false;
        }
        if(startYear !== endYear || startMonth != endMonth) // start unbd ende müssen im gleich jahr und im gleiche Monat liegen
        {
            return false;
        }
        
        var returnArray = new Array(startDate, endDate, startMonth, startYear);
        return returnArray;
     },
     
     validateDate: function(year, month, day)
     {
        var flagReturn = true;
        if(year.length != 4)
        {
            flagReturn = false;
        }
        year = parseInt(year, 10);
        month = parseInt(month, 10);
        day = parseInt(day, 10);
        
        if(isNaN(day) || isNaN(month)||isNaN(year)) //nummern
        {
            flagReturn = false;
        }
        if (month <1 || month > 12) //monat zwischne 1 und 12
        {
            flagReturn = false;
        }
        if(day<1 || day>CAMPINGGUI.monthLenghtArray[month]) // atg zwischen 1 und Monatslänge
        {
            
            flagReturn = false;
        } 
        return flagReturn;
     }, 
     
     unescapeHtml: function(html)
     {
         var str = html.replace(/&lt;/g, "<");
         var str2 = str.replace(/\&gt\;/g, ">");
         return str2;
     }

 }; 
 
 /**
 * Data type used in the Events class. Represent a Ddat object
 *
 */
 
 CAMPINGGUI.EventDatefield = Class.create({
	 id: "", //id yyy-mm-dd
	 day: "",
	 month: "",
	 year: "",
	 monthString:"", // ex: Januar, Februar...
	 
     /**
     * @construtor
     * @param fieldId - Id of the date field fo which a date object is to be created
     */
	 initialize: function (fieldId)
	 {
		var dateArray = fieldId.split("-");
	 	this.id = fieldId;
	 	this.day = dateArray[2];
	 	this.month = dateArray[1];
	 	this.year = dateArray[0];
	 	this.monthString = CAMPINGGUI.monthStringArray[this.month];
	 }
 });
 
 /**
 * extension of the Array Class with a "contains" function
 */
 
 Array.prototype.contains = function(obj) {
  var i = this.length;
  while (i--) {
    if (this[i] === obj) {
      return true;
    }
  }
  return false;
}
