// JavaScript Document
///////////////////////////////////////////////////
//browser nonsenses
// globals, Copyright 2001-2006 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL
var isIE = false;
var isFF3 = false;
if (window.ActiveXObject) {
        isIE = true;
}
var xVersion='3.15.4',xNN4,xOp7,xOp5or6,xIE4Up,xIE4,xIE5,xUA=navigator.userAgent.toLowerCase();
//alert(xUA);

if(xUA.indexOf('firefox/3') != -1){
	isFF3 = true;
}
if (window.opera){
  xOp7=(xUA.indexOf('opera 7')!=-1 || xUA.indexOf('opera/7')!=-1);
  if (!xOp7) xOp5or6=(xUA.indexOf('opera 5')!=-1 || xUA.indexOf('opera/5')!=-1 || xUA.indexOf('opera 6')!=-1 || xUA.indexOf('opera/6')!=-1);
}
else if (document.all && xUA.indexOf('msie')!=-1) {
  xIE4Up=parseInt(navigator.appVersion)>=4;
  xIE4=xUA.indexOf('msie 4')!=-1;
  xIE5=xUA.indexOf('msie 5')!=-1;
}
else if (document.layers) {xNN4=true;}
xMoz=xUA.indexOf('gecko')!=-1;
xMac=xUA.indexOf('mac')!=-1;

var currSubCat = null;

function getMainCategories() {
	if (isIE) {
		if (window.ActiveXObject) {
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.onreadystatechange = function () {
				if (xmlDoc.readyState == 4) {
					addMainCategories(xmlDoc);
				}
			};
		} else {
			alert('Your browser can\'t handle this script');
			return;
		}
		xmlDoc.load("mainCategories.xml");
		
		/*
		var xml = document.createElement("xml");
		xml.src = "mainCategories.xml";
		xml.id = "main_xml";
		document.body.appendChild(xml);
		var result = xml.XMLDocument;
		document.body.removeChild(xml);
		if (result) {
			addMainCategories(result);
		} else {
			setTimeout("waitForResult('main_xml', 'main')", 100);	
		}*/
		
	} else {
		/* Set up the request */
	    var xmlhttp =  new XMLHttpRequest();
	    xmlhttp.open('GET', 'mainCategories.xml', true);
	    
	    /* The callback function */
	    xmlhttp.onreadystatechange = function() {
	        if (xmlhttp.readyState == 4) {
				//this will always be 0 i think because there's no actual server.
	            if (xmlhttp.responseXML) {
	                addMainCategories(xmlhttp.responseXML);
				} else {
	                alert("request failed: code: " + xmlhttp.status);
					alert(xmlhttp.responseText);
				}
	        }
	    }
	    /* Send the GET request */
	    xmlhttp.send(null);
	}
}

function waitForResult(id, type) {
	var xml = xGetElementById(id);
	if (xml.XMLDocument) {
		if(type == 'main'){
			addMainCategories(xml.XMLDocument);
		}
	} else {
		setTimeout("waitResult(" + id + "," + type + ")", 100);
	}
}

function getSubCategories(cat) {
	selectCategory(xGetElementById("main_category_" + cat));
	resetSubCategories();
	
	if (isIE) {
		if (window.ActiveXObject) {
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.onreadystatechange = function () {
				if (xmlDoc.readyState == 4) {
					createSubCategories(xmlDoc);
				}
			};
		} else {
			alert('Your browser can\'t handle this script');
			return;
		}
		xmlDoc.load("subcategories/" + cat + '.xml');
		
		/*
		var xml = document.createElement("xml");
		xml.src = "subcategories/" + cat + '.xml';
		xml.id = "sub_xml";
		document.body.appendChild(xml);
		var result = xml.XMLDocument;
		document.body.removeChild(xml);
		if (result) {
			createSubCategories(result);
		} else {
			setTimeout("waitResult('sub_xml', 'sub')", 100);	
		}
		*/
	} else {
    	/* Set up the request */
    	var xmlhttp =  new XMLHttpRequest();
    	xmlhttp.open('GET', "subcategories/" + cat + '.xml', true);
    	
    	/* The callback function */
    	xmlhttp.onreadystatechange = function() {
    	    if (xmlhttp.readyState == 4) {
				//this will always be 0 i think because there's no actual server.
    	        if (xmlhttp.responseXML) {
    	            createSubCategories(xmlhttp.responseXML);
				} else {
    	            alert("request failed: code: " + xmlhttp.status);
					alert(xmlhttp.responseText);
				}
    	    }
    	}
    	/* Send the GET request */
    	xmlhttp.send(null);
	}
}

