var $ = function (id) { return document.getElementById(id); }

/* iterative functions for Array-like objects
 * JS1.6 added these as methods on Array but DOM objects still don't have them, 
 * and their prototype can't be changed :-(
 */
var foreach = function (arr, fn) { /* note opposite arg order, to match conventional foreach */
	for (var i = 0, len = arr.length; i < len; i ++)
		fn(arr[i]);
}
var map = function (fn, arr) {
	var res = Array();
	for (var i = 0, len = arr.length; i < len; i ++)
		res[i] = fn(arr[i]);
	return res;
}
var filter = function (fn, arr) {
	var res = Array();
	for (var i = 0, len = arr.length; i < len; i ++)
		if (fn(arr[i]))
			res.push(arr[i]);
	return res;
}
var some = function (fn, arr) {
	for (var i = 0, len = arr.length; i < len; i ++)
		if (fn(arr[i]))
			return true;
	return false;
}

/* Class handling */
var has_class = function (elem, className) {
	return some(function (cn) { return (cn == className); }, elem.className.split(' '));
}
var remove_class = function (elem, className) {
	elem.className = filter(function (cn) { return (cn != className); }, elem.className.split(' ')).join(' ');
}
var set_class = function (elem, className) {
	if (!has_class(elem, className))
		elem.className += ' ' + className;
}

/* Element hiding */
var show_element = function (elem) { elem.style.display = 'block'; }
var hide_element = function (elem) { elem.style.display = 'none'; }
var remove_element = function (elem) { elem.parentNode.removeChild(elem); }

/* window.onload event handling */
window._onload_callstack = [];
window.onload = function () {
	var fn;
	while ((fn = window._onload_callstack.shift())) fn();
}
var add_load_event = function (fn) {
	window._onload_callstack.push(fn);
}

/* Link munging */
add_load_event(function () {
	foreach($('main').getElementsByTagName('a'), 
		function (elem) {
			if (elem.getElementsByTagName('img').length != 0)
				return; /* all bets are off for img links */
			if (/^http(s)?:\/\/(?![^:\/]+\.sclqld\.org\.au)/.test(elem.href)) {
				set_class(elem, 'print_link');
				var img = document.createElement('img');
				set_class(img, 'external');
				img.title = 'External link';
				elem.onmouseover = function () { img.src = '/images/btn.external.hover.gif'; };
				elem.onmouseout = function () { img.src = '/images/btn.external.gif'; };
				elem.onmouseout(); /* to set initial img src value */
				elem.appendChild(img);
			}
			if (/^mailto:/.test(elem.href)) {
				set_class(elem, 'print_link');
			}
		});
});

add_load_event(function() {
	if ($('sub_menu') && $('content')) {
		if (navigator.appVersion.indexOf("MSIE") != -1 && parseFloat(navigator.appVersion.split("MSIE")[1]) <= 6) {
			if ($('sub_menu').offsetHeight > $('content').offsetHeight) {
				$('content').style.height = $('sub_menu').offsetHeight + 'px';
			}
		} else {
			$('content').style.minHeight = $('sub_menu').offsetHeight + 'px';
		}
	}
});

add_load_event(function() {
	set_class(document.getElementsByTagName('body')[0], 'enhanced');
});

/* FAQs */
add_load_event(function () {
	/* automatically go to FAQs when Go button is clicked */
	var form = $('faq_utility').getElementsByTagName('form')[0]; /* assumes only one */
	$('faq_utility_submit').onclick = function () {
		if ($('faq_utility_options').options[$('faq_utility_options').selectedIndex].value == "catalogue") {
			window.location.href = "http://catalogue.sclqld.org.au/screens/help_index2.html";
		} else {
			window.location.href = form.action + '#' + $('faq_utility_options').options[$('faq_utility_options').selectedIndex].value;
		}
		return false;
	};
});

/* Other random stuff */
function isInteger(inputVal) {
    return inputVal.toString().match(/^\d+$/);
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

function removeSpaces(str) {
	return str.replace(/ /g, '');
}
