/* $Id: menutool.js,v 1.6 2005/06/01 01:49:16 brad Exp $ */
/** begin menutool functions **/

function Rollover( base_name )
{
	this.name = base_name;
	this.image_dir = "/images";
	this.img = null;

	this.Load = doRollLoad;
	this.Over = doRollNull;
	this.Out = doRollNull;

}

function doRollNull() { ; }

function doRollLoad()
{
	this.img = new Array();
	this.img[0] = new Image();
	this.img[0].src = this.image_dir + "/" + this.name + ".gif";
	this.img[1] = new Image();
	this.img[1].src = this.image_dir + "/" + this.name + "_o.gif";
	this.Over = doRollOver;
	this.Out = doRollOut;
}

function doRollOver()
{
	if( document.images )
	{
		image = document.images[ this.name ];
		image.src = this.img[1].src;
	}
}

function doRollOut()
{
	if( document.images )
	{
		image = document.images[ this.name ];
		image.src = this.img[0].src;
	}
}

function doRollDown()
{
	if( document.images && (this.src3 != '') )
	{
		image = document.images[ this.name ];
		image.src = this.img[2].src;
	}
}

MenuRollovers = Array();
function MenuRollover( base_name, src1, src2, src3 )
{
	this.name = base_name;
	this.img = null;
	this.src1 = src1;
	this.src2 = src2;
	this.src3 = src3;

	if( this.src3 + "" == "undefined" )
	{
		this.src3 = "";
	}

	this.Load = doMenuRollLoad;
	this.Over = doRollNull;
	this.Out = doRollNull;
	this.Down = doRollNull;

	MenuRollovers[ MenuRollovers.length ] = this;
	this.loaded = false;

}

function doMenuRollLoad()
{
	this.img = new Array();
	this.img[0] = new Image();
	this.img[0].src = this.src1;
	this.img[1] = new Image();
	this.img[1].src = this.src2;
	if( this.src3 != "" )
	{
		this.img[2] = new Image();
		this.img[2].src = this.src3;
	}
	this.Over = doRollOver;
	this.Out = doRollOut;
	if( navigator.userAgent.indexOf('Mac') == -1 )
	{
		this.Down = doRollDown;
	}
}

function MenuRollover_OnLoad()
{
	for( i=0; i<MenuRollovers.length; i++ )
	{
		MenuRollovers[i].Load();
	}
	for( i=0; i<FormRollovers.length; i++ )
	{
		FormRollovers[i].Load();
	}
}

FormRollovers = Array();
function FormButton( src1, src2, src3 )
{
	this.img = null;
	this.src1 = src1;
	this.src2 = src2;
	this.src3 = src3;

	this.Load = doMenuRollLoad;
	this.Over = doRollNull;
	this.Out = doRollNull;
	this.Down = doRollNull;

	FormRollovers[ FormRollovers.length ] = this;
}

/* addEvent( element [object], type [string], function_to_call [function], capture_event [bool] ) */
function addEvent(elem, evType, func, useCapture) {
	if(typeof elem.addEventListener != 'undefined') {
		elem.addEventListener(evType, func, useCapture);
		return true;
	} else if( typeof elem.attachEvent != 'undefined' ) { 
		var r = elem.attachEvent("on" + evType, func);
		return r; 
	} else { 
		var onEvt = "on" + evType;
		var elOldEvFuncs = elem[onEvt];
		if( typeof elem[onEvt] != 'function' ) {
			elem[onEvt] = func; 
		} else {
			elem[onEvt] = function() { elOldEvFuncs(); func(); }
		}
	}
}

function addLoadEvent(x) {
	var y = window;
	if(typeof document.addEventListener != 'undefined' && window.addEventListener == 'undefined') {
		y = document;
	}
	addEvent(y,"load",x,false);
}

function addUnLoadEvent(x) {
	var y = window;
	if(typeof document.addEventListener != 'undefined' && window.addEventListener == 'undefined') {
		y = document;
	}
	addEvent(y,"unload",x,false);
}

addLoadEvent(MenuRollover_OnLoad);

/** end menutool functions **/
/** $Id: htmltools.js,v 1.20 2009/06/23 09:06:45 tt Exp $ **/
/** htmltools javascript functions **/

/* stop pressing 'Return' submits forms */
var htmltools_form_focus = -1;
var htmltools_buttons = new Array();
var htmltools_forms = new Array();
function htmltools_onkeypress(e)
{
	var code = (e) ? e.which : event.keyCode;
	j = htmltools_form_focus;
	if(code == "13" && j!=-1 )
	{
		l = htmltools_forms[j].length;
		if( l == 0 )
		{
			return true;
		}
		if( l == 1 )
		{
//			return true; /* enable this to get 'normal' behaviour for forms with 1 button */
		}
		if( typeof g_htmltools_active_combobox == 'object' )
		{
			htmltools_combobox_toggle( g_htmltools_active_combobox );
			return false;
		}
		el = document.getElementById( htmltools_forms[j][l-1] );
		if( el != null && el.nodeName=='INPUT') el.focus();
		return false;
	}
	return true;
}

