/*
 * class for handling the dms forms  
 */

workDMS = new Class({
	
		// add the needed methods to the dms-forms 
	init:function(){
			// init form
		$$('#dms_form form').each(function(form){
			workDMS.loadForm(form);
		}); 
		
			// read query errors
		var search = window.location.search;
		var query = {}; 
		if (search != ""){
			 search = search.replace(/\?/g,"&");
			 var parts = search.split("&");
			 if (parts.length > 0){
			 	for (var i = 0; i < parts.length; i++){
				 	var vals = parts[i].split("=");
					if (vals.length == 2){
					 	query[vals[0]]= unescape(vals[1]);
					}
				}
			 }
		}
		
		 	// handle errors
		if (query['ERROR_ID']){
			var err = parseInt(query['ERROR_ID']);
			if  (err > 0){
				var err = $('dms_errorid_'+err);
				if (err){
					err.setStyle('display','block');
				}
			}	
		}
		 
			// update event
		$$('#dms_form form input, #dms_form form textarea, #dms_form form select, #dms_form form input ').each( function(el){
			if (! el.hasClass('datepicker') ){
				el.addEvent('change',function(e){
					var e = new Event(e);
					var t = new Element(e.target);
					e.stop();
						// find form and update
					while ( t.nodeName != 'FORM' && t.getParent() ) t = t.getParent();
					if (t.nodeName == 'FORM') workDMS.updateForm(t);
				});
			}
		});
			
			// submit events
		$$('#dms_form form').addEvent('submit',function(e){
			var e = new Event(e);
			var t = new Element(e.target);
			e.stop();
			workDMS.submitForm(t);
		});
		
		 if ($('dms_nacht')) {
			$('dms_nacht').addEvent('change',function(e){ workDMS.updateNights(); /* workDMS.checkMoreDays() */ });
		 }
		
		//	$('dms_erwachsene').addEvent('change',function(e){ workDMS.checkMoreRooms() });
		//	$('dms_zimmer').addEvent('change',function(e){ workDMS.checkMoreRooms() });
		
	},
	
	updateDate:function( item ) {
		return;
		
			// errechne Anzahl der Übernachtungen 
		var input_anreise = $E('#dms_form form input#dms_anreise');
		var input_abreise = $E('#dms_form form input#dms_abreise');
		
		var ts_anreise = input_anreise.hht_datepicker.getTS();
		date_anreise = new Date();
		date_anreise.setTime(ts_anreise);
		
		if (anreise && abreise){
			if (item && item == input_anreise ){
					// update if anreise was changed
				var nights = parseInt($('dms_nacht').value);
				var ts_abreise = ts_anreise + (nights * 86400000) ;
				var departure = date_helper.ts2date(ts_abreise, format);
				if (input_abreise.value != departure){
					input_abreise.value = departure;
				}
				
			} else {
				var ts_abreise = date_helper.date2ts( abreise, format);
				var day_num = Math.round( (ts_abreise - ts_anreise) / 86400000 );
				if (day_num > 0){
					if ($('dms_nacht')) {
						var result = '1';
						if ( day_num <= 14 ){
							result = day_num;
						} else {
							result = '>14';
							if (abreise == item){
								var arrival = date_helper.ts2date(ts_abreise+(14*86400000), format);
								if (arrival != input_anreise.value){
									input_anreise.value = arrival;
								} 
							}
						}
						if ( $E('#dms_form form select#dms_nacht').value != result){
							$E('#dms_form form select#dms_nacht').value = result;
						}
					}
					// workDMS.checkMoreDays();
				} else {
					ts_anreise = ts_abreise - 86400000;
					if ( $E('#dms_form form select#dms_nacht').value != 1 ) {
						$E('#dms_form form select#dms_nacht').value = 1;
					}
					input_anreise.value = date_helper.ts2date(ts_anreise, format);
				}
			}
		}
		
		var form = $E('#dms_form form'); 
		workDMS.updateForm( form );
		
	},
	
	updateNights:function() {		
		if (!$('dms_nacht')) return;
		
		var nacht   = $E('#dms_form form select#dms_nacht').getValue();
		var anreise = $E('#dms_form form input#dms_anreise');
		var abreise = $E('#dms_form form input#dms_abreise');
		
		if (nacht < 1 ) nacht = 1;
 		if (anreise && nacht && nacht != '>14'){
			var ts_anreise = anreise.hht_datepicker.getTS();
			var add_ts = nacht * ( 86400000 );
			var ts_abreise = Math.round(ts_anreise + add_ts);
			abreise.hht_datepicker.setDate(ts_abreise);
		}
		
		var form = $E('#dms_form form') 
		workDMS.updateForm( form );
	},
	
	/*
	 * check weater 
	 */
	checkMoreDays: function() {
		if ($('dms_nacht') && $E('#dms_form form select#dms_nacht').getValue() > 14) {
			$('dms_moredays').setStyle('display','block');
			return false;
		} else {
			$('dms_moredays').setStyle('display','none');
			return true;
		}
	},
	
	/*
	 * hide submit button and show error if too many adults or rooms are selected
	 */
	checkMoreRooms: function() {
		if ($E('#dms_form form select#dms_erwachsene').getValue() == '7'
		  || $E('#dms_form form select#dms_zimmer').getValue() == '4' ) {
			$('dms_morerooms').setStyle('display','block');
			return false;
		} else {
			$('dms_morerooms').setStyle('display','none');
			return true;
		}
	},
	
	/*
	 * perform some tests weather the selected room type is valid for this search
	 */
	checkRoomType: function(){
		var room_type = $E('#dms_form form select#dms_zimmerart').getValue();
		switch (room_type){
			case 'TBX00020050023627654':
				var adults   = $E('#dms_form form select#dms_erwachsene').getValue();
				var children = $E('#dms_form form select#dms_kinder').getValue();
				if ( adults > 0 && children > 0 ){ // show error
					$('dms_error_family_room').setStyle('display','none');
					return true;
				} else { // correct
					$('dms_error_family_room').setStyle('display','block');
					return false;
				}
				break; 
			default:
				$('dms_error_family_room').setStyle('display','none');
				break;
		}
		return true;
	},
	
	/*
	 * check weather the ages for all children are selected 
	 * show the necessary input fields for the selected  child number 
	 */
	checkChildrenAge: function(){
				
		// anzahl der kinder
		var kinder =  $('dms_kinder');
		
		if (kinder){
			var anzahl = kinder.getValue();
			var k1 = $('dms_kind_1');
			var k2 = $('dms_kind_2');
			var k3 = $('dms_kind_3');
			var k4 = $('dms_kind_4');
			var child_error = $('dms_error_children');
			var row = $('dms_kind_row');
			switch ( anzahl.toInt() ){
				case 1:
					if (row) row.setStyle("display" , 'block' );
					if (k1) k1.setStyle("display" , '' );
					if (k2) k2.setStyle("display" , "none");
					if (k3) k3.setStyle("display","none");
					if (k4) k4.setStyle("display","none");
					if ( child_error ) {
						if( k1.getValue() ){ 
							child_error.setStyle('display','none');
							return true;
						} else {
							child_error.setStyle('display','block'); 
							return false;
						}
					}
				 	break;
				case 2:
					if (row) row.setStyle("display" , 'block' );
					if (k1) k1.setStyle("display","");
					if (k2) k2.setStyle("display","");
					if (k3) k3.setStyle("display","none");
					if (k4) k4.setStyle("display","none");
					if (child_error){
						if (k1.getValue() && k2.getValue()){
							child_error.setStyle('display','none'); 
							return true;
						} else {
							child_error.setStyle('display','block'); 
							return false;
						}
					}
					break;
				case 3:
					if (row)  row.setStyle("display" , 'block' );
					if (k1) k1.setStyle("display","");
					if (k2) k2.setStyle("display","");
					if (k3) k3.setStyle("display","");
					if (k4) k4.setStyle("display","none");
					if (child_error){
						if ( k1.getValue() && k2.getValue() && k3.getValue()){
							child_error.setStyle('display','none'); 
							return true;
						} else {
							child_error.setStyle('display','block'); 
							return false;
						}
					}
					break;
				case 4:
					if (row)  row.setStyle("display" , 'block' );
					if (k1) k1.setStyle("display","");
					if (k2) k2.setStyle("display","");
					if (k3) k3.setStyle("display","");
					if (k4) k4.setStyle("display","");
					if (child_error){
						if (k1.getValue() && k2.getValue() && k3.getValue() && k4.getValue() ){
							child_error.setStyle('display','none'); 
							return true;
						} else {
							child_error.setStyle('display','block'); 
							return false;
						}
					}
					break;
				default:
					if (row) row.setStyle("display" , 'none' );
					if (child_error) child_error.setStyle('display','none'); 
					return true;
					break;
				
			}
		}
	}, 
	
		// load information from cookie and restore field values
	loadForm:function(form){
		// console.debug(['loadForm',form]);
		var form_id = 'dms_form_default';
		if ( $('dms_form_id') && $('dms_form_id').getValue() ) {
			var form_id = 'dms_form_'+$('dms_form_id').getValue();
		} 
		var jsn = Cookie.get( form_id );
		var obj = Json.evaluate(jsn);
		
		this.setFormObj(form, obj);
		this.loadDefaults(form);

		//this.updateForm(form, true);
	},
	
	loadDefaults:function(form) {
		var dayoffset = 0;
		var format  = $E('#dms_form form input#dms_date_format').getValue();
		
		if ($('dms_defaultdate')){
			var defaultdate = $('dms_defaultdate').getValue(); 
			var defaultdate_parts = defaultdate.split(':');

			if (defaultdate_parts.length == 2) {
				switch (defaultdate_parts[0]){
					case 'date':
						var dp = defaultdate_parts[1].split('.');
						dayoffset = 0
						if (dp.length == 3){
							var now = new Date();
							var then = new Date(
								parseInt(dp[2]),
								parseInt(dp[1])-1,
								parseInt(dp[0]) 
							);
							var now_ts  = now.getTime();
							var then_ts = then.getTime();
							if (then_ts > now_ts){
								dayoffset = Math.ceil( (then_ts - now_ts) / 86400000 );
							} 
						} 
						break;
					case 'offset':
						dayoffset = parseInt(defaultdate_parts[1]);
						if (isNaN(dayoffset)) {
							dayoffset = 0;
						}
						break;	
				}
			}
		}
				
		var defaultduration = 1;
		if ($('dms_defaultduration') ) {
			var defaultduration = parseInt($('dms_defaultduration').getValue());
			if (isNaN(defaultduration)) {
				defaultduration = 1;
			}
		}
		
		var anreise =  $E('#dms_anreise',form);
		var date = new Date();
		var ts_anreise = date.getTime()  + ( 86400000 * dayoffset); 
		if (anreise.getValue() == '' ) {
			anreise.hht_datepicker.set( ts_anreise);
		}
		
		var abreise =  $E('#dms_abreise',form);
		var ts_abreise = ts_anreise  + ( 86400000 * defaultduration);
		if (abreise.getValue() == '' ) {
			abreise.hht_datepicker.set( ts_abreise);
		}
		
		if (anreise && abreise){
			var ts_anreise = anreise.hht_datepicker.getTS();
			var ts_abreise = abreise.hht_datepicker.getTS();
			var day_num = Math.round( (ts_abreise - ts_anreise) / 86400000 );
			
			var nights = $E('#dms_form form select#dms_nacht');
			if (day_num > 0 && nights) {
				if (day_num <= 14 ){
					nights.value = day_num;
				} else {
					nights.value = '>14';
				}
			}
		}
	},
	
	
	
		// update the form and display errors 
	updateForm:function(form, dontsave){
		
		if (!dontsave){
			var obj = this.getFormObj(form);
			var jsn = Json.toString(obj);
			var form_id = 'dms_form_default';
			if ( $('dms_form_id') && $('dms_form_id').getValue() ) {
				var form_id = 'dms_form_'+$('dms_form_id').getValue();
			}  
			Cookie.set( form_id, jsn, { path: '/' } );
		}
		
		var form_error = false;

		if ( workDMS.checkMoreDays()     == false ) form_error = true;
		if ( workDMS.checkChildrenAge()  == false ) form_error = true;
		if ( workDMS.checkMoreRooms()    == false ) form_error = true;
		if ( workDMS.checkRoomType()     == false ) form_error = true;
		
		// hide submit if something is wrong
		if (form_error) {
			$$('.dms_search').each(function(i){i.setStyle('display','none');});
		} else {
			$$('.dms_search').each(function(i){i.setStyle('display','block');});
		}
		
	},
		
		// convert values and send them to the target address
	submitForm:function(form){
		// console.debug(['submitForm',form]);
			
			// save form to cookie 
		var obj = this.getFormObj(form);
		
		var jsn = Json.toString(obj);
		
		var form_id = 'dms_form_default';
		if ( $('dms_form_id') && $('dms_form_id').getValue() ) {
			var form_id = 'dms_form_'+$('dms_form_id').getValue();
		} 
		
		Cookie.set(form_id, jsn, { path: '/' } );

		this.sendDMSrequest(obj,$('dms_target_url').getValue());
			
	},
	
		// convert values from a given form to an object
	getFormObj:function(form){
		var obj = { 
			ziel : false,  
			anreise : false,
			abreise : false,
			erwachsene : false,
			kinder : false,
			kind_1: false,
			kind_2: false,
			kind_3: false,
			kind_4: false,
			zimmer: false,
			zimmerart: false,
			preis: false,
			hoteltyp: false,
			hotelname: false,
			hotelsterne: false,
			nacht: false, 
			verpflegung: false,
			bar: false,
			hund: false,
			klimaanlage: false,
			nichtraucher: false,
			rollstuhl: false,
			wellness: false,
			garage: false,
			kinderfreundlich: false,
			lift: false,
			restaurant: false,
			schwimmbad: false,
			wlan: false
		};
		
		for (key in obj){
				// find obj
			var item = $E('#dms_'+key,form);
				// get value
			if (item) {
				obj[key] = item.getValue();
			}
		}
		return  obj;
	},
	
		// resore form from given values
	setFormObj:function(form, obj){
		for (key in obj){
				// find obj
			var item =  $E('#dms_'+key,form);
				// set value
			if (item && obj[key]) {
				if (item.getProperty('type')=='checkbox') {
					if 	(obj[key] != false && obj[key] != null && obj[key] != undefined ) {
						item.setProperty("checked" , "checked");
					}
				} else {
						// always use default-values for the date
					item.value = obj[key];
				}
			}
		}
	},
	
		// convert form values to dms request and submit 
	sendDMSrequest:function ( obj, target_url ){
		// console.debug(['sendDMSrequest',obj, target_url]);
		
		var format  = $E('#dms_form form input#dms_date_format').getValue();
		
		var map = { 
			ziel : 'WBX00020010000100291',  
			anreise : ['AnreiseTag','AnreiseMonatJahr'],
			abreise : ['AbreiseTag','AbreiseMonatJahr'],
			erwachsene : 'Personenanzahl',
			kinder: 'AnzahlKinder',
			kind_1: 'CHILD_AGE_1',
			kind_2: 'CHILD_AGE_2',
			kind_3: 'CHILD_AGE_3',
			kind_4: 'CHILD_AGE_4',
			zimmer: 'AnzahlZimmer',
			zimmerart: 'TOT',
			preis: 'MAX_PRICE',
			hoteltyp: 'SEARCH_FIELD_1',
			hotelname: 'SEARCH_FIELD_2',
			hotelsterne: 'SEARCH_FIELD_0',
			nacht: 'Uebernachtungen', 
			verpflegung: 'FOOD',
			bar: 'FEATURE_FIELD_0_0',
			hund: 'FEATURE_FIELD_0_2',
			klimaanlage: 'FEATURE_FIELD_0_4',
			nichtraucher: 'FEATURE_FIELD_0_6',
			rollstuhl: 'FEATURE_FIELD_0_8',
			wellness: 'FEATURE_FIELD_0_10',
			garage: 'FEATURE_FIELD_0_1',
			kinderfreundlich: 'FEATURE_FIELD_0_3',
			lift: 'FEATURE_FIELD_0_5',
			restaurant: 'FEATURE_FIELD_0_7',
			schwimmbad: 'FEATURE_FIELD_0_9',
			wlan: 'FEATURE_FIELD_0_11'
		};
		

		var parameter = '';
						
		for (key in map){
			if (obj[key] != "" && obj[key] != null && obj[key] != undefined) {
				if (key == 'preis') {
						// calculate total price
					if ( parseInt(obj['preis']) > 0){
						var totalprice = ((parseInt(obj['erwachsene']) + parseInt(obj['kinder'])) * parseInt(obj['nacht']) * parseInt(obj['preis']));
						parameter = parameter + '&' + map[key] + '=' + totalprice;
					}
				} else if ((map[key]).constructor.toString().indexOf("Array") != -1 ) {
					var ts = date_helper.date2ts(obj[key],format);
					var current_date = new Date();
					current_date.setTime(ts);
					parameter = parameter + '&' + map[key][0] + '=' + current_date.getDate();
					parameter = parameter + '&' + map[key][1] + '=' + (current_date.getMonth() +1 ) + "" + current_date.getFullYear();
				} else if(key == 'kind_1' || key == 'kind_2' || key == 'kind_3' || key == 'kind_4') {
					if (obj['kinder'] > 0 && $('dms_' + key).getStyle('display') != 'none') {
						parameter = parameter + '&' + map[key] + '=' + obj[key];
					}
				} else {
					parameter = parameter + '&' + map[key] + '=' + obj[key];
				}
			}
		}
		
		parameter = parameter + '&IP_BACK_URL=' + window.location.href;
		// .debug(target_url + parameter);
		window.location.href = target_url + parameter;

	},

	date2ts:function(dateStr,format){
		return date_helper.date2ts(dateStr,format);
	},
	
	ts2date:function(ts,format){
		return date_helper.ts2date(ts,format);
	}
	
});


window.addEvent('domready', function()	{
	workDMS = new workDMS();
	workDMS.init();
});
