/*
  Copyright [2005] [duml.org/brian kardell]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
*/
;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.4";
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.putElProperties = function( elId, properties){ if (properties != null) for(var x in properties){JasPropertiesManager.putElProperty(elId, x, properties[x]);}};
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.addEvt = function( eType, id, handler, payload, cancelDefault ){ var o = new Object(); o.handler=handler; o.payload=payload; o.cancelDefault = ( cancelDefault == null ) ? true : cancelDefault; JasEventManager.evts.putVal( eType + ':' + id, o ); };
JasEventManager.add = function( id, handler, payload, cancelDefault ){ JasEventManager.addEvt( 'click', id, handler, payload, cancelDefault ) };
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 ( 'click:nextunmatched' );
        if( o )
        {
            evt.payload  = ( o.payload != null ) ? o.payload : null; o.handler( evt );
        };

    }

    if( evt.type == 'click' && evt.button == 2 ){ return; };
    o = JasEventManager.evts.getVal ( evt.type + ':' + evt.targetEl.id );
    if( o )
    {
        if( document.all )
        {
            evt.genY = event.offsetY; evt.genX = event.offsetX;
            var cs = JasDomUtil.getComputedStyle( evt.targetEl );
            if( cs )
            {
                var xMod = parseInt( cs.borderLeftWidth ) + parseInt( cs.borderRightWidth );
                var yMod =  parseInt( cs.borderTopWidth ) + parseInt( cs.borderBottomWidth );
                xMod = ( isNaN( xMod ) ) ? 1:xMod; yMod = ( isNaN( yMod ) ) ? 1:xMod;
                evt.genX += xMod;
                evt.genY += yMod;
            }
        }
        else
        {
            var t = ( typeof evt.targetEl.offsetLeft == 'undefined' ) ? evt.targetEl.parentNode : evt.targetEl;
            var evtOffsets = JasEventManager.getMouseEventOffsets( evt );
            evt.genX = evtOffsets.offsetX; evt.genY = evtOffsets.offsetY;
        }

        var scrollGX = 0; var scrollGY = 0; var target = evt.targetEl;
        while (target) {
            scrollGX += target.scrollLeft;
            scrollGY += target.scrollTop;
            target = target.offsetParent;
        };
        var de = JasDomUtil.getDocEl();
        evt.genX = evt.clientX - ( evt.genX + scrollGX ) + de.scrollLeft;
        //alert( "in fire: evt.genY = " + evt.clientY + " -  ( " + evt.genY + "+" +  scrollGY + ") + " + de.scrollTop );
        var mod = ( document.all ) ? evt.genY : ( evt.genY + scrollGY ) ;
        evt.genY = evt.clientY - ( mod )  + de.scrollTop ;

        evt.payload  = ( o.payload != null ) ? o.payload : null; o.handler( evt );
        if( o.cancelDefault )
        {
            if( !document.all){evt.preventDefault()};
            return false;
        };
    }
};
JasEventManager.getMouseEventOffsets = function (evt)
{
  var target = evt.target;
  if (typeof target.offsetLeft == 'undefined') {
    target = target.parentNode;
  }
  var pageCoords =   {x : 0, y : 0};
  while (target) { pageCoords.x += target.offsetLeft; pageCoords.y += target.offsetTop; target = target.offsetParent; };
  var offsets = {
    offsetX: ( window.pageXOffset + evt.clientX ) - pageCoords.x,
    offsetY: ( window.pageYOffset + evt.clientY ) - pageCoords.y
  }; return offsets;
}

new JasEventManager();

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

if( typeof JasLogger == 'undefined' )
{
    eval( 'window.JasLogger = new Object()' );
    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 = 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, includeJasFrmProperties )
{
    var queryString = '?';

    includeJasFrmProperties = includeJasFrmProperties ? includeJasFrmProperties : false;

    var hiddenFields = [];

    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 )
            {
                if( includeJasFrmProperties )
                {
                    var props =  JasPropertiesManager.getElProps( elm.id );
                    if (props != null)
                    {
                        for (var propName in props.map)
                        {
                            var prop = props.map[propName];
                            if( prop && prop.sendAs )
                            {
                                var exist = document.getElementById( prop.sendAs );
                                if( exist)
                                {
                                    exist.setAttribute("name", prop.sendAs);
                                    exist.setAttribute("value", prop);
                                }
                                else
                                {
                                    var hiddenField = { name: prop.sendAs, value: prop, parentNode: elm.parentNode}
                                    hiddenFields.push(hiddenField);
                                    queryString += prop.sendAs + "=" + encodeURIComponent( prop ) + "&";

                                    JasLogger.debug();
                                }
                            }
                        }
                    }
                }
                buff += elm.value;
                queryString += elm.name + "=" + encodeURIComponent( buff ) + "&";
            }
        }
    }

    for (var i=0; i<hiddenFields.length; i++)
    {
        var hiddenField =hiddenFields[i];
        var hiddenEl = JasDomUtil.elFromString( '<input type="hidden" id="' + hiddenField.name + '" name="' + hiddenField.name + '" value="' + hiddenField.value + '" />' );
        hiddenField.parentNode.appendChild( hiddenEl );
    }
    return queryString;
}

new JasRemoteRequest();

