function init()
{
var xmlMenu = new XmlMenu();
}
function XmlMenu()
{
//User Editable Variables
var menuDiv = "navigation";
var headerDiv = "header";
var mainDiv = "content";
var useHTTPRequest = true; //Load new page or Load into the content div?
var rememberSubmenuLocation = false;//This is broken for the moment.
var xmlFile = 'menus.xml';//"./include_js/menus.xml"; // path/to/xml file of Menu content this is relative to the html/php file calling it
var menu_div = document.getElementById(menuDiv);
var header = document.getElementById(headerDiv);
var main_div = document.getElementById(mainDiv);
var rootMenu = null;
xmlRequest(xmlFile, onLoad);
function onLoad(resultXML)
{
resultXML.setAttribute('title', 'ROOT');
rootMenu = new Menu(resultXML, null, 0, 0);
loadMenuItem(rootMenu);
openMenuPath(useHTTPRequest);
}
function loadMenuItem(menuItem)
{
var parentUL = (menuItem.parent != null) ? menuItem.parent.getULcontainer() : null;
while(menu_div.lastChild != parentUL)
menu_div.removeChild(menu_div.lastChild);
menu_div.appendChild(menuItem.getULcontainer());
menuItem.clearCurrent();
if (rememberSubmenuLocation)
menuItem.loadSubMenu();
}
function loadPage(url)
{
// the next line would make the pages reload and change openMenuPath(true); in loadMenus function to openMenuPath(false);
if (useHTTPRequest)
{
main_div.innerHTML = '';
if(url != null)
{
var loadingMessage = new LoadingMessage('Loading '+url);
main_div.appendChild(loadingMessage.getDOM());
function onLoad(htmlStr) { main_div.innerHTML = htmlStr; };
HttpRequest(url, '', onLoad);
}
}
}
function openMenuPath(clickLast)
{
var hash = window.location.hash || '#menu=0';
var start = hash.indexOf('menu=', 0);
if(start > -1)
{
start += 5;
var end = hash.indexOf('&', start);
var bob = (end > -1) ? hash.substr(start, end - start) : hash.substr(start);
var menus = explode(bob, ',');
var parent = rootMenu;
for(var n = 0; n < menus.length; n++)
{
var next = parent.getSubMenu(menus[n]);
if(n + 1 < menus.length || clickLast == false)
{
parent.current_li = parent.getUL().childNodes[menus[n]];
parent.current_li.className = 'current_li';
loadMenuItem(next);
var parent = next;
}
else parent.getUL().childNodes[menus[n]].firstChild.onclick();
}
}
}
function Menu(resultXML, parent, number, depth)
{
var ref = this;
// this.hasChildren = function() { return (subs.length > 0); };
this.parent = parent;
this.depth = depth;
this.number = number;
var title = resultXML.getAttribute('title');
var url = resultXML.getAttribute('url');
var subs = new Array();
this.current_li = null;
var counter = 0;
for(var n = 0; n < resultXML.childNodes.length; n++)
if(resultXML.childNodes[n].tagName == 'Menu')
subs.push(new Menu(resultXML.childNodes[n], ref, counter++, depth + 1));
var ul = null;
var li = null;
var ul_container = null; //Used to add encapsulate UL's in menu items.
this.loadSubMenu = function()
{
if(ref.current_li != null)
{
var temp = ref.current_li;
ref.current_li = null;
temp.firstChild.onclick();
}
}
this.clearCurrent = function()
{
if(this.current_li != null)
{
this.current_li.className = 'menu_li';
this.current_li = null;
}
}
this.getSubMenu = function(index) { return subs[index]; };
this.getUL = function()
{
if (ul == null)
getULcontainer();
return ul;
}
this.getULcontainer = function ()
{
if(ul == null)
{
ul_container = document.createElement('div'); ul_container.className = 'menu_ul_container';
ul = document.createElement('ul'); ul.className = 'menu_ul';
ul_container.appendChild(ul);
for(var n = 0; n < subs.length; n++)
ul.appendChild(subs[n].getLI());
}
return ul_container;
}
this.getLI = function()
{
if(li == null)
{
var current = ref;
var menuPath = current.number;
while((current = current.parent) && current.parent != null)
menuPath = current.number+','+menuPath;
var a = document.createElement('a');
a.className = 'menu_a';
a.href = (useHTTPRequest) ? '#menu='+menuPath : ((url) ? url+'#menu='+menuPath : 'javascript:;');
a.appendChild(document.createTextNode(title));
a.onclick = function()
{
// if(ref.parent.current_li != li)
// {
if(ref.parent.current_li != null)
ref.parent.current_li.className = 'menu_li';
li.className = 'current_li';
ref.parent.current_li = li;
if(useHTTPRequest)
{
loadPage(url);
loadMenuItem(ref);
}
else if(url == null)
loadMenuItem(ref);
// if(url != null)
// loadPage(url);
// }
};
li = document.createElement('li'); li.className = 'menu_li';
li.appendChild(a);
if(subs.length > 0)
{
var span = document.createElement('span'); span.className='arrow';
li.appendChild(span);
}
}
return li;
}
}
function LoadingMessage(message)
{
var content_div = document.createElement('div');
content_div.appendChild(document.createTextNode(message));
var timer = new Timer(500, 30000, onIncrement, onTimeout);
timer.start();
var counter = 0;
this.getDOM = function() { return content_div; };
this.remove = function() { if(content_div.parentNode != null) content_div.parentNode.remove(content_div); };
function onIncrement()
{
if(content_div.parentNode == null)
timer.stop();
if((++counter % 5) == 0)
while(content_div.firstChild != content_div.lastChild)
content_div.removeChild(content_div.lastChild);
else content_div.appendChild(document.createTextNode('.'));
}
function onTimeout()
{
alert("The operation has timed out, if this problem persists please report it to an administrator");
}
}
function Timer(increment, lifeTime, onIncrement, onComplete)
{
var running = false;
var elapsed = null;
var timerID = null;
this.stop = function()
{
if(running)
window.clearTimeout(timerID);
running = false;
}
this.start = function()
{
elapsed = 0;
running = true;
timerID = window.setTimeout(onTimeout, increment);
function onTimeout()
{
elapsed += increment;
if(elapsed < lifeTime)
{
if(running)
timerID = window.setTimeout(onTimeout, increment);
onIncrement();
}
else if(running)
{
running = false;
onComplete();
}
}
}
}
// url : relative or absolute url of the server script or xml file
// handler : function that will process the XML document, must take the responseXML.documentElement as it's argument
function HttpRequest(url, data, handler)
{
if(window.XMLHttpRequest || window.ActiveXObject)
{
var request = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
request.onreadystatechange = function() { send_onStateChange(request, handler) } ;
request.open('POST', url, true);
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
request.setRequestHeader('Content-Length', data.length);
request.send(data);
}
else alert('XML request not supported, get a new browser!!!');
function send_onStateChange(request, handler)
{
if(request.readyState == 4) // 4 means done loading
{
if(request.status == 200)
handler(request.responseText);
else alert('Load Failed: status: '+request.status+": "+request.statusText);
}
}
}
function xmlRequest(url, handler)
{
if(window.XMLHttpRequest || window.ActiveXObject)
{
var request = (window.XMLHttpRequest) ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
request.onreadystatechange = function() { load_onStateChange(request, handler) } ;
request.open('GET', url, true);
request.send(null);
}
else alert('XML request not supported, get a new browser!!!');
function load_onStateChange(request, handler)
{
if(request.readyState == 4) // 4 means done loading
{
if(request.status == 200)
{
if(request.responseXML)
{
var result = request.responseXML.documentElement;
if(result.nodeName != 'parsererror')
handler(result);
else alert('Parser Error: '+result.textContent);
}
else alert('Script Error: '+request.responseText);
}
else alert('Load Failed: status: '+request.status+": "+request.statusText);
}
}
}
function explode(str, sep)
{
var peices = Array();
var strlen = str.length;
var seplen = sep.length;
var start = 0;
for(var n = 0; n < strlen; n++)
{
var match = true;
var x;
for(x = 0; x < seplen; x++)
{
if(n + x >= strlen || str.charAt(n + x) != sep.charAt(x))
{
match = false;
break;
}
}
if(match)
{
peices.push(str.substring(start, n));
start = n + x;
}
}
if(start < strlen)
peices.push(str.substring(start, strlen));
return peices;
}
}