/************************************************* LAYER LOADING FUNCTIONS *************************************************/

//function to make layer objects for page items
//takes arg of array of layer names
//layer_array = new Array([lyr name],[nesting array],[parent layer],[child layer],[layer_type],[off_color],[on_color],[roll_color],[link_txt]);
//function to make layer objects for page items
function makeLayerObjs(layer_array) {
	
	var i, crnt_item
	// loop through all layers to be registered
	for (i=0;i<layer_array.length;i++) {
	
		crnt_item = layer_array[i];	//get ref to current layer info array
		layer_objs[crnt_item[0]] = new objStaticLyr (crnt_item[0],crnt_item[1]);	//create layer object
		
		layer_objs[crnt_item[0]].parent_menu = crnt_item[2];	//set parent status (for menuing systems)
		layer_objs[crnt_item[0]].child_menu = crnt_item[3];	//set child status (for menuing systems)
		
		//check menu type, and load events, and set properties accordingly
		if (crnt_item[4] == 'menu_item') {
			layer_objs[crnt_item[0]].off_color = crnt_item[5];	//set layer off color
			layer_objs[crnt_item[0]].on_color = crnt_item[6];	//set layer on color
			layer_objs[crnt_item[0]].roll_color = crnt_item[7];	//set layer roll color
			layer_objs[crnt_item[0]].link_ref = crnt_item[8];	//set href
			
			layer_objs[crnt_item[0]].addEventHandler('onmouseover',link_MouseOver);	//add mouseover event handler
			layer_objs[crnt_item[0]].addEventHandler('onmouseout',link_MouseOut);	//add mouseout event handler	
			layer_objs[crnt_item[0]].addEventHandler('onclick',link_Click);	//add mouseout event handler
		}
		
		layer_objs[crnt_item[0]].action_timeout = null;	//set object action timeout property with default value of null
	
	}
}


/************************************************* MENU ITEM EVENT FUNCTIONS *************************************************/

//function to unload menu item
function unloadMenuItemActive (lyr_obj,pos_x,pos_y) {

	lyr_obj.mouseover = false;	//set mouseover status on layer to false
	lyr_obj.fadeBg('off_active');	//call layer bg fade out
	if (lyr_obj.child_menu != null) layer_objs[lyr_obj.child_menu].hide();
	//if (lyr_obj.child_menu != null) lyr_obj.addEvent ('layer_objs["'+lyr_obj.child_menu+'"].hide()', 'visibility', true)	//switch on child menu
	unloadParentMenu(layer_objs[lyr_obj.node_path[0]],layer_objs[lyr_obj.node_path[0]].parent_menu,pos_x,pos_y);	//pass menu holder to unloadParentMenu function
	
}

//function to unload menu item
function unloadMenuItemPassive (lyr_obj,pos_x,pos_y) {

	lyr_obj.mouseover = false;	//set mouseover status on layer to false
	lyr_obj.fadeBg('off_passive');	//call layer bg fade out
	if (lyr_obj.child_menu != null) layer_objs[lyr_obj.child_menu].hide();
	//if (lyr_obj.child_menu != null) lyr_obj.addEvent ('layer_objs["'+lyr_obj.child_menu+'"].hide()', 'visibility', true)	//switch on child menu
	unloadParentMenu(layer_objs[lyr_obj.node_path[0]],layer_objs[lyr_obj.node_path[0]].parent_menu,pos_x,pos_y);	//pass menu holder to unloadParentMenu function
	
}


//function to load parent item
function loadParentItem (lyr_obj) {
	
	//clear any waiting events (raised from mouse out event)
	if (lyr_obj.action_timeout != null) { 
		window.clearTimeout(lyr_obj.action_timeout);
		lyr_obj.action_timeout = null;
	}
	
	//if not already mouseover then run appropriate functions and set mouseover status to true
	if (!lyr_obj.mouseover) {
		lyr_obj.mouseover = true;	//set mouseover status to true
		if (lyr_obj.parent_menu != null) loadParentItem(layer_objs[lyr_obj.parent_menu]);		//reload parent menu
	}

	//lyr_obj.setBgColor(lyr_obj.on_color);	//set item to fade on
	lyr_obj.fadeBg('on_passive');	//set item to fade on

}

