// ALPHA VERSION DO NOT DEPLOY
// Prototype :: begin


if (!Array.prototype.indexOf) {
	Array.prototype.indexOf = function (obj) {
		for (var i = 0; i < this.length; i++) {
			if (this[i] === obj) {
				return i;
			}
		}

		return -1;
	};
}

if (!Function.prototype.bind) {
	Function.prototype.bind = function (obj) {
		var method = this;
		var temp = function () {
			return method.apply(obj, arguments);
		};

		return temp;
	};
}

// Prototype :: end
// PL :: begin

var PL = {};

// PL :: end
// PL.String :: begin

PL.String = function () {
	// private
	return {// public
		padLeft: function (input, myChar, length) {
			var output = input.toString();

			while (output.length < length) {
				output = myChar + output;
			}

			return output;
		},
		gUID: function () {
			return new RegExp("^({){0,1}[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}(}){0,1}$");
		},
		aSCIIOnly: function (string) {
			var aSCII = "";

			for (var i = 0; i < string.length; i++) {
				if (string.charCodeAt(i) < 127 && string.charCodeAt(i) > 31) {
					aSCII += string.charAt(i);
				}
			}

			return aSCII;
		}
	};
}();

// PL.String :: end
// PL.DOM :: begin

PL.DOM = function () {
	// private
	return {// public
		createSpacerElement: function (nodeName) {
			var element = document.createElement(nodeName);
			element.appendChild(document.createTextNode("\u00a0"));
			return element;
		},
		createYMTSkeleton: function () {
			var yMTSkeleton = document.createElement("table");

			var tbody = yMTSkeleton.appendChild(document.createElement("tbody"));

			for (var i = 0; i < 6; i++) {
				var yMRR = tbody.appendChild(document.createElement("tr"));

				for (var ii = 0; ii < 7; ii++) {
					yMRR.appendChild(document.createElement("td"));
				}
			}

			return yMTSkeleton;
		},
		createYMTA: function (yMTSkeleton) {
			var yMTA = yMTSkeleton;
			yMTA.className = "ymta";

			var thead = yMTA.insertBefore(document.createElement("thead"), yMTA.firstChild);

			var yMHR = thead.appendChild(document.createElement("tr"));
			yMHR.appendChild(PL.DOM.createSpacerElement("th"));
			yMHR.appendChild(PL.DOM.createSpacerElement("th"));
			var yMH = yMHR.appendChild(document.createElement("th"));
			yMH.className = "ymh";
			yMH.colSpan = 5;
			yMHR.appendChild(PL.DOM.createSpacerElement("th"));

			var yMCR = thead.appendChild(document.createElement("tr"));
			yMCR.appendChild(PL.DOM.createSpacerElement("th"));

			for (var i = 0; i < 7; i++) {
				var yMC = yMCR.appendChild(document.createElement("th"));
				yMC.scope = "col";
				yMC.className = "ymc";
			}

			for (var i = 0; i < yMTA.lastChild.childNodes.length; i++) {
				var yMR = yMTA.lastChild.childNodes[i].insertBefore(document.createElement("th"), yMTA.lastChild.childNodes[i].firstChild);
				yMR.scope = "row";
				yMR.className = "ymr";
			}

			return yMTA;
		},
		fillYMTA: function (yMTA, month, dates, language) {
			var yMTAFilled = yMTA;

			yMTAFilled.firstChild.firstChild.childNodes[2].abbr = PL.Date.getYYYYMMDDFromDate(month).toString().substring(0, 6);
			yMTAFilled.firstChild.firstChild.childNodes[2].appendChild(document.createTextNode(PL.Date.getMonthNames("long", language)[month.getUTCMonth()] + " " + month.getUTCFullYear().toString()));

			for (var i = 0; i < 7; i++) {
				yMTAFilled.firstChild.lastChild.childNodes[i + 1].abbr = dates[i].getUTCDay().toString();
				yMTAFilled.firstChild.lastChild.childNodes[i + 1].appendChild(document.createTextNode(PL.Date.getDayNames("shorter", language)[dates[i].getUTCDay()]));
			}

			for (var i = 0; i < 6; i++) {
				yMTAFilled.lastChild.childNodes[i].firstChild.abbr = i.toString();
				yMTAFilled.lastChild.childNodes[i].firstChild.appendChild(document.createTextNode("»"));
			}

			for (var i = 0; i < 6; i++) {
				for (var ii = 0; ii < 7; ii++) {
					yMTAFilled.lastChild.childNodes[i].childNodes[ii + 1].abbr = PL.Date.getYYYYMMDDFromDate(dates[(i * 7) + ii]).toString();
					yMTAFilled.lastChild.childNodes[i].childNodes[ii + 1].appendChild(document.createTextNode(dates[(i * 7) + ii].getUTCDate().toString()));
				}
			}

			return yMTAFilled;
		},
		createYMTB: function (yMTSkeleton) {
			var yMTB = yMTSkeleton;
			yMTB.className = "ymtb";

			var thead = yMTB.insertBefore(document.createElement("thead"), yMTB.firstChild);

			var yMHR = thead.appendChild(document.createElement("tr"));
			yMHR.appendChild(document.createElement("th")).className = "ymtprevious";
			var yMH = yMHR.appendChild(document.createElement("th"));
			yMH.colSpan = 5;
			yMHR.appendChild(document.createElement("th")).className = "ymtnext";

			var yMCR = thead.appendChild(document.createElement("tr"));

			for (var i = 0; i < 7; i++) {
				yMCR.appendChild(document.createElement("th")).scope = "col";
			}

			return yMTB;
		},
		fillYMTB: function (yMTB, month, dates, language) {
			var yMTBFilled = yMTB;

			yMTBFilled.firstChild.firstChild.firstChild.abbr = PL.Date.getYYYYMMDDFromDate(PL.Date.shiftDateByMonths(month, -1)).toString().substring(0, 6);
			yMTBFilled.firstChild.firstChild.firstChild.appendChild(document.createTextNode("«"));
			yMTBFilled.firstChild.firstChild.childNodes[1].abbr = PL.Date.getYYYYMMDDFromDate(month).toString().substring(0, 6);
			yMTBFilled.firstChild.firstChild.childNodes[1].appendChild(document.createTextNode(PL.Date.getMonthNames("long", language)[month.getUTCMonth()] + " " + month.getUTCFullYear().toString()));
			yMTBFilled.firstChild.firstChild.lastChild.abbr = PL.Date.getYYYYMMDDFromDate(PL.Date.shiftDateByMonths(month, 1)).toString().substring(0, 6);
			yMTBFilled.firstChild.firstChild.lastChild.appendChild(document.createTextNode("»"));

			for (var i = 0; i < 7; i++) {
				yMTBFilled.firstChild.lastChild.childNodes[i].appendChild(document.createTextNode(PL.Date.getDayNames("shorter", language)[dates[i].getUTCDay()]));
			}

			for (var i = 0; i < 6; i++) {
				for (var ii = 0; ii < 7; ii++) {
					yMTBFilled.lastChild.childNodes[i].childNodes[ii].abbr = PL.Date.getYYYYMMDDFromDate(dates[(i * 7) + ii]).toString();
					yMTBFilled.lastChild.childNodes[i].childNodes[ii].appendChild(document.createTextNode(dates[(i * 7) + ii].getUTCDate().toString()));
				}
			}

			return yMTBFilled;
		},
		listCreator: function (params) {
			this.rendered = document.createElement(params.type);

			if (params.id) {
				this.rendered.id = params.id;
			}

			if (params.className) {
				this.rendered.className = params.className;
			}

			for (var i = 0; i < params.items.contents.length; i++) {
				var li = this.rendered.appendChild(document.createElement("li"));
				li.appendChild(document.createTextNode(params.items.contents[i]));

				if (params.items.ids) {
					li.id = params.items.ids[i];
				}

				if (params.items.classNames) {
					li.className = params.items.classNames[i];
				}
			}
		},
		positionFinder: function (obj, xy) {
			var xy = xy || [0, 0];

			xy[0] += obj.offsetLeft;
			xy[1] += obj.offsetTop;

			if (obj.offsetParent) {
				PL.DOM.positionFinder(obj.offsetParent, xy);
			}

			return xy;
		},
		dragStart: function (element, e) {
			PL.DOM.elementReference = element; //add property
			PL.DOM.elementStart = PL.DOM.positionFinder(PL.DOM.elementReference); //add property
			PL.DOM.cursorStart = PL.Event.pageCursorFinder(e); //add property

			PL.DOM.elementReference.style.position = "absolute";
			PL.DOM.elementReference.style.left = PL.DOM.elementStart[0] + "px";
			PL.DOM.elementReference.style.top = PL.DOM.elementStart[1] + "px";

			PL.Event.addEvent(document, "mousemove", PL.DOM.dragMove);
			PL.Event.addEvent(document, "mouseup", PL.DOM.dragStop);
		},
		dragMove: function (e) {
			var cursorNow = PL.Event.pageCursorFinder(e);

			PL.DOM.elementReference.style.left = cursorNow[0] - PL.DOM.cursorStart[0] + PL.DOM.elementStart[0] + "px";
			PL.DOM.elementReference.style.top = cursorNow[1] - PL.DOM.cursorStart[1] + PL.DOM.elementStart[1] + "px";
		},
		dragStop: function () {
			delete PL.DOM.elementReference; //remove property
			delete PL.DOM.elementStart; //remove property
			delete PL.DOM.cursorStart; //remove property

			PL.Event.removeEvent(document, "mousemove", PL.DOM.dragMove);
			PL.Event.removeEvent(document, "mouseup", PL.DOM.dragStop);
		},
		iE6IFrameHackPrepend: function (element) {
			if (window.external && typeof window.XMLHttpRequest === "undefined") {
				var iFrame = document.body.insertBefore(document.createElement("iframe"), element);
				iFrame.style.filter = "alpha(opacity=0)";
				iFrame.width = element.offsetWidth;
				iFrame.height = element.offsetHeight;
				iFrame.style.position = element.style.position;
				iFrame.style.left = element.style.left;
				iFrame.style.top = element.style.top;
			}
		},
		iE6IFrameHackRemove: function (element) {
			if (window.external && typeof window.XMLHttpRequest === "undefined" && element.previousSibling.nodeName.toLowerCase() === "iframe") {
				document.body.removeChild(element.previousSibling);
			}
		}
	};
}();