function getItems(subcat) {
	//resetItems();
	if (isIE) {
		if (window.ActiveXObject) {
			xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
			xmlDoc.onreadystatechange = function () {
				if (xmlDoc.readyState == 4) {
					createItems(xmlDoc);
				}
			};
		} else {
			alert('Your browser can\'t handle this script');
			return;
		}
		xmlDoc.load("subcategories/items/" + subcat.getAttribute("name") + '.xml');
		/*var xml = document.createElement("xml");
		xml.src = "subcategories/items/" + subcat.getAttribute("name") + '.xml';
		xml.id = "items_xml";
		document.body.appendChild(xml);
		var result = xml.XMLDocument;
		document.body.removeChild(xml);
		if (result) {
			createItems(result);
		} else {
			setTimeout("waitForResult('items_xml', 'item')", 100);	
		}*/
	} else {
		/* Set up the request */
		//alert(subcat.getAttribute("name"));
	    var xmlhttp =  new XMLHttpRequest();
	    xmlhttp.open('GET', "subcategories/items/" + subcat.getAttribute("name") + '.xml', true);
	    
	    /* The callback function */
	    xmlhttp.onreadystatechange = function() {
	        if (xmlhttp.readyState == 4) {
				//this will always be 0 i think because there's no actual server.
	            if (xmlhttp.responseXML) {
	                createItems(xmlhttp.responseXML);
				} else {
	                alert("request failed: code: " + xmlhttp.status);
					alert(xmlhttp.responseText);
				}
	        }
	    }
	    /* Send the GET request */
	    xmlhttp.send(null);
	}
}

function addMainCategories(response) {
	var categories = response.getElementsByTagName("category");
	var catcontainer = xGetElementById("main_category_list");
	
	for (i = 0; i <categories.length; i++) {
		var cat = categories[i];
		var catname = cat.getAttribute("name");
		
		//create a new category object
		var catli = document.createElement("li");
		catli.setAttribute("name", catname);
		
		var cata = document.createElement("a");
		cata.setAttribute("id", "main_category_" + catname);
		//cata.setAttribute("onclick", "getSubCategories('" + catname + "'); return false;");
		xAddEventListener(cata, "click", eventSelectMainCat, false);
		cata.setAttribute("href", "#");
		if (i == 0) {
			cata.className = "maincategory first";
			catli.className = "menu_item first";
		} else if (i == categories.length - 1) {
			cata.className = "maincategory last";
			catli.className = "menu_item last";
		} else {
			cata.className = "maincategory";
			catli.className = "menu_item";
		}
		
		var catimage = document.createElement("img");
		if(isIE) {
			catimage.setAttribute("src", "images/" + catname + ".gif");
		} else {
			catimage.setAttribute("src", "images/" + catname + ".png");
		}
		cata.appendChild(catimage);
		catli.appendChild(cata);
		catcontainer.appendChild(catli);
	}
	getSubCategories("home");
}

