/**
 * 
 * ***********************************************************************************************************
 * ----- JAVASCRIPT DETAILSUCHE -----
 * ***********************************************************************************************************
 */

var responseOK = true;
var tmpparams = '';

/**
 * 
 * ***********************************************************************************************************
 * Changeevents Formular
 * ***********************************************************************************************************
 */
function onFormChange(evt, links) {
	var params = 'eID=atonfewoAjax&lang=' + document.documentElement.lang;
	tmpparams = '';

	params += '&user_atonfewo_sv1[searchparams][object_name]=' + document.getElementById('atonfewo_detailquery_object_name').value;
	params += '&user_atonfewo_sv1[searchparams][object_person]=' + document.getElementById('atonfewo_detailquery_object_person')[document.getElementById('atonfewo_detailquery_object_person').selectedIndex].value;

	for ( var i = 1; i < 7; i++) {
		var selectbox = document.getElementById('atonfewo_detailquery_object_region' + i);
		if (selectbox.checked) {
			params += '&user_atonfewo_sv1[searchparams][object_region][' + (i - 1) + ']=' + selectbox.value;
		}
	}

	for ( var i = 1; i <= 2; i++) {
		var selectbox = document.getElementById('atonfewo_detailquery_object_type' + i);
		if (selectbox.checked) {
			params += '&user_atonfewo_sv1[searchparams][object_type][' + (i - 1) + ']=' + selectbox.value;
		}
	}

	if (responseOK) {
		sendRequest('index.php', getServerResponse, params);
		responseOK = false;
	} else {
		tmpparams = params;
	}
}

/**
 * 
 * ***********************************************************************************************************
 * XMLHttpRequest
 * ***********************************************************************************************************
 */
function getXMLHttpRequest() {
	var httpReq = null;

	if (window.XMLHttpRequest) {
		httpReq = new XMLHttpRequest();
	} else if (typeof ActiveXObject != 'undefined') {
		httpReq = new ActiveXObject('Microsoft.XMLHTTP');
	}

	if (!httpReq) {
		alert('Could not create XMLHTTP-Instance!!');
	}

	return httpReq;
}

/**
 * 
 * ***********************************************************************************************************
 * XMLHttpRequest abschicken
 * 
 * Die Anfrage wird an die Serviceklasse der Extension 'user_atonfewo' geschickt
 * (eID)!
 * ***********************************************************************************************************
 */
function sendRequest(url, handler, params) {
	req = getXMLHttpRequest();

	if (req) {
		req.open('POST', url, true);
		req.onreadystatechange = handler;
		req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
		req.setRequestHeader('Content-length', params.length);
		req.setRequestHeader('Connection', 'close');

		req.send(params);
	}
}

/**
 * 
 * ***********************************************************************************************************
 * Antwort vom Server auswerten
 * ***********************************************************************************************************
 */
function getServerResponse() {
	if (req.readyState == 4) {
		responseOK = true;
		/**
		 * Request nochmal absetzen wenn während der letzten Anfrage etwas
		 * eingegeben wurde
		 */
		if (tmpparams != '') {
			sendRequest('', getServerResponse, tmpparams);
			responseOK = false;
			tmpparams = '';
		}

		/** JSON String dekodieren */
		var res = jQuery.parseJSON(req.responseText);

		switch (res['mode']) {
		case 0:
			changeStatusbox('typo3conf/ext/user_atonfewo/res/img/icon_ok.png', 'green', res['res']);
			break;
		case 1:
			changeStatusbox('typo3conf/ext/user_atonfewo/res/img/icon_warning.png', 'yellow', res['res']);
			break;
		default:
		}

	}
}

function changeStatusbox(imgpath, className, res) {
	var statusicon = document.getElementById('atonfewo-search-details-status-icon');
	statusicon.src = imgpath;

	var statusbox = document.getElementById('atonfewo-search-details-status');
	statusbox.className = className;

	var statustext = document.getElementById('atonfewo-search-details-status-statustext');
	statustext.innerHTML = res;
}

/**
 * 
 * ***********************************************************************************************************
 * ----- JAVASCRIPT BELEGUNGSPLAN -----
 * ***********************************************************************************************************
 */
var tooltip;

var lastReservationWebcode = '';

var arrival = 0;
var arrivalHistory = '';
var departure = 0;
var reservationHistory = new Array();

var monthChooserClassHistory = '';
var monthChooserClickHistory = '';

