var timeout	= 100;
var close_timer = 0;

function insert_left_right_spans(element) {
  var span_left = document.createElement('span');
  Element.addClassName(span_left, 'left');
  
  var span_right = document.createElement('span');
  Element.addClassName(span_right, 'right');
  span_left.appendChild(span_right);
  
  while (element.childNodes.length > 0) {
    span_right.appendChild(element.firstChild);
  }
  
  element.appendChild(span_left);
}
function insert_top_bottom_divs(element) {
  var div_top = document.createElement('div');
  Element.addClassName(div_top, 'top');
  
  var div_bottom = document.createElement('div');
  Element.addClassName(div_bottom, 'bottom');
  div_top.appendChild(div_bottom);
  
  while (element.childNodes.length > 0) {
    div_bottom.appendChild(element.firstChild);
  }
  
  element.appendChild(div_top);
}
function insert_left_right_divs(element) {
  element = $(element);
  var div_left = document.createElement('div');
  Element.addClassName(div_left, 'left');
  
  var div_right = document.createElement('div');
  Element.addClassName(div_right, 'right');
  div_left.appendChild(div_right);
  
  while (element.childNodes.length > 0) {
    div_right.appendChild(element.firstChild);
  }
  
  element.appendChild(div_left);
}

var currently_open_menu = null;
document.close_currently_open_menu_handler = function(event) {
  // ignore clicks in scroll bars
  if (event.target.tagName == 'HTML') return;
  if (currently_open_menu && !Element.descendantOf(event.target, currently_open_menu)) {
    close_menu(event, currently_open_menu);
  }
}
// window.place_currently_open_menu_handler = function(event) {
//   if (currently_open_menu) {
//     place_menu(currently_open_menu);
//   }
// }

function make_menu(menu) {
  var menu_options = Object.extend({
    align: 'left'
  }, arguments[1] || { });

  menu = $(menu);
  menu.menu_options = menu_options;
  
  // make menu title from first child
  var menu_title = menu.firstChild;
  while (menu_title.nodeType == 3) menu_title = menu_title.nextSibling;
  menu_title.addClassName('menu_title');
  
  // insert toggle menu button after the menu title
  var toggle_menu_button = document.createElement('a');
  Element.addClassName(toggle_menu_button, 'toggle_menu_button');
  menu.insertBefore(toggle_menu_button, menu_title);
  menu.insertBefore(menu_title, toggle_menu_button);


  menu.observe("mouseover", function(event) {
    open_menu(event, menu);
  });
  menu.observe("mouseout", function(event) {
   close_menu_timer(event, menu);
  });
  
  // add sub_menu_title elements before sub menus
  var items = $(menu.getElementsByTagName('ul').item(0));
  if (items) {
    var sub_menus = $A(items.getElementsByTagName('ul'));

    sub_menus.each(function(sub_menu) {
      var sub_menu_title = document.createElement('span');
      Element.addClassName(sub_menu_title, 'sub_menu_title');
      sub_menu_title.appendChild(sub_menu.previousSibling)
      sub_menu.parentNode.insertBefore(sub_menu_title, sub_menu);
    })


    // disabled lis with a single text element
    var menu_items = $A(items.getElementsByTagName('li'));

    menu_items.each(function(menu_item) {
		
      if (menu_item.childNodes.length == 1 && menu_item.firstChild.nodeType == 3) {
        var disabled_span = document.createElement('span');
        Element.addClassName(disabled_span, 'disabled');
        disabled_span.appendChild(menu_item.firstChild);
        menu_item.appendChild(disabled_span);
      }
    });
  }
  
 
/*  
  if (!menu.hasClassName('selected')) {
    toggle_menu_button.observe("mouseover", function(event) { menu.addClassName('hover'); }, false);
    toggle_menu_button.observe("mouseout", function(event) { menu.removeClassName('hover'); }, false);
    menu_title.observe("mouseover", function(event) { menu.addClassName('hover'); }, false);
    menu_title.observe("mouseout", function(event) { menu.removeClassName('hover'); }, false);
  } else {
    menu_title.observe("mouseover", function(event) { menu.addClassName('selected_hover'); }, false);
    menu_title.observe("mouseout", function(event) { menu.removeClassName('selected_hover'); }, false);
  }
*/

}
function toggle_menu(event, menu) {
  menu = $(menu);
  if (menu.hasClassName('open')) {
    close_menu(event, menu);
  } else {
    open_menu(event, menu);
  }
}
function close_menu(event, menu) {
  menu = $(menu);
  var items = $(menu.getElementsByTagName('ul').item(0));
  var toggle_menu_button = menu.down('.toggle_menu_button', 0);

  menu.removeClassName('open');
  toggle_menu_button.removeClassName('open');

  items.fade({duration: 0.15});
  currently_open_menu = null;

  document.stopObserving('mousedown', document.close_currently_open_menu_handler);
  // Event.stopObserving(window, 'resize', window.place_currently_open_menu_handler);
}
function open_menu(event, menu) {

  cancel_close_timer();	
  if(currently_open_menu && currently_open_menu != menu){close_menu(event, currently_open_menu);}	
  if(!currently_open_menu || currently_open_menu != menu)
  {
	  menu = $(menu);
  
	  //if (currently_open_menu) close_menu(event, currently_open_menu);
  
	  var items = $(menu.getElementsByTagName('ul').item(0));
	  var toggle_menu_button = menu.down('.toggle_menu_button', 0);
	  var menu_title = menu.firstChild;

	  // prepare menu positionning
	  // - make it absolute
	  Position.absolutize(items);
	  // - avoid some scrollbar jig
	  items.style.top = '0';
	  items.style.left = '0';
	  // - display it
	  items.style.display = 'block';

	  // so that items.getWidth can be computed, and Position.clone doesn't make a mess
	  items.style.left = '';  // prevent some weird IE bug on sub elements width
	  items.style.top = '';  // prevent some weird IE bug on sub elements width
	  items.style.width = '';
	  items.style.height = '';

	  // IE headache
	  if (Prototype.Browser.IE) {
	    var target_width = items.getWidth()+'px';
	    $A(items.getElementsByTagName('*')).each(function(element) {
	      if (element.tagName != "A") {
	        element.style.width = target_width;
	      }
	    });
	  }
  
	  // place menu
	  place_menu(menu);
  
	  // update elements' classes
	  menu.addClassName('open');
	  toggle_menu_button.addClassName('open');
  
	  // OK, the menu is open now
	  currently_open_menu = menu;
  
	  // Don't forget to observe clicks that should close the menu
	  document.observe('mousedown', document.close_currently_open_menu_handler);
	  // And to track window resizing in order to move the menu accordingly
	  // Event.observe(window, 'resize', window.place_currently_open_menu_handler);
  }
}

