/* Scripts for the musto demo page */ 

var s_selectedMenu = null;
var s_defaultMO = null;
var s_hoveredMenu = null;
var s_currentPageName = null;

function MenuObject( _menuName, _menuCallback )
{
    this.menuName = _menuName;
    this.menuCB   = _menuCallback;
}

function populateMenuBar()
{
    clearClickShield();

    var mb = GetElem("menubar");
    mb.innerHTML = '';
    
    var i;
    for (i=0;i<g_menubarData.length;i++)
    {
        var item = g_menubarData[i];      
        addMenuItem( mb, item.name, buildMenuObjects(item.pages) );
    }
}

//Convert menu data into menu objects:
function buildMenuObjects( _menus )
{
    var os = [];
    var i;
    for (i=0;i<_menus.length;i++)
    {
        os[ i ] = new MenuObject( _menus[i].name, _menus[i].id );
    }
    return os;
}

//Hover functionality, as css hover broken in IE.
function hoverOverItem( _evt )
{
    _evt = ReconcileEvent( _evt );
    if ( s_hoveredMenu )
    {
        s_hoveredMenu.style.color = '';
        s_hoveredMenu.style.backgroundColor = '';
    }
    s_hoveredMenu = _evt.target;
    if ( s_hoveredMenu )
    {
        s_hoveredMenu.style.color = '#000';
        s_hoveredMenu.style.backgroundColor = '#FFF';
    }
}
function hoverOutItem( _evt )
{
    if ( s_hoveredMenu )
    {
        s_hoveredMenu.style.color = '';
        s_hoveredMenu.style.backgroundColor = '';
    }
    s_hoveredMenu = null;
}

function cancelFunction() { return false; }
function absorbFunction() { return true; }

//Adds a menu item
function addMenuItem( _menu, _name, _submenu )
{
    var mbItem = document.createElement('div');
    mbItem.className = 'item';
    mbItem.menuType = 'main';
    mbItem.innerHTML = _name;
    mbItem.onmouseover = hoverOverItem;
    mbItem.onmouseout  = hoverOutItem;
    mbItem.onclick = menuSelect;
    mbItem.onselectstart = cancelFunction;

    if ( _submenu )
    {
        //Create submenu:
        var subMenu = document.createElement('div');
        subMenu.className = 'subMenu';
        var i;
        for (i=0;i<_submenu.length;i++)
        {
            var mo = _submenu[i];
            mo.parentMenu = subMenu;    //Suitable place to assign
            if ( s_defaultMO == null )
            {
                s_defaultMO = mo;
            }
            var mi = createMenuItem( mo );
            mi.onmouseover = hoverOverItem;
            mi.onmouseout  = hoverOutItem;
            mi.menuType = 'sub';
            subMenu.appendChild( mi );
        }
        mbItem.subMenu = subMenu;
    }

    _menu.appendChild( mbItem );
}
//Copy a menu into the side bar:
function populateSidebar( _mo )
{
    var sb = GetElem('sidebar');
    sb.innerHTML = '';
    if ( _mo && _mo.parentMenu )
    {
        var menu = _mo.parentMenu;

        var i;
        for (i=0;i<menu.childNodes.length;i++)
        {
            var mo = menu.childNodes[i].menuObject;
            if ( mo )
            {
                var mi = createMenuItem(mo);
                if ( mo == _mo )
                {
                    mi.className += ' selected';
                }
                sb.appendChild( mi );
            }
        }
    }
}

//Create a menu item:
function createMenuItem( _mo )
{
    var subMenuItem = document.createElement('div');
    subMenuItem.className = 'item'
    subMenuItem.menuObject = _mo;
    subMenuItem.innerHTML = _mo.menuName;
    subMenuItem.onclick = clickMenu;
    subMenuItem.onselectstart = cancelFunction;
    return subMenuItem;
}