function JasUidGenerator(){};
JasUidGenerator.currentUid = new Date().getMilliseconds();
JasUidGenerator.getNextUid = function(){ return  'jasUID-' + ( 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:
                str += JasDomUtil.getBareText(cs[i]);
                break;
            case 3:
                str += cs[i].nodeValue;
                break;
        }
    }
    return str;
}
JasDomUtil.getDocEl = function()
{
    if( document.all && document.compatMode != 'CSS1Compat' ){ return document.body }
    return document.documentElement;
}
JasDomUtil.keepOnScreen = function( el, ref )
{
    var pos = JasDomUtil.findPosition( el, true );
    var elLeft = pos[0]; var elTop = pos[1];
    var de = JasDomUtil.getDocEl();
    var rightSide = elLeft + el.offsetWidth;
    var bottSide = elTop + el.offsetHeight;
    var diffHoriz = de.clientWidth - ( rightSide - de.scrollLeft );
    if( diffHoriz < 5 ){ el.style.left = elLeft + diffHoriz + 'px'; }
    var diffVert = de.clientHeight -  ( bottSide - de.scrollTop );
    if( diffVert < 5 ) { el.style.top = elTop + diffVert + 'px'; }
}
JasDomUtil.findPosition = function ( obj, inclScroll )
{
    if (obj == null) return null;
    var scr = ( typeof inclScroll == 'undefined' || ( ! inclScroll ) ) ? false : true;

    var curleft = obj.offsetLeft;
    var curtop = obj.offsetTop;
    if ( scr ){ curleft -= obj.scrollLeft; curtop -= obj.scrollTop; }

    var parent = obj.offsetParent;

    //if obj is absolutely positionied and in quirksmode no need to loop
    if (document.all && document.compatMode!='CSS1Compat')
    {
        var cs = JasDomUtil.getComputedStyle(obj);
        if (cs != null && ( cs.position == "absolute" || cs.position == "relative" ) )
            parent = null;
    }

    var quirkyTop = 0;
    var quirkyLeft = 0;
    var quirkyPosCalculated = false;
    var insideQuirkyTable = false;


    var computedStyle  = null;
    while (parent != null)
    {

        var csParent = JasDomUtil.getComputedStyle(parent);

        if (csParent != null && ( csParent.position == "absolute" || csParent.position == "relative" || (csParent.position == "fixed" && !document.all) ) )
        { JasLogger.debug("breaking out of loop csParent.position - " + csParent.position); break;}

        curleft += parent.offsetLeft; curtop += parent.offsetTop;
        if ( scr ){curleft -= parent.scrollLeft; curtop -= parent.scrollTop;}


        if (document.all && document.compatMode!='CSS1Compat')
        {
            /*  in quirks mode, check all these, that it is/has
                - width and/or a height specified
                - inline-block (display: inline-block)
                - absolute positioning (position: absolute)
                - float (left/right)
                - table element
                - transformed (style="zoom: 1")
                ..but it seems like if this is inside an outer table, then that becomes the node
                  relative to which the top and left are calculated
             */

             JasLogger.debug("csParent.width - " + csParent.width + ": csParent.height - " + csParent.height
                + ": csParent.display - " + csParent.display + ": csParent.float - " + csParent.float
                + ": parent.nodeName - " + parent.nodeName );

            if ( ! quirkyPosCalculated)
            {
                if (csParent.width != 'auto' || csParent.height != 'auto') { quirkyPosCalculated = true; quirkyTop = curtop;  quirkyLeft=curleft};
                if (csParent.display == 'inline-block') { quirkyPosCalculated = true; quirkyTop = curtop;  quirkyLeft=curleft};;
                if (csParent.float == 'left' || csParent.float == 'right') { quirkyPosCalculated = true; quirkyTop = curtop;  quirkyLeft=curleft};;
                if (parent.nodeName == 'table' ) { quirkyPosCalculated = true; quirkyTop = curtop;  quirkyLeft=curleft};;
                //will check zoom later
            }

            JasLogger.debug("parent.nodeName " + parent.nodeName);
            if (typeof parent.nodeName != "undefined" && parent.nodeName.toLowerCase() == "table")
                insideQuirkyTable = true;
        }
        parent = parent.offsetParent;
    }

    pos  = [curleft, curtop];
    JasLogger.debug("before " + pos + " - quirkyPosCalculated " + quirkyPosCalculated + " insideQuirkyTable " + insideQuirkyTable);
    if (quirkyPosCalculated && !insideQuirkyTable)
        pos  = [quirkyLeft, quirkyTop];

    return pos;
}


