////////////////////////////////////////////////////////////////////////////////////////////////////
// Norman Geiersbach
// Eitido (c) 2007
// Version 1.0.0.11
////////////////////////////////////////////////////////////////////////////////////////////////////


// Global variables
////////////////////////////////////////////////////////////////////////////////////////////////////

// Mouse position
  xMousePos = 0; // Horizontal position of the mouse on the screen
  yMousePos = 0; // Vertical position of the mouse on the screen
  xMousePosMax = 0; // Width of the page
  yMousePosMax = 0; // Height of the page
  

// General utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////

// gen_browser
// Detects the running web browser
  function gen_browser()
  {
    if( !document.all && document.getElementById )
      return "ns6";
    if( document.layers )
      return "ns4";
    if( document.all )
      return "ie";
  }


// gen_close
// Closes the window, where the call come from
  function gen_close()
  {
    window.close();
  }


// gen_popup
// Pop up an url in a new window
// Possible additional parameters:
//   menubars, scrollbars, location, directories, resizable, status, toolbar
  function gen_popup(url, width, height)
  {
    var wndprop;
    wndprop = "width=" + width + ",height=" + height;

    for(var i = 3; i < gen_popup.arguments.length; i++)
      wndprop += "," + gen_popup.arguments[i];

    window.open(url, 'gen_popup', wndprop);
  }


// gen_redirect
// Redirect to another page or site
  function gen_redirect(url)
  {
    self.location.href = url;
  }


// Element utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////

// gen_element
// Returns the reference to an element
  function gen_element(element_id)
  {
    if( document.getElementById )
      return document.getElementById(element_id);
    if( document.all )
      return document.all[element_id];

    return null;
  }
  
  
// gen_elements_by_name
// Returns an array of elements
  function gen_elements_by_name(element_name)
  {
    if( document.getElementsByName )
      return document.getElementsByName(element_name);

    return null;
  }
  
  
// gen_element_by_name
// Returns the first of the elements
  function gen_element_by_name(element_name)
  {
    if( document.getElementsByName )
    {
      var array = document.getElementsByName(element_name);
      if( array.length > 0 )
        return array[0];
      else
        return null;
    }

    return null;
  }
  
  
// gen_elements_by_tagname
// Returns an array of elements
  function gen_elements_by_tagname(root, tagname)
  {
    var element_array = new Array();
    var index = 0;    
    
    if( root.length == null )
      root = root.childNodes;
      
    tagname = tagname.toUpperCase();
    
    for(i = 0; i < root.length; i++)
    {
      if( root[i].tagName == tagname )      
        element_array[index++] = root[i];     
    }

    return element_array;
  }
  
  
// gen_element_by_tagname
// Returns the first of the elements
  function gen_element_by_tagname(root, tagname)
  {
    if( root.length == null )
      root = root.childNodes;
      
    tagname = tagname.toUpperCase();
    
    for(i = 0; i < root.length; i++)
    {
      if( root[i].tagName == tagname )      
        return root[i];     
    }
    
    return null;
  }  


// gen_elements_by_class
// Returns an array of elements
  function gen_elements_by_class(root, classname, recursive)
  {
    var element_array = new Array();
    var index = 0;   
    
    if( root.length == null )
      root = root.childNodes;

    for(i = 0; i < root.length; i++)
    {
      if( root[i].className == classname )      
        element_array[index++] = root[i];
      
      if( recursive && (root[i].childNodes.length > 0) )
      {
        var subelement_array = gen_elements_by_class(root[i].childNodes, classname, recursive);
        if( subelement_array.length > 0 )
        {
          element_array = element_array.concat(subelement_array);
          index += subelement_array.length;
        }
      }
      
    }

    return element_array;
  }

  
// gen_display
// Sets the display mode style of an element
  function gen_display(element, mode)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(element);

    if( element && element.style )
      element.style.display = mode;
  }


// gen_hide
// Hides an element
  function gen_hide(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(element);

    if( element && element.style )
      element.style.visibility = "hidden";
    else if( element && element.visibility )
      element.visibility = "hide";
  }


// gen_show
// Shows an element
  function gen_show(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(element); 

    if( element && element.style )
      element.style.visibility = "visible";
    else if( element && element.visibility )
      element.visibility = "show";
  }


// gen_root_element
// Returns the reference to the root element
  function gen_root_element(element_id)
  {
    if( document.all )
      return document.all;
    else
      return document.getElementsByTagName("*");
  }
  
  
// Element attribute utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////  
  
// deleteAttribute
// Deletes an element attribute value
  function deleteAttribute(element, attrName)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(element);
    
    // Add a lock status attribute
    var attr = element.getAttributeNode(attrName);
    if( attr != null )
      element.removeAttributeNode(attr);
  }
  

// getAttribute
// Returns an element attribute value
  function getAttribute(element, attrName)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(element);    
    
    // Return attribute value
    var attr = element.getAttributeNode(attrName);
    if( attr != null )
      return attr.nodeValue;
    else
      return null;
  }
  
  
// setAttribute
// Adds / Updates an element attribute value
  function setAttribute(element, attrName, value)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(element);
    
    // Get existing attribute
    var attr = element.getAttributeNode(attrName);
    
    // Delete existing attribute to solve a bug in IE
    if( (attr != null) && (gen_browser() == "ie") )
    {
      element.removeAttributeNode(attr);
      attr = null;
    }
    
    // Create attribute if doesn't exist
    if( attr == null )
      attr = document.createAttribute(attrName);
      
    // Set attribute value and add/set attribute to element
    attr.nodeValue = value;
    element.setAttributeNode(attr);
  }
  
  
// Element sizing functions
////////////////////////////////////////////////////////////////////////////////////////////////////  

