
//////////////////////////////////////////////////////////////////////////////
// Globals
///////////////////////////////////////////////////////////////////////////////
var focusElement = null;
var listeners = [];

window.notify = function( message )
{
    Array.forEach(listeners, function(listener)
    {
        listener.notify(message);
    });
};

///////////////////////////////////////////////////////////////////////////////
// ePortalPage
///////////////////////////////////////////////////////////////////////////////
// Page controller object.
function ePortalPage()
{
    this.currentChartFilterId = - 1;
    this.chartList = {};
    this.metaMap = {};
    this.commandList = [];
    this.folderTask = new eFolderTask();
    this.toc = new eTOC();
    
}

ePortalPage.prototype.getMetaValue = function( key )
{
    return this.metaMap[key];
}
;

ePortalPage.prototype.getChart = function( key )
{
    return this.chartList[key];
}
;

ePortalPage.prototype.addChart = function( key, chart )
{
    this.chartList[key] = chart;
    this.commandList.push( chart );
}
;

ePortalPage.prototype.addCommand = function( command )
{
    this.commandList.push( command );
}
;

ePortalPage.prototype.loadMetaMap = function()
{
    var metaList = document.getElementsByTagName( "meta" );
    for( var i = 0; i < metaList.length; i ++ )
    {
        var attrs = metaList[i];
        if( attrs !== null && attrs != 'undefined' )
        {
            var name = attrs.name;
            if( name === null || name == 'undefined' )
            {
                continue;
            }
            this.metaMap[name] = attrs.content;
        }
    }
}
;

ePortalPage.prototype.execute = function()
{
    var me = this;
    Array.forEach( me.commandList, function(item)
    {
        item.execute();
    });
}
;

ePortalPage.prototype.setDragHandlers = function()
{
    var f = ePortalPage.folderDragStart;
    if( ie5 )
    {
        Array.forEach( document.getElementsByTagName('A'), function(item)
        {
            EventUtils.addEventHandler( item, 'dragstart', f );
        });
    }
};

ePortalPage.prototype.setEventHandlers = function()
{
    this.setDragHandlers();
    ePortalPage.setHandler( "eFolderTask.taskMenu", ["click"], this.folderTask.showTaskMenu  );
    ePortalPage.setHandler( "eFolderTask.taskMenu", ["focus", "mouseover"], this.folderTask.hiliteActionMenu  );
    ePortalPage.setHandler( "eFolderTask.taskMenu", ["blur", "mouseout"], eFolderTask.resetLabel );
}
;

ePortalPage.prototype.registerTaskHandlers = function(  )
{
    ePortalPage.setHandler( "actionMenuItem.subscribe", ["click", "keydown"], this.folderTask.subscribeElement );
    ePortalPage.setHandler( "actionMenuItem.unSubscribe", ["click", "keydown"], this.folderTask.unSubscribeElement );
    ePortalPage.setHandler( "eFolderTask.makeHomePage", ["click", "keydown"], this.folderTask.makeHomePage );
    ePortalPage.setHandler( "eFolderTask.addToFavorites", ["click", "keydown"], this.folderTask.addToFavorites );
}
;
ePortalPage.prototype.nullHandler = function()
{
    return false;
}
;

ePortalPage.setHandler = function( tagId, evnt, handler )
{
    var tag = ee.ge( tagId );
    if( tag )
    {
        Array.forEach(evnt, function(item)
        {
            EventUtils.addEventHandler( tag, item, handler );
        });
    }
}
;

ePortalPage.removeHandler = function( tagId, evnt, handler )
{
    var tag = ee.ge( tagId );
    if( tag )
    {
        Array.forEach(evnt, function(item)
        {
            EventUtils.removeEventHandler( tag, item, handler );
        });
    }
}
;

ePortalPage.folderDragStart = function()
{
    event.dataTransfer.effectAllowed = "copy";
}
;

ePortalPage.prototype.setPage = function()
{
    setPage();
}
;

/*
 * Event handler for the folder page's onload event.
 */
function portalInit()
{
    initialize();
    //   setTimeout( 'initialize()', 250 );
}

function portalUnload()
{

}

function initialize()
{

    if( ee.ge('attr-form-submit') )
    {
        ee.ge('attr-form-submit').style.display = "none";
    }
    
    checkFrame();
    portalPage.loadMetaMap();
    portalPage.setEventHandlers();
    portalPage.execute();
    portalPage.setPage();
    if( window.tables )
    {
       for( var t in tables )
       {
           if( !isNull( t.id ) )
           {
               if( "nt" == t.id.split("_")[0] )
               {
                   try{ee.ge( "dt"+t.id ).focus();}catch(error){}
               }    
           }
       }
    }
    eTOC.registerTOCEventHandlers();
    portalPage.registerTaskHandlers();
    
}

// Event handler called from SVG to display mouse - tips.
function setChartText( id, text )
{
    var d = window.document.getElementById( 'ct' + id );
    d.innerHTML = text;
}
window.setChartText = setChartText;



///////////////////////////////////////////////////////////////////////////////
// Sample of script created by portal page renderer.
// This code illustrates how eCharts are normally created.
// var c = new eChart( '1104', 'cd1104', '../request/chart?&id=1104', '200px', '200px', true );
// if( ! isNull( portalPage ) ){ portalPage.addChart( c.id, c ); }
// c.render();
//
// EventUtils.addEventHandlerById( 'o1104', 'click', chartOptions );
////////////////////////////////////////////////////////////////////////////////


