/* $Id$
 */

var csSld = {
	/* Slideshow
	 *	Images are loaded by home-splash-imgX.js or
	 *	internal-splash-imgX.js where X is randomised at page
	 *	generation time (in SiteUtils.pm)
	 */
	step: 1,
	interval: 10000,
	init: function() {
		setInterval("csSld.slide_it()", this.interval);
	},
	slide_it: function() {
		if (!document.images) { return; }
		document.images.splash_img.src =
			eval("csSld_img" + this.step + ".src");
		if (this.step < csSld_n) { this.step++; }
		else { this.step = 1; }
	}
};

var csRss = {
	/* Scrolls rss news
	 */
	n: 12,
	display: 4,
	direction: 1, /* 1 forward, -1 backward */
	to_hide: 1,
	interval: 5000,
	left_toys_width: 405,
	corner_width: 16,
	init: function() {
		setInterval("csRss.scroll()", this.interval);
		this.resize();
		document.getElementById('news').style.display = 'block';
		window.addEventListener('resize', this.resize, false);
	},
	scroll: function() {
		var hide, show;
		var to_show = this.to_hide + this.display * this.direction;
		if (to_show > this.n || to_show < 1) {
			this.to_hide = to_show - this.direction;
			this.direction = - this.direction;
			to_show = this.to_hide + this.display * this.direction;
		}
		hide = document.getElementById("n" + this.to_hide);
		show = document.getElementById("n" + to_show);
		if ( hide ) { hide.style.display = "none"; }
		if ( show ) { show.style.display = "block"; }
		this.to_hide += this.direction;
	},
	resize: function() {
		var toys = document.getElementById('toys');
		var news_width = toys.clientWidth - csRss.left_toys_width;
		var news = document.getElementById('news');
		var news_body = document.getElementById('news-body');
		if ( news ) { news.style.width = news_width + 'px'; }
		if ( news_body ) {
			news_body.style.width =
				(news_width - 2 * csRss.corner_width) + 'px';
		}
	}
};

var csNws = {
	/* Scrolls Clinsearch news on the home page and allows those to
	 * be scrolled manually using lateral arrows.
	 */
	n: 5,
	i: 1,
	interval: 15000,
	interval_id: null,
	init: function() {
		this.interval_id =
			setInterval("csNws.rotate('auto')", this.interval);
		var right_hand = document.getElementById("right-hand");
		right_hand.addEventListener("click",
			function() {csNws.rotate('forward')}, false);
		var left_hand = document.getElementById("left-hand");
		left_hand.addEventListener("click",
			function() {csNws.rotate('back')}, false);
	},
	rotate: function(mode) {
		if (typeof(mode) == 'undefined') { mode = 'auto'; }
		var current_id = "cs-news" + this.i;
		var current = document.getElementById(current_id);
		if (mode == 'back') {
			if (this.i > 1) { this.i--; }
			else { this.i = this.n; }
		}
		else {
			if (this.i < this.n) { this.i++; }
			else { this.i = 1; }
		}
		var next_id = "cs-news" + this.i;
		var next = document.getElementById(next_id);
		current.style.display = "none";
		next.style.display = "block";
		if (document.images) {
			document.images.dots_img.src =
				eval("csDots_img" + this.i + ".src");
		}
		if(mode != 'auto') {
			/* Reset interval after manual switch */
			clearInterval(this.interval_id);
			this.interval_id =
				setInterval("csNws.rotate('auto')", this.interval);
		}
	}
};

