// Copyright © 2001-2007
// United Services Automobile Association
// All Rights Reserved
 /*  
	File: cp_std.js
	Description: General library of JavaScript functions
    
    Maintenance History:  
        
    Target      Chg Date    	Name               Description
    ========    ========    	============       ==================
    09/19/2007  09/18/2007	Rakshith           Removed sIFR
    09/14/2007  08/22/2007	Jaikrishnan           Changed latest sifr code and commented 2 lines on slider as per designer's request.
    09/14/2007  08/07/2007	Rakshith           Added fix for dropdown menus in safari.
    09/14/2007  07/27/2007	Eswara Adari	   DEV019293 - Modified according to Redesign usaa.com project.
    09/14/2007	07/09/2007 	Rakshith           Added styles related javascripts
    09/14/2007	05/22/2007 		Anu Surampudi	   DEV019293 - Modified according to Redesign usaa.com project.
    03/30/2007  02/20/2007      Makesh Kannan      Added function ec_getViewableSize
    03/30/2007  02/09/2007      Makesh Kannan      Added "$(…)"
    02/02/2007  11/08/2006      Nageshwar D        Added functions related to DropDown Navigation Menus    
    10/13/2006  09/28/2006      R. Schnedler       Added ec_getNewXmlHttpRequest
    07/15/2006	07/15/2006      Matt Hein	       Backed out changes from 7/14/2006
    07/14/2006  07/06/2006      Pavan Tata         Added function for registering on DOM Loaded event

*/

var bwsr;
var all;

if (navigator.appName.indexOf("Microsoft") >= 0){
	bwsr = "IE" ;
	all = document.all;
}else if(isProperty(document.layers)){
	bwsr = "NN";
	all = document.layers;
}else if(navigator.userAgent.indexOf("Gecko") >= 0){
	bwsr = "NN6";
	all = document.getElementsByTagName("*");
}

function initEventHandler(eventType,NNeventType){
	if (bwsr == "IE"){
		eval("document." + eventType + "=IEeventHandler");
	}else if (bwsr.indexOf("NN") >= 0){
		document.captureEvents(eval("Event." + NNeventType));
		 eval("document." + eventType + "=NNeventHandler");
	}
}

function IEeventHandler(){
	var objEvent = event;
	//IEsendEvtTo needs to be implemeted in any js/page that sets the EventHandlers
	IEsendEvtTo(event.srcElement,objEvent);
}

function NNeventHandler(evt){
	var objEvent = evt;
	//NNsendEvtTo needs to be implemeted in any js/page that sets the EventHandlers
	NNsendEvtTo(evt.target,objEvent);
}

function isProperty(strProp){
	var compare = bwsr == "IE" ? null : undefined
	var rvalue = true
	if (strProp == compare){
		rvalue = false
	}
	return rvalue;
}

function getProperty(strProp){
	var compare 
	switch (bwsr){
		case "IE":
			compare = "";
			break;
		case "NN":
			compare = null;
			break;
		case "NN6":
			compare = undefined;
	}
			
	var rvalue = "";
	bstrProp = isProperty(strProp)
	if(bstrProp && strProp != compare){
		rvalue = strProp
	}
	return rvalue;
}

function isObject(obj){
	var rvalue = false
	strtypeof = typeof(eval(obj))
	if (strtypeof == "object"){
		rvalue = true
	}
	return rvalue;
}

function jumpOutOfFrameset()
{
	if (top != window)
	{
		top.location.replace(window.location);
	}
}


// --------------------------
// ---- COOKIE FUNCTIONS ----
// ---- Added 01/14/03 rls --
// --------------------------
function getCookie(NameOfCookie)
{

// First we check if there is a cookie stored at all.
// Otherwise the length of document.cookie would be zero.
	if (document.cookie.length > 0)
	{

		// Second we check if the cookies name is stored in the
		// "document.cookie"-object for the page.
		
		// Since more than just one cookie can be set on a
		// single page it is possible that our cookie
		// is not present, even though the "document.cookie"-object
		// is not just an empty text.
		// If our cookiename is not present the value -1 is stored
		// in the variable called "begin".

	    begin = document.cookie.indexOf(NameOfCookie+"=");
	    if (begin != -1)   // Note: != means "is not equal to"
		{
			// The cookie was set.
			// The value stored in the cookie is returned from the function.

			begin += NameOfCookie.length+1;
			end = document.cookie.indexOf(";", begin);
			if (end == -1) end = document.cookie.length;
			return unescape(document.cookie.substring(begin, end));
		}
	}
	return null; 

	// The cookie was not set.
	// The value "null" is returned from the function.
}



function setCookie(NameOfCookie, value, expireMinutes, domain, path)
{
	// Five variables are used to set the new cookie.
	// The name of the cookie, the value to be stored,
	// the number of minutes until the cookie expires,
	// the domain and the path.  The domain and the path MUST
	// be set to allow the cookie to be visible when an
	// application has ProtectFromBrowserBack enabled. 

	var ExpireDate = new Date ();
	ExpireDate.setTime(ExpireDate.getTime() + (expireMinutes * 1000));

	// The next line stores the cookie by assigning
	// the values to the document.cookie object.
	// The date is converted to Greenwich Meantime using
	// the toGMTstring() function.
	document.cookie = NameOfCookie + "=" + value +
	((expireMinutes == null) ? "" : "; expires=" + ExpireDate.toGMTString()) +
	((domain == null) ? "" : "; domain=" + domain) +
	((path == null) ? "" : "; path=" + path);
}



	function delCookie (NameOfCookie)
	{
	// The function simply checks if the cookie is set.
	// If so the expiredate is set to Jan 1, 1970.
	if (getCookie(NameOfCookie)) {
	  document.cookie = NameOfCookie + "=" +
	   "; expires=Thu, 01-Jan-70 00:00:01 GMT";
	}
}
/*********************************************
  Function: checkBoxes()
  Date      Name             Description
  --------  ---------------  ------------------
  11/12/03  Randy Brandt     Created

This javascript function will check/uncheck specific checkboxes 
on a page based on formname, desired checkbox value and checkbox name.

The function accepts 3 parameters:
	1. [(Boolean),null, OPTIONAL] 
	   The value of the checkbox (true/false).
	2. [(String), null, OPTIONAL] 
	   The name or part of the name of the checkboxes to be changed.
	3. [(String), null, OPTIONAL] 
	   The name of the form of which the checkboxes reside.	
Ex:checkBoxes(true, 'A', 'formname1')

If nothing is passed into the function - Ex:checkBoxes(), then
the default action will toggle all checkboxes in the first form.
If a null is passed for the first parameter, the current state of the checkbox will toggle.
If a null is passed for the second parameter, all checkboxes within the form will be affected.
if a null is passed for the third parameter, it will assume the first form on the page.
*/
function checkBoxes (check, containsString, formName) 
{
var form;
var isFound = false;

if (!(check == true||check == false))
  {
  check = "toggle";//if not true or false default to toggle
  }

if (formName)// check for null formName 
  {
  form = document.forms[formName];
  }
else
  {
  form = document.forms[0];// if null, set to first form
  }

if (!(form))// if no form is found exit the function
  {
  return;
  }

for (var c = 0; c < form.elements.length; c++)//iterate through all form elements
  {
  if (form.elements[c].type == 'checkbox')//if the element is a checkbox continue
    {
     if (containsString == null)//if null then change all checkboxes in form
       {
       toggleOrSetValue(form,check,c);
	   }
     else//otherwise change only those that contain the subString
	   {
	   isFound = (form.elements[c].name.indexOf(containsString) != -1) ? true : false;
	   if (isFound)
	     {
         toggleOrSetValue(form,check,c);
	     }
	   }
    }
  }
}

	function toggleOrSetValue(form,check,c)
	{
	   if (!(check == "toggle"))
	    {//if not toggle, then set to check value - true/false
	     form.elements[c].checked = check;
	    }
	   else
	    {//otherwise, toggle the checkbox value
	     form.elements[c].checked = !form.elements[c].checked;
	    }	
	}

