/*******************************************************************************

FILE: mud_Scripts.js
REQUIRES: mud_API.js
AUTHOR: Takashi Okamoto mud(tm) - http://www.mudcorp.com/
VERSION: 1.0 - initial public release
DATE: 11/12/2005

*******************************************************************************/

////////////////////////////////////////////////////////////////////////////////
// GLOBAL VARS

var req;
var isIE = false;
var scrolling = false;
var imgsOver = new Array();
var imgsOff = new Array();
var pageWidth = new Array();
pageWidth['issue1'] = 309;
pageWidth['issue2'] = 311;
pageWidth['issue3'] = 311;
pageWidth['issue4'] = 311;
var coverWidth = new Array();
coverWidth['issue1'] = 533;
coverWidth['issue2'] = 533;
coverWidth['issue3'] = 533;
coverWidth['issue4'] = 533;

////////////////////////////////////////////////////////////////////////////////
// FUNCTIONS

function loadXMLDocCover(url) {
	req = false;
	if(window.XMLHttpRequest) {
		try {
			req = new XMLHttpRequest();
		}
		catch(e) {
			req = false;
		}
	}
	else if(window.ActiveXObject) {
		isIE = true;
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e) {
        	try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
				req = false;
        	}
		}
	}
	if(req) {
		req.onreadystatechange = processReqChangeCover;
		req.open("GET", url, true);
		req.send("");
	}
}

function processReqChangeCover() {
	// only if req shows "loaded"
	if (req.readyState == 4) {
		// only if "OK"
		if (req.status == 200) {
			// insert new text content
			setCoverContent();
		} else {
			setCoverContent("There was a problem retrieving the XML data:\n" + req.statusText);
		}
	}
}

function loadXMLDoc(url) {
	req = false;
	if(window.XMLHttpRequest) {
		try {
			req = new XMLHttpRequest();
		}
		catch(e) {
			req = false;
		}
	}
	else if(window.ActiveXObject) {
		isIE = true;
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e) {
        	try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
        	} catch(e) {
				req = false;
        	}
		}
	}
	if(req) {
		req.onreadystatechange = processReqChange;
		req.open("GET", url, true);
		req.send("");
	}
}

function processReqChange() {
	// only if req shows "loaded"
	if (req.readyState == 4) {
		// only if "OK"
		if (req.status == 200) {
			// insert new text content
			setTextContent();
		} else {
			setTextContent("There was a problem retrieving the XML data:\n" + req.statusText);
		}
	}
}

function clearCoverContent() {
	getRawObject('cover').innerHTML = "";
	unsetDisplay('cover');
	getRawObject('contributors').innerHTML = "";
	unsetDisplay('contributors');
	getRawObject('link').innerHTML = "";
	unsetDisplay('link');
	getRawObject('next').innerHTML = "";
	unsetDisplay('next');
}

function setCover() {
	setDisplay('cover');
	setDisplay('contributors');
	setDisplay('link');
	setDisplay('next');
}

function clearTextContent() {
	getRawObject('text-brief').innerHTML = "";
	unsetDisplay('text-brief');
	getRawObject('text-content').innerHTML = "";
	unsetDisplay('text-content');
	getRawObject('text-content2').innerHTML = "";
	unsetDisplay('text-content2');
}

function setCoverContent(error) {
	if (error) {
		getRawObject('cover').innerHTML = error;
		return;
	}
	var item = req.responseXML.getElementsByTagName('item')[0];
	var cover = getElementTextNS("", "cover", item, 0);
	var contributors = getElementTextNS("", "contributors", item, 0);
	var link = getElementTextNS("", "link", item, 0);
	var next = getElementTextNS("", "next", item, 0);
	getRawObject('cover').innerHTML = cover;
	getRawObject('contributors').innerHTML = contributors;
	getRawObject('link').innerHTML = link;
	getRawObject('next').innerHTML = next;
}

