/*********************************************
Popup AJAX Menu
v. 02

Server output should be formatted like "<a href=""></a> Delimited by "\n"
Change Log:
	- Fixes the unnecessary 1 second disapperance, because of the timer
*********************************************/

var menu_cache = new Array();
var baseURL = "/sidebarq.php?sidebarq_name=";

var scrollOffset = 10; // no of items before scroll buttons appears
var scrollSpeed = 70; // in milliseconds
var scrollPix = 20; // # of pixels to move when scrolling

var popupHideInterval = 1000;

// html snippets to be placed on the popup scroller, for CSS, check .popup_mover{})
var ipop_up_html = "<b>Move Up</b>"; 
var ipop_down_html = "<b>Move Down</b>";

var mH; // IMPT! menu hider flag

var page_loaded = false;

function createRequestObject() {
	var xmlhttp;
	/*@cc_on
	@if (@_jscript_version>= 5)
			try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			} catch (e) {
					try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}
					catch (E) {xmlhttp = false;}
			}
	@else
		xmlhttp = false;
	@end @*/
	if (!xmlhttp && typeof XMLHttpRequest != "undefined") {
			try {xmlhttp = new XMLHttpRequest();} catch (e) {xmlhttp = false;}
	}
	return xmlhttp;
}

function getElementsByClass(searchClass,node,tag) {
	var classElements = new Array();
	if ( node == null )
		node = document;
	if ( tag == null )
		tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	var pattern = new RegExp('(^|\\s)'+searchClass+'(\\s|$)');
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}

function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	} else if (obj.x)
		curleft += obj.x;
		
	return curleft;
}

function findPosY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	} else if (obj.y)
		curtop += obj.y;
	return curtop;
}

function showMenu(srcElem,menu_key) {
	var strMenu = menu_cache[menu_key];
	var strC = strMenu.split("\n");
	var pScroll = true;
	
	if(strC.length <= scrollOffset) {
		pScroll = false;
	}
	
	var objX = findPosX(srcElem); //var objX = findPosX(obj)+10;
	var objY = findPosY(srcElem); //var objY = findPosY(obj)+30;

	var ipop = document.createElement("div");
	ipop.setAttribute("id","menu_popup_"+menu_key);
	ipop.className = "popup_menu";
	ipop.style.display = 'block';
	ipop.style.position = 'absolute';
	ipop.style.left = (objX+srcElem.clientWidth)+'px';
	ipop.style.top = (objY)+'px';

	if(pScroll == true) {
		var ipop_moveup = document.createElement("a");
		ipop_moveup.innerHTML = ipop_up_html;
		ipop_moveup.className = "popup_mover";
		ipop_moveup.href = "javascript:void(0);";
	
		var dU;
		ipop_moveup.onmouseover = function () {
			dU = window.setInterval(function () {
				ipop_links.scrollTop = (ipop_links.scrollTop - scrollPix);
			}, scrollSpeed);
		}
	
		ipop_moveup.onmouseout = function () {
			clearInterval(dU);
		}
			
		ipop.appendChild(ipop_moveup);

	} 

	// the menu list area
	var ipop_links = document.createElement("div");
	ipop_links.setAttribute("id","menu_popup_links_"+menu_key);
	ipop_links.innerHTML = strMenu;
	ipop_links.className = "popup_menu_links";
	ipop.appendChild(ipop_links);
	
	if(pScroll == true) {
		var ipop_movedown = document.createElement("a");
		ipop_movedown.innerHTML = ipop_down_html;
		ipop_movedown.className = "popup_mover";
		ipop_movedown.href = "javascript:void(0);";
	
		var dM;
		ipop_movedown.onmouseover = function () {
			dM = window.setInterval(function () {
				ipop_links.scrollTop = (ipop_links.scrollTop + scrollPix);
			}, scrollSpeed);
		}
	
		ipop_movedown.onmouseout = function () {
			clearInterval(dM);
		}
	
		ipop.appendChild(ipop_movedown);	
	}

	ipop.onmousemove = function() {
		clearInterval(mH);
	}
	
	ipop.onmouseover = function() {
		clearInterval(mH);
	}

	ipop.onmouseout = function() {
		menuHider();
	}
	
	document.getElementsByTagName("body")[0].appendChild(ipop);
}

function hideMenus() {
	var popups = getElementsByClass('popup_menu');
	if(popups.length > 0){
		for(var i=0;i<=popups.length - 1;i++) {
			popups[i].style.display = 'none';
		}
	}
}

function menuHider() {
	mH = window.setInterval(function () {
		hideMenus();
		clearInterval(mH);
	}, popupHideInterval);
}

function fetchMenu(srcElem,menu_key) {
	
	if(page_loaded == false) return;
	
	clearInterval(mH);
	
	//srcElem.onmousemove= function() {clearInterval(mH);}
	srcElem.onmouseout= menuHider;
	
	hideMenus();
	
	// check if we have a cached menu for the existing key
	if(menu_cache[menu_key]) {
		document.getElementById("menu_popup_"+menu_key).style.display = 'block';
		document.getElementById("menu_popup_links_"+menu_key).scrollTop = 0;
		return;
	}

	var http = new createRequestObject();
	http.onreadystatechange = function() {
		if(http.readyState == 4){
			var response = http.responseText;
			menu_cache[menu_key] = response;
			showMenu(srcElem,menu_key);			
		}
	}
	

	reqURL = baseURL + menu_key;
	http.open('get',reqURL,true);
	http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
	http.send(null);
	
}

function addEvent(obj, evType, fn){ 
 if (obj.addEventListener){ 
   obj.addEventListener(evType, fn, false); 
   return true; 
 } else if (obj.attachEvent){ 
   var r = obj.attachEvent("on"+evType, fn); 
   return r; 
 } else { 
   return false; 
 } 
}

addEvent(window, 'load', function() {
	page_loaded = true;								  
});