/** Created by ExpandedSummaryNode */
function eChart( config )
{
    this.idset       = config.idset;
    this.urlset      = config.urlset;
    this.parentId    = config.domParentId;
    
    this.height      = config.height;
    this.width       = config.width;
    this.legendWidth = config.legendWidth;
    
    this.hasLegend   = config.hadLegend;
    this.isGauge     = config.isGauge;
    
    this.titleText   = config.titleText;
    
    var handler = this.chartOptions;
    this.reloadOnOptionChange = false;
    EventUtils.addEventHandlerById( 'o' + this.idset["id"], 'click', handler );
}


eChart.prototype.execute = function()
{
    this.render();
}
;

eChart.prototype.render = function()
{
    var pt = document.getElementById( this.parentId );
    if( ! isNull( pt ) )
    {
        pt.innerHTML = this.getChartEmbed();;
    }
}
;

eChart.prototype.getChartUrl = function()
{
    var ca = [];
    ca[ca.length] = this.urlset["chartHyperlinkUrl"];
    var idobj = this.idset;
    for(key in idobj)
    {
        ca[ca.length] = key+"="+idobj[key];
    }
    
    return DomFactory.buildUrl(ca);
};

eChart.prototype.getLegendUrl = function()
{
    var args = [];
    args[args.length] = this.urlset["legendUrl"];
    // todo: Parameterize these values.
    args[args.length] = (this.isGauge) ? "xform=glegend.xslt" : "xform=legend.xslt";
    
    var idobj = this.idset;
    // get all the ids in the idset and add them too.
    for(key in idobj)
    {
        args[args.length] = key+"="+idobj[key];
    }
    
    return DomFactory.buildUrl(args);
};

/*
 < embed id = "embed102" src = "../request/chart?&amp;id=102" type = "image/svg+xml" width = "200px" height = "200px" class = "ebed" >
 */

eChart.prototype.getChartEmbed = function()
{
    var c = new StringBuilder();
    c.append( ee.getEmbedString( this.getChartUrl(), this.width, this.height, this.title, 'Legend-' ) );
 
    // Add the legend. As of 3.5+ all charts/gauges have legends.    
 
    c.append( '<iframe src="' )
     .append(this.getLegendUrl())
     .append( '" width="' )
     .append( this.legendWidth )
     .append('"  frameborder="0" height="' + this.height + '" scrolling="auto"  ' )
     .append( ' title="Legend for ').append(this.title).append('" style="margin:0 0 0 .2em;padding:0px;vertical-align:top;" ');
     
    if( this.isGauge )
    {
      c.append(' class="gauge-legend" ');
    }
    else
    {
      c.append( ' class="ifrm" ' );
    }
    c.append(' name="Legend-')
     .append(this.id)
     .append('" id="Legend-')
     .append(this.id)
     .append('" >')
     .append('</iframe>');

    return c.toString();
}
;

eChart.prototype.chartOptions = function()
{
    var evt = EventUtils.getEvent();
    var optionLink = evt.target;
    var parent = evt.target.parentNode;
    optionLink.style.display = "none";

    var frm = ee.ge("opt-form");
    if( frm )
    {
        frm.parentNode.removeChild(frm);
    }
    
    var me = eChart.getFilterObject( optionLink );
    
    var widgetId = "sel"+me.id;
    
    var frm = ee.ceAsChild("form",parent);
    frm.setAttribute( "id", "opt-form" );
    
    frm.style.position = "absolute";
    frm.style.top      = ".25em";
    frm.style.right    = ".25em";
    frm.style.backgroundColor = "white";
    frm.style.padding  = ".3em";
    
    var lab = ee.ceAsChild( "label", frm);
    lab.setAttribute( "for", widgetId );
    ee.addText(lab,"Choose Display");
    
    var sel = ee.ceAsChild("select",frm);
    sel.setAttribute( "id", widgetId );
    var opts = null;
    if(me.isGauge)
    {
        opts = [{"label":" ", "selected":"selected"},
		{"label":"90 Degree Gauge (Metal)", "value":"Gauge90_3D_Right"},
		{"label":"180 Degree Gauge", "value":"Gauge180"},
                {"label":"180 Degree Gauge (3D)","value":"Gauge180_3d"},
                {"label":"180 Degree Gauge (Metal)","value":"Gauge180_metal"},
                {"label":"270 Degree Gauge","value":"Gauge270"}, 
	        {"label":"270 Degree Gauge (3D)","value":"Gauge270_3d"},
                {"label":"Amplifier Gauge", "value":"Gauge_Amp"}, 
                {"label":"Pressure Gauge", "value":"Gauge_Golden"}, 
	        {"label":"Radio Knob","value":"knob"},
	        {"label":"Scales (Rainbow)","value":"Scales"},
                {"label":"Thermometer (Horizontal)","value":"thermometer_horiz"},
                {"label":"Thermometer (Vertical)","value":"thermometer"},
	        {"label":"Threat Level","value":"threat_level"}
	       ];
    }
    else
    {
        opts = [{"label":" ", "selected":"selected"},{"label":"Pie Chart"},{"label":"Vertical Bar Chart"},{"label":"Horizontal Bar Chart"},
                {"label":"Radar Chart"},{"label":"Rose Chart"},{"label":"Donut Chart"},{"label":"Pie Chart 3D"}];
    }
    FormUtils.addOptions(sel, opts);
 
    var lastKey = 0;

    EventUtils.addEventHandler( sel, 'change', function()
    {
        var evt = EventUtils.getEvent();
        if(lastKey == KEY_UP || lastKey == KEY_DOWN){lastKey=0; return true; }
        me.chartOptionHandler(optionLink, sel);
    });
    EventUtils.addEventHandler( sel, 'keydown', function()
    {
        var evt = EventUtils.getEvent();
        lastKey = evt.keyCode;
        if(evt.keyCode == KEY_ENTER || evt.keyCode == KEY_SPACE){me.chartOptionHandler(optionLink, sel);}
    });
    
    focusElement = sel;
    setTimeout(function()
    {
        focusElement.focus();
    },10);
    
    return false;
}
;

