/*
	Outliner functions
	version: 1.5.6
	last modified 23-Feb-2005
	created by Marc Barrot, with help from Aaron Straup Cope, DJ Adams, Sjoerd Visscher, Doug Baron and Danny Goodman
	component of activeRenderer, copyright 2002-2005 by Precision IT Management,Inc.
*/
// wedge images caching
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol1.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol2.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol3.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol4.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol5.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol6.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol7.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/ol8.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/globe.gif';
(new Image (15,15)).src = 'http://blog.mathemagenic.com/activeRenderer/img/zoomIn.gif';
// test browser type
var macMSIE = navigator.userAgent.search (/MSIE.*Mac/i) + 1;					// true if Mac MSIE
var safari = navigator.userAgent.search (/safari/i) + 1;						// true if Safari
var isWin = navigator.appVersion.indexOf ("Win") != -1;							// true if Windows, false if MacOS
var isIE = navigator.appName.indexOf ("Microsoft") != -1;						// true if MSIE, false if other browser
var winMSIE = isWin & isIE;														// true is Windows MSIE
// nodePreview flag: display node preview when hovering a collapsed wedge if true
var nodePreview = 1;
function switchPreview () {
	var link;
	if (document.getElementById) {
		link = document.getElementById ('preview');
	}
	if (nodePreview == 0) {
		nodePreview = 1;
		if (link) link.innerHTML = 'hide previews';
	} else {
		nodePreview = 0;
		if (link) link.innerHTML = 'show previews';
	}
}

function expand (nodeId) {
	if (document.getElementById) {
		var container = document.getElementById (nodeId);
		var wedgeSpan = document.getElementById ('i' + nodeId.substr (1));
		if (container) {
			wedgeSpan.className = 'openedWedge';
			wedgeSpan.title = 'collapse';
			container.className = 'expanded';
		}
	}
}

function collapse (nodeId) {
	if (document.getElementById) {
		var container = document.getElementById (nodeId);
		var wSpan = document.getElementById ('i' + nodeId.substr (1));
		var nodeList = container.childNodes;
		if (container) {
			wSpan.className = 'closedWedge';
			wSpan.title = 'expand';
			container.className = 'collapsed';
			for (var i = 0; i < nodeList.length; i++) {							// support webOutliner
				if (nodeList[i].nodeType == 1) {
					var textSpan = document.getElementById ('t' + nodeList[i].id.substr (1));
					if (textSpan && textSpan.className == 'selected') textSpan.className = 'clickable';
				}
			}
		}
	}
}

function nodeSwitch (nodeId) {
	if (! nodeId) var nodeId = 'p' + window.event.srcElement.id.substr (1);
	if (nodeId && typeof (nodeId) == 'object') {
		var targetElem = (nodeId.target.nodeType == 3) ? nodeId.target.parentNode : nodeId.target;
		nodeId = 'p' + targetElem.id.substr (1);
	}
	if (document.getElementById) {
		if (document.getElementById ('status')) {
			document.getElementById ('status').innerHTML = 'modified';
		}
		if (document.getElementById (nodeId) !=  null) {
			var nodeState = document.getElementById (nodeId).className;
			if (nodeState == 'collapsed' || nodeState == 'collapsedHigh') {
				if (nodeState == 'collapsedHigh') nodeLow (nodeId);
				expand (nodeId);
			} else {
				if (nodeState == 'expandedHigh') nodeLow (nodeId);
				collapse (nodeId);
			}
		}
	}
}

