function enlarge_image(myimage, imgtitle)
{
	html = "<HTML><HEAD><TITLE>"+ imgtitle + "</TITLE>" 
			+ "</HEAD><BODY LEFTMARGIN=0 " 
			+ "MARGINWIDTH=0 TOPMARGIN=0 MARGINHEIGHT=0><CENTER>" 
			+ "<IMG SRC='" + myimage + "' BORDER=0 NAME=image " 
			+ "onload='window.resizeTo((document.image.width)+100,(document.image.height)+100)'>"
			+ "</CENTER>" 
			+ "</BODY></HTML>";
	popup = window.open ('','image',
						 'height=1, width=1, titlebar=0,status=0,toolbar=0,location=0,directories=0,menuBar=0,scrollbars=0,resizable=0');
	popup.document.open();
	popup.document.write(html);
	popup.document.focus();
	popup.document.close()
}

function get_window_width()
{
        var x = 0;
        if (self.innerHeight)
        {
                x = self.innerWidth;
        }
        else if (document.documentElement && document.documentElement.clientHeight)
        {
                x = document.documentElement.clientWidth;
        }
        else if (document.body)
        {
                x = document.body.clientWidth;
        }
        return x;
}

function get_window_height()
{
        var y = 0;
        if (document.body)
        {
                y = document.body.clientHeight;
        }
        else if (document.documentElement && document.documentElement.clientHeight)
        {
                y = document.documentElement.clientHeight;
        }
        else if (self.innerHeight)
        {
                y = self.innerHeight;
        }
        return y;
}
 
function __get_window_height()
{
        var y = 0;
        if (self.innerHeight)
        {
            y = self.innerHeight;
        }
        else if (document.documentElement && document.documentElement.offsetHeight)
        {
            y = document.documentElement.offsetHeight;
        }
        else if (document.body)
        {
            y = document.body.offsetHeight;
        }
        return y;
}

function get_pageScrollTop()
{
	switch(navigator.appName)
	{
	  case 'Microsoft Internet Explorer':
		// var myregex = /MSIE 7\.0/i;
		var myArray = navigator.appVersion.match(/MSIE ([\d.]+)/)[1];
		
		if (myArray.length > 0)
		{
			scrollY = document.documentElement.scrollTop;
		}
		else
		{
			scrollY = document.body.scrollTop;
		}
	  break;
	  default:
		scrollY = window.pageYOffset;
	}
	
	return scrollY;
}
	  
function msgbox_show(link_yes, question, description, default_buttons)
{
	if (typeof(default_buttons) == 'undefined')
	{
		default_buttons = true;
	}
	
	if (!default_buttons)
	{
		document.getElementById('msgbox_yes').style.display = 'none';
		document.getElementById('msgbox_no').style.display = 'none';
	}
	else
	{
		document.getElementById('msgbox_yes').style.display = '';
		document.getElementById('msgbox_no').style.display = '';
	}
	
	var msgbox_bg = document.getElementById('msgbox_background');
	var msgbox 	  = document.getElementById('msgbox');
	
	/* Notice: must use px in order to work on both ff/ie */
	msgbox_bg.style.width  = get_window_width() + 'px';
	msgbox_bg.style.height = get_window_height() + 'px';
	msgbox_bg.style.left   = '0px';
	msgbox_bg.style.top    = '0px';
	
	p_top = get_pageScrollTop() + 200;
	
	p_left = (document.body.scrollWidth/2)-250;
	msgbox.style.top  = p_top + 'px';
	msgbox.style.left = p_left + 'px';
	
	document.getElementById('msgbox_question').innerHTML = question;
	document.getElementById('msgbox_description').innerHTML = description;
	document.getElementById('msgbox_yes').onclick = function() { document.location.href = link_yes; };
	
	flip_class(msgbox_bg, 'msgbox_mask', 'msgbox_hide');
	flip_class(msgbox, 'msgbox', 'msgbox_hide');
}