eChart.prototype.chartOptionHandler = function(target,select)
{
    var me = eChart.getFilterObject( target );
    var lastKey = 0;
    try
    {
        EventUtils.removeEventHandlerById( "sel" + me.idset['id'], 'change', function()
        {
            var evt = EventUtils.getEvent();
            if(lastKey == KEY_UP || lastKey == KEY_DOWN){lastKey=0; return true; }
            me.chartOptionHandler(evt);
        });
    }catch(e){}
    try
    {
        EventUtils.removeEventHandlerById( "sel"+me.idset['id'], 'keydown', function()
        {
            var evt = EventUtils.getEvent();
            lastKey = evt.keyCode;
            if(evt.keyCode == KEY_ENTER || evt.keyCode == KEY_SPACE){me.chartOptionHandler(evt);}
        });
    }catch(e2){}
    
    var t = select;
    var chartType = t.selectedIndex-1;
    var ssi = null;
    var ssd = null;
    if( me.isGauge )
    {
        var gname = FormUtils.getSelectedValues( t )[0] + ".xslt";
        ssd = new eSqlStatement( "DELETE parameter WHERE id = ? AND parameter = ? AND type_id = 69" );
        ssd.addParameter( new eParameter( 'number', me.idset['id'] ) );
        ssd.addParameter( new eParameter( 'varchar', "TRANSFORM" ) );
        ssi = new eSqlStatement( "INSERT INTO parameter(value, id, parameter, type_id) VALUES( ?, ?, ?, 69 )" );
        ssi.addParameter( new eParameter( 'varchar', gname) );
        ssi.addParameter( new eParameter( 'number', me.idset['id'] ) );
        ssi.addParameter( new eParameter( 'varchar', "TRANSFORM" ) );
    }
    else
    {
        ssd = new eSqlStatement( "DELETE parameter WHERE id = ? AND parameter = ? AND type_id = 69" );
        ssd.addParameter( new eParameter( 'number', me.idset['id'] ) );
        ssd.addParameter( new eParameter( 'varchar', "CHART_TYPE" ) );
        ssi = new eSqlStatement( "INSERT INTO parameter(value, id, parameter, type_id) VALUES( ?, ?, ?, 69 )" );
        ssi.addParameter( new eParameter( 'number', chartType ) );
        ssi.addParameter( new eParameter( 'number', me.idset['id'] ) );
        ssi.addParameter( new eParameter( 'varchar', "CHART_TYPE" ) );
    }
    sqlList = new eSqlList( me.chartOptionCallback );
    sqlList.fid = me.idset['id'];
    sqlList.addStatement( ssd );
    sqlList.addStatement( ssi );
    sqlList.execute();

    var frm = ee.ge("opt-form");
    while( frm.hasChildren )
    {
        frm.removeChild(frm.firstChild);
    }
    frm.parentNode.removeChild(frm);
    
    ee.ge('o'+me.idset['id']).style.display = "inline";


    var div = document.getElementById( me.parentId );
    while( div.hasChildren )
    {
        div.removeChild( div.firstChild );
    }
    div.innerHTML = "<div><em>Loading...</em></div>";

}
;


eChart.prototype.chartOptionCallback = function( data )
{
    var chart = portalPage.chartList[data.fid];
    if( ! chart.reloadOnOptionChange )
    {
        var div = document.getElementById( chart.parentId );
        while( div.childNodes.length > 0 )
        {
            div.removeChild( div.firstChild );
        }
        chart.render();
    }
    else
    {
        reload();
    }
}
;

eChart.getFilterObject = function( target )
{
    var t = target.id;
    for( var i = 0; i < t.length; i ++ )
    {
        if( ! isNaN(parseInt(t.charAt(i))) )
        {
            t = target.id.substring( i, target.id.length );
            break;
        }
    }
    return portalPage.chartList[ t ];
}
;




///////////////////////////////////////////////////////////////////////////////
// eFolderTask
// Encapsulates actions, or tasks that can be added declaratively to portal
// pages and templates. Uses the html id to bind actions to page elements.
///////////////////////////////////////////////////////////////////////////////

function eFolderTask()
{
    this.newFolderWindow = null;
    this.newDiv = null;
    this.newElementForm = null;
    this.newId = - 1;
    this.newName = "";
    this.sqlList = null;
}


