/* Swap Pod */

Function.prototype.bindEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}
function writeTextToId(id, text) {
	var t = document.createTextNode(text);
	var elm = (isString(id)) ? $(id) : id;
	
	if(!elm) return false;	
		
	try
	{
		elm.replaceChild(t,elm.firstChild);
	}
	catch(e)
	{
		elm.appendChild(t);
	}
	
	return t;
}
function requestPropertyAtIndex(prop, i) {
	return this[prop][i];
}

var CachedElement = {
	uberElements:{},
	cacheElement:function(name) {
		return CachedElement.uberElements[name]=document.createElement(name);
	},
	create:function(name) {
		var query = CachedElement.uberElements[name] || CachedElement.cacheElement(name);
		return query.cloneNode(false);
	}
}

/*--------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------------*/

PulloutManager = {
	itemsizes: [190, 180, 125, 112, 100, 80, 72, 60, 51, 40, 15],
	
	addSize: function()
	{
		var i = this.lookupSize(num);
		if(!this.itemsizes[i]) return this.itemsizes.unshift(num);
		if(this.itemsizes[i] == num) return;
		this.itemsizes.splice( i+1, 0, num );
		return this.itemsizes.length;
	},
	
	getStyle: function(num, side) {
		var side = (side || "left").toLowerCase();
		var size = this.itemsizes[this.lookupSize(num)];
		return (size) ? ("pullout-"+side+" "+side+"-"+size) : "";
	},
	
	lookupSize: function(num) {
		var i = this.itemsizes.length-1;
		do
		{
			if(this.itemsizes[i] >= num) 
			{
				break;
			}
		}
		while(i--);
		return i;
	}
}

PageMenu = function(obj)
{
	this.parentObj = obj; //this is embarassing, but my mind fatigued can't figure a way to *apply* this and get everything i need
	this.data = this.parentObj.data;  //more embarassing still.
	return this;	
}
PageMenu.prototype.init = function(id)
{
	var br = CachedElement.create("br");
	br.className = " clear-both";
	$(this.parentObj.targetDOM).parentNode.appendChild(this.createDOM(id));
	$(this.parentObj.targetDOM).parentNode.appendChild(br);
}
PageMenu.prototype.createDOM = function(id)
{
	var m = CachedElement.create('dl');
	var t = CachedElement.create('dt');
	var nextItem = CachedElement.create('dd');
	var prevItem = nextItem.cloneNode(false);
	var nextLink = CachedElement.create('a');
	var prevLink = nextLink.cloneNode(false);
	
	m.className = "page menu compact";
	t.setAttribute('id', this.data.menuitems[0].id);
	prevItem.className = this.data.menuitems[1].id;
	nextItem.className = this.data.menuitems[2].id;
	
	writeTextToId(t,this.data.menuitems[0].text);
	writeTextToId(prevLink,this.data.menuitems[1].text);
	writeTextToId(nextLink,this.data.menuitems[2].text);
	
	m.appendChild(t);
	m.appendChild(prevItem);
	m.appendChild(nextItem);
	prevItem.appendChild(prevLink);
	nextItem.appendChild(nextLink);
	
	this.menu = m;
	this.title = t;
	this.prevItem = prevItem;
	this.nextItem = nextItem;
	this.prevCtrl = prevLink;
	this.nextCtrl = nextLink;
	
	this.prevCtrlInIEDomTree = true; //removeChild not returning expected result in IE
	this.nextCtrlInIEDomTree = true; //removeChild not returning expected result in IE
	
	this.prevItem.onclick = this.prev.bindEventListener(this);
	this.nextItem.onclick = this.next.bindEventListener(this);
	
	this.prevCtrl.setAttribute("href", "#previous");
	this.nextCtrl.setAttribute("href", "#next");
	
	this.updateDOM(); //refresh page title display before it's attached to the DOM
	
	return this.menu;
}
PageMenu.prototype.next = function(evt)
{
	var newpage = requestPropertyAtIndex.call(this.data, "pages", this.parentObj.currPageIndex+1); //bad
	if(!newpage) return;
	this.parentObj.currPageIndex++; //bad
	
	this.parentObj.setView(evt, this.parentObj.currPageIndex); //omg, bad
	this.updateDOM();
	(evt.preventDefault) ? evt.preventDefault() : evt.returnValue = false;
}
PageMenu.prototype.prev = function(evt)
{
	var newpage = requestPropertyAtIndex.call(this.data, "pages", this.parentObj.currPageIndex-1); //bad
	if(!newpage) return;

	this.parentObj.currPageIndex--; //crap alert
	
	this.parentObj.setView(evt, this.parentObj.currPageIndex); //omg, bad
	this.updateDOM();
	(evt.preventDefault) ? evt.preventDefault() : evt.returnValue = false;
}
PageMenu.prototype.updateDOM = function()
{
	var pageNum = this.parentObj.currPageIndex+1;
	
	var t = this.data.menuitems[0].text.replace("#current#", pageNum);
	t = t.replace("#total#", this.parentObj.lastPageIndex+1);
	
	writeTextToId(this.title, t);
	
	if(pageNum == 1) 
	{
		this.prevCtrlInIEDomTree = false;
		this.prevCtrl = this.prevItem.removeChild(this.prevItem.firstChild);
		
	}
	else if(pageNum == this.parentObj.lastPageIndex+1) 
	{
		this.nextCtrlInIEDomTree = false;
		this.nextCtrl = this.nextItem.removeChild(this.nextItem.firstChild);
		//this.nextCtrl.className = "off";
	}
	else
	{
		if(!this.nextCtrl.parentNode || !this.nextCtrlInIEDom) this.nextItem.appendChild(this.nextCtrl);
		if(!this.prevCtrl.parentNode || !this.prevCtrlInIEDom) this.prevItem.appendChild(this.prevCtrl);
		this.nextCtrlInIEDomTree = true;
		this.prevCtrlInIEDomTree = true;
	}
	return;
}