/**
 * **************************************************************************************************************
 * Eventauswertung für die Benutzerreservierung
 * **************************************************************************************************************
 * 
 * @param evt
 *            Event vom Browser
 * @param link
 *            Eventparameter vom Browser
 */
function onTableClick(evt, link) {
	var day = document.getElementById(link.id);
	var webcode = day.id.split('-')[1];

	if (lastReservationWebcode == '') {
		lastReservationWebcode = webcode;
		markUserReservation(evt, link);
	} else if (webcode == lastReservationWebcode) {
		markUserReservation(evt, link);
	} else {
		// Letzte Reservierungsmarkierung löschen
		deleteUserReservation(lastReservationWebcode);
		lastReservationWebcode = '';
		// Reservierung markieren
		markUserReservation(evt, link);
	}

}

/**
 * Benutzerreservierung markieren
 * 
 * @param evt
 *            Event vom Browser
 * @param link
 *            Eventparameter vom Browser
 */
function markUserReservation(evt, link) {
	var day = document.getElementById(link.id);
	var webcode = day.id.split('-')[1];
	var dayID = parseInt(day.id.split('-')[0]);
	var tooltip = document.getElementById('tooltip-' + webcode);

	/**
	 * Auswahl nur annehmen, wenn ein freier oder ein An-Abreisetag gewählt
	 * wurde
	 */
	if (day.className.search('free') != -1 || day.className.search('arrdep') != -1) {
		/** Anreisetag gewählt */
		if (arrival == 0) {
			arrival = dayID;
			arrivalHistory = day.className;

			day.className = 'userreservation';

			/** Tooltip anzeigen */
			$(tooltip).fadeIn('fast');
			$(tooltip).delay(3000).fadeOut('slow');

		} else if (arrival != 0 && departure == 0 && arrival < dayID) {
			/** Abreisetag gewählt */
			var resFlag = false;

			/**
			 * Überprüfen, ob eine Reservierung zwischen den ausgewählten Tagen
			 * liegt
			 */
			for ( var i = arrival; i <= dayID; i += 86400) {
				var tempDay = document.getElementById(String(i + '-' + webcode));

				if (tempDay.className.search('userreservation') == -1 && tempDay.className.search('free') == -1 && tempDay.className.search('arrdep') == -1) {
					resFlag = true;
				}
			}

			if (resFlag) {
				/** Anreisedatum abwählen */
				day = document.getElementById(arrival + '-' + webcode);
				day.className = arrivalHistory;

				arrival = 0;
				arrivalHistory = '';
			} else {
				departure = dayID;

				/** Reservierung komplett einfärben */
				for ( var i = arrival; i <= departure; i += 86400) {
					var tempDay = document.getElementById(i.toString() + '-' + webcode);

					reservationHistory.push(tempDay.className);
					tempDay.className = 'userreservation';
				}
				reservationHistory[0] = arrivalHistory;

			}
		} else {
			/** Auswahl entfernen */
			/** Anreisetag zurücksetzen */
			if (arrival != 0 && departure == 0) {
				var tempDay = document.getElementById(arrival.toString() + '-' + webcode);
				tempDay.className = arrivalHistory;
			} else {
				/** Benutzerauswahl zurücksetzen */
				deleteUserReservation(webcode);
			}

			arrival = 0;
			arrivalHistory = '';
			departure = 0;
			reservationHistory = new Array();
		}
	}
}

/**
 * Benutzerreservierung löschen
 * 
 * @param webcode
 *            Wecode
 */
function deleteUserReservation(webcode) {
	var j = 0;

	if (departure == 0) {
		departure = arrival;
		reservationHistory.push(arrivalHistory);
	}

	for ( var i = arrival; i <= departure; i += 86400) {
		var tempDay = document.getElementById(i.toString() + '-' + webcode);

		tempDay.className = reservationHistory[j];
		j++;
	}

	arrival = 0;
	arrivalHistory = '';
	departure = 0;
	reservationHistory = new Array();
}

/**
 * Event Handler für "Buchen" Buttons, URL Parameter an Kontaktformular
 * (powermail) übergeben. Der Link zum Kontaktformular wir nur aufgerufen, wenn
 * vom User ein An- und Abreisedatum gewählt wurde. Andernfalls wird der
 * Menüpunkt "Verfügbarkeit" ausgeklappt und der Tootip zur Info angezeigt.
 * 
 * @param evt
 *            Event vom Browser
 * @param link
 *            Eventparameter vom Browser
 * @param webcode
 *            Webcode
 * @param urlParameter
 *            aktuelle URL Parameter
 */
