// VERSION 1.5
//----- BEGIN JAS STUFF
String.prototype.trim = function()
{
    return this.replace(/^\s*|\s*$/g,"");
}

/* this following line will be replaced at build time with the version specified */
var IAML_VERSION = "2.0";
function displayIamlVersion() { typeof IAML_VERSION == "undefined" ? alert("No version information available.") : alert(IAML_VERSION); }

var JAS_THRBSTL = 'width: 6em; padding: 3px; font-size: x-small; background-color:#2A6AAE; border-top: 1px solid gray; border-left: 1px solid gray; border-right: 1px solid white; border-bottom: 1px solid white; color: white;';
var JAS_THRBSTR = '<div style="' + JAS_THRBSTL + '">Loading...</div>'
function getHttpRequest()
{
	var req;

	if ( typeof XMLHttpRequest != 'undefined' ) { req = new XMLHttpRequest(); }
	else { try { req = new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) { req = new ActiveXObject('Microsoft.XMLHTTP'); };	};
	return req;
}

document.getJasThrobber =
	function()
	{
		var throbber = document.getElementById( 'jasThrobber' );

		if( throbber == null )
		{
			var throbber = 
				JasDomUtil.elFromString( '<div id="jasThrobber" class="autoJasThrobber" style="' + JAS_THRBSTL 
					+ 'z-index=10000;position:absolute;top:0px; padding:3px; margin: 0px; display:none;">'
					+ 'Loading...</div>' );
			document.body.appendChild( throbber );
			throbber.style.left = ( document.body.offsetWidth - throbber.offsetWidth - 40 ) + 'px';
		} 
		return throbber;
	}
document.showJasThrobber = function() { var throbber = document.getJasThrobber(); throbber.style.display = 'block'; if( throbber.className=="autoJasThrobber" ){ throbber.style.left = ( document.body.offsetWidth - throbber.offsetWidth - 40 ) + 'px'; }; }
document.hideJasThrobber = function() { var throbber = document.getJasThrobber().style.display = 'none'; }


function JasMap()
{
   this.size=0;
   this.map=new Object();
   this.putVal = function( key, val ){ if (this.getVal(key) == null) this.size++; this.map[key] = val;};
   this.getVal = function( key ){ return ( typeof this.map[key] != 'undefined' ) ? this.map[key] : null };
   this.removeVal = function( key ){if (this.getVal(key) != null) this.size--; delete this.map[key]; };
   this.clear = function(){ this.map = new Object(); this.size=0;};
}

function JasPropertiesManager(){}
JasPropertiesManager.properties = new JasMap();
JasPropertiesManager.putElProps = function( elId, elProps ){ JasPropertiesManager.properties.putVal( elId, elProps ); };
JasPropertiesManager.getElProps = function( elId, createIfNone ){ var elProps = JasPropertiesManager.properties.getVal( elId ); if( ! elProps && createIfNone ){ JasPropertiesManager.putElProps( elId, new JasMap() ); }; return JasPropertiesManager.properties.getVal( elId ); };
JasPropertiesManager.putElProperty = function( elId, propName, propVal ){ var elProps = JasPropertiesManager.getElProps( elId, true ); elProps.putVal( propName, propVal ); };
JasPropertiesManager.getElProperty = function( elId, propName ){ var elProps = JasPropertiesManager.getElProps( elId, false ); if( elProps ){ return elProps.getVal( propName ); }; return null; };
new JasPropertiesManager();

function JasEventManager(){}
JasEventManager.evts = new JasMap();
JasEventManager.cNotId = '';
JasEventManager.add = function( id, handler, payload, cancelDefault ){ var o = new Object(); o.handler=handler; o.payload=payload; o.cancelDefault = ( cancelDefault == null ) ? true : cancelDefault; JasEventManager.evts.putVal( id, o ); };
JasEventManager.fire = function( evt )
{ 
    evt.targetEl = ( document.all ) ? event.srcElement : evt.target;  
    var o = null;
    if( ( ! evt.targetEl ) || ( JasEventManager.cNotId != evt.targetEl.id ) )
    {
		o = JasEventManager.evts.getVal ( 'nextunmatched' ); 
		if( o )
		{ 
			evt.payload  = ( o.payload != null ) ? o.payload : null; o.handler( evt ); 
		};
		
	}
	o = JasEventManager.evts.getVal ( evt.targetEl.id );
    if( o ) { 
    	evt.payload  = ( o.payload != null ) ? o.payload : null; o.handler( evt ); 
    	if( o.cancelDefault )
    	{ 
    		if( !document.all){evt.preventDefault()}; 
    		return false; 
    	};
    }
};
new JasEventManager();

function JasCleanupThread()
{
    setInterval( JasCleanupThread.cleanup, 20000 );
}
JasCleanupThread.cleanup = function(){ 
	for( key in JasPropertiesManager.properties.map ){ var el = document.getElementById(key);if(!el){ JasPropertiesManager.properties.removeVal( key ); JasLogger.trace( 'run props cleanup for: ' + key ); }; }; 
	for( key in JasEventManager.evts.map ){  if( key != 'nextunmatched' ){ var el = document.getElementById(key);if(!el){ JasEventManager.evts.removeVal( key ); JasLogger.trace( 'run evts cleanup for: ' + key );}; }; }; 
	};
new JasCleanupThread();

if( typeof JasLogger == 'undefined' ) 
{
	eval( 'function JasLogger(){};' );
	JasLogger.trace = function(){};
	JasLogger.debug = function(){};
	JasLogger.error = function(){};
	JasLogger.info = function(){};
}

function Empty_Handler() {};
function JasRemoteRequest(url, requestMethod, handler, args, showDefaultThrobber )
{
    if( arguments.length == 0 ){ return };
    if( ( typeof showDefaultThrobber == "undefined" ) || ( showDefaultThrobber == null ) ) { showDefaultThrobber = true; };
    if  ( typeof this.http != 'undefined' ) { this.http.abort(); };
    this.http = getHttpRequest(); 
    var mode = ( ( typeof requestMethod == 'undefined' ) || ( requestMethod == null ) || ( requestMethod.toUpperCase() == "POST" ))?"POST":"GET";
    var queryStringMarkerIndex = url.indexOf( "?" );
    JasLogger.debug( 'requesting(' + mode + '):' + url );
    var openUrl = (requestMethod=="GET" || queryStringMarkerIndex < 0 ) ?  url : url.substring( 0, queryStringMarkerIndex );
    this.http.open(mode,openUrl,true);
    var httpClos = this.http;
   
    if(mode=="POST"){ this.http.setRequestHeader('Content-Type','application/x-www-form-urlencoded; charset=UTF-8');}

    this.http.onreadystatechange =   
    	function()
	{
		if( httpClos.readyState==4 )
		{
			var status;
			try
			{
				status = httpClos.status;
				if ( status == 200 )
				{
					JasLogger.debug( 'received response:' + httpClos.responseText );
					document.hideJasThrobber();
					
					handler( httpClos.responseText.trim(), args );
				}
				else
				{
					JasLogger.error( 'Status returned: ' + status );
				}

			}
			catch(e)
			{
				JasLogger.error( 'Problem in response: ' + e.message );
			}
			
			httpClos.onreadystatechange = Empty_Handler;
			httpClos = null;

		}
	};


    try
    {
        var postArgs = url.substring( queryStringMarkerIndex + 1 );
        if( showDefaultThrobber ) { document.showJasThrobber(); }
        this.http.send( postArgs );
    }
    catch( e )
    {
    	JasLogger.error( 'problem during send: ' + e.message );
    }
}


JasRemoteRequest.toGetStyleString = 
	function ( frm )
	{
		var queryString = '?';
		for ( var i = 0; i < frm.elements.length; i++ )
		{

			var elm = frm.elements[i];
			if (!elm.name || typeof(elm.value) == 'undefined') { }
			else
			{
				var buff = '';
				var okToInclude = true;
				if ( elm.tagName != 'SELECT' )
				{
					if( ( elm.type == 'radio' || elm.type == 'checkbox' ) && ( ! elm.checked ) ){ okToInclude = false; };
				}
				else if ( elm.multiple )
				{
					for( var x=0; x<elm.options.length; x++ )
					{
					    if( elm.options[x].selected ){ queryString += elm.name + "=" + encodeURIComponent( elm.options[x].value ) + "&"; };
					}
					okToInclude = false;
				}
				if( okToInclude )
				{
					buff += elm.value;
					queryString += elm.name + "=" + encodeURIComponent( buff ) + "&";
				}
			}
		}
	    return queryString;
	 }
new JasRemoteRequest();

function JasUidGenerator(){};
JasUidGenerator.currentUid = new Date().getMilliseconds();
JasUidGenerator.getNextUid = function(){ return JasUidGenerator.currentUid++; };
new JasUidGenerator();

function JasDomUtil(){};
JasDomUtil.removeSelf = function( el ){ el.parentNode.removeChild( el ); };
JasDomUtil.elFromString = function( str ){ var temp = document.createElement( 'div' ); temp.innerHTML = str; return temp.firstChild; };
JasDomUtil.addIframeCover = function( id )
{
	var toCover = document.getElementById( id );
	var ifr = JasDomUtil.elFromString( '<iframe id="' + id + '_frameCover" style="z-index:9989;position:absolute;' + ((document.all)? 'filter:alpha(opacity=0)' : 'opacity:0;' ) + 'border:0px;left:' + toCover.offsetLeft + 'px;width:' + toCover.offsetWidth + 'px;height:' + toCover.offsetHeight + 'px;top:' + toCover.offsetTop + 'px"></iframe>' );
	ifr.style.zIndex = JasDomUtil.topZ++;
	toCover.parentNode.appendChild( ifr ); 
}
JasDomUtil.removeIframeCover = function ( id ){ var cover = document.getElementById( id + '_frameCover' ); if( cover != null ) { JasDomUtil.removeSelf( cover ); }; };
JasDomUtil.getBareText = function ( el )
{
   if (typeof el == "string") return el;
   if (typeof el == "undefined") { return el };
   if (el.innerText) return el.innerText;  //Not needed but it is faster
   var str = "";

   var cs = el.childNodes;
   var l = cs.length;
   for (var i = 0; i < l; i++)
   {
       switch (cs[i].nodeType)
       {
           case 1: //ELEMENT_NODE
               str += document.getBareText(cs[i]);
               break;
           case 3: //TEXT_NODE
               str += cs[i].nodeValue;
               break;
       }
   }
   return str;
}
JasDomUtil.recursedOffsetLeft = function( el )
{
        var left = el.offsetLeft;
        var cur = el.parentNode; 
        var str = '';
        while( cur.parentNode )
	{ 
		cur = cur.parentNode; 
		if( cur.offsetLeft  )
		{ 
			var curStl = ( document.all ) ? cur.currentStyle : document.defaultView.getComputedStyle( cur, null );
			if( curStl.position == 'relative' || curStl.left=="auto") { left += cur.offsetLeft; }; 
		}; 
	}; var mod = (document.all) ? 10: 10; return left -mod;	//TODO: correct constant - wasn't in beta
}
JasDomUtil.recursedOffsetTop = function( el )
{
        var top = el.offsetTop;
        var othr = 0;
        var cur = el.parentNode; 
	while( cur.parentNode )
	{ 
		cur = cur.parentNode; 
		if( cur.offsetTop ) 
		{ 
			var curStl = ( document.all ) ? cur.currentStyle : document.defaultView.getComputedStyle( cur, null );
			if( curStl.position == 'relative' || curStl.top=="auto") { top += cur.offsetTop;  }; 
		}; 
	}; var mod = (document.all) ? 10: 22; return top -mod;	//TODO: correct constant - wasn't in beta		
}