eFolderTask.prototype.createNewDiv = function( parentTagId, inner_html )
{
    var me = portalPage.folderTask;
    if( me.newDiv !== null )
    {
        me.newDivCleanUp();
    }

    var elem = ee.ge(parentTagId);
    var newelem = ee.ce("div", {"id":"newDiv","style":"font-size:90%;"});

    if( !isNull(elem.nextSibling) )
    {
        elem.parentNode.insertBefore(newelem, elem.nextSibling);
    }
    else
    {
        elem.parentNode.appendChild(newelem);
    }
    me.newDiv = newelem;

    
    // Don't let a random click in the form area remove the form.
    EventUtils.addEventHandler( me.newDiv, 'click', function ( evt )
    {
        EventUtils.stopEventPropagation( EventUtils.getEvent() );
        return false;
    }
    );

    if( inner_html )
    {
        me.newDiv.innerHTML = inner_html;

    }
    return me.newDiv;
}
;

eFolderTask.prototype.hiliteActionMenu = function()
{
    if( document.body.dialog === null )
    {
        var labl = ee.ge( 'eFolderTask.taskMenu' );
        labl.style.backgroundColor = "#ffffbb";
    }
    else
    {
        eFolderTask.resetLabel();
    }
}
;

eFolderTask.cleanUp = function()
{
    try{eFolderTask.release();}catch(e){}
    reload();
}
;

eFolderTask.resetLabel = function()
{
    if( document.body.dialog === null )
    {
        var labl = ee.ge( 'eFolderTask.taskMenu' );
        labl.style.backgroundColor = "";
    }
}
;

eFolderTask.release = function()
{
    var holder = document.body;
    if(!isNull(holder.dialog))
    {
    	holder.dialog.release();
    	holder.dialog = null;
    	eFolderTask.resetLabel();
    }
}
;

eFolderTask.prototype.newDivCleanUp = function()
{
    var me = portalPage.folderTask;
    while( me.newDiv.childNodes.length > 0 )
    {
        me.newDiv.removeChild( me.newDiv.firstChild );
    }
    var pt = me.newDiv.parentNode;
    pt.removeChild( me.newDiv );
    me.newDiv = null;
    eFolderTask.resetLabel();
}
;

eFolderTask.prototype.folderOperation = function( id, sql )
{
    var me = portalPage.folderTask;
    if( me.newDiv !== null )
    {
        me.newDivCleanUp();
    }
    else
    {
        me.createNewDiv( id );
               
        var frm = ee.ceAsChild("form", me.newDiv, {"id":"frmid"} );
        
        ee.addText(ee.ceAsChild("label", frm, {"for":"folderDescription", "tabindex":"1"}), "Description");
        
        ee.ceAsChild("br", frm);
        
        var inp = ee.ceAsChild("input", frm, {"type":"text","tabindex":"2", "id":"folderDescription","style":"width: 120px; font-size: 80%;"});
        if( id == 'eFolderTask.editFolderDescription' )
        {
           inp.setAttribute( "value", portalPage.getMetaValue( 'description' ));
        }
        
        ee.addText(ee.ceAsChild("button", frm, {"id":"frmButton","tabindex":"3","style":"font-size: 80%;"}), "Save");

        ePortalPage.setHandler("frmButton", ["click","keydown"], function()
        {
            document.body.style.cursor = "wait";
            var ntsql = new eSqlStatement( sql );
            ntsql.addParameter( new eParameter( 'varchar', ge('folderDescription').value ) );
            ntsql.addParameter( new eParameter( 'number', portalPage.getMetaValue( 'id' ) ) );
            sqlList = new eSqlList( eFolderTask.cleanUp );
            sqlList.addStatement( ntsql );
            sqlList.execute();
        });
        
        focusElement = inp;
        setTimeout('focusElement.focus();',0);
    }
    try
    {
        EventUtils.stopEventPropagation( EventUtils.getEvent() );
    }
    catch( error )
    {
        /* alert( error.message ); */
    }
    return false;
}
;

eFolderTask.prototype.deleteElement = function()
{    
    if(!enterCheck(EventUtils.getEvent())){return true;}

    var id = portalPage.getMetaValue( "element.element_id" );
    if( ! isNull( id ) )
    {
        var url = new StringBuilder();
        url.append( "../request/elementForm?verb=Trash&id=" ).append( id );
        window.location.href = url.toString();
    }
}
;

eFolderTask.prototype.manageLinks = function()
{
    var id = portalPage.getMetaValue( "element.element_id" );
    if( ! isNull( id ) )
    {
        var url = new StringBuilder();
        url.append( "../request/linkManager?&id=" ).append( id );
        window.location.href = url.toString();
    }
};

eFolderTask.prototype.subscribeElement = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    var id = portalPage.getMetaValue( "element.element_id" );
    if( !isNull( id ) )
    {
        var ntsql = new eSqlStatement( "INSERT INTO tuple (parent_id, child_id, type_id) VALUES( ?, Sys_Context('ELEMENTS_CTX','USER_ID'), 86 )" );
        ntsql.addParameter( new eParameter( 'number',id ) );

        sqlList = new eSqlList( eFolderTask.cleanUp );
        sqlList.addStatement( ntsql );
        sqlList.execute();
    }
    alert( "Subscription added." );
}