function onClickBookingButton(evt, link, webcode, language, objectName) {
	var tooltip = document.getElementById('tooltip-' + webcode);
	var div = document.getElementById('atonfewo-listview-flexible-' + webcode);

	/** Nur zum Formular wechseln, wenn ein An- und Abreisedatum ausgewählt wurde */
	if (arrival == 0 || departure == 0) {
		/** Akkordion "Verfügbarkeit" öffnen */
		if (link.id == 'atonfewo-listview-btnbook-' + webcode + '-1' && (div.style.display == '' || div.style.display == 'none')) {
			$('#atonfewo-listview-flexible-' + webcode).slideToggle("slow", function() {
				$('#atonfewo-listview-flexible-accordion-' + webcode).accordion("option", "active", 1);
			});
		} else {
			$('#atonfewo-listview-flexible-accordion-' + webcode).accordion("option", "active", 1);
		}

		/** Tooltip anzeigen */
		$(tooltip).delay(2000).fadeIn('fast');
		$(tooltip).delay(5000).fadeOut('slow');
	} else {
		var tmpArrival = new Date(arrival * 1000).getDate() + '.' + (parseInt(new Date(arrival * 1000).getMonth()) + 1) + '.' + new Date(arrival * 1000).getFullYear();
		var tmpDeparture = new Date(departure * 1000).getDate() + '.' + (parseInt(new Date(departure * 1000).getMonth()) + 1) + '.' + new Date(departure * 1000).getFullYear();

		switch (parseInt(language)) {
		case 0:
			var uid1 = 'uid16';
			var uid2 = 'uid17';
			var uid3 = 'uid18';
			var uid4 = 'uid19';
			break;
		case 1:
			var uid1 = 'uid72';
			var uid2 = 'uid70';
			var uid3 = 'uid73';
			var uid4 = 'uid74';
			break;
		case 2:
			var uid1 = 'uid91';
			var uid2 = 'uid89';
			var uid3 = 'uid92';
			var uid4 = 'uid93';
			break;
		default:
		}

		location.href = 'index.php?id=88&L=' + language + '&tx_powermail_pi1[' + uid1 + ']=' + webcode + '&tx_powermail_pi1[' + uid2 + ']=' + objectName + '&tx_powermail_pi1[' + uid3 + ']=' + tmpArrival + '&tx_powermail_pi1[' + uid4 + ']=' + tmpDeparture + '&queryFor=' + webcode;
	}
}

/**
 * Events der Monatsauswahl
 * 
 * @param evt
 *            Event vom Browser
 * @param link
 *            Eventparameter vom Browser
 */
function monthChooserMouseOver(evt, link) {
	monthChooserClassHistory = document.getElementById(link.id).className;
	document.getElementById(link.id).className = 'td-mouseover';
}

function monthChooserMouseOut(evt, link) {
	document.getElementById(link.id).className = monthChooserClassHistory;
}

function monthChooserMouseClick(evt, link) {
	var tmp = link.id.split('-');
	var id = parseInt(tmp.pop());
	var webcode = tmp[tmp.length - 1];
	var classname = tmp.join('-');
	var offset = -251 * id;

	$('#atonfewo-calendartables-' + webcode).animate({
		'left' : offset + 'px'
	}, 'slow');

	for ( var i = 0; i < 12; i++) {
		if (document.getElementById(classname + '-' + i).className == 'td-act') {
			document.getElementById(classname + '-' + i).className = 'td-mouseout';
		}
	}

	document.getElementById(link.id).className = 'td-act';
	monthChooserClassHistory = document.getElementById(link.id).className;
}

/**
 * jQuery JSON Plugin version: 2.3 (2011-09-17)
 * 
 * This document is licensed as free software under the terms of the MIT
 * License: http://www.opensource.org/licenses/mit-license.php
 * 
 * Brantley Harris wrote this plugin. It is based somewhat on the JSON.org
 * website's http://www.json.org/json2.js, which proclaims: "NO WARRANTY
 * EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.", a sentiment that I uphold.
 * 
 * It is also influenced heavily by MochiKit's serializeJSON, which is
 * copyrighted 2005 by Bob Ippolito.
 */

