console.log('calendar demo.');

/**
 * Tooltip demo.
 */

function demoDayValidator(calendar, date) {
	return { 'tip': date.toString() };
}


/**
 * AJAX-os calendar kezelő demo
 */
var cxHelper = {
	cache: {},

	jsonRequest: function(url, fresult, ferror, params) {
		try {
			var req = new XMLHttpRequest();
			req.open('GET', url, true);
			req.onreadystatechange = function (e) {
				if(req.readyState == 4) {
					var rj = null;
					var success = false;
					if(req.status == 200 || req.status == 0) {
						try {
							eval("rj = " + req.responseText + ";");
							success = true;
						} catch(err) {
							console.warn("Invalid result: %o", err);
						}
					} else {
						console.warn("Error loading page: %o", req);
					}

					if(success || !ferror) fresult(rj);
					else ferror();
				}
			};
			req.send(null);
		} catch(err) {
			console.warn("Invalid request: %o", err);

			if(!ferror) fresult(null);
			else ferror();
		}
		
	},

	getUrl: function(date) {
		var y = date.getFullYear();
		var m = date.getMonth() + 1;
		if(m < 10) m = '0' + m;

		return '/calendarjson.php?y=' + y + '&m=' + m;
	}
}

/**
 * Minden napon meghívódó callbackfüggvény. A visszatérési értéke alapján az adott nap megjelenítése, és kezelése állítódik be.
 * A tooltip descriptorban, a 'validateDay' attributummal állítható be.
 *
 * @param calendar  a hívó calendar kezelő HTCalendar objektum
 * @param date  a nap amihez a validatort várjuk, típusa: Date
 *
 * @return  true - a nap alapértelmezetten megjelenik, és kiválaszható.
 *          false - a nap letiltottként jelenik meg, és nem kiválaszható.
 *          object {
 *            'tip': <string>, - a nap fölött egy tooltip jelenik meg, aminek ez a paraméter tartalmazza a tartalmát. (opcionális)
 *            'disabled': <boolean>, - a nap letiltott, vagy engedélyezett. (opcionális, alapértelmezetten false)
 *            'className': <string>, - a napot jelentő <td> element css class-a. (opcionális)
 *            'face': <jsonML>, - ha ez a mező meg van adva akkor a napot jelentő <td> element tartalma nem a nap hónapon belüli sorszáma, hanem ez a jsonML objektum lesz.
 *          }
 */
function CxDayValidator(calendar, date) {
	var dkey = date.getFullYear() + '-' + date.getMonth();

	if(!(dkey in cxHelper.cache)) {
		cxHelper.cache[dkey] = { 'loaded': false, 'valid': false };
		cxHelper.jsonRequest(cxHelper.getUrl(date), function(res) {
			var cx0 = [];

			for(var i in res) {
				var d = res[i];
				cx0[d.day] = d;
			}

			cxHelper.cache[dkey].days = cx0;
			cxHelper.cache[dkey].loaded = true;
			cxHelper.cache[dkey].valid = true;
			calendar.update();
		}, function() {
			cxHelper.cache[dkey].loaded = true;
			// error...
		});
	} else {
		var cx = cxHelper.cache[dkey];
		if(cx.loaded) {
			if(cx.valid) {
				var day = date.getDate();

				if(day in cx.days) {
					console.dir(cx.days[day]);
					return cx.days[day];
				}
			}
		}
	}

	return false;
}

/**
 * Ha a felhasználó a calendar panelon, vagy az input mezőben megváltoztaja a dátumot, akkor ez a függvény meghívódik.
 * A tooltip descriptorban, a 'onchange' attributummal állítható be.
 *
 * @param calendar  a hívó calendar kezelő HTCalendar objektum
 * @param date  a dátum, ami ki lett választva, típusa: Date.
 *
 */
function CxOnChange(calendar, date) {
	console.log("c: %o, %o", calendar, calendar.getDate());

	var dkey = date.getFullYear() + '-' + date.getMonth();
	var day = date.getDate();
	var str = '';
	if(dkey in cxHelper.cache) {
		var cx = cxHelper.cache[dkey];
		if(cx.loaded && cx.valid && day in cx.days) {
			str = cx.days[day].cxContent;
		}
	}
	document.getElementById('cx_calendar').innerHTML = str;
}