eFolderTask.prototype.unSubscribeElement = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    var id = portalPage.getMetaValue( "element.element_id" );
    if( !isNull( id ) )
    {
        var ntsql = new eSqlStatement( "DELETE FROM tuple where parent_id= ? AND child_id = Sys_Context('ELEMENTS_CTX','USER_ID') AND type_id = 86 " );
        ntsql.addParameter( new eParameter( 'number',id ) );

        sqlList = new eSqlList( eFolderTask.cleanUp );
        sqlList.addStatement( ntsql );
        sqlList.execute();
    }
    alert( "Subscription removed." );
}

eFolderTask.prototype.createNewFolder = function(  )
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    var id = portalPage.getMetaValue( "id" );
    var type = portalPage.getMetaValue("type");
    if( ! isNull( id ) && type == 88)
    {
        var url = new StringBuilder();
        url.append( "../request/editFolder?&id=" ).append( id );
        window.location.href = url.toString();
    }
    
}
;

eFolderTask.prototype.newFolder = function(  )
{
    var id = portalPage.getMetaValue( "id" );
    if( ! isNull( id ) )
    {
        var url = new StringBuilder();
        url.append( "../request/editFolder?&id=" ).append( id );
        window.location.href = url.toString();
    }
}
;

eFolderTask.sendNewFolderToDatabase = function( pid, name, descr )
{
    var ntsql = new eSqlStatement( 'INSERT INTO named_text (text_id, label, value, type_id) VALUES( text_id_seq.nextval, ?, ?, 88 )' );
    var tpsql = new eSqlStatement( 'INSERT INTO tuple (type_id, parent_id, child_id, name, validation_dt) VALUES(100, ?, text_id_seq.currval, \'\',SYSDATE)');
    var qsql = new eSqlStatement( 'SELECT text_id_seq.currval FROM dual' );
    ntsql.addParameter( new eParameter( 'varchar', name ) );
    ntsql.addParameter( new eParameter( 'varchar', descr ) );
    tpsql.addParameter( new eParameter( 'number', pid ) );

    sqlList = new eSqlList( eFolderTask.cleanUp );
    sqlList.addStatement( ntsql );
    sqlList.addStatement( tpsql );
    sqlList.addStatement( qsql );
    sqlList.execute();
}
;

eFolderTask.prototype.renameFolder = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    /*
    var me = portalPage.folderTask;
    me.folderOperation( 'eFolderTask.renameFolder', 'UPDATE named_text set label = ? where text_id = ?' );
    */
    var id = portalPage.getMetaValue( "id" );
    var type = portalPage.getMetaValue("type");
    if( ! isNull( id ) && type == 88)
    {
        var url = new StringBuilder();
        url.append( "../request/editFolder?&id=" ).append( id );
        window.location.href = url.toString();
    }
    else if( !isNull(id) && type == 20 )
    {
        var url = new StringBuilder();
        url.append( "../request/filterEdit?&id=" ).append( id );
        window.location.href = url.toString();
    }
}
;

eFolderTask.prototype.editFolderDescription = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    /*
    var me = portalPage.folderTask;
    me.folderOperation( 'eFolderTask.editFolderDescription', 'UPDATE named_text set value = ? where text_id = ? and type_id = 88' );
    */
    var id = portalPage.getMetaValue( "id" );
    if( ! isNull( id ) )
    {
        var url = new StringBuilder();
        url.append( "../request/editFolder?&id=" ).append( id );
        window.location.href = url.toString();
    }
}
;

eFolderTask.prototype.emailFolder = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    var em = new eElementsEmailTask();
    em.client = portalPage.folderTask;
    em.execute();
}
;

eFolderTask.prototype.createNewFilter = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}

    var fid = portalPage.getMetaValue( 'id' );
    ee.popAndRefresh( "../request/filterEdit?fid=" + fid, 800, 550 );
    eFolderTask.release();
    return false;
}
;

eFolderTask.prototype.createNewDiscussion = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    var fid = - 1;
    var type = portalPage.getMetaValue( 'type' );
    if( type == 0 )
    {
        fid = portalPage.getMetaValue( 'element.element_id' );
    }
    else
    {
        fid = portalPage.getMetaValue( 'id' );
    }
    url = "../request/discussion?v=form&type=" + type + "&tid=" + fid;
    ee.pop( url, 500, 400 );
    eFolderTask.release();
   // return false;
}
;

eFolderTask.prototype.showDiscussions = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    
    ee.wc( true );
    // Discussion type mappings : 20 = 117, 88 = 118
    var type = portalPage.getMetaValue( 'type' ) == '88' ? 118 : 117;
    var id = portalPage.getMetaValue ( 'id' );
    
    ee.pop( "../request/discussion?&rel=" + type + "&id=" + id, 600, 400 );
    ee.wc( false );
    eFolderTask.release();
    return false;
}
;


eFolderTask.prototype.createNewElementSameClass = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    var url = new StringBuilder();
    
    url.append( "../request/elementForm?CLASS.CLASS_ID=" ).append( portalPage.getMetaValue( 'class.class_id' ) );
    url.append( "&verb=New" );
    alert(url);
    if(ie5){ window.navigate( url ); }
    else{ window.location = url; }
}
;