function menuSelect( _evt )
{
    _evt = ReconcileEvent( _evt );
    var mb = _evt.target;
    var gl = GetElem('menuLayer' );
    clearClickShield();    

    var sm = mb.subMenu;
    if ( sm )
    {
        var xPos = GetAbsoluteX( mb );
        var yPos = GetAbsoluteY( mb );

        if (isIE ) yPos += GetScrollTop();

        var container = document.createElement('div');
        container.style.zIndex = 6;
        container.style.position = 'absolute';
        container.style.left = xPos + 'px';
        container.style.top = yPos + 'px';

        var clonedTitle = mb.cloneNode(true);
        clonedTitle.gotoLink = mb.innerHTML;
        clonedTitle.onclick = gotoMenuDescriptor;
        clonedTitle.style.position = 'relative';
        clonedTitle.style.float = 'none';
        clonedTitle.style.width = (mb.offsetWidth - 30) + 'px';
        container.appendChild( clonedTitle );

        setInvisibleButClickable( container );
        gl.appendChild( container );

        container.appendChild( sm );
        s_selectedMenu = sm;

        enableClickShield();
        gl.onclick = clearClickShield;
    }
}

//Goto the menu descriptor
function gotoMenuDescriptor(_evt)
{
    _evt = ReconcileEvent(_evt);
    location.href = 'page.php?idx='+encodeURIComponent(_evt.target.gotoLink);
}

//Selected menu item:
function clickMenu( _evt )
{
    _evt = ReconcileEvent( _evt );
    var menu = _evt.target;
    var mo = menu.menuObject;
    clearClickShield();
    
    s_currentPageName = mo.menuName;

    //Callback:
    location.href = 'page.php?idx='+mo.menuCB;
}



//////////////////////////////
function clearClickShield()
{
    var gl = GetElem('menuLayer' );
    if ( s_selectedMenu )
    {
        s_selectedMenu.parentNode.removeChild( s_selectedMenu );
        s_selectedMenu = null;
    }
    gl.innerHTML = '';
    gl.onclick = null;
    gl.style.display = 'none';
}
function enableClickShield()
{
    var gl = GetElem('menuLayer' );
    gl.onclick = null;
    gl.style.display = '';

    //Set to doc size:
    var winWidth = (window.innerWidth?window.innerWidth:document.documentElement.clientWidth);
    var winHeight = (window.innerHeight?window.innerHeight:document.documentElement.clientHeight);
    //Old IEs:
    if ( !winWidth )
    {
        winWidth = document.clientWidth;
        winHeight = document.clientHeight;
    }
    //Can't get it at all?!:
    if ( !winWidth )
    {
        winWidth = 800;
        winHeight = 600;
    }

    //Make sure we don't introduce a scrollbar:
    winWidth -= 20;

    gl.style.width = winWidth+"px";
    gl.style.height = winHeight+"px";

    setInvisibleButClickable( gl );
}

function setInvisibleButClickable(_elem)
{
    //Hack for IE:
    if ( isIE )
    {
        var shield = document.createElement('div');
        shield.id = 'clickShield_'+Math.random();
        shield.style.visibility = 'hidden';
        shield.style.position = 'absolute';
        shield.style.top = '0px';
        shield.style.left = '0px';
        shield.style.width = _elem.offsetWidth + 'px';
        shield.style.height = _elem.offsetHeight + 'px';;
        shield.style.backgroundColor = '#000';
        shield.style.filter = 'alpha(opacity=0)';        
        setTimeout('GetElem("'+shield.id+'").style.visibility="";', 10);
        _elem.appendChild( shield );
    }
    else
    {
        _elem.style.backgroundColor = '';
    }
}

/* Editable blocks */
function EditableValue( _name, _value )
{
    this.m_name = _name;
    this.m_value = _value;
}

function addEditableBlock( _node, _value )
{
    var eb = document.createElement( 'div' );
    eb.className = 'editableBlock';
    eb.editValue = _value;
    eb.innerHTML = '<em class="name">'+_value.m_name+':</em><em class="value">'+_value.m_value+'</em><em class="valueEditor"><input type="text"/></em><em class="edit" onselectstart="return false;" onclick="editBlock(this.parentNode);">(edit)</em>';
    _node.appendChild( eb );
    eb.onmouseover = unhideEditButton;
    eb.onmouseout  = hideEditButton;
    return eb;
}

var s_editingBlock = null;
function editBlock( _block )
{
    var prevEditBlock = s_editingBlock;
    uneditBlock();
    if ( _block.editValue && prevEditBlock != _block )
    {
        s_editingBlock = _block;
        var value = getChildOfClass(_block, 'value');
        var editor = getChildOfClass(_block, 'valueEditor');
        value.style.display = 'none';
        editor.firstChild.value = value.innerHTML;
        editor.style.display = 'inline-block';
    }
}
function uneditBlock()
{
    if ( s_editingBlock )
    {
        var value = getChildOfClass(s_editingBlock, 'value');
        var editor = getChildOfClass(s_editingBlock, 'valueEditor');
        value.innerHTML = editor.firstChild.value;
        value.style.display = 'inline-block';
        editor.style.display = 'none';
       
        s_editingBlock = null;
    }
}