function nodeHigh (nodeId) {
	if (window.selectedObj && selectedObj.id) return;      						// support webOutliner dragging
	if (! nodeId) var nodeId = 'p' + window.event.srcElement.id.substr (1);
	if (nodeId && typeof (nodeId) == 'object') {
		var targetElem = (nodeId.target.nodeType == 3) ? nodeId.target.parentNode : nodeId.target;
		nodeId = 'p' + targetElem.id.substr (1);
	}
	if (document.getElementById && document.getElementById (nodeId) !=  null) {
		var nodeState = document.getElementById (nodeId).className;
		var nodeList = document.getElementById (nodeId).childNodes;
		if (nodeState == 'expanded') {
			document.getElementById (nodeId).className = 'expandedHigh';
			for (var i = 0; i < nodeList.length; i++) {
				if (nodeList[i].nodeType == 1) {
					nodeList[i].className = nodeList[i].className.replace (/^(\D+)/, "$1High");
				}
			}
		} else {
			if (nodeState == 'collapsed') {
				if (window.top.nodePreview == 1) {
					document.getElementById (nodeId).className = 'collapsedHigh';
					for (var i = 0; i < nodeList.length; i++) {
						if (nodeList[i].nodeType == 1) {
							nodeList[i].className = nodeList[i].className.replace (/^(\D+)/, "$1High");
						}
					}
				}
			}
		}
	}
}

function nodeLow (nodeId) {
	if (! nodeId) var nodeId = 'p' + window.event.srcElement.id.substr (1);
	if (nodeId && typeof (nodeId) == 'object') {
		var targetElem = (nodeId.target.nodeType == 3) ? nodeId.target.parentNode : nodeId.target;
		nodeId = 'p' + targetElem.id.substr (1);
	}
	if (document.getElementById && document.getElementById (nodeId) !=  null) {
		var nodeState = document.getElementById (nodeId).className;
		var nodeList = document.getElementById (nodeId).childNodes;
		if (nodeState == 'expandedHigh') {
			document.getElementById (nodeId).className = 'expanded';
			for (var i = 0; i < nodeList.length; i++) {
				if (nodeList[i].nodeType == 1) {
					nodeList[i].className = nodeList[i].className.replace ('High', '');
				}
			}
		} else {
			if (nodeState == 'collapsedHigh') {
				document.getElementById (nodeId).className = 'collapsed';
				for (var i = 0; i < nodeList.length; i++) {
					if (nodeList[i].nodeType == 1) {
						nodeList[i].className = nodeList[i].className.replace ('High', '');
					}
				}
			}
		}
	}
}

function expandAll (outlineId) {
	if (document.getElementsByTagName) {
		nodeList = document.getElementsByTagName ('div');
		for (var i = 0; i < nodeList.length; i++) {
	
			if (nodeList[i].title == outlineId) {
				expand (nodeList[i].id);	
			}
		}
	}
}

function collapseAll (outlineId) {
	if (document.getElementsByTagName) {
		nodeList = document.getElementsByTagName ('div');
		for (var i = 0; i < nodeList.length; i++) {
			if (nodeList[i].title == outlineId) {
				collapse (nodeList[i].id);
			}
		}
	}
}

function normalizeAll (nodeClass) {
	if (document.getElementsByTagName) {
		nodeList = document.getElementsByTagName ('span');
		for (var i = 0; i < nodeList.length; i++) {
	
			if (nodeList[i].className == nodeClass) {
				nodeList[i].style.fontWeight = 'normal';
			}
		}
	}
}

function expandBold (nodeId) {
	wedgeId = "i" + nodeId.substr (1);
	textId = "t" + nodeId.substr (1);
	if (document.getElementById && document.getElementById (nodeId) != null) {
		document.getElementById (wedgeId).className = 'openedWedge';
		document.getElementById (wedgeId).title='collapse';
		document.getElementById (textId).style.fontWeight = 'bold';
		document.getElementById (nodeId).className='expanded';
	}
}
function expandByDate (node) {
	var nodeList = node.childNodes;
	for (var i=0; i < nodeList.length; i++ ) {
	
		if (nodeList[i].nodeType == 1 && nodeList[i].tagName.toLowerCase () == 'div') {
			if (nodeList[i].title == 'item') {
				expandBold (nodeList[i].id);
			} else {
				expandByDate (nodeList[i]);
			}
		}
	}
}