function setTextContent(error) {
	if (error) {
		getRawObject('text-brief').innerHTML = error;
		return;
	}
	var item = req.responseXML.getElementsByTagName('item')[0];
	var next = getElementTextNS("", "next", item, 0);
	var brief = getElementTextNS("", "brief", item, 0);
	var brief2 = getElementTextNS("", "brief2", item, 0);
	var content = getElementTextNS("", "content", item, 0);
	var content2 = getElementTextNS("", "content2", item, 0);
	if (brief2) {
		brief += "<br />" + brief2;
	}
	getRawObject('text-brief').innerHTML = next + "<p>" + brief + "</p>";
	getRawObject('text-brief').innerHTML += "<p>";
	if (content != "") {
		getRawObject('text-content').innerHTML = content + '<a href="#" class="hilite" onclick="unsetDisplay(\'text-content\'); return false;">Close...</a>';
		getRawObject('text-brief').innerHTML += '<a href="#" onclick="setDisplay(\'text-content\'); return false;"><img src="/images/view_left_on.gif" alt="view left" /></a><img src="/images/pixel.gif" alt="spread break" width="1" />';
	}
	if (content2) {
		getRawObject('text-content2').innerHTML = content2 + '<a href="#" class="hilite" onclick="unsetDisplay(\'text-content2\'); return false;">Close...</a>';
		getRawObject('text-brief').innerHTML += '<a href="#" onclick="setDisplay(\'text-content2\'); return false;"><img src="/images/view_right_on.gif" alt="view right" /></a>';
	}
	getRawObject('text-brief').innerHTML += "</p>";
}

// retrieve text of an XML document element, including
// elements using namespaces
function getElementTextNS(prefix, local, parentElem, index) {
	var result = "";
	if (prefix && isIE) {
		// IE/Windows way of handling namespaces
		result = parentElem.getElementsByTagName(prefix + ":" + local)[index];
	} else {
		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 "";
	}
}

function addCover(issue) {
	//clearTextContent();
	// make sure contributor list is hidden
	//unsetDisplay("contributors");
	var content = getRawObject('content');
	// get innerhtml
	var inner = content.innerHTML;
	var pWidth = (coverWidth[issue]) ? coverWidth[issue] : 311;
	var width = pWidth + 20; // add padding width
	var issueNum = issue.substring(5);
	// add div
	var innerNew = '<td><img src="/images/pixel.gif" alt="spread break" width="20" /></td><td><a href="/Issues/' + issueNum + '/"><img id="cover_' + issue + '" src="/images/' + issue + '/cover.jpg" alt="' + issue + '" /></a></td>';
	// load XML data
	loadXMLDocCover('/xml-content/' + issue + '.xml');
	// get content width
	getRawObject('content-wrapper').style.width = getObjectWidth('content-wrapper') + width + "px";
	// set new inner we have to include all the table tags because innerHTML for table elements are readonly for IE Win
	var newInsert = '<table cellspacing="0" cellpadding="0" border="0"><tr id="content">' + inner + innerNew;
	newInsert += '</tr></table>';
	getRawObject('content-wrapper').innerHTML = newInsert;
	scrollToPageInit(true);
}

function addPage(issue, number, number2) {
	clearTextContent();
	// make sure contributor list is hidden
	unsetDisplay("contributors");
	var content = getRawObject('content');
	// get innerhtml
	var inner = content.innerHTML;
	var pWidth = (pageWidth[issue]) ? pageWidth[issue] : 311;
	var width = pWidth + 20; // add padding width
	// add div
	var innerNew = '<td><img src="/images/pixel.gif" alt="spread break" width="20" /></td><td><a href="#" onclick="clearTextContent(); loadXMLDoc(\'/issue-content.php?issue=' + issue + '&page=' + number + '\'); setDisplay(\'text-brief\'); return false;"><img id="page_' + number + '" src="/images/' + issue + '/page-' + number + '.jpg" alt="page ' + number + '" /></a></td>';
	// check if there is another page
	if (number2) {
		width += pWidth + 1;
		innerNew += '<td><img src="/images/pixel.gif" alt="spread break" width="1" /></td><td><a href="#" onclick="clearTextContent(); loadXMLDoc(\'/issue-content.php?issue=' + issue + '&page=' + number + '\'); setDisplay(\'text-brief\'); return false;"><img id="page_' + number2 + '" src="/images/' + issue + '/page-' + number2 + '.jpg" alt="page ' + number2 + '" /></a></td>';
		// get xml info
		loadXMLDoc('/issue-content.php?issue=' + issue + "&page=" + number + "&page2=" + number2);
	}
	else {
		// get xml info
		loadXMLDoc('/issue-content.php?issue=' + issue + "&page=" + number);
	}
	// get content width
	getRawObject('content-wrapper').style.width = getObjectWidth('content-wrapper') + width + "px";
	// set new inner we have to include all the table tags because innerHTML for table elements are readonly for IE Win
	var newInsert = '<table cellspacing="0" cellpadding="0" border="0"><tr id="content">' + inner + innerNew;
	newInsert += '</tr></table>';
	getRawObject('content-wrapper').innerHTML = newInsert;
	scrollToPageInit(false);
}

