// form.js for all your form needs!

var Form = {
	
	form: {},
	
	
	init: function () {
		var sortedListboxes = YAHOO.util.Dom.getElementsByClassName("sortedListbox", "select");
		
		for (var i = 0; i < sortedListboxes.length; i++) {
			var listbox = sortedListboxes[i];
			Form.sortOptionsByText(listbox);	
		}
	},
	
	
	// formvalidation
	check: function (form) {
		if (!form) {
			// alert('form undefined');
			return false;
		}
		Form.form = form;

		// get all fields we have to check / do something with
		
		var requiredFormFields = YAHOO.util.Dom.getElementsBy(this.isRequiredField, undefined, form);
		var dateFields = YAHOO.util.Dom.getElementsBy(this.isDateField, undefined, form);
		// listboxes are multiline selects, but we want all options selected before submit
		var listboxes = YAHOO.util.Dom.getElementsBy(this.isListbox, undefined, form);
		
		for (i = 0; i <listboxes.length; i++) {
			var lb = listboxes[i];
			for (j=0;j<lb.options.length;j++) {
				lb.options[j].selected = true;
			}	
		} 
		// TODO
		var chooseOneFields = YAHOO.util.Dom.getElementsBy(this.isChooseOneField, undefined, form);
			
		var isComplete = true;
		var message;

		for (var i = 0; i < chooseOneFields.length; i++) {
			// TODO!!!
			var formField = chooseOneFields[i];
			YAHOO.util.Dom.removeClass(formField, "incomplete");
		}

		
		for (var i = 0; i < requiredFormFields.length; i++) {
			
			var formField = requiredFormFields[i];
			YAHOO.util.Dom.removeClass(formField, "incomplete");
			
			if ((formField.type == "text") || (formField.type == "textarea")) {
				if (!formField.value) {
					isComplete = false;
					message = "the form is incomplete";
					YAHOO.util.Dom.addClass(formField, "incomplete");
				}
					
			} else if (formField.type == "select-one") {
				if (!formField[formField.selectedIndex].value) {
					isComplete = false;
					message = "the form is incomplete";
					YAHOO.util.Dom.addClass(formField, "incomplete");
				}
			}
		}

		if (!isComplete) {
			// alert("message = " + message);

			Message.show(message);
			return false;	
		}

		// if there are datefields in form, check validity of period
		if (dateFields.length) {
			
			if (dateFields[0].id == 'endDate') {
				dateFields.reverse();
			}
			var startDateField = dateFields[0];
			var endDateField = dateFields[1];
			var startDate = Calendar.string2date(startDateField.value);
			var endDate = Calendar.string2date(endDateField.value);
			
			if (startDate == 'Invalid Date') {

				Message.show('invalid arrival date');
				return false;
			}

			if (endDate == 'Invalid Date') {

				Message.show('invalid departure date');
				return false;
			}
			
			// arrival date must be before departure date
			if (YAHOO.widget.DateMath.before(endDate, startDate)) {

				Message.show('departure is before arrival');
				return false;	
			}
			
			// at least 1 day difference
			if (endDate.toUTCString() == startDate.toUTCString()) {

				Message.show('at least one day');
				return false;	
			}
		}
		
		// ugly hack -- max 5 guests
		if (YAHOO.util.Dom.get('numChildren') && YAHOO.util.Dom.get('numAdults')) {
			var oNumChildren = YAHOO.util.Dom.get('numChildren');
			var oNumAdults = YAHOO.util.Dom.get('numAdults');
			var numChildren = 0;
			var numAdults = 0;
			for (var i = 0; i < oNumChildren.options.length; i++) {

				if (oNumChildren.options[i].selected) {
					numChildren = oNumChildren.options[i].value;
				}
			}
			for (var i = 0; i < oNumAdults.options.length; i++) {

				if (oNumAdults.options[i].selected) {
					numAdults = oNumAdults.options[i].value;
				}
			}
			if ((parseInt(numAdults) + parseInt(numChildren)) > 5) {
				Message.show('maximum 5 guests');
				return false;
			}			
				
		}

		return true;
			
	},

	isReservationAvailableHandler: {
		
		success: function (o) {
			// alert(o.responseText);
			var result = eval( "(" + o.responseText + ")" );
			// alert(result.isAvailable);
			if (result.isAvailable) {
				// alert('beschikb');
				Form.send(Form.form, true);
			} else {
				// alert('niet beschikb');
				Message.show('reservation is unavailable');
				return false;
			}
		},
		failure: function (o) {
			// alert('utter, utter, failure!');
		}
	},



	isRequiredField: function (elem) {
		
		return YAHOO.util.Dom.hasClass(elem, "required");
		
	},
	
	isDateField: function (elem) {
		
		return YAHOO.util.Dom.hasClass(elem, "dateField");
		
	},

	isChooseOneField: function (elem) {
		
		return YAHOO.util.Dom.hasClass(elem, "chooseOne");
		
	},
	
	isConfirmDeleteField: function (elem) {
		
		return YAHOO.util.Dom.hasClass(elem, "confirmDelete");
		
	},
	
	isConfirmed: function (elem) {
		
		return YAHOO.util.Dom.hasClass(elem, "confirmed");
		
	},
	
	isListbox: function (elem) {
		
		return YAHOO.util.Dom.hasClass(elem, "listbox");
	},
	
	isAsyncForm: function (elem) {
		
		return YAHOO.util.Dom.hasClass(elem, "async");
	},


	send: function (form, isUpload, postData) {	
		isUpload = isUpload ? true : false;
		postData = postData ? postData : "";
		// Debug.log('form async send');

		// YAHOO.util.Dom.addClass('AdminNavTabs', 'loading');

		

		if (Form.check(form)) { 
	
			try {
				WYSIWYG.save();
				WYSIWYG.destroy();
			} catch (e) {
				
			}
		
			if (Form.isAsyncForm(form) || isUpload) {

				YAHOO.util.Connect.setDefaultPostHeader(false);
				// if (postData) YAHOO.util.Connect.appendPostData(postData);  
				YAHOO.util.Connect.setForm(form, isUpload);
				YAHOO.util.Connect.asyncRequest("post", form.action, Form.sendHandler, postData);
				form.parentNode.removeChild(form);
				Tabs.activeTab.set('content', '');
			} else {
				form.submit();
			}	
		}
	},
	
	sendHandler: {
		
		upload: function (o) {
			// DumperAlert(o.responseXML.body.innerHTML);
			// WYSIWYG.destroy();
			Calendar.startDate = {};
			Calendar.endDate = {};
			Tabs.activeTab.set('content', o.responseText);
			// alert("sendHandler");
			// Init.init(undefined, Tabs.activeTab.get('id') + 'Form');
			Init.afterFormSend();
			// YAHOO.util.Dom.removeClass('AdminNavTabs', 'loading');
			
		},
		
		success: function (o) {
			// WYSIWYG.destroy();
			Calendar.startDate = {};
			Calendar.endDate = {};
			Tabs.activeTab.set('content', o.responseText);
			// alert("sendHandler");
			// Init.init(undefined, Tabs.activeTab.get('id') + 'Form');
			Init.afterFormSend();
			// YAHOO.util.Dom.removeClass('AdminNavTabs', 'loading');
			
		},
		
		failure: function (o) {
			// alert(o.statusText);
		}			
	},
	
	cancel: function () {
		// reset tab to initial value and reload
		// alert("cancel");
		Tabs.activeTab.resetValue('dataSrc');
		Tabs.activeTab.refresh();	
	},
	
	moveSelectedOptions: function (sourceID, targetID) {
		var source = YAHOO.util.Dom.get(sourceID);
		var target = YAHOO.util.Dom.get(targetID);
		var movedOptions = new Array();
		// alert(source.length);
		
		for (var i = 0; i < source.length; i++) {
			var option = source.options[i];
			if (option.selected) {
				target.appendChild(option);
				movedOptions.push(option);
				i--;
			}	
		}
		
		for (var i = 0; i < movedOptions.length; i++) {
			var option = movedOptions[i];
			// source.removeChild(option);
		} 	

	},
	
	moveSelectedOptionUp: function (listboxID) {
		var listbox = YAHOO.util.Dom.get(listboxID);
		
		for (var i=0; i<listbox.options.length; i++) {
			if ((listbox.options[i].selected) && (i > 0)) {
				
				var selectedOptionIndex = i;
				var insertBeforeOption = listbox.options[i - 1]; 
				var selectedOption = listbox.options[i];
				listbox.insertBefore(selectedOption, insertBeforeOption);
				break;
				
			}
		}
	},
	
	moveSelectedOptionDown: function (listboxID) {
		var listbox = YAHOO.util.Dom.get(listboxID);
		
		for (var i=0; i<listbox.options.length; i++) {
			if ((listbox.options[i].selected) && (i < listbox.length - 1)) {
				
				var selectedOptionIndex = i;
				var insertBeforeOption = listbox.options[i + 2]; 
				var selectedOption = listbox.options[i];
				listbox.insertBefore(selectedOption, insertBeforeOption);
				break;
				
			}
		}
	},
	
	sortOptionsByText: function (listboxID) {
		var listbox = YAHOO.util.Dom.get(listboxID);
		var tmpArr = [];
		
		for (var i = 0; i < listbox.options.length; i++) {
			tmpArr.push(listbox.options[i]);
		}
		tmpArr.sort(function (a,b) { return (a.text < b.text ? -1 : (a.text > b.text ? 1 : 0)) });
		
		for (var i = 0; i < tmpArr.length; i++) {
			listbox.options[i] = tmpArr[i];
		}
	}
		

};