function redirectToNewURL(strNewURL)
{
window.location = strNewURL;
return false;
}

function handleFocus(elem,txt)
{
	if (elem.value == txt)
	{
		elem.value='';
	}
}

function handleBlur(elem,txt)
{
	if (elem.value == '')
	{
		elem.value=txt;
	}
}

/*
setElementId function is used for changing the id of element.
This is a generic function, can be used for any element.
*/
function setElementId(targetId, toChangeId){

	elem = document.getElementById(targetId);
	
	if(elem != null){
		elem.setAttribute('id',toChangeId);
	}
}

/*
updatePageContainers function is used for changing the ID of the top container 
and other containers.
when all the contents in the _local jsp file are profiled out, this function 
call (onload of page) would help in rendering page contents properly. 
*/
function updatePageContainers(){
	
   /*
   Changing the the top container ID   
   */
	setElementId("containerNavLocal", "container");
	
  /*
   Changing body container ID if local exisits.
  */	
    localElem = document.getElementById("mainLocal");
	localTransElem = document.getElementById("mainLocalTrans");
	
	if (localElem != null)
	{
		setElementId("mainLocal", "main");
	}
	else if (localTransElem != null)
	{
		setElementId("mainLocalTrans", "main");
	}

}


/*

returns class attribute value of the passed object

*/

 function hasClass(obj) 
 {
     var result = false;
     if (obj.getAttributeNode("class") != null) {
         result = obj.getAttributeNode("class").value;
     }
     return result;
 } 

 function zebra(id, colorodd, coloreven) 
 {

    var even = false;
  
    var evenColor = arguments[1] ? arguments[1] : coloreven;
    var oddColor = arguments[2] ? arguments[2] : colorodd;
  
    var table = document.getElementById(id);
    if (! table) { return; }
    

    var tbodies = table.getElementsByTagName("tbody");


    for (var h = 0; h < tbodies.length; h++) {
    

      var trs = tbodies[h].getElementsByTagName("tr");
      

      for (var i = 0; i < trs.length; i++) {


        if (! hasClass(trs[i]) && ! trs[i].style.backgroundColor) {
 		  
          var tds = trs[i].getElementsByTagName("td");
        
          for (var j = 0; j < tds.length; j++) {
        
            var mytd = tds[j];

            if (! mytd.style.backgroundColor) {
             //! hasClass(mytd) && 
              mytd.style.backgroundColor = even ? evenColor : oddColor;
            
            }
          }
        }
        even =  ! even;
      }
    }
  }

var dynamicElements = new Array();
	
DynamicElement = function (element,rule) {
	this.element = element;
	this.rule = rule;
}
// ** dynDisplay BEGINS **
function createDynDisplayArray()
{
	// First get them the "old" way
	getDynamicElements(document.body);
	// Then get them the "new" way
	getDynDisplayRules(document.body);
	// Apply rules
	dynDisplay();
}

function getDynamicElements (o)
{
	if(o.nodeType == 1 && o.getAttribute('displayif')) 
	{
		dynamicElements[dynamicElements.length] = new DynamicElement(o,o.getAttribute('displayif'));
	}

	for(var i=0; i < o.childNodes.length; getDynamicElements(o.childNodes[i++]));
}

function getDynDisplayRules (o)
{
	var RULE_SUFFIX = '_displayRule';
	var inputTags = o.getElementsByTagName('INPUT');
	
	for (var i=0; i < inputTags.length; i++) 
	{
		e=inputTags[i];
		if (e.name.substr(e.name.length-RULE_SUFFIX.length) == RULE_SUFFIX) 
		{
			dynamicElements[dynamicElements.length] = new DynamicElement(document.getElementById(e.name.substr(0,e.name.length-RULE_SUFFIX.length)),e.value);
		}
	}
}


function dynDisplay()
{
	for (var i=0;i<dynamicElements.length;i++)
	{
		dynamicElements[i].element.style.display = eval(dynamicElements[i].rule) ? '' : 'none';
	}
}

// ** dynDisplay ENDS **



/** Cross browser XMLHttpRequest **/
function ec_getNewXmlHttpRequest()
{
	var xmlreq = null;
	if(window.XMLHttpRequest)
	{
		xmlreq = new XMLHttpRequest();
	}
	else if(window.ActiveXObject)
	{
		try
		{
			xmlreq = new ActiveXObject("MsXml2.XMLHTTP");
		}
		catch(exception1)
		{
			try
			{
				xmlreq = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(exception2)
			{ }	// nop
		}
	}

	return xmlreq;
}

/* The following code for dropDown Navigation */

function ec_displayChildMenu(obj){
	myChildMenu = obj.getElementsByTagName("UL");
	if(myChildMenu.length > 0){
		if(menuHide)clearTimeout(menuHide);
		ec_showMenu();
		myChildMenu[0].style.display = "block";
	}
}

var menuHide;

function ec_hideMenu(obj){
	myChildMenu = obj.getElementsByTagName("UL");
	if(myChildMenu.length > 0){
		menuHide = setTimeout("ec_showMenu()",1000);
		//myChildMenu[0].style.display = "none";
	}
	return false;
}

function ec_showMenu(){
	ulMenuList = document.getElementsByTagName("UL");
	for(i=0;i<ulMenuList.length;i++){
		if(ulMenuList[i].parentNode.parentNode.nodeName == "UL"){
			ulMenuList[i].style.display = "none";
		}
	}
}
function ec_subNavMenuDisplay(obj){
	myChildMenu = obj.childNodes; //obj.getElementsByTagName("UL");
	if(myChildMenu.length > 0){
		if(obj.parentNode.menuHide){clearTimeout(obj.parentNode.menuHide)};
		ec_subNavMenuHide(obj.parentNode);
		for(i=0;i<myChildMenu.length;i++){
			if(myChildMenu[i].nodeName == "UL"){
				myChildMenu[i].style.display = "block";
			}
		}
	}
}

function ec_subNavMenuHideTimeout(obj){
	myChildMenu = obj.childNodes;
	if(myChildMenu.length > 0){
		for(i=0;i<myChildMenu.length;i++){
			if(myChildMenu[i].nodeName == "UL"){
				obj.parentNode.menuHide = setTimeout(function(){ec_subNavMenuHide(obj.parentNode)},1000);
				break;
			}
		}
	}
	return false;
}

function ec_subNavMenuHide(obj){
	if(obj.menuHide)clearTimeout(obj.menuHide);
	myChildList = obj.childNodes;
	for(i=0;i<myChildList.length;i++){
		if(myChildList[i].childNodes.length > 0){
			for(j=0;j<myChildList[i].childNodes.length;j++){
				if(myChildList[i].childNodes[j].nodeName == "UL"){
					myChildList[i].childNodes[j].style.display = "none";
				}
			}
		}
	}
}


/**
 *  function    :  $
 *  Description :  returns element (object) identified by using the parameter - id
 *				   "$(…)" syntax is also part of prototype.js.
 *  			   The behavior of "$" is now defined in our own cp_std.js.
 *  			   Even if there is a possible conflict in the future if at some point we begin to use prototype.js.
 *  			   It is OK in JavaScript to re-define functions, and the last one wins. 
 *  Params      :  id
 *  
 */
function $(id)
{
	return document.getElementById(id);
}

/**
 *  function    :  ec_getViewableSize
 *  Description :  Returns the height and width of the viewable area of the browser. This function is also defined
 *                 in global.js. If it is modified the function defined in global.js should also
 *                 be updated. 
 *  Params      :  None
 *  
*/
function ec_getViewableSize() 
{
		var myWidth = 0, myHeight = 0;
		if( typeof( window.innerWidth ) == 'number' )
		{
			//Non-IE
			myWidth = window.innerWidth;
			myHeight = window.innerHeight;
		} else {
			if(document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight))
			{
				//IE 6+ in 'standards compliant mode'
				myWidth = document.documentElement.clientWidth;
				myHeight = document.documentElement.clientHeight;
			} else {
				if( document.body && ( document.body.clientWidth || document.body.clientHeight ) )
				{
					//IE 4 compatible
					myWidth = document.body.clientWidth;
					myHeight = document.body.clientHeight;
				}
			}
		}
		return [myWidth,myHeight];
}

