function registerDivInOut(div, handlerIn, handlerOut) {
  //alert('register');
  $(div).onmouseover = function(e) {
    //alert($(div).getAttribute('id'));
    // retrieve the event
    if (!e)
      var e = window.event;

    // get the target
    var target = (window.event) ? e.srcElement : e.target;

    // get the source
    var source = (e.relatedTarget) ? e.relatedTarget : e.fromElement;

    // is the source inside our container
    if(isInside($(div), source)) {
      return;
    }

    handlerIn();
  }

  $(div).onmouseout = function(e) {
    // retrieve the event
    if (!e) var e = window.event;
    // get the source
    var source = (window.event) ? e.srcElement : e.target;

    // get the target
    var target = (e.relatedTarget) ? e.relatedTarget : e.toElement;

    // is the tg inside our div
    if(!isInside($(div), target) && isInside($(div), source)) {

      handlerOut();
    }
  }
}

function isInside(container, element) {
  while (element && element != container && element.nodeName != 'BODY')
    element = element.parentNode;
  if(element == container) {
    return true;
  } else {
    return false;
  }
}

function permute(from, to, queue_scope, delay) {
  queue = Effect.Queues.get(queue_scope);
  var size = queue.size();
  queue.each(function(effect) {
    effect.cancel();
  });
  if(size<2)
    Effect.Fade(from, { duration: delay/2, queue: { position: 'end', scope: queue_scope } });
  Effect.Appear(to, { duration: delay/2, queue: { position: 'end', scope: queue_scope } });
}

window.loadScripts = function(javascript) {
  var scripts_filter = /<script[^>]+src="([^">]+)"[^>]*>\s*<\/script>/gi;
  var scripts = new Array();
  if(typeof document.nb_scripts_being_loaded == 'undefined')
    document.nb_scripts_being_loaded = 0;
  
  while( script_infos = scripts_filter.exec(javascript.replace(/\n/g, ''))) {
    scripts.push(script_infos[1]);
  }
  _loadScripts(scripts.reverse());
};

window._loadScripts = function(scripts) {
  //console.log('Pending scripts : '+scripts);
  var url = '';
  if(scripts)
    url = scripts.pop();
  if(url) {
    //console.log('Requesting : '+url);
    
    var script = document.createElement("script");
    script.type = "text/javascript";
    //console.log('a : '+url);
    
    if (script.readyState) {  //IE
      ////console.log('ie : Configuring script '+url);
      script.onreadystatechange = function() {
        //console.log('ie : '+url);
        
        if (this.readyState == "loaded" || this.readyState == "complete") {
          this.onreadystatechange = null;
          document.nb_scripts_being_loaded--;
          //console.log('ie : Download terminates for '+this.src+', '+document.nb_scripts_being_loaded+ ' remaining.');
          _loadScripts(scripts);
        }
      };
    } else {  //Others
    //console.log('!ie : '+url);
    
            script.onload = function() {
              document.nb_scripts_being_loaded--;
              //console.log('!ie : Download terminates for '+this.src+', '+document.nb_scripts_being_loaded+ ' remaining.');
              _loadScripts(scripts);
            };
    }
    //console.log('b : '+url);
    
    script.src = url;
    document.getElementsByTagName("head")[0].appendChild(script);
    document.nb_scripts_being_loaded++;
    //console.log('Download starts for '+script.src+', '+document.nb_scripts_being_loaded+ ' remaining.');
  }
};
/**
 * Event.simulate(@element, eventName[, options]) -> Element
 *
 * - @element: element to fire event on
 * - eventName: name of event to fire (only MouseEvents and HTMLEvents interfaces are supported)
 * - options: optional object to fine-tune event properties - pointerX, pointerY, ctrlKey, etc.
 *
 * $('foo').simulate('click'); // => fires "click" event on an element with id=foo
 *
 **/
(function(){

  var eventMatchers = {
    'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
 'MouseEvents': /^(?:click|mouse(?:down|up|over|move|out))$/
  }
  var defaultOptions = {
    pointerX: 0,
    pointerY: 0,
    button: 0,
    ctrlKey: false,
    altKey: false,
    shiftKey: false,
    metaKey: false,
    bubbles: true,
    cancelable: true
  }

  Event.simulate = function(element, eventName) {

    var options = Object.extend(defaultOptions, arguments[2] || { });
    var oEvent, eventType = null;

    element = $(element);

    for (var name in eventMatchers) {
      if (eventMatchers[name].test(eventName)) { eventType = name; break; }
    }

    if (!eventType)
      throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported');

    if (document.createEvent) {
      oEvent = document.createEvent(eventType);
      if (eventType == 'HTMLEvents') {
        oEvent.initEvent(eventName, options.bubbles, options.cancelable);
      }
      else {
        oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView,
                              options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
                              options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element);
      }
      element.dispatchEvent(oEvent);
    }
    else {
      options.clientX = options.pointerX;
      options.clientY = options.pointerY;
      oEvent = Object.extend(document.createEventObject(), options);
      element.fireEvent('on' + eventName, oEvent);
    }

    return element;
  }

  Element.addMethods({ simulate: Event.simulate });
})()
