var tt = function()
{ // ä => \xE4
// ö => \xF6
// ü => \xFC
// Ä => \xC4
// Ö => \xD6
// Ü => \xDC
// ß => \xDF
var TTAFH=new Array(
"Nord;5000",
"S\xFCd;5001",
"West;5002",
"Ost;5003",
"Altenburg-Nobitz;0",
"Amsterdam (NL);1",
"Basel-Mulhouse (CH);3",
"Berlin-Sch\xF6nefeld;4",
"Berlin-Tegel;5",
"Bremen;8",
"Br\xFCssel (B);9",
"Br\xFCssel Charleroi (B);67",
"Dortmund;10",
"Dresden;11",
"D\xFCsseldorf;12",
"Eindhoven (NL);73",
"Enschede (NL);13",
"Erfurt-Weimar;14",
"Frankfurt;15",
"Frankfurt-Hahn;16",
"Friedrichshafen;17",
"Genf (CH);18",
"Graz (A);19",
"Groningen (NL);81",
"Hamburg;20",
"Hannover;21",
"Innsbruck (A);23",
"Karlsruhe;24",
"Klagenfurt (A);27",
"K\xF6ln-Bonn;28",
"Leipzig/Halle;29",
"Linz (A);30",
"L\xFCbeck;31",
"L\xFCttich (B);32",
"Luxemburg;33",
"Maastricht - Aachen (NL);34",
"Memmingen;90",
"M\xFCnchen;36",
"M\xFCnster-Osnabr\xFCck;37",
"Niederrhein (Weeze);49",
"N\xFCrnberg;38",
"Paderborn;39",
"Rostock;40",
"Saarbr\xFCcken;41",
"Salzburg (A);42",
"Schwerin;43",
"Strasbourg (F);44",
"Stuttgart;45",
"Warschau (PL);77",
"Wien (A);46",
"Z\xFCrich (CH);47",
"Zweibr\xFCcken;48");

return {
airports: TTAFH
};
}();
tt.setDelimiter = function(delimiter){
	this.delimiter = delimiter;
}

tt.getAdultsArray = function(){
	return [
		 "1 Erw."+this.delimiter+"25"
		,"2 Erw."+this.delimiter+"25;25"
		,"3 Erw."+this.delimiter+"25;25;25"
		,"4 Erw."+this.delimiter+"25;25;25;25"
	];
}

tt.getChildrenArray = function(minAge, maxAge){
	var age = [];
	for(i = minAge; i <= maxAge; i++){
		age.push(i+((i == 1) ? " Jahr" : " Jahre")+this.delimiter+i)
	}
	return age;
}

tt.getDurationArray = function(){
	return [
		 "beliebig"+this.delimiter+"-1"
		,"exakt wie angegeben"+this.delimiter+"0"
		,"1 Tag"+this.delimiter+"6_1"
		,"2 Tage"+this.delimiter+"6_2"
		,"3 Tage"+this.delimiter+"6_3"
		,"4 Tage"+this.delimiter+"6_4"
		,"5 - 8 Tage"+this.delimiter+"10"
		,"1 Woche"+this.delimiter+"6_7"
		,"9 - 12 Tage"+this.delimiter+"7"
		,"13 - 15 Tage"+this.delimiter+"3"
		,"2 Wochen"+this.delimiter+"6_14"
		,"16 - 22 Tage"+this.delimiter+"12"
		,"3 Wochen"+this.delimiter+"6_21"
		,"< 22 Tage"+this.delimiter+"13"
	];
}

tt.getKategoryArray = function(stars){
	if(stars == 'stars'){
		return [
			 "beliebig"+this.delimiter+"-1"
			,"**"+this.delimiter+"0"
			,"***"+this.delimiter+"1"
			,"****"+this.delimiter+"2"
			,"*****"+this.delimiter+"3"
		];
	} else {
		return [
			 "beliebig"+this.delimiter+"-1"
			,"2 Sterne oder mehr"+this.delimiter+"0"
			,"3 Sterne oder mehr"+this.delimiter+"1"
			,"4 Sterne oder mehr"+this.delimiter+"2"
			,"5 Sterne"+this.delimiter+"3"
		];
	}
}

