/******************************************************************************
*
*                   INDIGEN SOLUTIONS CODE PROPERTY
*       The present javascript code is property of Indigen Solutions. This
*     code can only be used inside Internet/Intranet web sites located on
*  *web servers*, as the outcome of a licensed Indigen Solutions application
*  only. Any unauthorized use, reverse-engineering, alteration, transmission,
* transformation, facsimile, or copying of any means (electronic or not) is
*     strictly prohibited and will be prosecuted. Removal of the present
*              copyright notice is strictly prohibited
*         Copyright (c) 2004 Indigen Solutions. All Rights Reserved.
*
* Author:     Jérôme CLERICO <jerome.clerico@indigen.com>
* RCS Id      $Id: IMenu12.js,v 1.1.1.1 2005/09/30 16:59:26 indigen Exp $
*
******************************************************************************/

/**
 *
 **/
function IMenu12(id) {
  
  /* Attributes. */

  this.id = id;
  this.ref = IMenu12.instances.length;

  this._imageItems1 = {};

  this._initialItem1id = "";
  this._initialMenu2id = "";

  this._currentItem1 = null;
  this._currentItem1Bis = null;
  this._currentMenu2 = null;
  this._currentItem2 = null;

  this._mouseMoveTime = null;
  this._outTime = null;
  this._outBy = null;

  this._context = {};

  /* Menu construction. */

  this.initImageItem1 = function(item1id, menu2id, selectedUrl, isSelected) {
    var image = document.getElementById(item1id);
    if ( image ) {
      this._imageItems1[item1id] = {
	"item1id"     : item1id,
	"menu2id"     : menu2id,
	"url"         : image.getAttribute("src"),
	"selectedUrl" : selectedUrl
      };
      var thisRef = this;
      var handler = function() {
	thisRef.outItem1(image);
      };
      this._attachEvent(image, "mouseout", handler);
      handler = function() {
	thisRef.overItem1(image, menu2id);
      };
      this._attachEvent(image, "mouseover", handler);
      if ( isSelected ) {
	image.setAttribute("src", selectedUrl);
	this._initialItem1id = item1id;
	this._initialMenu2id = menu2id;
      }
    }
  }
  
  /* Drawing methods. */

  this.drawOverItem1 = function(element) {
    if ( element.nodeName.toLowerCase() == 'img' ) {
      var item1id = element.getAttribute("id");
      if ( item1id && this._imageItems1[item1id]) {
	element.setAttribute("src", this._imageItems1[item1id].selectedUrl);
	return;
      }
    }
    element.style.background = "red";
  };

  this.drawOverItem1Bis = function(element) {
    element.style.background = "red";
  };
  
  this.drawOutItem1 = function(element) {
    if ( element.nodeName.toLowerCase() == 'img' ) {
      var item1id = element.getAttribute("id");
      if ( item1id && this._imageItems1[item1id]) {
	element.setAttribute("src", this._imageItems1[item1id].url);
	return;
      }
    }
    element.style.background = "";
  };

  this.drawMenu2 = function(element) {
    element.style.display = "block";
  };

  this.undrawMenu2 = function(element) {
    element.style.display = "none";      
  };

  this.drawOverItem2 = function(element) {
    element.style.background = "yellow";
  };

  this.drawOutItem2 = function(element) {
    element.style.background = "";
  };

  /* Event management methods. */

  this.overMenu1 = function(element) {
    this._outTime = null;
  };

  this.outMenu1 = function(element) {
    this._outTime = this._getTime();
    this._outBy = "menu1";
  };

  this.overItem1 = function(element, menu2id) {
    if ( this._currentItem1 ) {
      if ( this._currentItem1 == element )
	return;
      else {
	this._currentItem1Bis = element;
	this.drawOverItem1Bis(element);
      }
      var time = this._getTime();
      if ( (time - this._mouseMoveTime) < IMenu12.ITEM1_TIMEOUT ) {
	this._context = {"method" : "overItem1",
			 "element" : element,
			 "menu2id" : menu2id};
	return;
      }
      this.drawOutItem1(this._currentItem1);
    }
    if ( this._currentMenu2 ) {
      if ( this._currentMenu2.getAttribute("id") == menu2id )
	return;
      this.undrawMenu2(this._currentMenu2);
    }
    var menu2 = document.getElementById(menu2id);
    this.drawOverItem1(element);
    this.drawMenu2(menu2);
    this._currentItem1 = element;
    this._currentMenu2 = menu2;
    if ( this._initialItem1id && (this._initialItem1id != element.getAttribute("id")) )
      this.drawOutItem1(document.getElementById(this._initialItem1id));
    if ( this._initialMenu2id && (this._initialMenu2id != menu2id) )
      this.undrawMenu2(document.getElementById(this._initialMenu2id));
  };

  this.outItem1 = function(element) {
    if ( this._currentItem1 == element )
      return;
    this._currentItem1Bis = null;
    this.drawOutItem1(element);
  };

  this.overMenu2 = function() {
    this._outTime = null;
    this._context = {};
  };
  
  this.outMenu2 = function(element) {
    this._outTime = this._getTime();
    this._outBy = "menu2";
  };

  this.overItem2 = function(element) {
    this.drawOverItem2(element);
  };

  this.outItem2 = function(element) {
    this.drawOutItem2(element);
  };

  this.mouseMoveMenu = function(element) {
    this._mouseMoveTime = this._getTime();
    /*
    if ( this._currentItem1Bis && (element != this._currentItem1Bis) )
      this.outItem1(this._currentItem1Bis);
    */
  };

  this.poll = function() {
    if ( this._outTime ) {
      var time = this._getTime();
      var timeout = 0;
      if ( this._outBy == "menu1" )
	timeout = IMenu12.MENU1_TIMEOUT;
      else if ( this._outBy == "menu2" )
	timeout = IMenu12.MENU2_TIMEOUT;
      if ( (time - this._outTime) > timeout ) {
	if ( this._currentItem1 )
	  this.drawOutItem1(this._currentItem1);
	if ( this._currentMenu2 )
	  this.undrawMenu2(this._currentMenu2);
	if ( this._currentItem1Bis )
	  this.drawOutItem1(this._currentItem1Bis);
	this._currentItem1 = null;
	this._currentItem1Bis = null;
	this._currentMenu2 = null;
	this._mouseMoveTime = null;
	this._outTime = null;
	this._outBy = null;
	this._context = {};
	if ( this._initialItem1id )
	  this.drawOverItem1(document.getElementById(this._initialItem1id));
	if ( this._initialMenu2id )
	  this.drawMenu2(document.getElementById(this._initialMenu2id));
      }
    }
    var context = this._context;
    if ( context.method ) {
      this._context = {};
      switch ( context.method ) {
	case "overItem1" :
	  this.overItem1(context.element, context.menu2id);
	  break;
	default :
      }
    }
  };

  /* Private methods. */

  this._getTime = function() {
    return (new Date()).getTime();
  };

  this._getStrRef = function() {
    return "IMenu12.instances[" + this.ref + "]";
  }

  this._attachEvent = function(element, event, handler) {
    if ( document.addEventListener )
      element.addEventListener(event, handler, false);
    else if ( document.attachEvent )
      element.attachEvent("on" + event, handler);
  }

  /* Constructor definition. */

  IMenu12.instances.push(this);
  setInterval(this._getStrRef() + ".poll();", 100);
}

/* Globals and timeouts. */

IMenu12.instances = [];

IMenu12.ITEM1_TIMEOUT = 0;
IMenu12.MENU1_TIMEOUT = 100;
IMenu12.MENU2_TIMEOUT = 100;