/**
 * function    : ec_rightTrim
 * Description : Trims trailing whitespace chars.
 * Params      : String
 */
function ec_rightTrim( strValue ) {
    var objRegExp = /^([\w\W]*)(\b\s*)$/;
 
    if(objRegExp.test(strValue)) {
        //remove trailing a whitespace characters
        strValue = strValue.replace(objRegExp, '$1');
    }
    return strValue;
}

/**
 * function    : ec_leftTrim
 * Description : Trims leading whitespace chars.
 * Params      : String
 */
function ec_leftTrim( strValue ) {
    var objRegExp = /^(\s*)(\b[\w\W]*)$/;
 
    if(objRegExp.test(strValue)) {
        //remove leading a whitespace characters
        strValue = strValue.replace(objRegExp, '$2');
    }
    return strValue;
}

/**
 * function    : ec_trimAll
 * Description : Removes leading and trailing spaces.
 * Params      : String
 */ 
function ec_trimAll( strValue ) {
    var objRegExp = /^(\s*)$/;

    //check for all spaces
    if(objRegExp.test(strValue)) {
        strValue = strValue.replace(objRegExp, '');
        if( strValue.length == 0) {
            return strValue;
        }
    }
    
    //check for leading & trailing spaces
    objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
    if(objRegExp.test(strValue)) {
        //remove leading and trailing whitespace characters
        strValue = strValue.replace(objRegExp, '$2');
    }
    return strValue;
}




/* IE image flicker FIX - should work on most IE6 */
	try {document.execCommand("BackgroundImageCache", false, true);} catch (e){}; 
	
	/* Zebra Striping */
	/* Old method to be used on non-sorting tables */
	/* VERY old method - styles TD's, not TR's, without classes */

	var color_one =  "#ebead5";
	var color_two =  "#ffffff";
	
	function zebra( oldObj, c1, c2 ){
	if(c1)color_one = c1;
	if(c2)color_two = c2;
	
	tableSets = document.getElementsByTagName("TABLE");
	if(tableSets.length == 0){return};
	var i = 0;
	for(i=0;i<tableSets.length;i++){
		if( tableSets[i].id.match("zebra") || ( oldObj && tableSets[i].id.match(oldObj)) ){
			stripe(tableSets[i]);
		}
	}	
	}
	
	function stripe(obj){
	var tableRowArray = obj.getElementsByTagName("TR");
	var rowCounter = 0;
	var i = 0;
	var j = 0;
	for(i=0;i<tableRowArray.length;i++){
		if(tableRowArray[i].getElementsByTagName("TD").length != 0){
			var tdArray = tableRowArray[i].getElementsByTagName("TD");
			for(j=0;j<tdArray.length;j++){
				if( j != (tdArray.length - 1)){
					tdArray[j].style.borderRight = "1px solid #CCCCAE";
				}
				tdArray[j].style.backgroundColor = (rowCounter%2 == 0)?color_one:color_two;
			}
			rowCounter++
		}
	}
	}








	/* The following code for dropDown Navigation */
    /* Code may change to universalize hover/hide behavior i.e. remove UL requirement? */
	/* Currently used by three different application elements (menu, click-context, mouseover-context)*/
		
		function ec_subNavMenuDisplay(obj){
			myChildMenu = obj.childNodes; //obj.getElementsByTagName("UL");
			if(myChildMenu.length > 0){
				if(obj.parentNode.menuHide){clearTimeout(obj.parentNode.menuHide)};
				ec_subNavMenuHide(obj.parentNode, obj);
				obj.className += " hilited";
				for(i=0;i<myChildMenu.length;i++){
					if(myChildMenu[i].nodeName == "UL" && myChildMenu[i].style.display != "block" ){
						myChildMenu[i].style.display = "block";
						myChildMenu[i].style.zIndex = 10000;
					}
				}
			}
		}

		function ec_subNavMenuHideTimeout(obj,dur){
			duration = (dur && !isNaN(parseInt(dur)) )?dur:1;
			myChildMenu = obj.childNodes;
			if(myChildMenu.length > 0){
				obj.parentNode.menuHide = setTimeout(function(){ec_subNavMenuHide(obj.parentNode,obj)},duration);
			}
			return false;
		}

		function ec_subNavMenuHide(obj, childObj){
			if(obj.menuHide)clearTimeout(obj.menuHide);
			myChildList = obj.childNodes;
			for(i=0;i<myChildList.length;i++){
				if(myChildList[i].childNodes.length > 0){
					for(j=0;j<myChildList[i].childNodes.length;j++){
						if(myChildList[i].childNodes[j].nodeName == "UL"){
							myChildList[i].childNodes[j].parentNode.className.replace("hilited"," "); //= '';
							myChildList[i].childNodes[j].style.display = "none";
							myChildList[i].childNodes[j].parentNode.style.zIndex = 1;
						}
					}
					myChildList[i].className = myChildList[i].className.replace("hilited"," ");
				}
			}
		}

	/* The following JS is for Left side Menus */

	function initMenus (activeMenu,activeItem) {
		var menuNames = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
		var menuIndex = 0;
		while (document.getElementById('Menu'+menuNames.charAt(menuIndex))) {		
			var menuElem = document.getElementById('Menu'+menuNames.charAt(menuIndex));
			
			if (menuNames.charAt(menuIndex)==activeMenu) {
				menuElem.parentNode.className='activeS';
			} else {
				menuElem.style.display='none';
			}
			menuIndex++;
		}
		if (activeItem == 0) {
		
		} else {
		document.getElementById('Item'+activeMenu+activeItem).className='active';
		}
	}



/* ****** Start code for pop-up window ***** */