function daySwitch (postDate) {
	var hasItems = 0;
	if (document.getElementsByTagName) {
		nodeList = document.getElementsByTagName ('span');
		for (var i = 0; i < nodeList.length; i++) {
	
			if (nodeList[i].className == 'itemTitle') {
				hasItems = 1;
				break;
			}
		}
	}
	
	if (hasItems) {
		collapseAll ('item');
		normalizeAll ('itemTitle');
		if (document.getElementById) {
			expandByDate (document.getElementById (postDate));
		}
	}
	else {
		collapseAll ('day');
		nodeSwitch (postDate);
	}
}
function wedgeSwitch (outlineId) {
	if (document.getElementsByTagName) {
		nodeList = document.getElementsByTagName ('span');
		for (var i = 0; i < nodeList.length; i++) {
			if (nodeList[i].className && nodeList[i].className.indexOf ("Wedge") != -1) {
				if (nodeList[i].parentNode.parentNode.className.replace (/[0-9]+/, '') == outlineId) {
					if (nodeList[i].style.visibility == 'hidden') {
						nodeList[i].style.visibility = 'visible';
					} else {
						nodeList[i].style.visibility = 'hidden';
					}
				}
			}
		}
	}
	if (document.getElementById) {
		var link = document.getElementById ('hide');
		if (link) {
			if (link.innerHTML == 'hide wedges') {
				link.innerHTML = 'show wedges';
			} else {
				link.innerHTML = 'hide wedges';
			}
		}
	}
}

var targetNode;
var targetRoot;
function transclude (nodeId, url, ctx) {
	var wedgeId = "i" + nodeId.substr (1);
	var rootId = "r" + nodeId.substr (1);
	var refId = "x" + nodeId.substr (1);
	var context;
	
	(ctx) ? context = '&' + ctx + '=yes' : context = '';
	
	if (document.getElementById) {
		if (! document.getElementById ('buffer')) {								// create buffer if needed
			var buffer = document.createElement ('div');
			buffer.setAttribute ('id', 'buffer');
			document.body.appendChild (buffer);									// add buffer as last element of body
		}
		// locate relevant info in DOM tree
		var wedgeNode = document.getElementById (wedgeId);						// wedge image node
		var rootNode = document.getElementById (rootId);						// embedding div node
		var rootClass = rootNode.className;										// class of root node
		// create request elements
		var serverUrl = '/activeRenderer/';
		if (! document.getElementById ('served'))
			serverUrl = 'http://services.activerenderer.com' + serverUrl;
		var cssClassLevel = rootClass.replace (/[a-z]+/gi, '');					// root node outline level
		var cssClassName = rootClass.replace (/[0-9]+/gi, '');					// root node class radix
		var uniqId = String (Math.random ()).substr(2,5);						// unique prefix for transcluded node ids
		if (macMSIE || safari) {
			// open new window for transcluded content
			var xAnchor = screen.width - (640 + 20);
			var yAnchor = 5;
			var xWidth = 640;
			var yHeight = 400;			
			var renderRequest = serverUrl + 'render/?src=' + url + '&flDisplayHTMLWedge=yes&action=render';
			window.open (renderRequest, 'Related', 'width=' + xWidth + ', left=' + xAnchor + ', height=' + yHeight + ', top=' + yAnchor);
		} else {
			// expand node
			wedgeNode.className = 'pendingWedge';								// update wedge's image
			wedgeNode.title = 'loading...';
			wedgeNode.onmouseover = '';
			wedgeNode.onmouseout = '';
			wedgeNode.setAttribute ('source', url);
			var expandedNode = document.createElement ('div');					// create embedding element
			expandedNode.id = nodeId;
			expandedNode.className ='expanded';
			expandedNode.title = cssClassName;
			rootNode.appendChild (expandedNode);								// insert embedding element
			targetNode = expandedNode;
			targetRoot = wedgeNode;
		
			// load buffer with rendered outline script
			var renderRequest = serverUrl + 'jsrender/?src=' + url + '&cssClassName=' + cssClassName + '&cssClassLevel=' + cssClassLevel + '&uniqId=' + uniqId + context + '&flDisplayHTMLWedge=yes&action=submit';
			var theEl = document.createElement ('script');
			theEl.src = renderRequest;
			document.getElementById ('buffer').appendChild (theEl);
		}
	}
}
function includeHtml (s) {
	var nodeId = "p" + targetRoot.id.substr (1);
	targetRoot.className = 'openedWedge';										// update wedge image
	targetRoot.title = 'collapse';
	targetRoot.onmouseover = nodeHigh;
	targetRoot.onmouseout = nodeLow;
	targetRoot.setAttribute ('onclick', '');
	targetRoot.onclick = nodeSwitch;
	targetNode.innerHTML = s;													// insert transcluded HTML
}