JasDomUtil.getComputedStyle = function(el)
{
    return ( document.all ) ? el.currentStyle : document.defaultView.getComputedStyle( el, null );
}
JasDomUtil.recursedOffsetLeft = function( el ){ return findPosition( el )[0]; } //deprecated
JasDomUtil.recursedOffsetTop = function( el ) { return findPosition( el )[1]; } //deprecated

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

    el.style.top = (scrollTop + ((blockHeight - elementHeight) / 2)) + "px";
    el.style.left =  (scrollLeft + ((blockWidth - elementWidth) / 2)) + "px";
}

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;
}
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 castManipulationType="0"' );
                update = '<table><tbody>' + update + '</tbody></table>'; 
            }
            else if( update.indexOf( '<td' ) == 0 )
            { 
                start = start.replace( '<div ', '<div castManipulationType="1"' );
                update = '<table><tbody><tr>' + update + '</tr></tbody></table>'; 
            }
            else if( update.indexOf( '<th' ) == 0 )
            { 
                start = start.replace( '<div ', '<div castManipulationType="2"' );
                update = '<table><thead><tr>' + update + '</tr></thead></table>'; 
            }
            else if( update.indexOf( '<option' ) == 0 )
            {
                start = start.replace( '<div ', '<div castManipulationType="3"' );
                update = '<select>' + update + '</select>'; 
            
            }
            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, 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' );
                }
                var elementNodeFound = false;
                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 );
                        elementNodeFound = true;
                        break;
                    }
                }
                if (! elementNodeFound )
                {
                    //text node
                    if (updateNode.childNodes.length == 1 && updateNode.childNodes[0].nodeType == 3)
                        updateNode = ( tWin == window ) ? updateNode.childNodes[0] : JasDomUtil.importN( tWin.document, updateNode.childNodes[0], true );
                }
                JasLogger.trace( 'updateNode: ' + updateNode + ' tagName: ' + updateNode.tagName + ' - node type: ' + updateNode.nodeType + ":" + updateNode.outerHTML);

                if( updateNode.nodeType == 11 || updateNode.nodeType == 1 || updateNode.nodeType == 3)
                {
                    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 (updateNode.nodetype != 3)
                            {
                                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( 'castManipulationType' );
                                  
                                    var newRow = originNode;
                                    if( tmt == 0 )
                                    {
                                        var frag = document.createDocumentFragment();
                                        var index=0;
                                        while (true)
                                        {
                                            if (updateNode.tBodies[0].rows.length == 0) break;
                                            frag.appendChild(updateNode.tBodies[0].rows[index]);
                                        }
                                        
                                        updateNode = frag;
                                        
                                        if( type != 'replace' )
                                        {
                                            if( type == 'appendChild' ){ tIndex = originNode.rows.length; newRow = originNode.insertRow( tIndex );  }
                                            else
                                            {
                                                if( type == 'insertBefore' ){ tIndex = originNode.rowIndex - 1 }
                                                else if( type == 'insertAfter' ){  tIndex = originNode.rowIndex }
                                                newRow = originNode.parentNode.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; newCell = originNode.insertCell( tIndex ); }
                                            else
                                            {
                                                if( type == 'insertBefore' ){ tIndex = originNode.cellIndex - 1 }
                                                else if( type == 'insertAfter' ){ tIndex = originNode.cellIndex }
                                                newCell = originNode.parentNode.insertCell( tIndex );
                                            }

                                            type = 'replace';                                   
                                        }
                                        originNode = newCell;
                                    }
                                    else if ( tmt == 3 )
                                    {
                                        updateNode = updateNode.options[0];
                                    }
                                }
                            }
                            JasLogger.trace( 'manipulation=' + type + ';' + originNode );
                            var containerNode = originNode.parentNode;
                            if (updateNode.removeAttribute) 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();
           
          var temp = arg1.getAttribute( 'ACTION' ) ;
          var params = JasRemoteRequest.toGetStyleString( arg1, true );
          JasLogger.debug(" action = " + temp);
          JasLogger.debug(" params = " + params);
          if (temp.indexOf('?') == -1)
          {
           this.url = temp + params;
           JasLogger.debug('no ? in action URL - ' + this.url);
          }
          else
          {
           if (temp.indexOf('?') == temp.length )
           {
               this.url = temp.substring(0, temp.length() - 1) + params;
               JasLogger.debug('? at the end of action URL ,so ignoring- ' + this.url);
           }
           else
           {
               this.url = temp + "&" + params.substring(1);
               JasLogger.debug('replacing ? with & ' + this.url);
           }
            }
           
           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 )
{
    if(this.beforeBegin() == false) return;
    if( this.request != null  ){ this.request.http.abort(); };
    var joinChar = ( this.url.indexOf( '?' ) != -1 ) ? '&' : '?';
    var additionalParams = joinChar + 'dumlLoaderId=' + JasUidGenerator.getNextUid();
    this.request =
        new JasRemoteRequest( this.url + additionalParams,
            this.method,
            function( xml, ref )
            {
                if( ( xml.indexOf( '<duml' ) != 0 ) && ( !ref.isJs ) ) { setTimeout( function(){ document.write( xml ); document.close(); }, 200 ) }
                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 ); };
IamlComponents.getContainer = function()
{ 
  var c = document.getElementById( '_iamupscontainer' );
  if( c == null ){ c = JasDomUtil.elFromString( '<div id="_iamupscontainer"></div>' ); document.body.appendChild( c );} 
  return c;
}
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="iamNotificationWindow' + component.getAttribute( 'type' ) + '"><div class="iamNotificationWindowTitlebar"><div class="iamNotificationWindowButtons"><div class="iamCloseNotificationWindowButton"  onclick="JasDomUtil.removeIframeCover( \'' + id + '\' );var el = document.getElementById(\'' + id +  '\');el.parentNode.removeChild( el );">&nbsp;</div></div><div class="iamNotificationTitle">' + component.getAttribute( 'title' ) + '</div></div><div class="iamNotificationWindowContent"><table class="iamNotificationTable"><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 IamAccordionContainer = new Object();
IamAccordionContainer.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 = 'iamSelectedAccordionTab'; if( isAjax ) { cp.innerHTML = JAS_THRBSTR; new DumlLoader( JasPropertiesManager.getElProperty( container_id, pane_id ) + "?accordionContentId=" + pane_id + "_content"  ).execute( false ); };
		}
		else
		{
		    panes[i].className = 'iamDeselectedAccordionTab'; if( isAjax ) { cp.innerHTML = ''; };		    
		}
	}
}

IamAccordionContainer.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( '_' ) );
   	IamAccordionContainer.setActivePane( elId, id );
   }
}