function findPosition(obj) 
{
	if (obj == null) return null;
	
	var curleft = curtop = 0;
	if (obj.offsetParent) 
	{
		curleft = obj.offsetLeft
		curtop = obj.offsetTop
		while (obj = obj.offsetParent) 
		{
			curleft += obj.offsetLeft
			curtop += obj.offsetTop
		}
	}
	return [curleft,curtop];
}

JasDomUtil.topZ = 9999;
JasDomUtil.faderSpeed = 250;
var opacity = 100;
JasDomUtil.fader = function( id, onDone )
{
	var el = document.getElementById( id );
	if( el )
	{
	   var opacity = JasPropertiesManager.getElProperty( id, 'opacity' );
	   ( document.all ) ? el.style.filter = "alpha(opacity=" + opacity + ");" : el.style.opacity = ( opacity / 100 );
	   document.body.className = document.body.className;
	   opacity -= 10;
	   JasPropertiesManager.putElProperty( id, 'opacity', opacity );
	   if( opacity >= 0 ){  window.setTimeout( "JasDomUtil.fader( '" + id + "', '" + onDone + "' )", JasDomUtil.faderSpeed );  } else if( onDone ){ eval( onDone + "(el)" ); };
	}
}

JasDomUtil.beginDrag = function( el, evt )
{
        var oldss = document.body.onselectstart;
        document.body.onselectstart = function () { return false; };
        var cover = document.getElementById( el.getAttribute( 'id' ) + "_frameCover" );
        (document.all) ? el.style.filter = 'alpha(opacity=40)' : el.style.opacity = .4;        
        
        var x = parseInt( el.style.left );
	var y = parseInt( el.style.top );
	deltaX = evt.clientX - x;
	deltaY = evt.clientY - y;
	if( document.addEventListener ) { document.addEventListener( 'mousemove', JasDomUtil_drag, true ); document.addEventListener( 'mouseup', JasDomUtil_drop, true ); }
	else{  document.attachEvent( 'onmousemove', JasDomUtil_drag ); document.attachEvent( 'onmouseup', JasDomUtil_drop ); };
	if( evt.stopPropigation ){ evt.stopPropigation(); } else { evt.cancelBubble = true; };
	if( evt.preventDefault ){ evt.preventDefault(); } else { evt.returnValue = false; };

	function JasDomUtil_drag( evt )
	{
		
		if( !evt) evt = window.event;
		var newX = (evt.clientX - deltaX ) + 'px';
		var newY = ( evt.clientY - deltaY ) + 'px';
		if( cover ){ cover.style.left = newX; cover.style.top = newY; };
		el.style.left = newX; el.style.top = newY;
		if( evt.stopPropigation ){ evt.stopPropigation(); } else { evt.cancelBubble = true; };
	}
	
	function JasDomUtil_drop( evt )
	{
		
	    if( !evt) evt = window.event;
	    if( document.removeEventListener ){ document.removeEventListener( 'mouseup', JasDomUtil_drop, true ); document.removeEventListener( 'mousemove', JasDomUtil_drag, true ); }
	    else { document.detachEvent( 'onmouseup', JasDomUtil_drop ); document.detachEvent( 'onmousemove', JasDomUtil_drag ); };
	    document.body.onselectstart = oldss;
	    //
	    (document.all) ? el.style.filter = '' : el.style.opacity = 1;
	    if( evt.stopPropigation ){ evt.stopPropigation(); } else { evt.cancelBubble = true; };

	}
	
}

JasDomUtil.centerInBlock = function ( el, blok )
{
	var elementWidth = el.offsetWidth;
	var elementHeight = el.offsetHeight;

	var blockWidth = (blok == document.body) ?  JasDomUtil.getWindowWidth() :  el.offsetWidth;
	var blockHeight = (blok == document.body) ?  JasDomUtil.getWindowHeight() :  el.offsetHeight;

	var scrollTop = 0; 
	var scrollLeft = 0;
	if (window.pageYOffset)
	{
		scrollLeft= self.pageXOffset;
		scrollTop  = self.pageYOffset;
	}
	
	else
	{	
		if (blok == document.body && document.documentElement && document.documentElement.scrollTop)
		{
			scrollLeft = document.documentElement.scrollLeft;
			scrollTop = document.documentElement.scrollTop;
		}
		else
		{
			scrollTop = parseInt(blok.scrollTop,10);
			scrollLeft = parseInt(blok.scrollLeft,10);
		}
	}

	JasLogger.info( '--------scrollTop:' + scrollTop );	JasLogger.info( '--------scrollLeft:' + scrollLeft );
	el.style.top = (scrollTop + ((blockHeight - elementHeight) / 2)) + "px";
	el.style.left =  (scrollLeft + ((blockWidth - elementWidth) / 2)) + "px";
	JasLogger.info( '--------el.style.top:' + el.style.top );	
	JasLogger.info( '--------el.style.left' + el.style.left );
}
	
JasDomUtil.getWinRef = function ( oWin, id )
{
    var fras = oWin.frames;
    var ret = null;
    for( var i=0; i<fras.length; i++ )
    {
        if( fras[i].frameElement.getAttribute( 'id' ) == id )
        {
            JasLogger.debug('FOUND IFRAME id: ' + id );
            return fras[i];
        } else { return JasDomUtil.getWinRef( fras[i], id ) }
    } JasLogger.debug('UNABLE TO FIND IFRAME id: ' + id ); return ret;
}

JasDomUtil.importN = function ( d, n, b )
{
    if( ! document.all )
    {
        return d.importNode( n, b );
    }
    else
    {
        var t = d.createElement( 'div' );
        t.innerHTML = n.outerHTML;
        return t.firstChild;
    }
}

JasDomUtil.getWindowHeight = function()
{
	if (window.innerHeight!=window.undefined) return window.innerHeight;
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
	if (document.body) return document.body.clientHeight; 
	return window.undefined; 
}
JasDomUtil.getWindowWidth= function() 
{
	if (window.innerWidth!=window.undefined) return window.innerWidth; 
	if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth; 
	if (document.body) return document.body.clientWidth; 
	return window.undefined; 
}

JasDomUtil.addEvent = function(eventName, element, eventHandler)
{
	if (! element || !eventName || !eventHandler) return;
	if (window.attachEvent){if(element == window) element = document;element.attachEvent("on" + eventName, eventHandler);}else element.addEventListener(eventName, eventHandler, false);
}
JasDomUtil.removeEvent = function(eventName, element, eventHandler)
{
	if (! element || !eventName || !eventHandler) return;
	if (window.removeEventListener)	element.removeEventListener(eventName, eventHandler, false); else if (window.detachEvent){ if(element == window) element = document; element.detachEvent('on' + eventName, eventHandler)};
}
JasDomUtil.preventDefaultAction = function(event)
{
	if (event && typeof  event.preventDefault != "undefined"){	event.preventDefault();	event.stopPropagation();}else if (event && typeof event.cancelBubble != "undefined"){event.returnValue = false;event.cancelBubble = true;}
}

new JasDomUtil();




;//----- BEGIN DUML INTERPRETER 
DumlInterpreter.removeScriptComments = function() 
{
	if(navigator == null) return false;
	var vendor = navigator.vendor;
	return (vendor != null) && (vendor.indexOf('Apple') != -1 || vendor.indexOf('KDE') != -1) ;
}

function DumlInterpreter(){}	
DumlInterpreter.importNode = 
	function ( xml )
	{
		//Strip duml tags and massage into iterable html nodes
		xml = xml.substring( xml.indexOf('>') + 1, xml.lastIndexOf('</duml>' ) ).trim();
		var xmlInstructions = xml.split( /<instruction/ );
		xml = '<div>start</div>';
		for( var i=0; i<xmlInstructions.length; i++ )
		{
			var instruction = ( '<div  ' + xmlInstructions[i] ).trim();
			var beginCharIndex = instruction.indexOf( '>' );
			var endCharIndex = instruction.lastIndexOf( '</instruction' );
			var start = instruction.substring( 0, beginCharIndex + 1 );
			var end = instruction.substring( endCharIndex );
			var update = instruction.substring( beginCharIndex + 1, endCharIndex ).trim();
			
			
			if(instruction.indexOf("executeScript") != -1 || instruction.indexOf("queueScript") != -1)
			{
				
				if (DumlInterpreter.removeScriptComments())
				{
					var startIndex = update.indexOf("<!--");
					var endIndex = update.lastIndexOf("-->");

					if (startIndex != -1 && endIndex != -1)
						update = update.substring(startIndex + 4, endIndex);
				}
			}
			
			if( update.indexOf( '<tr' ) == 0 )
			{ 
				start = start.replace( '<div ', '<div tableManipulationType="0"' );
				update = '<table><tbody>' + update + '</tbody></table>'; 
			}
			else if( update.indexOf( '<td' ) == 1 )
			{ 
				start = start.replace( '<div ', '<div tableManipulationType="1"' );
				update = '<table><tbody><tr>' + update + '</tr></tbody></table>'; 
			}
			else if( update.indexOf( '<th' ) == 2 )
			{ 
				start = start.replace( '<div ', '<div tableManipulationType="2"' );
				update = '<table><thead><tr>' + update + '</tr></thead></table>'; 
			}
			xml += start + update + '</div>';
			
		}
		var temp = document.createElement( 'div' );
		temp.innerHTML = xml;
		return temp;
	}


							
