//cls = class
//n = node
//t = tag
//this function manages to kill Opera
document.getElementsByClassName = function(cls,n,t)
{
	var rtn = [];
	n=n===null?document:n;
	t=t===null?'*':t;
	var els = n.getElementsByTagName ? n.getElementsByTagName(t) : document.all;
	els = (!els||!els.length ) && document.all ? document.all : els;
	if(cls==null){return els;}
	for (var i=0,j=0; i < els.length; i++)
	{
		if(els[i].className.match("(^|\\s)"+cls+"(\\s|$)"))
		{
			rtn[j++] = els[i];
		}
	}
	return rtn;
};

function jsfAttachEvent(obj,evt,fnc)
{
	if(window.addEventListener)
	{
		obj.addEventListener(evt, fnc, false);
	}
	else if(window.attachEvent)
	{
		obj.attachEvent('on'+evt, fnc);
	}
	else if (obj.getElementById && evt=='load')
	{
		obj.onload = fnc;
	}
}

function jsfOnLoadHideElements(jh)
{
	var jhs = document.getElementsByClassName(jh,null,null);
	for(var i=0; i<jhs.length; i++)
	{
		jhs[i].style.display="none";
	}
}

function jsfOnLoadShowElements(js)
{
	var jhs = document.getElementsByClassName(js,null,null);
	for(var i=0; i<jhs.length; i++)
	{
		jhs[i].style.display="";
	}
}

//extend an object with addition methods/properties
function jsfExtendObject(d, s)
{
	for (p in s)
	{
		d[p] = s[p];
	}
	return d;
}

function jsfOnLoadAttachHideShow(trg,hsi,hse,caf,imp,imm)
{
	//get all raw triggers
	var tgs = document.getElementsByClassName(trg,null,"a");
	
	//get all raw elements
	var elm = document.getElementsByClassName(hse,null,null);

	//for all the raw triggers with/without numbers
	var reg = new RegExp("(^|\\w*)"+hsi+"(\\d*|([\\w* ]))");
	
	//set up hide/show element attributes and methods
	for(var i=0; i<elm.length; i++)
	{
		//if i have an associated image, let me control it's hide/show
		//get all images associated with me
		elm[i] = jsfExtendObject(elm[i],
			{
				hide:function()
				{
					this.style.display = "none";
					this.hidden = true;
					for(var i=0;i<this.images.length;i++)
					{
						if(this.images[i].className.match(imp))
						{
							this.images[i].style.display==""?"none":"";
						}
						if(this.images[i].className.match(imm))
						{
							this.images[i].style.display==""?"none":"";
						}
					}
				},
				show:function()
				{
					this.style.display = "";
					this.hidden = false;
					for(var i=0;i<this.images.length;i++)
					{
						if(this.images[i].className.match(imp))
						{
							this.images[i].style.display = this.images[i].style.display==""?"none":"";
						}
						if(this.images[i].className.match(imm))
						{
							this.images[i].style.display = this.images[i].style.display==""?"none":"";
						}
					}
				},
				toggle:function()
				{
					if(this.hidden)
					{
						this.show();
					}
					else
					{
						this.hide();
					}
				},
				init:function()
				{
					this.hidden = this.style.display==""?false:true;
					this.images = document.getElementsByClassName(reg.exec(this.className)[0],null,"a");
					for(var i=0;i<this.images.length;i++)
					{
						if(this.images[i].className.match(imp))
						{
							this.images[i].style.display = this.hidden ? "none" : "";
						}
						if(this.images[i].className.match(imm))
						{
//							this.images[i].style.display="none";
							this.images[i].style.display = this.hidden ? "" : "none";
						}
					}
				},
				hidden:false,
				hsElement:true,
				images:[]
			}
		);
		elm[i].init();
	}

	//set up all the triggers with the elements
	for(var i=0; i<tgs.length; i++)
	{
		tgs[i] = jsfExtendObject(tgs[i],
			{
				onclick:function()
				{
					//get all elements that match the item class
					var els = document.getElementsByClassName(reg.exec(this.className)[0],null,null);

					//only close elements not controlled by me
					if(this.className.match(caf) && caf.length>0)
					{
						ael = document.getElementsByClassName(hse,null,null);
						for(var j=0;j<ael.length;j++)
						{
							if(ael[j].className.match(caf) && reg.exec(this.className)[0]!=reg.exec(ael[j].className)[0])
							{
								ael[j].hide();
							}
						}
					}

					for(var j=0; j<els.length; j++)
					{
						//hide/show anything that isn't the trigger
						if(els[j].hsElement)
						{
							els[j].toggle();
						}
					}
					return false;
				}
			}
		);
	}
}
function updateBalancesAnimation( event )
{
	var thisLink = this;
	if( event.srcElement && !window.addEventListener )
	{
		thisLink = event.srcElement;
	}
	//onclick - hide the current table, write the "Update balances" paragraph, keep the paragraph up on screen for 5 seconds, remove the paragraph and show the table
	var parentContainer = thisLink.parentNode.parentNode.parentNode;
	var myTable = parentContainer.getElementsByTagName( "TABLE" )[0];
	myTable.style.display = "none";
	var tableContainer = document.getElementsByClassName( "curvyBox03a", parentContainer, "DIV" )[0];
	var paraEle = document.createElement( "p" );
	paraEle.className = "loader";
	var txt = document.createTextNode( "Your account balances are being updated" );
	paraEle.appendChild( txt );
	tableContainer.appendChild( paraEle );
	function showHidden()
	{	
		paraEle.style.display = "none";
		myTable.style.display = "block";
		if( window.addEventListener )
		{
			myTable.style.display = "table";
		}
	}
	var intervalId = window.setTimeout( showHidden, 1750 );	
	if( event.preventDefault )
	{
		event.preventDefault();//need this for Firefox. 
	}
	return false;
}
/* NEW FUNCTIONS */
HsElement = {
	_hidden:false,
	_trigger:null,
	_hide:function() {
		if(!this._hidden) {
			this.style.display = 'none';
			this._hidden = true;
		}
	},
	_hideOnLoad:function() {
		this._hide();
	},
	_show:function() {
		if(this._hidden) {
			this.style.display = '';
			this._hidden = false;
		}
	},
	_toggle:function() {
		if(this._hidden) {this._show();}
		else {this._hide();}
	}
}