IamlComponents['accordioncontainer'] = function( component )
{
	var iamContainer = component;
	var id = IamlComponents.fetchId( component );
	var str = '<div class="accordionBox"><ul id="' + id + '" class="iamAccordionTabs">';
	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 , IamAccordionContainer.switchAccordion, { id: paneId } );
		
		if( tabTags[tabTagIndex].getAttribute( 'selected' ) == 'true' )
		{
		        selIndx = ( tabTags[tabTagIndex].getAttribute( 'selected' ) == 'true' ) ? tabTagIndex : selIndx;
			item += ' class="iamSelectedAccordionTab">';
		}
		else
		{
			item += ' class="iamDeselectedAccordionTab">';
		}
		item += '<span class="iamAccordionTabTitle" id="' + paneId + '_iamTabTitle">' + tabTags[tabTagIndex].innerHTML + '</span>';
		var payload = new Object();
		payload.id = paneId + '_iamTabTitle';
		JasEventManager.add( paneId + '_iamTabTitle' , IamAccordionContainer.switchAccordion, { id: paneId } );
		item += '<div class="iamAccordionTabContent" 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 ) { IamAccordionContainer.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='iamSelectedTab' : panes[x].className='iamDeselectedTab';	
}
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';
			if( document.all ){ contentNode.firstChild.innerHTML = contentNode.firstChild.innerHTML; }
			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="iamTabBox">';
	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="iamTabs">';
	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="iamDeselectedTab"><span class="iamTabTitle" 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 iamSelectedTabIndex = tabTagIndex; if( mode == 'ajax' ){ var iamSelectedTabUrl = hrefVal;  }
		}
	}
	buff += '</ul><div class="iamTabContentPane" id="' +  id + '_contentPane"><div>&nbsp;</div></div></div>';
	component.parentNode.replaceChild( JasDomUtil.elFromString( buff ), component );
	if ( mode == 'inline' ){ IamTabContainer.setInlineActivePane( id, iamSelectedTabIndex  ); }
	else { IamTabContainer.setAjaxActivePane( id, iamSelectedTabUrl, iamSelectedTabIndex ) }	
}
;IamlComponents.componentList.push( 'menu' );
var IamPopupMenu = new Object();
IamPopupMenu.closeMenu = function ( arg1 )
{
    var menuId = ( typeof arg1 == 'string' ) ? arg1 : arg1.payload.id; var menu = document.getElementById( menuId );
    if( menu ){ menu.style.display = 'none'; JasDomUtil.removeIframeCover( menuId ); };
};
IamPopupMenu.keepOnScreen = function ( genEvt, menu ){ JasDomUtil.keepOnScreen( menu, genEvt.targetEl ); JasDomUtil.addIframeCover( genEvt.payload.id ); menu.style.zIndex = JasDomUtil.topZ++;};
IamPopupMenu.showMenu = function ( genEvt )
{
    var menu = document.getElementById( genEvt.payload.id );
    if( ( menu.style.display != 'block' ) && ( genEvt.button == 0 )  )
    {
        menu.style.display = 'block';
        menu.style.position = 'absolute';
        var targetEl = genEvt.targetEl;
        if ( genEvt.payload.useRawMouse ) { var left = genEvt.clientX; var top = genEvt.clientY; }
        else
        {
            var left =  genEvt.genX;
            var top =  genEvt.genY;
            if ( genEvt.payload.orient ) { top += genEvt.targetEl.offsetHeight; } else { left += genEvt.targetEl.offsetWidth; };
        }
        menu.style.left = left + 'px'; menu.style.top = top + 'px';
        IamPopupMenu.keepOnScreen( genEvt, menu );
        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 evtHook = ( component.getAttribute( 'mouseButton' ) == 'right' ) ? 'contextmenu' : 'click';
    var orientV = ( component.getAttribute( 'orient' ) == 'vertical' ) ? true : false;
    var useRawMouse = ( component.getAttribute( 'useRawMouse' ) == 'true' ) ? 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;
    payload.useRawMouse = useRawMouse;
    JasEventManager.addEvt( evtHook, component.getAttribute( 'attachToId' ), IamPopupMenu.showMenu, payload, true  );
    component.parentNode.removeChild( component );
    var exists = document.getElementById( id );
    if( exists ){ exists.parentNode.replaceChild( container, exists ); }
    else{   IamlComponents.getContainer().appendChild( container ); };
}

;IamlComponents.componentList.push( 'contextpopup' );
var IamContextPopup = new Object();
IamContextPopup.closePopup = IamPopupMenu.closeMenu;
IamContextPopup.handleClick = function( genEvt )
{
	var popup = document.getElementById( genEvt.payload.id );
	if( popup && ! popup.contains( genEvt.targetEl ) )
	{
	    IamContextPopup.closePopup( genEvt );
	    JasEventManager.cNotId = genEvt.payload.id;
	    JasEventManager.evts.removeVal( 'nextunmatched' );
	}
}
IamContextPopup.keepOnScreen = IamPopupMenu.keepOnScreen;
IamContextPopup.showPopup = function ( genEvt )
{
	var id = genEvt.payload.id;
	var menu = document.getElementById( id );
	if( menu.style.display != 'block' )
	{
		var href = JasPropertiesManager.getElProperty( id, 'href' );
		if( href ){  joinChar = ( href.indexOf( '?' ) != -1 ) ? '&' : '?'; menu.innerHTML = JAS_THRBSTR; var dl= new DumlLoader( href + joinChar +  'contextpopupId=' + id, null, null, null, function(){ IamContextPopup.keepOnScreen( genEvt, menu ) } ).execute( false ); };
		menu.style.display = 'block';
		menu.style.position = 'absolute';
		var targetEl = genEvt.targetEl;
		if ( genEvt.payload.useRawMouse ) { var left = genEvt.clientX; var top = genEvt.clientY; }
		else
		{
			var left = genEvt.genX;
			var top = genEvt.genY;
			if ( genEvt.payload.orient ) { top += genEvt.targetEl.offsetHeight; } else { left += genEvt.targetEl.offsetWidth; };
		}
		menu.style.left = left + 'px'; menu.style.top = top + 'px';
		if( ! href ){ IamContextPopup.keepOnScreen( genEvt, menu ); };
		JasEventManager.cNotId = genEvt.payload.id;
		JasEventManager.add( 'nextunmatched', IamContextPopup.handleClick, genEvt.payload  );
	}
}

IamlComponents['contextpopup'] = function( component, doc )
{
  var id= IamlComponents.fetchId( component );
  var str = '<div id="' + id + '" class="iamContextPopup" style="display:none;">' + component.innerHTML;+ '</div>';
  var attachToEl = document.getElementById( component.getAttribute( 'attachToId' ) );
  var evtHook = ( component.getAttribute( 'mouseButton' ) == 'right' ) ? 'contextmenu' : 'click';
  var orientV = ( component.getAttribute( 'orient' ) == 'vertical' ) ? true : false;
  var useRawMouse = ( component.getAttribute( 'useRawMouse' ) == 'true' ) ? true : false;
  var container = JasDomUtil.elFromString(  str );
  var payload = new Object();
  payload.id = id;
  payload.orient = orientV;
  payload.useRawMouse = useRawMouse;
  var href = component.getAttribute( 'href' );
  if( href ){ JasPropertiesManager.putElProperty( id, 'href', href ); };
  JasEventManager.addEvt( evtHook, component.getAttribute( 'attachToId' ), IamContextPopup.showPopup, payload, true  );
  component.parentNode.removeChild( component );
  var exists = document.getElementById( id );
  if( exists ){ exists.parentNode.replaceChild( container, exists ); }
  else{  IamlComponents.getContainer().appendChild( container ); };
}

;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 = 'iamHeader' };
    ( 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' ) ) ?  'iamFixedHeader' : 'iamHeader';
       
    var colHeads = table.tHead.rows[0].cells;
    table.tHead.className = ( JasPropertiesManager.getElProperty( tblId, 'sorts' ) ) ? 'iamIsSortableHead' : '';
    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 oStat = JasPropertiesManager.getElProperty( tblId, 'selectAllStat' );
    var stat = ( oStat != null && oStat == false ) ? true : false;
    JasPropertiesManager.putElProperty( tblId, 'selectAllStat', stat );
    if( oStat == null ){ return; };
    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 );
        
        /* first try to get the height by hiding the table node. This will return the height of the parentNode that has been set thru css.
        If it returns 0,(ie, if no height has been  set thru css), fallback to the offset height when table is visible
        This is required in IE, since IE incorrectly expands the container node to the height of the table, even if a height is set thru css
        */
        component.style.display = "none";
        var height = 0 + parseInt( component.parentNode.style.height );
        height= ( isNaN( height )) ? 0:height; 
        var containerHeight = component.parentNode.offsetHeight;
        component.style.display = "";
        if (containerHeight == 0) 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' );
        if (sortOrd == null) sortOrd = "asc";
        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', null );
            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 = 'iamScrollingTable';
        }
        else if ( document.all ) 
        { 
            if( containerHeight != 0 )
            { 
                temp.style.height = containerHeight + 'px'; 
            }  
            else
            {   
                temp.style.height = height + '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="iamDialogWindow"><div id=\'' + id + '_iamDialogWindowTitlebar\' style="display:none" class="iamDialogWindowTitlebar" onmousedown="JasDomUtil.beginDrag( this.parentNode, event );document.getElementById( \'' + id + '_frameCover\' ).style.zIndex=JasDomUtil.topZ++;this.parentNode.style.zIndex=JasDomUtil.topZ++; return false;"><span id=\'' + id + '_iamDialogTitle\' class="iamDialogTitle">' + component.getAttribute( 'title' ) + '</span><span class="iamDialogWindowButtons"><span class="iamCloseDialogWindowButton" onclick="IamDialog.close( \'' + id + '\' );">&nbsp;</span></span></div><div class="iamDialogWindowContent">' + 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';
    
    JasDomUtil.centerInBlock( dialogContainer, document.body );
    JasDomUtil.addIframeCover( id );
    
    var curheight = dialogContainer.offsetHeight;
    var tb = document.getElementById(id + "_iamDialogWindowTitlebar");
    var title = document.getElementById(id + "_iamDialogTitle");
    
    tb.style.display = "";
    var newHeight = dialogContainer.offsetHeight ;
    dialogContainer.style.height = parseInt( dialogContainer.offsetHeight ) + 'px';
    tb.style.height = (newHeight - curheight) + 'px';
    dialogContainer.style.zIndex = JasDomUtil.topZ++;
}
;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( iamTransFrame )
{
	if( ! iamTransFrame )
	{
		if( document.all ) { window.detachEvent( 'onresize', this ); }	else { window.removeEventListener( 'resize', this, false ); };		
	}
	else
	{
		var tfs = iamTransFrame.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.trace("pageHeight - " + pageHeight + " pageWidth " + pageWidth);
	}
}

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

IamModalDialog.onScroll = function(){ var iamTransFrame = document.getElementById( 'testWindowCoverCover' );JasDomUtil.centerInBlock( iamTransFrame.nextSibling, document.body );};
IamlComponents['modaldialog'] = function( component )
{
	var id = IamlComponents.fetchId( component );
	var temp = document.createElement( 'div' );
	var windowCode = '<div id="' + id + '" class="iamDialogWindow"><div class="iamDialogWindowTitlebar" style="display:none" id="' + id + '_iamDialogWindowTitlebar" onmousedown="JasDomUtil.beginDrag( this.parentNode, event );return false;"><span class="iamDialogTitle">' + component.getAttribute( 'title' ) + '</span><span class="iamDialogWindowButtons"><span class="iamCloseDialogWindowButton" onclick="IamModalDialog.close( \'' + id + '\');">&nbsp;</span></span></div><div class="iamDialogWindowContent">' + 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 iamTransFrameCode = '<iframe class="iamTransFrame" id="testWindowCover" name="testWindowCover"  src=""></iframe>';	
	temp.innerHTML = iamTransFrameCode;
	var iamTransFrame = temp.firstChild;
	IamModalDialog.resizeTransframe( iamTransFrame ); 
	pn.insertBefore( iamTransFrame, document.getElementById( id ) );	
	iamTransFrameCode = '<div class="iamTransFrameBlocker"  id="testWindowCoverCover"  src=""></div>';	
	temp.innerHTML = iamTransFrameCode; //TODO: clean this up:transframe as div
	iamTransFrame = temp.firstChild;
	IamModalDialog.resizeTransframe( iamTransFrame ); 
	pn.insertBefore( iamTransFrame, document.getElementById( id ) );	
	var tb = document.getElementById(id + "_iamDialogWindowTitlebar");	
	tb.style.display = ""; tb.style.height = '1.2em';	
	dialogContainer.style.height = parseInt( dialogContainer.offsetHeight ) + ( ( document.all ) ? 0: parseInt( tb.offsetHeight ) ) + 'px';
	tb.style.width = parseInt( dialogContainer.offsetWidth ) - ( ( document.all ) ? 0 :  JasDomUtil.getComputedStyle( dialogContainer).width )  + 'px';
	dialogContainer.style.zIndex = JasDomUtil.topZ++;
}
;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 + 'iamProgressiveDisclosureId=' + contentId  + '_ContentPane').execute( false ); };
		button.className = 'iamProgressiveDisclosureHideButton'; 	
	} else {
		content.style.display = 'none';
		button.className = 'iamProgressiveDisclosureShowButton';
	}
}

