/*	
	Copyright (c) 2007 Adobe.com
	Swappable Pods
	$Id: swappod.js,v 1.8 2008/11/05 22:38:35 btapley Exp $
*/


function writeTextToId(id, text) {
	var t = document.createTextNode(text);
	var elm = $(id);
	
	if(!elm) return false;	
		
	try
	{
		elm.replaceChild(t,elm.firstChild);
	}
	catch(e)
	{
		elm.appendChild(t);
	}
	
	return t;
}


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


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

var PageMenu = Class.create({
	initialize: function(id, config) {
		this.containerID = id;
		this.labels = config.page_labels;
		this.per_page = config.per_page;
		this.current_page = config.current_page;
		this.item_total = config.item_total;
		return this;
	},
	init: function(id) {
		var br = new (Element)("br");
		br.className = " clear-both";
		var menu = this.createDOM(id);
		$(this.containerID).parentNode.appendChild(menu);
		$(this.containerID).parentNode.appendChild(br);
		return menu;
	},
	createDOM: function(id) {
		var m = new (Element)('dl', {
			"id": id,
			"class": "page menu"
 });
			
		var t = new (Element)('dt');
		var nextItem = new (Element)('dd');
		var prevItem = new (Element)('dd');
		var nextLink = new (Element)('a', {
			href:"#next"
 });
		var prevLink = new (Element)('a', {
			href:"#previous"
 });
		
		t.identify();
		prevItem.className = this.labels[1].id;
		nextItem.className = this.labels[2].id;
		
		writeTextToId(t,this.labels[0].text);
		writeTextToId(prevLink,this.labels[1].text);
		writeTextToId(nextLink,this.labels[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.prevItem.observe("click", this.prev.bindAsEventListener(this));
		this.nextItem.observe("click", this.next.bindAsEventListener(this));
		
		this.updateDOM(); //refresh page title display before it's attached to the DOM
		
		return this.menu;
	},
	next: function(event) {
		event.stop();
		
		if(this.current_page == this.item_total) { return; }
		
		var pageNum = this.current_page+this.per_page;
		
		if(pageNum >= this.item_total) {
			this.current_page = this.item_total;
		} else {
			this.current_page = pageNum;
		}
		
		this.menu.fire("pagegui:next");
		
		this.updateDOM();
	},
	prev: function(event) {
		event.stop();
		
		if(this.current_page == 1) { return; }
		
		var pageNum = this.current_page-this.per_page;
		
		if(pageNum < 1) { 
			this.current_page = 1;
		} else {
			this.current_page = pageNum;
		}

		this.menu.fire("pagegui:prev");
		
		this.updateDOM();
	},
	updateDOM: function() {
		
		var t =  _proxy_jslib_handle(this.labels[0].text, 'replace', '', 1, 0)("#current#", this.current_page);
		t =  _proxy_jslib_handle(t, 'replace', '', 1, 0)("#total#", this.item_total);
		
		writeTextToId(this.title, t);
		
		if(this.current_page == 1) {
			this.prevCtrl = this.prevItem.firstDescendant().remove();
			if(!this.nextCtrl.parentNode || !this.nextCtrl.parentElement) {
				this.nextItem.appendChild(this.nextCtrl);	
			} 
		}
		
		else if(this.current_page == this.item_total) {
			this.nextCtrl = this.nextItem.firstDescendant().remove();
			if(!this.prevCtrl.parentNode || !this.prevCtrl.parentElement) {
				this.prevItem.appendChild(this.prevCtrl);
			}
		}
		else {
			if(!this.nextCtrl.parentNode || !this.nextCtrl.parentElement) {
				this.nextItem.appendChild(this.nextCtrl);
			}
			if(!this.prevCtrl.parentNode || !this.prevCtrl.parentElement) {
				this.prevItem.appendChild(this.prevCtrl);
			}
		}
		
		return;
	}
});

var PageManager = Class.create({
	initialize: function(dataObj, perPage) {
		this.targetDOM = "";
		this.data = dataObj;
		this.currPageIndex = 0;
		this.lastPageIndex = dataObj.pages.length-1;
		this.itemsPerPage = perPage || 1;
		this.views = new (Array)(dataObj.pages.length); //create an empty array the length of the pages
	},
	init: function(id, index) {
		this.targetDOM = id;
		this.setView( _proxy_jslib_handle(this.data.pages, (index||0), 0, 0));
		if(this.lastPageIndex > 0) {
			this.menu = new (PageMenu)(this.targetDOM, {
				page_labels: this.data.menuitems,
				current_page: this.currPageIndex+1, // shift zero indexing
				per_page: this.itemsPerPage,
				item_total: this.lastPageIndex+1  
 });
			this.menu.init(id+'-menu');
		}
		
		$(id+'-menu').observe("pagegui:next", this.handleNextView.bindAsEventListener(this));
		$(id+'-menu').observe("pagegui:prev", this.handlePrevView.bindAsEventListener(this));
	},
	handleNextView: function(event) {
		var data =  _proxy_jslib_handle(this.data.pages, (this.currPageIndex+this.itemsPerPage), 0, 0);
		if(!data) return;
		this.currPageIndex++;
		this.setView(data);
	},
	handlePrevView: function(event) {
		var data =  _proxy_jslib_handle(this.data.pages, (this.currPageIndex-this.itemsPerPage), 0, 0);
		if(!data) return;
		this.currPageIndex--;
		this.setView(data);
	},
	setView: function(data) {
		var elem = $(this.targetDOM);
		var node =  _proxy_jslib_handle(this.views, (this.currPageIndex), 0, 0) || ( _proxy_jslib_assign('', this.views, (this.currPageIndex), '=', ( this.createContentView(data))));
		elem.parentNode.replaceChild(node,elem);
		this.targetDOM = data.id;
		return false;
	},
	createContentView: function(data) {	
		var div = new (Element)('div', {
			id: data.id
 }),
		quirksmode = (document.all && document.compatMode != "CSS1Compat");
		
		if(quirksmode) {
			div.setStyle({
				height: data.pageheight+"px",
				marginTop: 5+"px"
 });
		};
		
		div.setStyle({
			minHeight: data.pageheight+"px"
 });
	
		if(data.imgsrc) {
			var ia,
			pm = new (Element)("p"),
			m = new (Element)("img", {
				src: data.imgsrc,
				width: data.imgwidth,
				height: data.imgheight
 });
			
			if(data.imgborder) m.addClassName("border");
			if(data.imgalign) {
				if(this.imgalign == "center") {
					pm.addClassName("txtcenter");
				}
				else
				{	
					var c = PulloutManager.getStyle(data.imgwidth);
					if(c) {
						div.className = c;
						pm.className = "pullout-item";
						if(quirksmode) {
							pm.style.height = (data.pageheight-18)+"px"; //dumbfounded
						}
					}
				}
			}
			if(data.imghref) {
				ia = new (Element)('a', {
					href: data.imghref
 });
				div.appendChild(pm).appendChild(ia).appendChild(m);
			} else {
				div.appendChild(pm).appendChild(m);
			}
		}
		
		if(data.titletext) 
		{
			var ha,
			h = new (Element)("h"+data.titlelevel);
			
			if(data.titlehref) {
				ha = new (Element)('a', {
					href: data.titlehref
 });
				ha.appendChild(document.createTextNode(data.titletext+" ›"));
			} else {
				ha = document.createTextNode(data.titletext);
			}
			h.appendChild(ha);
			div.appendChild(h);
		}
		if(data.textshort) {
			var p = new (Element)("p");
			var t = data.textshort;
			if(data.textcite) {
				t = '"'+t+'"';
				var bq = new (Element)("blockquote");
				var ct = new (Element)("cite");
				ct.appendChild(document.createTextNode(data.textcite));
				bq.appendChild(p);
				bq.appendChild(ct);
			}
			p.appendChild(document.createTextNode(t));
			if(data.textcite) p = bq;
			div.appendChild(p);
		}
		if(data.linkhref)  {
			var p = new (Element)("p");
			var a = new (Element)("a", {
				href: data.linkhref
 });
			
			var lt = data.linktext || 'Learn more';
			a.appendChild(document.createTextNode((lt+" ›")));
			p.appendChild(a);
			div.appendChild(p);
		}
	
		return div;
	}
});
 ;
_proxy_jslib_flush_write_buffers() ;