HsTrigger = {
	_target:null,
	_action:null,
	_fire:function() {
		this._target._toggle();
		if(this._target._hidden == true) {
			this.innerHTML = this._hiddenText;
		}
		else {
			this.innerHTML = this._shownText;
		}
		return false;
	},
	_setTarget:function(elm,action) {
		this._target = elm;
		this._action = action;
		this.style.display = '';
	}
}

HsGroup = {
	_elements:[],
	_triggers:[],
	_closeall:false,
	_alwaysopen:false,
	_init:function(hideClass) {
		for(var i=0;i<this._elements.length;i++) {
			this._elements[i] = jsfExtendObject(this._elements[i],HsElement);
			this._elements[i] = jsfExtendObject(this._elements[i],Timer);
			this._elements[i] = jsfExtendObject(this._elements[i],Slider);
			if(Core.hasClass(this._elements[i],hideClass)) {
				this._elements[i]._hideOnLoad();
			}
		}
		for(var i=0;i<this._triggers.length;i++) {
			this._triggers[i] = jsfExtendObject(this._triggers[i],HsTrigger);
			this._triggers[i]._setTarget(this._elements[i],'toggle');
			this._triggers[i]._hiddenText = this._hiddenText;
			this._triggers[i]._shownText = this._shownText;
			this._triggers[i].onclick = function() {
				this._fire();
				return false;
			}
			if(this._closeall) {
				this._triggers[i]._closegroup = this._elements;
			}
		}
	},
	_createHsGroup:function(trgClass,elmClass,closeAll,transition,alwaysOpen,hideClass,hiddenText,shownText) {
		this._triggers = document.getElementsByClassName(trgClass,document.body,'a');
		this._elements = document.getElementsByClassName(elmClass,document.body,'div');
		this._hiddenText = hiddenText;
		this._shownText = shownText;
		this._init(hideClass);
		return this;
	},
	_alert:function(str) {
		alert(str);			 
	}
}