var csMoreLess = {
	/* Shows/hides optional text
	 *	To use this you just need to use the class names and
	 *	identification pattern illustrated in the following
	 *	html snippet, where foo may be any identifier
	 *	matching /^\w+$/.
	 *
	 * <p class="short-text" id="foo-short">
	 *   My short summary...
	 *   <span class="more" id="foo-more">&gt;&gt;&nbsp;More</span>
	 *   <span class="less" id="foo-less">&lt;&lt;&nbsp;Less</span>
	 * </p>
	 * <p class="long-text" id="foo-long">
	 *   My long explanation...
	 * </p>
	 *
	 *	See quality.html for a more complete example
	 */
	init: function() {
		var mores = document.getElementsByClassName("more");
		if ( mores ) {
			for (var i = 0; i < mores.length; i++){
				mores[i].addEventListener("click", this.more, false);
			}
		}
		var lesses = document.getElementsByClassName("less");
		if ( lesses ) {
			for (var i = 0; i < lesses.length; i++){
				lesses[i].addEventListener("click", this.less, false);
			}
		}
	},
	more: function(e) {
		var evt = window.event || e;
		var el_more = evt.currentTarget;
		var id_prefix = el_more.id.match(/^\w+/);
		var el_less = document.getElementById(id_prefix[0] + '-less');
		var el_long = document.getElementById(id_prefix[0] + '-long');
		el_more.style.display = "none";
		el_less.style.display = "inline-block";
		el_long.style.display = "block";
	},
	less: function(e) {
		var evt = window.event || e;
		var el_less = evt.currentTarget;
		var id_prefix = el_less.id.match(/^\w+/);
		var el_more = document.getElementById(id_prefix[0] + '-more');
		var el_long = document.getElementById(id_prefix[0] + '-long');
		el_less.style.display = "none";
		el_more.style.display = "inline-block";
		el_long.style.display = "none";
	}
};

var csOpen = {
	/* Opens a link or image in same or new window
	 * If relevant, checks for svg support and sends a png otherwise
	 *	Acts on all links with the "open-choice" class
	 *	Opens in new window if the link also bears the "new-win"
	 *	class
	 */
	init: function() {
		var links = document.getElementsByClassName("open-choice");
		if ( links ) {
			for (var i = 0; i < links.length; i++) {
				links[i].addEventListener("click", this.open, false);
			}
		}
	},
	open: function(e) {
		var evt = window.event || e;
		var link = evt.currentTarget;
		var url = link.getAttribute("href");

		if ( url.match(/\.svg$/i) && ! document.implementation.hasFeature(
			"http://www.w3.org/TR/SVG11/feature#Shape", "1.0") ) {
			url = url.replace(/\.svg$/i, '.png');
			link.setAttribute("href", url);
		}

		if ( link.className.match(/new-win/) ) {
			window.open(url, "");
			evt.preventDefault(); /* The belt...    */
			return false;         /* and the braces */
		}
		return true;
	}
}

var csClearForm = {
	/* Clears or resets a form to default values even if it has been
	 * initialised by prior user input.
	 */
	defaults: { alpha: 2, beta: 2, sides: 1 }, /* 0.05 one-sided */
	init: function(name, defaults) {
		/* name is the form name, as declared in the html code
		 * defaults is an optional "associative array" of
		 * defaut values for the form fields
		 * (see above for an example)
		 */
		var form = document.forms[name];
		if (defaults) this.defaults = defaults;
		if (form)
			form.addEventListener("reset", this.clear, false );
	},
	clear: function(e) {
		var evt = window.event || e;
		var form = evt.currentTarget;
		var fields = form.elements;

		for ( var i = 0; i < fields.length; i++ ) {
			var type = fields[i].type.toLowerCase();
			var def = csClearForm.defaults[fields[i].name];
			switch (type) {
				/* This is a bit simplistic, we should
				 * allow multiple default values for
				 * checkbox and select-multi.
				 */
				case "text":
				case "textarea":
				case "password":
				/* case "hidden":
				 * Why should we reset hidden fields ?
				 */
					fields[i].value = def ? def : "";
					break;
				case "radio":
				case "checkbox":
					if (fields[i].value == def) {
						fields[i].checked = true;
					}
					else if (fields[i].checked) {
						fields[i].checked = false;
					}
					break;
				case "select-one":
				case "select-multi":
					fields[i].selectedIndex = def ? def : -1;
					break;
				default:
			}
		}
		evt.preventDefault(); /* The belt...    */
		return false;         /* and the braces */
	}
}

window.addEventListener("load", function() {
	csSld.init();

	var csTitle = document.title;
	if ( csTitle.match(/^News/) ) {
		var short_news = document.getElementById('news');
		short_news.style.display = "none";
	}
	else {
		csRss.init();
	}

	if ( csTitle.match(/^ClinSearch$/) ) {
		csNws.init();
	}
	else if ( document.URL.match(/\/tools\//) ) {
		csClearForm.init('tool-form');
	}

	csMoreLess.init();
	csOpen.init();
}, false);

