﻿////////////////////////////////////////////////////////////////////////////////////////////////////
// Norman Geiersbach
// Eitido (c) 2008
// Version 1.0.0.0
// Created 03/07/2007
//
// Description
//   
//
// History
//   03/07/2007 File created
////////////////////////////////////////////////////////////////////////////////////////////////////
  

// Global variables
////////////////////////////////////////////////////////////////////////////////////////////////////
  
// switchView() variables
  var ActiveViewControl = new Array(); // Stores identifiers for active view controls per name
  var ActiveViewDetail = new Array(); // Stores identifiers for active view details per name

  
// Element dynamic display functions
////////////////////////////////////////////////////////////////////////////////////////////////////
  
// setDisplayStyle
// Sets the display mode style of an element
  function setDisplayStyle(element, mode)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = getElement(element);

    if( element && element.style )
      element.style.display = mode;
  }


// hideElement
// Hides an element
  function hideElement(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = getElement(element);

    if( element && element.style )
      element.style.visibility = "hidden";
    else if( element && element.visibility )
      element.visibility = "hide";
  }


// showElement
// Shows an element
  function showElement(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = getElement(element); 

    if( element && element.style )
      element.style.visibility = "visible";
    else if( element && element.visibility )
      element.visibility = "show";
  } 
  
// switchView
// Switches the detail view from one list element to another by 
// hiding the "display details" control and showing the "details element".
// Additional it holds the current active "details element" so it can be
// switched back next time.
//
// Parameters
//   controlName: name pattern for the "display details" control
//   detailName: name pattern for the "details element" or
//               array of name patterns to support multiple "details elements"
//   id: identifier for a list item
  function switchView(controlName, detailName, id)
  {
    // Switching of "display details" control --------------------------------------   
    // Get elements of active control and new selected one
    var viewControl = getElement(controlName + id);    
    var viewControlActive = ActiveViewControl[controlName] != null ? getElement(controlName + ActiveViewControl[controlName]) : null;
    
    // Hide new selected control and hold its id as the new active one
    if( viewControl != null )
    {
      setDisplayStyle(viewControl, "none");
      ActiveViewControl[controlName] = id;
    }
    
    // Show previous active control
    if( viewControlActive != null )
      setDisplayStyle(viewControlActive, "block");
      
      
    // Switching of "details element(s)" -------------------------------------------  
    var detailNames = isArray(detailName) ? detailName : new Array(detailName);    
    for( i = 0; i < detailNames.length; i++ )
    {
      // Get elements of active detail view and new selected one
      var viewDetail = getElement(detailNames[i] + id);
      var viewDetailActive = ActiveViewDetail[detailNames[i]] != null ? getElement(detailNames[i] + ActiveViewDetail[detailNames[i]]) : null;
      
      // Show new selected detail view and hold its id as the new active one 
      if( viewDetail != null )
      {
        setDisplayStyle(viewDetail, "block");
        ActiveViewDetail[detailNames[i]] = id;
      }
      
      // Hide previous active detail view
      if( viewDetailActive != null )
        setDisplayStyle(viewDetailActive, "none");
    }
  }


// Element sizing functions
////////////////////////////////////////////////////////////////////////////////////////////////////  

// getNeighborsHeight
// Returns the sum of neighbor elements height
  function getNeighborsHeight(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = getElement(element);
  
    var _parentElement = element.parentNode;
    var _elementsHeight = 0;
    
    for(_i = 0; _i < _parentElement.childNodes.length; _i++)
    {
      if( _parentElement.childNodes[_i] != element )
      {
        if( !isNaN(_parentElement.childNodes[_i].offsetHeight) )
          _elementsHeight += _parentElement.childNodes[_i].offsetHeight;          
      }
    }
    
    return _elementsHeight;
  }
  
  
// getNeighborsWidth
// Returns the sum of neighbor elements width
  function getNeighborsWidth(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = getElement(element);
  
    var _parentElement = element.parentNode;
    var _elementsWidth = 0;
    
    for(_i = 0; _i < _parentElement.childNodes.length; _i++)
    {
      if( _parentElement.childNodes[_i] != element )
      {
        if( !isNaN(_parentElement.childNodes[_i].offsetWidth) )
          _elementsWidth += _parentElement.childNodes[_i].offsetWidth;          
      }
    }
    
    return _elementsWidth;
  }  
  
  
// setMaximizeHeight
// Sets an element height to maximum of parents element clientHeight 
// considering neighbor elements height (requires fixed height for all neighbors)
  function setMaximizeHeight(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = getElement(element);
    
    var _parentElement = element.parentNode;
    var _elementsHeight = 0;
    
    for(_i = 0; _i < _parentElement.childNodes.length; _i++)
    {
      if( _parentElement.childNodes[_i] != element )
      {
        if( !isNaN(_parentElement.childNodes[_i].offsetHeight) )
          _elementsHeight += _parentElement.childNodes[_i].offsetHeight;          
      }
    }
    
    element.style.height = _parentElement.clientHeight - _elementsHeight + "px";
  }

  
// setMaximizeWidth
// Sets an element width to maximum of parents element clientWidth 
// considering neighbor elements width (requires fixed width for all neighbors)
  function setMaximizeWidth(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = getElement(element);
      
    var _parentElement = element.parentNode;
    var _elementsWidth = 0;
    
    for(_i = 0; _i < _parentElement.childNodes.length; _i++)
    {
      if( _parentElement.childNodes[_i] != element )
      {
        if( !isNaN(_parentElement.childNodes[_i].offsetWidth) )
          _elementsWidth += _parentElement.childNodes[_i].offsetWidth;          
      }
    }
    
    element.style.width = _parentElement.clientWidth - _elementsWidth + "px";    
  }