// PL.DOM :: end
// PL.Date :: begin

PL.Date = function () {
	// private
	return {// public
		getYYYYMMDDFromDate: function (date) {
			return parseInt(date.getUTCFullYear().toString() + PL.String.padLeft((date.getUTCMonth() + 1), "0", 2) + PL.String.padLeft(date.getUTCDate(), "0", 2), 10);
		},
		getDateFromYYYYMMDD: function (yyyymmdd) {
			var myDate = new Date();

			myDate.setUTCFullYear(parseInt(yyyymmdd.toString().substring(0, 4), 10), (parseInt(yyyymmdd.toString().substring(4, 6), 10) - 1), parseInt(yyyymmdd.toString().substring(6, 8), 10));
			myDate.setUTCHours(0, 0, 0, 0);

			return myDate;
		},
		getMSlashDSlashYYFromDate: function (date) {
			return (date.getUTCMonth() + 1).toString() + "/" + date.getUTCDate().toString() + "/" + date.getUTCFullYear().toString().substring(2, 4);
		},
		getDateFromMSlashDSlashYY: function (mslashdslashyy) {
			var mslashdslashyyArray = mslashdslashyy.split("/");
			var myDate = new Date();

			myDate.setUTCFullYear(parseInt("20" + mslashdslashyyArray[2], 10), (parseInt(mslashdslashyyArray[0], 10) - 1), parseInt(mslashdslashyyArray[1], 10));
			myDate.setUTCHours(0, 0, 0, 0);

			return myDate;
		},
		getMSSEFromDate: function (date) {
			return Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds());
		},
		shiftDateByDays: function (date, days) {
			return new Date(PL.Date.getMSSEFromDate(date) + (86400000 * days));
		},
		shiftDateByMonths: function (date, months) {
			var dateMonth = date.getUTCMonth();
			var dateYear = date.getUTCFullYear();

			var monthsDecrement = (months < 0);
			var monthsCount = (months < 0) ? -months : months;
			var currentCount = 0;

			while (currentCount !== monthsCount) {
				if (monthsDecrement) {
					dateMonth--;

					if (dateMonth === -1) {
						dateYear--;
						dateMonth = 11;
					}
				}
				else {
					dateMonth++;

					if (dateMonth === 12) {
						dateYear++;
						dateMonth = 0;
					}
				}

				currentCount++;
			}

			return PL.Date.getDateFromYYYYMMDD(parseInt(dateYear.toString() + PL.String.padLeft((dateMonth + 1), "0", 2) + "01", 10));
		},
		getWeekStartDate: function (dayToStart, date) {
			var startDate = date;

			if (startDate.getUTCDay() < dayToStart) {
				startDate = PL.Date.shiftDateByDays(startDate, -7);
			}

			startDate = PL.Date.shiftDateByDays(startDate, -(startDate.getUTCDay() - dayToStart));

			return startDate;
		},
		getMonthStartDate: function (date) {
			return PL.Date.getDateFromYYYYMMDD(parseInt(date.getUTCFullYear().toString() + PL.String.padLeft((date.getUTCMonth() + 1), "0", 2) + "01", 10));
		},
		getDateArray: function (first, last) {
			var dateArray = [];
			var dateIterator = first;

			while (dateIterator <= last) {
				dateArray.push(dateIterator);
				dateIterator = PL.Date.shiftDateByDays(dateIterator, 1);
			}

			return dateArray;
		},
		getMonthArray: function (first, last) {
			var monthArray = [];
			var monthIterator = PL.Date.getMonthStartDate(first);

			while (monthIterator <= PL.Date.getMonthStartDate(last)) {
				monthArray.push(monthIterator);
				monthIterator = PL.Date.shiftDateByMonths(monthIterator, 1);
			}

			return monthArray;
		},
		getMonthNames: function (type, iso639dash3) {
			if (type === "long") {
				if (iso639dash3 === "eng") {
					return ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
				}
			}
			else if (type === "short") {
				if (iso639dash3 === "eng") {
					return ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
				}
			}
		},
		getDayNames: function (type, iso639dash3) {
			if (type === "long") {
				if (iso639dash3 === "eng") {
					return ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
				}
			}
			else if (type === "short") {
				if (iso639dash3 === "eng") {
					return ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
				}
			}
			else if (type === "shorter") {
				if (iso639dash3 === "eng") {
					return ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"];
				}
			}
		}
	};
}();