eFolderTask.prototype.taskElement = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    var url = new StringBuilder();
    url.append( "../request/elementForm?CLASS.CLASS_ID=5&verb=New" );
    

    var type = portalPage.getMetaValue( 'type' );
    if( type == 0 )
    {
        url.append("&parent=").append( portalPage.getMetaValue( 'element.element_id' ) );
    }
    else if( type == 88 )
    {
        url.append( "&fid=" ).append( portalPage.getMetaValue ( 'id' ) );    
    }
    
    ee.nav(url);
    return false;
};

eFolderTask.prototype.cloneElement = function()
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    ee.wc( true );
    var qs = new StringBuilder();
    qs.append('../request/elementForm?ELEMENT.ELEMENT_ID=' ).append( portalPage.getMetaValue( 'element.element_id' ) )
    .append('&verb=Clone' );
    ee.pop( qs.toString(), 500, 600 );
    ee.wc( false );
    eFolderTask.release();
}
;



// Event handler for 'New Element'. This creates the form and
// places it in newDiv.
eFolderTask.prototype.createNewElement = function( )
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
    try
    {
        EventUtils.stopEventPropagation( EventUtils.getEvent() );
    }
    catch( error )
    {
        /* alert( error.message ); */
    }
    
    
    var url = new StringBuilder();
    url.append( "../request/creator?" );
    if( portalPage )
    {
        var fid = portalPage.getMetaValue( 'id' );
        url.append("&fid=").append(fid);
    }
   
    if(ie5){ window.navigate( url ); }
    else{ window.location = url; }
    
}
;


eFolderTask.prototype.addToFavorites = function( evt )
{
    if(!enterCheck(EventUtils.getEvent())){return true;}

    // Apparently the database does not use the sys_context user value for the favorites.
    // var sql = new eSqlStatement("INSERT INTO tuple (type_id, parent_id, child_id, name, validation_dt) VALUES(?, (-1*Sys_Context('ELEMENTS_CTX','USER_ID')), ?, \'\',SYSDATE)");
    var sqld = new eSqlStatement("DELETE FROM tuple WHERE type_id = ? AND parent_id = (-1*UID) AND child_id =  ?");
    var sql = new eSqlStatement("INSERT INTO tuple (type_id, parent_id, child_id, name, validation_dt) VALUES(?, (-1*UID), ?, \'\',SYSDATE)");
    var type = portalPage.getMetaValue( 'type' );
    var value = null;
    if( type == 20 || type == 21 || type == 23 )
    {
        sqld.addParameter( new eParameter( 'number', 97 ) );
        sql.addParameter( new eParameter( 'number', 97 ) );
        value = portalPage.getMetaValue( 'id' ) ;
    }
    else if( type == 0 )
    {
        sqld.addParameter(  new eParameter( 'number', 101 ) );
        sql.addParameter(  new eParameter( 'number', 101 ) );
        value = portalPage.getMetaValue( 'element.element_id' );
        ee.dm( "adding " + value + " to my favoritest type = " + type );
    }
    else
    {
        sqld.addParameter( new eParameter( 'number', 100 ) );
        sql.addParameter( new eParameter( 'number', 100 ) );
        value = portalPage.getMetaValue( 'id' ) ;
    }
    sqld.addParameter( new eParameter( 'number', value ) );
    sql.addParameter( new eParameter( 'number', value ) );
    sqlList = new eSqlList( function()
    {
        alert("Added to My Favorites.");
        ee.wc( false );
    }
    );
    sqlList.addStatement( sqld );
    sqlList.addStatement( sql );
    sqlList.execute();
    ee.wc( true );
    try{document.body.dialog.release();}catch(error){}
}
;

eFolderTask.prototype.makeHomePage = function( evt )
{
    if(!enterCheck(EventUtils.getEvent())){return true;}
    
   
    var sql = "DELETE parameter WHERE type_id= 46 AND parameter='USER_HOME' AND id = Sys_Context('ELEMENTS_CTX','USER_ID')";
    var sql2 = "INSERT INTO parameter(id, parameter, value, type_id) VALUES(Sys_Context('ELEMENTS_CTX','USER_ID'),'USER_HOME', ?, 46)";
    var ss1 = new eSqlStatement( sql );
    var ss2 = new eSqlStatement( sql2 );
    ss2.addParameter( new eParameter( 'number', portalPage.getMetaValue( 'id' ) ) );
    sqlList = new eSqlList( function()
    {
        window.status = "Your home page has been changed.";
        alert( "Your home page has been changed.\nThis will take effect on your next login." );
        ee.wc( false );
    }
    );
    sqlList.addStatement( ss1 );
    sqlList.addStatement( ss2 );
    sqlList.execute();
    ee.wc( true );
    eFolderTask.release();
}
;



eFolderTask.prototype.showTaskMenu = function()
{
    evt = EventUtils.getEvent();
    if( evt.type == 'keydown' && evt.keyCode != KEY_ENTER  ){return;}
		    
    var holder = document.body;
    if( holder.dialog )
    {
        eFolderTask.release();
    }
    else
    {
        eTOC.hideMenu();
        holder.dialog = new eDialog( holder );
        holder.dialog.addListener( new taskAdapter( portalPage ) );
        var vp = eDialog.viewPortSize();

        var pos = ee.pos(ee.ge("eFolderTask.taskMenu"));
        pos[1] = pos[1]+ee.ge("eFolderTask.taskMenu").offsetHeight;
        
        var height = eFolderTask.getSize()[1];
        var width = eFolderTask.getSize()[0];
        holder.dialog.setHeight( height );
        holder.dialog.setWidth( width );
        if( (pos[0] + width) > vp[0] )
        {
            pos[0] = pos[0] - ((pos[0] + width) - vp[0]) - 17;
        }
        var url = eFolderTask.getTaskList();
        eDialog.loadContentFromUrl( url, holder.dialog, pos[0], pos[1] );
        
        
    }
    EventUtils.stopEventPropagation(evt);

}
;