IamlComponents['progressivedisclosure'] = function( component, doc )
{
	var id = IamlComponents.fetchId( component );
	var temp = document.createElement( 'div' );
	var windowCode = '<div id="' + id + '" class="iamProgressiveDisclosure"><div class="iamProgressiveDisclosureTitlebar" onclick="IamProgressiveDisclosure.toggleContent( \'' + id + '\' );"><span class="iamProgressiveDisclosureTitle">' + component.getAttribute( 'title' ) + '</span><span class="iamProgressiveDisclosureButtons"><div id="' + id + '_ToggleButton" class="iamProgressiveDisclosureHideButton">&nbsp;</div></span></div><div id="' + id + '_ContentPane" style="display:block;" class="iamProgressiveDisclosureContent">' + 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 +'iamProgressiveDisclosureId=' + 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="IamTableFilter.filter( \'' + attachToEl + '\' )">';
  var tbl = document.getElementById( attachToEl );
  var iamHeaders = tbl.tHead.rows[0].cells;
  var buff='';
  var startI = ( JasPropertiesManager.getElProperty( attachToEl, 'selectAll' ) ) ? 1 : 0;
  for( var i=startI; i<iamHeaders.length; i++ )
  {
  	buff += '<option value="' + i + '">' + JasDomUtil.getBareText( iamHeaders[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 iamTreeDecorator = new Object();
iamTreeDecorator.leafNodeClassName = "iamTreeDecoratorLeafNode";
iamTreeDecorator.toggle = function(elm, treeId) {
    if (typeof elm == "string") elm = document.getElementById(elm);
    var unorderedList = elm.getElementsByTagName("UL")[0];
    if (unorderedList && elm.className == "iamClosedTreeNode") {
        unorderedList.style.display = "block";
        elm.className = "iamOpenTreeNode";
    } else if (unorderedList && elm.className == "iamOpenTreeNode") {
        unorderedList.style.display = "none";
        elm.className = "iamClosedTreeNode";
    } else {
        iamTreeDecorator.getAjaxTreeNode(elm , treeId, new JasMap());
    }
}
iamTreeDecorator.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(){ iamTreeDecorator.handleAjaxResponse(elm, treeId, expandMap); }).execute( false );
    };
}
iamTreeDecorator.handleAjaxResponse = function(elm , treeId, expandMap){
    var unorderedList = elm.getElementsByTagName("ul")[0];
    if (unorderedList){
        iamTreeDecorator.decorateTree(unorderedList, treeId);
        iamTreeDecorator.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) iamTreeDecorator.getAjaxTreeNode(children[i], treeId,  expandMap);
            }
        }
    } else {
        elm.className = iamTreeDecorator.leafNodeClassName;
    }
}
iamTreeDecorator.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 == "iamOpenTreeNode") expandedMap.putVal(els[i].id, els[i]);
        }
        var levelOne = tree.childNodes;
        for (var j=0; j<levelOne.length; j++){
            if (levelOne[j].className == "iamOpenTreeNode"){
                iamTreeDecorator.toggle(levelOne[j], treeId);
                iamTreeDecorator.getAjaxTreeNode(levelOne[j], treeId, expandedMap);
            }
        }
    }
}
iamTreeDecorator.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 != iamTreeDecorator.leafNodeClassName))){
            if (treeNodes[i].className != "iamClosedTreeNode" && treeNodes[i].className != "iamOpenTreeNode") {
                var treeButtonNode = JasDomUtil.elFromString("<div class=\"iamTreeNodeButton\" onclick=\"iamTreeDecorator.toggle(this.parentNode, '" + treeId +"')\"></div>");
                treeNodes[i].className = "iamClosedTreeNode";
                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=\"iamTreeNodeButton\"></div>");
            treeNodes[i].className = iamTreeDecorator.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 = "iamTreeDecoratorRootNode"
    var href = component.getAttribute( 'href' );
    var refresh = component.getAttribute( 'showrefresh' );
    if( href ) JasPropertiesManager.putElProperty( unorderedList.id, 'href', href );
    if (refresh){
        var str = "<div class=\"iamRefreshTreeButton\" onclick=\"iamTreeDecorator.refresh('" + unorderedList.id +"')\"></div>";
        var refreshButton = JasDomUtil.elFromString(  str );
        pn.insertBefore(refreshButton, component);
    }
    iamTreeDecorator.decorateTree(unorderedList, unorderedList.id);
    pn.replaceChild( unorderedList, component );
}

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

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

