
/* utils */

function repeat(str, times) {
	return new Array(times + 1).join(str);
}
function lz(str, len) {
	str = new String(str);
	if (len > str.length) {
		str = repeat('0', len - str.length) + str;
	}
	return str;
}
function yyyymmdd(dd) {
	return lz(dd.getFullYear(), 4) + lz(dd.getMonth() + 1, 2) + lz(dd.getDate(), 2);
}
function ddsmmsyyyy(dd) {
	return lz(dd.getDate(), 2) + '/' + lz(dd.getMonth() + 1, 2) + '/' + lz(dd.getFullYear(), 4);
}
function dateau2yyyymmdd(ss) {
	var matches = new RegExp("^([0-9][0-9])\\/([0-9][0-9])\\/([0-9][0-9][0-9][0-9])$").exec(ss);
	if (null == matches) {
		alert('Invalid date format. Use this form: dd/mm/yyyy');
		return null;
	} else {
		return matches[3] + matches[2] + matches[1];
	}
}
function parseyyyymmdd(ss) {
	var matches = new RegExp("^([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])$").exec(ss);
	if (null == matches) {
		alert('Invalid date format. Use this form: yyyymmdd');
		return null;
	} else {
		return new Date(parseInt(matches[1], 10), parseInt(matches[2], 10) - 1, parseInt(matches[3], 10));
	}
}
function cartoonZoom(toon, img, ovl) {

	/* remove hyperlink highlight */
	toon.style.backgroundColor = '#ffffff';

	var legacyIE = false;
	/* detect IE lt 7 */
	/*@cc_on
		legacyIE = (@_jscript_version < 5.7);
	@*/

	if ('undefined' == typeof(toon._zoom_state)) {

		/* init this */
		toon._zoom_state = 0;
		toon._width_orig = 224;

		/* init overlay */
		ovl.onclick = function() { cartoonZoom(toon, img, ovl); }
		toon._an_ovl = new Animation;

		setOpacity(ovl, 0);
		ovl.style.position = 'fixed';
		ovl.style.top = '0';
		ovl.style.right = '0';
		ovl.style.bottom = '0';
		ovl.style.left = '0';
		ovl.style.zIndex = 222;

		/* IE6 won't have understood this - another attempt */
		if (legacyIE) {
			ovl.style.position = 'absolute';
			ovl.style.top = '0';
			ovl.style.left = '0';
			ovl.style.width = document.body.clientWidth;
			ovl.style.height = document.body.clientHeight;
		}
		ovl.style.backgroundColor = '#000000';

		/* init toon */
		toon._an_toon = new Animation;
		toon._an_toonb = new Animation;

		/* init img - find its natural width */
		toon._width_zoomed = img.naturalWidth;

		/* most browsers won't understand naturalWidth - try a horrible way */
		if ('number' != typeof(toon._width_zoomed)) {
			var _position = img.style.position;
			var _width = img.style.width;
			img.style.position = 'absolute';
			img.style.width = '';
			toon._width_zoomed = img.clientWidth;
			img.style.width = _width;
			img.style.position = _position;
		}
	}

	var anOvl = toon._an_ovl;
	var anToon = toon._an_toon;
	var anToonB = toon._an_toonb;

	try {

		/* states 0 and 4 accept input; others are animating states */
		switch (toon._zoom_state) {

			case 0:
				/* state: embedded */
				toon._zoom_state++;

				/* IE6: hide selects */
				if (legacyIE) {
					var sels = document.getElementsByTagName('select');
					for (var ii = 0; ii < sels.length; ii++) {
						sels[ii]._oldvis = sels[ii].style.visibility;
						sels[ii].style.visibility = 'hidden';
					}
				}

				/* bring in overlay */
				ovl.style.display = '';
				anOvl.current = 0;
				anOvl.target = 0.5;
				anOvl.fps = 15;
				anOvl.delta = 0.1;
				anOvl.actionCatch = function(err) { cartoonCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE); }
				anOvl.actionUpdate = function(val) { setOpacity(ovl, val); }
				anOvl.actionPost = function() { toon._zoom_state++; }

				/* bring in toon */
				toon.parentNode.style.height = toon.parentNode.clientHeight + 'px';
				toon.style.position = 'absolute';
				toon.style.zIndex = 223;
				anToon.current = toon._width_orig;
				anToon.target = toon._width_zoomed;
				anToon.fps = 15;
				anToon.delta = (anToon.target - anToon.current) / 5;
				anToon.actionCatch = function(err) { cartoonCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE); }
				anToon.actionUpdate = function(val) { toon.style.width = Math.round(val + 2) + 'px'; img.style.width = Math.round(val) + 'px'; }
				anToon.actionPost = function() { toon._zoom_state++; }

				/* slide toon left */
				anToonB.current = 0;
				anToonB.target = 0 - (toon._width_zoomed / 2 - toon._width_orig / 2);
				anToonB.fps = 15;
				anToonB.delta = (anToonB.target - anToonB.current) / 5;
				anToonB.actionCatch = function(err) { cartoonCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE); }
				anToonB.actionUpdate = function(val) { toon.style.left = Math.round(val) + 'px'; }
				anToonB.actionPost = function() { toon._zoom_state++; }

				/* go */
				anOvl.run();
				anToon.run();
				anToonB.run();

			break;

			case 4:
				/* state: zoomed */
				toon._zoom_state--;

				/* send out overlay */
				anOvl.target = 0;
				anOvl.delta = 0.1;
				anOvl.actionPost = function() {
					ovl.style.display = 'none';

					/* IE6: restore selects */
					if (legacyIE) {
						var sels = document.getElementsByTagName('select');
						for (var ii = 0; ii < sels.length; ii++) {
							 sels[ii].style.visibility = sels[ii]._oldvis;
						}
					}
					toon._zoom_state--;
				}

				/* send back toon */
				anToon.target = toon._width_orig;
				anToon.delta = (anToon.target - anToon.current) / 5;
				anToon.actionPost = function() {
					toon.style.zIndex = '';
					toon.style.position = '';
					toon.parentNode.style.height = '';
				   	toon._zoom_state--;
				}

				/* slide toon right */
				anToonB.target = 0;
				anToonB.delta = (anToonB.target - anToonB.current) / 5;
				anToonB.actionPost = function() {
					toon._zoom_state--;
				}

				/* go */
				anOvl.run();
				anToon.run();
				anToonB.run();

			break;
		}

	} catch(err) {
		cartoonCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE);
	}
}
function cartoonCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE) {
	/* disaster cleanup */

	/* stop any animations or clicks */
	anOvl.disabled = true;
	anToon.disabled = true;
	anToonB.disabled = true;
	toon._zoom_state = 99;

	/* kill overlay */
	ovl.style.display = 'none';

	/* restore selects */
	if (legacyIE) {
		var sels = document.getElementsByTagName('select');
		for (var ii = 0; ii < sels.length; ii++) {
			 sels[ii].style.visibility = sels[ii]._oldvis;
		}
	}

	/* snap back toon */
	toon.style.width = (toon._width_orig + 2) + 'px';
	img.style.width = toon._width_orig + 'px';
	toon.style.left = 0;
	toon.style.zIndex = '';
	toon.style.position = '';
	toon.parentNode.style.height = '';

	/* report error */
	if ('undefined' != typeof(console)) console.error("Fatal error: " + err);
}
function imageZoom(toon, img, ovl, orig_width) {

	/* remove hyperlink highlight */
	toon.style.backgroundColor = '#ffffff';

	var legacyIE = false;
	/* detect IE lt 7 */
	/*@cc_on
		legacyIE = (@_jscript_version < 5.7);
	@*/

	if ('undefined' == typeof(toon._zoom_state)) {

		/* init this */
		toon._zoom_state = 0;
		toon._width_orig = orig_width;

		/* init overlay */
		ovl.onclick = function() { imageZoom(toon, img, ovl); }
		toon._an_ovl = new Animation;

		setOpacity(ovl, 0);
		ovl.style.position = 'fixed';
		ovl.style.top = '0';
		ovl.style.right = '0';
		ovl.style.bottom = '0';
		ovl.style.left = '0';
		ovl.style.zIndex = 222;

		/* IE6 won't have understood this - another attempt */
		if (legacyIE) {
			ovl.style.position = 'absolute';
			ovl.style.top = '0';
			ovl.style.left = '0';
			ovl.style.width = document.body.clientWidth;
			ovl.style.height = document.body.clientHeight;
		}
		ovl.style.backgroundColor = '#000000';

		/* init toon */
		toon._an_toon = new Animation;
		toon._an_toonb = new Animation;

		/* init img - find its natural width */
		toon._width_zoomed = img.naturalWidth;

		/* most browsers won't understand naturalWidth - try a horrible way */
		if ('number' != typeof(toon._width_zoomed)) {
			var _position = img.style.position;
			var _width = img.style.width;
			img.style.position = 'absolute';
			img.style.width = '';
			toon._width_zoomed = img.clientWidth;
			img.style.width = _width;
			img.style.position = _position;
		}
	}

	var anOvl = toon._an_ovl;
	var anToon = toon._an_toon;
	var anToonB = toon._an_toonb;

	try {

		/* states 0 and 4 accept input; others are animating states */
		switch (toon._zoom_state) {

			case 0:
				/* state: embedded */
				toon._zoom_state++;

				/* IE6: hide selects */
				if (legacyIE) {
					var sels = document.getElementsByTagName('select');
					for (var ii = 0; ii < sels.length; ii++) {
						sels[ii]._oldvis = sels[ii].style.visibility;
						sels[ii].style.visibility = 'hidden';
					}
				}

				/* bring in overlay */
				ovl.style.display = '';
				anOvl.current = 0;
				anOvl.target = 0.5;
				anOvl.fps = 15;
				anOvl.delta = 0.1;
				anOvl.actionCatch = function(err) { imageCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE); }
				anOvl.actionUpdate = function(val) { setOpacity(ovl, val); }
				anOvl.actionPost = function() { toon._zoom_state++; }

				/* bring in toon */
				toon.parentNode.style.height = toon.parentNode.clientHeight + 'px';
				toon.style.position = 'absolute';
				toon.style.zIndex = 223;
				anToon.current = toon._width_orig;
				anToon.target = toon._width_zoomed;
				anToon.fps = 15;
				anToon.delta = (anToon.target - anToon.current) / 5;
				anToon.actionCatch = function(err) { imageCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE); }
				anToon.actionUpdate = function(val) { toon.style.width = Math.round(val + 2) + 'px'; img.style.width = Math.round(val) + 'px'; }
				anToon.actionPost = function() { toon._zoom_state++; }

				/* slide toon left */
				anToonB.current = 0;
				anToonB.target = 0 - (toon._width_zoomed / 2 - toon._width_orig / 2);
				anToonB.fps = 15;
				anToonB.delta = (anToonB.target - anToonB.current) / 5;
				anToonB.actionCatch = function(err) { imageCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE); }
				anToonB.actionUpdate = function(val) { toon.style.left = Math.round(val) + 'px'; }
				anToonB.actionPost = function() { toon._zoom_state++; }

				/* go */
				anOvl.run();
				anToon.run();
				anToonB.run();

			break;

			case 4:
				/* state: zoomed */
				toon._zoom_state--;

				/* send out overlay */
				anOvl.target = 0;
				anOvl.delta = 0.1;
				anOvl.actionPost = function() {
					ovl.style.display = 'none';

					/* IE6: restore selects */
					if (legacyIE) {
						var sels = document.getElementsByTagName('select');
						for (var ii = 0; ii < sels.length; ii++) {
							 sels[ii].style.visibility = sels[ii]._oldvis;
						}
					}
					toon._zoom_state--;
				}

				/* send back toon */
				anToon.target = toon._width_orig;
				anToon.delta = (anToon.target - anToon.current) / 5;
				anToon.actionPost = function() {
					toon.style.zIndex = '';
					toon.style.position = '';
					toon.parentNode.style.height = '';
				   	toon._zoom_state--;
				}

				/* slide toon right */
				anToonB.target = 0;
				anToonB.delta = (anToonB.target - anToonB.current) / 5;
				anToonB.actionPost = function() {
					toon._zoom_state--;
				}

				/* go */
				anOvl.run();
				anToon.run();
				anToonB.run();

			break;
		}

	} catch(err) {
		imageCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE);
	}
}
function imageCleanup(err, toon, img, ovl, anToon, anToonB, anOvl, legacyIE) {
	/* disaster cleanup */

	/* stop any animations or clicks */
	anOvl.disabled = true;
	anToon.disabled = true;
	anToonB.disabled = true;
	toon._zoom_state = 99;

	/* kill overlay */
	ovl.style.display = 'none';

	/* restore selects */
	if (legacyIE) {
		var sels = document.getElementsByTagName('select');
		for (var ii = 0; ii < sels.length; ii++) {
			 sels[ii].style.visibility = sels[ii]._oldvis;
		}
	}

	/* snap back toon */
	toon.style.width = (toon._width_orig + 2) + 'px';
	img.style.width = toon._width_orig + 'px';
	toon.style.left = 0;
	toon.style.zIndex = '';
	toon.style.position = '';
	toon.parentNode.style.height = '';

	/* report error */
	if ('undefined' != typeof(console)) console.error("Fatal error: " + err);
}