function writeAttribute(name, value) {
	return [name,'=','"',value,'"'].join("");
}

function buildContentSpot()
{	
	var div = CachedElement.create('div');
	div.setAttribute("id", this.id);
	
	if(com.adobe.cssprofile.features.iebox) //need to make a minheight test feature
	{
		div.style.height = this.pageheight+"px";
	}
	else
	{
		div.setAttribute("style", ("min-height:"+this.pageheight+"px"));
	}

	if(this.imgsrc) 
	{
		var pm = CachedElement.create("p");
		var m = CachedElement.create("img");
		m.setAttribute("src", this.imgsrc);
		m.setAttribute("width", this.imgwidth);
		m.setAttribute("height", this.imgheight);
		
		if(this.imgborder) m.className="image-border";
		if(this.imgalign)
		{
			if(this.imgalign == "center") 
			{
				pm.className = "txtcenter";
			}
			else
			{	
				var c = PulloutManager.getStyle(this.imgwidth);
				if(c) 
				{
					div.className = c;
					pm.className = "pullout-item";
					if(com.adobe.cssprofile.features.iebox) pm.style.height = (this.pageheight-18)+"px"; //dumbfounded
				}
			}
			
		}
		div.appendChild(pm).appendChild(m);
	}
	
	if(this.titletext) 
	{
		var h = CachedElement.create("h"+this.titlelevel);
		var ha;
		if(this.titlehref)
		{
			ha = CachedElement.create('a');
			ha.setAttribute("href", this.titlehref);
			ha.appendChild(document.createTextNode(this.titletext+" ›"));
		}
		else
		{
			ha = document.createTextNode(this.titletext);
		}
		h.appendChild(ha);
		div.appendChild(h);
	}
	if(this.textshort)
	{
		var p = CachedElement.create("p");
		var t = this.textshort;
		if(this.textcite) 
		{
			t = '"'+t+'"';
			var bq = CachedElement.create("blockquote");
			var ct = CachedElement.create("cite");
			ct.appendChild(document.createTextNode(this.textcite));
			bq.appendChild(p);
			bq.appendChild(ct);
		}
		p.appendChild(document.createTextNode(t));
		if(this.textcite) p = bq;
		div.appendChild(p);
	}
	if(this.linkhref) 
	{
		var p = CachedElement.create("p");
		var a = CachedElement.create("a");
		a.href = this.linkhref;
		var lt = this.linktext || 'Learn more';
		a.appendChild(document.createTextNode((lt+" ›")));
		p.appendChild(a);
		div.appendChild(p);
	}
/*	
*/
	return div;
}

PageManager = function(dataObj)
{
	this.targetDOM = "";
	this.data = dataObj;
	this.currPageIndex = -1;
	this.lastPageIndex = dataObj.pages.length-1;
	this.views = new Array(dataObj.pages.length); //create an empty array the length of the pages
}
PageManager.prototype.setView = function(evt,num)
{
	var elem = $(this.targetDOM);
	var node = this.views[num] || this.createView(num);

	this.currPageIndex = num;
	
	this.views[this.currPageIndex] = node;
	
	elem.parentNode.replaceChild(node,elem);
	
	this.targetDOM = this.data.pages[this.currPageIndex].id; //if the data expresses another ID, this will update the target
	
	return false;
}
PageManager.prototype.createView = function(num)
{
	return buildContentSpot.call(this.data.pages[num]);
}
PageManager.prototype.init = function(id, index)
{
	this.targetDOM = id;
	this.setView(null, (index || 0));
	if(this.lastPageIndex > 0) 
	{
		this.menu = new PageMenu(this);
		this.menu.init(id+'-menu');
	}
}