var msgbox_reload = false;
function msgbox_hide()
{
	var msgbox_bg = document.getElementById('msgbox_background');
	var msgbox 	  = document.getElementById('msgbox');
	
	msgbox_bg.className  = 'msgbox_hide';
	msgbox.className 	 = 'msgbox_hide';

	document.getElementById('msgbox_question').innerHTML = '';
	document.getElementById('msgbox_description').innerHTML = '';
	
	if (msgbox_reload)
	{
		top.location.reload();
	}
}

function msgbox_show_iframe(iframe_src)
{
	document.getElementById('msgbox_yes').style.display = 'none';
	document.getElementById('msgbox_no').style.display = 'none';
	
	var msgbox_bg = document.getElementById('msgbox_background');
	var msgbox 	  = document.getElementById('msgbox');
	
	/* Notice: must use px in order to work on both ff/ie */
	msgbox_bg.style.width  = get_window_width() + 'px';
	msgbox_bg.style.height = get_window_height() + 'px';
	msgbox_bg.style.left   = '0px';
	msgbox_bg.style.top    = '0px';
	
	p_top = get_pageScrollTop() + 200;
	p_left = (document.body.scrollWidth/2)-250;
	msgbox.style.top  = p_top + 'px';
	msgbox.style.left = p_left + 'px';
	
	document.getElementById('msgbox_description').innerHTML = '<iframe src="" id="msgbox_iframe" class="msgbox_iframe"></iframe>';
	var msgbox_iframe_page = document.getElementById('msgbox_iframe');
	msgbox_iframe_page.src = iframe_src;
	
	flip_class(msgbox_bg, 'msgbox_mask', 'msgbox_hide');
	flip_class(msgbox, 'msgbox', 'msgbox_hide');
	
	msgbox_reload = true;
}

/* xmlhttp object */
var page_request = false;
	