DumlInterpreter.apply = 
	function( xml )
	{
		try
		{
			var instructionNodes = null;
			var doc = DumlInterpreter.importNode( xml );
			
			JasLogger.trace( 'imported document: ' + doc.innerHTML ); 
			instructionNodes = doc.childNodes;
			var scriptBlocks = new Array();
			JasLogger.debug( 'found ' + instructionNodes.length + ' instructionNodes' ); 
			for( var i=1; i<instructionNodes.length; i++ )
			{
				JasLogger.debug( 'begin interpreting instruction node#' + i ); 
				var instructionNode = instructionNodes[i];
				var frameId = instructionNode.getAttribute( 'frameId' ); 
				var tWin = JasDomUtil.getWinRef( window.top.frames, frameId ); 
				var updateNode = instructionNode;
				if( tWin == null ){ tWin = window; }
				else
				{
					updateNode = JasDomUtil.importN( tWin.document, updateNode, true );
					JasLogger.debug( 'tWin is another window - importing win node to currentDocument' );
				}
				for( var ss = 0; ss < instructionNode.childNodes.length; ss++ )
				{
					if( instructionNode.childNodes[ ss ].nodeType == 1 || instructionNode.childNodes[ ss ].nodeType == 11 )
					{
						updateNode = ( tWin == window ) ? instructionNode.childNodes[ ss ] : JasDomUtil.importN( tWin.document, instructionNode.childNodes[ ss ], true );
						break;
					}
				}
				JasLogger.trace( 'updateNode: ' + updateNode + ' tagName: ' + updateNode.tagName + ' - node type: ' + updateNode.nodeType + ":" + updateNode.outerHTML);

				if( updateNode.nodeType == 11 || updateNode.nodeType == 1 )
				{
					JasLogger.trace( 'NodeType:' + updateNode.nodeType );
					var scriptCode = '';
					if(  instructionNode.getAttribute( 'manipulation' ) == 'executeScript' )
					{
						JasLogger.debug( 'This is an execute script node. '  );
						scriptCode = ( document.all ) ? instructionNodes[i].innerHTML : instructionNode.firstChild.nodeValue;
						scriptCode = scriptCode.replace( /\<!--/, '' ).replace( /--\>/, '' );
						eval( scriptCode );
					}
					else if( instructionNode.getAttribute( 'manipulation' ) == 'queueScript' )
					{
						JasLogger.debug( 'This is an execute script node. '  );
						scriptCode = ( document.all ) ? instructionNodes[i].innerHTML : instructionNode.firstChild.nodeValue;
						scriptCode = scriptCode.replace( /\<!--/, '' ).replace( /--\>/, '' );
						scriptBlocks.push( scriptCode );
					}
					else
					{
						JasLogger.debug( 'This is a DOM update instruction: ' + instructionNode.outerHTML );
						var originNodeId = instructionNode.getAttribute( 'originNodeId' );
						var originNode = ( originNodeId == '~body~' ) ? tWin.document.body : tWin.document.getElementById( originNodeId );
						var continueOnNoOriginStr = instructionNode.getAttribute( 'continueOnNoOrigin' );
						JasLogger.trace( 'continueOnNoOriginStr: ' + continueOnNoOriginStr );
						var continueOnNoOrigin = ( continueOnNoOriginStr !=null && continueOnNoOriginStr.toLowerCase() == 'true' )?true:false;
						JasLogger.trace( 'continueOnNoOrigin: ' + continueOnNoOrigin );
						try
						{
							var type = instructionNode.getAttribute( 'manipulation' );
							var replaceIfExists = instructionNode.getAttribute( 'replaceIfExists' );
							if( ( replaceIfExists != null ) && replaceIfExists.toLowerCase() == 'true' )
							{
								if( tWin.document.getElementById( updateNode.getAttribute( 'id' ) ) != null )
								{
									type = 'replace';
									originNode = tWin.document.getElementById( updateNode.getAttribute( 'id' ) );
								}
							}
							
							{
							    var tIndex = 0;
							    tmt = instructionNode.getAttribute( 'tableManipulationType' );
							    var newRow = originNode;
							    if( tmt == 0 )
							    {
								updateNode = updateNode.tBodies[0].rows[0];
								if( type != 'replace' )
								{
									if( type == 'appendChild' ){ tIndex = originNode.rows.length }
									else if( type == 'insertBefore' ){ tIndex = originNode.rowIndex - 1 }
									else if( type == 'insertAfter' ){ tIndex = originNode.rowIndex }
									newRow = originNode.insertRow( tIndex );							    
									type = 'replace';								    
								}
								originNode = newRow;
							    }
							    else if( tmt == 1 || tmt == 2 )
							    {
							        if( tmt == 1 )
							        {
									updateNode = updateNode.tBodies[0].rows[0].cells[0];
								}
								else if ( tmt == 2 )
								{
									updateNode = updateNodes.tHead.cells[0];
								}
								if( type != 'replace' )
								{
									if( type == 'appendChild' ){ tIndex = originNode.cells.length }
									else if( type == 'insertBefore' ){ tIndex = originNode.cellIndex - 1 }
									else if( type == 'insertAfter' ){ tIndex = originNode.cellIndex }
									newRow = originNode.insertCell( tIndex );							    
									type = 'replace';								    
								}
								originNode = newRow;
							    }
							}
							JasLogger.trace( 'manipulation=' + type + ';' + originNode );
							var containerNode = originNode.parentNode;
							updateNode.removeAttribute( 'manipulation' );

							if ( type == 'set-attribute' )
							{
								var keyStr = instructionNode.getAttribute( 'attName' ).toLowerCase();
								var valStr = instructionNode.getAttribute( 'attValue' );
								JasLogger.debug( 'this is an attribute setter asking to set ' + keyStr + ' to ' + valStr );
								if( keyStr == 'style' )
								{
									var pairs = valStr.split( ';' );
									for( var pi=0; pi < pairs.length; pi++ )
									{
										var pair = pairs[pi].split( ':' );
										if( pair.length > 1 )
										{
											var styleStr =  pair[0].trim();

											if( styleStr.indexOf( '-' ) != -1 )
											{
												styleStr = pair[0].split( '-' );
												styleStr = styleStr[0] + styleStr[1].charAt(0).toUpperCase() + styleStr[1].substring( 1 );
											}
											eval( 'originNode.style.' + styleStr + '="' + pair[1].trim() + '"' );
										}
									}

								}
								else if( keyStr == 'class' )
								{
									originNode.className = valStr;
								}
								else
								{
									
									if( keyStr.indexOf( 'on' ) == 0 )
									{
										JasLogger.trace( 'originNode.' + keyStr + '=function(){' +  valStr + ';}' );
										eval( 'originNode.' + keyStr + '=function(){' +  valStr + ';}' );
									}
									else if( keyStr == 'action')
									{
									        JasLogger.trace( 'originNode.setAttribute( keyStr, valStr );' );
										originNode.setAttribute( keyStr, valStr );
									}
									else
									{
										JasLogger.trace( 'originNode.' + keyStr + '=' +  valStr );
										eval( 'originNode.' + keyStr + '=' +  valStr );
									}
								}
							}
							else if ( type == 'replaceContent' )
							{
								originNode.innerHTML = updateNode.parentNode.innerHTML;							
							}
							else if ( type == 'replace' )
							{
							    containerNode.replaceChild( updateNode, originNode );
							}
							else if( type == 'remove' )
							{
								containerNode.removeChild( originNode );
							}
							else if( type == 'appendChild' )
							{
								originNode.appendChild( updateNode );
							}
							else if( type == 'insertAfter' )
							{
								var insertBefore = originNode.nextSibling;
								containerNode.insertBefore( updateNode, insertBefore );
							}
							else if( type == 'insertBefore' )
							{
								containerNode.insertBefore( updateNode, originNode );
							}
							else
							{
								JasLogger.error(  'Unknown manupulation attribute in duml: ' + type );
								return 'Unknown manupulation attribute in duml: ' + type;
							}
						}
						catch( noOriginException )
						{
							if( ( ! continueOnNoOrigin ) && ( originNode == null ) )
							{
								var errStr = 'Origin not found and no continueOnNoOrigin attribute set to true in duml for id: ' + originNodeId;
								JasLogger.error( errStr );
								return errStr;
							}
						}
					}
				}
			}
			for( var c=0; c< scriptBlocks.length; c++ )
			{
				JasLogger.trace( 'evaling: ' + scriptBlocks[c] );
				eval( scriptBlocks[c] );
			}
			return null;

		}
		catch(e)
		{
			JasLogger.error( 'Document update failed, check syntax: ' + e.message );
			return e.message;
		}

	}
new DumlInterpreter();
;//----- BEGIN DUML LOADER 
/**
 * Universal helper object for updating the DOM
 * @constructor
 */
function DumlLoader( arg1, arg2, arg3, arg4, arg5, arg6 )
{
	if( arguments.length > 0 ) //needed for initialization of static methods
	{
		this.init(  arg1, arg2, arg3, arg4, arg5, arg6 );
	}        
}

//Public methods
DumlLoader.prototype.execute = DumlLoader_execute;
DumlLoader.prototype.init = DumlLoader_init;
DumlLoader.prototype.beforeBegin = DumlLoader_beforeBegin;
DumlLoader.prototype.afterComplete = DumlLoader_afterComplete;
DumlLoader.prototype.onError = DumlLoader_onError;
DumlLoader.prototype.postInterpret = DumlLoader_postInterpret;
DumlLoader.prototype.interpret = function DumlLoader_interpret( duml )
  				 {
					this.errorDescription = DumlInterpreter.apply( duml );
					if ( this.errorDescription != null ) { this.onError(); };					
					setTimeout( 'document.body.className = document.body.className', 10 );
				 }
DumlLoader.prototype.request = null;

function DumlLoader_onError( errorDescription ){}
function DumlLoader_beforeBegin(){}
function DumlLoader_postInterpret(){}
function DumlLoader_afterComplete(){}
function DumlLoader_init( arg1, arg2, arg3, arg4, arg5, arg6 )
{
		this.errorDescription = null;
		var onError = arg3;
		var beforeBegin = arg4;
		var afterComplete = arg5;
		this.isJs = ( ( typeof arg6 != 'undefined' ) && ( arg6 == true ) )?true:false;
		JasLogger.debug( arg1 + ':type:' + typeof arg1 );
		if(  arg1.tagName == 'FORM' )
		{
		   this.method = arg1.getAttribute( 'METHOD' ).toUpperCase();
		   this.url = arg1.getAttribute( 'ACTION' ) + JasRemoteRequest.toGetStyleString( arg1 );
		   onError = arg2;
		   beforeBegin = arg3;
		   afterComplete = arg4;
		}
		else
		{
			this.url = arg1;
			this.method = arg2;
		}

		if( ( typeof onError != "undefined" ) && ( onError != null ) )
		{
			this.onError = onError;
		}
		if( ( typeof beforeBegin != "undefined" ) && ( beforeBegin != null ) )
		{
			this.beforeBegin = beforeBegin;
		}
		if( ( typeof afterComplete != "undefined" ) && ( afterComplete != null ) )
		{
			this.afterComplete = afterComplete;
		}
}
function DumlLoader_execute( showDefaultThrobber )
{
    this.beforeBegin();
    if( this.request != null  ){ this.request.http.abort(); };
    this.request = 
		new JasRemoteRequest( this.url,
			this.method,
			function( xml, ref )
			{
				if( xml.indexOf( '<duml' ) != 0 ) { document.write( xml ); document.close(); }
				else
				{
					if( ref.isJs ){ xml='<duml version="1.0"><instruction manipulation="executeScript"><!-- '+xml+' --></instruction></duml>' };
					ref.interpret(xml);
					ref.postInterpret();
					JasLogger.debug("about to run afterComplete()");		        
					ref.afterComplete();
					JasLogger.debug("afterComplete() complete");
				}


			}, this, showDefaultThrobber );
}
new DumlLoader();
;function IamlComponents(){};
IamlComponents.componentList = new Array();
IamlComponents.fetchId = function( component ){ return ( component.getAttribute( 'id' ) ) ? component.getAttribute( 'id' ) : JasUidGenerator.getNextUid(); };
IamlComponents.ns = ( document.all && window.opera == null) ? '':'iam:';
IamlComponents.ranOnce = false;
IamlComponents.failed = false;
IamlComponents.hideFader = function( el ){ JasDomUtil.removeIframeCover( el.id ); JasDomUtil.removeSelf( el ); };

if( ! IamlComponents.stylesLocation ){  IamlComponents.stylesLocation = '/styles'; };
new IamlComponents();

CSS_CORE = 'iamCore';