function scrollToPageInit(cover) {
	window.setTimeout("scrollToPageStart(" + cover + ")", 50);
}

function scrollToPageStart(cover) {
	var windowWidth = getInsideWindowWidth();
	var contentWidth = getObjectWidth('content-wrapper');
	var left = (window.pageXOffset) ? window.pageXOffset : ((document.documentElement) ? document.documentElement.scrollLeft : document.body.scrollLeft);
	if (!left) left = document.body.scrollLeft; // ensure IE5 Mac gets the scroll position
	var difference = contentWidth - windowWidth - left;
	//alert(difference +", "+contentWidth+", "+windowWidth+", "+left);
	if (difference > 0) {
		scrollToPageAnimate(difference, 0, cover);
	}
	else {
		if (!cover) {
			setDisplay('text-brief');
		}
		else {
			setCoverContent();
		}
	}
}

function scrollToPageAnimate(difference, current, cover) {
	var diff = difference - current;
	var displace = (diff/3 > 5) ? diff/3 : 5;
	// scroll, set time out
	if (diff > 5) {
		current += displace;
		if (!isIEMac) window.clearTimeout();
		window.scrollBy(displace, 0);
		window.setTimeout("scrollToPageAnimate(" + difference + "," + current + "," + cover + ")", 50);
	}
	else {
		displace = 30; // make sure scrollbar reaches end
		current += displace;
		if (!isIEMac) window.clearTimeout();
		window.scrollBy(displace, 0);
		if (!cover) {
			setDisplay('text-brief');
		}
		else {
			setCoverContent();
		}
	}
}

function preloadImgs() {
	if (document.images) {
		// preloadmenu images
		var container = getRawObject('navigation-ie');
		var elements = container.getElementsByTagName('a');
		for (var i = 0; i < elements.length; i++) {
			var e = elements[i].childNodes[0].id;
			imgsOff[e] = new Image();
			imgsOff[e].src = "/images/menu/" + e + ".gif";
			imgsOver[e] = new Image();
			imgsOver[e].src = "/images/menu/" + e + "_on.gif";
		}
	}
}

function imgOn(evt) {
	evt = (evt) ? evt : ((event) ? event : null);
	var target = (evt.target) ? evt.target : evt.srcElement;
	var imgID = (target.id) ? target.id : target.name;
	if (imgID) target.src = imgsOver[imgID].src;
}

function imgOff(evt) {
	evt = (evt) ? evt : ((event) ? event : null);
	var target = (evt.target) ? evt.target : evt.srcElement;
	var imgID = (target.id) ? target.id : target.name;
	if (imgID) target.src = imgsOff[imgID].src;
}

////////////////////////////////////////////////////////////////////////////////
// MOUSE EVENTS

function setMouseClick() {
	var anchors = document.getElementsByTagName('a');
	for (var i = 0; i < anchors.length; i++) {
		switch (anchors[i].className) {
			case "clearPage":
				anchors[i].onclick = function() {
					window.location.reload();
					return false;
				}
				break;
		}
	}
}

function setMouseOver() {
	var container = getRawObject('navigation-ie');
	var elements = container.getElementsByTagName('a');
	for (var i = 0; i < elements.length; i++) {
		elements[i].onmouseover = imgOn;
	}
}

function setMouseOut() {
	var container = getRawObject('navigation-ie');
	var elements = container.getElementsByTagName('a');
	for (var i = 0; i < elements.length; i++) {
		elements[i].onmouseout = imgOff;
	}
}

////////////////////////////////////////////////////////////////////////////////
// INIT

function mudInit() {
	initDHTMLAPI();
	setMouseClick();
	if (isIEMac) {
		alert('Your current browser is not fully supported.\nPlease use Safari 1.2+ or FireFox 1.0+.');
	}
	else if (isIE4) {
		preloadImgs();
		setMouseOver();
		setMouseOut();
	}
}

////////////////////////////////////////////////////////////////////////////////
// WINDOW EVENTS

// gecko, safari, konqueror and generic
if (typeof window.addEventListener != 'undefined') {
	window.addEventListener('load', mudInit, false);
}
// opera 7
else if (typeof document.addEventListener != 'undefined') {
	document.addEventListener('load', mudInit, false);
}
// win/ie
else if (typeof window.attachEvent != 'undefined') {
	window.attachEvent("onload", mudInit);
}
// rest
else {
	window.onload = mudInit;
}