/* $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 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)
{
	var ajax = new AJAX();
	ajax.open("GET", url, true);
	ajax.onreadystatechange = function() { 
		if( ajax.readyState==4 ) {
			eval( 'obj.' + fn + '(ajax.responseText)' );
		}
	 };
	ajax.send(null);
}
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);
}
function timeout(trigger_id) {
	this.trigger_id = trigger_id;
	this.init = function(el,args) {
		this.el = el;
		eval( "setTimeout('g_triggers[" + this.trigger_id + "].go()', parseInt(args)*1000)" );
	}
	this.go = function() {
		this.bg = document.createElement('DIV');
		calc_window_dimensions(); // sets up window_width & window_height
		this.bg.className = 'timeout-screen';
		this.bg.style.width = this.el.offsetWidth + 'px';
		this.bg.style.height = this.el.offsetHeight + 'px';
		this.bg.style.position = 'absolute';
		this.bg.style.top = findPosY(this.el) + 'px';
		this.bg.style.left = findPosX(this.el) + 'px';
		this.bg_opacity = 0;
		eval( "setTimeout('g_triggers[" + this.trigger_id + "].fadebg()', 1000)" );
		document.getElementById('container').appendChild(this.bg);
		this.popup = document.createElement('DIV');
		this.popup.className = 'popup-quotebox';
		// .popup-quotebox width/height are 458/308 (it would be preferable to measure this)
		this.popup.style.top = (findScreenPosY(this.el) + (this.el.offsetHeight-308)/2) + 'px';
		this.popup.style.left = (findScreenPosX(this.el) + (this.el.offsetWidth-458)/2) + 'px';
		
		var titlebar = document.createElement('DIV');
		titlebar.className = 'popup-titlebar';
		this.caption = document.createElement('DIV');
		this.caption.className = 'popup-caption';
		this.caption.innerHTML = 'Session timeout';
		
		this.content = document.createElement('DIV');
		this.content.className = 'quotebox-content';
		this.content.innerHTML = '<img src="/_img/comparison/indicator.gif">';
		
		titlebar.appendChild(this.caption);
		this.popup.appendChild(titlebar);
		this.popup.appendChild(this.content);
		
		document.getElementById('container').appendChild(this.popup);
		var url = document.location.toString().split(/\?/)[0];
		ajax_callback( appendQuery(url, 'js=quotebox&do=timeout') , this, 'insert')
	
		var nav = document.getElementById('nav');
		var as = nav.getElementsByTagName('A');
		for( var i=0; i<as.length; i++ ) {
			addClass(as[i],'disable');
		}
	}
	this.fadebg = function() {
		this.bg_opacity = this.bg_opacity + 0.05;
		if( this.bg_opacity > 0.95 ) {
			return;
		}
		this.bg.style.filter = 'alpha(opacity=' + (this.bg_opacity*100) + ')';
		this.bg.style.MozOpacity = this.bg_opacity;
		this.bg.style.opacity = this.bg_opacity;
		eval( "setTimeout('g_triggers[" + this.trigger_id + "].fadebg()', 10)" );
	}

	this.insert = function(text) {
		lines = text.split( /\n/ );
		this.caption.innerHTML = lines[0];
		delete lines[0];
		this.content.innerHTML = lines.join('\n');
	}
}
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 appendQuery( url, qs )
{
	return url + (url.match(/\?/) ? '&' : '?') + qs;
}

var g_comp_pager_list = Array();
var g_comp_page_adder = false;
var g_comp_pager_col0 = -1;
var g_comp_pager_col1 = -1;
var g_comp_pager_col2 = -1;
var g_comp_pager_col_last = -1;
var g_comp_pager_col_last2 = -1;
function comp_page_add(trigger_id) {
	this.trigger_id = trigger_id;
	this.init = function(el,args) {
		g_comp_page_adder = this;
		this.el = el;
		this.el.trigger = this;
		this.target = document.getElementById(args.split(/,/)[0]);
		this.pager = document.getElementById(args.split(/,/)[1]);
		this.table = document.getElementById(args.split(/,/)[2]);
		this.thumb_limit = parseInt(args.split(/,/)[3]);
		this.column = args.split(/,/)[1];
		eval( "el.onclick = function(e) {g_triggers[" + this.trigger_id + "].onclick(e); return false;}" );
	};
	this.onclick = function(e) {
// 		alert(this.target.options[this.target.selectedIndex].value);
		var fund = this.target.options[this.target.selectedIndex].value;
		if( fund == '' ) return;
		for( var i=0; i<g_comp_pager_list.length; i++ ) {
			if( g_comp_pager_list[i].value == fund ) {
				this.moveto(i);
				return false;
			}
		}
		if( g_comp_pager_list.length >= this.thumb_limit ) {
			// button should have been disabled anyway
			return false;
		}
		
		var i = g_comp_pager_list.length;
		var title = '';
		for( var j=0; j<this.target.options.length; j++ ) {
			if( this.target.options[j].value == this.target.options[this.target.selectedIndex].value ) {
				title = title + this.target.options[j].text;
			}
		}
		g_comp_pager_list[i] = {
			pos: i,
			value: this.target.options[this.target.selectedIndex].value,
			title: title.replace( /…/g, '' ),
			table: this.table,
			col: false
			};
		
		var lis = this.pager.getElementsByTagName('LI');
		var li = lis[i];
		var a = document.createElement('A');
		a.setAttribute( 'title', g_comp_pager_list[i].title );
		a.innerHTML = (g_comp_pager_list[i].pos + 1).toString();
		eval( "a.onclick = function(e) {g_triggers[" + this.trigger_id + "].onpageclick(e," + i + "); return false;}" );
// 		alert( a.innerHTML );
		li.appendChild( a );
// 		alert( this.pager.innerHTML );
		this.redraw_pager( i );
// 		this.moveto(i);
		if( g_comp_pager_list.length >= this.thumb_limit ) {
			addClass(this.el, 'disable');
			return false;
		}
		return false;
	};
	this.onpageclick = function(e,pos) {
// 		alert( pos );
// 		alert( g_comp_pager_list[pos].title );
	
// 		alert(g_comp_pager_list[pos].table);
// 		var table_trigger = g_comp_pager_list[pos].table.getAttribute('trigger');
// 		var col = new comptable_column(g_triggers[table_trigger], g_comp_pager_list[pos].value );
// 		col.load(1);
		this.moveto(pos);
	};
	this.moveto = function(pos) {
		if( pos< 0 ) return;
		if( pos==g_comp_pager_col0 || pos==g_comp_pager_col1 || pos==g_comp_pager_col2 ) return;
		if( pos>=g_comp_pager_list.length ) {
			pos = g_comp_pager_list.length-1;
			if( pos<0 ) {
				g_triggers[this.table.getAttribute('trigger')].remove(1);
				return;
			}
		}
		var table_trigger = g_comp_pager_list[pos].table.getAttribute('trigger');
// 		alert( 'moveto('+pos+')');
// 		alert( pos + ' ' + (typeof g_comp_pager_list[pos].col) );
		var colnum = -1;
		
// 		alert( 'col0:' + g_comp_pager_col0 + ' col1:' + g_comp_pager_col1  + '  col2:' + g_comp_pager_col2 + ' pos:' + pos );
// 			alert( g_comp_pager_col_last + ' ' + g_comp_pager_col_last2 );
		if( !this.lock_col0 )
		{
			if( g_comp_pager_col0<0 ) {
// 				alert('g_comp_pager_col0<0');
				g_comp_pager_col0 = pos;
				colnum = 0;
			} else if( g_comp_pager_col1<0 ) {
// 				alert('g_comp_pager_col1<0');
				g_comp_pager_col1 = pos;
				colnum = 1;
			} else if( g_comp_pager_col2<0 ) {
// 				alert('g_comp_pager_col2<0');
				g_comp_pager_col2 = pos;
				colnum = 2;
			} else if( pos >= g_comp_pager_col2 ) {
// 				alert('pos >= g_comp_pager_col2');
				if( g_comp_pager_col_last== 2 ) {
					if( g_comp_pager_col_last2== 1) {
						g_comp_pager_col0 = g_comp_pager_col1;
					}
					g_comp_pager_col1 = g_comp_pager_col2;
					g_comp_pager_col_last = 1;
				} else if( g_comp_pager_col_last2==2) {
					g_comp_pager_col1 = g_comp_pager_col2;
					g_comp_pager_col_last = 1;
				}
				g_comp_pager_col2 = pos;
				colnum = 2;
			} else if( pos <= g_comp_pager_col0 ) {
// 				alert('pos <= g_comp_pager_col0');
				if( g_comp_pager_col_last== 0 ) {
					if( g_comp_pager_col_last2==1 ) {
						g_comp_pager_col2 = g_comp_pager_col1;
					}
					g_comp_pager_col1 = g_comp_pager_col0;
					g_comp_pager_col_last = 1;
				} else if( g_comp_pager_col_last2==0) {
					g_comp_pager_col1 = g_comp_pager_col0;
					g_comp_pager_col_last = 1;
				}
				g_comp_pager_col0 = pos;
				colnum = 0;
			} else  {
// 				alert('pos >= g_comp_pager_col1');
				if( (g_comp_pager_col_last==0 && g_comp_pager_col_last2==2) ||
					(g_comp_pager_col_last==2 && g_comp_pager_col_last2==0) ) {
					g_comp_pager_col1 = pos;
					colnum = 1;
				} else if( (g_comp_pager_col_last==0 && g_comp_pager_col_last2==1)) {
					g_comp_pager_col2 = g_comp_pager_col1;
					g_comp_pager_col1 = pos;
					colnum = 1;
				} else if( (g_comp_pager_col_last==2 && g_comp_pager_col_last2==1) ) {
					g_comp_pager_col0 = g_comp_pager_col1;
					g_comp_pager_col1 = pos;
					colnum = 1;
				} else if ( (g_comp_pager_col_last==1 && g_comp_pager_col_last2==0) ) {
					g_comp_pager_col2 = pos;
					colnum = 2;
				} else if ( (g_comp_pager_col_last==1 && g_comp_pager_col_last2==2) ) {
					g_comp_pager_col0 = pos;
					colnum = 0;
				} else {
					alert( g_comp_pager_col_last + ' ' + g_comp_pager_col_last2 );
				}
			} 
			g_comp_pager_col_last2 = g_comp_pager_col_last; 
			g_comp_pager_col_last = colnum;
		}
		else
		{
			if( g_comp_pager_col1<0 ) {
				g_comp_pager_col1 = pos;
				colnum = 1;
			} else if( pos >= g_comp_pager_col2 ) {
				if( g_comp_pager_col_last==2 ) {
					g_comp_pager_col1 = g_comp_pager_col2;
				}
				g_comp_pager_col2 = pos;
				colnum = 2;
			} else if( pos <= g_comp_pager_col1 ) {
				if( g_comp_pager_col_last==1 ) {
					g_comp_pager_col2 = g_comp_pager_col1;
				}
				g_comp_pager_col1 = pos;
				colnum = 1;
			} else if( g_comp_pager_col_last==1 ) {
				g_comp_pager_col2 = pos;
				colnum = 2;
			} else {
				g_comp_pager_col1 = pos;
				colnum = 1;
			}
			g_comp_pager_col_last = colnum;
		}
// 		alert( 'col1:' + g_comp_pager_col1  + '  col2:' + g_comp_pager_col2 );

		if( g_comp_pager_col0>=0 ) {
			if( typeof g_comp_pager_list[g_comp_pager_col0].col == 'object')
			{
				g_comp_pager_list[g_comp_pager_col0].col.trig.insert( g_comp_pager_list[g_comp_pager_col0].col, 0, g_comp_pager_col0+1 );
			}
			else
			{
				var col = g_comp_pager_list[g_comp_pager_col0].col = new comptable_column(g_triggers[table_trigger], g_comp_pager_list[g_comp_pager_col0].value );
				g_triggers[this.table.getAttribute('trigger')].remove(0);
				col.load(0,g_comp_pager_col0+1);
			}
		}
		if( g_comp_pager_col1>=0 ) {
			if( typeof g_comp_pager_list[g_comp_pager_col1].col == 'object')
			{
				g_comp_pager_list[g_comp_pager_col1].col.trig.insert( g_comp_pager_list[g_comp_pager_col1].col, 1, g_comp_pager_col1+1 );
			}
			else
			{
				var col = g_comp_pager_list[g_comp_pager_col1].col = new comptable_column(g_triggers[table_trigger], g_comp_pager_list[g_comp_pager_col1].value );
				g_triggers[this.table.getAttribute('trigger')].remove(1);
				col.load(1,g_comp_pager_col1+1);
			}
		}
		if( g_comp_pager_col2>=0 ) {
			if( typeof g_comp_pager_list[g_comp_pager_col2].col == 'object')
			{
				g_comp_pager_list[g_comp_pager_col2].col.trig.insert( g_comp_pager_list[g_comp_pager_col2].col, 2, g_comp_pager_col2+1 );
			}
			else
			{
				var col = g_comp_pager_list[g_comp_pager_col2].col = new comptable_column(g_triggers[table_trigger], g_comp_pager_list[g_comp_pager_col2].value );
				g_triggers[this.table.getAttribute('trigger')].remove(2);
				col.load(2,g_comp_pager_col2+1);
			}
		}
		var lis = this.pager.getElementsByTagName('li');
		for( var i=0; i<lis.length; i++ ) {
			if( i==g_comp_pager_col0 ||  i==g_comp_pager_col1 || (i==g_comp_pager_col2) ) {
				addClass( lis[i], 'active' );
			} else {
				delClass( lis[i], 'active' );
			}
		}
		
		if( g_comp_pager_list.length < this.thumb_limit ) {
			delClass(this.el, 'disable');
		}
		
		var url = document.location.toString();
		url = appendQuery(url, 'js=log');
		if( g_comp_pager_col0>=0 ) {
			url = appendQuery(url,encodeURIComponent('fund[]') + '=' + encodeURIComponent(g_comp_pager_list[g_comp_pager_col0].value));
		}
		if( g_comp_pager_col1>=0 ) {
			url = appendQuery(url,encodeURIComponent('fund[]') + '=' + encodeURIComponent(g_comp_pager_list[g_comp_pager_col1].value));
		}
		if( g_comp_pager_col2>=0 ) {
			url = appendQuery(url,encodeURIComponent('fund[]') + '=' + encodeURIComponent(g_comp_pager_list[g_comp_pager_col2].value));
		}
		ajax_callback( url, this, 'log_callback');
		
		return;
	}
	this.log_callback = function(s){ /* ignored */ };
	
	this.redraw_pager = function(thumbnail) {
		this.pager.innerHTML = '';
		for( var i=0; i<this.thumb_limit; i++ ) {
			var li = document.createElement('LI');
			var a = document.createElement('A');
			if( i<g_comp_pager_list.length ) {
				a.href='';
				a.setAttribute( 'title', g_comp_pager_list[i].title );
				a.innerHTML = (g_comp_pager_list[i].pos + 1).toString();
				eval( "a.onclick = function(e) {g_triggers[" + this.trigger_id + "].onpageclick(e," + i + "); return false;}" );
				if( i==g_comp_pager_col0 || i==g_comp_pager_col1 || i==g_comp_pager_col2 ) {
					addClass( li, 'active' );
				}
	// 		alert( a.innerHTML );
			}
			else {
				addClass( li, 'empty' );
			}
			li.appendChild( a );
			this.pager.appendChild( li );
		}
		if( g_comp_pager_list.length==0 ) {
			addClass(document.getElementById('printlink'),'disable');
			addClass(document.getElementById('emaillink'),'disable');
		} else {
			delClass(document.getElementById('printlink'),'disable');
			delClass(document.getElementById('emaillink'),'disable');
		}
		this.moveto(thumbnail);
	}
	
	this.remove = function(thumbnail) {
// 		alert( 'remove(' + thumbnail + ')' );
		var comp_pager_list = Array();
		for( var i=0,j=0; i<g_comp_pager_list.length; i++ ) {
			if( i!=thumbnail ) {
				comp_pager_list[j] = g_comp_pager_list[i];
				comp_pager_list[j].pos = j;
				j++;
			}
		}
		delete g_comp_pager_list;
		g_comp_pager_list = comp_pager_list;
		if( thumbnail==g_comp_pager_col0 ) {
			g_comp_pager_col0 = g_comp_pager_col1 -1;
			g_comp_pager_col1 = g_comp_pager_col2 -1;
			g_comp_pager_col2 = -1;
			g_comp_pager_last = 0;
			g_triggers[this.table.getAttribute('trigger')].remove(0);
			g_triggers[this.table.getAttribute('trigger')].remove(1);
			g_triggers[this.table.getAttribute('trigger')].remove(2);
			this.redraw_pager(-1);
			g_comp_pager_col0 = -1;
			this.moveto(thumbnail);
		} else if( thumbnail==g_comp_pager_col1 ) {
			g_comp_pager_col1 = g_comp_pager_col2 -1;
			g_comp_pager_col2 = -1;
			g_comp_pager_last = 0;
			g_triggers[this.table.getAttribute('trigger')].remove(1);
			g_triggers[this.table.getAttribute('trigger')].remove(2);
			this.redraw_pager(-1);
			g_comp_pager_col1 = -1;
			this.moveto(thumbnail);
		} else {
			g_comp_pager_col2 = -1;
			g_comp_pager_last = 0;
			g_triggers[this.table.getAttribute('trigger')].remove(2);
			this.redraw_pager(-1);
		}
	}
}