function createSubCategories(response) {
	var subcats = response.getElementsByTagName("category");
	var subcatcontainer = xGetElementById("sub_categories_list");
	for (i = 0; i <subcats.length; i++) {
		var subcat = subcats[i];
		var subcatname = subcat.getAttribute("name");
		
		//create new sub cat objects
		var subli = document.createElement("li");
		subli.setAttribute("id", "sub_category_" + subcatname);
		subli.setAttribute("name", subcatname);
 		if (i == 0) {
			subli.setAttribute("class", "sub_category first");
		} else {
			subli.setAttribute("class", "sub_category");
		}
		var rounddiv = document.createElement("div");
		rounddiv.className = "submenu_item_round";
		var paddiv = document.createElement("div");
		paddiv.className = "submenu_item_pad";
		var newdiv = document.createElement("div");
		newdiv.className = "submenu_item_content";
		
		var sublink = document.createElement("a");
		sublink.setAttribute("href", "#");
		//sublink.setAttribute("onclick", "selectSubCat(this.parentNode.parentNode.parentNode.parentNode); return false;");
		xAddEventListener(sublink, "click", eventSelectSubCat, false);
		var subtext = document.createTextNode(subcatname);
		
		subli.appendChild(rounddiv);
		rounddiv.appendChild(paddiv);
		paddiv.appendChild(newdiv);
		newdiv.appendChild(sublink);
		sublink.appendChild(subtext);
		
		subcatcontainer.appendChild(subli);
	}
	selectSubCat(subcatcontainer.firstChild);
}

function createItems(response) {
	var mainitem = response.getElementsByTagName("item")[0];
	var itemtype = mainitem.getAttribute("type");
	if (itemtype == "menu") {
		var items = response.getElementsByTagName("menuitem");
		var subcatlist = xGetElementById("sub_categories_list");
	
		var outerli = document.createElement("li");
		outerli.id = "items_container"
		
		var itemlist = document.createElement("ul");
		itemlist.id = "items_list";
	
		subcatlist.insertBefore(outerli, currSubCat.nextSibling);
		outerli.appendChild(itemlist);
		//this is a list of items to make a menu
		for (i = 0; i <items.length; i++) {
			var curritem = items[i];
			var itemname = curritem.getAttribute("name");
			var itemdisplay = curritem.getAttribute("display");
			var itemcontainer = xGetElementById("items_list");
			
			//create new sub cat objects
			var itemli = document.createElement("li");
			itemli.setAttribute("id", "item_" + itemname);
			itemli.setAttribute("class", "item");
			itemli.setAttribute("name", itemname);
			
			var newdiv = document.createElement("div");
			newdiv.className = "item_content";
			
			var itemlink = document.createElement("a");
			itemlink.setAttribute("href", "#");
			//itemlink.setAttribute("onclick", "getItems(this.parentNode.parentNode); return false;");
			xAddEventListener(itemlink, "click", eventSelectItem, false);
			
			var itemtext = document.createTextNode(itemdisplay);
			
			itemli.appendChild(newdiv);
			newdiv.appendChild(itemlink);
			itemlink.appendChild(itemtext);
			itemlist.appendChild(itemli);
		}
	} else {
		//just put the cdata into the viewer
		var title = mainitem.getAttribute("title");
		xGetElementById("viewer_header_content").innerHTML = "<h1>" + title + "</h1>";
		
		var viewer = xGetElementById("viewer_content");
		viewer.innerHTML = getElementTextNS("content", "encoded", mainitem, 0);
	}
}

function selectCategory(cat) {
	//deselect all of the main cats and change back the edges
	var catlist = xGetElementById("main_category_list");
	var menuleft = xGetElementById("menubar_left");
	var menuright = xGetElementById("menubar_right");
	
	for (i=0; i < catlist.childNodes.length; i++) {
		var ccata = catlist.childNodes[i].firstChild;
		ccata.className = ccata.className.replace(" selected", "");
	}
	menuleft.innerHTML = "<img src='images/menubar_left.gif'/>";
	menuright.innerHTML = "<img src='images/menubar_right.gif'/>";
	
	//change the class on the current cat to selected
	if (cat.parentNode.className.indexOf("first") != -1) {
		menuleft.innerHTML = "<img src='images/menubar_left_selected.gif'/>";
	} else if (cat.parentNode.className.indexOf("last") != -1) {
		menuright.innerHTML = "<img src='images/menubar_right_selected.gif'/>";
	}
	cat.className =  cat.className + " selected";
}