(function($) {

	var escapeable = /["\\\x00-\x1f\x7f-\x9f]/g, meta = {
		'\b' : '\\b',
		'\t' : '\\t',
		'\n' : '\\n',
		'\f' : '\\f',
		'\r' : '\\r',
		'"' : '\\"',
		'\\' : '\\\\'
	};

	/**
	 * jQuery.toJSON Converts the given argument into a JSON respresentation.
	 * 
	 * @param o
	 *            {Mixed} The json-serializble *thing* to be converted
	 * 
	 * If an object has a toJSON prototype, that will be used to get the
	 * representation. Non-integer/string keys are skipped in the object, as are
	 * keys that point to a function.
	 * 
	 */
	$.toJSON = typeof JSON === 'object' && JSON.stringify ? JSON.stringify : function(o) {

		if (o === null) {
			return 'null';
		}

		var type = typeof o;

		if (type === 'undefined') {
			return undefined;
		}
		if (type === 'number' || type === 'boolean') {
			return '' + o;
		}
		if (type === 'string') {
			return o;
			// return $.quoteString(o);
		}
		if (type === 'object') {
			if (typeof o.toJSON === 'function') {
				return $.toJSON(o.toJSON());
			}
			if (o.constructor === Date) {
				var month = o.getUTCMonth() + 1, day = o.getUTCDate(), year = o.getUTCFullYear(), hours = o.getUTCHours(), minutes = o.getUTCMinutes(), seconds = o.getUTCSeconds(), milli = o.getUTCMilliseconds();

				if (month < 10) {
					month = '0' + month;
				}
				if (day < 10) {
					day = '0' + day;
				}
				if (hours < 10) {
					hours = '0' + hours;
				}
				if (minutes < 10) {
					minutes = '0' + minutes;
				}
				if (seconds < 10) {
					seconds = '0' + seconds;
				}
				if (milli < 100) {
					milli = '0' + milli;
				}
				if (milli < 10) {
					milli = '0' + milli;
				}
				return '"' + year + '-' + month + '-' + day + 'T' + hours + ':' + minutes + ':' + seconds + '.' + milli + 'Z"';
			}
			if (o.constructor === Array) {
				var ret = [];
				for ( var i = 0; i < o.length; i++) {
					ret.push($.toJSON(o[i]) || 'null');
				}
				return '[' + ret.join(',') + ']';
			}
			var name, val, pairs = [];
			for ( var k in o) {
				type = typeof k;
				if (type === 'number') {
					name = '"' + k + '"';
				} else if (type === 'string') {
					name = k;
					// name = $.quoteString(k);
				} else {
					// Keys must be numerical or string. Skip others
					continue;
				}
				type = typeof o[k];

				if (type === 'function' || type === 'undefined') {
					// Invalid values like these return undefined
					// from toJSON, however those object members
					// shouldn't be included in the JSON string at all.
					continue;
				}
				val = $.toJSON(o[k]);
				pairs.push(name + ':' + val);
			}
			return '{' + pairs.join(',') + '}';
		}
	};

	/**
	 * jQuery.evalJSON Evaluates a given piece of json source.
	 * 
	 * @param src
	 *            {String}
	 */
	$.evalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function(src) {
		return eval('(' + src + ')');
	};

	/**
	 * jQuery.secureEvalJSON Evals JSON in a way that is *more* secure.
	 * 
	 * @param src
	 *            {String}
	 */
	$.secureEvalJSON = typeof JSON === 'object' && JSON.parse ? JSON.parse : function(src) {

		var filtered = src.replace(/\\["\\\/bfnrtu]/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, '');

		if (/^[\],:{}\s]*$/.test(filtered)) {
			return eval('(' + src + ')');
		} else {
			throw new SyntaxError('Error parsing JSON, source is not valid.');
		}
	};

	/**
	 * jQuery.quoteString Returns a string-repr of a string, escaping quotes
	 * intelligently. Mostly a support function for toJSON. Examples: >>>
	 * jQuery.quoteString('apple') "apple"
	 * 
	 * >>> jQuery.quoteString('"Where are we going?", she asked.') "\"Where are
	 * we going?\", she asked."
	 * 
	 * $.quoteString = function(string) { if (string.match(escapeable)) { return
	 * '"' + string.replace(escapeable, function(a) { var c = meta[a]; if
	 * (typeof c === 'string') { return c; } c = a.charCodeAt(); return '\\u00' +
	 * Math.floor(c / 16).toString(16) + (c % 16).toString(16); }) + '"'; }
	 * return '"' + string + '"'; };
	 */

})(jQuery);