// gen_neighbors_height
// Returns the sum of neighbor elements height
  function gen_neighbors_height(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;
  }
  
  
// gen_neighbors_width
// Returns the sum of neighbor elements width
  function gen_neighbors_width(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;
  }  
  
  
// gen_maximize_height
// Sets an element height to maximum of parents element clientHeight 
// considering neighbor elements height (requires fixed height for all neighbors)
  function gen_maximize_height(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(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";
  }

  
// gen_maximize_width
// Sets an element width to maximum of parents element clientWidth 
// considering neighbor elements width (requires fixed width for all neighbors)
  function gen_maximize_width(element)
  {
    // Validate element parameter
    if( typeof element == "string" )
      element = gen_element(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";    
  }


// Form utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////

// gen_form_action
// Updates the action for a form
  function gen_form_action(form_name, action_url)
  {
    document.forms[form_name].action = action_url;
  }
  
  
// Image utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////

// gen_preload_image
// Preload an image file
  function gen_preload_image(image_url)
  {
    if( image_url == "" )
      return false;
      
    var image = new Image();
    image.src = image_url;
    
    return image != null;
  }


// gen_swap_image
// Swaps an image source
  function gen_swap_image(image, image_url)
  {
    if( image_url == "" )
      return false;
  
    // Validate element parameter
    if( typeof image == "string" )
      image = gen_element(image);       
    
    // Swap image
    image.src = image_url;
    
    return true;
  }
  
  
// gen_swap_image_by_dropdown
// Swaps an image source by selected value of a dropdown list
  function gen_swap_image_by_dropdown(dropdown_id, image_id, image_path)
  {
    var ddl = gen_element(dropdown_id);
    
    for( i = 0; i < ddl.length; ++i )
    if( ddl.options[i].selected == true )
      gen_swap_image(image_id, image_path + ddl.options[i].value);
  }
  

// Mouse utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////
  
// gen_initialize_capture_mouse
// Initializes mouse capturing the reason for to grab mouse position
  function gen_initialize_capture_mouse()
  {    
    // Prepare Netscape v4
    if( gen_browser() == "ns4" )
      document.captureEvents(Event.MOUSEMOVE);
      
    // Setup mouse capture event
    document.onmousemove = gen_capture_mouse_position;
  }
  

// gen_capture_mouse_position
// Mouse capturing event
  function gen_capture_mouse_position(e)
  {
    if( gen_browser() == "ie" )
    {
      // Grab mouse position for IE
      xMousePos = window.event.x + document.body.scrollLeft;
      yMousePos = window.event.y + document.body.scrollTop;
      xMousePosMax = document.body.clientWidth + document.body.scrollLeft;
      yMousePosMax = document.body.clientHeight + document.body.scrollTop;
      //tempX = event.clientX + document.body.scrollLeft
      //tempY = event.clientY + document.body.scrollTop
    } else
    {
      // Grab mouse position for Netscape
      xMousePos = e.pageX;
      yMousePos = e.pageY;
      xMousePosMax = window.innerWidth + window.pageXOffset;
      yMousePosMax = window.innerHeight + window.pageYOffset;
      
      // Catch possible negative values in NS4
      if (xMousePos < 0)
        xMousePos = 0;
      if (yMousePos < 0)
        yMousePos = 0;
    }
    
    return true;
  }


// Window utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////

// gen_window_height
// Returns the inner height of the browser window
  function gen_window_height()
  {
    var _de = document.documentElement;
    return window.innerHeight || self.innerHeight || (_de&&_de.clientHeight) || document.body.clientHeight;
    /*if( window.innerHeight )
      return window.innerHeight;
    else if( document.body && document.body.offsetHeight )
      return document.body.offsetHeight;
    else
      return 0;*/
  }


// gen_window_width
// Returns the inner width of the browser window
  function gen_window_width()
  {
    var _de = document.documentElement;
    return window.innerWidth || self.innerWidth || (_de&&_de.clientWidth) || document.body.clientWidth;  
    /*if( window.innerWidth )
      return window.innerWidth;
    else if( document.body && document.body.offsetWidth )
      return document.body.offsetWidth;
    else
      return 0;*/
  }
  

// gen_window_scroll_height
// Returns the inner height of the browser window including the scrollable area
  function gen_window_scroll_height()
  {
    if( document.body.parentNode.scrollHeight > 0 )
      return document.body.parentNode.scrollHeight;
    if( document.body.scrollHeight > 0 )
      return document.body.scrollHeight;      
    return gen_window_height();
  }


// gen_window_scroll_width
// Returns the inner width of the browser window including the scrollable area
  function gen_window_scroll_width()
  {
    if( document.body.parentNode.scrollWidth > 0 )
      return document.body.parentNode.scrollWidth;
    if( document.body.scrollWidth > 0 )
      return document.body.scrollWidth;      
    return gen_window_width();
  }
  

// gen_window_scroll_top
// Returns the top scroll position
  function gen_window_scroll_top()
  {  
    if( gen_browser() == "ie" )
    {
      if( document.pageYOffset != null )
        return document.pageYOffset;
      else
        return document.body.pageYOffset;
    }
    else
      return document.body.scrollTop;
  }
  

// gen_window_scroll_left
// Returns the left scroll position
  function gen_window_scroll_left()
  {
    if( gen_browser() == "ie" )
    {
      if( document.pageXOffset != null )
        return document.pageXOffset;
      else
        return document.body.pageXOffset;
    }
    else
      return document.body.scrollLeft;
  }
  

// Debug utility functions
////////////////////////////////////////////////////////////////////////////////////////////////////  

// alertArray
// 
  function alertArray(array)
  {  
    var text = "";
    for(n in array)
      text += n + " = " + array[n] + "\r\n";
        
    alert(text);
  }