;IamlComponents.componentList.push( 'notification' );
IamlComponents['notification'] = function( component )
{
	var id = IamlComponents.fetchId( component );
	JasPropertiesManager.putElProperty( id, 'opacity', 100 );
	var temp = document.createElement( 'div' );
	
	var windowCode = '<div id="' + id + '" class="notificationWindow' + component.getAttribute( 'type' ) + '"><div class="notificationWindowTitlebar"><div class="notificationWindowButtons"><div class="closeNotificationWindowButton"  onclick="JasDomUtil.removeIframeCover( \'' + id + '\' );var el = document.getElementById(\'' + id +  '\');el.parentNode.removeChild( el );">&nbsp;</div></div><div class="notificationTitle">' + component.getAttribute( 'title' ) + '</div></div><div class="notificationWindowContent"><table class="notificationTable"><tr><td valign="top"><div class="notification' + component.getAttribute( 'type' ) + 'Icon">&nbsp;</div></td><td>' + component.innerHTML + '</td></tr></table></div></div>';
	temp.innerHTML = windowCode;
	var dialogContainer = temp.firstChild;
	component.parentNode.replaceChild( dialogContainer, component );
	var topMod = ( document.all ) ? 0 : 100;
	
	dialogContainer.style.top = '20%';  //((  document.body.offsetHeight -  dialogContainer.offsetHeight )  /  2  ) +  'px';
	dialogContainer.style.right = '5%'; //document.body.offsetWidth - ( dialogContainer.offsetWidth + 40 ) +  'px';
	if( document.all ) { JasDomUtil.addIframeCover( id ); };
	window.setTimeout( 'JasDomUtil.fader( "' + id + '", "IamlComponents.hideFader" )', 2000 );
}
;IamlComponents.componentList.push( 'accordioncontainer' );
var AccordionContainer = new Object();
AccordionContainer.setActivePane = function( container_id, pane_id )
{
	var container = document.getElementById( container_id );
	var panes = container.childNodes;
	var isAjax = JasPropertiesManager.getElProperty( container_id, 'isAjax' );
	for( var i=0;i<panes.length;i++)
	{
		var cp = document.getElementById(pane_id + "_content");
		if( panes[i].id == pane_id )
		{
		    panes[i].className = 'selectedAccordionTab'; if( isAjax ) { cp.innerHTML = JAS_THRBSTR; new DumlLoader( JasPropertiesManager.getElProperty( container_id, pane_id ) + "?accordionContentId=" + pane_id + "_content"  ).execute( false ); };
		}
		else
		{
		    panes[i].className = 'deselectedAccordionTab'; if( isAjax ) { cp.innerHTML = ''; };		    
		}
	}
}

AccordionContainer.switchAccordion = function ( genEvt, id )
{
   var eventTarget = genEvt.targetEl;
   id = genEvt.payload.id;
   if( eventTarget.id.indexOf( id ) == 0 )
   {
   
   	var elId = eventTarget.id.substring( 0, id.indexOf( '_' ) );
   	AccordionContainer.setActivePane( elId, id );
   }
}

IamlComponents['accordioncontainer'] = function( component )
{
	var iamContainer = component;
	var id = IamlComponents.fetchId( component );
	var str = '<div class="accordionBox"><ul id="' + id + '" class="accordiontabs">';
	tabTags = iamContainer.getElementsByTagName( IamlComponents.ns + 'accordiontab' );	
	numTabTags = tabTags.length;	
	var tabPanelTags = iamContainer.getElementsByTagName( IamlComponents.ns + 'accordionpanel' );
	if( ! tabPanelTags.length ) { JasPropertiesManager.putElProperty( id, 'isAjax', true ); };
	JasLogger.debug( 'Parsed... Building ' + tabPanelTags.length + ' panels' );
	var selIndx = 0;
	for( var tabTagIndex=0; tabTagIndex<numTabTags; tabTagIndex++ )
	{
		var paneId = id + '_' + tabTagIndex;
		if ( ! tabPanelTags.length )
		{
		    JasPropertiesManager.putElProperty( id, paneId, tabTags[tabTagIndex].getAttribute( 'href' ) ); 
		}
		var item = '<li id="' + paneId + '" ';
		JasEventManager.add( paneId , AccordionContainer.switchAccordion, { id: paneId } );
		
		if( tabTags[tabTagIndex].getAttribute( 'selected' ) == 'true' )
		{
		        selIndx = ( tabTags[tabTagIndex].getAttribute( 'selected' ) == 'true' ) ? tabTagIndex : selIndx;
			item += ' class="selectedAccordionTab">';
		}
		else
		{
			item += ' class="deselectedAccordionTab">';
		}
		item += '<span class="accordionTabTitle" id="' + paneId + '_tabTitle">' + tabTags[tabTagIndex].innerHTML + '</span>';
		var payload = new Object();
		payload.id = paneId + '_tabTitle';
		JasEventManager.add( paneId + '_tabTitle' , AccordionContainer.switchAccordion, { id: paneId } );
		item += '<div class="accordionTabContent" id="' + id + '_' + tabTagIndex + '_content' + '">';
		item += ( tabPanelTags.length ) ? tabPanelTags[tabTagIndex].innerHTML : '';
		item += '</div></li>';
		str += item;
	}
	str += '</ul></div>';
	var newContainer = document.createElement( 'div' );
        newContainer.innerHTML = str;
	newContainer = newContainer.firstChild;
	iamContainer.parentNode.replaceChild( newContainer, iamContainer );
	if ( ! tabPanelTags.length ) { AccordionContainer.setActivePane( id, id + '_' + selIndx ); };
}
;IamlComponents.componentList.push( 'tabcontainer' );
var IamTabContainer = new Object();
IamTabContainer.paintTabSelection = function( id, tabIndex )
{
	var panes = document.getElementById( id ).childNodes; 
	for( var x=0; x<panes.length; x++ ) (  x == tabIndex ) ? panes[x].className='selectedTab' : panes[x].className='deselectedTab';	
}
IamTabContainer.setAjaxActivePane = function( id, getStyleUrl, tabTagIndex ) 
{
	IamTabContainer.paintTabSelection( id, tabTagIndex );
	var loader = JasPropertiesManager.getElProperty( id, 'loader' ); 
	var cp = document.getElementById( id + '_contentPane' );
	cp.innerHTML = JAS_THRBSTR;
	if( ! loader ){ JasLogger.debug( 'loader was null' ); loader = new DumlLoader( getStyleUrl ); }else{ loader.request.http.abort() ; JasLogger.debug( 'loader was not null' );};
	loader.init( getStyleUrl, 'POST' );
	loader.execute( false );
	JasPropertiesManager.putElProperty( id, 'loader', loader ); 
}
IamTabContainer.setInlineActivePane = function( id, index )
{
	IamTabContainer.paintTabSelection( id, index );
	var panes = document.getElementById( id ).childNodes; 
	for( var x=0; x<panes.length; x++ )
	{ 
		if(  x == index )
		{ 
			var contentNode = document.getElementById( id + '_contentPane' );
			contentNode.firstChild.style.display = 'none';
			contentNode.parentNode.appendChild( contentNode.firstChild );
			var replNode = document.getElementById( id + '_' + x + '_content' );
			replNode.style.display='block';
			contentNode.appendChild( replNode );
		}
	}
}
IamTabContainer.handleAjaxChange = function( genEvt )
{
   var eventTarget = genEvt.targetEl;
   var id = genEvt.payload.id;
   var tabTagIndex = genEvt.targetEl.id.substring( genEvt.targetEl.id.lastIndexOf( '_' ) + 1 );
   IamTabContainer.setAjaxActivePane( id, genEvt.payload.href, tabTagIndex );
   
}
IamTabContainer.handleInlineChange = function( genEvt )
{
   var eventTarget = genEvt.targetEl;
   var id = genEvt.payload.id;
   var tabTagIndex = genEvt.targetEl.id.substring( genEvt.targetEl.id.lastIndexOf( '_' ) + 1 );
   IamTabContainer.setInlineActivePane( id, tabTagIndex );
}

IamlComponents['tabcontainer'] = function( component )
{
	var tabContainer = component;
	var id = IamlComponents.fetchId( component );
	var buff = '<div class="tabBox">';
	tabTags = tabContainer.getElementsByTagName( IamlComponents.ns + 'tab' );
	numTabTags = tabTags.length;
	var tabPanelTags = tabContainer.getElementsByTagName( IamlComponents.ns + 'tabpanel' );
	var mode = ( tabPanelTags.length ) ? 'inline' : 'ajax';
	JasPropertiesManager.putElProperty( id, 'mode', mode );
	for( var q=0; q<tabPanelTags.length; q++ )
	{
		buff += '<div style="display:none" id="' + id + '_' + q + '_content">' + tabPanelTags[q].innerHTML + '</div>';
	}
	buff += '<ul id="' + id + '" class="tabs">';
	for( var tabTagIndex=0; tabTagIndex<numTabTags; tabTagIndex++ )
	{
		var paneTitleId = id + "_paneTitle_" + tabTagIndex;
		var anchorId = id + "_pane_" + tabTagIndex;
		var paneId = id + '_pane_' + tabTagIndex;
		buff += '<li id="' + paneId + '" class="deselectedTab"><span class="tabTitle" id="' + paneTitleId + '">'
		     + '<a id="' + anchorId + '">' + tabTags[tabTagIndex].innerHTML + '</a></span></li>';
		if ( mode == 'inline' )	{ var selectionAction = IamTabContainer.handleInlineChange; }
		else
		{	    
			var hrefVal = tabTags[tabTagIndex].getAttribute( 'href' );
			joinChar = ( hrefVal.indexOf( '?' ) != -1 ) ? '&' : '?';
			hrefVal = hrefVal + joinChar + "tabComponentId=" + id + "&tabId=" + id + "_" + q;
			JasPropertiesManager.putElProperty( paneId, 'href', hrefVal );
			var selectionAction = IamTabContainer.handleAjaxChange;
		}
		JasEventManager.add( anchorId, selectionAction, { "id" : id, "href" : hrefVal  }, false );
		JasEventManager.add( paneTitleId, selectionAction, { "id" : id, "href" : hrefVal }, false );
		if( tabTags[tabTagIndex].getAttribute( 'selected' ) == 'true' )
		{
			var selectedTabIndex = tabTagIndex; if( mode == 'ajax' ){ var selectedTabUrl = hrefVal;  }
		}
	}
	buff += '</ul><div class="contentPane" id="' +  id + '_contentPane"><div>&nbsp;</div></div></div>';
	component.parentNode.replaceChild( JasDomUtil.elFromString( buff ), component );
	if ( mode == 'inline' ){ IamTabContainer.setInlineActivePane( id, selectedTabIndex  ); }
	else { IamTabContainer.setAjaxActivePane( id, selectedTabUrl, selectedTabIndex ) }	
}
;IamlComponents.componentList.push( 'menu' );
var IamPopupMenu = new Object();
IamPopupMenu.closeMenu = function ( genEvt ) { var menu = document.getElementById( genEvt.payload.id ); if( menu ){ menu.style.display = 'none'; JasDomUtil.removeIframeCover( genEvt.payload.id ); }; };
IamPopupMenu.showMenu = function ( genEvt )
{   
	var menu = document.getElementById( genEvt.payload.id );
	if( menu.style.display != 'inline' )
	{
		menu.style.display = 'inline';
		menu.style.position = 'absolute';
		var targetEl = genEvt.targetEl;
		var left = targetEl.offsetLeft; //JasDomUtil.recursedOffsetLeft( targetEl ); 
		if ( genEvt.payload.orient ) 
		{
			var top = targetEl.offsetTop; //JasDomUtil.recursedOffsetTop( targetEl ); 
			menu.style.top = ( top + targetEl.offsetHeight ) + 'px'; 
			////TODO: Correct keep on screen: if ( parseInt( menu.style.top ) + menu.offsetHeight > document.body.clientHeight ){ menu.style.top = targetEl.offsetTop - menu.offsetHeight + 'px'; };			
		}
		else { left += genEvt.targetEl.offsetWidth; };
		menu.style.left = left  + 'px';
		JasDomUtil.addIframeCover( genEvt.payload.id );
		JasEventManager.cNotId = genEvt.payload.id;
		JasEventManager.add( 'nextunmatched', IamPopupMenu.closeMenu, genEvt.payload  );
	}
}
IamlComponents['menu'] = function( component, doc )
{
   var id= IamlComponents.fetchId( component );
   var str = '<div id="' + id + '" class="iamMenu">';
   var attachToEl = document.getElementById( component.getAttribute( 'attachToId' ) );
   var orientV = ( component.getAttribute( 'orient' ) == 'vertical' ) ? true : false;
   var menuItems = component.getElementsByTagName( IamlComponents.ns + 'menuitem' );
   for( var i=0; i<menuItems.length; i++ )
   {
       str += '<div class="iamMenuItem" onmouseout="this.className=\'iamMenuItemOut\';"  onmouseover="this.className=\'iamMenuItemOver\';"><a href="' + menuItems[i].getAttribute( 'href' ) + '">' + menuItems[i].innerHTML + '</a></div>';
   }
   str += '</div>';
   var container = JasDomUtil.elFromString(  str );
   var payload = new Object();
   payload.id = id;
   payload.orient = orientV;
   JasEventManager.add( component.getAttribute( 'attachToId' ), IamPopupMenu.showMenu, payload  );
   component.parentNode.replaceChild( container, component ); 
}