Slider = {
	_alpha:100,
	_loaded:false,
	_slideHeight:false,
	_currentHeight:null,
	_hide:function() {
		if(!this._loaded) {
			this._setsize();
		}
		if(!this._hidden) {
			this.style.height = this._slideHeight+'px';
			this._slideOut();
		}
		this._hidden = true;
	},
	_hideOnLoad:function() {
		if(!this._loaded) {
			this._setsize();
		}
		this.style.height = '0px';
		this.style.display = 'none';
		this._hidden = true;
	},
	_show:function() {
		if(!this._loaded) {
			this._setsize();
		}
		if(this._hidden) {
			this.style.height = '0px';
			this._slideIn();
		}
		this._hidden = false;
	},
	_slideOut:function() {
		this._currentHeight = this.style.height.replace('px','');
		if(this._currentHeight > this._stepSize) {
			this.style.height = (this._currentHeight - this._stepSize)+'px';
			var timer = jsfExtendObject(new Object(),Timer);
			timer._setTimeout(this._slideOut,50,this);
		}
		else {
			this.style.height = '0px';
			this.style.display = 'none';
			this._hidden = true;
		}
	},
	_slideIn:function() {
		this.style.display = '';
		this._currentHeight = this.style.height.replace('px','');
		if(this._currentHeight < this._slideHeight - this._stepSize) {
			this.style.height = Number(this._currentHeight) + Number(this._stepSize)+'px';
			var timer = jsfExtendObject(new Object(),Timer);
			timer._setTimeout(this._slideIn,50,this);
		}
		else {
			this.style.height = this._slideHeight+'px';
			this._hidden = false;
		}
	},
	_setsize:function() {
		this._slideHeight = this.offsetHeight;
		this._stepSize = this._slideHeight / 10;
		this.style.overflow = 'hidden';
		this._loaded = true;
	}
}

Timer = {
	_parent:null,
	_int:100,
	_trg:null,
	_setTimeout:function(fnc,i,obj) {
		this._parent = obj;
		this._func = fnc;
		this._createTimeout(i);
		this._callback = function() {
			//alert(this._func);
			this._parent._respond = this._func;
			this._parent._respond();
		}
	},
	_createTimeout:function(i) {
		this._int = i;
		var elm = this;
		function step() {
			elm._callback();
		}
		var t = setTimeout(function(){step();},this._int);
	}
}
/* END NEW FUNCTIONS */

function jsfOnLoad()
{
	jsfOnLoadHideElements("jstHide");
	jsfOnLoadShowElements("jstShow");
	jsfOnLoadAttachHideShow("jstHsTrg","jstHsItem","jstHsElm","jstHideAllFirst","jstHsPlus","jstHsMinus");
			
	var formOptions = document.getElementsByClassName("jstFormOption",document,"input");
	for(var i=0;i<formOptions.length;i++)
	{
		formOptions[i] = jsfExtendObject(formOptions[i],
			{
				onclick:function()
				{
					if(this.checked)
					{
						//uncheck the rest
						for( var z=0; z<this.radioGroup.length; z++ )
						{
							this.radioGroup[z].parentNode.className=this.originalClassName;		
						}
						this.originalClassName = this.parentNode.className;
						this.parentNode.className+=" formOptionSelected01";
					}
					else
					{
						this.parentNode.className=this.originalClassName;
					}
				},
				originalClassName:"",
				radioGroup:new Array(),
				init:function()
				{
					this.originalClassName = this.parentNode.className;
					this.onclick();
					this.radioGroup = formOptions;
				}
			}
		);
		formOptions[i].init();
	}
			
	var tables = document.getElementsByTagName("table");
	for(var i=0;i<tables.length;i++)
	{
		var rows = tables[i].getElementsByTagName("tr");
		for(var j=0;j<rows.length;j++)
		{
			if(!(j % 2))
			{
				rows[j].className = "row01";
			}
		}
	}
	
	var formOptions = document.getElementsByClassName("formOption", document, "DIV" );
	if(formOptions.length>0)
	{
		formOptions[0].className+=" formOption01";
	}
	
	var updateList = document.getElementsByClassName( "jsUpdateBalances", document, "A" );
	if( updateList.length > 0 )
	{
		//give every link an onclick function
		for( var listIndex=0; listIndex<updateList.length; listIndex++ )
		{
			jsfAttachEvent( updateList[listIndex], "click", updateBalancesAnimation );
		}
	}
	
	if( document.getElementById( "jsRetrieve" ) )
	{
		var mainContent = document.getElementById( "jsRetrieve" );	
		var mainContentContainer = mainContent.parentNode;
		mainContent.style.display = "none";
		var paraEle = document.createElement( "p" );
		paraEle.className = "loader extRetrieve";
		var txt = document.createTextNode( "Your accounts are being retrieved...." );
		paraEle.appendChild( txt );
		mainContentContainer.appendChild( paraEle );
		function showHidden()
		{	
			paraEle.style.display = "none";
			mainContent.style.display = "block";		
		}
		var intervalId = window.setTimeout( showHidden, 1750 );	
	}
	/* NEW JS */
	var hsGroup = HsGroup._createHsGroup('lmHSTrigger1','lmHSBlock1',false,'none',false,'jsHide','View details','Hide details');
}

jsfAttachEvent(window,'load',jsfOnLoad);			

