/*
** ypMenuGenerator
**   Dynamically creates slide-out menus from an array of objects
**   Ideally the object array should be defined elsewhere
**   (c) 2005 Jason Frame
*/

var allYpMenus = null;

function createYpMenus(md) {
	
	// Various configuration options
	var menuDir = 'right';
	var originX = 50;
	var originY = 176;
	var menuOffset = 88;
	var menuContainerClass = null;
	var menuContentClass = 'rollover';
	
	var menuWidth = 160;
	var menuHeight = 3;
	var menuItemHeight = 14;
	
	// To automatically position menu objects by actuator
	// Doesn't seem to work on Konqueror - YMMV
	var menuPositionByActuator = true;
	var menuActOffsetX = 121;
	var menuActOffsetY = 1;
	
	// Set to true to keep menus centred on screen
	var menuCentred = true;
	var menuPageWidth = 633;
  
	//
	// End Configuration
	//
	
	allYpMenus = new Array(md.length);
	
	var i;
	for (i=0; i<md.length; i++) {
		
		var menuX = originX, menuY = originY;
		
		var d = md[i].items;
		var inner,outer,newOpt,act;
		
		var fOnMouseOver = '';
		var fOnMouseOut = '';
		var fOnActivate = '';
		var fOnDeactivate = '';
		
		if (!(act = document.getElementById('ypMenuItem' + i)))
			continue;
		
		if (md[i].hoverClass) {
			fOnActivate += "document.getElementById('ypMenuItem" + i + "').className += ' " + md[i].hoverClass + "';";
			fOnDeactivate += "(d = document.getElementById('ypMenuItem" + i + "')).className = d.className.replace('" + md[i].hoverClass + "','');";
		}
		
		if (menuPositionByActuator) {
			var pos = elementPos(act);
			menuX = pos['left'] + menuActOffsetX;
			menuY = pos['top'] + menuActOffsetY;
		}
		
		fOnMouseOver += "ypSlideOutMenu.showMenu('ypMenu" + i + "');";
		fOnMouseOut += "ypSlideOutMenu.hideMenu('ypMenu" + i + "');";
			
		inner = document.createElement('div');
		inner.setAttribute('id','ypMenu' + i + 'Content');
			
		if (menuContentClass)
			inner.className = menuContentClass;
		
		var j;
		var height = menuHeight;
		for (j=0; j<d.length; j++) {
			height += menuItemHeight;
			newOpt = document.createElement('a');
			newOpt.appendChild(document.createTextNode(d[j].cap));
			
			var href = d[j].href;
			if (href.charAt(0) == '/') {
				href = "http://www.scottishrefugeecouncil.org.uk" + href;
			}
			
			newOpt.setAttribute('href',href);
			inner.appendChild(newOpt);
		}
			
		outer = document.createElement('div');
		outer.setAttribute('id','ypMenu' + i + 'Container');
			
		if (menuContainerClass)
			inner.className += (' ' + menuContainerClass);
		
		if (md[i].containerClass)
			inner.className += (' ' + md[i].containerClass);
		
		if (d.length == 0) {
			height = 0;
		}
			
		outer.style.visibility = 'hidden';
		outer.style.top = menuY + 'px';
		outer.style.left = menuX + 'px';
		outer.style.overflow = 'hidden';
		outer.style.zIndex = 10000;
		outer.style.position = 'absolute';
		outer.style.width = menuWidth + 'px';
		outer.style.height = height + 'px';
		outer.style.clip = 'rect(0 ' + menuWidth + ' ' + height + ' 0)';
			
		inner.style.position = 'absolute';
		inner.style.width = menuWidth + 'px';
		inner.style.height = height + 'px';
		inner.style.clip = 'rect(0 ' + menuWidth + ' ' + height + ' 0)';
		

		outer.appendChild(inner);
		document.body.appendChild(outer);
			
		allYpMenus[i] = new ypSlideOutMenu('ypMenu' + i, menuDir, menuX, menuY, menuWidth, height);
			
		if (menuDir == 'left' || menuDir == 'right') {
			menuY += menuOffset;
		} else {
			menuX += menuOffset;
		}
			
		if (menuCentred) {
			if (menuPositionByActuator) {
				fOnActivate += "repositionMenuAct(" + i + "," + menuActOffsetX + "," + menuActOffsetY + ");"; 
			} else {
				fOnActivate += "repositionMenuAbs(allYpMenus[" + i + "]," + menuPageWidth + "," + originX + ");";
			}
		}
				
		if (fOnMouseOver.length > 0) act.onmouseover = new Function(fOnMouseOver);
		if (fOnMouseOut.length > 0) act.onmouseout = new Function(fOnMouseOut);
		if (fOnActivate.length > 0) allYpMenus[i].onactivate = new Function(fOnActivate);
		if (fOnDeactivate.length > 0) allYpMenus[i].ondeactivate = new Function(fOnDeactivate);
	}
}

function jMenu() { this.count = 0; this.items = new Array(); }
jMenu.prototype.addItem = function(i) { this.items[this.count] = i; this.count++; }
jMenuItem = function(c,h) { this.cap = c; this.href = h; }

function elementPos(o) {
	var z = o; var l = 0; var t = 0;
	while (z) {
		l += z.offsetLeft;
		t += z.offsetTop;
		z = z.offsetParent;
	}
	if (navigator.userAgent.indexOf("Mac") != -1 && typeof document.body.leftMargin != "undefined") {
		l += document.body.leftMargin;
		t += document.body.topMargin;
	}
	return {left:l, top:t};
}

// a bit broken...
function repositionMenuAbs(menu,pW,oX) {
	var newLeft;
	var windowWidth = getWindowWidth();
	(windowWidth < pW) ? (newLeft = oX) : (newLeft = (windowWidth / 2) + oX - (pW / 2));
	(menu.container.style) ? (menu.container.style.left = newLeft + 'px') : (menu.container.left = newLeft);
}

function repositionMenuAct(id,offsetX,offsetY) {
	var pos = elementPos(document.getElementById('ypMenuItem' + id));
	var con = document.getElementById('ypMenu' + id + 'Container');
	con.style.left = (pos.left + offsetX) + 'px';
	con.style.top = (pos.top + offsetY) + 'px';
}

function getWindowWidth() {
	return window.innerWidth ? window.innerWidth : document.body.offsetWidth;
}