;IamlComponents.componentList.push( 'contextpopup' );
var IamContentPopup = new Object();
IamContentPopup.closePopup = IamPopupMenu.closeMenu;
IamContentPopup.handleClick = function( genEvt )
{
	var popup = document.getElementById( genEvt.payload.id );
	if( ! popup.contains( genEvt.targetEl ) )
	{
	    IamContentPopup.closePopup( genEvt );
	    JasEventManager.cNotId = genEvt.payload.id;
	    JasEventManager.evts.removeVal( 'nextunmatched' );
	}
}

IamContentPopup.showPopup = function ( genEvt )
{   
	var id = genEvt.payload.id;
	var menu = document.getElementById( id );	
	if( menu.style.display != 'inline' )
	{
		var href = JasPropertiesManager.getElProperty( id, 'href' );
		if( href ){ menu.innerHTML = JAS_THRBSTR; new DumlLoader( href + '?contextpopupId=' + id ).execute( false ); };
		menu.style.display = 'inline';
		menu.style.position = 'absolute';
		var targetEl = genEvt.targetEl;
		var left = targetEl.offsetLeft; //JasDomUtil.recursedOffsetLeft( targetEl ); 		
		if ( genEvt.payload.orient ) 
		{
		        var top = targetEl.offsetTop; //JasDomUtil.recursedOffsetTop( targetEl );
		        //JasLogger.info( '-->' + targetEl.offsetTop + ':' + top );
			menu.style.top = top + targetEl.offsetHeight + 'px'; 
			//JasLogger.info( menu.offsetTop + ":" + targetEl.offsetTop + ":" + targetEl.offsetHeight );
			//TODO: Correct keep on screen: if ( parseInt( menu.style.top ) + menu.offsetHeight > document.body.clientHeight ){ menu.style.top = targetEl.offsetTop - menu.offsetHeight + 'px'; };
		};
		menu.style.left = left  + 'px';
		JasDomUtil.addIframeCover( genEvt.payload.id );
		JasEventManager.cNotId = genEvt.payload.id;
		JasEventManager.add( 'nextunmatched', IamContentPopup.handleClick, genEvt.payload  );
	}
}

IamlComponents['contextpopup'] = function( component, doc )
{
   var id= IamlComponents.fetchId( component );
   var str = '<div id="' + id + '" style="display:none;background-color:#efefef;position: absolute;z-index: 9990;border:1px solid black;">' + component.innerHTML;+ '</div>';
   var attachToEl = document.getElementById( component.getAttribute( 'attachToId' ) );
   var orientV = ( component.getAttribute( 'orient' ) == 'vertical' ) ? true : false; 
   var container = JasDomUtil.elFromString(  str );
   var payload = new Object();
   payload.id = id;
   payload.orient = orientV;
   var href = component.getAttribute( 'href' );
   if( href ){ JasPropertiesManager.putElProperty( id, 'href', href ); };
   JasEventManager.add( component.getAttribute( 'attachToId' ), IamContentPopup.showPopup, payload  );
   component.parentNode.replaceChild( container, component ); 
}
;IamlComponents.componentList.push( 'tabledecorator' );
var IamTable = new Object();
IamTable.evenRowClass = 'evenRow';
IamTable.oddRowClass = 'oddRow';
IamTable.markCheckBox = function( el )
{
   var str = el.parentNode.innerHTML;
   el.parentNode.innerHTML = IamTable.getMarkupForCheckbox( str, el.checked );
}

IamTable.getMarkupForCheckbox = function( htmlStr, bChecked )
{ 
	htmlStr = htmlStr.replace( /checked/gi, '' ); 
	if ( bChecked ) {	htmlStr = htmlStr.replace( /type=/gi, 'checked type=' ) };
	if( htmlStr.indexOf( '/onclick/' ) == -1 ){ htmlStr = htmlStr.replace( /type=/gi, 'onclick="IamTable.markCheckBox( this )" type=' ); };
	return htmlStr; 
};
IamTable.alternateRows = function ( el ) { if( JasPropertiesManager.getElProperty( el.parentNode.parentNode.id, 'striped' ) ){ el.className = ( el.rowIndex % 2 ) ? IamTable.evenRowClass : IamTable.oddRowClass; }; };
IamTable.sorter = function( a, b ){if (a.value==b.value) return 0;if (a.value<b.value) return -1;return 1;};
IamTable.convertValue = function( val ){ var dat = Date.parse( val ); if ( isNaN( dat ) ){ dat=( isNaN( val ) ) ? val : parseInt( val ); } return dat; };
IamTable.revSorter = function( a, b ){ if (a.value==b.value) return 0;if (a.value<b.value) return 1;return -1;};
IamTable.scrollCalc  = function( el )
{
   var eventTarget = el.parentNode.parentNode.parentNode;   
   el.style.top = ( eventTarget.scrollTop - 0 ) + 'px';
   el.style.position = "relative";

}

IamTable.clearProperties = function( tblId, sortColIndex )
{
	JasPropertiesManager.properties.removeVal( tblId );
}

IamTable.sort = function( tblId, sortColIndex, specOrder )
{
    var tbl = document.getElementById( tblId );
    var domTbl = document.getElementById( tblId ); 
    var tBod = tbl.tBodies[0];
    var tHeadCells = domTbl.tHead.rows[0].cells;
    var numRows = tBod.rows.length;
    var arr = new Array();
    for ( var i=0; i<numRows; i++ )
    {
         var row = tBod.rows[i];
         arr.push ( { value: IamTable.convertValue( JasDomUtil.getBareText( row.cells[sortColIndex] ) ), 'html': row } );
    }
    var currentSortIndex = JasPropertiesManager.getElProperty( tblId, 'sortIndex' );
    var sortDir = ( specOrder == null ) ? 'asc' : specOrder;
    if( ! specOrder )
    { 
    	sortDir = JasPropertiesManager.getElProperty( tblId, 'sortDir' ); 
    	if ( sortColIndex == currentSortIndex ){ sortDir = ( sortDir == 'asc' ) ? 'desc' : 'asc' }
    	else{ sortDir = 'asc' };
    }
    for ( var i=0; i<tHeadCells.length; i++ ){ tHeadCells[i].className = 'header' };
    ( sortDir == 'desc' ) ? arr.sort( IamTable.revSorter ): arr.sort( IamTable.sorter ); 
    tHeadCells[sortColIndex].className = sortDir;
    JasPropertiesManager.putElProperty( tblId, 'sortIndex', sortColIndex );
    JasPropertiesManager.putElProperty( tblId, 'sortDir', sortDir );
    var temp = JasDomUtil.elFromString( '<table><tbody></tbody></table>' );
    var buff = temp.tBodies[0];
    var isStriped = JasPropertiesManager.getElProperty( tblId, 'striped' );
    for ( var i=0; i<numRows;i++ )
    {
       if ( isStriped ) { arr[i].html.className = ( i % 2 ) ? IamTable.evenRowClass : IamTable.oddRowClass; } else { arr[i].html.className = ''; };
       buff.appendChild ( arr[i].html );       
    }

    if( ! document.all && JasPropertiesManager.getElProperty( tblId, 'scrolls' ) )
    { buff.style.height = tBod.style.height; buff.style.overflow = '-moz-scrollbars-vertical'; };
    domTbl.replaceChild( buff, domTbl.tBodies[0] );
    domTbl.tHead.style.width = tBod.style.width;
}


IamTable.onHeadClick = function( genEvt ) { IamTable.sort( genEvt.payload.tblId, genEvt.targetEl.cellIndex ); };
IamTable.stripeTable = function ( table ) 
{
	var tbdy = table.tBodies[0]; var numRows = tbdy.rows.length; for( var i=0; i < numRows; i++ ) {  IamTable.alternateRows( tbdy.rows[i] ); };
}

IamTable.initColumns = function ( table )
{
    var tblId = table.getAttribute( 'id' );
    table.tHead.rows[0].className = ( JasPropertiesManager.getElProperty( tblId, 'scrolls' ) ) ?  'fixedHeader' : 'header';
       
	var colHeads = table.tHead.rows[0].cells;
	table.tHead.className = ( JasPropertiesManager.getElProperty( tblId, 'sorts' ) ) ? 'isSortableHead' : '';
	var numColHeads = colHeads.length;
	var i= ( JasPropertiesManager.getElProperty( tblId, 'selectAll' ) ) ? 1 : 0;
	for( i; i< numColHeads; i++ )
	{
	    var colId = IamlComponents.fetchId( colHeads[i] );
	    colHeads[i].setAttribute( 'id', colId );
	    if( JasPropertiesManager.getElProperty( tblId, 'sorts' ) ) { JasEventManager.add( colId, IamTable.onHeadClick, { 'colId' : colId, 'tblId' : tblId } ); };
	}
}

IamTable.onToggleAll = function( genEvt )
{ 
    var tblId = genEvt.payload;
	var stat = ( ! JasPropertiesManager.getElProperty( tblId, 'selectAllStat' ) ) ? true : false;
	JasPropertiesManager.putElProperty( tblId, 'selectAllStat', stat );
	var tbl = document.getElementById( tblId );
	var rows = tbl.tBodies[0].rows;
	var numRows = rows.length;
	for( var i=0; i<numRows; i++ )
	{  		
		rows[i].cells[0].innerHTML = IamTable.getMarkupForCheckbox( rows[i].cells[0].innerHTML, stat );
	};
	tbl.tHead.rows[0].getElementsByTagName( 'input' )[0].checked = stat;	
};