function place_menu(menu)
{
  menu = $(menu);
  
  var items = $(menu.getElementsByTagName('ul').item(0));
  var toggle_menu_button = menu.down('.toggle_menu_button', 0);
  var menu_title = menu.firstChild;

  Position.clone(
    menu,
    items, {
    setWidth: false,
    setHeight: false,
    offsetTop: toggle_menu_button.getHeight()+1})
  
  if (menu.menu_options.align == 'right') {
    items.style.left = null;
    items.style.right = (document.body.offsetWidth - menu.viewportOffset()[0] - menu.getWidth())+'px';
  }
}

function make_bar(bar)
{
  // add sub_menu_title elements before sub menus
  var items = $(bar.getElementsByTagName('ul').item(0));
  if (items) {
    var sub_menus = $A(items.getElementsByTagName('ul'));
    sub_menus.each(function(sub_menu) {
      var sub_menu_title = document.createElement('span');
      Element.addClassName(sub_menu_title, 'sub_menu_title');
      sub_menu_title.appendChild(sub_menu.previousSibling)
      sub_menu.parentNode.insertBefore(sub_menu_title, sub_menu);
    })

    // disabled lis with a single text element
    var menu_items = $A(items.getElementsByTagName('li'));
    menu_items.each(function(menu_item) {
      if (menu_item.childNodes.length == 1 && menu_item.firstChild.nodeType == 3) {
        var disabled_span = document.createElement('span');
        Element.addClassName(disabled_span, 'disabled');
        disabled_span.appendChild(menu_item.firstChild);
        menu_item.appendChild(disabled_span);
      }
    });
  }
}

