(function($){
	/**
	*	Page Config
	*/
	var pageConf = {
		debugMode: true
	};

	/**
	*	Helper Funktionen
	*/
	function debug(mixed){if(pageConf.debugMode&&window.console&&window.console.debug)window.console.debug(mixed);}
	function log(mixed){if(pageConf.debugMode&&window.console&&window.console.log)window.console.log(mixed);}
	function uid(){return (new Date().getTime()+Math.round(Math.random()*1000))}

	function medhbe(){
		var t=this;
		$(function(){t.init();})
	}

	medhbe.prototype = medhbe.fn = {
		/**
		 * MEMBER VARS
		 */
			
		validationErrors:[],
			
		options: {
			priceFormat:{'currency': '€','decimals':2,'decdivider':',','nodecimals':',-'},
			dateformat:'dd.mm.yy',
			dataProvider: '/',
			formrules:{},
			locale:'en'
		},
		
		rooms: [],
		
		translation: {},
		
		/**
		 * GENERAL PURPOSE FUNCTIONS
		 */
		setOptions: function(options){
			if(typeof options !== 'object')return;
			$.extend(this.options,options);
		},
		setOption: function(key,value)
		{
			this.options[key] = value;
			return value;
		},
		getOption: function(key)
		{
			if(typeof key !== 'string')return undefined;
			return this.options[key];
		},
		
		registry: {
			
		},
		
		setRegistry: function(key,value){
			this.registry[key] = value;
			return value;
		},
		
		getRegistry: function(str){
			return this.registry[str];
		},
		
		callJSON:function(params,callback,failure){
			$.ajax({
				url: this.options.dataProvider,
				dataType: 'json',
				data: params,
				success: callback,
				complete: function(a,b){if(b!=='success'&&failure)failure(a,b);}
			});
		},

		getRoom:function (uid) {
			 var room;
   		$.each (this.rooms , function (index, value) { if (value['uid'] == uid) room = value } );
			 return room;
		},

		setRoom:function(config){
			this.rooms.push(config);
		},

		formatPrice: function(price){
			var format,str;
			if(!(format = this.getOption('priceFormat'))) return price;
			
			str = String(Number(price).toFixed(format.decimals));
			str = str.split('.');
			if(str.length>1 && Math.floor(price)==Number(price)){
				str[1] = format.nodecimals;
				str = str.join('');
			}else{
				str = str.join(format.decdivider);
			}
			str += ' '+format.currency;
			
			return str;
		},
		
		replaceMarkerObj: function(tpl,obj){
			var i,ret = tpl;
			for( i in obj)
			{
				ret = ret.split('{%'+i+'%}').join(obj[i]);
			}
			
			return ret;
		},
		
		translate: function(key){
			if(this.translation[key]!==undefined)
				return this.translation[key];
			return key;
		},
		
		/**
		 * Form Validation
		 * TODO Multilevel Validation
		 */
		validateForm:function(selector){
			this.validationErrors = new Array();
			
			$(selector+' .medhbe-formsection-error').stop().fadeOut(100);
			
			var rule,func,fdata = $(selector).serializeArray();
			for(var i in fdata)
			{
				if(this.options.formrules[fdata[i].name]){
					var msg = this.options.formrules[fdata[i].name].msg;
					
					if(rule = this.options.formrules[fdata[i].name].rule)
					{
						var regex = new RegExp(this.options.formrules[fdata[i].name].rule);
						if(!regex.test(fdata[i].value))
						{
							this.validationErrors.push({'name': fdata[i].name , 'msg':msg });
							continue;
						}
					}
				}
			}
			
			if(!this.validationErrors.length){
				$(selector+' input[type="submit"]').button('option','disabled',false);
				return;
			}
			
			
			$(selector+' input[type="submit"]').button('option',{disabled:true});
			
			var errField;
			for(var j in this.validationErrors)
			{
				if((errField = $(selector+ ' input[name="'+this.validationErrors[j].name+'"] ').nextAll('.medhbe-formsection-error:first')))
				{
					if(errField.length)
					{
						errField.html('<li>' + this.validationErrors[j].msg + '</li>').fadeIn(200);
					}else{
						var err = $('<ul class="clear medhbe-formsection-error"><li>'+this.validationErrors[j].msg+'</li></ul>')
						.hide()
						.insertAfter(selector+ ' input[name="'+this.validationErrors[j].name+'"] ')
						.fadeIn(200);
					}
					
				}	
			}
			
		},

		/**
		 * INIT EVERYTHING
		 */
		init: function()
		{
			$.datepicker.setDefaults($.datepicker.regional[this.options.locale]);
			
			$('.medhbe .medhbe-button').button();
					
			for(var i in this.registry)
			{
				if(this.registry[i]&&this[i])this[i]();
			}
			var navi=$('.medhbe-step-navigation');
			if(navi.length)
			{
				navi.buttonset().find('a.disabled').each(function(){
					var button = $(this);
					button.button({ disabled: true });
				});
			}

			$('.medhbe .medhbe-formsection-error-startup').each(function(){$(this).fadeIn(200);});
		},

		/**
		 * INIT STEP 1
		 */
		initStep1:function(){
			var t=this;
			//Überprüfung ob Auto-Datumeintrag valide ist
			t.validateForm('#medhbe-step1-form');
			
			$('#medhbe-entrydate-from, #medhbe-entrydate-to').datepicker({dateFormat:this.options.dateformat,  minDate: new Date(),numberOfMonths:2});
			
			$('#medhbe-entrydate-from').change(function()
			{
				var d=$(this).datepicker('getDate');
				var minDate = new Date(new Date(d).getTime()+86400000);
				if(d==null)minDate=new Date(new Date().getTime()+86400000);
				var to = $('#medhbe-entrydate-to');
				var toDate = to.datepicker('getDate');
				if(toDate==null)to.datepicker('setDate',minDate);
				to.datepicker('option',{
					minDate: minDate
				});
			});

			$('#medhbe-entrydate-to').change(function()
			{
				var d=$(this);
				var maxDate = new Date(new Date(d).getTime()-86400000);
				if(d==null)maxDate=null;
				$('#medhbe-entrydate-from').datepicker('option',{
					maxDate: maxDate
				});
			});

			$('#medhbe-step1-form').change(function(){
				if($('#medhbe-entrydate-from').datepicker('getDate')==null)return;
				if($('#medhbe-entrydate-to').datepicker('getDate')==null)return;
				t.validateForm('#medhbe-step1-form');
			})
		},

		/**
		 * 
		 */
		initStep2:function(){
			var t=this;

			function updateSubTotals(){
				$('#medhbe-step2-form .medhbe-roomselection-room').each(function(){
					t.calculateSubTotal($(this),function(price){
						this.find('.medhbe-roomselection-room-price-value').html(t.formatPrice(price));
					});
				});
			}
			//Funktion zur Überprüfung der Maximalen Anzahl an Gästen in Kombination mit Kindern und Zustellbetten
			function updatePeopleSelect(){
				$('#medhbe-step2-form .medhbe-roomselection-room-bookings-form').each(function(){
				  // debug( $(this).find("SELECT[name*=\[num_reservation\]]").val() ) ;
				  //nach jeder Änderung am Formular durch alle Zimmer gehen und die Selectboxen auf korrekte Zimmeranzahl prüfen
				  var room_uid =   $(this).find("input[name*=\[roomtype_uid\]]").val();
				  var room = t.getRoom(room_uid) ;
					var select_num_reservation =$(this).find("SELECT[name*=\[num_reservation\]]"); //Selectbox Erwachsene
					var select_num_reservation_children = $(this).find("SELECT[name*=\[num_reservation_children\]]"); //Selectbox Kinder  unter 5
					var select_num_reservation_children_above5 = $(this).find("SELECT[name*=\[num_reservation_children_above5\]]"); //Selectbox Kinder über 5
					var select_num_reservation_extrabeds = $(this).find("SELECT[name*=\[num_reservation_extrabeds\]]"); //Selectbox Zustellbett
					var availableChilds =  room['numAvailableChilds']; //Variabler Wert der Maximal zur Verfügung stehenden Kindern, je nachdem ob zustellbetten möglich sind oder nicht

					//Wenn ein Extrabett ausgewählt ist, die Kinder deaktivieren, falls Sie in der Summer mehr ergeben, als die Maximalanzahl an erwachsenen
					if (select_num_reservation_extrabeds.val() >= 1 && (Number(select_num_reservation.val()) >= Number(room['numAvailableAdults'])) ) {
      				disableChildSelect (select_num_reservation_children);
      				disableChildSelect (select_num_reservation_children_above5);
					}else{

						  enableChildSelect(select_num_reservation_children_above5, room);
						  enableChildSelect(select_num_reservation_children, room);
						//Wenn ein Erwachsener ausgewählt ist, dann auch die Kinderanzahl überprüfen
						if (select_num_reservation.val() > 0) {
						    //Wenn die maximale Aufbettung kleinergleich 0 ist, dann die Menge der erwachsenen von der zur Verfügung stehenden Kindern abziehen, also nur bei normalen Doppelzimmern
						    if (room['numAvailableExtraBeds'] <= 0) {
										availableChilds = (availableChilds - select_num_reservation.val());
								}else{
                    availableChilds = room['numAvailableChilds'];
								}
								debug("Anzahl der Kinder: " + availableChilds);
						    //Wenn Kinder unter 5 auf dem Maximum sind, dann das andere Kindselect deaktivieren
						    if (select_num_reservation_children_above5.val() == room['numAvailableChilds'] || availableChilds < 0 ) {
									disableChildSelect(select_num_reservation_children);
        				}else{
									enableChildSelect(select_num_reservation_children, room);
								}
						    //Wenn Kinder über 5 auf dem Maximum sind, dann das andere Kindselect deaktivieren
						    if (select_num_reservation_children.val() == room['numAvailableChilds'] || availableChilds < 0) {
									disableChildSelect(select_num_reservation_children_above5);
								}else{
									enableChildSelect(select_num_reservation_children_above5, room);
								}


						    
							//Wenn Kinder ausgewählt sind, dann das Extrabed disablen, sofern die Anzahl der Erwachsenen plus Kinder die Maximalanzahl an Erwachsenen überschreitet
							if (Number(select_num_reservation_children.val()) + Number(select_num_reservation_children_above5.val()) + Number(select_num_reservation.val()) > parseInt(room['numAvailableAdults']) ) {
				        select_num_reservation_extrabeds.val("");
			      		select_num_reservation_extrabeds.attr("disabled","disabled");
							}else if (room['numAvailableExtraBeds'] > 0) {
                 select_num_reservation_extrabeds.removeAttr("disabled");
							}
							//Wenn keine Erwachsenen aber nur Kinder ausgewählt, dann Meldung ausgeben
						}else if (select_num_reservation.val() < 1 && (select_num_reservation_children.val() >= 1 || select_num_reservation_children_above5.val() >= 1)) {
						    select_num_reservation_children.val("");
						    select_num_reservation_children_above5.val("");
								//alert("Es muss mindestens ein Erwachsener im Zimmer sein");
                 //$('<div/>').html(t.translate('entry_confirm_delete')).dialog({modal:true,buttons: buttons});
                 var buttons = {};
								buttons[t.translate('entry_confirm_delete_ok')] = function(){
									//resetOrderItems(target);
									$(this).dialog('close');
								};
								$('<div/>').html(t.translate('min_num_reservation')).dialog({modal:true, buttons: buttons});

								
						}
					}


				});
			}
			function enableChildSelect (select, room) {
					if (room['numAvailableChilds'] > 0) {
			    	select.removeAttr("disabled");
			    }
			}

			//Die Selectoren für die Kinder disablen
			function disableChildSelect (select) {
          select.val("");
      		select.attr("disabled","disabled");
			}
			
			function disableExtraBed () {
			    select = $(this).find("SELECT[name*=\[num_reservation_extrabeds\]]");
          select.val("");
      		select.attr("disabled","disabled");
			}


			$('#medhbe-step2-form').change(function(){
			
        updatePeopleSelect();
				updateSubTotals();
				t.calculateTotal($(this),function(price){this.find('.medhbe-room-total-num').html(t.formatPrice(price));});
				t.validateForm('#medhbe-step2-form');
			}).change();
			
			if(!this.rooms.length)return;
			for(var i in this.rooms)
				this.initRoom(this.rooms[i]);
		},

		/**
		 * Raumbuchungsoptionen erstellen
		 */
		initRoom: function(data){
			var t=this,
			addlink = $(data.controlscontainer+' a:first').click(function(){
				addEntry();
			});

			function addEntry(){
				var items = $(data.itemcontainer+' '+data.itemwrap);
				
				if(data.numAvailableRooms <= items.length)
					return;

				var tpl = $(data.listtpl).html();
				var regex = new RegExp('(\/\/\<!\[CDATA\[)|(\/\/\]\]\>)','g');
				tpl = tpl.split('//<![CDATA[').join('').split('//]]>').join('');
				tpl = $(t.replaceMarkerObj(tpl,{'ID':items.length}));
				$(data.itemcontainer).append(tpl);
				
				resetOrderItems();
				
				return tpl;
			}
			
			
			function resetOrderItems(deleteId){
				var 
				items = $(data.itemcontainer+' '+data.itemwrap),
				newitems = new Array();
				var escapedNs = data.ns.split('[').join('\\[').split(']').join('\\]');
				idRegex = new RegExp(escapedNs+'\\[[0-9]+\\]','g');
				items.each(function(){
					var el=$(this).detach();
					var entryId = $(this).find(data.entryId).val();
					if((isNaN(entryId)&&!entryId)||(deleteId!==undefined && entryId==deleteId)){
						return;
					}
					el.find('*[name^="'+data.ns+'"]').each(function(){
						var t = $(this);
						t.attr('name',t.attr('name').replace(idRegex,data.ns+'['+newitems.length+']'));
					});
					el.find('.medhbe-roomselection-room-bookings-form-entryId').val(newitems.length);
					el.find('.medhbe-delete-entry').attr('rel',newitems.length);
					newitems.push(el);
				});
				for(i in newitems)$(data.itemcontainer).append(newitems[i]);
				updateListeners();
				$('#medhbe-step2-form').change();
			}
			
			function updateListeners(){
				var items =  $(data.itemcontainer+' '+data.itemwrap);
				
				if(items.length < 2)
				{
					items.find('a.medhbe-delete-entry').hide();
				}else{
					items.find('a.medhbe-delete-entry').show().unbind('click').bind('click',function(){
						
						var target=$(this).attr('rel');
						
						if(target===undefined)return;
						
						var buttons = {};
						buttons[t.translate('entry_confirm_delete_cancel')] = function(){
							$(this).dialog('close');
						};
						buttons[t.translate('entry_confirm_delete_ok')] = function(){
							resetOrderItems(target);
							$(this).dialog('close');
						};
						
						$('<div/>').html(t.translate('entry_confirm_delete')).dialog({modal:true,buttons: buttons});
					});
				}
				
				
				
				items.find('a.medhbe-launch-options').unbind('click').bind('click',function(){
					var params,el=$(this);
					try{
						params = (new Function("bparams",'return '+el.attr('rel')+'; '))();
					}catch(e){debug(e);return;}
					$.fancybox(					
						{
							type:'ajax',
							href:t.getOption('optionsProvider'),
							ajax:{
								type:'POST',
								data:'options='+params.options+'&selected='+$('input[name="'+params.field+'"]').val(),
								complete:function(a){
									$('#fancybox-inner').find('.medhbe-options-submit').click(function(){
										updateOptions($('input[name="'+params.field+'"]'),$('#fancybox-inner'));
										$.fancybox.close();
										$('#medhbe-step2-form').change();
									});
								}
							}
						}
					);
				});
			}
			
			function updateOptions(input,target){
				var options = target.find('.medhbe-options-option'),
				list=new Array();
				
				options.each(function(){
					var option,el = $(this);
					if(!(option = el.children('option[value!=""]:selected:first')).length)
						return;
					list.push(el.attr('name')+':'+option.val());
				})
				input.val(list.join(','));
			}
			
			updateListeners();
		},
		
		/**
		 * Ajaxpreise
		 */
		calculateSubTotal:function(target,callback){
			var type=target.find('input[name$="roomtype_uid]"]:first').val();
			var res=target.find('select[name$="num_reservation]"]:first option:selected').val();
			var reschi=target.find('select[name$="num_reservation_children]"]:first option:selected').val();
			var options=target.find('input[name$="options]"]:first').val();
			
			var params = [],
			form = target.find('*[name^="medhbe"]');
			form.each(function(){params.push($(this).attr('name')+'='+$(this).val());})
			
			if(!params.length){
				if(callback)callback.apply(target,[0]);
				return;
			}
			
			
			
			
			$.ajax({url:this.getOption('priceProvider'),
				data:'what=roomtotal&'+params.join('&'),
				type:'POST',
				dataType:'json',
				success:function(a){
					if(a.error){
						log(a.error);
					}
					if(!a.price)a.price=0;					
					if(callback)callback.apply(target,[a.price]);
				},
				complete:function(a){
					//debug(a);
				}
			});
		},
		calculateTotal:function(target,callback){
			var data = target.serializeArray();
			
			var postdata = [];
			
			for(var i in data){
				postdata.push(data[i].name +'=' +data[i].value);
			}
			
			if(!postdata.length)
				return;
			
			$.ajax({
				url:this.getOption('priceProvider'),
				data:'what=total&'+postdata.join('&'),
				type:'POST',
				dataType:'json',
				success:function(a){
					if(a.error){
						log(a.error);
					}
					if(!a.price)a.price=0;
					if(callback)callback.apply(target,[a.price]);
				},
				complete:function(a){
					//debug(a);
				}
			});
		},
		
		/**
		 * INIT STEP 3
		 */
		initStep3:function(){
			var t=this;
			
			
			var isStartup = true;
			$('#medhbe-step3-form').change(function(e){
				if(isStartup && $(e.target).attr('type')=='password')
				{
					isStartup = false;
					return;
				}
				//t.validateForm('#medhbe-step3-form');
			})
			$('#button-login').click(function(e){
				
				var params = [];
				params.push('medhbe_login_password='+$('[name=medhbe_login_password]').val());
				params.push('medhbe_login_userName='+$('[name=medhbe_login_userName]').val());
				
				$.ajax({url:t.getOption('dataProvider'),
					data:'what=login&'+params.join('&'),
					type:'POST',
					dataType:'json',
					success:function(a){
						if(a.error){
							log(a.error);
						}

						jQuery.each(a.formdata,function(key){
							if(this != '[object Window]')
								if(key=='medhbe_newuser_lastName') {
									$('[name='+key+']').val(this.split(" ")[1]);
									$('[name=medhbe_newuser_firstName]').val(this.split(" ")[0]);
								} else
									$('[name='+key+']').val(this)

						})
						jQuery('#medhbe-roomselection-room-content-js-hide-1').hide();
						jQuery('#medhbe-roomselection-room-content-js-hide-2').show();
						//fill form with provided data or invalid login
					},
					complete:function(a){
						//debug(a);
					}
				});
				
				
			})
		}
		
	};
	
	window.medhbe = new medhbe();
	
})(jQuery);