IamlComponents['tabledecorator'] = function( component )
{
	try{
		var tbl = ( component.getElementsByTagName( 'table' )[0] );	
		var tblId = IamlComponents.fetchId( tbl );
		tbl.setAttribute( 'id', tblId );
		var containerHeight = component.parentNode.offsetHeight;
		var bScroll = component.getAttribute( 'scroll' ) == 'true';
		var bSort = component.getAttribute( 'sort' ) == 'true';
		var bStripe = component.getAttribute( 'stripe' ) == 'true';
		var bSelectAll = component.getAttribute( 'selectAll' ) == 'true';
		var defaultSortCol = 0;
		JasPropertiesManager.putElProperty( tblId, 'striped', bStripe );
		JasPropertiesManager.putElProperty( tblId, 'scrolls', bScroll );
		JasPropertiesManager.putElProperty( tblId, 'sorts', bSort );
		JasPropertiesManager.putElProperty( tblId, 'selectAll', bSelectAll );

		var sortOrd = component.getAttribute( 'sortOrder' );
		var sortCol = component.getAttribute( 'sortColumn' );
		if( bSelectAll )
		{ 
			var chk = tbl.tHead.rows[0].cells[0].getElementsByTagName( 'input' )[0]; 
			var chkId = IamlComponents.fetchId( chk );
			chk.setAttribute( 'id', chkId );
			JasEventManager.add( chkId, IamTable.onToggleAll, tblId, false  );
			JasPropertiesManager.putElProperty( tblId, 'selectAllStat', true );
			IamTable.onToggleAll( { 'payload' : tblId } );
			defaultSortCol = 1;
		};
		if( sortCol ){ defaultSortCol = sortCol; }
		if( ! document.all && bStripe && !bSort ){ IamTable.stripeTable( tbl ) };

		IamTable.initColumns( tbl );
		var id = IamlComponents.fetchId( component );
		var cName = 'iamTblContainer'; if( bScroll ){ cName = ( document.all ) ? 'iamTblContainerIE' : 'iamTblContainerFF'; };
		str = '<div id="' + id + '" class="' + cName + '">' + component.getElementsByTagName( 'span' )[0].innerHTML + '</div>';
		var temp = JasDomUtil.elFromString( str );

		component.parentNode.replaceChild( temp, component );
		if( ! document.all && bScroll )
		{
			tbl = temp.getElementsByTagName( 'table' )[0];
			tbl.tBodies[0].style.height = containerHeight - temp.getElementsByTagName( 'th' )[0].offsetHeight + 'px';
			tbl.tBodies[0].className = 'scrollingTable';
		}
		else if ( document.all ) { temp.style.height = containerHeight + 'px'; }			
		var percent = ( document.all && ( document.compatMode == 'CSS1Compat' ) ) ? 99 : 100;
		document.getElementById( tblId ).style.width = percent + "%";
		JasPropertiesManager.putElProperty( tblId, 'hasFilter', null ); JasPropertiesManager.putElProperty( tblId, 'filterdata', tbl.tBodies[0] ); 
		if( bSort ){ IamTable.sort( tblId, defaultSortCol, sortOrd ); };
	} catch( e ){ JasLogger.error ( 'error interpreting table decorator: ' + e.message ); throw e; };
}
;IamlComponents.componentList.push( 'dialog' );
var IamDialog = new Object();
IamDialog.close = function( id )
{
	JasDomUtil.removeIframeCover( id );
	var el = document.getElementById( id );
	el.parentNode.removeChild( el );
}

IamlComponents['dialog'] = function( component )
{
	var id = IamlComponents.fetchId( component );
	var temp = document.createElement( 'div' );
	var windowCode = '<div id="' + id + '" class="dialogWindow"><div class="dialogWindowTitlebar" onmousedown="this.parentNode.style.zIndex=JasDomUtil.topZ++;document.getElementById( \'' + id + '_frameCover\' ).style.zIndex=JasDomUtil.topZ++; JasDomUtil.beginDrag( this.parentNode, event );return false;"><span class="dialogTitle">' + component.getAttribute( 'title' ) + '</span><span class="dialogWindowButtons"><button class="closeDialogWindowButton" onclick="IamDialog.close( \'' + id + '\' );">x</button></span></div><div class="dialogWindowContent">' + component.innerHTML + '</div>';
	temp.innerHTML = windowCode;
	var dialogContainer = temp.firstChild;
	dialogContainer.style.zIndex = JasDomUtil.topZ++;
	var pn = component.parentNode;
	pn.replaceChild( dialogContainer, component );
	dialogContainer.style.width = parseInt( dialogContainer.offsetWidth ) + 'px';
	dialogContainer.style.height = parseInt( dialogContainer.offsetHeight ) + 'px';
	JasDomUtil.centerInBlock( dialogContainer, document.body );
	JasDomUtil.addIframeCover( id );
}
;IamlComponents.componentList.push( 'modaldialog' );
var IamModalDialog = new Object();
IamModalDialog.close = function( id )
{
	if( document.all ) 
	{ 
		window.detachEvent( 'onresize', IamModalDialog.onResize ); 
		window.detachEvent( 'onscroll', IamModalDialog.onScroll ); 
	}
	else 
	{ 
		window.removeEventListener( 'resize', IamModalDialog.onResize, false ); 
		window.removeEventListener( 'scroll', IamModalDialog.onScroll, false ); 
	};
	
	
	var ex = document.getElementById( 'testWindowCover' );
	ex.parentNode.removeChild( ex );
	var el = document.getElementById( id );
	el.parentNode.removeChild( el );
	
	ex = document.getElementById( 'testWindowCoverCover' );
	ex.parentNode.removeChild( ex );
}
IamModalDialog.resizeTransframe = function( transFrame )
{
	if( ! transFrame )
	{
		if( document.all ) { window.detachEvent( 'onresize', this ); }	else { window.removeEventListener( 'resize', this, false ); };		
	}
	else
	{
		var tfs = transFrame.style;
		
		var pageWidth = 0;
		var pageHeight = 0;
		if( window.innerHeight && window.scrollMaxY )  // Firefox
		{
			var scrollBarWidthX = 20; 
			var scrollBarWidthY = 20;
			if (window.scrollMaxX == 0) scrollBarWidthX = 0;
			if (window.scrollMaxY == 0) scrollBarWidthY = 0;
			pageWidth = window.innerWidth + window.scrollMaxX - scrollBarWidthX;
			pageHeight = window.innerHeight + window.scrollMaxY - scrollBarWidthY;
		}
		else if( document.body.scrollHeight > document.body.offsetHeight ) // all but Explorer Mac
		{
			pageWidth = document.body.scrollWidth;
			pageHeight = document.body.scrollHeight;
		}
		else // works in Explorer 6 Strict, Mozilla (not FF) and Safari
		{ 
			pageWidth = document.body.offsetWidth + document.body.offsetLeft; 
			pageHeight = document.body.offsetHeight + document.body.offsetTop; 
		}
		
		tfs.height = pageHeight+ 'px'; 
		tfs.width = pageWidth + 'px'; 
		
		JasLogger.debug("pageHeight - " + pageHeight + " pageWidth " + pageWidth);

	}
}

IamModalDialog.onResize = function()
{ 
	
	var transFrame = document.getElementById( 'testWindowCover' ); 
	var transFrameBlocker = document.getElementById( 'testWindowCoverCover' ); 
	
	//dont do in IE Standards mode 
	if ( ! (document.all && document.compatMode == "CSS1Compat") )
	{
		transFrameBlocker.style.display="none";
		transFrame.style.display = "none"; 
	}
	
	JasDomUtil.centerInBlock( transFrameBlocker.nextSibling, document.body );
	
	IamModalDialog.resizeTransframe( transFrame );
	IamModalDialog.resizeTransframe( transFrameBlocker );
	
	if ( ! (document.all && document.compatMode == "CSS1Compat") )
	{
		transFrame.style.display = "";
		transFrameBlocker.style.display = "";
	}
	
	JasLogger.debug("--------------  On resize");
};

IamModalDialog.onScroll = function(){ JasLogger.debug("--------------  On scroll"); var transFrame = document.getElementById( 'testWindowCoverCover' );JasDomUtil.centerInBlock( transFrame.nextSibling, document.body );};
IamlComponents['modaldialog'] = function( component )
{
	var id = IamlComponents.fetchId( component );
	var temp = document.createElement( 'div' );
	var windowCode = '<div id="' + id + '" class="dialogWindow"><div class="dialogWindowTitlebar" onmousedown="JasDomUtil.beginDrag( this.parentNode, event );return false;"><span class="dialogTitle">' + component.getAttribute( 'title' ) + '</span><span class="dialogWindowButtons"><button class="closeDialogWindowButton" onclick="IamModalDialog.close( \'' + id + '\');">x</button></span></div><div class="dialogWindowContent">' + component.innerHTML + '</div>';
	temp.innerHTML = windowCode;
	var dialogContainer = temp.firstChild;
	var pn = component.parentNode;
	pn.replaceChild( dialogContainer, component );
	dialogContainer.style.width = parseInt( dialogContainer.offsetWidth ) + 'px';
	dialogContainer.style.height = parseInt( dialogContainer.offsetHeight ) + 'px';
	
	
	if( document.all ) { IamModalDialog.eh = window.attachEvent( 'onresize', IamModalDialog.onResize ); window.attachEvent( 'onscroll', IamModalDialog.onScroll ); } else { window.addEventListener( 'resize', IamModalDialog.onResize, false ); window.addEventListener( 'scroll', IamModalDialog.onScroll, false ); };
	JasDomUtil.centerInBlock( dialogContainer, document.body );
	
	var transFrameCode = '<iframe class="transFrame" id="testWindowCover" name="testWindowCover"  src=""></iframe>';	
	temp.innerHTML = transFrameCode;
	var transFrame = temp.firstChild;
	IamModalDialog.resizeTransframe( transFrame ); 
	pn.insertBefore( transFrame, document.getElementById( id ) );	
	
	transFrameCode = '<div class="transFrameBlocker"  id="testWindowCoverCover"  src=""></div>';	
	temp.innerHTML = transFrameCode; //TODO: clean this up:transframe as div
	transFrame = temp.firstChild;
	IamModalDialog.resizeTransframe( transFrame ); 
	pn.insertBefore( transFrame, document.getElementById( id ) );	
	
	
}

;IamlComponents.componentList.push( 'progressivedisclosure' );
var IamProgressiveDisclosure = new Object();
IamProgressiveDisclosure.toggleContent = function( contentId )
{
	var content = document.getElementById( contentId + "_ContentPane");	
	var button = document.getElementById( contentId + "_ToggleButton");	
	if( content.style.display != 'block' )
	{
		content.style.display = 'block';
		var href = JasPropertiesManager.getElProperty( contentId, 'href' );
		if( href ){ joinChar = ( href.indexOf( '?' ) != -1 ) ? '&' : '?'; content.innerHTML = JAS_THRBSTR; new DumlLoader( href + joinChar + 'progressiveDisclosureId=' + contentId  + '_ContentPane').execute( false ); };
		button.className = 'progressiveDisclosureHideButton'; 	
	} else {
		content.style.display = 'none';
		button.className = 'progressiveDisclosureShowButton';
	}
}

