var dmsForms = new Class({
	
	init:function(dms_form){
		
		this.form = dms_form;
		
			// start update events
		var form_fields = $ES('input,select,textarea', this.form);
		for (var i=0 ; i<form_fields.length ; i++){
			var form_field = new Element (form_fields[i]);
			if (form_field.hasClass("dms_datepicker") == false){
				if ( form_field.getProperty('type') == 'radio'  ){
					// form_field.addEvent("click" , this.change.bindWithEvent(this) );
				} else {
					form_field.addEvent("change" , this.change.bindWithEvent(this) );
				}
			}
		}
		
			// show more Options 
		var show_options = $E('.dms_show_more_options', this.form);
		if (show_options){
			show_options.addEvent("click" , this.show_options.bindWithEvent(this) );	
			show_options.setStyle('cursor','pointer');
		}

			// hide more Options 
		var hide_options = $E('.dms_hide_more_options', this.form);
		if (hide_options){
			hide_options.addEvent("click" , this.hide_options.bindWithEvent(this) );	
			hide_options.setStyle('cursor','pointer');
		}
					
			// remove default texts on first click
		var inputs_with_infotext = $ES('.dms_field_with_infotext',  this.form);
		for (var i=0 ; i < inputs_with_infotext.length; i++){
			var input = new Element( inputs_with_infotext[i]);
			input.addEvent('focus', this.empty_infotext.bindWithEvent(this) );
		}
			
			// add mirror events to fields with class dms_mirrored_field
		var mirrored_fields = $ES('.dms_mirrored_field',  this.form);	
		for (var i=0 ; i < mirrored_fields.length; i++){
			var field =  new Element( mirrored_fields[i]);
			field.addEvent( 'change' , this.mirror_field_values.bindWithEvent(this) );
			//field.addEvent( 'blur'  , this.mirror_field_values.bindWithEvent(this) );
		}
		
		// add subscriber events to fields listed in dms_subscribed_fields	
		var all_field_subscriber = $ES('.dms_subscribed_fields', this.form);
		this.dms_field_subscriber = {};
		for (var i=0; i < all_field_subscriber.length; i++) {
			// this field defines a subscription
			var field_subscriber = new Element(all_field_subscriber[i]);
			// every field that is subscribed should trigger an update
			// of the subscriber field.
			var subscribed_fields = field_subscriber.getProperty('dms:subscribed_fields').split(',');
			for (var j=0; j<subscribed_fields.length; j++) {
				var subscribed_field = new Element($(subscribed_fields[j]));
				var subscribed_field_id = subscribed_field.id;
				//console.debug(subscribed_field_id);
				if (!(this.dms_field_subscriber[subscribed_field_id])) {
					//console.debug("yep");
					subscribed_field.addEvent('change',this.update_subscriber_field.bindWithEvent(this));
					this.dms_field_subscriber[subscribed_field_id] = Array();
					this.dms_field_subscriber[subscribed_field_id].push(field_subscriber.id);
				} else {
					this.dms_field_subscriber[subscribed_field_id].push(field_subscriber.id);
				}
			}
		}
		
			// add disable and enable input events   
		var enable_inputs = $ES('input.dms_toggle_area',  this.form);
		for (var i=0 ; i < enable_inputs.length; i++){
			var input = new Element (enable_inputs[i]);
			input.addEvent("click" ,  this.toggle_area.bindWithEvent(this));
			if ( (input.getValue() == "on") )	{
				var area_act   = $( input.getProperty("dms:enable_area") );
				if ( area_act ){
					this.activate_form_area(area_act, true);
				}
			} else {	
				var area_inact   = $( input.getProperty("dms:enable_area") );
				if ( area_inact ){
					this.activate_form_area(area_inact, false);
				}
			}
		}
		
			// add pick date events
		var date_sectors = 	$$('.dms_date_selector');
		for (var i=0 ; i < date_sectors.length; i++){
			var date = new Element (date_sectors[i]);
			date.setStyle('cursor','pointer');
			date.addEvent('click', this.click_arrival_date.bindWithEvent(this) )
		}
		
			// submit event
		this.form.addEvent('submit' , this.submit.bindWithEvent(this) );
			
		this.inittialize.delay(100, this);	
		this.update.delay(200, this);	
		
	},
	
	
	/*
	 * load defaults and init fields
	 */
	inittialize:function(){

			// fill date fields from hidden values and co
		var arr_day_field   = $E('#dms_arr_day',this.form); 
		var arr_month_field = $E('#dms_arr_month',this.form); 
		var arr_year_field  = $E('#dms_arr_jear',this.form); 
		var nights_field    = $E('#dms_naechte',this.form);
				
		if (arr_day_field && arr_month_field && arr_year_field && nights_field){
			var arr_day   = parseInt( arr_day_field.getValue() );
			var arr_month = parseInt( arr_month_field.getValue() );
			var arr_year  = parseInt( arr_year_field.getValue() );
			var nights    = parseInt( nights_field.getValue() );
						
			if (arr_day && arr_month && arr_year && nights){
				
					// Objektname = new Date(Jahr, Monat, Tag, Stunden, Minuten, Sekunden);
				startDate = new Date( arr_year , arr_month-1 , arr_day , 0 , 0 , 0 );
				startTS = startDate.getTime();
				stopTS  = startTS + ( nights * 86400000 ) ;
				var start_field = $E('#dms_anreise',this.form);
				if (start_field ){
					start_field.dms_datepicker.set(startTS);
				}
				
				var stop_field  = $E('#dms_abreise',this.form); 
				if (stop_field){
					stop_field.dms_datepicker.set(stopTS);
				} 
			} 
		} 
	},
	
	click_arrival_date:function(e){
			// set date
		var event  = new Event(e);
		var target = new Element(e.target);
		
		var arr_day   = parseInt( target.getProperty('dms:arr_day')   );
		var arr_month = parseInt( target.getProperty('dms:arr_month') ) -1 ;
		var arr_year  = parseInt( target.getProperty('dms:arr_year')  );
		var arr_field = $E('#dms_anreise', this.form);

		if (arr_field && arr_field.dms_datepicker && !isNaN(arr_day)  && !isNaN(arr_month) && !isNaN(arr_year) ) {			
			var date = new Date (arr_year, arr_month, arr_day, 0 , 0 , 0);
			arr_field.dms_datepicker.setDate( date.getTime() );
			window.scrollTo(0 , 0 );			
		}
	},
	
	/* 
	 * 
	 */
	toggle_area:function(e){
		var event  = new Event(e);
		var target = new Element(e.target);
		var area_act   = $( target.getProperty("dms:enable_area") );
		if ( area_act ){
			this.activate_form_area(area_act, true);
		}
		
		var area_inact   = $( target.getProperty("dms:disable_area") );
		if ( area_inact ){
			this.activate_form_area(area_inact, false);
		}
	},
	
	activate_form_area:function(area, state){
		var items = $ES ('input,select', area);
		for (i=0 ; i<items.length ; i++ ){
			var item  = new Element(items[i]);
			if (!item.hasClass('dms_toggle_area') ){
				if (state == false){
					item.setProperty("disabled","disabled");
				} else {
					item.removeProperty("disabled");
				}
			} 
		}
	},
	
	/*
	 * transfer values from the changed field to the dms:mirror_fields 
	 */
	mirror_field_values:function( e ){
		var event = new Event(e);
		var target = new Element(e.target);
		var value = target.getValue();
		var mirrors = target.getProperty('dms:mirror_fields').split(',');

		for (k=0 ; k<mirrors.length ; k++ ){
			var mirror = $( mirrors[k] );
			mirror.value = value;
		} 
	},
	
	/*
	 * construct a value from subscribed fields and concatenate if more than one field is used.
	 * properties: 
	 *    dms:subscribed_fields :: comma separated list of subscribed form fields
	 *    dms:subscribed_fields_concat :: string that is used to concatenate all
	 *                                    subscribed fields 
	 */
	
	update_subscriber_field:function(e) {
		var event = new Event(e);
		var target = new Element(e.target);
		var target_id = target.id;
		//console.debug("you changed:"+target_id);
		//console.debug("let's change: "+this.dms_field_subscriber[target_id]);
		for (var i=0; i<this.dms_field_subscriber[target_id].length; i++) {
			var subscriber = $(this.dms_field_subscriber[target_id][i]);
			//console.debug("subscriber:"+subscriber);
			var subscribed_fields = subscriber.getProperty('dms:subscribed_fields').split(',');
			var new_value = Array();
			for (var j=0; j<subscribed_fields.length; j++) {
				//console.debug(subscribed_fields[j]);
				new_value.push($(subscribed_fields[j]).value)
			}
			subscriber.value = new_value.join(subscriber.getProperty('dms:subscribed_fields_concat'))	
		}
	},
	
	/*
	 * precess data before submit
	 */
	submit:function(e){

		// e.stop();
		
			// remove default texts from input fields with class dms_field_with_infotext
		var inputs_with_infotext = $ES('.dms_field_with_infotext',  this.form);
		for (var i=1 ; i < inputs_with_infotext.length; i++){
			var input = new Element( inputs_with_infotext[i]);
			if ( !input.dms_is_clicked){
				input.value = '';
			}
		}
		
			// show weather a dms_wait_page_inline section is present and show it
		var wait_msg_src = $E('div.dms_wait_page_inline', this.form);
		
		if (wait_msg_src){
			
			var wait_msg = wait_msg_src.clone();
			var bodysize = document.body.getSize();
			var top		 = window.getScrollTop();
			
				// hide all select items
			if(window.ie6){
				$$('select').setStyle('display','none');
			}
			
				// add a div layer on top
				// and show content in layer
			var shadow = new Element('div',{
				id : 'dms_lightbox_shadow',
				styles:{
					'z-index':999,
					'background-color':'black',
					'width':  bodysize.size.x + 'px' ,
					'height': bodysize.size.y + 'px' ,
					'opacity':'0',
					'position':'absolute',
					'left':0,
					'top':0
				}
			});
			
			var lightbox = new Element('div',{
				id : 'dms_lightbox',
				styles:{
					'z-index':1000,
					'position':'absolute',
					'width':'100%',
					'opacity':'0',
					'left':0,
					'top':top
				}
			});
		
			
				// add scroll handling
			document.addEvent("scroll",function(){
				var top	= window.getScrollTop();
				var lightbox = $('dms_lightbox');
				if (lightbox) lightbox.setStyle('top',top);
			});
			wait_msg.inject(lightbox);
				
				// add close event
			var close = $E('div.dms_wait_page_close',  lightbox);

			if (close){
				close.addEvent('click', function(e){
					var lightbox = $('dms_lightbox');
					var shadow   = $('dms_lightbox_shadow');
					if (lightbox) lightbox.remove();
					if (shadow)   shadow.remove();
				});
				close.setStyle('cursor','pointer');
				var href = window.location.href;
				window.location.href = href+"#stop";
			}
		
			lightbox.injectTop(document.body);
			shadow.injectTop(document.body);
			
			var contentChange = new Fx.Style(lightbox, 'opacity', {duration:500});
			contentChange.start(0, 1);

			var shadowChange = new Fx.Style(shadow, 'opacity', {duration:500});
			shadowChange.start(0, 0.5);
			
		}	
		
		
		
	},
	

	
	/*
	 * 
	 */
	empty_infotext:function(e){
		var event = new Event(e);
		var target = new Element(e.target)
		if ( !target.dms_is_clicked){
			target.value = "";
			target.dms_is_clicked = true;
			// target.removeEvent( 'click', this.empty_infotext.bindWithEvent(this) ); 
		} else {
			// do nothing
		}
	},
	
	/*
	 * show more option area
	 */
	show_options:function(){
		$ES('.dms_more_options', this.form).each(function(el){
			el.setStyle('display',"block");
		});
		$ES('.dms_hide_more_options', this.form).each(function(el){
			el.setStyle('display',"block");
		});
		$ES('.dms_show_more_options', this.form).each(function(el){
			el.setStyle('display',"none");
		});
	},
	/*
	 * hide more option area
	 */
	hide_options:function(){
		$ES('.dms_more_options', this.form).each(function(el){
			el.setStyle('display',"none");
		});
		$ES('.dms_hide_more_options', this.form).each(function(el){
			el.setStyle('display',"none");
		});
		$ES('.dms_show_more_options', this.form).each(function(el){
			el.setStyle('display',"block");
		});
	},
	
	/*
	 * method wich is called by the input.onChange event
	 */
	change:function(){
		this.update();
	},
	
	/*
	 * update form
	 */
	update:function(){
	
		var form_error = false;
		if ( this.checkChildrenAge()  == false ) form_error = true;
		if ( this.checkMoreDays()     == false ) form_error = true;
		if ( this.checkRoomNumber()   == false ) form_error = true;
		if ( this.checkNumPeople()    == false ) form_error = true;
		if ( this.checkEarlyBird()    == false ) form_error = true;
		if ( this.checkLastMinute()   == false ) form_error = true;
		
			// hide submit if something is wrong
		/*	
		if (form_error) {
			$ES('.dms_submit', this.form).each(function(i){i.setStyle('display','none');});
		} else {
			$ES('.dms_submit', this.form).each(function(i){i.setStyle('display','');});
		}
		*/
		
	},
	
	checkMoreDays: function() {
		var duration_field = $E( '#dms_naechte' , this.form);
		var duration_error = $E('#dms_error_moredays', this.form);
		if (duration_field && duration_field.getValue() > 14 ) {
			if (duration_error) duration_error.setStyle('display','block');
			return false;
		} else {
			if (duration_error) duration_error.setStyle('display','none');
		}
		return true;
	},
	
	/*
	 * hide submit button and show error if too many adults or rooms are selected
	 */
	checkRoomNumber: function() {
		var room_num_field = $E( '#dms_room_num'  , this.form);
		if (room_num_field){
			var room_people = $E( '#dms_room_people', this.form);
			var room_number = parseInt( room_num_field.getValue() ); 
			var more_room_containers =  $ES( '.dms_room_allocation', this.form);
			
				// show belegung
			for (var i=0; i< more_room_containers.length; i++){
				if ( i < room_number && room_number <= more_room_containers.length){
					more_room_containers[i].setStyle('display','block'); 
				} else {
					more_room_containers[i].setStyle('display','none'); 
				}
			}
			
				// show infotext
			var info_single = $E('#dms_allocation_text_single', this.form);
			var info_more = $E('#dms_allocation_text_more', this.form);
			if ( room_number > 1){
				if  (info_single) info_single.setStyle('display','none');
				if  (info_more) info_more.setStyle('display','');
			} else {
				if  (info_single) info_single.setStyle('display','');
				if  (info_more) info_more.setStyle('display','none');
			}
			
				// check number and show error message if needed
			if ( room_number > more_room_containers.length){
				
				room_people.setStyle('display','block');
					// hide more rooms
				for (var i=1; i< more_room_containers.length; i++){
					more_room_containers[i].setStyle('display','none'); 
				}
				
				return false;
			} else {
				room_people.setStyle('display','none');
				return true;
			}
		} 
		
		return true;	

		
	},
	
	checkNumPeople: function() {
		var people_error = $E('#dms_error_morepeople', this.form);
		var people_select = $E('#dms_people_more', this.form);
		if (!people_select) return;
		var people_count = parseInt(people_select.getValue());
		var people_last_value = parseInt(people_select.options[people_select.length-1].value);
		
		if (people_count == people_last_value) {
			people_error.setStyle('display', 'block');
		} else {
			people_error.setStyle('display', 'none');
		}
	},
	
	
	/*
	 * check weather the ages for all children are selected 
	 * show the necessary input fields for the selected  child number 
	 */
	checkChildrenAge: function(){
		
		
		var global_error = false;
		var room_num_field = $E( '#dms_room_num'  , this.form);
		if (room_num_field) {
			var room_number = parseInt( room_num_field.getValue() ); 
			
				// check all room allocation areas
			var room_allocations = $ES('.dms_room_allocation', this.form);
			for (var i=0 ; i<room_allocations.length; i++){
				var allocation = new Element(room_allocations[i]);
				
					// check only selected room
				if (i < room_number ){				
					var local_error = false;
					
					var child_input = $E('select.dms_alloc_children',  allocation );
					var child_error = $E('div.dms_error_children',     allocation );
					var childnum    = parseInt( child_input.getValue() );
									
						// show hide child age container
					var container = $ES('.dms_childages', allocation);
					if (container && childnum > 0){
						container.setStyle('display','block');
						var child_age_areas = $ES('.dms_childage', allocation);
						for (var k=0; k < child_age_areas.length; k++){
								
								// alle alterseingabe-bloecke pruefen
								// 
							var child_age_area = new Element( child_age_areas[k] );
							if (k < childnum && child_age_area){
								child_age_area.setStyle('display','inline');
								var child_age_input = $E('select.dms_childage_input', child_age_area);
								if (!child_age_input || !child_age_input.getValue() ){
									local_error = true;
								}
							} else {
								child_age_area.setStyle('display','none');
							}
						}
					} else {
						container.setStyle('display','none');
					}
					
						// show single error items
					if (local_error){
						child_error.setStyle('display','block');
						global_error = true;
					} else {
						child_error.setStyle('display','none');
					}
				}
			}
		} else {
			
			var local_error = false;
			var child_input = $E('select.dms_child_num',       this.form );
			if (child_input) {
				var child_error = $E('div.dms_error_children', this.form);
				var childnum = parseInt(child_input.getValue());
				
				// show hide child age container
				var container = $ES('.dms_childages', this.form);
				
				if (container && childnum > 0) {
					container.setStyle('display', 'block');
					var child_age_areas = $ES('.dms_childage', this.form);
					for (var k = 0; k < child_age_areas.length; k++) {
						// alle alterseingabe-bl�cke pr�fen
						// 
						var child_age_area = new Element(child_age_areas[k]);
						if (k < childnum && child_age_area) {
							child_age_area.setStyle('display', 'inline');
							var child_age_input = $E('select.dms_childage_input', child_age_area);
							if (!child_age_input || !child_age_input.getValue()) {
								local_error = true;
							}
						}
						else {
							child_age_area.setStyle('display', 'none');
						}
					}
				}
				else {
					container.setStyle('display', 'none');
				}
				
				// show single error items
				if (local_error) {
					child_error.setStyle('display', 'block');
					global_error = true;
				}
				else {
					child_error.setStyle('display', 'none');
				}
			}
		}
		
		return (!global_error);
	},	
	
	/*
	 * checak weather last minute is selected and the arrival date matches the condition
	 * max 4 days before arrival
	 */
	
	checkEarlyBird:function(){
		var error = false;
		var select =$E('input#vac_profile_fruehbucher', this.form);
		var err_field = $E('#dms_error_type_earlybirds',this.form);
		if(select && err_field){
			if ( select.checked ) {
				var arr_field = $E('input#dms_anreise', this.form);
					// check condition
				if (arr_field){
					var curr_date = new Date();
					curr_date.setHours(0);
					curr_date.setMinutes(0);
					curr_date.setSeconds(0);
					curr_date.setMilliseconds(0);
					
					var curr_ts = curr_date.getTime();
					var arr_ts  = arr_field.dms_datepicker.getTS();
					
					if ((arr_ts - curr_ts) < ( 84* 86400000) ){
						error  = true;
					} 
				}
			} 
			
			if (error){
				err_field.setStyle('display','block');
				return false;
			} else {
				err_field.setStyle('display','none');
				return true;
			}
		} else {
			return true;
		}
		
		
	},
	
	/*
	 * checak weather early bird bookin is selected and the arrival date matches the condition
	 * at least 12 weeks before arrival 
	 */

	checkLastMinute:function(){
		var error = false;
		var select = $E('input#vac_profile_last_minute', this.form);
		var err_field = $E('#dms_error_type_lastminute',this.form);
		if(select && err_field){
			if ( select.checked ) {
				var arr_field = $E('input#dms_anreise', this.form);
					// check condition
				if (arr_field){
					var curr_date = new Date();
					curr_date.setHours(0);
					curr_date.setMinutes(0);
					curr_date.setSeconds(0);
					curr_date.setMilliseconds(0);
					
					var curr_ts = curr_date.getTime();
					var arr_ts  = arr_field.dms_datepicker.getTS();
					
					if ((arr_ts - curr_ts) > ( 4* 86400000) ){
						error  = true;
					} 
				}
			}
			 
			if (error){
				err_field.setStyle('display','block');
				return false;
			} else {
				err_field.setStyle('display','none');
				return true;
			}
		
		} else {
			return true;
		}
		
	}	
	
});

window.addEvent('domready', function()	{		
	
	$$('#dms_content .dms_form').each(function(form){
		form.dms_form = new dmsForms();
		form.dms_form.init(form);
	});
	
	
});
