/* Version info: 20061020 rodrigo.araujo@inteliware.net */

/* Defaults */
var menu_padding = '6px';
var menu_trigger = 250;
var menu_itemclass = undefined;
var menu_boxclass = undefined;
var menu_outerboxclass = undefined;
var menu_actclass = undefined;
var menu_divider = undefined;
var menu_sepcolor = "#808080";
var menu_sepheight = "1px";
var menu_sepmargin = "2px 0px";
var menu_container_offset = undefined;
var menu_container_hoffset = undefined;
var menu_container_voffset = undefined;
var menu_subimg = "submenu.gif";
var menu_subimgsel = "submenusel.gif";
var menu_subimg_padleft = 5;
var menu_subimg_padright = 0;
var menu_subimg_width = false;
var menu_subimg_height = false;
var menu_imgfix = true;
var menu_imgpath = '.';
var menu_width = undefined;
var menu_height = undefined;
var menu_align = 'left';
var menu_valign = 'middle';
var menu_expand = false;
/* End Defaults */

var menucount = 1;
var level = 0;
var inside = false;
var active = new Array();
var button = undefined;
var id = undefined;
var actclass = undefined;
var cursorchange = undefined;
var restimage = undefined;
var img_id = undefined;
var preloaders = new Array;
var imgwidth = undefined;
var menu_zindex = 1000;

/* Test for box-sizing stylesheet property */
var boxsiz = document.createElement("A").style.boxSizing == undefined ? '' : ' box-sizing: border-box;';

/* Helper functions (not methods) */
function default_m(v, vdefault) {
  return v == undefined ? vdefault : v;
}

function classtext_m(theclass, defclass) {
  var renderclass = default_m(theclass, defclass);
  return renderclass ? ' class="'+renderclass+'"' : '';
}

function writetag_m(tag, content, attributes) {
  document.write('<'+tag + (attributes ? ' ' : '') +'>' + content + '</'+tag+'>')
}

function subimg_fix(preloader, preloading) {
  obj = document.getElementById(preloader.img_id_to_change);
  if (obj) {
    obj.style.paddingLeft = preloader.width+'px';
  }
  else if (preloading) {
    window.onload = body_subimg_fix;
  }
}

function body_subimg_fix() {
  for (i = 0; i < preloaders.length; i++)
    subimg_fix(preloaders[i], false);
}

/* JS classes and methods */
/* MenuItem constructor */
function MenuItem(caption, href, itemclass, width, height, align, valign) {
  this.caption = caption;
  this.href = href;
  this.itemclass = itemclass;
  this.width = width;
  this.height = height;
  this.align = align;
  this.valign = valign;
  /* Internal */
  this.isMenuComponent = true;
  this.isMenuItem = true;
  /* Methods */
  this.render = renderItem;
  this.renderRow = renderRow;
  this.getStyle = getStyle;
}

/* MenuItem.render() */
function renderItem() {
  document.writeln('<a href="'+this.href+'"'+classtext_m(this.itemclass, menu_itemclass)+' style="'+this.getStyle()+'" onmouseout="menu_mouse_out_m(event,this);">'+this.caption+'</a>');
}

/* Menu*.renderRow() */
function renderRow() {
  if (this.isMenu) {
    this.submenu = true;
    this.cascade = true;
	}
  document.writeln('<tr><td>');
  this.render();
  document.writeln('</td></tr>');
}

/* MenuItem.getStyle() */
function getStyle() {
  var style = '-moz-box-sizing: border-box;'+boxsiz+' display: block; white-space: nowrap; position: relative; z-index: '+menu_zindex+';';
  var width = default_m(this.width, menu_width);
  if (width) {
    style += 'width:'+width+';';
  }
  style += 'text-align:'+default_m(this.align, menu_align)+';';
  var height = default_m(this.height, menu_height);
  if (height) {
    style += 'height:'+height+';';
    if (default_m(this.valign, menu_valign) == "middle") {
      /* Vertical centering using CSS although limited to 1 line of text */
      style += 'line-height:'+default_m(this.height, menu_height)+';';
    }
    /* default in CSS is to vertical align at top, bottom is currently unsupported */
  }
  return style;
}

/* MenuSep constructor */
function MenuSep(color, height, margin) {
  this.color = color;
  this.height = height;
  this.margin = margin;
  this.content = '';
  /* Internal */
  this.isMenuComponent = true;
  this.isMenuSep = true;
  /* Methods */
  this.render = renderSep;
  this.renderRow = renderRow;
}