// PL.Date :: end
// PL.Event :: begin

PL.Event = function () {
	// private
	return {// public
		addEvent: function (obj, type, fn) {
			if (obj.addEventListener) {
				obj.addEventListener(type, fn, false);
			}
			else if (obj.attachEvent) {
				obj["e" + type + fn] = fn;
				obj[type + fn] = function () {
					obj["e" + type + fn](window.event);
				};
				obj.attachEvent("on" + type, obj[type + fn]);
			}
		},
		removeEvent: function (obj, type, fn) {
			if (obj.removeEventListener) {
				obj.removeEventListener(type, fn, false);
			}
			else if (obj.detachEvent) {
				obj.detachEvent("on" + type, obj[type + fn]);
				obj[type + fn] = null;
			}
		},
		getTarget: function (e) {
			var e = e || window.event;

			var target = e.target || e.srcElement;

			return (target.nodeType === 3) ? target.parentNode : target;
		},
		stopEvent: function (e) {
			var e = e || window.event;

			if (e.stopPropagation) {
				e.stopPropagation();
				e.preventDefault();
			}
			else if (typeof(e.cancelBubble) === "boolean") {
				e.cancelBubble = true;
				e.returnValue = false;
			}

			return false;
		},
		screenCursorFinder: function (e) {
			var e = e || window.event;

			return [e.screenX, e.screenY];
		},
		pageCursorFinder: function (e) {
			var e = e || window.event;
			var xy = [];

			if (e.pageX) {
				xy[0] = e.pageX;
				xy[1] = e.pageY;
			}
			else if (e.clientX) {
				xy[0] = document.documentElement.scrollLeft + document.body.scrollLeft + e.clientX;
				xy[1] = document.documentElement.scrollTop + document.body.scrollTop + e.clientY;
			}

			return xy;
		}
	};
}();