function htmltools_init_forms()
{
	var frms = document.getElementsByTagName("FORM");

	for( var j=0,frms_length=frms.length; j<frms_length; j++ )
	{
		htmltools_forms[j] = new Array();
		for( var i=0,htmltools_buttons_length=htmltools_buttons.length; i<htmltools_buttons_length; i++ )
		{
			el = document.getElementById( htmltools_buttons[i] );
			if( el!=null && el.form == frms[j] )
			{
				k = htmltools_forms[j].length;
				htmltools_forms[j][k] = htmltools_buttons[i];
			}
		}
	}

	htmltools_init_form_focus(0,0);
	document.onkeypress = htmltools_onkeypress;
		
		el = document.getElementById( "text_1" );
		if( el )
		{
			el.focus();
		}
	
}
function htmltools_init_form_focus(i,j)
{
	var frms = document.getElementsByTagName("FORM");
	var start = (new Date).getTime();	
	var now = start;
	var c = 0;
	for( var frms_length=frms.length; i<frms_length; i++ )
	{
		for( var els_length=frms[i].elements.length; j<els_length; j++ )
		{
			if( c++>10 && ((new Date).getTime()-start)>100 )
			{
				// IE7 performance optimisation; access to frms[i].elements[j] is slow
				// this iteration prevents locking the browser in this loop
				setTimeout( "htmltools_init_form_focus("+i+","+j+")",0 );
				return;
			}
			switch( frms[i].elements[j].type )
			{
			case "hidden" :
			case "textarea" :
				break;
			default:
				eval( "addOnFocusEvent(frms[" + i + "].elements[" + j + "], function() { htmltools_form_focus=" + i + ";})" );
				frms[i].elements[j].onblur = function() {
					htmltools_form_focus = -1;
				}
			}
		}
	}
}

function htmltools_register_button( id )
{
	htmltools_buttons[htmltools_buttons.length] = id;
}

function htmltools_checkbox_controller( id1, id2, label, show_class, hide_class )
{
	id1 = document.getElementById( id1 );
	id2 = document.getElementById( id2 );
	label = document.getElementById( label );

	id1.controls = id2;
	id1.labels = label;
	id1.show_class = show_class;
	id1.hide_class = hide_class;
	id1.onclick = function() {
		htmltools_checkbox_controller_onclick( this, this.controls, this.labels, id1.show_class, id1.hide_class );
	}
	id2.checked_last_val = id2.checked;
	id2.checked = (!id1.checked) && id2.checked || (id1.checked && id2.checked);
	id2.disabled = !id1.checked;
	label.className = id1.checked ? show_class:hide_class;
}
	
function htmltools_checkbox_controller_onclick( id1, id2, label, show_class, hide_class )
{
	id2.disabled=!id1.checked;
	if( id1.checked )
	{
		id2.checked=id2.checked_last_val;
	}
	else
	{
		id2.checked_last_val=id2.checked;
		id2.checked=false;
	}
	label.className = (id1.checked ? show_class:hide_class);
}

function addOnFocusEvent(el,func)
{
	var oldonfocus = el.onfocus;
	if( typeof el.onfocus != 'function') {
		el.onfocus = func;
	} else {
		el.onfocus = function() {
			oldonfocus();
			func();
		}
	}
}

addLoadEvent(htmltools_init_forms);

/** end htmltools javascript functions **/
function getAll( el ) { 
	if( el.all ) { 
		return el.all; 
	} else { 
		return el.getElementsByTagName("*"); 
	} 
}

function delClass( el, className )
{
	var regex = new RegExp("\\b"+className+"\\b");
	var s = el.className;
	s = s.replace( regex, '' );
	return el.className = s;
}

/** search document for elements with triggers and initialise them **/
addLoadEvent( function() { triggers( document ) } );

var g_triggers=Array();
var g_trigger_direct = Array();
function trigger(fn,id,args)
{
	g_trigger_direct.push( Array(fn,id,args) );
}

function triggers(el)
{
	var all = getAll(el);
	var regex = new RegExp(/\s(\w+)((\s(arg-[\w-]+\b))+|\b)/);
	var args;
// 	g_triggers = Array();
	
		var els = Array();
	for( var i=0,all_length=all.length; i<all_length; i++ ) {
		els.push(all[i]);
	}
	for( var i in els ) {
		// hack around IE's weird split
		if( typeof els[i] == 'undefined' )
			continue;
		var x_class = ' ' + els[i].className;
		var parts = x_class.split( /\bjs\b/ );
		parts.shift();
		for( var j in parts ) {
			var res = regex.exec(parts[j]);
			if( !res ) {
				continue;
			}
			if( typeof eval( "window." + res[1] ) != 'function' ) {
				continue;
			}
			var k = g_triggers.length;
			eval( "g_triggers[" + k + "] = new " + res[1] + "(" + k + ");" );
			g_triggers[k].init( els[i], res[2].replace( / arg-/g, ',' ).replace( /^,/, '' ) );
			delClass( els[i], 'js' ); // so it doesn't get initialised again!
		}
	}
	
	var target_el;
	els = el.getElementsByTagName('script');
	regex = new RegExp("(\\w+)\\.(\\w+)\\(([^\\)]*)\\)");
	for( var i=0; i<els.length; i++ )
	{
		if( els[i].getAttribute('type') == 'text/x-trigger' )
		{
			if( res = regex.exec(els[i].innerHTML) )
			{
				switch( res[1] )
				{
				case 'next' :
					target_el = els[i].nextSibling;
					while( target_el.nodeName == '#text' )
						target_el = target_el.nextSibling;
					break;
				case 'previous' :
					target_el = els[i].previousSibling;
					while( target_el.nodeName == '#text' )
						target_el = target_el.previousSibling;
					break;
				case 'parent' :
					target_el = els[i].parentNode;
					break;
				default:
					target_el = document.getElementById( res[1] );
					break;
				}
				k = g_triggers.length;
				eval( "g_triggers[" + k + "] = new " + res[2] + "(" + k + ");" );
				g_triggers[k].init( target_el, res[3] );
			}
		}
	}
	
	for( i in g_trigger_direct )
	{
		target_el = document.getElementById( g_trigger_direct[i][1] );
		k = g_triggers.length;
		eval( "g_triggers[" + k + "] = new " + g_trigger_direct[i][0] + "(" + k + ");" );
		g_triggers[k].init( target_el, g_trigger_direct[i][2] );
	}
}
function hasClass( el, className )
{
	var regex = new RegExp("\\b"+className+"\\b");
	return regex.exec( el.className );
}

