(function() {

    /**
    * IntervalCalendar is an extension of the CalendarGroup designed specifically
    * for the selection of an interval of dates.
    *
    * @namespace YAHOO.sensimar.calendar
    * @module calendar
    * @since 2.5.2
    * @requires yahoo, dom, event, calendar
    */

    /**
    * IntervalCalendar is an extension of the CalendarGroup designed specifically
    * for the selection of an interval of dates, as opposed to a single date or
    * an arbitrary collection of dates.
    * <p>
    * <b>Note:</b> When using IntervalCalendar, dates should not be selected or
    * deselected using the 'selected' configuration property or any of the
    * CalendarGroup select/deselect methods. Doing so will corrupt the internal
    * state of the control. Instead, use the provided methods setInterval and
    * resetInterval.
    * </p>
    * <p>
    * Similarly, when handling select/deselect/etc. events, do not use the
    * dates passed in the arguments to attempt to keep track of the currently
    * selected interval. Instead, use getInterval.
    * </p>
    *
    * @namespace YAHOO.sensimar.calendar
    * @class IntervalCalendar
    * @extends YAHOO.widget.CalendarGroup
    * @constructor
    * @param {String | HTMLElement} container The id of, or reference to, an HTML DIV element which will contain the control.
    * @param {Object} cfg optional The initial configuration options for the control.
    */
    function IntervalCalendar(container, cfg) {
        /**
        * The interval state, which counts the number of interval endpoints that have
        * been selected (0 to 2).
        * 
        * @private
        * @type Number
        */
        this._iState = 0;

        // Must be a multi-select CalendarGroup
        cfg = cfg || {};
        cfg.multi_select = true;

        // Call parent constructor
        IntervalCalendar.superclass.constructor.call(this, container, cfg);

        // Subscribe internal event handlers
        this.beforeSelectEvent.subscribe(this._intervalOnBeforeSelect, this, true);
        this.selectEvent.subscribe(this._intervalOnSelect, this, true);
        this.beforeDeselectEvent.subscribe(this._intervalOnBeforeDeselect, this, true);
        this.deselectEvent.subscribe(this._intervalOnDeselect, this, true);
		
    }

    /**
    * Default configuration parameters.
    * 
    * @property IntervalCalendar._DEFAULT_CONFIG
    * @final
    * @static
    * @private
    * @type Object
    */
    IntervalCalendar._DEFAULT_CONFIG = YAHOO.widget.CalendarGroup._DEFAULT_CONFIG;

    YAHOO.lang.extend(IntervalCalendar, YAHOO.widget.CalendarGroup, {

        /**
        * Returns a string representation of a date which takes into account
        * relevant localization settings and is suitable for use with
        * YAHOO.widget.CalendarGroup and YAHOO.widget.Calendar methods.
        * 
        * @method _dateString
        * @private
        * @param {Date} d The JavaScript Date object of which to obtain a string representation.
        * @return {String} The string representation of the JavaScript Date object.
        */
        _dateString : function(d) {
            var a = [];
            a[this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.MDY_MONTH_POSITION.key)-1] = (d.getMonth() + 1);
            a[this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.MDY_DAY_POSITION.key)-1] = d.getDate();
            a[this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.MDY_YEAR_POSITION.key)-1] = d.getFullYear();
            var s = this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.DATE_FIELD_DELIMITER.key);
            return a.join(s);
        },

        /**
        * Given a lower and upper date, returns a string representing the interval
        * of dates between and including them, which takes into account relevant
        * localization settings and is suitable for use with
        * YAHOO.widget.CalendarGroup and YAHOO.widget.Calendar methods.
        * <p>
        * <b>Note:</b> No internal checking is done to ensure that the lower date
        * is in fact less than or equal to the upper date.
        * </p>
        * 
        * @method _dateIntervalString
        * @private
        * @param {Date} l The lower date of the interval, as a JavaScript Date object.
        * @param {Date} u The upper date of the interval, as a JavaScript Date object.
        * @return {String} The string representing the interval of dates between and
        *                   including the lower and upper dates.
        */
        _dateIntervalString : function(l, u) {
            var s = this.cfg.getProperty(IntervalCalendar._DEFAULT_CONFIG.DATE_RANGE_DELIMITER.key);
            return (this._dateString(l)
                    + s + this._dateString(u));
        },

        /**
        * Returns the lower and upper dates of the currently selected interval, if an
        * interval is selected.
        * 
        * @method getInterval
        * @return {Array} An empty array if no interval is selected; otherwise an array
        *                 consisting of two JavaScript Date objects, the first being the
        *                 lower date of the interval and the second being the upper date.
        */
        getInterval : function() {
            // Get selected dates
            var dates = this.getSelectedDates();
            if(dates.length > 0) {
                // Return lower and upper date in array
                var l = dates[0];
                var u = dates[dates.length - 1];
                return [l, u];
            }
            else {
                // No dates selected, return empty array
                return [];
            }
        },

        /**
        * Sets the currently selected interval by specifying the lower and upper
        * dates of the interval (in either order).
        * <p>
        * <b>Note:</b> The render method must be called after setting the interval
        * for any changes to be seen.
        * </p>
        * 
        * @method setInterval
        * @param {Date} d1 A JavaScript Date object.
        * @param {Date} d2 A JavaScript Date object.
        */
        setInterval : function(d1, d2) {
            // Determine lower and upper dates
            var b = (d1 <= d2);
            var l = b ? d1 : d2;
            var u = b ? d2 : d1;
            // Update configuration
            this.cfg.setProperty('selected', this._dateIntervalString(l, u), false);
            this._iState = 2;
        },

        /**
        * Resets the currently selected interval.
        * <p>
        * <b>Note:</b> The render method must be called after resetting the interval
        * for any changes to be seen.
        * </p>
        * 
        * @method resetInterval
        */
        resetInterval : function() {
            // Update configuration
            this.cfg.setProperty('selected', [], false);
            this._iState = 0;
        },

        /**
        * Handles beforeSelect event.
        * 
        * @method _intervalOnBeforeSelect
        * @private
        */
        _intervalOnBeforeSelect : function(t,a,o) {
            // Update interval state
            this._iState = (this._iState + 1) % 3;
            if(this._iState == 0) {
                // If starting over with upcoming selection, first deselect all
                this.deselectAll();
                this._iState++;
            }
        },

        /**
        * Handles selectEvent event.
        * 
        * @method _intervalOnSelect
        * @private
        */
        _intervalOnSelect : function(t,a,o) {
            // Get selected dates
            var dates = this.getSelectedDates();
            if(dates.length > 1) {
                /* If more than one date is selected, ensure that the entire interval
                    between and including them is selected */
                var l = dates[0];
                var u = dates[dates.length - 1];
                this.cfg.setProperty('selected', this._dateIntervalString(l, u), false);
            }
            // Render changes
            this.render();
        },

        /**
        * Handles beforeDeselect event.
        * 
        * @method _intervalOnBeforeDeselect
        * @private
        */
        _intervalOnBeforeDeselect : function(t,a,o) {
            if(this._iState != 0) {
                /* If part of an interval is already selected, then swallow up
                    this event because it is superfluous (see _intervalOnDeselect) */
                return false;
            }
        },

        /**
        * Handles deselectEvent event.
        *
        * @method _intervalOnDeselect
        * @private
        */
        _intervalOnDeselect : function(t,a,o) {
            if(this._iState != 0) {
                // If part of an interval is already selected, then first deselect all
                this._iState = 0;
                this.deselectAll();

                // Get individual date deselected and page containing it
                var d = a[0];
                var date = YAHOO.widget.DateMath.getDate(d[0], d[1] - 1, d[2]);
                var page = this.getCalendarPage(date);
                if(page) {
                    // Now (re)select the individual date
                    page.beforeSelectEvent.fire();
                    this.cfg.setProperty('selected', this._dateString(date), false);
                    page.selectEvent.fire([d]);
                }
                // Swallow up since we called deselectAll above
                return false;
            }
        }
    });

    YAHOO.namespace("sensimar.calendar");
    YAHOO.sensimar.calendar.IntervalCalendar = IntervalCalendar;
})();

	var setCheck = function(e) {
		var trigger = YAHOO.util.Event.getTarget(e);
		var newradios_ecard = YAHOO.util.Dom.getElementsByClassName("radio_on_ecard");
		var newradios = YAHOO.util.Dom.getElementsByClassName("radio_on");
		var splitid = trigger.id.split("__");
		for (var i=0;i<newradios.length;i++) {
			if(newradios[i].id.lastIndexOf(splitid[0]) != -1) {
				YAHOO.util.Dom.replaceClass(newradios[i], "radio_on", "radio_off");
			}
		}
		for (var j=0;j<newradios_ecard.length;j++) {
			if(newradios_ecard[j].id.lastIndexOf(splitid[0]) != -1) {
				YAHOO.util.Dom.replaceClass(newradios_ecard[j], "radio_on_ecard", "radio_off_ecard");
			}
		}
		replaceRadios();
		var inputs = document.getElementsByTagName("input");
		for(var i=0;i<inputs.length;i++) {
			if (inputs[i].type == "radio" && inputs[i].name.lastIndexOf(splitid[0]) != -1) {
				inputs[i].checked = false;
				if(inputs[i].value == splitid[1]) {
					inputs[i].checked = true;
				}
			}
		}
		if (trigger.className == "radio_off"){
			YAHOO.util.Dom.replaceClass(trigger, "radio_off", "radio_on");
		}
		if (trigger.className == "radio_off_ecard"){
			YAHOO.util.Dom.replaceClass(trigger, "radio_off_ecard", "radio_on_ecard");
		}
	}

	var setCheck_img = function(e) {
		var trigger = YAHOO.util.Event.getTarget(e);
		var ancestor = YAHOO.util.Dom.getAncestorByTagName(trigger, "div");
		var newradios_ecard = YAHOO.util.Dom.getElementsByClassName("radio_on_ecard");
		var splitid = ancestor.id.split("__");
		for (var j=0;j<newradios_ecard.length;j++) {
			if(newradios_ecard[j].id.lastIndexOf(splitid[0]) != -1) {
				YAHOO.util.Dom.replaceClass(newradios_ecard[j], "radio_on_ecard", "radio_off_ecard");
			}
		}
		replaceRadios();
		var inputs = document.getElementsByTagName("input");
		for(var i=0;i<inputs.length;i++) {
			if (inputs[i].type == "radio" && inputs[i].name.lastIndexOf(splitid[0]) != -1) {
				inputs[i].checked = false;
				if(inputs[i].value == splitid[1]) {
					inputs[i].checked = true;
				}
			}
		}
		if (ancestor.className == "radio_off_ecard"){
			YAHOO.util.Dom.replaceClass(ancestor, "radio_off_ecard", "radio_on_ecard");
		}
	}
	
	
	var replaceRadios = function() {
		var inputs = document.getElementsByTagName("input");
		var posFormcontent = YAHOO.util.Dom.getXY("contentwrap");
		var posForm = YAHOO.util.Dom.getXY("ecard");
		for(i=0;i<inputs.length;i++){
			if (inputs[i].type == "radio") {
				var posXY = YAHOO.util.Dom.getXY(inputs[i]);
				var posLeft = posXY[0] - posFormcontent[0];
				var posTop = posXY[1] - posFormcontent[1];
				var posLeft_ecard = posXY[0] - posForm[0];
				var posTop_ecard = posXY[1] - posForm[1];
				if (YAHOO.util.Dom.get(inputs[i].name + "__" + inputs[i].value)) {
					if (YAHOO.util.Dom.getAncestorByTagName(inputs[i].id, "form").id == "ecard"){
						posTop_ecard = posTop_ecard - 90;
						YAHOO.util.Dom.setStyle(inputs[i].name + "__" + inputs[i].value, "top", posTop_ecard + "px");	
					}else{
						YAHOO.util.Dom.setStyle(inputs[i].name + "__" + inputs[i].value, "top", posTop + "px");	
					}
				}else{
					var newdiv = document.createElement("div");
					newdiv.id = inputs[i].name + "__" + inputs[i].value;

					newdiv.title =  inputs[i].title;
					if (YAHOO.util.Dom.getAncestorByTagName(inputs[i].id, "form").id == "ecard"){
						if (inputs[i].checked){
							newdiv.className = "radio_on_ecard";
						}else{
							newdiv.className = "radio_off_ecard";
						}  
						var newimg = document.createElement("img");
						newimg.src = inputs[i].previousSibling.firstChild.src;
						newimg.id = inputs[i].previousSibling.firstChild.id;
						newdiv.appendChild(newimg);
						YAHOO.util.Dom.setStyle(inputs[i], "visibility", "hidden");
						YAHOO.util.Dom.setStyle(inputs[i].previousSibling.firstChild, "visibility", "hidden");							
						YAHOO.util.Dom.setStyle(inputs[i].previousSibling, "visibility", "hidden");	
						YAHOO.util.Dom.get("compose_ecard").appendChild(newdiv);
						YAHOO.util.Dom.setStyle(newdiv.id, "position", "absolute");
			
						posLeft_ecard = posLeft_ecard - 160;
						posTop_ecard = posTop_ecard - 90;
						YAHOO.util.Dom.setStyle(newdiv.id, "left", posLeft_ecard + "px");
						YAHOO.util.Dom.setStyle(newdiv.id, "top", posTop_ecard + "px");
						YAHOO.util.Event.addListener(newdiv, 'click', setCheck);
						YAHOO.util.Event.addListener(newimg, 'click', setCheck_img);
					}else{
						if (inputs[i].checked){
							newdiv.className = "radio_on";
						}else{
							newdiv.className = "radio_off";
						}						
						newdiv.innerHTML = inputs[i].nextSibling.firstChild.data;
						YAHOO.util.Dom.setStyle(inputs[i], "visibility", "hidden");
						YAHOO.util.Dom.setStyle(inputs[i].nextSibling, "visibility", "hidden");	
						YAHOO.util.Dom.get("contentwrap").appendChild(newdiv);
						YAHOO.util.Dom.setStyle(newdiv.id, "position", "absolute");
						YAHOO.util.Dom.setStyle(newdiv.id, "left", posLeft + "px");
						YAHOO.util.Dom.setStyle(newdiv.id, "top", posTop + "px");
						YAHOO.util.Event.addListener(newdiv, 'click', setCheck);
					}
				}  
			}
		}	
	}
	
	var delSearchinput = function() {
		YAHOO.util.Dom.get("searchitem").value = "";
	}
	
	var fillSearchinput = function() {
		if (trim(YAHOO.util.Dom.get("searchitem").value) == "") {
			YAHOO.util.Dom.get("searchitem").value = "Suchbegriff";
		}
	}