// PL.Event :: end
// PL.Cookie :: begin

PL.Cookie = function () {
	// private
	return {// public
		getCookies: function () {
			var cookieKVPArray = [];

			if ((document.cookie !== null) && (document.cookie.length !== 0)) {
				var cookieStrings = document.cookie.split(";");

				for (var i = 0; i < cookieStrings.length; i++) {
					cookieStrings[i] = cookieStrings[i].replace(/^\s*|\s*$/g, "");

					var cookieKVArray = cookieStrings[i].split("=");

					cookieKVPArray.push([cookieKVArray[0], cookieKVArray[1]]);
				}
			}

			return cookieKVPArray;
		},
		createCookie: function (key, value, expires, path, domain, secure) {
			return key + "=" + value + ((expires) ? ";expires=" + expires : "") + ((path) ? ";path=" + path : "") + ((domain) ? ";domain=" + domain : "") + ((secure) ? ";secure" : "");
		},
		applyCookie: function (cookie) {
			document.cookie = cookie;
		}
	};
}();

// PL.Cookie :: end
// PL.XML :: begin

PL.XML = function () {
	// private
	return {// public
		createXMLDoc: function (source, content) {
			var xMLDoc;

			if (document.implementation && document.implementation.createDocument) {
				switch (source) {
				case "string":
					xMLDoc = new DOMParser().parseFromString(content, "text/xml");
					break;
				case "location":
					xMLDoc = document.implementation.createDocument("", "", null);
					xMLDoc.async = false;
					xMLDoc.load(content);
					break;
				}
			}
			else if (window.ActiveXObject) {
				xMLDoc = new ActiveXObject("Microsoft.XMLDOM");
				xMLDoc.async = false;

				switch (source) {
				case "string":
					xMLDoc.loadXML(content);
					break;
				case "location":
					xMLDoc.load(content);
					break;
				}
			}

			return xMLDoc;
		},
		getXMLString: function (xMLDoc) {
			var xMLString;

			if (document.implementation && document.implementation.createDocument) {
				xMLString = new XMLSerializer().serializeToString(xMLDoc);
			}
			else if (window.ActiveXObject) {
				xMLString = xMLDoc.xml;
			}

			return xMLString;
		}
	};
}();

// PL.XML :: end
// PL.JSON :: begin

PL.JSON = function () {
	// private
	return {// public
		getObjFromJSONTrusted: function (JSONString) {
			return eval("(" + JSONString + ")");
		}
	};
}();

// PL.JSON :: end
// PL.XH :: begin