/* MenuSep.render() */
function renderSep() {
  var margin = default_m(this.margin, menu_sepmargin);
  margincode = margin ? 'margin: '+margin+';' : '';
  var color = default_m(this.color, menu_sepcolor);
  var colorcode = color ? 'background-color: '+color+';' : '';
  var height = default_m(this.height, menu_sepheight);
  var heightcode = height ? 'height: '+height+';' : '';
  document.write('<table width="100%" cellspacing="0" cellpadding="0" style="'+margincode+'">');
  document.write('<tr><td style="'+colorcode+heightcode+'">');
  document.write(this.content);
  document.writeln('</td></tr></table>');
}

/* Menu constructor */
function Menu(head, items, boxclass, actclass, subimg, subimgsel, trigger, divider, padding, outerboxclass) {
  this.head = head;
  this.items = items;
  this.boxclass = boxclass;
  this.outerboxclass = outerboxclass;
  this.actclass = actclass;
  this.subimg = subimg;
  this.subimgsel = subimgsel;
  this.trigger = trigger;
  this.divider = divider;
  this.padding = padding;
  this.cascade = false;
	this.container_offset = undefined;
	this.container_hoffset = undefined;
	this.container_voffset = undefined;
	this.expand = undefined;
  /* Internal */
  this.submenu = false;
  this.isMenuComponent = true;
  this.isMenu = true;
  /* Methods */
  this.render = renderMenu;
  this.renderRow = renderRow;
  this.renderContainer = renderMenuContainer;
}

/* Menu.render() */
function renderMenu() {
  this.index = menucount++;
  var img_col = '', img_idarg = '', img_altarg = '';
  var subimg = default_m(this.subimg, menu_subimg);
  if (this.cascade && subimg) {
    var img_id = 'menuimg_'+this.index;
    var preloader = new Image;
    preloader.img_id_to_change = img_id;
    if (default_m(this.imgfix, menu_imgfix)) {
      preloader.onload = function(){subimg_fix(this, true);}
    }
    preloader.src = menu_imgpath+'/'+subimg;
    img_idarg = ",'"+img_id+"'";
    img_dimensions = '';
    img_width = default_m(this.subimg_width, menu_subimg_width);
    if (img_width)
      img_dimensions += ' width="'+img_width+'"';
    img_height = default_m(this.subimg_width, menu_subimg_height);
    if (img_height)
      img_dimensions += ' height="'+img_height+'"';
    img_col = '<td align="right" style="padding-left: '+default_m(this.subimg_padleft, menu_subimg_padleft)+'px;padding-right: '+default_m(this.subimg_padright, menu_subimg_padright)+'px;"><img src="'+preloader.src+'" id=\"'+img_id+'\"'+img_dimensions+' /></td>';
    preloaders.push(preloader);
    var subimgsel = default_m(this.subimgsel, menu_subimgsel);
    if (subimgsel) {
      var preloader1 = new Image;
      preloader1.src = menu_imgpath+'/'+subimgsel;
      img_altarg = ",'"+preloader1.src+"'";
      preloaders.push(preloader1);
    }
  }
  var tag;
  var tagattr;
  var arrowstyle;
  var curschange = 'undefined';
  if (this.head.href) {
    tag = 'a';
    tagattr = ' href="'+this.head.href+'"'
    arrowstyle = '';
  }
  else {
    tag = 'div';
    tagattr = '';
    if (this.submenu) {
      arrowstyle = ' cursor: default;';
    }
    else {
      arrowstyle = ' cursor: pointer';
      curschange = "'default'";
    }
  }
  var classchange = default_m(this.actclass, menu_actclass);
  if (classchange)
    classchange = "'"+classchange+"'";
  if (this.cascade)
    this.renderContainer('float: right; ');
  document.writeln('<div style="height: 100%;" onmouseover="menu_select_m(event,this,\'menubutton_'+this.index+'\',\'menu_'+this.index+'\',\''+default_m(this.trigger, menu_trigger)+'\','+classchange+','+curschange+img_idarg+img_altarg+');" onmouseout="menu_mouse_out_m(event,this);">');
  document.writeln('<'+tag+tagattr+classtext_m(this.head.itemclass, menu_itemclass)+' id="menubutton_'+this.index+'" style="'+this.head.getStyle()+arrowstyle+';"><table width="100%" cellspacing="0" cellpadding="0" border="0"><tr valign="middle"><td nowrap="nowrap">'+this.head.caption+'</td>'+img_col+'</tr></table></'+tag+'>');
	document.writeln('</div>');
	if (!this.cascade)
    this.renderContainer('');
}