/*      TableSort revisited v3.0 by frequency-decoder.com
		http://www.frequency-decoder.com/2006/09/16/unobtrusive-table-sort-script-revisited
        Released under a creative commons Attribution-ShareAlike 2.5 license (http://creativecommons.org/licenses/by-sa/2.5/)
*/
var fdTableSort = {
        regExp_Currency:        /^[£$€¥¤]/,
        regExp_Number:          /^(\-)?[0-9]+(\.[0-9]*)?$/,
        pos:                    -1,
        uniqueHash:             1,
        thNode:                 null,
        tableId:                null,
        tableCache:             {},
        tmpCache:               {},
        colspan:                "colspan",
        rowspan:                "rowspan",
        addEvent: function(obj, type, fn) {
                if( obj.attachEvent ) {
                        obj["e"+type+fn] = fn;
                        obj[type+fn] = function(){obj["e"+type+fn]( window.event );};
                        obj.attachEvent( "on"+type, obj[type+fn] );
                } else
                        obj.addEventListener( type, fn, false );
        },

        stopEvent: function(e) {
                e = e || window.event;

                if(e.stopPropagation) {
                        e.stopPropagation();
                        e.preventDefault();
                };
                return false;
        },

        init: function() {
                if (!document.getElementsByTagName) return;

                var tables = document.getElementsByTagName("table");
                var workArr, sortable, headers, thtext, aclone, a, span, columnNum, noArrow, colCnt, cel, allRowArr, rowArr, tableSortable, celCount, colspan, rowspan, rowLength;

                a               = document.createElement("a");
                a.href          = "#";
                a.onkeypress    = fdTableSort.keyWrapper;

                span            = document.createElement("span");

                for(var k = 0, tbl; tbl = tables[k]; k++) {

                        if(tbl.id && tbl.id in fdTableSort.tableCache) delete fdTableSort.tableCache[tbl.id];
                        
                        if(tbl.id && tbl.id in fdTableSort.tmpCache) {
                                workArr = fdTableSort.tmpCache[tbl.id].headers;
                                for(var c = 0;c < workArr.length;c++) {
                                        for(var i = 0;i < workArr[c].length;i++){
                                                workArr[c][i].className = workArr[c][i].className.replace(/forwardSort|reverseSort|fd-identical|fd-not-identical/, "");
                                                if(workArr[c][i].getElementsByTagName('span').length) {
                                                        span = workArr[c][i].getElementsByTagName('span')[0];
                                                        while(span.firstChild) span.removeChild(span.firstChild);
                                                };
                                        };
                                };
                                continue;
                        };
                        
                        allRowArr = tbl.getElementsByTagName('thead').length ? tbl.getElementsByTagName('thead')[0].getElementsByTagName('tr') : tbl.getElementsByTagName('tr');
                        rowArr = [];
                        tableSortable = false;
                        
                        // Grab only the tr's that contain no td's and check at least one th has the class "sortable"
                        for(var i = 0, tr; tr = allRowArr[i]; i++) {
                                if(tr.getElementsByTagName('td').length || !tr.getElementsByTagName('th').length) continue;
                                rowArr[rowArr.length] = tr.getElementsByTagName('th');
                                for(var j = 0, th; th = rowArr[rowArr.length - 1][j]; j++) {
                                        if(th.className.search(/sortable/) != -1) tableSortable = true;
                                }
                        }

                        if(!tableSortable) continue;
                        
                        if(!tbl.id) tbl.id = "fd-table-" + fdTableSort.uniqueHash++;

                        sortable  = false;
                        columnNum = tbl.className.search(/sortable-onload-([0-9]+)/) != -1 ? parseInt(tbl.className.match(/sortable-onload-([0-9]+)/)[1]) - 1 : -1;
                        showArrow = tbl.className.search(/no-arrow/) == -1;
                        reverse   = tbl.className.search(/sortable-onload-([0-9]+)-reverse/) != -1;

                        rowLength = rowArr[0].length;

                        for(var c = 0;c < rowArr[0].length;c++){
                                if(rowArr[0][c].getAttribute(fdTableSort.colspan) && rowArr[0][c].getAttribute(fdTableSort.colspan) > 1){
                                        rowLength = rowLength + (rowArr[0][c].getAttribute(fdTableSort.colspan) - 1);
                                };
                        };

                        workArr = new Array(rowArr.length);
                        
                        for(var c = rowArr.length;c--;){
                                workArr[c]= new Array(rowLength);
                        };

                        for(var c = 0;c < workArr.length;c++){
                                celCount = 0;
                                for(var i = 0;i < rowLength;i++){
                                        if(!workArr[c][i]){
                                                cel = rowArr[c][celCount];
                                                colspan = (cel.getAttribute(fdTableSort.colspan) > 1) ? cel.getAttribute(fdTableSort.colspan):1;
                                                rowspan = (cel.getAttribute(fdTableSort.rowspan) > 1) ? cel.getAttribute(fdTableSort.rowspan):1;
                                                for(var t = 0;((t < colspan)&&((i+t) < rowLength));t++){
                                                        for(var n = 0;((n < rowspan)&&((c+n) < workArr.length));n++) {
                                                                workArr[(c+n)][(i+t)] = cel;
                                                        };
                                                };
                                                if(++celCount == rowArr[c].length) break;
                                        };
                                };
                        };
                        
                        for(var c = 0;c < workArr.length;c++) {
                                for(var i = 0;i < workArr[c].length;i++){

                                        if(workArr[c][i].className.search("fd-column-") == -1) workArr[c][i].className = workArr[c][i].className + " fd-column-" + i;
                                        
                                        if(workArr[c][i].className.match('sortable')) {
                                                workArr[c][i].className = workArr[c][i].className.replace(/forwardSort|reverseSort/, "");

                                                if(i == columnNum) sortable = workArr[c][i];
                                                thtext = fdTableSort.getInnerText(workArr[c][i]);

                                                while(workArr[c][i].firstChild) workArr[c][i].removeChild(workArr[c][i].firstChild);

                                                // Create the link
                                                aclone = a.cloneNode(true);
                                                aclone.appendChild(document.createTextNode(thtext));
                                                aclone.title = "Sort on " + thtext;
                                                a.onclick = workArr[c][i].onclick = fdTableSort.clickWrapper;
                                                workArr[c][i].appendChild(aclone);

                                                // Add the span if needs be
                                                if(showArrow) workArr[c][i].appendChild(span.cloneNode(false));

                                                workArr[c][i].className = workArr[c][i].className.replace(/fd-identical|fd-not-identical/, "");
                                                fdTableSort.disableSelection(workArr[c][i]);
                                        };
                                };
                        };
                        
                        fdTableSort.tmpCache[tbl.id] = {cols:rowLength, headers:workArr};
                        
                        if(sortable) {
                                fdTableSort.thNode = sortable;
                                fdTableSort.initSort();
                                if(reverse) {
                                        fdTableSort.thNode = sortable;
                                        fdTableSort.initSort();
                                };
                        };
                };
        },
        
        disableSelection: function(element) {
                element.onselectstart = function() {
                        return false;
                };
                element.unselectable = "on";
                element.style.MozUserSelect = "none";
        },

        clickWrapper: function(e) {
                e = e || window.event;
                if(fdTableSort.thNode == null) {
                        fdTableSort.thNode = this;
                        fdTableSort.addSortActiveClass();
                        setTimeout("fdTableSort.initSort()",5);

                };
                return fdTableSort.stopEvent(e);
        },

        keyWrapper: function(e) {
                e = e || window.event;
                var kc = e.keyCode != null ? e.keyCode : e.charCode;
                if(kc == 13) {
                        var targ = this;
                        while(targ.tagName.toLowerCase() != "th") targ = targ.parentNode;

                        fdTableSort.thNode = targ;
                        fdTableSort.addSortActiveClass();
                        setTimeout("fdTableSort.initSort()",5);

                        return fdTableSort.stopEvent(e);
                };
                return true;
        },

        jsWrapper: function(tableid, colNum) {
                if(!fdTableSort.tmpCache[tableid] || fdTableSort.tmpCache[tableid].headers[0].length <= colNum || fdTableSort.tmpCache[tableid].headers[0][colNum].className.search(/fd-column/) == -1) return false;
                fdTableSort.thNode = fdTableSort.tmpCache[tableid].headers[0][colNum];
                fdTableSort.addSortActiveClass();
                fdTableSort.initSort();
        },

        addSortActiveClass: function() {
                if(fdTableSort.thNode == null) return;
                fdTableSort.addClass(fdTableSort.thNode, "sort-active");
                fdTableSort.addClass(document.getElementsByTagName('body')[0], "sort-active");
                if("sortInitiatedCallback" in window) {
                        var tableElem   = fdTableSort.thNode;
                        while(tableElem.tagName.toLowerCase() != 'table' && tableElem.parentNode) {
                                tableElem = tableElem.parentNode;
                        };
                        sortInitiatedCallback(tableElem.id);
                };
        },

        removeSortActiveClass: function() {
                fdTableSort.removeClass(fdTableSort.thNode, "sort-active");
                fdTableSort.removeClass(document.getElementsByTagName('body')[0], "sort-active");
                if("sortCompleteCallback" in window) {
                        var tableElem   = fdTableSort.thNode;
                        while(tableElem.tagName.toLowerCase() != 'table' && tableElem.parentNode) {
                                tableElem = tableElem.parentNode;
                        };
                        sortCompleteCallback(tableElem.id);
                };
        },

        addClass: function(e,c) {
                if(new RegExp("(^|\\s)" + c + "(\\s|$)").test(e.className)) return;
                e.className += ( e.className ? " " : "" ) + c;
        },

        removeClass: function(e,c) {
                e.className = !c ? "" : e.className.replace(new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");
        },

        prepareTableData: function(table) {
                var data = [];

                var start = table.getElementsByTagName('tbody');
                start = start.length ? start[0] : table;

                var trs = start.getElementsByTagName('tr');
                var ths = table.getElementsByTagName('th');

                var numberOfRows = trs.length;
                var numberOfCols = fdTableSort.tmpCache[table.id].cols;

                var data = [];
                var identical = new Array(numberOfCols);
                var identVal  = new Array(numberOfCols);

                var tr, td, th, txt, tds, col, row;

                var re = new RegExp(/fd-column-([0-9]+)/);
                var rowCnt = 0;

                var sortableColumnNumbers = [];

                for(var tmp = 0, th; th = ths[tmp]; tmp++) {
                        if(th.className.search(re) == -1) continue;
                        sortableColumnNumbers[sortableColumnNumbers.length] = th;
                };
                
                // Start to create the 2D matrix of data
                for(row = 0; row < numberOfRows; row++) {

                        tr              = trs[row];

                        // Have we any th tags or are we in a tfoot ?
                        if(tr.getElementsByTagName('th').length > 0 || (tr.parentNode && tr.parentNode.tagName.toLowerCase() == "tfoot")) continue;

                        data[rowCnt]    = [];
                        tds             = tr.getElementsByTagName('td');

                        for(var tmp = 0, th; th = sortableColumnNumbers[tmp]; tmp++) {
                                col = th.className.match(re)[1];

                                td  = tds[col];

                                txt = fdTableSort.getInnerText(td) + " ";

                                txt = txt.replace(/^\s+/,'').replace(/\s+$/,'');

                                if(th.className.search(/sortable-date/) != -1) {
                                        txt = fdTableSort.dateFormat(txt, th.className.search(/sortable-date-dmy/) != -1);
                                } else if(th.className.search(/sortable-numeric|sortable-currency/) != -1) {
                                        txt = parseFloat(txt.replace(/[^0-9\.\-]/g,''));
                                        if(isNaN(txt)) txt = "";
                                } else if(th.className.search(/sortable-text/) != -1) {
                                        txt = txt.toLowerCase();
                                } else if(th.className.search(/sortable-([a-zA-Z\_]+)/) != -1) {
                                        if((th.className.match(/sortable-([a-zA-Z\_]+)/)[1] + "PrepareData") in window) {
                                                txt = window[th.className.match(/sortable-([a-zA-Z\_]+)/)[1] + "PrepareData"](td, txt);
                                        };
                                } else if (th.className.search(/sortable-keep/) != -1) {
                                        txt = rowCnt;
                                } else {
									// Fix added for non-sortable-elements classed as sortable // 
                                        if(txt != "" && th.className.search(/sortable/) != -1) {
                                                fdTableSort.removeClass(th, "sortable");
                                                if(fdTableSort.dateFormat(txt) != 0) {
                                                        fdTableSort.addClass(th, "sortable-date");
                                                        txt = fdTableSort.dateFormat(txt);
                                                } else if(txt.search(fdTableSort.regExp_Number) != -1 || txt.search(fdTableSort.regExp_Currency) != -1) {
                                                        fdTableSort.addClass(th, "sortable-numeric");
                                                        txt = parseFloat(txt.replace(/[^0-9\.\-]/g,''));
                                                        if(isNaN(txt)) txt = "";
                                                } else {
                                                        fdTableSort.addClass(th, "sortable-text");
                                                        txt = txt.toLowerCase();
                                                };
                                        };
										/* */
                                };

                                if(rowCnt > 0 && identVal[col] != txt) {
                                        identical[col] = false;
                                };

                                identVal[col]     = txt;
                                data[rowCnt][col] = txt;
                        };

                        // Add the tr for this row
                        data[rowCnt][numberOfCols] = tr;

                        // Increment the row count
                        rowCnt++;
                }

                // Get the row and column styles
                var colStyle = table.className.search(/colstyle-([\S]+)/) != -1 ? table.className.match(/colstyle-([\S]+)/)[1] : false;
                var rowStyle = table.className.search(/rowstyle-([\S]+)/) != -1 ? table.className.match(/rowstyle-([\S]+)/)[1] : false;

                // Cache the data object for this table
                fdTableSort.tableCache[table.id] = { data:data, identical:identical, colStyle:colStyle, rowStyle:rowStyle, noArrow:table.className.search(/no-arrow/) != -1 };
        },

        initSort: function() {

                var span;
                var thNode      = fdTableSort.thNode;

                // Get the table
                var tableElem   = fdTableSort.thNode;
                while(tableElem.tagName.toLowerCase() != 'table' && tableElem.parentNode) {
                        tableElem = tableElem.parentNode;
                };

                // If this is the first time that this table has been sorted, create the data object
                if(!tableElem.id || !(tableElem.id in fdTableSort.tableCache)) {
                        fdTableSort.prepareTableData(tableElem);
                };

                // Cache the table id
                fdTableSort.tableId = tableElem.id;

                // Get the column position using the className added earlier
                fdTableSort.pos = thNode.className.match(/fd-column-([0-9]+)/)[1];

                // Grab the data object for this table
                var dataObj     = fdTableSort.tableCache[tableElem.id];

                // Get the position of the last column that was sorted
                var lastPos     = dataObj.pos ? dataObj.pos.className.match(/fd-column-([0-9]+)/)[1] : -1;

                // Get the stored data object for this table
                var data        = dataObj.data;
                var colStyle    = dataObj.colStyle;
                var rowStyle    = dataObj.rowStyle;
                var len1        = data.length;
                var len2        = data[0].length - 1;
                var identical   = dataObj.identical[fdTableSort.pos] == false ? false : true;
                var noArrow     = dataObj.noArrow;

                if(lastPos != fdTableSort.pos && lastPos != -1) {
                        var th = dataObj.pos;
                        fdTableSort.removeClass(th, "forwardSort");
                        fdTableSort.removeClass(th, "reverseSort");
                        if(!noArrow) {
                                // Remove arrow
                                span = th.getElementsByTagName('span')[0];
                                while(span.firstChild) span.removeChild(span.firstChild);
                        };
                };

                // If the same column is being sorted then just reverse the data object contents.
                var classToAdd = "forwardSort";

                if((lastPos == fdTableSort.pos && !identical) || thNode.className.match(/sortable-keep/)) {
                        data.reverse();
                        classToAdd = thNode.className.search(/reverseSort/) != -1 ? "forwardSort" : "reverseSort";
                        if(thNode.className.match(/sortable-keep/)) fdTableSort.tableCache[tableElem.id].pos = thNode;
                } else {
                        fdTableSort.tableCache[tableElem.id].pos = thNode;
                        if(!identical) {
                                if(thNode.className.match(/sortable-numeric|sortable-currency|sortable-date|sortable-keep/)) {
                                        data.sort(fdTableSort.sortNumeric);
                                } else if(thNode.className.match('sortable-text')) {
                                        data.sort(fdTableSort.sortText);
                                } else if(thNode.className.search(/sortable-([a-zA-Z\_]+)/) != -1 && thNode.className.match(/sortable-([a-zA-Z\_]+)/)[1] in window) {
                                        data.sort(window[thNode.className.match(/sortable-([a-zA-Z\_]+)/)[1]]);
                                };
                        };
                };

                fdTableSort.removeClass(thNode, "forwardSort");
                fdTableSort.removeClass(thNode, "reverseSort");
                fdTableSort.addClass(thNode, classToAdd);

                if(!noArrow) {
                        var arrow = thNode.className.search(/forwardSort/) != -1 ? " \u2193" : " \u2191";
                        span = thNode.getElementsByTagName('span')[0];
                        while(span.firstChild) span.removeChild(span.firstChild);
                        span.appendChild(document.createTextNode(arrow));
                };

                if(!rowStyle && !colStyle && identical) {
                        fdTableSort.removeSortActiveClass();
                        fdTableSort.thNode = null;
                        return;
                }

                var hook = tableElem.getElementsByTagName('tbody');
                hook = hook.length ? hook[0] : tableElem;

                var tr;

                for(var i = 0; i < len1; i++) {
                        tr = data[i][len2];
                        
                        if(colStyle) {
                                if(lastPos != -1) {
                                        fdTableSort.removeClass(tr.getElementsByTagName('td')[lastPos], colStyle);
                                }
                                fdTableSort.addClass(tr.getElementsByTagName('td')[fdTableSort.pos], colStyle);
                        };
                        if(!identical) {

                                if(rowStyle) {
                                        if(i % 2) fdTableSort.addClass(tr, rowStyle);
                                        else fdTableSort.removeClass(tr, rowStyle);
                                };
                                hook.removeChild(tr); /* Netscape 8.1.2 requires the removeChild call */
                                hook.appendChild(tr);
                        };
                };
                fdTableSort.removeSortActiveClass();
                fdTableSort.thNode = null;
        },

        getInnerText: function(el) {
                if (typeof el == "string" || typeof el == "undefined") return el;
                if(el.innerText) return el.innerText;

                var txt = '', i;
                for (i = el.firstChild; i; i = i.nextSibling) {
                        if (i.nodeType == 3)            txt += i.nodeValue;
                        else if (i.nodeType == 1)       txt += fdTableSort.getInnerText(i);
                };

                return txt;
        },
        
        dateFormat: function(dateIn, favourDMY) {
                var dateTest = [
                        { regExp:/^(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])([- \/.])(\d\d?\d\d)$/, d:3, m:1, y:5 },  // mdy
                        { regExp:/^(0[1-9]|[12][0-9]|3[01])([- \/.])(0[1-9]|1[012])([- \/.])(\d\d?\d\d)$/, d:1, m:3, y:5 },  // dmy
                        { regExp:/^(\d\d?\d\d)([- \/.])(0[1-9]|1[012])([- \/.])(0[1-9]|[12][0-9]|3[01])$/, d:5, m:3, y:1 }   // ymd
                        ];

                var start;
                var cnt = 0;

                while(cnt < 3) {
                        start = (cnt + (favourDMY ? 4 : 3)) % 3;

                        if(dateIn.match(dateTest[start].regExp)) {
                                res = dateIn.match(dateTest[start].regExp);
                                y = res[dateTest[start].y];
                                m = res[dateTest[start].m];
                                d = res[dateTest[start].d];
                                if(m.length == 1) m = "0" + m;
                                if(d.length == 1) d = "0" + d;
                                if(y.length != 4) y = (parseInt(y) < 50) ? '20' + y : '19' + y;

                                return y+m+d;
                        }

                        cnt++;
                }

                return 0;
        },

        sortDate: function(a,b) {
                var aa = a[fdTableSort.pos];
                var bb = b[fdTableSort.pos];

                return aa - bb;
        },

        sortNumeric:function (a,b) {
                var aa = a[fdTableSort.pos];
                var bb = b[fdTableSort.pos];

                if(aa === "" && !isNaN(bb)) return -1;
                else if(bb === "" && !isNaN(aa)) return 1;
                else if(aa == bb) return 0;

                return aa - bb;
        },

        sortText:function (a,b) {
                var aa = a[fdTableSort.pos];
                var bb = b[fdTableSort.pos];

                if(aa == bb) return 0;
                if(aa < bb)  return -1;

                return 1;
        }
};