function on_dom_loaded() {
  // Replace <toto>titi</toto> by <toto><span class="left"><span class="right">titi</span></span></toto> for some elements
  $$('.menu_bar').each(function(element) {
    Element.cleanWhitespace(element);
  });
  
  $$('.menu_bar > li > a').each(function(element) {
    insert_left_right_spans(element);
    
    if (element.parentNode.getElementsByTagName('ul').length > 0) {
      var menu_options = { align: 'left' }
      var menu_bar = element.up('.menu_bar', 0);
      if (menu_bar && menu_bar.hasClassName('right_aligned_menu_bar')) {
        menu_options.align = 'right';
      }
      make_menu(element.parentNode, menu_options);
    } else {
      element.addClassName('pill');
    }
  });

  $$('#left_bar .bar').each(function(element) {
    insert_top_bottom_divs(element);
    make_bar(element);
  });
  
  $$('#right_bar .bar').each(function(element) {
    insert_top_bottom_divs(element);
    make_bar(element);
  });
  
  var left_bar = $('left_bar');
  if (left_bar) {
    Element.cleanWhitespace(left_bar);
    var bar = left_bar.down('.bar', 0);
    if (bar && !bar.previousSibling) bar.addClassName('first_bar');
  }
  
  var right_bar = $('right_bar');
  if (right_bar) {
    Element.cleanWhitespace(right_bar);
    var bar = right_bar.down('.bar', 0);
    if (bar) bar.addClassName('first_bar');
  }
  
  insert_left_right_divs('main');
}

// Preload inspired from http://weston.ruter.net/projects/pre-onload/

//DOM Level 2 compliant browsers with DOMContentLoaded (i.e. Mozilla, Opera)
if(document.addEventListener){
	document.addEventListener("DOMContentLoaded", function(e){
		on_dom_loaded();
	}, false);
}

/*@cc_on @*/
/*@if (@_win32)

//MSIE DOMContentLoaded hack: http://dean.edwards.name/weblog/2005/09/busted/
document.write("<script id=__ie_onload defer src='//:'><\/script>"); //src value from jQuery
var script = document.getElementById("__ie_onload");
script.onreadystatechange = function() {
	if (this.readyState == "complete") {
		on_dom_loaded();
	}
};

// MSIE DOMContentLoaded alternative hack (required when no external images to load): http://dean.edwards.name/weblog/2005/09/busted2/
/* GB document.getElementsByTagName('*')[0].addBehavior('/javascripts/videomark.htc'); */

/*@end @*/

/*
Useless when Safari is recent
TODO : check Safari version

if (/WebKit/i.test(navigator.userAgent)) { // sniff
	var _dom_loading_timer = setInterval(function() {
		if (/loaded|complete/.test(document.readyState)) {
			clearInterval(_dom_loading_timer);
			on_dom_loaded();
		}
	}, 10);
}
*/


// go close timer
function close_menu_timer(event, menu)
{
	if (Prototype.Browser.IE) {
		close_timer = window.setTimeout(
			function close_menu() {
			  menu = $(menu);
			  var items = $(menu.getElementsByTagName('ul').item(0));
			  var toggle_menu_button = menu.down('.toggle_menu_button', 0);

			  menu.removeClassName('open');
			  toggle_menu_button.removeClassName('open');

			  items.fade({duration: 0.15});
			  currently_open_menu = null;

			  document.stopObserving('mousedown', document.close_currently_open_menu_handler);
			  // Event.stopObserving(window, 'resize', window.place_currently_open_menu_handler);
			}, timeout);
	}
	else {
		close_timer = window.setTimeout(close_menu, timeout, event, menu);	
	}
}

// cancel close timer
function cancel_close_timer()
{
	if(close_timer)
	{
		window.clearTimeout(close_timer);
		close_timer = null;
	}
}




function show_links(args) {

	args.each(function(element) {
	    element = document.getElementById(element)
		if (element)
		{
	    	element.style.display = '';
		}
	  });

}

function hide_links(args) {

	args.each(function(element) {
	    element = document.getElementById(element)
		if (element)
		{
			element.style.display = 'none';
		}
	  });

}

function change_opacity(args) {
	
	var opacity_value = args[0];
	args.shift();
	args.each(function(element) {
	    element = document.getElementById(element)
		if (element)
		{
			if (Prototype.Browser.IE) {
				element.filters.alpha.opacity = opacity_value*100;
			}
			else {
				element.style.opacity = opacity_value;
			}
		}
	  });

}