/* Menu.renderContainer() */
function renderMenuContainer(floatstyle) {
	menu_zindex++;
  var expand = default_m(this.expand, menu_expand);
  document.writeln('<div id="menu_'+this.index+'" style="'+floatstyle+'visibility: hidden;'+(expand ? ' z-index: '+menu_zindex+'; position: relative;' : '')+'"'+classtext_m(this.outerboxclass, menu_outerboxclass)+' onmouseout="menu_mouse_out_m(event,this);">');
	var hoffset = default_m(default_m(this.container_hoffset, menu_container_hoffset), default_m(this.container_offset, menu_container_offset));
	hoffset_code = hoffset ? ' margin-left: '+hoffset+';' : '';
	var voffset = default_m(this.container_voffset, menu_container_voffset);
	voffset_code = voffset ? ' margin-top: '+voffset+';' : '';
	document.writeln('<div style="z-index: '+menu_zindex+'; position: absolute; padding: '+default_m(this.padding, menu_padding)+';'+hoffset_code+voffset_code+'"'+classtext_m(this.boxclass, menu_boxclass)+'>');
	document.writeln('<table cellspacing="0" cellpadding="0" border="0"'+(expand ? ' width="100%' : '')+'">');
  if (this.items.isMenuComponent) {
    this.items.renderRow();
  }
  else if (this.items.length) {
    this.items[0].renderRow();
    if (this.items.length > 1) {
      var divider = default_m(this.divider, menu_divider);
      var i = 1;
      do {
        if (divider) {
          divider.renderRow();
        }
        this.items[i++].renderRow();
      } while (i < this.items.length);
    }
  }
  document.writeln('</table></div></div>');
	menu_zindex--;
}

/* MenuGroup constructor */
function MenuGroup(items) {
	if (items.length)
		this.items = items;
	else
		this.items = new Array(items);
	/* Methods */
	this.set = MenuGroupSet;
}

/* MenuGroup.set() */
function MenuGroupSet(prop, val) {
	for (i = 0; i < this.items.length; i++) {
		eval('this.items[i].'+prop+'=val');
	}
}

/* ActiveMenu constructor */
function ActiveMenu(button, img_id, subimg, container, oldclass, cursor) {
  this.button = button;
	this.img_id = img_id;
  this.subimg = subimg;
  this.container = container;
  this.oldclass = oldclass;
  this.cursor = cursor;
}

/* Handling functions and related ones */
function menu_select1_m() {
  if (inside) {
    var cursor;
    if (cursorchange) {
      cursor = button.style.cursor;
      button.style.cursor = cursorchange;
    }
    else
      cursor = undefined;
    var obj = document.getElementById(id);
    if (obj && obj.style.visibility != "visible") {
      var curclass;
      if (actclass) {
        curclass = button.className;
        button.className = actclass;
      }
      else
        curclass = undefined;
      obj.style.visibility = "visible";
      active.push(new ActiveMenu(button, img_id, restimage, obj, curclass, cursor));
    }
  }
}

function menu_select_m(e,handler, sbutton, sid, trigtime, sactclass, scursorchange, simg_id, altimage) {
  if (!e) var e = window.event;	if (bubbling(e, handler)) return;
  button = document.getElementById(sbutton);
  id = sid;
  actclass = sactclass;
  cursorchange = scursorchange;
	img_id = simg_id;
  if (altimage) {
		img = document.getElementById(img_id);
    restimage = img.src;
    img.src = altimage;
  }
  else
    restimage = undefined;
  if (!trigtime || inside)
    menu_select1_m();
  else {
    inside = true;
    setTimeout(menu_select1_m, trigtime);
  }
}

function setoutside_m(target) {
  if (!target || target.id.substr(0, 10) != "menubutton")
    inside = false;
}

function restoreimg_m(ri, target) {
  if (ri)
    target.style.backgroundImage = 'url("'+ri+'")';
}

function bubbling(e, handler) {
  if (!e) var e = window.event;
  var reltg = (e.relatedTarget) ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement;
	while (reltg && reltg != handler) reltg = reltg.parentNode;
	if (reltg == handler)
		return true;
	return false;
}

function menu_mouse_out_m(e, handler) {
  if (!e) var e = window.event;	if (bubbling(e, handler)) return;
  var thistg = (window.event) ? e.srcElement : e.target;
  if (active.length > 0) {
  	var relTarg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
		if (relTarg) {
			for (i=active.length-1; i >=0; i--) {
				var tg1 = active[i].container;
				var tg2 = active[i].button;
				var reltg = relTarg;
				do {
					if (reltg == tg1 || reltg == tg2) {
						menu_close_all_m(i+1);
						return;
					}
				} while ((reltg = reltg.parentNode));
			}
			setoutside_m(relTarg);
		}
    menu_close_all_m(0);
  }
  else {
    setoutside_m(relTarg);
  }
}

function menu_close_all_m(tolevel) {
  for (i=tolevel; i < active.length; i++) {
    var menu = active.pop();
    menu.container.style.visibility = "hidden";
    var button = menu.button;
    if (menu.oldclass)
      button.className = menu.oldclass;
    if (menu.subimg)
      document.getElementById(menu.img_id).src = menu.subimg;
    if (menu.cursor)
      button.style.cursor = menu.cursor;
  }
  level = tolevel;
}