fdTableSort.addEvent(window, "load", fdTableSort.init);

function initialZebraStripe() {

 var tables = document.getElementsByTagName("table");
        var rowStyle, start, trs;

        for(var k = 0, table; table = tables[k]; k++) {
                if(table.className.search(/rowstyle-([\S]+)/) == -1 || table.className.search(/sortable-onload/) != -1) continue;

                rowStyle = table.className.match(/rowstyle-([\S]+)/)[1];

                start = table.getElementsByTagName('tbody');
                start = start.length ? start[0] : table;
                trs   = start.getElementsByTagName('tr');

                for(var i = 0, tr; tr = trs[i]; i++) {
                        if(tr.getElementsByTagName('th').length > 0 || (tr.parentNode && tr.parentNode.tagName.toLowerCase() == "tfoot")) continue;

                        if(i % 2) fdTableSort.addClass(tr, rowStyle);
                        else fdTableSort.removeClass(tr, rowStyle);
                };
        };
};
fdTableSort.addEvent(window, "load", initialZebraStripe);
/* END TableSort */




/* Zebra Stripe */

  function hasClass(obj) {
     var result = false;
     if (obj.getAttributeNode("class") != null) {
         result = obj.getAttributeNode("class").value;
     }
     return result;
  }   

 function stripe(id) {

    var even = false;
  
    var evenColor = arguments[1] ? arguments[1] : "#fff";
    var oddColor = arguments[2] ? arguments[2] : "#F4F8FB";
  
    var table = document.getElementById(id);
    if (! table) { return; }
    
    var tbodies = table.getElementsByTagName("tbody");

    for (var h = 0; h < tbodies.length; h++) {
    
      var trs = tbodies[h].getElementsByTagName("tr");
      
      for (var i = 0; i < trs.length; i++) {

        if (! hasClass(trs[i]) &&
            ! trs[i].style.backgroundColor) {
 		  
          var tds = trs[i].getElementsByTagName("td");
        
          for (var j = 0; j < tds.length; j++) {
        
            var mytd = tds[j];

            if (
				/*! hasClass(mytd) && */
                ! mytd.style.backgroundColor) {
        
              mytd.style.backgroundColor =
                even ? evenColor : oddColor;
            
            }
          }
        }
        even =  ! even;
      }
    }
  }  
  /* END ZebraStripe */