IamAutoComplete.onKeyDown = function(event)
{
    if (! event)event = window.event;
    var keyCode = event.keyCode; if (keyCode != 13 ) return;
    var input = (document.all)?event .srcElement : event.target; if (! input) return;
    var id = input.id; if (id == null) return;
    var suggestionsNode = document.getElementById(id + "_suggestions");
    if (suggestionsNode != null && suggestionsNode.style.display == "") 
    {
        if (typeof  event.preventDefault != "undefined"){  event.preventDefault(); event.stopPropagation();}else if (typeof event.cancelBubble != "undefined"){event.returnValue = false;event.cancelBubble = true;}
        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 = "iamAutoCompleteSuggestionsLi";
        
        if(currentIndex >=0 && currentIndex < childNodes.length) childNodes[currentIndex].className = "iamAutoCompleteSuggestionsLi";
        if (keyCode == 13)
        {
            JasLogger.debug("Return key pressed.. currentIndex = " + currentIndex);

            if(currentIndex == -1) return;        

            if (typeof  event.preventDefault != "undefined")
            {  
                event.preventDefault(); 
                event.stopPropagation();
            }
            else if (typeof event.cancelBubble != "undefined")
            {
                event.returnValue = false;
                event.cancelBubble = true;
            };
            /*suggestionsNode.style.display = "none"; 
            input.value = JasDomUtil.getBareText(childNodes[currentIndex]);
            JasLogger.debug("value = ");
            JasPropertiesManager.putElProperty(id, "value", input.value);*/
            IamAutoComplete.onSuggestionSelect(childNodes[currentIndex]);
            return false;
        }
    }
}