IamlComponents['progressivedisclosure'] = function( component, doc )
{
	var id = IamlComponents.fetchId( component );
	var temp = document.createElement( 'div' );
	var windowCode = '<div id="' + id + '" class="progressiveDisclosure"><div class="progressiveDisclosureTitlebar" onclick="IamProgressiveDisclosure.toggleContent( \'' + id + '\' );"><span class="progressiveDisclosureTitle">' + component.getAttribute( 'title' ) + '</span><span class="progressiveDisclosureButtons"><div id="' + id + '_ToggleButton" class="progressiveDisclosureHideButton">&nbsp;</div></span></div><div id="' + id + '_ContentPane" style="display:block;" class="progressiveDisclosureContent">' + component.innerHTML + '</div>';
	temp.innerHTML = windowCode;
	var dialogContainer = temp.firstChild;
	var pn = component.parentNode;
	pn.replaceChild( dialogContainer, component );
	var href = component.getAttribute( 'href' );
	var state = component.getAttribute( 'initialState' );
	if( href ){ 
		JasPropertiesManager.putElProperty( id, 'href', href );
		joinChar = ( href.indexOf( '?' ) != -1 ) ? '&' : '?';
		if( state == 'open' ){ new DumlLoader( href + joinChar +'progressiveDisclosureId=' + id + '_ContentPane' ).execute(); }
	};
	if ( state == 'closed' ){ IamProgressiveDisclosure.toggleContent(id); };
}
;IamlComponents.componentList.push( 'tablefilter' );
var IamTableFilter = new Object();
IamTableFilter.filter = function( refId )
{
	var tbl = document.getElementById( refId );
	var fTxt = document.getElementById( refId + "_filterText" ).value.toLowerCase();
	var fCols = document.getElementById( refId + "_filterColumns" );
	var fColIndex = fCols.options[fCols.selectedIndex].value;
	var prevFTxt = JasPropertiesManager.getElProperty( refId, 'filtertext' );
	var fTbod = JasPropertiesManager.getElProperty( refId, 'filterdata' );
	var oTbod = tbl.tBodies[0];
	if( fTxt.indexOf( prevFTxt ) != 0 )
	{
		if( JasPropertiesManager.getElProperty( refId, 'noMatches' ) == true )
		{
			tbl.tBodies[0].removeChild( tbl.tBodies[0].rows[0] );
		}
		var numRows = fTbod.rows.length;
		for( var i=0; i<numRows; i++ )
		{
			var r = oTbod.insertRow( 0 );
			var rp = r.parentNode;
			rp.replaceChild( fTbod.removeChild( fTbod.rows[0] ), r );
		}	
	}
	if( fColIndex )
	{
		if( tbl.tBodies[0] )
		{
			var rows = tbl.tBodies[0].rows;
			for( var i = rows.length-1; i >= 0; i-- )
			{
				var row = rows[i]; var cell = row.cells[ fColIndex ];
				if( JasDomUtil.getBareText( cell ).toLowerCase().indexOf( fTxt ) != 0 )
				{ 
					var r = fTbod.insertRow( 0 ); 
					var rp = r.parentNode;
					rp.replaceChild( row.parentNode.removeChild( row ), r );
				};
			}
			JasPropertiesManager.putElProperty( refId, 'filterdata', fTbod );
		}
		if( !tbl.tBodies[0] || tbl.tBodies[0].rows.length == 0 )
		{
		  buff = '<table><tbody><tr style="color:blue;"><td colspan=' + tbl.tHead.rows[0].cells.length +  '>No matching rows found</td></tr></tbody></table>';
			var temp = JasDomUtil.elFromString( buff );
			var nTbod = temp.firstChild;
			JasPropertiesManager.putElProperty( refId, 'noMatches', true );
			tbl.replaceChild( nTbod, tbl.tBodies[0] );
		} else { JasPropertiesManager.putElProperty( refId, 'noMatches', false );  } 
	}
	if( fTxt.indexOf( prevFTxt ) != 0 && JasPropertiesManager.getElProperty( refId, 'sorts' ) == true )
	{
		IamTable.sort( refId, JasPropertiesManager.getElProperty( refId, 'sortIndex' ), JasPropertiesManager.getElProperty( refId, 'sortDir' ) );
	}
}

IamlComponents['tablefilter'] = function( component, doc )
{
  var id = IamlComponents.fetchId( component );
  var attachToEl = component.getAttribute( 'attachToId' );
  var str = '<div class="iamTableFilter">Look for <input type="text" onkeyup="IamTableFilter.filter( \'' + attachToEl + '\' )" id="' + attachToEl + '_filterText" />';
  str += ' in <select id="' + attachToEl + '_filterColumns" onchange="TableFilter.filter( \'' + attachToEl + '\' )">';
  var tbl = document.getElementById( attachToEl );
  if ( tbl.className != 'iamTable' )
	{
		IamTable.clearProperties ( attachToEl );
  }
  var headers = tbl.tHead.rows[0].cells;
  var buff='';
  var startI = ( JasPropertiesManager.getElProperty( attachToEl, 'selectAll' ) ) ? 1 : 0;
  for( var i=startI; i<headers.length; i++ )
  {
  	buff += '<option value="' + i + '">' + JasDomUtil.getBareText( headers[i] ) + '</option>';
  }
  str += buff + '</select><button class="btn" onmouseover="this.className=\'btn btnhov\'" onmouseout="this.className=\'btn\'" style="margin-left: 5px; margin-top: 2px;" onclick="document.getElementById( \'' + attachToEl + '_filterText\' ).value=\'\';IamTableFilter.filter( \'' + attachToEl + '\' )">Clear Filter</button></div>';
  var el = JasDomUtil.elFromString( str );
  component.parentNode.replaceChild( el, component );  				
  var temp = JasDomUtil.elFromString( '<table><tbody style="color:gray;">'
  	+ tbl.tBodies[0].innerHTML 
  	+ '</tbody></table>' );
  var nTbod = temp.firstChild;
  JasPropertiesManager.getElProperty( attachToEl, 'filtertext', '' );
  JasPropertiesManager.putElProperty( attachToEl, 'filterdata', JasDomUtil.elFromString( '<table><tbody></tbody></table>' ).tBodies[0] );
  JasPropertiesManager.putElProperty( attachToEl, 'hasFilter', true );
}
;IamlComponents.componentList.push( 'treedecorator' );
var TreeDecorator = new Object();
TreeDecorator.leafNodeClassName = "TreeDecoratorLeafNode";
TreeDecorator.toggle = function(elm, treeId) {
    if (typeof elm == "string") elm = document.getElementById(elm);
    var unorderedList = elm.getElementsByTagName("UL")[0];
    if (unorderedList && elm.className == "closedTreeNode") {
        unorderedList.style.display = "block";
        elm.className = "openTreeNode";
    } else if (unorderedList && elm.className == "openTreeNode") {
        unorderedList.style.display = "none";
        elm.className = "closedTreeNode";
    } else {
        TreeDecorator.getAjaxTreeNode(elm , treeId, new JasMap());
    }
}
TreeDecorator.getAjaxTreeNode = function(elm , treeId, expandMap){
    expandMap.removeVal(elm.id);
    var href = JasPropertiesManager.getElProperty( treeId, 'href' );
    if( href ){
        joinChar = ( href.indexOf( '?' ) != -1 ) ? '&' : '?';
        new DumlLoader( href + joinChar + 'parentNodeId=' + elm.id , "POST", null , null, function(){ TreeDecorator.handleAjaxResponse(elm, treeId, expandMap); }).execute( false );
    };
}
TreeDecorator.handleAjaxResponse = function(elm , treeId, expandMap){
    var unorderedList = elm.getElementsByTagName("ul")[0];
    if (unorderedList){
        TreeDecorator.decorateTree(unorderedList, treeId);
        TreeDecorator.toggle(elm, treeId);
        if (expandMap.size > 0 ){
            var children = unorderedList.getElementsByTagName("li");
            for (var i=0; i<children.length; i++){
                var nextElm = expandMap.getVal(children[i].id);
                if (nextElm != null) TreeDecorator.getAjaxTreeNode(children[i], treeId,  expandMap);
            }
        }
    } else {
        elm.className = TreeDecorator.leafNodeClassName;
    }
}
TreeDecorator.refresh = function(treeId){
    var tree = document.getElementById(treeId);
    var href = JasPropertiesManager.getElProperty( treeId, 'href' );
    var expandedMap = new JasMap();
    if (tree && href){
        var els = tree.getElementsByTagName("li");
        for(var i=0,j=els.length; i<j; i++){
            if(els[i].className == "openTreeNode") expandedMap.putVal(els[i].id, els[i]);
        }
        var levelOne = tree.childNodes;
        for (var j=0; j<levelOne.length; j++){
            if (levelOne[j].className == "openTreeNode"){
                TreeDecorator.toggle(levelOne[j], treeId);
                TreeDecorator.getAjaxTreeNode(levelOne[j], treeId, expandedMap);
            }
        }
    }
}
TreeDecorator.decorateTree = function(tree, treeId){
    var href = JasPropertiesManager.getElProperty( treeId, 'href' );
    var treeNodes = tree.getElementsByTagName('LI');
    for (var i =0; i < treeNodes.length; i++) {
        if (treeNodes[i].getElementsByTagName("LI").length > 0 || (href && treeNodes[i].id && (treeNodes[i].className != TreeDecorator.leafNodeClassName))){
            if (treeNodes[i].className != "closedTreeNode" && treeNodes[i].className != "openTreeNode") {
                var treeButtonNode = JasDomUtil.elFromString("<div class=\"TreeNodeButton\" onclick=\"TreeDecorator.toggle(this.parentNode, '" + treeId +"')\"></div>");
                treeNodes[i].className = "closedTreeNode";
                treeNodes[i].insertBefore(treeButtonNode,treeNodes[i].firstChild);
                if (treeNodes[i].getElementsByTagName("UL")[0]) treeNodes[i].getElementsByTagName("UL")[0].style.display = "none";
            }
        } else {
            var treeButtonNode = JasDomUtil.elFromString("<div class=\"TreeNodeButton\"></div>");
            treeNodes[i].className = TreeDecorator.leafNodeClassName;
            treeNodes[i].insertBefore(treeButtonNode,treeNodes[i].firstChild);
        }
    }
}
IamlComponents['treedecorator'] = function( component, doc ){    
    var unorderedList = ( component.getElementsByTagName( 'ul' )[0] );
    var pn = component.parentNode;
    unorderedList.id  = IamlComponents.fetchId( component );
    JasLogger.debug(unorderedList.id);
    unorderedList.className = "TreeDecoratorRootNode"
    var href = component.getAttribute( 'href' );
    var refresh = component.getAttribute( 'showrefresh' );
    if( href ) JasPropertiesManager.putElProperty( unorderedList.id, 'href', href );
    if (refresh){
        var str = "<div class=\"refreshTreeButton\" onclick=\"TreeDecorator.refresh('" + unorderedList.id +"')\"></div>";
        var refreshButton = JasDomUtil.elFromString(  str );
        pn.insertBefore(refreshButton, component);
    }
    TreeDecorator.decorateTree(unorderedList, unorderedList.id);
    pn.replaceChild( unorderedList, component );
}

;IamlComponents.componentList.push( 'autocomplete' );

var currentAutoCompleteIds = new Array();
var IamAutoComplete = new Object();