function imgLoad (nodeId, url) {												// load image at url into browser cache
	var wedgeId = "i" + nodeId.substr (1);
	if (document.getElementById) {												// update wedge's image
		var wedgeNode = document.getElementById (wedgeId);
		wedgeNode.className = 'pendingWedge';
		wedgeNode.title = 'loading...';
		wedgeNode.source = url;													// create custom attribute for transcluded content's source
	}
   	cachedImg.nodeId = nodeId;													// load image in cache
   	cachedImg.onload = imgTakeABreath;
   	cachedImg.src = url;
}
function imgTakeABreath () { 													// allow for Mac MSIE and Mozilla to catch up
    setTimeout ("imgSwitch ()", 0);   											// ugh!
}
function imgSwitch() {															// actual image transclusion starts here
	var nodeId = cachedImg.nodeId;
	var wedgeId = "i" + nodeId.substr (1);
	var rootId = "r" + nodeId.substr (1);
	var refId = "x" + nodeId.substr (1);
	if (document.getElementById) {
		// locate relevant info in DOM tree
		var wedgeNode = document.getElementById (wedgeId);						// wedge image node
		var rootNode = document.getElementById (rootId);						// embedding div node
		var rootClass = rootNode.className;										// class of root node
		var cssClassLevel = rootClass.replace (/[a-z]+/gi, '');					// root node outline level
		var cssClassName = rootClass.replace (/[0-9]+/gi, '');					// root node class radix
		//expand node
		var expandedNode = document.createElement ('div');						// create embedding div
		expandedNode.id = cachedImg.nodeId;
		expandedNode.className = 'expanded';
		expandedNode.title = 'active';
		rootNode.appendChild (expandedNode);									// insert embedding element
		var mediaNode = document.createElement ('div');							// create embedding div for transcluded media
		mediaNode.className = cssClassName + String (Number (cssClassLevel) + 1);
		expandedNode.appendChild (mediaNode);									// insert embedding div for transcluded media
		var includedLink = document.createElement ('a');						// create a link for the included image
		includedLink.href = cachedImg.src;
		includedLink.target = '_blank';
		includedLink.title = 'view full size';
		mediaNode.appendChild (includedLink);									// insert link
		var includedImg = document.createElement ('img');						// create the transcluded image
		includedImg.border = '0';
		includedImg.hspace = '0';
		includedImg.vspace = '8';
		includedImg.alt = 'included image';
		includedImg.src = cachedImg.src;										// set the image's url
		var expandedWidth;
		if (document.defaultView && document.defaultView.getComputedStyle) {	// get embedding element's width
			expandedWidth = parseInt (document.defaultView.getComputedStyle (expandedNode, '').getPropertyValue ('width'));
		} else {
			expandedWidth = parseInt (rootNode.offsetWidth) - (16 + 4);
		}
		if (expandedWidth < cachedImg.width) {									// adjust size if greater than embedding element
			includedImg.width = expandedWidth;
			includedImg.height = (cachedImg.height / cachedImg.width) * expandedWidth;
		}
		includedLink.appendChild (includedImg);									// insert image
		// update wedge
		wedgeNode.className = 'openedWedge';
		wedgeNode.title = 'collapse';
		wedgeNode.setAttribute ('source', cachedImg.src);						// create custom attribute for transcluded content's source
		wedgeNode.setAttribute ('onclick', '');
		wedgeNode.onclick = nodeSwitch;
		wedgeNode.onmouseover = nodeHigh;
		wedgeNode.onmouseout = nodeLow;
	}
}