function comptable_column(trig, id) {
	this.trig = trig;
	this.id = id;
	this.cells = Array();
	
	this.load = function( column, thumbnail ) {
// 		alert( 'load('+column+','+thumbnail+')');
		var xhr = new AJAX();
		var that = this;
		this.trig.set_loading( column );
		xhr.onreadystatechange = function() {
			if( xhr.readyState == 4 )
			{
				try
				{
					x_ajax = xhr.getResponseHeader( 'x-ajax' );
				}
				catch(e)
				{
					return;
				}
				if( xhr.responseText == '' )
				{
					return;
				}
				that.cells = xhr.responseXML;
				that.trig.insert( that, column, thumbnail );
			};
		};
		xhr.open( "GET", appendQuery(document.location.toString(), 'js=comptable&id=' + encodeURIComponent(id) ) );
		xhr.send(null);
	}
	
	this.clear = function( column ) {
		this.trig.remove( column );
	}
}

function xml2str(xml)
{
	var s='';
	for( var i=0; i<xml.childNodes.length; i++ )
	{
		var n = xml.childNodes[i];
		if( n.nodeName=='#text' ) {
			s += n.nodeValue;
		} else {
			s += "<" + n.nodeName;
			for( var j=0; j<n.attributes.length; j++ ) {
				s += " " + n.attributes[j].name + "=\"" + n.attributes[j].value + "\"";
			}
			s += ">" + xml2str(n) + "</" + n.nodeName + ">";
		}
	}
	return s;
}
function comptable( trigger_id )
{
	this.trigger_id = trigger_id;
	this.init = function(el,args) {
		this.el = el;
		this.cols = Array();
		el.setAttribute( 'trigger', this.trigger_id );
		
		args = args.split(/,/);
		this.fund = args[0];
		this.head = document.getElementById(args[1]);
		this.ncols = (args.length>2 ? args[2] : 3 );
		
		var headcells = this.head.getElementsByTagName('td');
		this.emptyhead = Array(); // stores what empty column headers contain originally
		for( var i=0; i<this.ncols; i++ ) {
			this.emptyhead[i] = headcells[i].innerHTML;
		}
		
		eval( "setTimeout( 'g_triggers[" + this.trigger_id + "].init2()', 0)" );
	}
	this.init2 = function() {
		g_comp_page_adder.lock_col0 = (this.fund!='none');
		if( g_comp_page_adder.lock_col0 ) {
			var new_col = new comptable_column(this,this.fund);
			this.cols[this.cols.length] = new_col;
			new_col.load(0,0);
		}
		g_comp_page_adder.redraw_pager(-1);
	}
	this.insert = function ( col, column, thumbnail ) {
		var cells_ix = 0;
		if( typeof col.cells.childNodes == 'undefined' ) return;
		while( col.cells.childNodes[cells_ix].nodeName != 'cells' && cells_ix<col.cells.childNodes.length ) {
			cells_ix++; // IE workaround
		}
		var header = col.cells.childNodes[cells_ix].getElementsByTagName("header");
		var cells = col.cells.childNodes[cells_ix].getElementsByTagName("cell");
		
		var headcells = this.head.getElementsByTagName('td');
		headcells[column].innerHTML = xml2str(header[0]);
		if( thumbnail>0 ) {
			headcells[column].innerHTML = headcells[column].innerHTML.replace( /<div class="?col-number"?><\/div>/i, "<div class=\"col-number\">" + (thumbnail) +"</div>" );
		} else {
			headcells[column].innerHTML = headcells[column].innerHTML.replace( /<div class="?col-number"?><\/div>/i, "<div class=\"col-number-spacer\"><\/div>" );
		}
		
		this.el.parentNode.style.display = 'none';
		for( var i=0; i<cells.length; i++ )
		{
			
			switch( cells[i].getAttribute('name') ) 
			{
			default:
				if( i>=this.el.rows.length ) {
					this.el.insertRow(i);
				}
				
				var tr = this.el.rows[i];
				while( tr.cells.length < this.ncols ) {
					tr.insertCell( tr.cells.length );
					addClass( tr.cells[tr.cells.length-1], "section " + cells[i].getAttribute('name') + " col" + tr.cells.length );
				}
				var cell = tr.cells[column];
	// 			var cell = tr.getElementsByTagName('td')[column];
				cell.innerHTML = '';
// 				cell.appendChild(cells[i]); //xml2str(cells[i]);
// 				cell.innerHTML = xml2str(cells[i]);
				if( cells[i].textContent ) {
					cell.innerHTML = cells[i].textContent;
				} else if( cells[i].text ) {
					cell.innerHTML = cells[i].text;
				} else {
					cell.innerHTML = xml2str(cells[i]);
				}
// 				addClass( cell, "section " + cells[i].getAttribute('name') );
				break;
			}
		}
		this.el.parentNode.style.display = 'block';
		triggers(document);
		delClass( headcells[column], 'loading' );
	}
	this.remove = function( column ) {
		var headcells = this.head.getElementsByTagName('td');
		headcells[column].innerHTML = this.emptyhead[column];
		for( var i=0; i< this.el.rows.length; i++ ) {
			var cell = this.el.rows[i].cells[column];
			if( typeof cell == 'object' ) {
				cell.innerHTML = '<div class="section_control"></div>';
			}
		}
	}
	this.set_loading = function( column ) {
		var headcells = this.head.getElementsByTagName('td');
		headcells[column].innerHTML = '<div></div>';
		addClass( headcells[column], 'loading' );
	}
}