tt.getPriceArray = function(){
	return [
		 "beliebig"+this.delimiter+"-1"
		,"bis 300 €"+this.delimiter+"1"
		,"bis 500 €"+this.delimiter+"2"
		,"bis 750 €"+this.delimiter+"3"
		,"bis 1000 €"+this.delimiter+"4"
	];
}

tt.getRoomArray = function(){
	return [
		 "beliebig"+this.delimiter+"-1"
		,"Einzelzimmer"+this.delimiter+"5"
		,"Doppelzimmer"+this.delimiter+"6"
		,"Familienzimmer"+this.delimiter+"2"
		,"Bungalow"+this.delimiter+"0"
		,"Studio / Apartment / Suite"+this.delimiter+"7"
	];
}

tt.getFoodArray = function(option){
	if(option == 'min'){
		return [
			 "beliebig"+this.delimiter+"-1"
			,"nur Übernachtung"+this.delimiter+"0"
			,"Frühstück"+this.delimiter+"1"
			,"Halbpension"+this.delimiter+"2"
			,"Vollpension"+this.delimiter+"3"
			,"All Inclusive"+this.delimiter+"4"
		];
	} else {
		return [
			 "beliebig"+this.delimiter+"-1"
			,"nur Übernachtung (mind.)"+this.delimiter+"0"
			,"Frühstück (mind.)"+this.delimiter+"1"
			,"Halbpension (mind.)"+this.delimiter+"2"
			,"Vollpension (mind.)"+this.delimiter+"3"
			,"All Inclusive (mind.)"+this.delimiter+"4"
		];
	}
}

tt.getTopregionArray = function(){
	var length = tt.regions.length;
	var regions = [];
	for(var i = 0; i < length; i++){
		var region = tt.regions[i];
		region = region.split('|');
		if(region[1] > 1000){
			regions.push(region[0]+this.delimiter+region[1]);
		}
	}
	return regions;
}

tt.submit = function(form, dDay, dMonth, rDay, rMonth){
	if(form){
		var elem = document.forms[form];
		if(elem){
			var termin = elem.termin;
			var rueckTermin = elem.ruecktermin;
			if(termin){
				dDay = document.getElementById(dDay);
				dMonth = document.getElementById(dMonth);
				termin.value = dDay.value+'.'+(dMonth.value.substr(4,2))+'.'+dMonth.value.substr(0,4);
			}
			if(rueckTermin){
				rDay = document.getElementById(rDay);
				rMonth = document.getElementById(rMonth);
				rueckTermin.value = rDay.value+'.'+(rMonth.value.substr(4,2))+'.'+rMonth.value.substr(0,4);
			}
			elem.submit();
		}
	}
}

tt.updateFlextime = function(form, elem) {
	var form = document.forms[form];
	if (elem.value == 0) {
		form['flextime'].value = 2;
	} else {
		form['flextime'].value = "";
	}
}

tt.changes = function(options){
	if(options.flexTime.form && options.flexTime.name){
		var form = document.forms[options.flexTime.form];
		var flexTime = form[options.flexTime.name];
		if(!flexTime){
			var flexTime = document.createElement('input');
			flexTime.setAttribute('name', options.flexTime.name);
			flexTime.setAttribute('type', 'hidden');
			document.forms[options.flexTime.form].appendChild(flexTime);
		};
	};
	
	if(options.formularType.form && options.formularType.name && options.formularType.value){
		var form = document.forms[options.formularType.form];
		var formularType = form[options.formularType.name];
		if(!formularType){
			var formularType = document.createElement('input');
			formularType.setAttribute('name', options.formularType.name);
			formularType.setAttribute('value', options.formularType.value)
			formularType.setAttribute('type', 'hidden');
			document.forms[options.formularType.form].appendChild(formularType);
		} else {
			formularType.value = options.formularType.value;
		}
	}
}

var opo = function(){return {}}();

opo.delimiter = '|';

opo.setOptions = function(id, valueArray, delimiter, selected) {
	var select = document.getElementById(id);
	select.options.length = 0;
	var length = valueArray.length;
	for(var i = 0; i < length; i++) {
		var content = valueArray[i];
		var option = null;
		if(delimiter != ""){
			content = content.split(delimiter);	
		}
		option = new Option(content[0], content[1], (i == selected) ? true : false, (i == selected) ? true : false);
		select.options[select.options.length] = option;
	}
}