//function to load menu item
function loadMenuItem(lyr_obj) {

	//clear any waiting events (raised from mouse out event)
	if (lyr_obj.action_timeout != null) { 
		window.clearTimeout(lyr_obj.action_timeout);
		lyr_obj.action_timeout = null;
	}

	//if not already mouseover then run appropriate functions and set mouseover status to true
	if (!lyr_obj.mouseover) {
		lyr_obj.mouseover = true;	//set mouseover status to true
		lyr_obj.fadeBg('on');	//set item to fade on
		if (lyr_obj.child_menu != null) layer_objs[lyr_obj.child_menu].show()
		//if (lyr_obj.child_menu != null) lyr_obj.addEvent ('layer_objs["'+lyr_obj.child_menu+'"].show()', 'visibility', true)	//switch on child menu
		if (lyr_obj.parent_menu != null) loadParentItem(layer_objs[lyr_obj.parent_menu]);		//reload parent menu
	}
	
}


//layer mouse over event handler
function link_MouseOver (e, lyr_obj, x_pos, y_pos) {

	loadMenuItem(lyr_obj);	//load menu item
	
	e.CancelBubble;	//cancel event bubbling
	
}

//layer mouse out event handling
function link_MouseOut (e, lyr_obj, x_pos, y_pos) {

	//if any existing actions waiting then clear them
	if (lyr_obj.action_timeout != null) window.clearTimeout(lyr_obj.action_timeout);

	//set timeout for appropriate actions and set mouseover status to false (lets unneccessary calls be ignores)
	lyr_obj.action_timeout = window.setTimeout ('unloadMenuItemActive(layer_objs["'+lyr_obj.id+'"],'+x_pos+','+y_pos+')',20);
	
	//cancel event bubbling
	e.CancelBubble;
}


//layer click
function link_Click (e, lyr_obj) {
	document.location = lyr_obj.link_ref;
}

/********************************** EVENT SIMULATION FUNCTIONS *************************************************************/

//function to get layer absolute position
function getLyrAbsPos(lyr_obj,dimension) {
	
	var dim_type = (dimension == 'x') ? 'getX()' : 'getY()';

	var px_pos = eval('layer_objs["'+lyr_obj.id+'"].' + dim_type);
	
	if (lyr_obj.node_path != null) {
		for (var i=0;i<lyr_obj.node_path.length;i++) {
			px_pos += eval('layer_objs["'+lyr_obj.node_path[i]+'"].' + dim_type);
		}
	}
	//window.alert(dimension + ' - ' +px_pos);
	return px_pos
}

//function to check whether x, y pos is within layer (ie is mouse over layer)
function isMouseOver (lyr_obj, pos_x, pos_y) {
	
	//get x y positions of layer
	var lyr_x = getLyrAbsPos(lyr_obj,'x');
	var lyr_y = getLyrAbsPos(lyr_obj,'y');
	
	var offset = 2;	//offset to avoid overlaps on menuing system on left hand side and top
	
	//window.alert (lyr_obj.id + '\ny: ' + lyr_y + ' < ' +  pos_y  + ' < ' + (lyr_y + lyr_obj.getHeight()));	
	//window.alert (lyr_obj.id + '\nx: ' + lyr_x + ' < ' +  pos_x  + ' < ' + (lyr_x + lyr_obj.getWidth()));
	
	if (((lyr_x + offset) > pos_x) || ((lyr_x + lyr_obj.getWidth()) <= pos_x)) return false;
	else if (((lyr_y + offset) > pos_y) || ((lyr_y + lyr_obj.getHeight()) <= pos_y)) return false;
	
	return true;

}

//function to check whether to unload parent menu
function unloadParentMenu(lyr_obj, parent_ref, pos_x, pos_y) {
	
	//if menu has parent menu
	if (parent_ref != null) {
		//window.alert(isMouseOver (layer_objs[parent_ref], pos_x, pos_y))
		//if mouse position is outside current layer
		if (!isMouseOver (lyr_obj, pos_x, pos_y)) {
			//if mouse position is outside parent item layer, set timeout to unload parent menu item
			if (!isMouseOver (layer_objs[parent_ref], pos_x, pos_y)) layer_objs[parent_ref].action_timeout = window.setTimeout ('unloadMenuItemPassive(layer_objs["'+parent_ref+'"],'+pos_x+','+pos_y+')',5);
		}
		
	}
	
}