function setUpCrosshairs(){
	var tableList = document.getElementsByTagName("TABLE");
	for(var i=0;i<tableList.length;i++){
		if(tableList[i].className.match(/crosshairTable/gim)){
			var tdList = tableList[i].getElementsByTagName("TBODY")[0].getElementsByTagName("TD");
			for(var j=0;j<tdList.length;j++){
				tdList[j].onmouseover = crossHair;
				tdList[j].onmouseout = clearMe;
			}
			tableList[i].onmouseout = clearCrosshair;
		}
		else{
				continue;
			}
	}
	
}

function clearMe(){
	this.className = this.className.replace("crossHair"," ");
}

function crossHair(){
	this.className += " crossHair";
	var myTable = this.parentNode.parentNode.parentNode;
	var trList = this.parentNode.parentNode.getElementsByTagName("TR");
	
	for(var i=0;i<trList.length;i++){
			trList[i].className = trList[i].className.replace("crossHair","");
	}
	
	this.parentNode.className += " crossHair";
	
	myLoc = 0;
	var tdList = this.parentNode.getElementsByTagName("TD");
	for(var i=0;i<tdList.length;i++){
		if(tdList[i] == this){
			myLoc = i;
		}
	}
	
	var colList = myTable.getElementsByTagName("COL");
	for(var i=0;i<colList.length;i++){
		if(i==myLoc){
			colList[i].className += " crossHair";
		}else{
			colList[i].className = (colList.className)?colList.className.replace(" crossHair",""):"";
		}
	}
	
	return false;
}