opo.loadScript = function(scriptname) {  
	var snode = document.createElement('script');  
	snode.setAttribute('type','text/javascript');  
	snode.setAttribute('src',scriptname);  
	document.getElementsByTagName('head')[0].appendChild(snode);  
}

opo.addLoadEvent = function(func) { 
	var oldonload = window.onload; 
	if (typeof window.onload != 'function') { 
		window.onload = func; 
	} else { 
		window.onload = function() { 
			oldonload(); 
			func(); 
		} 
	} 
} 
 
opo.domReady = function(fn){
	//W3C-compliant browser
	if(document.addEventListener) {
		document.addEventListener("DOMContentLoaded", fn, false);
	}
	//IE
	else {
		document.onreadystatechange = function(){opo.readyState(fn)};
	}
}

opo.readyState = function(func){
	// DOM is ready
	if(document.readyState == "interactive" || document.readyState == "complete"){
		func();
	}
}

/*
 * Source : http://snipplr.com/view/6029/domreadyjs/
 */
if (typeof Event == 'undefined') Event = new Object();

/*
 * Registers function +fn+ will be executed when the dom 
 * tree is loaded without waiting for images. 
 * 
 * Example:
 *
 *  Event.domReady.add(function() {
 *    ...
 *  });
 *
 */
Event.domReady = {
  add: function(fn) {
    
    //-----------------------------------------------------------
    // Already loaded?
    //-----------------------------------------------------------
    if (Event.domReady.loaded) return fn();
    
    //-----------------------------------------------------------
    // Observers
    //-----------------------------------------------------------
    var observers = Event.domReady.observers;
    if (!observers) observers = Event.domReady.observers = [];
    // Array#push is not supported by Mac IE 5
    observers[observers.length] = fn;
    
    //-----------------------------------------------------------
    // domReady function
    //-----------------------------------------------------------
    if (Event.domReady.callback) return;
    Event.domReady.callback = function() {
      if (Event.domReady.loaded) return;
      
      Event.domReady.loaded = true;
      if (Event.domReady.timer) {
        clearInterval(Event.domReady.timer);
        Event.domReady.timer = null;
      }
      
      var observers = Event.domReady.observers;
      for (var i = 0, length = observers.length; i < length; i++) {
        var fn = observers[i];
        observers[i] = null;
        fn(); // make 'this' as window
      }
      Event.domReady.callback = Event.domReady.observers = null;
    };
    
    //-----------------------------------------------------------
    // Emulates 'onDOMContentLoaded'
    //-----------------------------------------------------------
    var ie = !!(window.attachEvent && !window.opera);
    var webkit = navigator.userAgent.indexOf('AppleWebKit/') > -1;
    
    if (document.readyState && webkit) {
      
      // Apple WebKit (Safari, OmniWeb, ...)
      Event.domReady.timer = setInterval(function() {
        var state = document.readyState;
        if (state == 'loaded' || state == 'complete') {
          Event.domReady.callback();
        }
      }, 50);
      
    } else if (document.readyState && ie) {
      
      // Windows IE 
      var src = (window.location.protocol == 'https:') ? '://0' : 'javascript:void(0)';
      document.write(
        '<script type="text/javascript" defer="defer" src="' + src + '" ' + 
        'onreadystatechange="if (this.readyState == \'complete\') Event.domReady.callback();"' + 
        '><\/script>');
      
    } else {
      
      if (window.addEventListener) {
        // for Mozilla browsers, Opera 9
        document.addEventListener("DOMContentLoaded", Event.domReady.callback, false);
        // Fail safe 
        window.addEventListener("load", Event.domReady.callback, false);
      } else if (window.attachEvent) {
        window.attachEvent('onload', Event.domReady.callback);
      } else {
        // Legacy browsers (e.g. Mac IE 5)
        var fn = window.onload;
        window.onload = function() {
          Event.domReady.callback();
          if (fn) fn();
        }
      }
      
    }
    
  }
}

var opo = (typeof(opo) != 'undefined') ? (opo) : (function(){ return{}; }());

/**
 *  Package: Calendar
 */