function col_remove(trigger_id)
{
	this.trigger_id = trigger_id;
	this.init = function(el,args) {
		if( g_comp_page_adder.lock_col0 && hasClass(el.parentNode.parentNode,'col1') ) {
			el.parentNode.removeChild(el);
			return;
		}
		this.el = el;
		this.el.setAttribute('title', 'Remove Fund');
		eval( "el.onclick = function(e) {g_triggers[" + this.trigger_id + "].onclick(e," + i + "); return false;}" );
	}
	this.onclick = function(e) {
		var active = -1;
		if( hasClass(this.el.parentNode.parentNode,'col1' ) ) {
			active = g_comp_pager_col0;
		}
		if( hasClass(this.el.parentNode.parentNode,'col2' ) ) {
			active = g_comp_pager_col1;
		}
		if( hasClass(this.el.parentNode.parentNode,'col3' ) ) {
			active = g_comp_pager_col2;
		}
		if( active<0 ) {
			return;
		}
		g_comp_page_adder.remove( active );
	}
}

function hasClass( el, className )
{
	var regex = new RegExp("\\b"+className+"\\b");
	return regex.exec( el.className );
}

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;
	}
}

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/comparison/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');
	}
}

var g_section_state = Object();
function section_control( trigger_id )
{
	this.trigger_id = trigger_id;
	this.init = function(el, args) {
		this.el = el;
		this.args = args;
		this.a = document.createElement('a');
		this.a.className = 'section-control';
		this.a.title = 'Close section';
		eval( "this.a.onclick = function(e) { g_triggers[" + this.trigger_id + "].onclick(e);return false;}" );
		el.insertBefore( this.a, el.firstChild );
		
		var cs = this.el.parentNode.className.split(/ /);
		if( cs.length > 1 ) {
			this.section_name = cs[1];
			g_section_state[this.section_name] = true;
		}
		this.row = this.el.parentNode.parentNode;
		
		};
	this.onclick = function(e) {
		if( hasClass( this.row, 'hide-section' ) ) {
			g_section_state[this.section_name] = true;
			delClass( this.row, 'hide-section' );
			this.a.title = 'Close section';
		} else {
			g_section_state[this.section_name] = false;
			addClass( this.row, 'hide-section' );
			this.a.title = 'Open section';
		}
	}
}
function printlink(trigger_id)
{
	this.trigger_id = trigger_id
	this.init = function( el, args ) {
		this.el = el;
		eval( "el.onclick = function(e) {g_triggers[" + this.trigger_id + "].onclick(e); return false;}" );
	}
	this.onclick = function(e) {
		var url = this.el.href.toString();
		if( hasClass(this.el, 'disable') ) {
			return;
		}
		if( g_comp_pager_col0>=0 ) {
			url = appendQuery(url, encodeURIComponent('fund[]') + '=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col0].value ) );
		}
		if( g_comp_pager_col1>=0 ) {
			url = appendQuery(url, encodeURIComponent('fund[]') + '=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col1].value ) );
		}
		if( g_comp_pager_col2>=0 ) {
			url = appendQuery(url, encodeURIComponent('fund[]') + '=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col2].value ) );
		}
		url = appendQuery(url, encodeURIComponent('section[]') + '=' + encodeURIComponent('header'));
		for( var i in g_section_state ) {
			if( g_section_state[i] ) {
				url = appendQuery(url, encodeURIComponent('section[]') + '=' + encodeURIComponent(i));
			}
		}
		window.open( url, 'print' );
	}
}

function emaillink(trigger_id)
{
	this.trigger_id = trigger_id
	this.init = function( el, args ) {
		this.el = el;
		this.popup = false;
		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;
		}
		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;
		}
// 		alert( x_off );
		
		
		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';
		
// 		alert( "height=" + window_height + "\ny=" + ely + "\nmouse=" + e.clientY );
		
		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/comparison/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 url = this.el.href.toString();
		if( g_comp_pager_col0>=0 ) {
			url = appendQuery(url, 'fund[]=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col0].value ) );
		}
		if( g_comp_pager_col1>=0 ) {
			url = appendQuery(url, 'fund[]=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col1].value ) );
		}
		if( g_comp_pager_col2>=0 ) {
			url = appendQuery(url, 'fund[]=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col2].value ) );
		}
		ajax_callback( appendQuery(url, 'js=quotebox') , this, 'insert')
	}
	this.onclose = function(e) {
		document.getElementById('container').removeChild(this.popup);
		this.popup = false;
		g_open_quotebox = -1;
	}
	this.insert = function(text) {
		this.caption.innerHTML = this.el.innerHTML;
		this.content.innerHTML = text;
		var els = this.content.getElementsByTagName( 'A' );
		eval( "els[0].onclick = function(e) {g_triggers[" + this.trigger_id + "].clicklink(e); return false;}" );
	}
	this.clicklink = function(e) {
		var url = this.el.href.toString();
		if( g_comp_pager_col0>=0 ) {
			url = appendQuery(url, 'fund[]=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col0].value ) );
		}
		if( g_comp_pager_col1>=0 ) {
			url = appendQuery(url, 'fund[]=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col1].value ) );
		}
		if( g_comp_pager_col2>=0 ) {
			url = appendQuery(url, 'fund[]=' + encodeURIComponent( g_comp_pager_list[g_comp_pager_col2].value ) );
		}
		url = appendQuery(url, encodeURIComponent('section[]') + '=' + encodeURIComponent('header'));
		for( var i in g_section_state ) {
			if( g_section_state[i] ) {
				url = appendQuery(url, encodeURIComponent('section[]') + '=' + encodeURIComponent(i));
			}
		}
		url = appendQuery(url, 'send=1' );
		this.content.innerHTML = 'Sending ... ';
		ajax_callback( appendQuery(url, 'js=quotebox') , this, 'sent')
	}
	this.sent = function(text) {
		this.content.innerHTML = text;
		eval( "setTimeout('g_triggers[" + this.trigger_id + "].onclose()',5000)" );
	}
}

