/*
	Some helper functions for handling suggestion selection
*/

Date.diff=function (date1,date2)
			{
				if (date1 && date2) {
					date1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());
					date2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());
					var diff = date2.getTime() - date1.getTime();
					var diffDay = diff / Date.DAY;
					//console.log("date diff: date1=[" + date1 + "] date2=[" + date2 + "] diff=[" + diff + "] diffDay=[" + diffDay + "]");
					return diffDay;
				}
				return 0;
			}

function getSelectionId(text, li) {
	var cityPoiId = document.getElementById("CityPoiIdHiddenField");
	if (cityPoiId) {
		cityPoiId.value = li.id;
	}
}




/*
	Some helper functions for handling calendar input fields
*/

CalendarInputField = function(field_id, start_date, end_date, display_date_format, hidden_field_id, transfer_date_format, offset) {
	this.field_id = field_id;
	this.start_date = start_date;
	this.end_date = end_date;
	this.display_date_format = display_date_format;
	this.hidden_field_id = hidden_field_id;
	this.transfer_date_format = transfer_date_format;
	this.offset = offset;
	this.linked_cif = null;

	// contains hidden field a date value then update text field
	var text_field = document.getElementById(this.field_id);
	var hidden_field = document.getElementById(this.hidden_field_id);
//	console.log("hidden field: [" + this.hidden_field_id + "] [" + hidden_field + "]");
	if (hidden_field && text_field) {
		var value = hidden_field.value;
//		console.log("hidden field: value=[" + value + "]");
		if (value.length > 0) {
			var date = Date.parseDate(value, this.transfer_date_format);
			text_field.value = date.print(this.display_date_format);
		}
	}
};