//For edit button hide/unhide:
var s_visibleEditButton = null;
function unhideEditButton(_evt)
{
    hideEditButton();
    _evt = ReconcileEvent( _evt );
    var eb = findEditButton( _evt.target );
    if ( eb )
    {
        eb.style.visibility = 'visible';
        s_visibleEditButton = eb;
    }
}
function getChildOfClass( _parent, _class )
{
    if ( _parent )
    {
        var i;
        for ( i=0;i<_parent.childNodes.length;i++)
        {
            if ( _parent.childNodes[i].className == _class )
            {
                return _parent.childNodes[i];
            }
        }
    }
    return null;
}
function findEditButton( _elem )
{
    //Search for edit button
    while ( _elem && _elem.className != 'editableBlock' )
    {
        _elem = _elem.parentNode;
    }
    return getChildOfClass( _elem, 'edit' );
}
function hideEditButton(_evt)
{
    if ( s_visibleEditButton )
    {
        s_visibleEditButton.style.visibility = '';
        s_visibleEditButton = null;
    }
}

/* My smart law */
var s_taggedPages = [];
function getCurrentlyTaggedPagesHTML()
{
    if ( s_taggedPages.length == 0 )
    {
        return 'You currently have no tagged pages.';
    }
    var retVal = '<ul>';
    var i;
    for ( i=0;i<s_taggedPages.length;i++)
    {
        retVal += '<li><a href="page.php?idx='+s_taggedPages[i].pageId+'">'+s_taggedPages[i].pageName+'</a></li>';
    }
    retVal += '</ul>';
    return retVal;
}
function tagThisPage()
{
    var i;
    for ( i=0;i<s_taggedPages.length;i++)
    {
        if ( s_taggedPages[i].pageId == g_pageIdx )
        {
            //Untag:
            s_taggedPages.splice(i,1);
            commitBookmarks();
            redrawTaggedPages();
            return;
        }
    }
    var taggedPage = new Object();
    taggedPage.pageId = g_pageIdx;
    taggedPage.pageName = g_pageName;
    s_taggedPages[s_taggedPages.length] = taggedPage;
    
    commitBookmarks();
    redrawTaggedPages();
}

//Commit bookmarks to server:
function commitBookmarks()
{
    if ( g_loggedIn )
    {
        //Inform server:
        var url = 'smartLaw.php?f=setBookmarks&bookmarkJson='+encodeURIComponent( json_encode( s_taggedPages ) );
        RequestURL( url, null, null, function( _json ) { } );
    }
    else
    {
        //TODO: Set cookie with tagged pages
    }
}

function requestTaggedPages()
{
    s_taggedPages = [];
    //TODO: populate s_taggedPages from cookies

    if ( g_loggedIn )
    {
        RequestURL( "smartLaw.php?f=getBookmarks", null, null, gotTaggedPages );
    }
    else
    {
        redrawTaggedPages();
    }
}
function gotTaggedPages( _pages )
{
    if ( _pages )
    {
        //Error check here?
        var fromServer = json_decode( _pages );

        //Appending to tag list:
        var i;
        for ( i=0;i<fromServer.length;i++)
        {
            var add = true;
            var j;
            for (j=0;j<s_taggedPages.length;j++)
            {
                if ( s_taggedPages[j].pageId == fromServer[i].pageId )
                {
                    add = false;
                    break;
                }
            }
            if ( add )
            {
                s_taggedPages[ s_taggedPages.length ] = fromServer[i];
            }
        }
        redrawTaggedPages();
    }
}
function redrawTaggedPages()
{
    var tp = GetElem('taggedPages');
    tp.innerHTML = getCurrentlyTaggedPagesHTML();

    var ttp = GetElem('tagThisPage');
    var ttpInstr = 'Tag this Page';
    var i;
    for ( i=0;i<s_taggedPages.length;i++)
    {
        if ( s_taggedPages[i].pageId == g_pageIdx )
        {
            ttpInstr = 'Untag this Page';
            break;
        }
    }
    ttp.innerHTML = ttpInstr;
}

