/*
 *    Copyright (c) 2002 Synthis Corporation.
 *    430 10th Street NW
 *    Suit S-108
 *    Atlanta, GA 30018
 *    All rights reserved.
 *
 *    This software is the confidential and proprietary
 *    information of Synthis Corporation. You shall not
 *    disclose such Confidential Information and shall
 *    use it only in accordance with the terms of the
 *    license agreement you entered into with Synthis.
 */



var _elements = new Array();
var _diagrams = new Array();

var _currentWireframe = '0';
var _currentDiagramElement = '0';
var _currentDiagram = '0'

var _lastDiagramElement = '0';
var _lastWireframe = '0';
var _lastDiagram = '0';

//onlly used in initWireframes();
var _defaultWireframe = '0';
var _defaultDiagram = '0';

//*****************************************************************************
// INITIALIZATION
//*****************************************************************************

function initWireframes()
{
   _lastDiagram   = _defaultDiagram;
   _lastWireframe = _defaultWireframe;
   
   setTimeout("updateDiagramWireframePanes()", 500);
}

//*****************************************************************************
// BASIC SETTERS & GETTERS
//*****************************************************************************
function setDefaultWireframe(elementID)
{
   _defaultWireframe=elementID;
}
function setDefaultDiagram(diagramID)
{
   _defaultDiagram=diagramID;
}

function getCurrentDiagramElement()
{
   //debug('Current Diagram Element: ' + diagram.currentDiagramElement);
   return _currentDiagramElement;
}

//called by the diagram pages when a user clicks a new page
function setCurrentDiagramElement(elementID)
{
   _currentDiagramElement = elementID
}

function getCurrentWireframe()
{
   //debug('Current Wireframe: ' + wireframe.currentWireframe);
   return _currentWireframe;
}
function setCurrentWireframe(elementID)
{
   _currentWireframe = elementID;
}

function setCurrentDiagram(diagramID)
{
   _currentDiagram = diagramID;
}

function getCurrentDiagram()
{
   return _currentDiagram;
}

function setElementsArray(inElements)
{
   _elements = inElements;
}

function setDiagramsArray(inDiagrams)
{
   _diagrams = inDiagrams;
}

//*****************************************
// Data Structure Accessors
//******************************************

function getElementRecord(elementID)
{
   for(var j=0; j<_elements.length; j++)
   {
      if(elementID == _elements[j][0])
         return _elements[j];
   }
   //debug(Element ' + elementID + ' not found.');
   return null;
}

function getElementWireframeHref(elementID)
{
   return getElementRecord(elementID)[1];
}

function getElementsDiagramID(elementID)
{
   //debug(getElementsDiagrams(elementID)[0][0] + ':getElementsDiagramID(elementID)');
   var elementsDiagrams = getElementsDiagrams(elementID);
   if(elementsDiagrams != null && elementsDiagrams.length > 0)
       return  getElementsDiagrams(elementID)[0][0];
   else
       return null;
}

function getElementsDiagrams(elementID)
{
   //debug(getElementRecord(elementID)[2] + ':getElementsDiagrams(elementID)');
   var elementRecord = getElementRecord(elementID);
   if( elementRecord != null )return elementRecord[2];
   else return null;
}

function getElementDiagramHref(elementID)
{
    var diagramID = getElementsDiagramID(elementID);
    if( diagramID != null)
        return getDiagramRecord(diagramID)[2];
    else
        return null;
}

function getDiagramRecord(diagramID)
{
   for(var j=0; j<_diagrams.length; j++)
   {
      if(diagramID == _diagrams[j][0])
         return _diagrams[j];
   }
   //debug('Diagram ' + diagramID + ' not found.');
   return null;
}

function getElementDiagramPosition(elementID, diagramID)
{
    
    var diagrams = getElementsDiagrams(elementID);  

    if( diagrams == null)
      return null;
    
    //debug('Element: ' + elementID + ' Diagram: ' + diagramID);  
    
    for(var i=0; i<diagrams.length; i++)
    {
      //debug(diagrams[i]);
      if(diagrams[i][0] == diagramID)
      {
         return diagrams[i];
      }
    }
    return null;
}