eFolderTask.keyNavListener = function(evt)
{
    evt = EventUtils.getEvent();
    
    // Check the escape key first.
    if( evt.type == 'keydown' && evt.keyCode == KEY_ESCAPE  )
    {
        eFolderTask.release();
        EventUtils.removeEventHandler(document.body, "keydown", eFolderTask.keyNavListener);
        ee.ge("eFolderTask.taskMenu.label").focus();
        return;
    }
    
    // Arrow key navigation within the menu.
    if( evt.type == 'keydown' && (evt.keyCode == KEY_UP || evt.keyCode == KEY_DOWN ) )
    {
        var target = EventUtils.getTargetElement();
        target = EventUtils.getNormalizedTargetElement('LI',target);

        if(evt.keyCode == KEY_UP)
        {
            var next;
            if( target.previousSibling )
            {
                try
                {
                    focusElement = target.previousSibling;
                    setTimeout('focusElement.focus();',0);
                }catch(e){alert(e.message);}
            }
        }
        else
        {
           if( target.nextSibling )
           {
                try
                {
                    focusElement = target.nextSibling;
                    setTimeout('focusElement.focus();',0);
                }catch(e){alert(e.message);}
           }
        }
        EventUtils.stopEventPropagation(evt);
        return false;
    }
}

function enterCheck(evt)
{
    if( evt.type == 'click' ) { return true; }
    if( evt.type == 'keydown' && evt.keyCode == KEY_ENTER  ){ return true;}
    return false;
}




eFolderTask.getSize = function()
{
    var type = portalPage.getMetaValue( "type" );
    var rval = [];
    if( type == 20 )
    {
        rval[0] = (ie5) ? 255 : 255;
        rval[1] = (ie5) ? 195 : 195;
    }
    else if( type == 88 )
    {
        rval[0] = (ie5) ? 255 : 255;
        rval[1] = (ie5) ? 220 : 220;
    }
    else if( type == 0 )
    {
        rval[0] = (ie5) ? 255 : 245;
        rval[1] = (ie5) ? 260 : 260;
    }
    return rval;
}
;

// Paramterize these, move the impl into the page, by adding as a meta param !!!
eFolderTask.getTaskList = function()
{
    var type = portalPage.getMetaValue( "type" );

    var id = portalPage.getMetaValue("id");
    var url = "../request/actionmenu?type="+type+"&id="+id;
    
    if( type == 0 )
    {
//        url = "../templates/system/tasklist0.html";
         var id = portalPage.getMetaValue( "class.class_id" );
         var eid = portalPage.getMetaValue( "element.element_id" );
         url = "../request/actionmenu?type=0&id="+id+"&ELEMENT.ELEMENT_ID="+eid;
    }
    return url;
}
;

// list_id = named_text_id of filter that constitutes the list.
// column_name = html id of the select object we are going to update.
// id_meta_col = the meta column that is the id value for the SPL.
eFolderTask.popSqlPickListDetails = function( list_id, column_name, id_meta_col )
{
    alert( 'Not Implemented Yet' + list_id + ', ' + column_name + ', ' + id_meta_col );



}
;

function taskAdapter( portalPage )
{
    this.portalPage = portalPage;
}

taskAdapter.prototype.notify = function( dialog )
{
    var reg = /<esql:exception /;
    if( dialog.getPanel().innerHTML.search(reg) > 0 )
    {
        var loc = window.location;
        window.location = loc;
        return;
    }

    this.portalPage.registerTaskHandlers( );
    EventUtils.addEventHandler( document.body, "keydown", eFolderTask.keyNavListener, false);

    var ftasklist = ee.ge('folder-task-list');
    if( !isNull(ftasklist) )
    {
	    var listItems = ee.ge('folder-task-list').getElementsByTagName('li');
	    Array.forEach(listItems, function(item)
	    {
	        EventUtils.addEventHandler(item, "focus", function(evt)
	        {
	            item.style.backgroundColor = "#bbbbff";
	        }, false);
	        EventUtils.addEventHandler(item, "blur", function(evt)
	        {
	            item.style.backgroundColor = "";
	        }, false);
	    
	    });
	
	    try{focusElement = ee.ge('folder-task-list').getElementsByTagName('li')[0]; 
	        setTimeout('focusElement.focus();',0);
	    }catch(e){alert(e.message);}
    }
}
;




///////////////////////////////////////////////////////////////////////////////
// TOC a list of navigation links to the sections of a portal page.
///////////////////////////////////////////////////////////////////////////////
function ePortalSection(id, label, toggleid)
{
    this.id = id;
    this.label = label;
    this.toggle_id = toggleid;
}

ePortalSection.prototype.toString = function()
{
    return this.id+", "+this.label;
}

function eTOC()
{
    this.sectionList = [];
    this.isStatic = false;
}

eTOC.prototype.add = function(id, label, toggle)
{
    this.sectionList.push( new ePortalSection(id,label,toggle) );
}