function addClass( el, className )
{
	var regex = new RegExp("\\b"+className+"\\b");
	var s = el.className;
	if( regex.exec( s ) )
	{
		return;
	}
	if( s!='' )
	{
		s = s + ' ';
	}
	s = s + className;
	return el.className = s;
}

var window_width;
var window_height;
function calc_window_dimensions()
{
	if (self.innerWidth)
	{
		window_width = self.innerWidth;
		window_height = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
	{
		window_width = document.documentElement.clientWidth;
		window_height = document.documentElement.clientHeight;
	}
	else if (document.body)
	{
		window_width = document.body.clientWidth;
		window_height = document.body.clientHeight;
	}
}

function findPosX(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft;
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;

		var container = document.getElementById( 'container' );
// 	curleft -= container.offsetLeft;
	return curleft;
}

function findScrollPosX(obj)
{
	var pos=0;
	while( obj.parentNode ) {
		pos -= obj.scrollLeft;
		obj = obj.parentNode;
	}
	return pos;
}
function findScreenPosX(obj)
{
	return findPosX(obj) + findScrollPosX(obj);
	return curleft;
}
function findPosY(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop;
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}
function findScrollPosY(obj)
{
	var pos=0;
	while( obj.parentNode ) {
		pos -= obj.scrollTop;
		obj = obj.parentNode;
	}
	return pos;
}
function findScreenPosY(obj)
{
	return findPosY(obj) + findScrollPosY(obj);
}
g_open_quotebox = -1;
function quotebox(trigger_id , userx, usery)
{
	this.trigger_id = trigger_id;
	this.init = function(el,args) {
		this.el = el;
		this.popup = false;
		this.args = args.split( /,/ );
		if (args.length > 0) {
			this.userx = this.args[0];
			this.usery = this.args[1];
		}
		eval( "el.onclick = function(e) {g_triggers[" + this.trigger_id + "].onclick(e); return false;}" );
	}
	this.onclick = function(e) {
		if( this.popup ) {
			this.onclose();
			return;
		}
		if( hasClass(this.el, 'disable') ) {
			return;
		}

		if( g_open_quotebox >= 0 ) {
			g_triggers[g_open_quotebox].onclose();
		}

		var curEvent = ((typeof event == "undefined")? e: event);
		
		calc_window_dimensions(); // sets up window_width & window_height
		var elx = findScreenPosX(this.el);
		var ely = findScreenPosY(this.el);
		var scx = findScrollPosX(document.getElementById('container'));
		var scy = findScrollPosY(document.getElementById('container'));

		var mousex = curEvent.clientX;
		var mousey = curEvent.clientY;

		var y_off = 0;
		if( mousey < window_height/2 )
		{
			y_off = + 20;
		}
		else
		{
			y_off = -320;
		}

		if( this.usery ) {
			y_off = parseInt(this.usery);
		}

		var dist_center = (window_width/2 - mousex);
// 		alert( dist_center );
		var x_off = 0;
		if( Math.abs(dist_center) < 450/2 )
		{
			x_off -= dist_center/2;
		}
		if( dist_center < 0 )
		{
			x_off -= 450;
		}

		if( this.userx ) {
			x_off = parseInt(this.userx);
		}

		this.popup = document.createElement('DIV');
		this.popup.className = 'popup-quotebox';
		this.popup.style.top = (ely+y_off-scy) + 'px';
		this.popup.style.left = (elx+x_off-scx) + 'px';
		
		var titlebar = document.createElement('DIV');
		titlebar.className = 'popup-titlebar';

		this.caption = document.createElement('DIV');
		this.caption.className = 'popup-caption';
		this.caption.innerHTML = 'Loading..';

		var a = document.createElement('A');
		eval( "a.onclick = function(e) {g_triggers[" + this.trigger_id + "].onclose(e); return false;}" );
		a.innerHTML = '[close]';
		
		this.content = document.createElement('DIV');
		this.content.className = 'quotebox-content';
		this.content.innerHTML = '<img src="/_img/fc_aussuper/indicator.gif">';
		
		titlebar.appendChild(a);
		titlebar.appendChild(this.caption);
		this.popup.appendChild(titlebar);
		this.popup.appendChild(this.content);
		document.getElementById('container').appendChild(this.popup);
		g_open_quotebox = this.trigger_id;
		
		var fms = document.getElementsByTagName('FORM');
		for( var i=0; i<fms.length; i++ ) {
			addClass(fms[i], 'prevent_shine_through'); // an IE6 hack to prevent form elements 'shining' through
		}
// this.popup.style.top = 0;
// this.popup.style.left = 0;
// 		alert(this.popup.offsetParent.nodeName);
// 		alert( 'top='+ this.popup.style.top + ' left=' + this.popup.style.left )

// 		alert( "height=" + window_height + "\ny=" + ely + "\nmouse=" + e.clientY );
		ajax_callback( appendQuery(this.el.href, 'js=quotebox') , this, 'insert');
	}
	this.onclose = function(e) {
		document.getElementById('container').removeChild(this.popup);
		this.popup = false;
		g_open_quotebox = -1;
		var fms = document.getElementsByTagName('FORM');
		for( var i=0; i<fms.length; i++ ) {
			delClass(fms[i], 'prevent_shine_through'); // an IE6 hack to prevent form elements 'shining' through
		}
	}
	this.insert = function(text) {
		lines = text.split( /\n/ );
		this.caption.innerHTML = lines[0];
		delete lines[0];
		this.content.innerHTML = lines.join('\n');
	}
}

function getAll( el ) { 
	if( el.all ) { 
		return el.all; 
	} else { 
		return el.getElementsByTagName("*"); 
	} 
}

function delClass( el, className )
{
	var regex = new RegExp("\\b"+className+"\\b");
	var s = el.className;
	s = s.replace( regex, '' );
	return el.className = s;
}

/* addEvent( element [object], type [string], function_to_call [function], capture_event [bool] ) */
function addEvent(elem, evType, func, useCapture) {
	if(typeof elem.addEventListener != 'undefined') {
		elem.addEventListener(evType, func, useCapture);
		return true;
	} else if( typeof elem.attachEvent != 'undefined' ) { 
		var r = elem.attachEvent("on" + evType, func);
		return r; 
	} else { 
		var onEvt = "on" + evType;
		var elOldEvFuncs = elem[onEvt];
		if( typeof elem[onEvt] != 'function' ) {
			elem[onEvt] = func; 
		} else {
			elem[onEvt] = function() { elOldEvFuncs(); func(); }
		}
	}
}

function addLoadEvent(x) {
	var y = window;
	if(typeof document.addEventListener != 'undefined' && window.addEventListener == 'undefined') {
		y = document;
	}
	addEvent(y,"load",x,false);
}

/** search document for elements with triggers and initialise them **/
addLoadEvent( function() { triggers( document ) } );

var g_triggers=Array();
var g_trigger_direct = Array();
function trigger(fn,id,args)
{
	g_trigger_direct.push( Array(fn,id,args) );
}

function triggers(el)
{
	var all = getAll(el);
	var regex = new RegExp(/\s+(\w+)((\s+(arg-[\w-]+\b))+|\b)/);
	var args;
// 	g_triggers = Array();
	
		var els = Array();
	for( var i=0, all_length=all.length; i<all_length; i++ ) {
		els.push(all[i]);
	}
	for( var i in els ) {
		if( typeof els[i] == 'undefined' )
			continue;
		// hack around IE's weird split
		var x_class = ' ' + els[i].className.toString().replace( /\s+/,' ' );
		var parts = x_class.split( /\bjs\b/ );
		parts.shift();
		for( var j in parts ) {
			var res = regex.exec(parts[j]);
			if( !res ) {
				continue;
			}
			if( typeof eval( "window." + res[1] ) != 'function' ) {
				continue;
			}
			var k = g_triggers.length;
			eval( "g_triggers[" + k + "] = new " + res[1] + "(" + k + ");" );
			g_triggers[k].init( els[i], res[2].replace( /\s+arg-/g, ',' ).replace( /^,/, '' ) );
			delClass( els[i], 'js' ); // so it doesn't get initialised again!
		}
	}
	
	var target_el;
	els = el.getElementsByTagName('script');
	regex = new RegExp("(\\w+)\\.(\\w+)\\(([^\\)]*)\\)");
	for( var i=0; i<els.length; i++ )
	{
		if( els[i].getAttribute('type') == 'text/x-trigger' )
		{
			if( res = regex.exec(els[i].innerHTML) )
			{
				switch( res[1] )
				{
				case 'next' :
					target_el = els[i].nextSibling;
					while( target_el.nodeName == '#text' )
						target_el = target_el.nextSibling;
					break;
				case 'previous' :
					target_el = els[i].previousSibling;
					while( target_el.nodeName == '#text' )
						target_el = target_el.previousSibling;
					break;
				case 'parent' :
					target_el = els[i].parentNode;
					break;
				default:
					target_el = document.getElementById( res[1] );
					break;
				}
				k = g_triggers.length;
				eval( "g_triggers[" + k + "] = new " + res[2] + "(" + k + ");" );
				g_triggers[k].init( target_el, res[3] );
			}
		}
	}
	
	for( i in g_trigger_direct )
	{
		target_el = document.getElementById( g_trigger_direct[i][1] );
		k = g_triggers.length;
		eval( "g_triggers[" + k + "] = new " + g_trigger_direct[i][0] + "(" + k + ");" );
		g_triggers[k].init( target_el, g_trigger_direct[i][2] );
	}
}
var window_width;
var window_height;
function calc_window_dimensions()
{
	if (self.innerWidth)
	{
		window_width = self.innerWidth;
		window_height = self.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
	{
		window_width = document.documentElement.clientWidth;
		window_height = document.documentElement.clientHeight;
	}
	else if (document.body)
	{
		window_width = document.body.clientWidth;
		window_height = document.body.clientHeight;
	}
}

function roundElementHeight( o )
{
	/* Stop Mozilla from creating a body scrollbar when siblings
	have computed heights with decimal parts.
	offsetHeight is the style.height + borders + paddings; we
	work out the border and padding dimensions by first
	setting the style.height to our target and checking offsetHeight
	again:
		style.height = offsetHeight - border+padding
		-> border+padding = offsetHeight - style.height
	*/
	var tmp;
	var diff;
	o.style.height = '';
	tmp = Math.ceil( o.offsetHeight );
	if( tmp == o.offsetHeight )
	{
		return;
	}
	o.style.height = tmp + 'px';
	diff = o.offsetHeight - tmp;
	tmp -= diff;
	o.style.height = tmp + 'px';
}
function maxheight( trigger_id )
{
	
	this.trigger_id = trigger_id;
	
	this.init = function(el, args) {
		this.el = el;
		this.others = args;
		this.el.trigger = this;
		this.myheight = 0;
		this.redraw(1);
		eval( "addEvent( window, 'resize', function() { g_triggers["+ this.trigger_id +"].redraw(); }, false )" );
	};
	
	this.redraw = function(init) {
		calc_window_dimensions();
		if( this.myheight == window_height )
		{
			return;
		}
		this.myheight = window_height;
		var el_height = window_height;
		var res = this.others.split( /,/ );
		var i=0;
		var screen=(res[0]=='screen');
		var relClass=(res[0]=='class');
		
		
		if (screen )
		{
			i++;
		}
		if(relClass) {
			var c = this.el;
			while( !hasClass(c, res[1]) ) {
				c = c.parentNode;
			}
			el_height = c.offsetHeight;
			i+=2;
		}
		for( ; i<res.length; i++ )
		{
			if( res[i].match(/^\d+$/) ) {
				el_height -= parseInt(res[i]);
				continue;
			}
			if( init )
			{
				roundElementHeight(document.getElementById( res[i] ));
			}
			el_height -= document.getElementById( res[i] ).offsetHeight;
		}
		if( screen && init )
		{
			this.min_el_height = this.el.offsetHeight;
		}
		if( screen && this.min_el_height < el_height )
		{
			this.el.style.height = '' + el_height + 'px';
			
		}
		if( !screen )
		{
			this.el.style.height = '' + el_height + 'px';
			this.el.style.overflow = 'auto';
		}
		
		
	};
	
	

}
function getFormData(frm) {
	var formdata = new Object;
	var el;
	for( var i=0, len=frm.elements.length; i<len; i++ ) {
		el = frm.elements[i];
		if( el.name == '' ) {
			continue;
		}
		switch( el.nodeName.toUpperCase() )
		{
		case 'INPUT':
			switch( el.type.toLowerCase() )
			{
			case 'text':
			case 'hidden':
			default:
				formdata[el.name] = el.value;
				break;
			case 'radio':
				if( !el.checked  ) {
					break;
				}
				formdata[el.name] = el.value;
				break;
			case 'checkbox':
				if( !el.checked  ) {
					break;
				}
				var re = el.name.match(/(.*)\[(.*)\]$/); // check for name="field[]" or name="field[x]" array/group syntax
				if( re  ) {
					if( typeof formdata[re[1]] == 'undefined' ) {
						if( re[2]=='' ) {
							formdata[re[1]] = new Array;
						} else {
							formdata[re[1]] = new Object;
						}
					}
					if( re[2]=='' ) {
						formdata[re[1]].push( el.value );
					} else {
						formdata[re[1]][re[2]] = el.value;
					}
				}
				else {
					formdata[el.name] = el.value;
				}
				break;
			case 'radio':
				if( el.checked!='checked' ) {
					break;
				}
				formdata[el.name] = el.value;
				break;
			case 'button':
			case 'submit':
				if( el.checked!='checked' ) {
					break;
				}
				formdata[el.name] = el.value;
				break;
			}
			break;
		case 'TEXTAREA':
			formdata[el.name] = el.value;
			break;
		case 'SELECT':
			if (el.multiple == true) {
				var j = 0;
				var thisname = el.name.replace(/\[\]$/,"");
				for (k=0;k<el.options.length;k++) {
					if (el.options[k].selected) {
						formdata[thisname + "[" + j + "]"] = el.options[k].value;
						j++;
					}				
				}
			}
			else {
				if ( el.selectedIndex >= 0 ) {
					formdata[el.name] = el.options[el.selectedIndex].value;
				}
			}
			break;
		case 'BUTTON':
			if( !el.clicked ) {
				break;
			}
			formdata[el.name] = el.attributes['value'].value;
			el.clicked = false;
			break;
		case 'FIELDSET':
		case 'LEGEND':
			break;
		default:
			alert( 'Unknown form element: ' + el.nodeName + ' ' + el.name );
			break;
		}
	}
	return formdata;
}
function fireEvent(element,event) {
	if(document.createEvent) {
		// dispatch for firefox + others
		var evt = document.createEvent("HTMLEvents");
		evt.initEvent(event, true, true ); // event type,bubbling,cancelable
		return !element.dispatchEvent(evt);
	} else {
		// dispatch for IE
		var evt = document.createEventObject();
		return element.fireEvent('on'+event,evt)
	}
}
function setFormData(frm, formdata) {
	var el;
	for( var i=0, len=frm.elements.length; i<len; i++ ) {
		el = frm.elements[i];
		if( el.name == '' ) {
			continue;
		}
		if( typeof formdata[el.name] == 'undefined' ) {
			continue;
		}
		switch( el.nodeName.toUpperCase() )
		{
		case 'INPUT':
			switch( el.type.toLowerCase() )
			{
			case 'text':
			case 'hidden':
			default:
				var old = el.value;
				el.value = formdata[el.name];
				if( old != el.value ) {
					fireEvent(el, 'change');
				}
				break;
			case 'radio':
				var old = el.checked;
				el.checked = (el.value == formdata[el.name]);
				if( old != el.checked ) {
					fireEvent(el, 'change');
				}
				break;
			case 'checkbox':
				/* TODO */
				break;
			}
			break;
		case 'TEXTAREA':
			var old = el.value;
			el.value = formdata[el.name];
			if( old != el.value ) {
				fireEvent(el, 'change');
			}
			break;
		case 'SELECT':
			var old = el.selectedIndex;
			for( var i=0; i<el.options.length; i++ ) {
				if( el.options[i].value == formdata[el.name] ) {
					el.selectedIndex = i;
					if( i != old ) {
						fireEvent(el, 'change');
					}
					break;
				}
			}
			break;
		case 'BUTTON':
		case 'FIELDSET':
		case 'LEGEND':
			break;
		default:
			alert( 'Unknown form element: ' + el.nodeName + ' ' + el.name );
			break;
		}
	}
	return formdata;
}
function encodeFormData(formdata) {
	var res = new Array;
	for( var i in formdata ) {
		if( typeof formdata[i] == 'object' ) {
			for( var j in formdata[i] ) {
				res[res.length] = encodeURIComponent(i+'['+j+']') + '=' + encodeURIComponent(formdata[i][j]);
			}
		}
		else {
			res[res.length] = encodeURIComponent(i) + '=' + encodeURIComponent(formdata[i]);
		}
	}
	return res.join('&');
}
function decodeFormData(str) {
	var res = new Object;
	var bits = str.split( /&/ );
	for( var i in bits ) {
		var nv = bits[i].split( /=/ );
		try {
			res[decodeURIComponent(nv[0])] = nv[1]!=null ? decodeURIComponent(nv[1]) : '';
		} catch(e) {
			return false;
		}
	}
	return res;
}
function setOptions(el,opts)
{
	var val = null;
	if( el.selectedIndex >= 0 && el.selectedIndex < el.options.length )
	{
		val = el.options[el.selectedIndex].value;
	}
	for( var i=el.options.length-1;i>=0;i-- )
	{
		el.options[i] = null;
	}
	var j=0;
	for( var i in opts ) {
		el.options[j++] = new Option( opts[i], i );
		if( val == i )
		{
			el.selectedIndex = j-1;
		}
	}
}

function AJAX() {
	var o = false;
	/*@cc_on @*/
	/*@if (@_jscript_version >= 5)
 		try {
  			o = new ActiveXObject("Msxml2.XMLHTTP");
 		} catch (e) {
  			try {
   				o = new ActiveXObject("Microsoft.XMLHTTP");
  			} catch (E) {
   				o = false;
  			}
 		}
	@end @*/
	if (!o && typeof XMLHttpRequest!='undefined') {
		o = new XMLHttpRequest();
	}
	
	return o;
}

function ajax_callback(url, obj, fn)
{
	ajax = new AJAX();
	ajax.open("GET", url, true);
	ajax.onreadystatechange = function() { 
		if( ajax.readyState==4 ) {
			eval( 'obj.' + fn + '(ajax.responseText)' );
		}
	 };
	ajax.send(null);
}
function appendQuery( url, qs )
{
	return url + (url.match(/\?/) ? '&' : '?') + qs;
}

function setInnerHTML(el,innerHTML)
{
	switch( el.nodeName.toLowerCase() )
	{
	case 'tbody':
		var div = document.createElement('div');
		div.innerHTML = '<table><tbody>' + innerHTML + '</tbody></table>';
		var rows = div.firstChild.firstChild.childNodes;
		for( var i=el.childNodes.length-1; i>=0; i-- ) {
			el.removeChild(el.childNodes[i]);
		}
		for( var i=0,c=rows.length; i<c; i++ ) {
			el.appendChild(rows[i].cloneNode(true));
		}
		break;
	default:
		el.innerHTML = innerHTML;
		break;
	}
}
function formdata_callback() {
	this.xhr = null;
	this.xhr_seq = 0;
	
	this.init_ajax = function() {
		var self = this;
		if( this.xhr != null ) {
			delete this.xhr;
		}
		this.xhr_seq++;
		var seq = this.xhr_seq;
		this.xhr = new AJAX();
		this.xhr.onreadystatechange = function() {return self.xhr_readystatechange(self,seq)};
		return this.xhr;
	}

	this.xhr_readystatechange = function(that,xhr_seq) {
		if( xhr_seq != this.xhr_seq ) {
			// this is a callback from a cancelled operation
			if( that.readyState==4 ) {
				this.callback_complete(xhr_seq);
			}
			return;
		}
		var xhr = this.xhr;
		if( xhr.readyState==4 ) {
			this.callback(xhr.responseText);
			this.callback_complete(xhr_seq);
		}
	}
	
	this.ajax_send = function( url, method, data, name ) {
// 		alert(url + ' ' + method );
		var xhr = this.init_ajax();
		switch( method.toLowerCase() )
		{
		case 'get':
		default:
			data.js = name;
			url = appendQuery( url, encodeFormData(data) );
			xhr.open('GET', url, true);
			xhr.send(null);
			break;
		case 'post':
			var content = encodeFormData(data);
			xhr.open("POST", appendQuery(url,'js=' + encodeURIComponent(name)), true );
			xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			xhr.setRequestHeader("Content-length", content.length);
			xhr.setRequestHeader("Connection", "close");
			xhr.send(content);
			break;
		}
	}
	
	this.callback = function(response) {
		var data = decodeFormData(response);
		if( typeof data.message == 'string' ) {
			this.callback_message( decodeFormData(data.message) );
		}
		switch( data.status )
		{
		default:
			alert(response);
			break;
		case 'ok':
			this.callback_ok( data );
			break;
		case 'error':
			this.callback_error( data );
			break;
		}
	}
		
}

formdata_callback.prototype.callback_ok = function(data) {
	var self = this;
	for( var k in data ) {
		switch( k ) 
		{
		case 'redirect':
			document.location = data[k];
			break;
		case 'reload':
			document.location = document.location.toString();
			break;
		case 'set':
			var setdata = decodeFormData(data[k]);
			setFormData( this.el, setdata );
			break;
		case 'load':
			var l = decodeFormData(data[k]);
			for( i in l ) {
				var loaddata = decodeFormData(l[i]);
				if( !loaddata.data ) {
					loaddata.data = {};
				} else {
					loaddata.data = decodeFormData(loaddata.data);
				}
				if( !loaddata.name ) {
					loaddata.name = loaddata.data.js;
				}
				if( !loaddata.method ) {
					loaddata.method = 'get';
				}
// 				alert( d.url + ' ' + d.method );
				var t = (loaddata.timeout ? loaddata.timeout : 0);
				setTimeout(function(){self.ajax_send(loaddata.url, loaddata.method, loaddata.data, loaddata.name)},t);
			}
			break;
		case 'call':
			var d = decodeFormData(data[k]);
			for( var i in d ) {
				var f = decodeFormData(d[i]);
				for( fn in f ) {
					if( eval('typeof ' + fn)=='function' ) {
						eval( fn + "(f[fn])" );
					} else {
						alert(fn + "(f[fn])" + ' ' + eval('typeof ' + fn) );
					}
				}
			}
			break;
		case 'dom':
			var d = decodeFormData(data[k]);
			for( var dom_id in d ) {
				var dom_el = document.getElementById(dom_id);
				setInnerHTML( dom_el, d[dom_id] );
			}
			break;
		case 'dom-attribute':
			var d = decodeFormData(data[k]);
			for( var dom_id in d ) {
				var dom_el = document.getElementById(dom_id);
				var a = decodeFormData(d[dom_id]);
				for( var attr in a ) {
					dom_el[attr] = a[attr];
				}
			}
			break;
		case 'dom-css':
			var d = decodeFormData(data[k]);
			for( var dom_id in d ) {
				var dom_el = document.getElementById(dom_id);
				var a = decodeFormData(d[dom_id]);
				for( var css in a ) {
					dom_el.style[css] = a[css];
				}
			}
			break;
		case 'form':
			var d = decodeFormData(data[k]);
			for( var name in d ) {
				setFormData( document.forms[name], decodeFormData(d[name]) );
			}
			break;
		case 'popup': // note: not recommended due to browser popup-blockers
// 			alert(data[k]);
			var d = decodeFormData(data[k]);
			var f = "resizable=yes";
			if( !d.name ) {
				d.name = 'popup';
			}
			if( d.width ) {
				f = ",width=" + d.width;
			}
			if( d.height ) {
				f = ",height=" + d.width;
			}
			window.open(d.url,d.name,f).focus();
			break;
		}
		triggers(document);
	}
}
	
formdata_callback.prototype.callback_error = function(data) {
	if( typeof data.errors == 'string' ) {
		var errors = decodeFormData(data.errors);
		var inp;
		var msg;
		for( var i in errors ) {
			inp = this.el.elements[i];
			if( !inp ) {
				inp = this.el.elements[ i + '[]' ];
			}
			if( !inp ) {
				alert( 'Unknown form element: ' + i );
				continue;
			}
			msg = null;
			switch( typeof inp.type )
			{
			case 'undefined':
				// radio buttons return a nodeList
				inp = inp[0];
				msg = document.getElementById( inp.parentNode.parentNode.id + '_msg' );
				break;
			default:
				switch( inp.nodeName.toUpperCase() )
				{
				case 'INPUT':
					switch( inp.type.toLowerCase() )
					{
					case 'text':
					default:
						msg = document.getElementById( inp.id + '_msg' );
						break;
					case 'checkbox':
						msg = document.getElementById( inp.id + '_msg' );
						if( msg != null ) {
							break;
						}
						alert( msg );
						break;
					}
					break;
				case 'TEXTAREA':
				case 'SELECT':
					msg = document.getElementById( inp.id + '_msg' );
					break;
				default:
					alert( 'Unknown element type: ' + (inp.nodeName) + ' (for ' + i + ')' );
					break
				}
			}
			if( typeof inp.trigger != 'undefined' ) {
				inp.trigger.set();
			}
			if( msg == null )
				continue;
			msg.innerHTML = errors[i];
		}
	}
}
	
formdata_callback.prototype.callback_message = function(data) {
	if( typeof data.alert == 'string' ) {
		alert( data.alert );
	}
}

formdata_callback.prototype.callback_complete = function(xhr_seq) {
	return;
}

function submitform(trigger_id)
{
	formdata_callback.call(this); // using formdata_callback prototype
	this.trigger_id = trigger_id;
	
	this.init = function( el, args ) {
		this.el = el;
		el.onsubmit = function() { return false; };
		var buttons = this.el.getElementsByTagName('BUTTON');
		for( var i=0,buttons_length=buttons.length; i<buttons_length; i++ ) {
			if( buttons[i].type != 'submit' ) {
				continue;
			}
			eval( "addEvent(buttons[i],'click',function(e){return g_triggers[" + this.trigger_id + "].onclick(e);})");
		}
	};
	
	this.onclick = function(e) {
		var evnt = ((typeof event == "undefined")? e: event);
		var src = (evnt["target"] ? evnt["target"] : evnt["srcElement"]);
		src.clicked = true;

		fireEvent(this.el,"submit");

		var data = getFormData(this.el);
		var frm = this.el;
		
		var xhr = this.init_ajax();
		
		/** disabled reset() - causes issues with htmltools sliders as they get reset
			to their initial value, which is undesired behaviour (I wonder what it's 
			here for??) **/
/*		for( var i=0,len=this.el.elements.length; i<len; i++ ) {
			if( typeof this.el.elements[i].trigger != 'undefined' ) {
				this.el.elements[i].trigger.reset();
			}
		}*/
		
		var spans = this.el.getElementsByTagName('span');
		for( var i=0; i<spans.length; i++ ) {
			if( hasClass(spans[i],'error') ) {
				addClass(spans[i],'validation');
			}
		}
		
		switch( frm.method.toLowerCase() )
		{
		case 'get':
		default:
			var url = frm.action.toString();
			data.js = 'submitform';
			url = appendQuery( url, encodeFormData(data) );
			xhr.open('GET', url, true);
			xhr.send(null);
			break;
		case 'post':
			var content = encodeFormData(data);
			xhr.open("POST", appendQuery(frm.action.toString(),'js=submitform'), true );
			xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			xhr.setRequestHeader("Content-length", content.length);
			xhr.setRequestHeader("Connection", "close");
			xhr.send(content);
			break;
		}
		return false;
	};
	
	this.callback_ok = function(data) {
		if( typeof data.content == 'string' ) {
			if( this.el.popin != null ) {
				/* this relies on the form being displayed in a 'popin'
					which was setup (eg. by popin_link()).
				*/
				var popin = this.el.popin;
				popin.setHTML('content',data.content);
				var content_forms = this.el.popin.content.getElementsByTagName('form');
				for( var i=0,content_forms_length=content_forms.length; i<content_forms_length; i++ ) {
					content_forms[i].popin = this.el.popin;
				}
				triggers(document);
			}
			data.content = null;
		}
		if( typeof data.options == 'string' ) {
			var opts = decodeFormData( data.options );
			for( var i in opts ) {
				setOptions( this.el.elements[i], decodeFormData(opts[i]) );
			}
			data.options = null;
		}
		
		/** data.background provides anti-flicker functionality for 'theflipper' **/
		if( typeof data.background == 'string' ) {
			var d = decodeFormData(data.background);
			var xhr = {};
			for( var dom_id in d ) {
				var url = d[dom_id];
				xhr[dom_id] = new AJAX();
				eval( "xhr[dom_id].onreadystatechange = function() { return g_triggers[" + this.trigger_id + "].setBackground(xhr['"+dom_id+"'],'" + dom_id + "','" + url + "') }" );
				xhr[dom_id].open('GET', url, true);
				var el = document.getElementById(dom_id);
				var p = el.parentNode;
				if( p.noflicker != 'noflicker' ) {
					p.style.backgroundImage = el.style.backgroundImage;
				}
				
				p.noflicker = 'noflicker';
				if( hasClass(el,'active') ) {
					addClass(p,'active');
				} else {
					delClass(p,'active');
				}
				xhr[dom_id].send(null);
			}
			data.background = null
		}
		formdata_callback.prototype.callback_ok.call(this,data);
	}

	this.setBackground = function(xhr,id,url) {
		if( xhr.readyState==4 ) {
			document.getElementById(id).style.backgroundImage = "url('" + url + "')";
			document.getElementById(id).parentNode.noflicker = '';
		}
	}
}

submitform.prototype = new formdata_callback();	

function linked_select(trigger_id)
{
	this.trigger_id = trigger_id;
	
	this.init = function( el, args ) {
		this.el = el;
		this.args = args.split(/,/);
		this.old_value = "";
		this.select = document.getElementById(this.args[0]);
		this.type = this.args[1];

		if (this.el.options[this.el.selectedIndex].text.indexOf("Average Fees") == 0) {
			for(var i=0,len=this.select.options.length; i<len; i++) {
				if (this.select.options[i].text.indexOf("Average Fees") == 0) {
					avg_index = i;
					break;
				}
			}
			this.select.selectedIndex = avg_index;
		}

		eval( "addEvent(this.el,'change',function(e){return g_triggers[" + this.trigger_id + "].onchange(e);})");
		eval( "addEvent(this.el,'click',function(e){return g_triggers[" + this.trigger_id + "].onclick(e);})");
	};
	
	this.onclick = function(e) {
		this.old_value = this.el.options[this.el.selectedIndex].text;
	}

	this.onchange = function(e) {
		var select = document.getElementById(this.args);

		if ((this.old_value.indexOf("Average Fees") == 0) && (this.el.options[this.el.selectedIndex].text.indexOf("Average Fees") == -1)) {
			if (this.args[0]=="retail" && this.type=="aus") {
				return;
			}
			
			if (this.select.options[0].text.indexOf("Average Fees") == 0) {
				this.select.selectedIndex = 1;
			}
			else {
				this.select.selectedIndex = 0;
			}
		}
		else if (this.el.options[this.el.selectedIndex].text.indexOf("Average Fees") == 0) {	// average chosen
			var avg_index = this.select.selectedIndex;
			
			if (this.args[0]=="industry" && this.type=="aus") {
				return;
			}			

			for(var i=0,len=this.select.options.length; i<len; i++) {
				if (this.select.options[i].text.indexOf("Average Fees") == 0) {
					avg_index = i;
					break;
				}
			}
			this.select.selectedIndex = avg_index;
		}
	};

}
function findPos(obj) {
	var r = obj.getBoundingClientRect();
	if( r ) {
		return [r.left, r.top];
	}
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return [curleft,curtop];
}
var g_theflipper_triggers = new Array();
function theflipper(trigger_id)
{
	this.trigger_id = trigger_id;
	
	this.init = function(el, args) {
		this.el = el;
		var img = el.getElementsByTagName('img');
		this.targets = Array();
		for( var i=0; i<img.length; i++ ) {
			var thumb = document.getElementById( 'thumb-' + img[i].id );
			if( thumb==null ) {
				continue;
			}
			this.targets.push(img[i].id);
			g_theflipper_triggers[img[i].id] = this;
			eval( "addEvent(thumb,'click',function(e){g_triggers['" + this.trigger_id + "'].flipit('" + img[i].id + "')})" );
		}
	}
	
	this.flipit = function(el) {
		for( var i in this.targets ) {
			document.getElementById(this.targets[i]).parentNode.style.display = (this.targets[i]==el ? 'block' : 'none');
			if( this.targets[i]==el )
			{
				addClass( document.getElementById('thumb-' + this.targets[i]), 'active' );
			}
			else
			{
				delClass( document.getElementById('thumb-' + this.targets[i]), 'active' );
			}
		}
	}
}

function flipit(id)
{
	g_theflipper_triggers[id].flipit(id);
}
function hasClass( el, className )
{
	var regex = new RegExp("(^"+className+"\\s)|(\\s"+className+"\\s)|(\\s"+className+"$)|(^"+className+"$)");
	return regex.exec( el.className );
}

function addClass( el, className )
{
	var regex = new RegExp("\\b"+className+"\\b");
	var s = el.className;
	if( regex.exec( s ) )
	{
		return;
	}
	if( s!='' )
	{
		s = s + ' ';
	}
	s = s + className;
	return el.className = s;
}

function hasAttribute(el, attribute)
{
	if( el.hasAttribute ) return el.hasAttribute(attribute);
	return eval('el.'+attribute);
}