YAHOO.util.Event.onDOMReady(function() {
	if (YAHOO.util.Dom.get("buchungs_form")){
	    var inTxt = YAHOO.util.Dom.get("in"),
	        outTxt = YAHOO.util.Dom.get("out"),
	        inDate, outDate, interval;
		
		var in_date_before = 0;
		var out_date_before = 0;

	    inTxt.value = "";
	    outTxt.value = "";

	    var cal = new YAHOO.sensimar.calendar.IntervalCalendar("cal1Container", {pages:2});

	    cal.selectEvent.subscribe(function() {
	        interval = this.getInterval();

	        if (interval.length == 2) {
	            inDate = interval[0];
	            inTxt.value = inDate.getDate() + "." + (inDate.getMonth() + 1) + "." + inDate.getFullYear();

	            if (interval[0].getTime() != interval[1].getTime()) {
	                outDate = interval[1];
	                outTxt.value = outDate.getDate() + "." + (outDate.getMonth() + 1) + "." + outDate.getFullYear();
	            } else {
	                outTxt.value = "";
	            }
	        }
	    }, cal, true);

		cal.showEvent.subscribe(function() {
			//wenn datum valide ist
			var sDates = cal.getSelectedDates();
			var in_date = inTxt.value;
			var out_date = outTxt.value;
			var reg = in_date.match(/[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}/gi);
			if(reg){
				var in_splitted = inTxt.value.split(".");
				var in_formatted = in_splitted[1] + "/" + in_splitted[0] + "/" + in_splitted[2];
				var date1 = new Date(in_formatted.toString());
			}else{
				date1 = sDates[0];
			}	
			var reg = out_date.match(/[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{4}/gi);
			if(reg){
				var out_splitted = outTxt.value.split(".");
				var out_formatted = out_splitted[1] + "/" + out_splitted[0] + "/" + out_splitted[2];
				var date2 = new Date(out_formatted.toString());
			}else{
				date2 = sDates[sDates.length - 1];
			}	
				this.setInterval(date1, date2);
				cal.render();
		}, cal, true);
		
	    cal.cfg.setProperty("MDY_DAY_POSITION", 1); 
		cal.cfg.setProperty("MDY_MONTH_POSITION", 2); 
		cal.cfg.setProperty("MDY_YEAR_POSITION", 3); 
		cal.cfg.setProperty("DATE_FIELD_DELIMITER", "."); 
		cal.cfg.setProperty("MONTHS_LONG",    ["Januar", "Februar", "M\u00E4rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]);
		cal.cfg.setProperty("WEEKDAYS_SHORT", ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"]);	
		cal.cfg.setProperty("close", true);
		cal.cfg.setProperty("title", "Bitte w&auml;hlen Sie einen Reisezeitraum aus:")
		
	    cal.render();
		
		YAHOO.util.Event.addListener(["calendar_link_start", "calendar_link_end"], "click", function() {
			YAHOO.util.Dom.setStyle("cal1Container", "display", "inline");
			cal.show();}
			);
		YAHOO.util.Event.addListener(["in", "out"], "click", function() {
			YAHOO.util.Dom.setStyle("cal1Container", "display", "none");
			cal.hide();}
			);
		YAHOO.util.Event.addListener("reise_typ__eigene", "click", function() { 
			YAHOO.util.Dom.setStyle("airport", "display", "none");
			YAHOO.util.Dom.setStyle("buchungs_form", "padding-bottom", "30px");
			}
		);
		YAHOO.util.Event.addListener("reise_typ__pauschal", "click", function() { 
			YAHOO.util.Dom.setStyle("airport", "display", "inline");}
		);	
	}
	
	YAHOO.util.Event.addListener("searchitem", "focus", delSearchinput);
	YAHOO.util.Event.addListener("searchitem", "blur", fillSearchinput);
	replaceRadios();
});


function pauschal_link(){
	var formobj = document.getElementById("buchungs_form");
	var link = "http://www.tui2.com/index.html?KID=790006&formular=4&showresult=1&detail=termine";
	var personen = "&personen=";
	
	switch (formobj.adults.value){
		case "1":
			personen = personen + "25;";
			break;
		case "2":
			personen = personen + "25;25;";
			break;
		case "3":
			personen = personen + "25;25;25;";
			break;
		case "4":
			personen = personen + "25;25;25;25;";
			break;
		default:
			personen = personen + "25;25;";
			break;
	}
	
	var child1 = formobj.children.value;
	var child2 = formobj.children2.value;
	var child3 = formobj.children3.value;
	
	var children = "";
	
	if (child1 != -1){
		children = child1 + ";"
	}
	if (child2 != -1){
		children = children + child2 + ";"
	}
	if (child3 != -1){
		children = children + child3 + ";"
	}
	
	var hotel = formobj.hotel.value.substr(0, formobj.hotel.value.indexOf(","));
	var IFF = "&IFF=TUI;" + hotel;
	if (formobj.hotel.value.length > 2){
		var leistung = formobj.hotel.value.substr(formobj.hotel.value.lastIndexOf(",")+1, 4);
		var sleistung = "&sleistung=;" + leistung + ";;";
	}else{
		var sleistung = "&sleistung=" + "-1";
	}
	var id = "&id=2";
	var dauer = "&dauer=" + formobj.duration.value;
	var abflughafen = "&abflughafen=" + formobj.airport.value;
	var termin = "&termin=" + formobj.in_date.value;
	var ruecktermin = "&ruecktermin=" + formobj.out_date.value;
	var verpflegung = "&verpflegung=" + formobj.meals.value;
	
	link = link + personen + children + IFF + sleistung + id + dauer + abflughafen + termin + ruecktermin + verpflegung;
	alert(link);
	return link;
	
}

function direkt_link(){
	var formobj = document.getElementById("buchungs_form");
	var link = "http://www.tui.com/WOT/Startseite?selftravel";
	var duration = "&duration=" + formobj.duration.value;
	var personen = "&occupancy=";
	
	switch (formobj.adults.value){
		case "1":
			personen = personen + "99;";
			break;
		case "2":
			personen = personen + "99;99;";
			break;
		case "3":
			personen = personen + "99;99;99;";
			break;
		case "4":
			personen = personen + "99;99;99;99;";
			break;
		default:
			personen = personen + "99;99;";
			break;
	}
	
	var child1 = formobj.children.value;
	var child2 = formobj.children2.value;
	var child3 = formobj.children3.value;
	
	var children = "";
	
	if (child1 != -1){
		children = child1 + ";"
	}
	if (child2 != -1){
		children = children + child2 + ";"
	}
	if (child3 != -1){
		children = children + child3 + ";"
	}
	
	var verpflegung = "&boarding=";
	
	switch (formobj.meals.value) {
		case "-1":
			verpflegung = verpflegung + "-1"
			break;
		case "0":
			verpflegung = verpflegung + "U"
			break;
		case "1":
			verpflegung = verpflegung + "G"
			break;
		case "2":
			verpflegung = verpflegung + "H"
			break;
		case "3":
			verpflegung = verpflegung + "V"
			break;
		case "4":
			verpflegung = verpflegung + "A"
			break;
			
	}
	
	var startdate = formobj.in_date.value;
	var tag = startdate.substr(0, startdate.indexOf("."));
	if (tag.length == 1){
		tag = "0" + tag;
	}
	var monat = startdate.substr(startdate.indexOf(".") + 1, startdate.lastIndexOf(".") - startdate.indexOf(".") - 1);
	if (monat.length == 1){
		monat = "0" + monat;
	}
	var jahr = startdate.substr(startdate.lastIndexOf(".") + 1);
	startdate = "&startdate=" + jahr + monat + tag;
	
	var returndate = formobj.out_date.value;

	tag = returndate.substr(0, returndate.indexOf("."));
	if (tag.length == 1){
		tag = "0" + tag;
	}
	monat = returndate.substr(returndate.indexOf(".") + 1, returndate.lastIndexOf(".") - returndate.indexOf(".") - 1);
	if (monat.length == 1){
		monat = "0" + monat;
	}
	jahr = returndate.substr(returndate.lastIndexOf(".") + 1);
	returndate = "&returndate=" + jahr + monat + tag;
	
	if (formobj.hotel.value.length > 2){
		var hotel = formobj.hotel.value.substr(0, formobj.hotel.value.indexOf(","));
		var pm = formobj.hotel.value.substr(formobj.hotel.value.indexOf(",")+1, 2);
		var booking_code = "&bookingcodes=1," + hotel + "," + pm + ",";
	}else{
		var booking_code = "&bookingcodes=" + formobj.hotel.value;
	}	
	var specialAction = "&specialAction=" + formobj.hotel.value.substr(formobj.hotel.value.indexOf("#")+1, formobj.hotel.value.length - formobj.hotel.value.indexOf("#"));

	link = link + duration + personen + children + startdate + returndate + booking_code + specialAction + verpflegung + "&page=result&saDisabledField=ptSDestinationSel";
	alert(link);
	return link;
}


function send_buchungs_form(){
	var reise_typ = 0;
	var formobj = document.getElementById("buchungs_form");
	if (formobj.reise_typ[0].checked){
		var reise_typ = 1;
	}else if (formobj.reise_typ[1].checked){
		var reise_typ = 2;
	}	
	if (reise_typ == 1){
		buchungs_link = pauschal_link();
	}else if (reise_typ == 2){
		buchungs_link = direkt_link();
	}
	
	//window.location.href = buchungs_link;
}