eTOC.registerTOCEventHandlers = function ()
{
    ePortalPage.setHandler( 'tocLabel', ["click"], eTOC.showContents  );
}

eTOC.unregisterTOC = function()
{
    var tocLabel = ee.ge( 'tocLabel' );
    EventUtils.removeEventHandler( tocLabel, 'click', eTOC.showContents );
    EventUtils.removeEventHandler( tocLabel, 'keydown', eTOC.showContents );
}

eTOC.writeStaticTableofContents = function()
{
    var contents = ee.ge("contents");
    var menu =  ee.ceAsChild("ol",contents);
    menu.className = "static-toc";
    Array.forEach(portalPage.toc.sectionList, function(item)
    {
        li = ee.ceAsChild( "li", menu );
        li.className = "folder-task";
        var a = ee.ceAsChild( "a", li );
        a.href = "#H" + item.id;
        a.appendChild( ee.ct( item.label ) );
        a.className = "content-link";

    });

}


eTOC.showContents = function()
{
    if(portalPage && portalPage.toc.isStatic){ return; }
    evt = EventUtils.getEvent();
    
    if( evt.type == 'keydown' && !(evt.keyCode == KEY_ENTER || evt.keyCode == KEY_SPACE)  ){return;}
    
    var body = document.body;
    if( body.menu )
    {
        eTOC.hideMenu();
    }
    else
    {
    // if the Action menu is open, close it first.
        eFolderTask.release();
        body.menu = new eDialog( body );
        var vp = eDialog.viewPortSize();
        
        var pos = ee.pos(ee.ge("contents"));
        pos[1] = pos[1]+ee.ge("contents").offsetHeight;
        
        var height = (portalPage.toc.sectionList.length * 20) + 20;
        var width = 130;
        body.menu.setHeight( height );
        body.menu.setWidth( width );
        if( (pos[0] + width) > vp[0] )
        {
            pos[0] = pos[0] - ((pos[0] + width) - vp[0]) - 17;
        }
        
        ee.ge( 'contents' ).style.backgroundColor = "#ffffbb";
        body.menu.setBackgroundClassName( "menu-background" );
        
        var menu = ee.ce( "ul" );
        menu.className = "folder-task-list";
        menu.tabIndex = 999;
        Array.forEach(portalPage.toc.sectionList, function(item)
        {
            li = ee.ceAsChild( "li", menu );
            li.tabIndex = 1000;
            li.className = "folder-task";
            var a = ee.ceAsChild( "a", li );
            a.href = "#" + item.id;
            a.appendChild( ee.ct( item.label ) );
            a.className = "content-link";
            a.onclick = function()
            {
                location.hash = item.id;
                eTOC.hideMenu();
                if( !isNull(item.toggle_id) && item.toggle_id.length > 0 )
                {
                    if( ee.ge(item.toggle_id).style.display == "none" )
                    {
                        toggleDivImg(item.toggle_id, ee.ge( "tog-"+item.toggle_id));
                    }
                }
                return true;
            };
            EventUtils.addEventHandler(a, "keydown", function(evt)
            {
                evt = EventUtils.getEvent();
                if( evt.keyCode == KEY_ENTER ){a.onclick();}
            }, false);
            EventUtils.addEventHandler(a, "focus", function(evt)
            {
                a.style.backgroundColor = "#bbbbff";
            }, false);
            EventUtils.addEventHandler(a, "blur", function(evt)
            {
                a.style.backgroundColor = "";
            }, false);
        });
        body.menu.add( menu );
        body.menu.showAt( pos[0], pos[1] );
        if( menu.getElementsByTagName('li').length > 0 )
        {
            menu.getElementsByTagName('li')[0].focus();
        }
        EventUtils.addEventHandler( document.body, "keydown", eTOC.keyNavListener, false);
    }
}


eTOC.hideMenu = function()
{
    if( !isNull(document.body.menu) )
    {
        document.body.menu.release();
        document.body.menu = null;
        ee.ge( 'contents' ).style.backgroundColor = "";
        EventUtils.removeEventHandler(document.body, "keydown", eTOC.keyNavListener);
    }
}


eTOC.keyNavListener = function(evt)
{
    evt = EventUtils.getEvent();
    
    // Check the escape key first.
    if( evt.type == 'keydown' && evt.keyCode == KEY_ESCAPE  )
    {
        eTOC.hideMenu();
        ee.ge( 'contents' ).focus();
        return;
    }
    
    // Arrow key navigation within the menu.
    if( evt.type == 'keydown' && (evt.keyCode == KEY_UP || evt.keyCode == KEY_DOWN ) )
    {
        var target = EventUtils.getTargetElement();
        target = EventUtils.getNormalizedTargetElement('LI',target);
        if(evt.keyCode == KEY_UP)
        {
            var next;
            if( target.previousSibling )
            {
                try
                {
                    focusElement = target.previousSibling.getElementsByTagName('a')[0];
                    setTimeout('focusElement.focus();',0);

                }catch(e){alert(e.message);}
            }
        }
        else
        {
           if( target.nextSibling )
           {
                try
                {
                    focusElement = target.nextSibling.getElementsByTagName('a')[0];
                    setTimeout('focusElement.focus();',0);
                }catch(e){alert(e.message);}
           }
        }
        return false;
    }
}










;