//Message history:
var s_recentMessages = [];
function requestMessageHistory()
{
    s_recentMessages = [];
    //TODO: populate s_taggedPages from cookies

    if ( g_loggedIn )
    {
        RequestURL( "smartLaw.php?f=getMessages", null, null, gotRecentMessages );
    }
    else
    {
        redrawRecentMessages();
    }
}
function gotRecentMessages( _data )
{
    if ( _data )
    {
        s_recentMessages = json_decode( _data );
    }
    redrawRecentMessages();
}
function redrawRecentMessages()
{
    var mhElem = GetElem('messageHistory');
    if ( g_loggedIn )
    {
        if ( s_recentMessages && s_recentMessages.length )
        {
            var opts = '';
            var i;
            for (i=0;i<s_recentMessages.length;i++)
            {
                var message = s_recentMessages[i];
                var txt = message.bodyText;
                if ( txt.length > 21 )
                {
                    txt = txt.substring(0,20) + '...';
                }
                opts += '<option value="'+i+'">'+txt+'</option>';
            }

            mhElem.innerHTML = 'Message History:<br/><select onchange="showHistoryMessage(this.value);" size="4">'+opts+'</select>';
        }
        else
        {
            mhElem.innerHTML = 'You have not previously contacted Smart Law through this site.';
        }
    }
    else
    {
        mhElem.innerHTML = 'You need to be logged in to view message history.';
    }
}
//Show a message:
function showHistoryMessage( _idx )
{
    var regDialog = OpenDialog( 340, 300, 'Message to Smart Law' );
        regDialog.innerHTML = '\
        <div style="padding:2px 20px 20px 2px;">\
            <form action="" method="post" name="LoginForm">\
                <table><tr><td class="pb_heading">Date Sent:&nbsp;&nbsp;</td><td style="vertical-align:middle;">'+s_recentMessages[_idx].timestamp+'</td></tr></table>\
                <p class="pb_heading">Message:<br/></p>\
                <textarea style="width:90%;margin-left:5%;margin-right:5%;" rows="7" disabled="1" enabled="0">'+s_recentMessages[_idx].bodyText+'</textarea>\
                <div style="text-align:right;">\
                    <input type="button" onclick="CancelDialog();" value="Close"/>\
                </div>\
            </form>\
        </div>';
        return false;
}

//Search whole site
function doSearch()
{
    GetElem('searchProgress').style.display = '';   //Searching...
    var searchString = GetElem('searchQuery').value;
    if ( searchString != '' )
    {
        var url = "search.php?search="+encodeURIComponent(searchString);
        RequestURL( url, null, null, getSearchResult );       
    }
}
function getSearchResult( _resultJson )
{
    GetElem('searchProgress').style.display = 'none';   //Finished.
    if ( _resultJson )
    {
        var result = json_decode( _resultJson );
        if ( result )
        {
            var resDlg = OpenDialog( 400, 250 + 20*result.length, 'Search Results' );
            if ( result.length )
            {
                var table = '';
                var i;
                for ( i=0;i<result.length;i++)
                {
                    table += '<div class="searchResult" onclick="location.href=\'page.php?idx='+result[i].pageId+'\'"><div class="item">'+result[i].pageName+'</div><div class="preview">'+result[i].pageDesc+'</div></div>';
                }

                resDlg.innerHTML = '\
        <div style="padding:10px 20px 20px 10px;">\
            The following pages match your query:<br/>\
            <div>' + table + '</div>\
            <div style="text-align:right"><input type="button" value="Close" onclick="CancelDialog();"/></div>\
        </div>';
            }
            else
            {
                resDlg.innerHTML = '\
        <div style="padding:10px 20px 20px 10px;">\
            No results matched your search criteria! Please try another. The query is cumulative, so try adding additional terms, and partial words will match, so try sub-words.\
            <div style="text-align:right"><input type="button" value="Close" onclick="CancelDialog();"/></div>\
        </div>';
            }
        }
    }
}

//Allow legacy:
function slf_navigate(_idx)
{
    location.href = 'page.php?idx='+_idx;
    return true;
}

loadHandlers[loadHandlers.length] = requestTaggedPages;
loadHandlers[loadHandlers.length] = requestMessageHistory;

/* End my smart law */

/* Init */
populateMenuBar();