opo.Calendar = function(){
	delimiter    = '|';
	monthsNames  = ['Januar','Februar','März','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'];
	shortMonthsNames  = ['Jan','Feb','Mär','Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'];
	daysPerMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
	
	
	
	function $(id){ return document.getElementById(id); }
	
	/**
	 *	Function: getNewCalendar
	 *	
	 *	Creates a new Calendar Object.
	 *	
	 *	Takes a configuration Object with the following parameters:
	 *	
	 *	Parameters:
	 *		setDifferenceFromToday [0 | integer] - Sets the first selectable day for the Calendar.
	 *								The given number represents the difference in days from now on.
	 *		monthType [long | short] - Defines how to format the months
	 *		yearType [long | short] - Defines how to format the year
	 *		differenceDays [21 | integer] - Sets the initial value between the departure date and the return date in days
	 *		monthsToShow [12 | integer] - Sets the months that will be shown
	 *		departureDayId, departureMonthId, returnDayId, returnMonthId, departureId, returnId}
	 *	
	 *	Returns:
	 *	
	 *	A Calendar Object.
	 *  
	 */
	function getNewCalendar(obj){
		var monthType, yearType, minDate, maxDate, depDate, retDate, difference, monthsToShow, depDayId, depMonthId, retDayId, retMonthId, depId, retId, depDayElem, depMonthElem, retDayElem, retMonthElem, depElem, retElem;
		
		dayMilliseconds = 86400000; // = 24*60*60*1000
		initDepDate     = obj.initialDepartureDate || 'undefined';
		initRetDate     = obj.initialReturnDate || 'undefined';
		initDepDiff     = obj.initialDepartureDifferenceDays || 0;
		difference      = obj.differenceDays || 21;
		minDepDiff      = obj.differenceStartFromToday || 0;
		minDate         = obj.fakeMinDate || new Date(new Date().getTime() + (minDepDiff * dayMilliseconds));
		monthType       = obj.monthType || 'long';
		yearType        = obj.yearType || 'long';
		monthsToShow    = obj.monthsToShow || 12;
		depDayId        = obj.departureDayId;
		depMonthId      = obj.departureMonthId;
		retDayId        = obj.returnDayId;
		retMonthId      = obj.returnMonthId;
		depId           = obj.departureId;
		retId           = obj.returnId;
		
		if(arguments.length != 1){
			alert('Too many arguments! Use just one Object as argumrt.');
			return;
		}
		
		if(depDayId && depMonthId && retDayId && retMonthId){
			depDayElem   = $(depDayId);
			depMonthElem = $(depMonthId);
			retDayElem   = $(retDayId);
			retMonthElem = $(retMonthId);
			
			minDate = new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate());
			maxDate  = new Date(minDate.getTime());
			maxDate.setYear(minDate.getFullYear());
			maxDate.setMonth(minDate.getMonth()+(monthsToShow-1));
			maxDate.setDate(daysPerMonth[maxDate.getMonth()]);
			
			depDate  = (initDepDate == 'undefined') ? ( new Date(minDate.getTime() + (initDepDiff * dayMilliseconds)) ) : initDepDate;
			retDate  = (initRetDate == 'undefined') ? ( new Date(depDate.getTime() + (difference * dayMilliseconds)) ) : initRetDate;
			
			setOptions(depDayId, getDayDropdownArray(minDate), depDate.getDate()-1);
			setOptions(depMonthId, getMonthDropdownArray(minDate, monthsToShow, monthType, yearType), (depDate.getMonth() - minDate.getMonth()));
			setOptions(retDayId, getDayDropdownArray(minDate), retDate.getDate()-1);
			setOptions(retMonthId, getMonthDropdownArray(minDate, monthsToShow, monthType, yearType));
			
		} else if( depId && retId){
			alert('Not implemented jet!');s
			return;
			depElem = $(depElem);
			retElem = $(retElem);
		} else {
			alert('Wrong arguments given.');
		}
		
		this.update = function(elemId, diff){
			var diff = diff || difference;
			
			if(depDayElem && depMonthElem && retDayElem && retMonthElem){
				var dY    = depMonthElem.value.substr(0,4);
				var dM    = depMonthElem.value.substr(4,2)-1;
				var days  = daysPerMonth[dM];
				depDayElem.selectedIndex = (depDayElem.selectedIndex+1 > days) ? days-1 : depDayElem.selectedIndex;
				var dD    = depDayElem.value.replace(/^0/,'');
				var dDate = new Date(dY, dM, dD);

				var rY    = retMonthElem.value.substr(0,4);
				var rM    = retMonthElem.value.substr(4,2)-1;
				var days  = daysPerMonth[rM];
				retDayElem.selectedIndex = (retDayElem.selectedIndex+1 > days) ? days-1 : retDayElem.selectedIndex;
				var rD    = retDayElem.value.replace(/^0/,'');
				var rDate = new Date(rY, rM, rD);

				var iTime = minDate.getTime();
				var mTime = maxDate.getTime();
				
				var dElements = (elemId == depDayElem.id || elemId == depMonthElem.id);
				var rElements = (elemId == retDayElem.id || elemId == retMonthElem.id);
				
				if(dElements){
					if(dDate.getTime() > rDate.getTime()){ rDate.setTime(dDate.getTime()+(diff * dayMilliseconds)); }
				}
				
				if(rElements){
					if(rDate.getTime() < dDate.getTime()){ dDate.setTime(rDate.getTime()-(diff * dayMilliseconds)); }
				}
				
				if(dDate.getTime() < iTime){ dDate.setTime(iTime); }
				if(rDate.getTime() < iTime){ rDate.setTime(iTime); }
				if(dDate.getTime() > mTime){ dDate.setTime(mTime); }
				if(rDate.getTime() > mTime){ rDate.setTime(mTime); }

				if(dElements){
					updateSelected(retMonthElem, rDate.getFullYear()+''+getFormattedNumber(rDate.getMonth()+1));
				}
				if(rElements){
					updateSelected(depMonthElem, dDate.getFullYear()+''+getFormattedNumber(dDate.getMonth()+1));
				}
				
				setOptions(depDayId, getDayDropdownArray(dDate), dDate.getDate()-1);
				setOptions(retDayId, getDayDropdownArray(rDate), rDate.getDate()-1);

				depDate = dDate;
				retDate = rDate;
			}
		}
		
		this.update();
	}
	
	function setOptions(id, valueArray, selected) {
		var select = $(id);
		select.options.length = 0;
		var length = valueArray.length;
		for(var i = 0; i < length; i++) {
			var content = valueArray[i];
			var option = null;
			if(delimiter != ""){
				content = content.split(delimiter);	
			}
			option = new Option(content[0], content[1], (i == selected) ? true : false, (i == selected) ? true : false);
			select.options[select.options.length] = option;
		}
	}
	
	function getDayDropdownArray(date){
		var year = date.getFullYear();
		var leapYear = ((year % 400) ? (true) : ((year % 100) ? (false) : ((year % 4) ? (true) : (false))));
		if ( leapYear == 0){
			daysPerMonth[1] = 29;
		}
		var days = [];
		var length = daysPerMonth[date.getMonth()];
		for(var i = 1; i <= length; i++){
			days[i-1] = i+delimiter+''+getFormattedNumber(i);
		}
		return days;
	};
	
	function getMonthDropdownArray(date, monthsToShow, monthType, yearType){
		var months = [];
		var tmpDate = new Date(date.getTime());
		tmpDate.setDate(1);
		for(var i = 0; i < monthsToShow; i++){
			var month = tmpDate.getMonth();
			var year  = ''+tmpDate.getFullYear();
			months[i] = ((monthType=='short')?shortMonthsNames[month]:monthsNames[month])+" "+((yearType=='short')?year.substr(2,2):year)+delimiter+year+''+getFormattedNumber(month+1);
			tmpDate.setMonth((tmpDate.getMonth()+1));
		}
		return months;
	};
	
	function updateSelected(elem, val){
		var index = 0;
		for(var i = 0; i < elem.options.length; i++){
			if(elem.options[i].value == val){
				elem.selectedIndex = index = i;
				break;
			}
		}
		return index;
	}
	
	function getFormattedNumber(number){
		return (number < 10) ? ('0'+number) : number;
	}
	
	return {
		init: getNewCalendar
	};
}();