IamAutoComplete.onKeyUp = function(event)
{
	if (! event)event = window.event;
	var keyCode = event.keyCode;
	
	var input = this; if (! input) return;
		
	var value = input.value; if (value == null) return;
	var id = input.id; if (id == null) return;
	
	if (keyCode == 40 || keyCode == 38 || keyCode == 13)
	{
		var suggestionsNode = document.getElementById(id + "_suggestions");
		
		if (suggestionsNode == null || suggestionsNode.style.display == "none") return;
		var childNodes = suggestionsNode.getElementsByTagName("li");
		
		var currentIndex = JasPropertiesManager.getElProperty(id, "currentIndex");
		if (currentIndex == null) currentIndex = -1;
		JasLogger.debug(" id = " + id + "currentIndex = " + currentIndex + " childNodes.length = " + childNodes.length);

		if(currentIndex >=0 && currentIndex < childNodes.length) childNodes[currentIndex].className = "autoCompleteSuggestionsLi";

		if (keyCode == 13){if(currentIndex == -1) return;JasDomUtil.preventDefaultAction(event);suggestionsNode.style.display = "none"; this.value = childNodes[currentIndex].firstChild.nodeValue.trim();JasPropertiesManager.putElProperty(id, "value", this.value);return;}

		var nextIndex = 0;
		if (keyCode == 40)
			if (currentIndex < (childNodes.length-1)) nextIndex = currentIndex + 1;	else nextIndex = 0;
		else if (keyCode == 38)
			if (currentIndex > 0) nextIndex = currentIndex - 1;	else nextIndex = childNodes.length - 1;

		childNodes[nextIndex].className = "autoCompleteSuggestionsLiHover";
		if(childNodes[nextIndex].scrollIntoView) childNodes[nextIndex].scrollIntoView(false);
		if(childNodes[nextIndex].focus) childNodes[nextIndex].focus();
		JasPropertiesManager.putElProperty(id, "currentIndex", nextIndex);
		
		return;
	}
	
	
	var prevValue = JasPropertiesManager.getElProperty(id, "value");
	JasLogger.debug("value = " + value + "   prevValue = " + prevValue);
	
	if (value == prevValue) return;
	
	var href = JasPropertiesManager.getElProperty(id, "href");
	JasPropertiesManager.putElProperty(id, "value", value);
	
	var timerId = JasPropertiesManager.getElProperty(id, "timerId");
	if (timerId != null)
		clearTimeout(timerId);
		
	var timerDelay = JasPropertiesManager.getElProperty(id, "timerDelay");
	timerId = setTimeout(showResults, timerDelay);
	JasPropertiesManager.putElProperty(id, "timerId", timerId);
	
	var suggestions = document.getElementById(id + "_suggestions");
	suggestions.style.display = "none";
	
	function showResults()
	{
		var timerId = JasPropertiesManager.getElProperty(id, "timerId");
		if (timerId != null)
			clearTimeout(timerId);
		new DumlLoader(href + "?autoCompleteSuggestionsId=" + id + "_suggestions&autoCompleteQuery=" + value, null, null, null, onFinish).execute(false); 
	}
	
	function onFinish()
	{
		var uls = suggestions.getElementsByTagName("ul");if (uls == null || uls.length == 0) return;
		var ulTag = uls[0];
		var lis = ulTag.getElementsByTagName("li");
		if (lis == null || lis.length == 0) return;
		for (var i=0; i<lis.length; i++)
		{
			lis[i].onclick = IamAutoComplete.onSuggestionSelect;
			lis[i].onmouseout = IamAutoComplete.onMouseLeave;
			lis[i].onmouseover  = IamAutoComplete.onMouseEnter;
		}
		
		currentAutoCompleteIds.push(id);
		JasPropertiesManager.putElProperty(id, "currentIndex", 0);
		suggestions.style.display = "";
	}
}
IamAutoComplete.onMouseEnter = function() 
{
	var childNodes = this.parentNode.getElementsByTagName("li"); 
	var ul = this.parentNode;
	var suggestionsNode = this.parentNode.parentNode;
				
	var id = suggestionsNode.getAttribute("id");
	var index = id.lastIndexOf("_suggestions");
	id = id.substring(0, index );
	
	var currentIndex = JasPropertiesManager.getElProperty(id, "currentIndex");
	if (currentIndex != null && currentIndex != -1) {JasLogger.debug("currentIndex mouseenter = " + currentIndex);	childNodes[currentIndex].className = "autoCompleteSuggestionsLi";}
	
	for (var i=0; i<ul.childNodes.length;i++) 
		if (childNodes[i] == this){ JasPropertiesManager.putElProperty(id, "currentIndex", i); break;}
	this.className = "autoCompleteSuggestionsLiHover"
};

IamAutoComplete.onMouseLeave = function() 
{
	var suggestionsNode = this.parentNode.parentNode;
			
		var id = suggestionsNode.getAttribute("id");
		var index = id.lastIndexOf("_suggestions");
	id = id.substring(0, index );
	JasPropertiesManager.putElProperty(id, "currentIndex", -1);
	this.className = "autoCompleteSuggestionsLi"
	JasPropertiesManager.putElProperty(id, "currentIndex", 0); 
};

IamAutoComplete.onSuggestionSelect = function()
{
	var li = this;
	var suggestionsNode = li.parentNode.parentNode;
	
	var id = suggestionsNode.getAttribute("id");
	var index = id.lastIndexOf("_suggestions");
	var textBoxId = id.substring(0, index );
	
	var textBox = document.getElementById(textBoxId);
	suggestionsNode.style.display = "none";
	
	textBox.value = this.childNodes[0].nodeValue.trim();
	JasPropertiesManager.putElProperty(id, "value", textBox.value);
	
}
IamAutoComplete.onWindowClick = function()
{
	if (!currentAutoCompleteIds) return;
	
	for (var i=0; i<currentAutoCompleteIds.length; i++)
	{
		var id = currentAutoCompleteIds[i] + "_suggestions";
		var suggestions = document.getElementById(id);
		suggestions.style.display = "none";
	}
}

IamlComponents['autocomplete'] = function( component )
{
	

	var href = component.getAttribute("href");
	var attachTo = component.getAttribute("attachTo");
	
	var timerDelay = component.getAttribute("timerDelay");
	if (timerDelay == null) timerDelay = 300;
	
	var textBox = document.getElementById(attachTo);
	textBox.onkeyup = IamAutoComplete.onKeyUp;
	
	var suggestionsDiv = document.getElementById(attachTo + "_suggestions");
	if (suggestionsDiv == null)
	{
		suggestionsDiv = document.createElement("div");
		suggestionsDiv.setAttribute("id", attachTo + "_suggestions");
		suggestionsDiv.className = "autoCompleteSuggestions";
		document.body.appendChild(suggestionsDiv);
	}
	else
		suggestionsDiv.innerHTML = "";
	
	var position = findPosition(textBox);
	
	JasLogger.debug(" position - " + position);
	
	suggestionsDiv.style.left = (position[0]) + "px";
	suggestionsDiv.style.top = (position[1] + textBox.offsetHeight) + "px";
	suggestionsDiv.style.width = (textBox.offsetWidth) + "px";
	suggestionsDiv.style.display = "none";
	
	JasPropertiesManager.putElProperty(attachTo, "href", href);
	JasPropertiesManager.putElProperty(attachTo, "value", "");
	JasPropertiesManager.putElProperty(attachTo, "timerDelay", timerDelay);
	JasLogger.debug(" timerDelay - " + timerDelay);
	
	if (! IamAutoComplete.attachedEventHandler)
	{
		IamAutoComplete.attachedEventHandler = true;
		JasDomUtil.addEvent("click", window, IamAutoComplete.onWindowClick);
		
		JasDomUtil.addEvent("unload", window, IamAutoComplete.onUnload);
	}
	
}

IamAutoComplete.onUnload = function()
{
	if (!currentAutoCompleteIds) return;
	if (	currentAutoCompleteIds != null)
	for (var i=0; i<currentAutoCompleteIds.length; i++)
	{
		var id = currentAutoCompleteIds[i];
		
		var timerId = JasPropertiesManager.getElProperty(id, "timerId");
		if (timerId != null) clearTimeout(timerId);
	}
	
	JasDomUtil.removeEvent("click", window, IamAutoComplete.onWindowClick);
	currentAutoCompleteIds = null;
}
;
function initIamCss()
{
    var lnk = document.createElement( 'link' );
    lnk.setAttribute( 'rel', 'stylesheet' );
    lnk.setAttribute( 'type', 'text/css' );
    lnk.setAttribute( 'href', IamlComponents.stylesLocation + '/' + CSS_CORE + '.css' );
    var head = document.getElementsByTagName( 'head' )[0];
    if( head.getElementsByTagName( 'link' ).length > 0 )
    {
    	head.insertBefore( lnk, head.getElementsByTagName( 'link' )[0] );
    }
    else
    {
    	head.appendChild( lnk );
    }
    var spLnk = document.createElement( 'link' );
    spLnk.setAttribute( 'rel', 'stylesheet' );
    spLnk.setAttribute( 'type', 'text/css' );
    var file = ( document.all ) ? 'Ie' : 'Ff';
    spLnk.setAttribute( 'href', IamlComponents.stylesLocation + '/' + CSS_CORE + file + '.css' );  
    head.insertBefore( spLnk, head.getElementsByTagName( 'link' )[0].nextSibling );
}

function initializeIamlComponents( )
{
   var found = false;
   var callInitializer = false;
   if( ! IamlComponents.ranOnce ){ initIamCss(); callInitializer = true; IamlComponents.ranOnce = true; };
   for(var c=0;c<IamlComponents.componentList.length;c++)
   {
   
        var componentType = IamlComponents.componentList[c];

        var componentTypeList = document.getElementsByTagName( IamlComponents.ns + componentType );
        for( var z=0; z<componentTypeList.length; z++ )
        {
        	if( ! componentTypeList[z].getAttribute( 'triedToParse' ) )
        	{
        	    componentTypeList[z].setAttribute( 'triedToParse', 'true' )
        	    var node = IamlComponents[componentType]( componentTypeList[z] );
        	    found = true;
        	}
        	else
        	{
        	   found = false;
        	   JasLogger.error( 'Unable to convert ' + componentType );
        	}        	
        }
   }
   if( found )
   {
   	initializeIamlComponents(); 
   }
   document.body.className = document.body.className; //force ie exps to fire
   
   if (callInitializer && typeof iamlOnComplete == "function")
      {
   		iamlOnComplete();
   }
}


if( window.addEventListener )
{
	window.addEventListener( 'load', initializeIamlComponents, false );
	window.addEventListener( 'click', JasEventManager.fire, false );
}
else
{
	window.attachEvent( 'onload', initializeIamlComponents );
	document.attachEvent( 'onclick', JasEventManager.fire );
}

if (window.Node && Node.prototype && !Node.prototype.contains)
{
	Node.prototype.contains = function (arg) {
		return !!(this.compareDocumentPosition(arg) & 16)
	}
}

//Non-generic
function DumlLoader_postInterpret(){ initializeIamlComponents(); }
;//Aliases and overrides
//var AriaComponents = IamlComponents;
//IamlComponents.ns = ( document.all && window.opera == null) ? '':'aria:';
//CSS_CORE = 'ariaCore';
CSS_CORE = 'iamCore';

;