IamAutoComplete.onKeyUp = function(event)
{
    if (! event)event = window.event;
    var keyCode = event.keyCode;
    var input = (document.all)?event .srcElement : event.target; if (! input) return;
    var value = input.value; if (value == null) return;
    var id = input.id; if (id == null) return;
    if (keyCode == 40 || keyCode == 38 )
    {
        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 = "iamAutoCompleteSuggestionsLi";

        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 = "iamAutoCompleteSuggestionsLiHover";
        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);
    
    JasPropertiesManager.putElProperty(id, "value", value);
    
    if (value == prevValue) return;
    
    var minChars = JasPropertiesManager.getElProperty(id, "minChars");
    if (value != null && value.length < minChars )
    {   JasLogger.debug("length < minChars - " + value.length + " < " + minChars); return; }
    
    var href = JasPropertiesManager.getElProperty(id, "href");
    
    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";
    
    var formParameters = "";
    var includeFormParameters = JasPropertiesManager.getElProperty(id, "includeFormParameters");
    JasLogger.debug(includeFormParameters);
    if (includeFormParameters && input.form != null)
    {
        formParameters = JasRemoteRequest.toGetStyleString(input.form);
        if (formParameters.indexOf("?") == 0 ) formParameters = formParameters.substring(1);
        JasLogger.debug(formParameters);
    }   
    var pos = JasDomUtil.findPosition(input, true);   
       
    JasLogger.debug("after " + pos);     
     
    var h = pos[1] + input.offsetHeight;
    
    var suggestionsWidth = input.offsetWidth;
    suggestions.innerHTML = "";
    
    function showResults()
    {
        var timerId = JasPropertiesManager.getElProperty(id, "timerId");
        if (timerId != null)
            clearTimeout(timerId);
        
        var extraParams = "autoCompleteSuggestionsId=" + id + "_suggestions&autoCompleteQuery=" + value;
        if (formParameters != "")
            extraParams += ( "&" + formParameters );
                            
        if (href.indexOf('?') == -1)
            href = href + "?" + extraParams;
        else
            href = href + "&" + extraParams; 
        
        new DumlLoader(href , 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;
        
        JasLogger.debug("obtained " + lis.length + " lis");
        
        for (var i=0; i<lis.length; i++)
        {
            lis[i].onclick = IamAutoComplete.onLiSelect;
            lis[i].onmouseout = IamAutoComplete.onMouseLeave;
            lis[i].onmouseover  = IamAutoComplete.onMouseEnter;
        }
        
        currentAutoCompleteIds.push(id);
        JasPropertiesManager.putElProperty(id, "currentIndex", -1);
        
        suggestions.style.left = (pos[0]) + "px";
        suggestions.style.top = (h )  + "px";
        suggestions.style.display = "";
        
        JasLogger.debug("suggestions.offsetWidth = " + suggestions.offsetWidth + " suggestionsWidth = " + suggestionsWidth);
        if (suggestions.offsetWidth <= suggestionsWidth)
            suggestions.style.width = (suggestionsWidth) + "px";
        else    
            suggestions.style.width = "auto";
        
        suggestions.style.height = "auto";
    }
}
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 = "iamAutoCompleteSuggestionsLi";}
    
    for (var i=0; i<ul.childNodes.length;i++) 
        if (childNodes[i] == this){ JasPropertiesManager.putElProperty(id, "currentIndex", i); break;}
    this.className = "iamAutoCompleteSuggestionsLiHover"
};

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 = "iamAutoCompleteSuggestionsLi";
    JasPropertiesManager.putElProperty(id, "currentIndex", 0); 
};

IamAutoComplete.onLiSelect = function()
{
    var li = this;
    IamAutoComplete.onSuggestionSelect(li);
}