var clearCrosshairTimeout;

function clearCrosshair(){
	var myTable = this
	var trList = myTable.getElementsByTagName("TBODY")[0].getElementsByTagName("TR");
	
	for(var i=0;i<trList.length;i++){
			trList[i].className = trList[i].className.replace("crossHair","");
	}
	

	var colList = myTable.getElementsByTagName("COL");
	for(var i=0;i<colList.length;i++){
		colList[i].className = (colList.className)?colList.className.replace(" crossHair",""):"";
	}
	return false;
}


if(window.attachEvent ){
	window.attachEvent( "onload", setUpCrosshairs);
}else{
    window.addEventListener( "load", setUpCrosshairs, false );
}


/* Added as per Jeff -  7/13/2007  */

function startDragRatchetSlider(e){
			evt = (e)?e:((event)?event:null);
			 button = (evt.button)?evt.button:((evt.which)?evt.which:null);
			 currentObj = (evt.srcElement)?evt.srcElement:((evt.target)?evt.target:null);
			 if(isNaN(parseInt(currentObj.style.left)))currentObj.style.left = 0;
			 //currentObj = currentObj.parentNode;
			 if (button == 1) {
				document.body.ondragstart = function(){return false;}
				document.body.ondrag = function(){return false;}
				document.body.onselectstart = function(){return false;}
				//closeRiskDisplay();
				currentObj.offsetX = parseInt(currentObj.style.left) - (evt.clientX);//findPosX(currentObj)
				currentObj.offsetY = parseInt(currentObj.style.top) - (evt.clientY);//findPosY(currentObj)
				document.body.onmousemove = draggingRatchetSlider; 
				document.body.onmouseup = endDragRatchetSlider;
				document.body.onselectstart = null;
				evt.cancelBubble = true;
				evt.stopPropagation = true;
                evt.preventDefault = true;
			 }else{
			 	currentObj = null;
			 }
		}
		var oldX = 0;
		var ratchet = 62;
		var slots = 8;
		function draggingRatchetSlider(e){
			evt = (e)?e:((event)?event:null);
			if(currentObj && evt){
				var x = evt.clientX + currentObj.offsetX;
				var y = evt.clientY + currentObj.offsetY;
				if(Math.round(x/ratchet) < slots && Math.round(x/ratchet) >= 0){
					newX = 0 + ratchet*Math.round(x/ratchet);
					if(newX != oldX){
						currentObj.style.left = newX + "px";
						currentObj.parentNode.style.cursor="W-resize";
						if(newX != 0){$("risk_panel_default").style.display = "none";}
						for(i=0;i<slots;i++){
							$("risk_label_" + i).style.display = "none";
							$("risk_panel_" + i).style.display = "none";
						}
						
						if(newX != 0){
							//$("risk_label_" + Math.round(x/ratchet)).style.display = "";
							$("risk_panel_" + Math.round(x/ratchet)).style.display = "";
						}else{
							for(i=0;i<slots;i++){
								$("risk_label_" + i).style.display = "none";
								$("risk_panel_" + i).style.display = "none";
							}
							$("risk_panel_default").style.display = "";
							$('slider').className="slider"; 
						}
						//$('test').innerHTML = Math.round(x/ratchet);
						$("risk_panel_" + Math.round(x/ratchet)).style.display = "block";
						oldX = newX;
					} else {}
				}
			}
		}
		function endDragRatchetSlider(e){
			evt = (e)?e:((event)?event:null);
				var x = evt.clientX + currentObj.offsetX;
				var y = evt.clientY + currentObj.offsetY;
				if(Math.round(x/ratchet) < slots && Math.round(x/ratchet) >= 0){
					newX = 0 + ratchet*Math.round(x/ratchet);
				}else{ newX = oldX }
						currentObj.style.left = newX + "px";
						for(i=0;i<slots;i++){
							$("risk_panel_" + i).style.display = "none";
							$("risk_label_" + i).style.display = "none";
						}
						
						if(Math.round(newX/ratchet)!=0){
							$("risk_panel_default").style.display = "none";
							$("risk_panel_" + Math.round(newX/ratchet)).style.display = "block";
							//$('slider').className="sliderAlt";
						}else{
							$("risk_panel_default").style.display = "";
							$("risk_panel_" + Math.round(newX/ratchet)).style.display = "none";
							//$('slider').className="slider";
						}
						currentObj.parentNode.style.cursor="default";
			document.body.onmousemove = null;
			document.body.onmouseup = null;
			// if(currentObj && evt)currentObj.className = "panelSection";
		}
		function closeRiskDisplay(){
			for(i=0;i<slots;i++){
				$("risk_panel_" + i).style.display = "none";
			}
			$("risk_panel_default").style.display = "";
			$('slider').className="slider";
			currentObj.parentNode.style.cursor="default";
		}