function elementIsOnDiagram(elementID, diagramID)
{
    //debug('elementsIsOnDiagram(+' + elementID + ',' + diagramID + ')');
    var diagrams = getElementsDiagrams(elementID);  
    //debug('Element: ' + elementID + ' Diagram: ' + diagramID);
    for(var i=0; i<diagrams.length; i++)
    {
      //debug(diagrams[i][0] + ',' + diagramID);
      if(diagrams[i][0] == diagramID)
         return true;
    }
    //debug('Element: ' + elementID + ' not on Diagram: ' + diagramID);
    return false;
}


/*****************************************************************************
 UPDATE FUNCTIONS
*****************************************************************************/

/**
 * Updates the wireframe in response to the user clicking
 * on a new diagram element
 */
function updateWireframePane(currentDiagramElement)
{
   //debug('Checking Wireframe Pane');
   if(getCurrentWireframe() != getCurrentDiagramElement())
   {
      //debug('Updating Wireframe Href: ' + getElementRecord(currentDiagramElement)[1]);
      wireframe.location.href = getElementWireframeHref(getCurrentDiagramElement());
      setCurrentWireframe(getCurrentDiagramElement());
   }
}

/**
 * Moves the diagram indicator in response to the user
 * navigating to a new wireframe via a link on a wireframe
 * 
 * If the current wireframe element is not on the diagram 
 * then the new wireframe elements' default diagram will be loaded
 */
function updateDiagramPane()
{
   //debug('Checking Diagram Pane');
   if(!elementIsOnDiagram(getCurrentWireframe(), getCurrentDiagram()))
   {
      //debug('Updating Diagram Href: ' + getElementDiagramHref(currentWireframeElement));
      
       var newDiagramHref = getElementDiagramHref(getCurrentWireframe());
       if(newDiagramHref != null && newDiagramHref != '')
       {
           diagram.location.href = newDiagramHref;
           setCurrentDiagram(getElementsDiagramID(getCurrentWireframe()));
       }
   }

         
}

/**
 * Elements with an ID of '0' are not 'real' elements and are not
 * on a diagram at all, so the diagram indicator is hidden 
 * by moving it off screen
 */
function updateDiagramIndicator()
{
   //alert(diagram);
   if(getCurrentWireframe() != null 
      && getCurrentWireframe() != '0' 
      && getElementDiagramPosition(getCurrentWireframe(), getCurrentDiagram()) != null)
   {

      var xy = getElementDiagramPosition(getCurrentWireframe(), getCurrentDiagram());
      if(xy!=null)
      {
         parent.diagramIndicatorX = xy[1];
         parent.diagramIndicatorY = xy[2];
      }
   }
   else
   {
      parent.diagramIndicatorX = -2000;
      parent.diagramIndicatorY = -2000;
   }
}



/**
 * When a new diagram is loaded this function 
 * will be called so that the diagram menu can rewrite
 * itself and make the link for the current diagram inactive
 */
function updateDiagramMenu()
{
   //debug('Updating Diagram Menu');
   diagramMenu.location.href="diagramMenu.html"
}


/*****************************************************************************
 MAIN DRIVER - Loops continusously
*****************************************************************************/

function updateDiagramWireframePanes()
{
   //debug('LastWireframe='+lastWireframe + ', CurrentWireframe=' + getCurrentWireframe());
   if(_lastWireframe != getCurrentWireframe())
   {
      if(getCurrentWireframe() != '0')
         updateDiagramPane();
      
      //updateDiagramIndicator();
   }
   
   //debug('LastDiagramElement='+lastDiagramElement + ', CurrentDiagramElement=' + getCurrentDiagramElement());
   if(_lastDiagramElement != getCurrentDiagramElement())
   {
      updateWireframePane();
   }
   
   //debug('LastDiagram='+_lastDiagram + ', CurrentDiagram=' + getCurrentDiagram());
   if(_lastDiagram != getCurrentDiagram())
   {
      updateDiagramMenu();  
   }

   updateDiagramIndicator();
   
   
   _lastWireframe = getCurrentWireframe();
   _lastDiagramElement = getCurrentDiagramElement();
   _lastDiagram = getCurrentDiagram();
   
   
   
   
   setTimeout("updateDiagramWireframePanes()",50);
}


function debug(message)
{
   if(true)
      alert(message);
}