PL.XH = function () {
	// private
	return {// public
		request: function (actionType, uRL, kVPs, asynchronous, callback, responseType) {
			var xHRequest = null;

			if (window.XMLHttpRequest) {
				try {
					xHRequest = new XMLHttpRequest();
				}
				catch (e) {
					//fail
				}
			}
			else if (window.ActiveXObject) {
				var iEXHRA = ["MSXML2.XMLHTTP.6.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];

				for (var i = 0; i < iEXHRA.length; i++) {
					try {
						xHRequest = new ActiveXObject(iEXHRA[i]);
						break;
					}
					catch (e) {
						//fail
					}
				}
			}

			xHRequest.onreadystatechange = function () {
				if ((xHRequest.readyState === 4) && (xHRequest.status === 200)) {
					if (responseType === "txt") {
						callback(xHRequest.responseText);
					}
					else if (responseType === "xml") {
						callback(xHRequest.responseXML);
					}

					document.getElementById("plxhrequeststatus").removeChild(document.getElementById("plxhrequeststatus").lastChild);

					if (document.getElementById("plxhrequeststatus").childNodes.length === 0) {
						document.body.removeChild(document.getElementById("plxhrequeststatus"));
					}
				}
			};

			if (!document.getElementById("plxhrequeststatus")) {
				document.body.appendChild(document.createElement("ol")).id = "plxhrequeststatus";
			}

			document.getElementById("plxhrequeststatus").appendChild(document.createElement("li")).appendChild(document.createTextNode("loading..."));

			xHRequest.open(actionType, uRL, asynchronous);
			xHRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xHRequest.send(kVPs);
		}
	};
}();

// PL.XH :: end
// PL.Control :: begin

PL.Control = function () {
	// private
	return {// public
		createYYYYMMDDDisplay: function (dateBegin, dateEnd, weekStartDate, language) {
			var yMs = PL.Date.getMonthArray(dateBegin, dateEnd);

			this.rendered = [];
			var yMDsValid = this.yMDsValid = [];

			for (var i = 0; i < yMs.length; i++) {
				this.rendered.push(PL.DOM.fillYMTA(PL.DOM.createYMTA(PL.DOM.createYMTSkeleton()), yMs[i], PL.Date.getDateArray(PL.Date.getWeekStartDate(weekStartDate, yMs[i]), PL.Date.shiftDateByDays(PL.Date.getWeekStartDate(weekStartDate, yMs[i]), 41)), language));
			}

			var yMDBlockValid = this.yMDBlockValid = function (td) {
				return td.abbr.substring(0, 6) === td.parentNode.parentNode.parentNode.firstChild.firstChild.childNodes[2].abbr;
			};

			var yMDRangeValid = this.yMDRangeValid = function (td) {
				return (PL.Date.getDateFromYYYYMMDD(td.abbr) >= dateBegin) && (PL.Date.getDateFromYYYYMMDD(td.abbr) <= dateEnd);
			};

			for (var i = 0; i < this.rendered.length; i++) {
				var yMDs = this.rendered[i].getElementsByTagName("td");

				for (var ii = 0; ii < yMDs.length; ii++) {
					if (!yMDBlockValid(yMDs[ii])) {
						yMDs[ii].className = "ymdblockinvalid";
					}
					else if (!yMDRangeValid(yMDs[ii])) {
						yMDs[ii].className = "ymdrangeinvalid";
					}
					else {
						yMDsValid.push(yMDs[ii]);
					}
				}
			}
		},
		createYYYYMMDDBoolean: function (dateBegin, dateEnd, weekStartDate, language) {
			var yMs = PL.Date.getMonthArray(dateBegin, dateEnd);

			this.rendered = [];

			for (var i = 0; i < yMs.length; i++) {
				this.rendered.push(PL.DOM.fillYMTA(PL.DOM.createYMTA(PL.DOM.createYMTSkeleton()), yMs[i], PL.Date.getDateArray(PL.Date.getWeekStartDate(weekStartDate, yMs[i]), PL.Date.shiftDateByDays(PL.Date.getWeekStartDate(weekStartDate, yMs[i]), 41)), language));
			}

			var yMDBlockValid = function (td) {
				return td.abbr.substring(0, 6) === td.parentNode.parentNode.parentNode.firstChild.firstChild.childNodes[2].abbr;
			};

			var yMDRangeValid = function (td) {
				return (PL.Date.getDateFromYYYYMMDD(td.abbr) >= dateBegin) && (PL.Date.getDateFromYYYYMMDD(td.abbr) <= dateEnd);
			};

			for (var i = 0; i < this.rendered.length; i++) {
				var yMDs = this.rendered[i].getElementsByTagName("td");

				for (var ii = 0; ii < yMDs.length; ii++) {
					if (!yMDBlockValid(yMDs[ii])) {
						yMDs[ii].className = "ymdblockinvalid";
					}
					else if (!yMDRangeValid(yMDs[ii])) {
						yMDs[ii].className = "ymdrangeinvalid";
					}
				}
			}

			var selected = [];

			this.getSelected = function () {
				return selected;
			};

			var toggleSelected = function (td) {
				if (selected.indexOf(td.abbr) === -1) {
					selected.push(td.abbr);
					td.className = "ymdselected";
				}
				else {
					selected.splice(selected.indexOf(td.abbr), 1);
					td.removeAttribute("class");
					td.removeAttribute("className");
				}
			};

			this.setSelected = function (yMDArray) {
				for (var i = 0; i < this.rendered.length; i++) {
					var yMDs = this.rendered[i].lastChild.getElementsByTagName("td");

					for (var ii = 0; ii < yMDs.length; ii++) {
						if (yMDBlockValid(yMDs[ii]) && yMDRangeValid(yMDs[ii]) && (yMDArray.indexOf(yMDs[ii].abbr) !== -1)) {
							toggleSelected(yMDs[ii]);
						}
					}
				}
			};

			var yMTEvent = function (e) {
				var target = PL.Event.getTarget(e);
				var yMDsValid = [];
				var yMDsValidSelected = 0;

				if (target.abbr.length === 8) {
					if (yMDBlockValid(target) && yMDRangeValid(target)) {
						yMDsValid.push(target);
					}
				}
				else {
					var yMDs = target.parentNode.parentNode.parentNode.lastChild.getElementsByTagName("td");

					if (target.abbr.length === 6) {
						for (var i = 0; i < yMDs.length; i++) {
							if (yMDBlockValid(yMDs[i]) && yMDRangeValid(yMDs[i])) {
								yMDsValid.push(yMDs[i]);
							}
						}
					}
					else if (target.abbr.length === 1) {
						if (target.className === "ymc") {
							for (var i = 0; i < yMDs.length; i++) {
								if (yMDBlockValid(yMDs[i]) && yMDRangeValid(yMDs[i]) && (PL.Date.getDateFromYYYYMMDD(parseInt(yMDs[i].abbr, 10)).getUTCDay() === parseInt(target.abbr, 10))) {
									yMDsValid.push(yMDs[i]);
								}
							}
						}
						else if (target.className === "ymr") {
							for (var i = 0; i < yMDs.length; i++) {
								if (yMDBlockValid(yMDs[i]) && yMDRangeValid(yMDs[i]) && (i >= (parseInt(target.abbr, 10) * 7)) && (i <= ((parseInt(target.abbr, 10) * 7) + 6))) {
									yMDsValid.push(yMDs[i]);
								}
							}
						}
					}
				}

				for (var i = 0; i < yMDsValid.length; i++) {
					if (selected.indexOf(yMDsValid[i].abbr) !== -1) {
						yMDsValidSelected++;
					}
				}

				if ((yMDsValid.length === yMDsValidSelected) || (yMDsValidSelected === 0)) {
					for (var i = 0; i < yMDsValid.length; i++) {
						toggleSelected(yMDsValid[i]);
					}
				}
				else {
					for (var i = 0; i < yMDsValid.length; i++) {
						if (selected.indexOf(yMDsValid[i].abbr) === -1) {
							toggleSelected(yMDsValid[i]);
						}
					}
				}
			};

			for (var i = 0; i < this.rendered.length; i++) {
				PL.Event.addEvent(this.rendered[i], "click", yMTEvent);
			}
		},
		createYYYYMMDDSelector: function (dateBegin, dateEnd, weekStartDate, language) {
			var yMs = PL.Date.getMonthArray(dateBegin, dateEnd);

			this.rendered = [];

			for (var i = 0; i < yMs.length; i++) {
				this.rendered.push(PL.DOM.fillYMTB(PL.DOM.createYMTB(PL.DOM.createYMTSkeleton()), yMs[i], PL.Date.getDateArray(PL.Date.getWeekStartDate(weekStartDate, yMs[i]), PL.Date.shiftDateByDays(PL.Date.getWeekStartDate(weekStartDate, yMs[i]), 41)), language));
			}

			var yMDBlockValid = function (td) {
				return td.abbr.substring(0, 6) === td.parentNode.parentNode.parentNode.firstChild.firstChild.childNodes[1].abbr;
			};

			var yMDRangeValid = function (td) {
				return (PL.Date.getDateFromYYYYMMDD(td.abbr) >= dateBegin) && (PL.Date.getDateFromYYYYMMDD(td.abbr) <= dateEnd);
			};

			var yMTEvent = function (e) {
				var target = PL.Event.getTarget(e);

				if (target.abbr.length === 6) {
					if (target.className === "ymtnext") {
						target.parentNode.parentNode.parentNode.style.display = "none";
						target.parentNode.parentNode.parentNode.nextSibling.style.display = "";
					}
					else if (target.className === "ymtprevious") {
						target.parentNode.parentNode.parentNode.style.display = "none";
						target.parentNode.parentNode.parentNode.previousSibling.style.display = "";
					}
				}
			};

			for (var i = 0; i < this.rendered.length; i++) {
				if (i === 0) {
					this.rendered[i].firstChild.firstChild.firstChild.removeAttribute("class");
					this.rendered[i].firstChild.firstChild.firstChild.removeAttribute("abbr");
					this.rendered[i].firstChild.firstChild.firstChild.replaceChild(document.createTextNode("\u00a0"), this.rendered[i].firstChild.firstChild.firstChild.firstChild);
				}

				if ((i + 1) === this.rendered.length) {
					this.rendered[i].firstChild.firstChild.lastChild.removeAttribute("class");
					this.rendered[i].firstChild.firstChild.lastChild.removeAttribute("abbr");
					this.rendered[i].firstChild.firstChild.lastChild.replaceChild(document.createTextNode("\u00a0"), this.rendered[i].firstChild.firstChild.lastChild.firstChild);
				}

				var yMDs = this.rendered[i].getElementsByTagName("td");

				for (var ii = 0; ii < yMDs.length; ii++) {
					if (!yMDBlockValid(yMDs[ii])) {
						yMDs[ii].className = "ymdblockinvalid";
					}
					else if (!yMDRangeValid(yMDs[ii])) {
						yMDs[ii].className = "ymdrangeinvalid";
					}
					else if (PL.Date.getYYYYMMDDFromDate(new Date()) === parseInt(yMDs[ii].abbr, 10)) {
						yMDs[ii].className = "today";
					}
				}

				if (i !== 0) {
					this.rendered[i].style.display = "none";
				}

				PL.Event.addEvent(this.rendered[i], "click", yMTEvent);
			}
		},
		navigation: function (id) {
			var rendered = document.createElement("ul");
			this.rendered = rendered;
			rendered.id = id;

			var clear = function () {
				while (rendered.hasChildNodes()) {
					rendered.removeChild(rendered.firstChild);
				}
			};

			var addSFHover = function () {
				this.className += " sfhover";
			};

			var removeSFHover = function () {
				this.className = this.className.replace(/ sfhover/, "");
			};

			var fill = function (location, obj) {
				var menuItem = location;

				for (var i = 0; i < obj.length; i++) {
					if (typeof(obj[i][0]) === "string") {
						menuItem = location.appendChild(document.createElement("li"));
						menuItem.appendChild(document.createElement("a"));
						menuItem.firstChild.href = obj[i][0];
						menuItem.firstChild.appendChild(document.createTextNode(obj[i][1]));
						if (window.attachEvent) {
							PL.Event.addEvent(menuItem, "mouseover", addSFHover);
							PL.Event.addEvent(menuItem, "mouseout", removeSFHover);
						}
					}
					else {
						menuItem.lastChild.className = "haschildnodes";
						fill(menuItem.appendChild(document.createElement("ul")), obj[i]);
					}
				}

				rendered = location;
			};

			this.update = function (location, obj) {
				clear();
				fill(location, obj);
			};
		},
		propertySelector: function () {
			this.rendered = document.createElement("form");
			this.rendered.action = "#";
			this.rendered.method = "post";
			this.rendered.enctype = "multipart/form-data";
			this.rendered.setAttribute("accept-charset", "utf-8");

			var fieldset = this.rendered.appendChild(document.createElement("fieldset"));

			var input = document.createElement("input");
			input.type = "text";
			input.name = "propertyselectorinput";
			input.setAttribute("value", "");
			input.accessKey = "1";
			input.title = "Property Selector [Access Key = 1]";
			fieldset.appendChild(input);

			var select = document.createElement("select");
			this.select = select;
			select.name = "propertyselectorselect";
			fieldset.appendChild(select);

			var submit = document.createElement("input");
			submit.type = "submit";
			submit.name = "propertyselectorsubmit";
			submit.setAttribute("value", "Change Hotel");
			submit.className = "button";
			fieldset.appendChild(submit);

			var propertyArray = null;

			this.update = function (obj) {
				obj.sort(function (a, b) {
					if (a[2].toLowerCase() === b[2].toLowerCase()) {
						return 0;
					}
					else {
						return a[2].toLowerCase() < b[2].toLowerCase() ? -1 : 1;
					}
				});

				propertyArray = obj;
			};

			var propertyOptionCreate = function (property) {
				var option = document.createElement("option");
				option.value = property[1].toString();
				option.appendChild(document.createTextNode(property[2] + " [ C" + property[0].toString() + " / H" + property[1].toString() + " ]"));
				return option;
			};

			var propertySelectorInputEvent = function () {
				var canonical = input.value.replace(/^\s+|\s+$/g, "").toLowerCase();

				while (select.hasChildNodes()) {
					select.removeChild(select.firstChild);
				}

				if ((!isNaN(parseInt(canonical, 10))) && (canonical.length !== 0)) {
					var canonicalNumber = parseInt(canonical, 10);

					for (var i = 0; i < propertyArray.length; i++) {
						if ((propertyArray[i][0] === canonicalNumber) || (propertyArray[i][1] === canonicalNumber) || (propertyArray[i][2].toLowerCase().match(canonical) !== null)) {
							select.appendChild(propertyOptionCreate(propertyArray[i]));
						}
					}
				}
				else if (canonical.length > 2) {
					for (var i = 0; i < propertyArray.length; i++) {
						if (propertyArray[i][2].toLowerCase().match(canonical) !== null) {
							select.appendChild(propertyOptionCreate(propertyArray[i]));
						}
					}
				}
				else {
					for (var i = 0; i < propertyArray.length; i++) {
						select.appendChild(propertyOptionCreate(propertyArray[i]));
					}
				}
			};

			PL.Event.addEvent(input, "keyup", propertySelectorInputEvent);
		},
		propertyInformation: function () {
			this.rendered = document.createElement("div");
			this.rendered.id = "propertyinformation";

			for (var i = 0; i < 2; i++) {
				this.rendered.appendChild(document.createElement("dl"));
				this.rendered.lastChild.appendChild(document.createElement("dt"));
				this.rendered.lastChild.appendChild(document.createElement("dd"));
			}

			this.update = function (chainid, chainname, hotelid, hotelname) {
				for (var i = 0; i < this.rendered.childNodes.length; i++) {
					for (var ii = 0; ii < this.rendered.childNodes[i].childNodes.length; ii++) {
						while (this.rendered.childNodes[i].childNodes[ii].hasChildNodes()) {
							this.rendered.childNodes[i].childNodes[ii].removeChild(this.rendered.childNodes[i].childNodes[ii].firstChild);
						}
					}
				}

				this.rendered.firstChild.firstChild.appendChild(document.createTextNode("Chain: " + chainid));
				this.rendered.firstChild.lastChild.appendChild(document.createTextNode(chainname));
				this.rendered.lastChild.firstChild.appendChild(document.createTextNode("Hotel: " + hotelid));
				this.rendered.lastChild.lastChild.appendChild(document.createTextNode(hotelname));
			};
		},
		loginConsole: function () {
			this.rendered = document.createElement("form");
			this.rendered.action = "#";
			this.rendered.method = "post";
			this.rendered.enctype = "multipart/form-data";
			this.rendered.setAttribute("accept-charset", "utf-8");
			this.rendered.id = "loginconsole";

			var fieldset = this.rendered.appendChild(document.createElement("fieldset"));

			fieldset.appendChild(document.createElement("legend"));
			fieldset.lastChild.appendChild(document.createTextNode("Login"));

			var usernameBlock = fieldset.appendChild(document.createElement("div"));

			var usernameLabel = usernameBlock.appendChild(document.createElement("label"));
			usernameLabel.htmlFor = "loginconsoleusername";
			usernameLabel.appendChild(document.createTextNode("username"));

			this.username = document.createElement("input");
			this.username.type = "text";
			this.username.name = "username";
			this.username.setAttribute("value", "");
			this.username.id = "loginconsoleusername";
			usernameBlock.appendChild(this.username);

			var passwordBlock = fieldset.appendChild(document.createElement("div"));

			var passwordLabel = passwordBlock.appendChild(document.createElement("label"));
			passwordLabel.htmlFor = "loginconsolepassword";
			passwordLabel.appendChild(document.createTextNode("password"));

			this.password = document.createElement("input");
			this.password.type = "password";
			this.password.name = "password";
			this.password.setAttribute("value", "");
			this.password.id = "loginconsolepassword";
			passwordBlock.appendChild(this.password);

			var submit = document.createElement("input");
			submit.type = "submit";
			submit.name = "loginconsole";
			submit.setAttribute("value", "Submit");
			submit.className = "button";
			fieldset.appendChild(submit);
		},
		rateInventoryYYYYMMDDRangeSelector: function (ratesInventoriesRooms) {
			this.rendered = document.createElement("form");
			this.rendered.action = "#";
			this.rendered.method = "post";
			this.rendered.enctype = "multipart/form-data";
			this.rendered.setAttribute("accept-charset", "utf-8");
			this.rendered.id = "rateinventoryyyyymmddrangeselector";

			var fieldset = this.rendered.appendChild(document.createElement("fieldset"));

			fieldset.appendChild(document.createElement("legend"));
			fieldset.lastChild.appendChild(document.createTextNode("Rate / Inventory / Date Range Selector"));

			var rateLabel = fieldset.appendChild(document.createElement("label"));
			rateLabel.htmlFor = "rateselector";
			rateLabel.appendChild(document.createTextNode("Rate"));

			this.rateSelector = fieldset.appendChild(document.createElement("select"));
			this.rateSelector.name = "rateselector";
			this.rateSelector.id = "rateselector";

			for (var i = 0; i < ratesInventoriesRooms.rates.length; i++) {
				var option = this.rateSelector.appendChild(document.createElement("option"));
				option.value = ratesInventoriesRooms.rates[i].rate.toString();
				option.appendChild(document.createTextNode(ratesInventoriesRooms.rates[i].descriptionshort));
			}

			var inventoryLabel = fieldset.appendChild(document.createElement("label"));
			inventoryLabel.htmlFor = "inventoryselector";
			inventoryLabel.appendChild(document.createTextNode("Inventory"));

			this.inventorySelector = fieldset.appendChild(document.createElement("select"));
			this.inventorySelector.name = "inventoryselector";
			this.inventorySelector.id = "inventoryselector";

			for (var i = 0; i < ratesInventoriesRooms.inventories.length; i++) {
				var option = this.inventorySelector.appendChild(document.createElement("option"));
				option.value = ratesInventoriesRooms.inventories[i].inventory.toString();
				option.appendChild(document.createTextNode(ratesInventoriesRooms.inventories[i].descriptionshort));
			}

			var beginyyyymmddlabel = fieldset.appendChild(document.createElement("label"));
			beginyyyymmddlabel.htmlFor = "beginyyyymmddselector";
			beginyyyymmddlabel.appendChild(document.createTextNode("Begin Date"));

			this.beginYYYYMMDD = document.createElement("input");
			this.beginYYYYMMDD.type = "text";
			this.beginYYYYMMDD.name = "beginyyyymmddselector";
			this.beginYYYYMMDD.setAttribute("value", "");
			this.beginYYYYMMDD.readOnly = true;
			this.beginYYYYMMDD.id = "beginyyyymmddselector";
			this.beginYYYYMMDD.className = "yyyymmddselector";
			fieldset.appendChild(this.beginYYYYMMDD);

			var endyyyymmddlabel = fieldset.appendChild(document.createElement("label"));
			endyyyymmddlabel.htmlFor = "endyyyymmddselector";
			endyyyymmddlabel.appendChild(document.createTextNode("End Date"));

			this.endYYYYMMDD = document.createElement("input");
			this.endYYYYMMDD.type = "text";
			this.endYYYYMMDD.name = "endyyyymmddselector";
			this.endYYYYMMDD.setAttribute("value", "");
			this.endYYYYMMDD.readOnly = true;
			this.endYYYYMMDD.id = "endyyyymmddselector";
			this.endYYYYMMDD.className = "yyyymmddselector";
			fieldset.appendChild(this.endYYYYMMDD);

			var submit = document.createElement("input");
			submit.type = "submit";
			submit.name = "rateinventoryyyyymmddrangeselectorsubmit";
			submit.setAttribute("value", "Submit");
			submit.className = "button";
			fieldset.appendChild(submit);
		}
	};
}();

// PL.Control :: end
// Teaser003 :: begin

var Teaser003 = function () {
	// private
	return {// public
		yYYYMMDDSelectorEvent: function (e) {
			var target = PL.Event.getTarget(e);

			if (target.className !== "ymtprevious" && target.className !== "ymtnext") {
				var calendars = document.getElementById("happenings_calendar_container").getElementsByTagName("table");
				for (var i = 0; i < calendars.length; i++) {
					if (calendars[i].style.display !== "none") {
						location.href = "./?pg=happenings&csg=happenings&csi=" + calendars[i].firstChild.firstChild.childNodes[1].abbr + "#cal";
						break;
					}
				}
			}
		},
		yYYYMMDDSelectorAppend: function () {
			var yYYYMMDDSelector = new PL.Control.createYYYYMMDDSelector(PL.Date.getDateFromYYYYMMDD(PL.Date.getYYYYMMDDFromDate(new Date())), PL.Date.shiftDateByDays(PL.Date.getDateFromYYYYMMDD(PL.Date.getYYYYMMDDFromDate(new Date())), 364), 0, "eng");
			var yYYYMMDDSelectorContainer = document.getElementById("happenings_calendar").appendChild(document.createElement("div"));
			yYYYMMDDSelectorContainer.id = "happenings_calendar_container";

			for (var i = 0; i < yYYYMMDDSelector.rendered.length; i++) {
				PL.Event.addEvent(yYYYMMDDSelector.rendered[i], "click", Teaser003.yYYYMMDDSelectorEvent);
				yYYYMMDDSelectorContainer.appendChild(yYYYMMDDSelector.rendered[i]);
			}

			yYYYMMDDSelectorContainer.appendChild(document.createElement("div")).style.clear = "both";
		}
	};
}();

PL.Event.addEvent(window, "load", Teaser003.yYYYMMDDSelectorAppend);

// Teaser003 :: end