function eventSelectMainCat(event) {
    var evt = new xEvent(event);
    var current = null;
    if (evt.target) {
        current = evt.target;
    }
    else if (evt.srcElement) {
        current = evt.srcElement;
    }

    while (current.nodeName != "LI") {
        current = current.parentNode;
    }
    getSubCategories(current.getAttribute("name"));
}

function eventSelectSubCat(event) {
    var evt = new xEvent(event);
    var current = null;
    if (evt.target) {
        current = evt.target;
    }
    else if (evt.srcElement) {
        current = evt.srcElement;
    }

    while (current.nodeName != "LI") {
        current = current.parentNode;
    }
    selectSubCat(current);
}

function eventSelectItem(event) {
    var evt = new xEvent(event);
    var current = null;
    if (evt.target) {
        current = evt.target;
    }
    else if (evt.srcElement) {
        current = evt.srcElement;
    }

    while (current.nodeName != "LI") {
        current = current.parentNode;
    }
    getItems(current);
}

function selectSubCat(subcat) {
	//alert(subcat);
	currSubCat = subcat;
	var subcatlist = xGetElementById("sub_categories_list");
	
	for (i = 0; i < subcatlist.childNodes.length; i++) {
		var curround = subcatlist.childNodes[i].firstChild;
		var currmid = subcatlist.childNodes[i].firstChild.firstChild.firstChild;
		
		curround.className = "submenu_item_round";
		currmid.className = "submenu_item_content";
	}
	var nround = subcat.firstChild;
	var nmid = subcat.firstChild.firstChild.firstChild;
	nround.className = nround.className + "_selected";
	nmid.className = nmid.className + "_selected";
	resetItems();
	getItems(subcat);
}

function resetSubCategories() {
	var subcatcontainer = xGetElementById("sub_categories_list");
	
	//put animation code here
	
	//now clear the list
	subcatcontainer.innerHTML = "";
}

function resetItems() {
	var itemcontainer = xGetElementById("items_container");
	if(itemcontainer) {
		itemcontainer.parentNode.removeChild(itemcontainer);
	}
	var viewer = xGetElementById("viewer_content");
	var viewer_header = xGetElementById("viewer_header_content");
	//animation code here
	
	//clear the list
	viewer.innerHTML = "";
	viewer_header.innerHTML = "<h1>waiting...</h1>";
}

function randomBack() {
	var vcon = xGetElementById("viewer_content_frame");
	var randval = Math.round(100 * Math.random()) % 5;
	switch (randval){
		case 0:
			vcon.className = "dogma";
			break;
		case 1:
			vcon.className = "pipe";
			break;
		case 2:
			vcon.className = "woman";
			break;
		case 3:
			vcon.className = "pump";
			break;
		case 4:
			vcon.className = "bum";
			break;
		default:
			alert("that aint right!!");
			break;
	}
	setTimeout('randomBack()', 15000);
}