IamAutoComplete.onSuggestionSelect = function(li)
{
    
    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 = JasDomUtil.getBareText(li).trim();
    
    var suggestionId = li.getAttribute("id");
    JasLogger.debug('suggestionId ' + suggestionId);
    if (suggestionId != null)
    {
        var props = JasPropertiesManager.getElProps ( suggestionId );
        JasLogger.debug('obtained props for suggestion node - ' + props);
        if (props != null)
        {
            for (var propName in props.map)
            {
                var prop = props.map[propName];
                JasLogger.debug('name -   ' + propName + '  value = ' + prop + '  sendAs - ' + prop.sendAs);
                if( prop && prop.sendAs )
                    JasPropertiesManager.putElProperty(textBoxId, propName, prop);
            }

        }
    }
    
    var suggestionSelectListener = JasPropertiesManager.getElProperty(textBoxId, "suggestionSelectListener");
    JasLogger.debug('suggestionSelectListener -   ' + suggestionSelectListener );
    if (suggestionSelectListener != null)
    {
        try
        {
            var obj = {};
            obj.selectedElement = li;
            var listener = suggestionSelectListener + "(obj)";
            eval(listener);
        }
        catch(e){}
    }
    
    JasPropertiesManager.putElProperty(textBoxId, "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);
        if (suggestions != null)    suggestions.style.display = "none";
    }
}

IamAutoComplete.setMinChars=function(id, minChars){IamAutoComplete.setProperty(id, "minChars", minChars);}
IamAutoComplete.setTimerDelay=function(id, timerDelay){IamAutoComplete.setProperty(id, "timerDelay", timerDelay);}
IamAutoComplete.setHref=function(id, href){IamAutoComplete.setProperty(id, "href", href);}
IamAutoComplete.setIncludeFormParameters=function(id, includeFormParameters){IamAutoComplete.setProperty(id, "includeFormParameters", includeFormParameters);}
IamAutoComplete.setProperty=function(id, propName, propValue)
{
    var currentValue = JasPropertiesManager.getElProperty(id, propName);
    if (currentValue != null) JasPropertiesManager.putElProperty(id, propName, propValue);
}
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 minChars = component.getAttribute("minChars");
    if (minChars == null) minChars = 0;
    
    var suggestionSelectListener = component.getAttribute("suggestionSelectListener");
    
    var includeFormParameters = component.getAttribute("includeFormParameters");
    if (includeFormParameters == null) includeFormParameters = false;
    
    var textBox = document.getElementById(attachTo);    
    var temp = document.createElement('div');
    temp.appendChild( textBox.cloneNode( true ) );
    var tempStr = temp.innerHTML.substring( 0, temp.innerHTML.length - 1 );
    var temp = JasDomUtil.elFromString(tempStr + ' onkeyup="IamAutoComplete.onKeyUp(event)" onkeydown="IamAutoComplete.onKeyDown(event)" >' );
    textBox.parentNode.replaceChild( temp, textBox );
    
    var suggestionsDiv = document.getElementById(attachTo + "_suggestions");
    if (suggestionsDiv == null)
    {
        suggestionsDiv = document.createElement("div");
        suggestionsDiv.setAttribute("id", attachTo + "_suggestions");
        suggestionsDiv.className = "iamAutoCompleteSuggestions";
        component.parentNode.replaceChild(suggestionsDiv, component);
    }
    else
        suggestionsDiv.innerHTML = "";
    
    suggestionsDiv.style.display = "none";
    
    JasPropertiesManager.putElProperties(attachTo, {href: href, value: "", timerDelay: timerDelay, minChars: minChars, includeFormParameters: includeFormParameters, suggestionSelectListener: suggestionSelectListener});
    JasLogger.debug(" timerDelay - " + timerDelay + " minChars = " + minChars + " suggestionSelectListener - " + suggestionSelectListener) ;
    
    if (! IamAutoComplete.attachedEventHandler)
    {
        IamAutoComplete.attachedEventHandler = true;
        
        if (window.attachEvent)
        {
            document.attachEvent("onclick", IamAutoComplete.onWindowClick);
            document.attachEvent("onunload", IamAutoComplete.onUnload);
        }
        else 
        {
            window.addEventListener("click", IamAutoComplete.onWindowClick, false);
            window.addEventListener("unload", IamAutoComplete.onUnload, false);
        }
    }
}

IamAutoComplete.onUnload = function()
{
    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);
    }
    if (window.removeEventListener) 
        window.removeEventListener("click", IamAutoComplete.onWindowClick, false); 
    else if (window.detachEvent){ document.detachEvent('onclick', IamAutoComplete.onWindowClick)};

    currentAutoCompleteIds = null;
}

;IamlComponents.componentList.push( 'property' );
IamlComponents['property'] = function( component )
{
    JasLogger.debug('property ....');
    var attachToId = component.getAttribute('attachToId');
    
    var key = component.getAttribute( 'key');
    var value = component.getAttribute('value');
    if (value != null)
       value = new String(value);
    var sendAs = component.getAttribute('sendAs');

    JasLogger.debug('key = ' + key + '  value = ' + value + '  sendAs = ' + sendAs) ;

    if( sendAs != null){value.sendAs = sendAs; };
    JasPropertiesManager.putElProperty(attachToId, key, value );

    var removed =   component.parentNode.removeChild(component);
}

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

JasEventManager.supportedEvents = [ 'click', 'keyup', 'keydown', 'contextmenu' ];
JasEventManager.refObj = ( window.addEventListener ) ? 'window.' : 'document.';
JasEventManager.methodName = ( window.addEventListener ) ? 'addEventListener' : 'attachEvent';
JasEventManager.mod = ( window.addEventListener ) ? '' : 'on';
JasEventManager.cancelMod = ( window.addEventListener ) ? ', false' : '';
for ( var i=0;i<JasEventManager.supportedEvents.length; i++ )
{
	eval( JasEventManager.refObj + JasEventManager.methodName + '( "' + JasEventManager.mod + JasEventManager.supportedEvents[i] + '", JasEventManager.fire' + JasEventManager.cancelMod + ')' );
}

if( window.addEventListener )
{
	window.addEventListener( 'load', initializeIamlComponents, false );
}
else
{
	window.attachEvent( 'onload', initializeIamlComponents );
}

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

;