// Member functions
CalendarInputField.prototype.getDate = function() {
	var date = null;
	var field = document.getElementById(this.hidden_field_id);
	if (field) {
		var value = field.value;
		if (value && value.length > 0) {
			date = Date.parseDate(value, this.transfer_date_format);
		}
//		console.log("get date: field=[" + this.hidden_field_id + "] value=[" + value + "] date=[" + date + "]");
	}
	return date;
}
CalendarInputField.prototype.setLinkedCif = function(cif) {
	this.linked_cif = cif;
}
CalendarInputField.prototype.validate = function() {
	var field = document.getElementById(this.field_id);
	if (field) {
		var date;
		var value = field.value;
		if (value && value.length > 0) {
//			console.log("validate field: field=[" + this.field_id + "] value=[" + value + "]");
			// handle only date formats containing NOT a ','
			// (to ignore display formats like 'Mi, 8. Oktober 2008') 
			if (value.indexOf(',') == -1) {
				date = null;
				var today = new Date();
				if (date == null && value.match(/^\d\d?[-/\.]\d\d?$/)) {
					value += "." + today.getFullYear();
				}
				if (date == null && value.match(/^\d\d?[-/\.]\d\d?[-/\.]$/)) {
					value += today.getFullYear();
					date = Date.parseDate(value, "%d.%m.%Y");
//					console.log("parse value: value=[" + value + "] format=[d.m.Y] date=[" + date + "]");
				}
				if (date == null && value.match(/^\d\d?[-/\.]\d\d?[-/\.]\d+$/)) {
					date = Date.parseDate(value, "%d.%m.%Y");
//					console.log("parse value: value=[" + value + "] format=[d.m.Y] date=[" + date + "]");
				}
				// match '2008-01-22'
				if (date == null && value.match(/^\d{4}-\d{2}-\d{2}$/)) {
					date = Date.parseDate(value, "%Y-%m-%d");
//					console.log("parse value: value=[" + value + "] format=[Y-m-d] date=[" + date + "]");
				}
				// anything else best try
				if (date == null) {
					date = Date.parseDate(value, "%d.%m.%Y");
//					console.log("parse value: value=[" + value + "] format=[d.m.Y] date=[" + date + "]");
				}
//				console.log("extracted date: date=[" + date + "]");
			}
		} else {
			date = null;
		}
		
		if (typeof date != "undefined") {
			this.update(date, true);
		}
	}
};
CalendarInputField.prototype.update = function(date, update_linked_cif) {
//	console.log("update: date=[" + date + "]");
	
	if (date) {
		if (this.start_date) {
			// check if date is less than start_date
			if (Date.diff(this.start_date, date) < 0) {
				date = this.start_date;
			}
		}
		if (this.end_date) {
			// check if date is greater than end_date
			if (Date.diff(this.end_date, date) > 0) {
				date = this.end_date;
			}
		}
	}
	
	CalendarInputField.updateField(this.field_id, date, this.display_date_format);
	CalendarInputField.updateField(this.hidden_field_id, date, this.transfer_date_format);
	
	if (update_linked_cif && this.linked_cif) {
		if (date) {
			var linked_cif_date = this.linked_cif.getDate();
//			console.log("update linked cif: date=[" + linked_cif_date + "]");
			if (this.offset > 0) {
				if (linked_cif_date == null || date.getTime() >= linked_cif_date.getTime()) {
					var time = date.getTime();
					time += (this.offset * Date.DAY);
//					console.log("new date: date=[" + new Date(time) + "] offset=[" + this.offset + "] diff=[" + (this.offset * Date.DAY) + "]");
					this.linked_cif.update(new Date(time), false);
				}
			}
			if (this.offset < 0) {
				if (linked_cif_date == null || date.getTime() <= linked_cif_date.getTime()) {
					var time = date.getTime();
					time += (this.offset * Date.DAY);
//					console.log("new date: date=[" + new Date(time) + "] offset=[" + this.offset + "] diff=[" + (this.offset * Date.DAY) + "]");
					this.linked_cif.update(new Date(time), false);
				}
			}
		} else {
			// clear linked cif
			this.linked_cif.update(null, false);
		}
	}
};
CalendarInputField.prototype.isDisallowedDate = function(date, y, m, d) {
	if (date == null || date.length == 0) {
		// given date could (maybe) not parsed
		return false;
	}
	// check for date constraints
	var disallowDate = false; 
	if (this.start_date) {
		// check if date is less than start_date
		if (Date.diff(this.start_date, date) < 0) {
			disallowDate = disallowDate || true;
		}
	}
	if (this.end_date) {
		// check if date is greater than end_ate
		if (Date.diff(this.end_date, date) > 0) {
			disallowDate = disallowDate || true;
		}
	}
	return disallowDate;
}

// Helper functions
CalendarInputField.updateField = function(field, date, format) {
	var fieldObj = field;
	if (typeof field == "string") {
		fieldObj = document.getElementById(field);
	}
	if (fieldObj) {
		if (date) {
//			console.log("update field: field=[" + fieldObj.id + "] date=[" + date.print(format) + "]");
			fieldObj.value = date.print(format);
		} else {
//			console.log("update field: field=[" + fieldObj.id + "] date=[]");
			fieldObj.value = "";
		}
	}
}


// ----- Global Setup Variables

var calendar_today = new Date();
calendar_today = new Date(calendar_today.getFullYear(), calendar_today.getMonth(), calendar_today.getDate());

var calendar_input_fields = {
	elements: [],
	add: function(calendar_input_field) {
		if (typeof calendar_input_field != "undefined") {
//			console.log("add CIF: [" + calendar_input_field + "]");
			calendar_input_fields.elements[calendar_input_field.field_id] = calendar_input_field;
		}
	},
	get: function(id){
		return calendar_input_fields.elements[id];
	},
	remove: function(id){
		delete calendar_input_fields.elements[id];
	}
}

var arrival_start_date;
var arrival_start_date_offset;
var arrival_end_date;
var arrival_end_date_offset;
var arrival_year_range;
var arrival_cif;

var departure_start_date;
var departure_start_date_offset;
var departure_end_date;
var departure_end_date_offset;
var departure_year_range;
var departure_cif;

var text_field;