function mmLoad (nodeId, url) { 												// load multimedia object at url into browser cache
	var wedgeId = "i" + nodeId.substr (1);
	var rootId = "r" + nodeId.substr (1);
	var refId = "x" + nodeId.substr (1);
	var uniqId = String (Math.random ()).substr(2,5);							// unique prefix for media node id
	var ioObject = "f" + nodeId.substr (1);
	var urlType = 'video/quicktime';
	if (url.substring (url.length - 3, url.length) == 'swf') {
		urlType = 'application/x-shockwave-flash';
	}
	if (document.getElementById) {
		// locate relevant info in DOM tree
		var wedgeNode = document.getElementById (wedgeId);						// wedge image element
		var rootNode = document.getElementById (rootId);						// embedding div node
		var rootClass = rootNode.className;										// class of root node
		var cssClassLevel = rootClass.replace (/[a-z]+/gi, '');					// root node outline level
		var cssClassName = rootClass.replace (/[0-9]+/gi, '');					// root node class radix
		// expand node
		var expandedNode = document.createElement ('div');
		expandedNode.id = nodeId;
		expandedNode.className = 'expanded';
		expandedNode.title = 'active';
		rootNode.appendChild (expandedNode);									// insert embedding element
		var mediaNode = document.createElement ('div');							// create embedding div for transcluded media
		mediaNode.className = cssClassName + String (Number (cssClassLevel) + 1);
		mediaNode.id = "r" + uniqId
		expandedNode.appendChild (mediaNode);									// insert embedding div for transcluded media
		var expandedWidth;
		if (document.defaultView && document.defaultView.getComputedStyle) {	// get embedding element's width W3C style
			expandedWidth = parseInt (document.defaultView.getComputedStyle (expandedNode, '').getPropertyValue ('width')) - 16;
		} else {																// or get it a la IE
			var border = isWin ? (15 + 4) : 4;
			expandedWidth = parseInt (rootNode.offsetWidth) - border;
		}
		var embeddedstring = '<a href="' + url + '" target="_blank" title="view full size"><img src="/activeRenderer/img/zoomIn.gif" align="right" border="0" alt="view full size"></a><embed name="' + ioObject + '" bgcolor="#ffffff" width="' + expandedWidth + '" type="' + urlType + '" src="' + url + '"></embed>';
		mediaNode.innerHTML = embeddedstring;
		// update wedge
		wedgeNode.className = 'openedWedge';
		wedgeNode.title = 'collapse';
		wedgeNode.setAttribute ('source', url);									// create custom attribute for transcluded content's source
		wedgeNode.setAttribute ('onclick', '');
		wedgeNode.onclick = nodeSwitch;
		wedgeNode.onmouseover = nodeHigh;
		wedgeNode.onmouseout = nodeLow;
	}
}
function pageLoad (nodeId, url) {
	if (url.indexOf ("##") != -1) {												// macros found in the url
		var textId = "t" + nodeId.substr (1);
		var rootId = "r" + nodeId.substr (1);
		var nodeText = document.getElementById (textId).innerHTML;				// get node text
		nodeText = nodeText.replace ( / /g, '+');
		var docTitle = document.title;											// default title text
		if (document.getElementById ('titleDiv')) {								// update title
			docTitle = document.getElementById ('titleDiv').innerHTML;
		}
		docTitle = docTitle.replace ( / /g, '+');
		var parentText = '';													// default parent text
		if (document.getElementById (rootId) && document.getElementById (rootId).parentNode) {		// update parent
			var realNode = document.getElementById (rootId).parentNode;
			while (realNode.nodeType && realNode.nodeType != 1) {				// allow for possible blank text before real parent
				realNode = realNode.parentNode;
			}
			if (document.getElementById (rootId).parentNode.id && document.getElementById (rootId).parentNode.id.match (/^p/)) {
				var parentTextId = "t" + document.getElementById (rootId).parentNode.id.substr (1);
				parentText = document.getElementById (parentTextId).innerHTML;
				parentText = parentText.replace ( / /g, '+');
			}
		}
		var previousText = '';													// default previous node text
		if (document.getElementById (rootId) && document.getElementById (rootId).previousSibling) {	// update previous
			var realNode = document.getElementById (rootId).previousSibling;
			while (realNode && realNode.nodeType != 1) {						// allow for possible blank text between siblings
				realNode = realNode.previousSibling;
			}
			if (realNode && realNode.id && realNode.id.match (/^r/)) {
				var previousTextId = "t" + realNode.id.substr (1);
				previousText = document.getElementById (previousTextId).innerHTML;
				previousText = previousText.replace ( / /g, '+');
			}
		}
		var nextText = '';														// default next node text
		if (document.getElementById (rootId) && document.getElementById (rootId).nextSibling) {		// update next
			var realNode = document.getElementById (rootId).nextSibling;
			while (realNode && realNode.nodeType != 1) {						// allow for possible blank text between siblings
				realNode = realNode.nextSibling;
			}
			if (realNode && realNode.id && realNode.id.match (/^r/)) {
				var nextTextId = "t" + realNode.id.substr (1);
				nextText = document.getElementById (nextTextId).innerHTML;
				nextText = nextText.replace ( / /g, '+');
			}
		}
		url = url.replace (/##( *)?self( *)?##/ig, nodeText);					// replace macros
		url = url.replace (/##( *)?title( *)?##/ig, docTitle);
		url = url.replace (/##( *)?parent( *)?##/ig, parentText);
		url = url.replace (/##( *)?previous( *)?##/ig, previousText);
		url = url.replace (/##( *)?next( *)?##/ig, nextText);
	}
	var w = window.open (url, 'linked');										// open link in new window
}
function sndLoad (nodeId, url) { 												// load sound object at url into browser cache
	var wedgeId = "i" + nodeId.substr (1);
	var rootId = "r" + nodeId.substr (1);
	var refId = "x" + nodeId.substr (1);
	var ioObject = "f" + nodeId.substr (1);
	var uniqId = String (Math.random ()).substr(2,5);							// unique prefix for media node id
	var urlType = 'audio/quicktime';
	if (document.getElementById) {
		// locate relevant info in DOM tree
		var wedgeNode = document.getElementById (wedgeId);						// wedge image element
		var rootNode = document.getElementById (rootId);						// embedding div node
		var rootClass = rootNode.className;										// class of root node
		var cssClassLevel = rootClass.replace (/[a-z]+/gi, '');					// root node outline level
		var cssClassName = rootClass.replace (/[0-9]+/gi, '');					// root node class radix
		// expand node
		var expandedNode = document.createElement ('div');
		expandedNode.id = nodeId;
		expandedNode.className = 'expanded';
		expandedNode.title = 'active';
		rootNode.appendChild (expandedNode);									// insert embedding element
		var mediaNode = document.createElement ('div');							// create embedding div for transcluded media
		mediaNode.className = cssClassName + String (Number (cssClassLevel) + 1);
		mediaNode.id = "r" + uniqId
		expandedNode.appendChild (mediaNode);									// insert embedding div for transcluded media
		var expandedWidth;
		if (document.defaultView && document.defaultView.getComputedStyle) {	// get embedding element's width W3C style
			expandedWidth = parseInt (document.defaultView.getComputedStyle (expandedNode, '').getPropertyValue ('width')) - 16;
		} else {																// or get it a la IE
			var border = isWin ? (15 + 4) : 4;
			expandedWidth = parseInt (rootNode.offsetWidth) - border;
		}
		var embeddedstring = '<embed name="' + ioObject + '" width="' + expandedWidth + '" bgcolor="#ffffff" height="16" type="' + urlType + '" src="' + url + '"></embed>';
		mediaNode.innerHTML = embeddedstring;
		// update wedge
		wedgeNode.className = 'openedWedge';
		wedgeNode.title = 'collapse';
		wedgeNode.setAttribute ('source', url);									// create custom attribute for transcluded content's source
		wedgeNode.setAttribute ('onclick', '');
		wedgeNode.onclick = nodeSwitch;
		wedgeNode.onmouseover = nodeHigh;
		wedgeNode.onmouseout = nodeLow;
	}
}