function xGetElementById(e)
{
  if(typeof(e)=='string') {
    if(document.getElementById) e=document.getElementById(e);
    else if(document.all) e=document.all[e];
    else e=null;
  }
  return e;
}
function xAddEventListener(e,eT,eL,cap)
{
  if(!(e=xGetElementById(e)))return;
  eT=eT.toLowerCase();
  if(e.addEventListener)e.addEventListener(eT,eL,cap||false);
  else if(e.attachEvent)e.attachEvent('on'+eT,eL);
  else e['on'+eT]=eL;
}
function xEvent(evt) // object prototype
{
 this.type = ''; this.target = null; this.relatedTarget = null;
  this.pageX = 0; this.pageY = 0; this.keyCode = 0;
  this.offsetX = 0; this.offsetY = 0;
  var e = evt || window.event;
  if(!e) return;
  if(e.type) this.type = e.type;
  if(e.target) this.target = e.target;
  else if(e.srcElement) this.target = e.srcElement;
  if (e.relatedTarget) this.relatedTarget = e.relatedTarget;
  else if (xIE4Up) {
    if (e.type == 'mouseover') this.relatedTarget = e.fromElement;
    else if (e.type == 'mouseout') this.relatedTarget = e.toElement;
  }
  if(xOp5or6) { this.pageX = e.clientX; this.pageY = e.clientY; }
  else if(xDef(e.pageX,e.pageY)) { this.pageX = e.pageX; this.pageY = e.pageY; }
  else if(xDef(e.clientX,e.clientY)) { this.pageX = e.clientX + xScrollLeft(); this.pageY = e.clientY + xScrollTop(); }

  /* I need someone with IE/Mac to test this section
     as compared to the following commented-out section.
  */
  if(xDef(e.offsetX,e.offsetY)) {
    this.offsetX = e.offsetX;
    this.offsetY = e.offsetY;
    if (xIE4Up && xMac) {
      this.offsetX += xScrollLeft();
      this.offsetY += xScrollTop();
    }
  }
  else if (xDef(e.layerX,e.layerY)) {
    this.offsetX = e.layerX;
    this.offsetY = e.layerY;
  }
  else {
    this.offsetX = this.pageX - xPageX(this.target);
    this.offsetY = this.pageY - xPageY(this.target);
  }

/*
  if (xDef(e.offsetX,e.offsetY) && !(xIE4Up && xMac)) {
    this.offsetX = e.offsetX;
    this.offsetY = e.offsetY;
  }
  else if (xDef(e.layerX,e.layerY)) {
    this.offsetX = e.layerX;
    this.offsetY = e.layerY;
  }
  else {
    this.offsetX = this.pageX - xPageX(this.target);
    this.offsetY = this.pageY - xPageY(this.target);
  }
*/

  if (e.keyCode) { this.keyCode = e.keyCode; } // for moz/fb, if keyCode==0 use which
  else if (xDef(e.which) && e.type.indexOf('key')!=-1) { this.keyCode = e.which; }
}

function xDef() {
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
  return true;
}

function xScrollLeft(e, bWin) {
  var offset=0;
  if (!xDef(e) || bWin) {
    var w = e || window;
    if(w.document.documentElement && w.document.documentElement.scrollLeft) offset=w.document.documentElement.scrollLeft;
    else if(w.document.body && xDef(w.document.body.scrollLeft)) offset=w.document.body.scrollLeft;
  }
  else {
    e = xGetElementById(e);
    if (e && xNum(e.scrollLeft)) offset = e.scrollLeft;
  }
  return offset;
}
function xScrollTop(e, bWin) {
  var offset=0;
  if (!xDef(e) || bWin) {
    var w = e || window;
    if(w.document.documentElement && w.document.documentElement.scrollTop) offset=w.document.documentElement.scrollTop;
    else if(w.document.body && xDef(w.document.body.scrollTop)) offset=w.document.body.scrollTop;
  }
  else {
    e = xGetElementById(e);
    if (e && xNum(e.scrollTop)) offset = e.scrollTop;
  }
  return offset;
}

function getElementTextNS(prefix, local, parentElem, index) {
    var result = "";
	//alert(parentElem.tagName);
    if (prefix && (isIE || isFF3)) {
        // IE/Windows way of handling namespaces
        result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
		//alert(isFF3);
    } else {
        // the namespace versions of this method 
        // (getElementsByTagNameNS()) operate
        // differently in Safari and Mozilla, but both
        // return value with just local name, provided 
        // there aren't conflicts with non-namespace element
        // names
		//alert();
        result = parentElem.getElementsByTagName(local)[index];
    }
    if (result) {
        // get text, accounting for possible
        // whitespace (carriage return) text nodes 
        if (result.childNodes.length > 1) {
            return result.childNodes[1].nodeValue;
        } else {
            return result.firstChild.nodeValue;    		
        }
    } else {
        return "n/a";
    }
}