/* ****** Start code for pop-up window ***** */
var currentObj; 
		
		function findPosX(obj){
			try {
				var curleft = 0;
				while (obj.offsetParent){
					curleft += parseInt(obj.offsetLeft);
					obj = obj.offsetParent;
				}
			return curleft;
			}catch(e){ return 0 }
		}
		
		function findPosY(obj){
			try{
				var curtop = 0;
				while (obj.offsetParent){
					curtop += parseInt(obj.offsetTop);
					obj = obj.offsetParent;
				}
			return curtop;
			}catch(e){return 0}
		}
	
	    // This is the newest and most functional getWindowWidth (need to properly camel-case these functions)
		function GetWindowWidth()
		{
			var width =
				document.documentElement && document.documentElement.clientWidth ||
				document.body && document.body.clientWidth ||
				document.body && document.body.parentNode && document.body.parentNode.clientWidth ||
				0;
			return width;
		}
		function GetWindowHeight()
		{
			var height=0;
			if (typeof(window.innerHeight)=='number') {
				height=window.innerHeight;
			}else {
				if (document.documentElement&&
				document.documentElement.clientHeight) {
				height=document.documentElement.clientHeight;
				}else {
					if (document.body&&document.body.clientHeight) {
					height=document.body.clientHeight;}
				}
			}
			return height;
		}
	var divList;
	var dir;
	
	function buildModalWindow(pdir,pw,ph,con,pleft,ptop,indexObject){
		try{
			dir = (pdir.match("left") || pdir.match("right") || pdir.match("top"))?pdir:"left";
			var width = (pw)?pw:500;
			var height = (ph)?ph:500;
			var content = con;
			var left,top;
			if(!content || !$(content)){ throw "No Content";}
			if(indexObject && $(indexObject)){
				left = findPosX($(indexObject)) + pleft;
				top = findPosY($(indexObject)) + ptop;
			}else{
				left = parseInt(((GetWindowWidth()  - width)/2) + (document.documentElement.scrollLeft + document.body.scrollLeft));
				top = parseInt(((GetWindowHeight() - height)/2) + (document.documentElement.scrollTop + document.body.scrollTop));
			}
			
			var divList = $(dir + "ModalWindowShadow").getElementsByTagName("DIV");
			var hasOuterBorder = 0;
			var bottomMain;
			for(i=0;i<divList.length;i++){
				if(divList[i].className.match("png_bottomBorder")){
					divList[i].style.width = (width - 10) + "px";
					bottomMain = divList[i];
				}
				
				if(divList[i].className.match("png_rightBorder") || divList[i].className.match("png_leftBorder")){
					divList[i].style.height = (height - 12) + "px";
					hasOuterBorder = 1;
				}
				
			}
			if(!$(content).equals($(dir + "ModalWindowContent").firstChild)){
				if($(dir + "ModalWindowContent").childNodes > 0){
					$(dir + "ModalWindowContent").firstChild.style.display = "none";
					document.body.appendChild($(dir + "ModalWindowContent").firstChild);
				}
				$(dir + "ModalWindowContent").appendChild($(content));
				$(content).style.display = "";
			}
			$(dir + "ModalWindowContent").parentNode.style.width = width + "px";
			$(dir + "ModalWindowContent").parentNode.style.height = height + "px";
			$(dir + "ModalWindowContent").style.height = height + "px";
			$(dir + "ModalWindowContent").style.width = width + "px";
			$(dir + "ModalWindowShadow").style.left = left + "px";
			$(dir + "ModalWindowShadow").style.top = top + "px";
			$(dir + "ModalWindowShadow").style.display = "";
			if(!hasOuterBorder && bottomMain){
				bottomMain.style.width = (parseInt(bottomMain.style.width) - 10) + "px";
				$(dir + "ModalWindowContent").parentNode.style.width = (width - 10) + "px";
			}
		}catch(e){
			if(e == "No Content"){
				alert("You need to provide content\nfor your popup window")
			}else{
				alert(e.message + "\n" + e.description);
			}
		}
	}
	
	function resizeModalWindow(h){
		var divList = $(dir + "ModalWindowShadow").getElementsByTagName("DIV");	
	}
	function resizeModalWindow(w,h){
		var bottomMain;
		var hasOuterBorder = 0;
		var divList = $(dir + "ModalWindowShadow").getElementsByTagName("DIV");
		for(i=0;i<divList.length;i++){
			if(divList[i].className.match("png_bottomBorder") && w != 0){
				divList[i].style.width = (w - 10) + "px";
				bottomMain = divList[i];
			}
			if((divList[i].className.match("png_rightBorder") || divList[i].className.match("png_leftBorder"))){
				if(h != 0){divList[i].style.height = (h - 10) + "px";}
				hasOuterBorder = 1;
			}
		}
		if(hasOuterBorder && bottomMain && w!=0){
			bottomMain.style.width = (parseInt(bottomMain.style.width) + 10) + "px";
		}
		if(w!=0){
			$(dir + "ModalWindowContent").parentNode.style.width = w + "px";
			$(dir + "ModalWindowContent").style.width = w + "px";
		}
		if(h!=0){
			$(dir + "ModalWindowContent").parentNode.style.height = (h) + "px";
			$(dir + "ModalWindowContent").style.height = (h) + "px";
		}
	}
		function centerDiv(obj){
			var left = document.all ? document.documentElement.scrollLeft : 0;
			var top = document.all ? document.documentElement.scrollTop : 0;
			obj.style.left = Math.max((left + (GetWindowWidth() - obj.offsetWidth) / 2), 0) + 'px';
			obj.style.top = Math.max((top + (GetWindowHeight() - obj.offsetHeight) / 2), 0) + 'px';
		}
		function closeModalWindow(){
			var tableList = document.getElementsByTagName("TABLE");
			for(i=0;i<tableList.length;i++){
				if(tableList[i].className.match("panelSection")){
					tableList[i].style.display = "none";
				}
			}
		}
		// This start-drag function needs to be universalized for dragging in general (passed an object, perhaps?)
		function startDrag(e){
			evt = (e)?e:((event)?event:null);
			 button = (evt.button)?evt.button:((evt.which)?evt.which:null);
			 currentObj = (evt.srcElement)?evt.srcElement:((evt.target)?evt.target:null);
			 if (button == 1 && currentObj.className != "navImg" ) {
				if( !currentObj.className.match("panelSection") ){
					while(currentObj.nodeName != "BODY"){
						if(currentObj.className.match("panelSection")){
							break;
						}
						currentObj = currentObj.parentNode;
					}
				}
				document.body.ondragstart = function(){return false;}
				document.body.ondrag = function(){return false;}
				document.body.onselectstart = function(){return false;}
				currentObj.offsetX = parseInt(currentObj.style.left) - (evt.clientX);//findPosX(currentObj)
				currentObj.offsetY = parseInt(currentObj.style.top) - (evt.clientY);//findPosY(currentObj)
				currentObj.className = "panelSectionMoving";
				document.body.onmousemove = dragging; 
				document.body.onselectstart = null;
				evt.cancelBubble = true;
				evt.stopPropagation = true;
                evt.preventDefault = true;
			 }else{
			 	currentObj = null;
			 }
		}
		function dragging(e){
			evt = (e)?e:((event)?event:null);
			if(currentObj && evt){
				var x = evt.clientX + currentObj.offsetX;
				var y = evt.clientY + currentObj.offsetY;
				currentObj.style.left = x+"px";
				currentObj.style.top = y+"px";
			}
		}
		function endDrag(e){
			evt = (e)?e:((event)?event:null);
			var x = evt.clientX;
			var y = evt.clientY;
			document.body.onmousemove = null;
			if(currentObj && evt)currentObj.className = "panelSection";
		}
/* ****** End code for pop-up window ***** */	