function ajax_request(url, async, event_name)
{
	if (typeof(async) == 'undefined')
	{
		async = false;
	}

	if (window.XMLHttpRequest) // if Mozilla, Safari etc
		page_request = new XMLHttpRequest()
	else if (window.ActiveXObject)
	{ // if IE
		try
		{
			page_request = new ActiveXObject("Msxml2.XMLHTTP");
		} 
		catch (e)
		{
			try
			{
				page_request = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (e) {}
		}
	}
	else
		return false
	
	if (async)
	{
		page_request.onreadystatechange = event_name;
	}
	
	page_request.open('GET', url, async);
	page_request.send(null);
	
	if (!async)
	{
		return page_request.responseText;
	}
}

function ajax_loader(url, div_id, loader_id)
{
	document.getElementById(loader_id).style.display = '';
	div_element = document.getElementById(div_id);
	
	if (div_element.innerHTML == '')
	{
		callback = function()
		{
			 if (page_request.readyState == 4)
			{
				div_element.innerHTML = page_request.responseText;
				document.getElementById(loader_id).style.display = 'none';
			}

		}
		
		ajax_request(url, true, callback);
	}
}

function ajax_iframe_loader(url, div_id, loader_id)
{
	document.getElementById(loader_id).style.display = '';
	iframe_element = document.getElementById(div_id);
	
	iframe_element.style.display = '';
	iframe_element.src = url;
}

function input_focus(input_element)
{
	input_element = document.getElementById(input_element);
	input_element.focus();
}

String.prototype.trim = function()
{
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function()
{
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function()
{
	return this.replace(/\s+$/,"");
}

function isNumeric(input)
{
	return (input - 0) == input && input.length > 0;
}

function var_dump(obj) {
   if(typeof obj == "object") {
      return "Type: "+typeof(obj)+((obj.constructor) ? "\nConstructor: "+obj.constructor : "")+"\nValue: " + obj;
   } else {
      return "Type: "+typeof(obj)+"\nValue: "+obj;
   }
}

//TODO+: not in use, remove?
function post_to_url(path, params, target, method) 
{ 
    target = target || "_self";
    method = method || "post"; // Set method to post by default, if not specified. 
 
    // The rest of this code assumes you are not using a library. 
    // It can be made less wordy if you use one. 
    var form = document.createElement("form"); 
    form.setAttribute("target", target); 
    form.setAttribute("method", method); 
    form.setAttribute("action", path); 
 
    for(var key in params) { 
        var hiddenField = document.createElement("input"); 
        hiddenField.setAttribute("type", "hidden"); 
        hiddenField.setAttribute("name", key); 
        hiddenField.setAttribute("value", params[key]); 
 
        form.appendChild(hiddenField); 
    } 
 
    document.body.appendChild(form);    // Not entirely sure if this is necessary 
    form.submit(); 
} 

function flip_class(element, class1, class2)
{
	if (element.className == class1)
	{
		element.className = class2;
	}
	else
	{
		element.className = class1;
	}
}

function display_element(element_id, inner_html) 
{
	var obj_element = document.getElementById(element_id).style;
	var obj_html	= document.getElementById(inner_html);
	if (obj_element.display != "none" )
	{
		obj_element.display = "none";
		if (typeof(inner_html) != 'undefined')
		{
			obj_html.innerHTML = '<img src="http://img.rankranger.com/web/myrankranger/folder_close.gif" align="absmiddle">';
		}
	}
	else
	{
		obj_element.display = "";
		if (typeof(inner_html) != 'undefined')
		{
			obj_html.innerHTML = '<img src="http://img.rankranger.com/web/myrankranger/folder_open.gif" align="absmiddle">';
		}
	}	 
}

function display_element_force(element_id, status) 
{
	var obj_element = document.getElementById(element_id).style;
	
	if (status == true)
	{
		obj_element.display = "none";
	}
	else
	{
		obj_element.display = "";
	}	 
}

function swap_images(element_id, img1, img2)
{
	var obj_element = document.getElementById(element_id);
	if (obj_element.src == img1)
	{
		obj_element.src = img2;
	}
	else
	{
		obj_element.src = img1;
	}	 
}

function swap_hd1(obj_element, element_img)
{
	img1 = 'http://img.rankranger.com/web/home_design/'+element_img+'.jpg';
	img2 = 'http://img.rankranger.com/web/home_design/'+element_img+'_on.jpg';
	if (obj_element.src == img1)
	{
		obj_element.src = img2;
	}
	else
	{
		obj_element.src = img1;
	}	 
}

function setCookie(c_name,value)
{
	var expiredays = 30;
	var exdate=new Date();
	exdate.setDate(exdate.getDate()+expiredays);
	document.cookie=c_name+ "=" +escape(value)+
	((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

function getCookie(c_name)
{
	if (document.cookie.length>0)
	  {
	  c_start=document.cookie.indexOf(c_name + "=");
	  if (c_start!=-1)
		{
		c_start=c_start + c_name.length+1;
		c_end=document.cookie.indexOf(";",c_start);
		if (c_end==-1) c_end=document.cookie.length;
		return unescape(document.cookie.substring(c_start,c_end));
		}
	  }
	return "";
}

/* Form functions */
function FormSubmit(form_id, target)
{ 
	var myForm = document.getElementById(form_id);
	var dateForm = document.getElementById('DateForm');
	
	if (typeof(target) == 'undefined')
	{
		target = '_self';
	}
	myForm.target = target;
	
	if (typeof(dateForm.from_date) != 'undefined')
	{
		myForm.from_date.value = dateForm.from_date.value;
	}
	myForm.to_date.value 	 = dateForm.to_date.value;
	myForm.submit();
	myForm.target = '_self';
}

function FormSortSubmit(form_id, sort_by_value, sort_type_value, target)
{ 
	var myForm = document.getElementById(form_id);
	
	if (typeof(target) != 'undefined')
	{
		myForm.target 	 = target;
	}
	
	myForm.sort_by.value   = sort_by_value;
	myForm.sort_type.value = sort_type_value;
	
	myForm.submit();
	myForm.target = '_self';
}

function FormPageAction(form_id, action_name, export_value, target)
{ 
	var myForm = document.getElementById(form_id);
	original_action = myForm.action;
	original_target = myForm.target;
	
	if (typeof(target) != 'undefined')
	{
		myForm.target = target;
	}
	
	myForm.action  = action_name + '&t=' + export_value;
	myForm.export_type.value = export_value;
	myForm.submit();
	myForm.action  = original_action;
	myForm.target  = original_target;
}

/* fade functions */
var _fade_duration = 1000;  /* 1000 millisecond fade = 1 sec */
var _fade_steps = 20;       /* number of opacity intervals   */
var _fade_delay = 5000;     /* 5 sec delay before fading out */

function fadeIn(element_name)
{
	for (i = 0; i <= 1; i += (1 / _fade_steps))
	{
		setTimeout("setOpacity('" + element_name + "', " + i + ")", i * _fade_duration);
	}
}

function fadeOut(element_name)
{
	for (i = 0; i <= 1; i += (1 / _fade_steps))
	{
		setTimeout("setOpacity('" + element_name + "', " + (1 - i) + ")", i * _fade_duration);
	}
}

/* set the opacity of the element (between 0.0 and 1.0) */
function setOpacity(element_name, level)
{
	element = document.getElementById(element_name);
	element.style.opacity = level;
	element.style.MozOpacity = level;
	element.style.KhtmlOpacity = level;
	element.style.filter = "alpha(opacity=" + (level * 100) + ");";
}

/* Grid sorter */
var TINY={};

function T$(i){return document.getElementById(i)}
function T$$(e,p){return p.getElementsByTagName(e)}

TINY.table=function(){
	function sorter(n,t,p){this.n=n; this.id=t; this.p=p; if(this.p.init){this.init()}}
	sorter.prototype.init=function(){
		this.set(); var t=this.t, i=d=0; t.h=T$$('tr',t)[0];
		t.l=t.r.length; t.w=t.r[0].cells.length; t.a=[]; t.c=[]; this.p.is=this.p.size;
		if(this.p.colddid){
			d=T$(this.p.colddid);
			var o=document.createElement('option'); o.value=-1; o.innerHTML='All Columns'; d.appendChild(o)
		}
		for(i;i<t.w;i++){
			var c=t.h.cells[i]; t.c[i]={};
			if(c.className!='nosort'){
				c.className=this.p.headclass; c.onclick=new Function(this.n+'.sort('+i+')');
				c.onmousedown=function(){return false};
			}
			if(this.p.columns){
				var l=this.p.columns.length, x=0;
				for(x;x<l;x++){
					if(this.p.columns[x].index==i){
						var g=this.p.columns[x];
						t.c[i].format=g.format==null?1:g.format; t.c[i].decimals=g.decimals==null?2:g.decimals
					}
				}
			}
			if(d){
				var o=document.createElement('option'); o.value=i; o.innerHTML=T$$('h3',c)[0].innerHTML; d.appendChild(o)
			}
		}
		this.reset()
	};
	sorter.prototype.reset=function(){
		var t=this.t; t.t=t.l;
		for(var i=0;i<t.l;i++){t.a[i]={}; t.a[i].s=1}
		if(this.p.sortcolumn!=undefined){
			this.sort(this.p.sortcolumn,1,this.p.is)
		}else{
			if(this.p.paginate){this.size()} this.alt(); this.sethover()
		}
		this.calc()
	};
	sorter.prototype.sort=function(x,f,z){
		var t=this.t; t.y=x; var x=t.h.cells[t.y], i=0, n=document.createElement('tbody');
		for(i;i<t.l;i++){
			t.a[i].o=i; var v=t.r[i].cells[t.y]; t.r[i].style.display='';
			while(v.hasChildNodes()){v=v.firstChild}
			t.a[i].v=v.nodeValue?v.nodeValue:''
		}
		for(i=0;i<t.w;i++){var c=t.h.cells[i]; if(c.className!='nosort'){c.className=this.p.headclass}}
		if(t.p==t.y&&!f){t.a.reverse(); x.className=t.d?this.p.ascclass:this.p.descclass; t.d=t.d?0:1}
		else{t.p=t.y; f&&this.p.sortdir==-1?t.a.sort(cp).reverse():t.a.sort(cp); t.d=0; x.className=this.p.ascclass}
		for(i=0;i<t.l;i++){var r=t.r[t.a[i].o].cloneNode(true); n.appendChild(r)}
		t.replaceChild(n,t.b); this.set(); this.alt(); if(this.p.paginate){this.size(z)} this.sethover()
	};
	sorter.prototype.sethover=function(){
		if(this.p.hoverid){
			for(var i=0;i<this.t.l;i++){
				var r=this.t.r[i];
				r.setAttribute('onmouseover',this.n+'.hover('+i+',1)');
				r.setAttribute('onmouseout',this.n+'.hover('+i+',0)')
			}
		}
	};
	sorter.prototype.calc=function(){
		if(this.p.sum||this.p.avg){
			var t=this.t, i=x=0, f,r;
			if(!T$$('tfoot',t)[0]){
				f=document.createElement('tfoot'); t.appendChild(f)
			}else{
				f=T$$('tfoot',t)[0]; while(f.hasChildNodes()){f.removeChild(f.firstChild)}
			}
			if(this.p.sum){
				r=this.newrow(f);
				for(i;i<t.w;i++){
					var j=r.cells[i];
					if(Arrayexists(i, this.p.sum)){
						var s=0, m=t.c[i].format||'';
						for(x=0;x<this.t.l;x++){
							if(t.a[x].s){s+=parseFloat(t.r[x].cells[i].innerHTML.replace(/(\$|\,)/g,''))}
						}
						s=decimals(s,t.c[i].decimals?t.c[i].decimals:2);
						s=isNaN(s)?'n/a':m=='$'?s=s.currency(t.c[i].decimals):s+m;
						r.cells[i].innerHTML=s
					}else{r.cells[i].innerHTML='&nbsp;'}
				}
			}
			if(this.p.avg){
				r=this.newrow(f);
				for(i=0;i<t.w;i++){
					var j=r.cells[i];
					if(Arrayexists(i, this.p.avg)){
						var s=c=0, m=t.c[i].format||'';
						for(x=0;x<this.t.l;x++){
							if(t.a[x].s){s+=parseFloat(t.r[x].cells[i].innerHTML.replace(/(\$|\,)/g,'')); c++}
						}
						s=decimals(s/c,t.c[i].decimals?t.c[i].decimals:2);
						s=isNaN(s)?'n/a':m=='$'?s=s.currency(t.c[i].decimals):s+m;
						j.innerHTML=s
					}else{j.innerHTML='&nbsp;'}
				}
			}
		}
	};
	sorter.prototype.newrow=function(p){
		var r=document.createElement('tr'), i=0; p.appendChild(r);
		for(i;i<this.t.w;i++){r.appendChild(document.createElement('td'))}
		return r
	};
	sorter.prototype.alt=function(){
		var t=this.t, i=x=0;
		for(i;i<t.l;i++){
			var r=t.r[i];
			if(t.a[i].s){
				r.className=x%2==0?this.p.evenclass:this.p.oddclass; var cells=T$$('td',r);
				for(var z=0;z<t.w;z++){cells[z].className=t.y==z?x%2==0?this.p.evenselclass:this.p.oddselclass:''}
				x++
			}
			if(!t.a[i].s){r.style.display='none'}
		}
	};
	sorter.prototype.page=function(s){
		var t=this.t, i=x=0, l=s+parseInt(this.p.size);
		if(this.p.totalrecid){T$(this.p.totalrecid).innerHTML=t.t}
		if(this.p.currentid){T$(this.p.currentid).innerHTML=this.g}
		if(this.p.startingrecid){
			var b=((this.g-1)*this.p.size)+1, m=b+(this.p.size-1); m=m<t.l?m:t.t; m=m<t.t?m:t.t;
			T$(this.p.startingrecid).innerHTML=t.t==0?0:b;; T$(this.p.endingrecid).innerHTML=m
		}
		for(i;i<t.l;i++){var r=t.r[i]; if(t.a[i].s){r.style.display=x>=s&&x<l?'':'none'; x++}else{r.style.display='none'}}
	};
	sorter.prototype.move=function(d,m){
		this.goto(d==1?(m?this.d:this.g+1):(m?1:this.g-1))
	};
	sorter.prototype.goto=function(s){
		if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size)}
	};
	sorter.prototype.size=function(s){
		var t=this.t;
		if(s){this.p.size=s}
		this.g=1; this.d=Math.ceil(this.t.t/this.p.size);
		if(this.p.navid){T$(this.p.navid).style.display=this.d<2?'none':'block'}
		this.page(0);
		if(this.p.totalid){T$(this.p.totalid).innerHTML=t.t==0?1:this.d}
		if(this.p.pageddid){
			var d=T$(this.p.pageddid), l=this.d+1;
			d.setAttribute('onchange',this.n+'.goto(this.value)');
			while(d.hasChildNodes()){d.removeChild(d.firstChild)}
			for(var i=1;i<=this.d;i++){
				var o=document.createElement('option');
				o.value=i; o.innerHTML=i; d.appendChild(o)
			}
		}
	};
	sorter.prototype.showall=function(){
		this.size(this.t.t)
	};
	sorter.prototype.search=function(f){
		var i=x=n=0, k=-1, q=T$(f).value.toLowerCase();
		if(this.p.colddid){k=T$(this.p.colddid).value}
		var s=(k==-1)?0:k, e=(k==-1)?this.t.w:parseInt(s)+1;
		for(i;i<this.t.l;i++){
			var r=this.t.r[i], v;
			if(q==''){
				v=1
			}else{
				for(x=s;x<e;x++){
					var b=r.cells[x].innerHTML.toLowerCase();
					if(b.indexOf(q)==-1){v=0}else{v=1; break}
				}
			}
			if(v){n++}
			this.t.a[i].s=v
		}
		this.t.t=n;
		if(this.p.paginate){this.size()}
		this.calc(); this.alt()
	};
	sorter.prototype.hover=function(i,d){
		this.t.r[i].id=d?this.p.hoverid:''
	};
	sorter.prototype.set=function(){
		var t=T$(this.id); t.b=T$$('tbody',t)[0]; t.r=t.b.rows; this.t=t
	};
	// Array.prototype.exists=function(v){
		// for(var i=0;i<this.length;i++){if(this[i]==v){return 1}} return 0
	// };
	Arrayexists=function(v, array1){
		for(var i=0;i<array1.length;i++){if(array1[i]==v){return 1}} return 0
	};
	Number.prototype.currency=function(c){
		var n=this, d=n.toFixed(c).split('.');
		d[0]=d[0].split('').reverse().join('').replace(/(\d{3})(?=\d)/g,'$1,').split('').reverse().join('');
		return '$'+d.join('.')
	};
	function decimals(n,d){return Math.round(n*Math.pow(10,d))/Math.pow(10,d)};
	function cp(f,c){
		var g,h; f=g=f.v.toLowerCase(); c=h=c.v.toLowerCase();
		var i=parseFloat(f.replace(/(\$|\,)/g,'')), n=parseFloat(c.replace(/(\$|\,)/g,''));
		if(!isNaN(i)&&!isNaN(n)){g=i,h=n}
		i=Date.parse(f); n=Date.parse(c);
		if(!isNaN(i)&&!isNaN(n)){g=i; h=n}
		return g>h?1:(g<h?-1:0)
	};
	return{sorter:sorter}
}();

//Drop Down Tabs Menu- Author: Dynamic Drive (http://www.dynamicdrive.com)
var tabdropdown={
	disappeardelay: 200, //set delay in miliseconds before menu disappears onmouseout
	disablemenuclick: false, //when user clicks on a menu item with a drop down menu, disable menu item's link?
	enableiframeshim: 1, //1 or 0, for true or false

	//No need to edit beyond here////////////////////////
	dropmenuobj: null, ie: document.all, firefox: document.getElementById&&!document.all, previousmenuitem:null,
	currentpageurl: window.location.href.replace("http://"+window.location.hostname, "").replace(/^\//, ""), //get current page url (minus hostname, ie: http://www.dynamicdrive.com/)

	getposOffset:function(what, offsettype){
		var totaloffset=(offsettype=="left")? what.offsetLeft : what.offsetTop;
		var parentEl=what.offsetParent;
			while (parentEl!=null){
				totaloffset=(offsettype=="left")? totaloffset+parentEl.offsetLeft : totaloffset+parentEl.offsetTop;
				parentEl=parentEl.offsetParent;
			}
		return totaloffset;
	},

	showhide:function(obj, e, obj2){ //obj refers to drop down menu, obj2 refers to tab menu item mouse is currently over
		if (this.ie || this.firefox)
			this.dropmenuobj.style.left=this.dropmenuobj.style.top="-500px"
		if (e.type=="click" && obj.visibility==hidden || e.type=="mouseover"){
			if (obj2.parentNode.className.indexOf("default")==-1) //if tab isn't a default selected one
				obj2.parentNode.className="selected"
			obj.visibility="visible"
			}
		else if (e.type=="click")
			obj.visibility="hidden"
	},

	iecompattest:function(){
		return (document.compatMode && document.compatMode!="BackCompat")? document.documentElement : document.body
	},

	clearbrowseredge:function(obj, whichedge){
		var edgeoffset=0
		if (whichedge=="rightedge"){
			var windowedge=this.ie && !window.opera? this.standardbody.scrollLeft+this.standardbody.clientWidth-15 : window.pageXOffset+window.innerWidth-15
			this.dropmenuobj.contentmeasure=this.dropmenuobj.offsetWidth
		if (windowedge-this.dropmenuobj.x < this.dropmenuobj.contentmeasure)  //move menu to the left?
			edgeoffset=this.dropmenuobj.contentmeasure-obj.offsetWidth
		}
		else{
			var topedge=this.ie && !window.opera? this.standardbody.scrollTop : window.pageYOffset
			var windowedge=this.ie && !window.opera? this.standardbody.scrollTop+this.standardbody.clientHeight-15 : window.pageYOffset+window.innerHeight-18
			this.dropmenuobj.contentmeasure=this.dropmenuobj.offsetHeight
			if (windowedge-this.dropmenuobj.y < this.dropmenuobj.contentmeasure){ //move up?
				edgeoffset=this.dropmenuobj.contentmeasure+obj.offsetHeight
				if ((this.dropmenuobj.y-topedge)<this.dropmenuobj.contentmeasure) //up no good either?
					edgeoffset=this.dropmenuobj.y+obj.offsetHeight-topedge
			}
			this.dropmenuobj.firstlink.style.borderTopWidth=(edgeoffset==0)? 0 : "1px" //Add 1px top border to menu if dropping up
		}
		return edgeoffset
	},

	dropit:function(obj, e, dropmenuID){
		if (this.dropmenuobj!=null){ //hide previous menu
			this.dropmenuobj.style.visibility="hidden" //hide menu
			if (this.previousmenuitem!=null && this.previousmenuitem!=obj){
				if (this.previousmenuitem.parentNode.className.indexOf("default")==-1) //If the tab isn't a default selected one
					this.previousmenuitem.parentNode.className=""
			}
		}
		this.clearhidemenu()
		if (this.ie||this.firefox){
			obj.onmouseout=function(){tabdropdown.delayhidemenu(obj)}
			obj.onclick=function(){return !tabdropdown.disablemenuclick} //disable main menu item link onclick?
			this.dropmenuobj=document.getElementById(dropmenuID)
			this.dropmenuobj.onmouseover=function(){tabdropdown.clearhidemenu()}
			this.dropmenuobj.onmouseout=function(e){tabdropdown.dynamichide(e, obj)}
			this.dropmenuobj.onclick=function(){tabdropdown.delayhidemenu(obj)}
			this.showhide(this.dropmenuobj.style, e, obj)
			this.dropmenuobj.x=this.getposOffset(obj, "left")
			this.dropmenuobj.y=this.getposOffset(obj, "top")
			this.dropmenuobj.style.left=this.dropmenuobj.x-this.clearbrowseredge(obj, "rightedge")+"px"
			this.dropmenuobj.style.top=this.dropmenuobj.y-this.clearbrowseredge(obj, "bottomedge")+obj.offsetHeight+1+"px"
			this.previousmenuitem=obj //remember main menu item mouse moved out from (and into current menu item)
			this.positionshim() //call iframe shim function
		}
	},

	contains_firefox:function(a, b) {
		while (b.parentNode)
		if ((b = b.parentNode) == a)
			return true;
		return false;
	},

	dynamichide:function(e, obj2){ //obj2 refers to tab menu item mouse is currently over
		var evtobj=window.event? window.event : e
		if (this.ie&&!this.dropmenuobj.contains(evtobj.toElement))
			this.delayhidemenu(obj2)
		else if (this.firefox&&e.currentTarget!= evtobj.relatedTarget&& !this.contains_firefox(evtobj.currentTarget, evtobj.relatedTarget))
			this.delayhidemenu(obj2)
	},

	delayhidemenu:function(obj2){
		this.delayhide=setTimeout(function(){tabdropdown.dropmenuobj.style.visibility='hidden'; if (obj2.parentNode.className.indexOf('default')==-1) obj2.parentNode.className=''},this.disappeardelay) //hide menu
	},

	clearhidemenu:function(){
		if (this.delayhide!="undefined")
			clearTimeout(this.delayhide)
	},

	positionshim:function(){ //display iframe shim function
		if (this.enableiframeshim && typeof this.shimobject!="undefined"){
			if (this.dropmenuobj.style.visibility=="visible"){
				this.shimobject.style.width=this.dropmenuobj.offsetWidth+"px"
				this.shimobject.style.height=this.dropmenuobj.offsetHeight+"px"
				this.shimobject.style.left=this.dropmenuobj.style.left
				this.shimobject.style.top=this.dropmenuobj.style.top
			}
		this.shimobject.style.display=(this.dropmenuobj.style.visibility=="visible")? "block" : "none"
		}
	},

	hideshim:function(){
		if (this.enableiframeshim && typeof this.shimobject!="undefined")
			this.shimobject.style.display='none'
	},

isSelected:function(menuurl){
	var menuurl=menuurl.replace("http://"+menuurl.hostname, "").replace(/^\//, "")
	return (tabdropdown.currentpageurl==menuurl)
},

	init:function(menuid, dselected){
		this.standardbody=(document.compatMode=="CSS1Compat")? document.documentElement : document.body //create reference to common "body" across doctypes
		var menuitems=document.getElementById(menuid).getElementsByTagName("a")
		for (var i=0; i<menuitems.length; i++){
			if (menuitems[i].getAttribute("rel")){
				var relvalue=menuitems[i].getAttribute("rel")
				document.getElementById(relvalue).firstlink=document.getElementById(relvalue).getElementsByTagName("a")[0]
				menuitems[i].onmouseover=function(e){
					var event=typeof e!="undefined"? e : window.event
					tabdropdown.dropit(this, event, this.getAttribute("rel"))
				}
			}
			if (dselected=="auto" && typeof setalready=="undefined" && this.isSelected(menuitems[i].href)){
				menuitems[i].parentNode.className+=" selected default"
				var setalready=true
			}
			else if (parseInt(dselected)==i)
				menuitems[i].parentNode.className+=" selected default"
		}
	}

}

/* slide functions */
function doSlide(id)
{
	timeToSlide = 50; // in milliseconds
	obj = document.getElementById(id);
	if(obj.style.display == "none")
	{
		// if it's allready hidden we slide it down
		obj.style.visibility = "hidden";
		obj.style.display = "block";
		height = obj.offsetHeight;
		obj.style.height="0px";
		obj.style.visibility = "visible";
		slideDown(obj,0,height,Math.ceil(height/timeToSlide));
	}
	else
	{
		slideUp(obj,Math.ceil(obj.offsetHeight/timeToSlide),obj.offsetHeight);
	}
}

function slideDown(obj,offset,full,px)
{
	if(offset < full)
	{
		obj.style.height = offset+"px";
		offset=offset+px;
		setTimeout((function(){slideDown(obj,offset,full,px);}),1);
	}
	else 
	{
		obj.style.height = full+"px"; //If the data inside is updated on runtime you can use auto instead...
	}
}

function slideUp(obj,px,full)
{
	if((obj.offsetHeight-px) > 0)
	{
		obj.style.height = obj.offsetHeight-px+"px";
		setTimeout((function(){slideUp(obj,px,full);}),1);
	}
	else 
	{
		obj.style.height=full+"px"; // we reset the height if we were to slide it back down
		obj.style.display = 'none';
	}
}

