function Utilities(){}
Utilities.Constants={"ITEM_DELIMITER":",,","GROUP_DELIMITER":"@@"};Utilities.generateIDNumber=function(){var timestamp=new Date().getTime();var rand=parseInt((Math.random()*100000));return timestamp+rand;};Utilities.DefaultWindow=window;Utilities.Window=window;Utilities.Window.name="n"+Utilities.generateIDNumber();Utilities.setWindow=function(win){Utilities.Window=win;};Utilities.resetWindow=function(){Utilities.Window=Utilities.DefaultWindow;};if(!Utilities.Window.Node)
{Utilities.Node={ELEMENT_NODE:1,ATTRIBUTE_NODE:2,TEXT_NODE:3,CDATA_SECTION_NODE:4,ENTITY_REFERENCE_NODE:5,ENTITY_NODE:6,PROCESSING_INSTRUCTION_NODE:7,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_TYPE_NODE:10,DOCUMENT_FRAGMENT_NODE:11,NOTATION_NODE:12};}
else
{Utilities.Node=Utilities.Window.Node;}
Utilities.Browser={init:function(){this.browser=this.searchString(this.dataBrowser)||"An unknown browser";this.version=this.searchVersion(Utilities.Window.navigator.userAgent)||this.searchVersion(Utilities.Window.navigator.appVersion)||"an unknown version";this.OS=this.searchString(this.dataOS)||"an unknown OS";this.isIpod=this.browser=="iPod";this.isIphone=this.browser=="iPhone";this.isOpera=this.browser=="Opera";this.isMozilla=this.browser=="Firefox"||this.browser=="Mozilla"||this.browser=="Netscape";this.isSafari=this.browser=="Safari";this.isIE=this.browser=="Internet Explorer";this.isiCab=this.browser=="iCab";this.isMac=this.OS=="Mac";this.isWin=this.OS=="Windows";this.isLinux=this.OS=="Linux";this.tested_intra=false;if(this.browser=="Firefox"&&parseFloat(this.version)>=1.5)this.tested_intra=true;else if(this.browser=="Safari"&&parseInt(this.version)>=412)this.tested_intra=true;else if(this.browser=="AppleWebKit/KHTML"&&parseInt(this.version)>=418)this.tested_intra=true;else if(this.browser=="SeaMonkey"&&parseFloat(this.version)>=1)this.tested_intra=true;else if(this.browser=="Camino"&&parseInt(this.version)>=1)this.tested_intra=true;else if(this.browser=="iPhone"||this.browser=="iPod")this.tested_intra=true;this.tested_inter=this.tested_intra;if(this.browser=="Internet Explorer"&&parseInt(this.version)>=7)this.tested_inter=true;else if(this.browser=="Opera"&&parseInt(this.version)>=9)this.tested_inter=true;else if(this.browser=="OmniWeb"&&parseInt(this.version)>=607)this.tested_inter=true;else if(this.browser=="iCab"&&parseInt(this.version)>=3)this.tested_inter=true;var isCMS=(typeof _isCMS=="boolean")?_isCMS:false;if(isCMS&&!this.tested_intra)Utilities.Window.location="https://journalism.indiana.edu/apps/browser_check/";},searchString:function(data){for(var i=0;i<data.length;i++)
{var dataString=data[i].string;var dataProp=data[i].prop;this.versionSearchString=data[i].versionSearch||data[i].identity;if(dataString)
{if(dataString.indexOf(data[i].subString)!=-1)
return data[i].identity;}
else if(dataProp)
return data[i].identity;}
return"";},searchVersion:function(dataString){var index=dataString.indexOf(this.versionSearchString);if(index==-1)return"";var tmp=dataString.substring(index+this.versionSearchString.length+1);index=tmp.search(/[^\.0-9]/);if(index==-1)
return tmp;return tmp.substring(0,index);},dataBrowser:[{string:Utilities.Window.navigator.userAgent,subString:"MSIE",identity:"Internet Explorer",versionSearch:"MSIE"},{string:Utilities.Window.navigator.userAgent,subString:"iPhone",identity:"iPhone"},{string:Utilities.Window.navigator.userAgent,subString:"iPod",identity:"iPod"},{string:Utilities.Window.navigator.vendor,subString:"Apple",identity:"Safari"},{string:Utilities.Window.navigator.vendor,subString:"KDE",identity:"Konqueror"},{string:Utilities.Window.navigator.userAgent,subString:"OmniWeb",versionSearch:"OmniWeb/",identity:"OmniWeb"},{string:Utilities.Window.navigator.userAgent,subString:"AppleWebKit",versionSearch:"AppleWebKit",identity:"AppleWebKit/KHTML"},{string:Utilities.Window.navigator.userAgent,subString:"Firefox",identity:"Firefox"},{string:Utilities.Window.navigator.vendor,subString:"Camino",identity:"Camino"},{string:Utilities.Window.navigator.userAgent,subString:"iCab",identity:"iCab"},{string:Utilities.Window.navigator.userAgent,subString:"Netscape",identity:"Netscape"},{string:Utilities.Window.navigator.userAgent,subString:"SeaMonkey",identity:"SeaMonkey"},{string:Utilities.Window.navigator.userAgent,subString:"Gecko",identity:"Mozilla",versionSearch:"rv"},{string:Utilities.Window.navigator.userAgent,subString:"Mozilla",identity:"Netscape",versionSearch:"Mozilla"},{string:Utilities.Window.navigator.userAgent,subString:"Opera",identity:"Opera"},{string:Utilities.Window.navigator.vendor,subString:"iCab",identity:"iCab"}],dataOS:[{string:Utilities.Window.navigator.platform,subString:"Win",identity:"Windows"},{string:Utilities.Window.navigator.platform,subString:"Mac",identity:"Mac"}]};Utilities.Browser.init();Utilities.getWindowHeight=function(){var doc=Utilities.Window.document;if(self.innerHeight)
return self.innerHeight;else if(doc.documentElement&&doc.documentElement.clientHeight)
return doc.documentElement.clientHeight;else if(doc.body)
return doc.body.clientHeight;return 0;};Utilities.getWindowWidth=function(){var doc=Utilities.Window.document;if(self.innerWidth)
return self.innerWidth;else if(doc.documentElement&&doc.documentElement.clientWidth)
return doc.documentElement.clientWidth;else if(doc.body)
return doc.body.clientWidth;return 0;};Utilities.WindowTypeDimensions={"SmallX":"320","SmallY":"240","TallX":"320","TallY":"400","MidSmallY":"335","MidSmallX":"420","WideSmallX":"560","HDX":"1280","HDY":"720", "G11X":"640","G11Y":"480","MediumX":"640","MediumY":"480","MediumTallY":"680","LargeX":"800","LargeY":"600","MidLargeX":"850","LargeTallY":"768","XlargeX":"1024","XlargeY":"768"};if(Utilities.Browser.isOpera)
{Utilities.WindowTypeDimensions.MidSmallY=(parseInt(Utilities.WindowTypeDimensions.MidSmallY)+21)+""}
Utilities.WindowType={"POPUP_FIXED_SMALL":"height="+Utilities.WindowTypeDimensions.SmallY+",width="+Utilities.WindowTypeDimensions.SmallX,"POPUP_FIXED_MIDSMALL":"height="+Utilities.WindowTypeDimensions.MidSmallY+",width="+Utilities.WindowTypeDimensions.MidSmallX,"POPUP_FIXED_TALL":"height="+Utilities.WindowTypeDimensions.TallY+",width="+Utilities.WindowTypeDimensions.TallX,"POPUP_FIXED_MEDIUM":"height="+Utilities.WindowTypeDimensions.MediumY+",width="+Utilities.WindowTypeDimensions.MediumX,"POPUP_FIXED_MEDIUM_TALL":"height="+Utilities.WindowTypeDimensions.MediumTallY+",width="+Utilities.WindowTypeDimensions.MediumX,"POPUP_FIXED_LARGE":"height="+Utilities.WindowTypeDimensions.LargeY+",width="+Utilities.WindowTypeDimensions.LargeX,"POPUP_FIXED_XLARGE":"height="+Utilities.WindowTypeDimensions.XlargeY+",width="+Utilities.WindowTypeDimensions.XlargeX,"POPUP_SMALL":"height="+Utilities.WindowTypeDimensions.SmallY+",width="+Utilities.WindowTypeDimensions.SmallX+",resizable","POPUP_MIDSMALL":"height="+Utilities.WindowTypeDimensions.MidSmallY+",width="+Utilities.WindowTypeDimensions.MidSmallX+",resizable","POPUP_WIDESMALL":"height="+Utilities.WindowTypeDimensions.MidSmallY+",width="+Utilities.WindowTypeDimensions.WideSmallX+",resizable","POPUP_HD":"height="+Utilities.WindowTypeDimensions.HDY+",width="+Utilities.WindowTypeDimensions.HDX
+",resizable","POPUP_G11":"height="+Utilities.WindowTypeDimensions.G11Y+",width="+Utilities.WindowTypeDimensions.G11X
+",resizable","POPUP_TALL":"height="+Utilities.WindowTypeDimensions.TallY+",width="+Utilities.WindowTypeDimensions.TallX+",resizable","POPUP_MEDIUM":"height="+Utilities.WindowTypeDimensions.MediumY+",width="+Utilities.WindowTypeDimensions.MediumX+",resizable","POPUP_MEDIUM_TALL":"height="+Utilities.WindowTypeDimensions.MediumTallY+",width="+Utilities.WindowTypeDimensions.MediumX+",resizable","POPUP_LARGE":"height="+Utilities.WindowTypeDimensions.LargeY+",width="+Utilities.WindowTypeDimensions.LargeX+",resizable","POPUP_LARGE_TALL":"height="+Utilities.WindowTypeDimensions.LargeTallY+",width="+Utilities.WindowTypeDimensions.LargeX+",resizable","POPUP_XLARGE":"height="+Utilities.WindowTypeDimensions.XlargeY+",width="+Utilities.WindowTypeDimensions.XlargeX+",resizable","POPUP_FIXED_SMALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.SmallY+",width="+Utilities.WindowTypeDimensions.SmallX+",scrollbars","POPUP_FIXED_MIDSMALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.MidSmallY+",width="+Utilities.WindowTypeDimensions.MidSmallX+",scrollbars","POPUP_FIXED_TALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.TallY+",width="+Utilities.WindowTypeDimensions.TallX+",scrollbars","POPUP_FIXED_MEDIUM_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.MediumY+",width="+Utilities.WindowTypeDimensions.MediumX+",scrollbars","POPUP_FIXED_MEDIUM_TALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.MediumTallY+",width="+Utilities.WindowTypeDimensions.MediumX+",scrollbars","POPUP_FIXED_LARGE_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.LargeY+",width="+Utilities.WindowTypeDimensions.LargeX+",scrollbars","POPUP_FIXED_XLARGE_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.XlargeY+",width="+Utilities.WindowTypeDimensions.XlargeX+",scrollbars","POPUP_SMALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.SmallY+",width="+Utilities.WindowTypeDimensions.SmallX+",resizable,scrollbars","POPUP_MIDSMALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.MidSmallY+",width="+Utilities.WindowTypeDimensions.MidSmallX+",resizable,scrollbars","POPUP_TALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.TallY+",width="+Utilities.WindowTypeDimensions.TallX+",resizable,scrollbars","POPUP_MEDIUM_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.MediumY+",width="+Utilities.WindowTypeDimensions.MediumX+",resizable,scrollbars","POPUP_MEDIUM_TALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.MediumTallY+",width="+Utilities.WindowTypeDimensions.MediumX+",resizable,scrollbars","POPUP_LARGE_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.LargeY+",width="+Utilities.WindowTypeDimensions.LargeX+",resizable,scrollbars","POPUP_LARGE_TALL_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.LargeTallY+",width="+Utilities.WindowTypeDimensions.LargeX+",resizable,scrollbars","POPUP_XLARGE_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.XlargeY+",width="+Utilities.WindowTypeDimensions.XlargeX+",resizable,scrollbars","POPUP_MIDLARGE_SCROLLBARS":"height="+Utilities.WindowTypeDimensions.LargeY+",width="+Utilities.WindowTypeDimensions.MidLargeX+",resizable,scrollbars"};Utilities.openIframeWindow=function(_url,_style,_id){var url=_url||"";var id=_id||"id"+Utilities.generateIDNumber();var windowHeight=Utilities.getWindowHeight();var heightDiff=windowHeight-Utilities.WindowTypeDimensions.LargeY;if(heightDiff>0)
{var height=Utilities.WindowTypeDimensions.LargeY;var marginTop=parseInt(heightDiff/2);}
else
{var height=windowHeight;var marginTop=0;}
var defaultStyles={"width":Utilities.WindowTypeDimensions.MidLargeX,"height":height,"style":"z-index:9999;position:fixed;display:block;top:0;left:50%;margin:"+marginTop+"px 0 0 -"+parseInt(Utilities.WindowTypeDimensions.MidLargeX/2)+"px;border:1px solid #000;background-color:#000;"};var style=typeof _style=="undefined"?defaultStyles:_style;if((Utilities.Browser.browser=="Internet Explorer"&&parseInt(Utilities.Browser.version)<8)||Utilities.Browser.isIphone||Utilities.Browser.isIpod)
return Utilities.openNewWindow(url,"height="+style.height+",width="+style.width+",resizable");if(url=="")return null;var doc=Utilities.Window.document;var iframe=doc.createElement("iframe");iframe.setAttribute("id",id);iframe.setAttribute("style",style);iframe.setAttribute("frameborder","0");iframe.setAttribute("width",style.width);iframe.setAttribute("height",style.height);if(style.style)
iframe.setAttribute("style",style.style);iframe.setAttribute("src",url+(url.indexOf("?")==-1?"?":"&")+"iframeid="+id);iframe.screenLock=Utilities.ScreenLock;iframe.removeMe=function(){this.screenLock.unlockScreen();this.parentNode.removeChild(this);};doc.getElementsByTagName("body")[0].appendChild(iframe);Utilities.ScreenLock.lockScreen();return id;};Utilities.openNewWindow=function(_url,_features,_name){var url=_url||"";var features=_features||"";var n=_name||"";n=n.replace(/^\s+/g,"").replace(/\s+$/g,"");if(n=="")
var n="n"+Utilities.generateIDNumber();var win=Utilities.Window.open(url,n,features,false);if(win==null)
{if(Utilities.Window.confirm("I couldn't open the link in a new window; should I load it in main window?"))
Utilities.Window.location.href=url;else
return win;}
else
{return win;}
return null;};Utilities.getHTTPObject=function(){if(Utilities.Window.XMLHttpRequest)
{try{return new XMLHttpRequest();}catch(e){return null;}}
else if(Utilities.Window.ActiveXObject)
{try{return new ActiveXObject("Microsoft.XMLHTTP");}catch(e){return null;}}
else return null;};Utilities.HttpRequest=function(obj){this.error=false;this.message="";this.defaultErrorResponse=function(response){var doc=Utilities.Window.document;if(Utilities.useDHTMLWindows)
{var error=doc.createElement("span");if(response&&response!="")
{error.appendChild(doc.createTextNode(response));}
Utilities.alertWindow({message:error});}
else
{var error="There was an error processing the response.\n";error+=obj.errorString?obj.errorString:"";error+=(!response||response=="")?"":"\nResponse: "+response;Utilities.alertWindow(error);}};if(!obj.URL||typeof obj.URL!="string")
{this.error=true;this.message="The given URL is invalid.";}
if(typeof obj.method!="string")
obj.method="GET";obj.method=obj.method.toUpperCase()=="POST"?"POST":"GET";if(typeof obj.parameters=="undefined")
obj.parameters="";if(typeof obj.parameters=="object")
obj.parameters=obj.parameters.join("&");if(obj.method=="GET"&&obj.parameters!="")
{if(obj.URL.indexOf("?")!=-1)
obj.URL+="&"+parameters.join("&");else
obj.URL+="?"+parameters.join("&");}
var processAsynchronously=true;if(obj.synchronous)
processAsynchronously=false;if(obj.username||obj.password)
{this.username=obj.username||"";this.password=obj.password||"";}
var processXML=false;if(obj.processXML)
processXML=true;var returnHttpObj=false;if(obj.returnHttpObj)
returnHttpObj=true;obj.defaultErrorResponse=this.defaultErrorResponse;if(!obj.onSuccess)
obj.onSuccess=function(){};if(!obj.onFailure)
obj.onFailure=function(){};if(obj.holder)
this.holder=obj.holder;this.http=null;obj.showWaitWindow=(typeof obj.showWaitWindow=="undefined")?false:(Utilities.useDHTMLWindows?obj.showWaitWindow:false);if(obj.showWaitWindow)
obj.waitWindow=null;var http=Utilities.getHTTPObject();if(http==null)
{this.error=true;this.message="Unable to create XMLHttpRequest object.";}
this.http=http;this.attemptRequest=function(){try
{if(obj.showWaitWindow)
{var doc=Utilities.Window.document;var waitWindowContent=doc.createElement("table");var tbody=doc.createElement("tbody");var tr=doc.createElement("tr");var td=doc.createElement("td");td.style.textAlign="left";td.appendChild(doc.createTextNode(obj.waitWindowMessage?obj.waitWindowMessage:"Please wait..."));tr.appendChild(td);var transferInterrupt=doc.createElement("input");transferInterrupt.setAttribute("type","button");transferInterrupt.value="Abort";Utilities.addEventHandler(transferInterrupt,"click",function(){http.abort();DHTMLWindow.closeDHTMLWindow(obj.waitWindow);});td=Utilities.Window.document.createElement("td");td.style.textAlign="right";td.appendChild(transferInterrupt);tr.appendChild(td);tbody.appendChild(tr);waitWindowContent.appendChild(tbody);waitWindowContent.style.width="100%";obj.waitWindow=DHTMLWindow.alertWindow({message:waitWindowContent});}
var _sendHandler=function(httpObj){if(httpObj.status!=200)
{var httpResponse=processXML?httpObj.responseXML:httpObj.responseText;obj.onFailure(httpResponse);}
else
{var httpResponse=processXML?httpObj.responseXML:httpObj.responseText;obj.onSuccess(httpResponse);}
if(obj.showWaitWindow&&Utilities.useDHTMLWindows)
DHTMLWindow.closeDHTMLWindow(obj.waitWindow);};if(this.username)
http.open(obj.method,obj.URL,processAsynchronously,this.username,this.password);else
http.open(obj.method,obj.URL,processAsynchronously);http.onreadystatechange=function(){if(!obj.synchronous&&http.readyState==4)_sendHandler(http);}
if(obj.method=="POST")
{http.setRequestHeader("Content-type","application/x-www-form-urlencoded");http.setRequestHeader("Content-length",obj.parameters.length);http.setRequestHeader("Connection","close");http.send(obj.parameters);}
else if(obj.method=="GET")
{http.setRequestHeader("If-Modified-Since","Sat, 1 Jan 2000 00:00:00 GMT");http.send(null);}
if(obj.synchronous)_sendHandler(http);}
catch(e)
{this.error=true;this.message="Unable to connect.";return;}};if(!obj.manualRequest)
this.attemptRequest();if(this.error)
Utilities.alertWindow(this.message);};Utilities.addEventHandler=function(el,eventType,f){if(el.addEventListener)
{el.addEventListener(eventType,f,false);}
else if(el.attachEvent)
{el["e"+eventType+f]=f;el[eventType+f]=function(){el["e"+eventType+f](Utilities.Window.event);}
el.attachEvent("on"+eventType,el[eventType+f]);}};Utilities.removeEventHandler=function(el,eventType,f){if(el.removeEventListener)
{el.removeEventListener(eventType,f,false);}
else if(el.detachEvent)
{el.detachEvent("on"+eventType,el[eventType+f]);el[eventType+f]=null;el["e"+eventType+f]=null;}};Utilities.cancelEventPropagation=function(e){if(!e)
{var _e=window.event;_e.cancelBubble=true;}
else if(e.stopPropagation)
{e.stopPropagation();}};Utilities.addClass=function(el,className){if(el.className=="")
el.className=className;else
el.className+=" "+className;};Utilities.removeClass=function(el,className){if(el.className==className)
{el.className="";}
else
{var regex=new RegExp("(\\W+)"+className+"\\W+","g");el.className=el.className.replace(regex,"$1");regex=new RegExp("^"+className+"\\W+","g");el.className=el.className.replace(regex,"");regex=new RegExp("\\W+"+className+"$","g");el.className=el.className.replace(regex,"");}};Utilities.hasClass=function(el,className){if(el==null)return false;var classes=el.className.replace(/\s+/g," ").split(" ");for(var i=0;i<classes.length;i++)
if(classes[i]==className)return true;return false;};Utilities.getElements=function(_rootNode,_nodeType,_comparator){var rootNode=_rootNode||Utilities.Window.document.body;var nType=isNaN(parseInt(_nodeType))||Utilities.Node.ELEMENT_NODE;var comparator=_comparator||null;var elArray=new Array();var r=rootNode,n=null,tmpAttr="";do
{n=r.firstChild;if(n==null)
{if(r.nodeType==nType)
{if(comparator&&comparator(r))
elArray.push(r);else if(comparator==null)
elArray.push(r);}
n=r.nextSibling;}
if(n==null)
{var tmp=r;do
{n=tmp.parentNode;if(n==rootNode)break;if(n.nodeType==nType)
{if(comparator&&comparator(n))
elArray.push(n);else if(comparator==null)
elArray.push(n);tmp=n;n=n.nextSibling;}}while(n==null);}
r=n;}while(r!=rootNode);return elArray;};Utilities.useDHTMLWindows=false;Utilities.dontPrintCSS="dontPrint";Utilities.alertWindow=function(_a){var a=(_a.message)?_a.message:_a;Utilities.Window.alert(a);return null;};Utilities.addEventHandler(Utilities.Window,"load",function(){Utilities.WindowType.FULL="height="+Utilities.getWindowHeight()+",location,menubar,resizable,scrollbars,status,toolbar,width="+Utilities.getWindowWidth();Utilities.useDHTMLWindows=typeof DHTMLWindow!="undefined";if(Utilities.useDHTMLWindows)
{Utilities.alertWindow=function(a){var win=DHTMLWindow.alertWindow(a);return win;};}
Utilities.ScreenLock=new Utilities.ScreenLocker();Utilities.addEventHandler(Utilities.Window,"resize",function(){Utilities.ScreenLock.resizeLockingElement();});});Utilities.ScreenLock=null;Utilities.ScreenLocker=function(){this.screenIsLocked=false;this.lockScreen=function(){if(this.screenIsLocked)return;this.screenIsLocked=true;var name=Utilities.Window.name;if(this.LockingElements[name]==null)
this.createLockingElement();this.resizeLockingElement();this.LockingElements[name].style.display="block";Utilities.Window.focus();};this.unlockScreen=function(){if(!this.screenIsLocked)return;this.screenIsLocked=false;this.LockingElements[Utilities.Window.name].style.display="none";};this.resizeLockingElement=function(){if(!this.screenIsLocked)return;var name=Utilities.Window.name;if(this.LockingElements[name]==null)
this.createLockingElement();this.LockingElements[name].style.width=Utilities.getWindowWidth()+"px";this.LockingElements[name].style.height=Utilities.getWindowHeight()+"px";};this.toString=function(){return this.screenIsLocked?"The screen is locked.":"This screen is not locked.";};this.createLockingElement=function(){var name=Utilities.Window.name;var doc=Utilities.Window.document;this.LockingElements[name]=doc.createElement("div");this.LockingElements[name].style.position="fixed";this.LockingElements[name].style.display="none";this.LockingElements[name].style.top="0";this.LockingElements[name].style.left="0";Utilities.addClass(this.LockingElements[name],"screenLock");Utilities.addClass(this.LockingElements[name],Utilities.dontPrintCSS);doc.body.appendChild(this.LockingElements[name]);};this.LockingElements={};this.createLockingElement();};

var StoryBoxWidth = 500;
var StoryBoxIncrement = -25;
var StoryBoxInterval = 10;
var StoryBoxStop = 0;
var StoryBoxAutoInterval = 6000;
var StoryBoxAutoId = -1;

/**
 * Collect references to all the story boxes into the global StoryBoxes object
 */
var CurrentStoryBoxId = "";
function collectStoryBoxes()
{
	// Story Boxes
	var el = Utilities.Window.document.getElementById("storyBoxes");
	var items = Utilities.getElements(el,Utilities.Node.ELEMENT_NODE,function (_el) {
		var isCurrent = Utilities.hasClass(_el,"storyBoxCurrent");
		if(isCurrent)
			CurrentStoryBoxId = _el.getAttribute("id");

		return Utilities.hasClass(_el,"storyBoxHidden") || isCurrent;
	});
	for(var i=0; i<items.length; i++)
	{
		items[i].index = parseInt(items[i].getAttribute("id").substr(2));
		items[i].length = items.length;
		var id = items[i].getAttribute("id");
		StoryBoxes[id] = items[i];
		
		// Move photo attribution so mouseover stuff doesn't get in the way
		StoryBoxes[id].attribution = StoryBoxes[id].getAttribute("title");
		StoryBoxes[id].setAttribute("title","");
	}

	// Preview buttons
	var tmp = Utilities.Window.document.getElementById("storyBoxPreviewContainer");
	if(tmp)
	{
		items = tmp.getElementsByTagName("a");
		for(var i=0; i<items.length; i++)
		{
			items[i].index = parseInt(items[i].getAttribute("id").substr(1));
			items[i].length = items.length;
			PreviewButtons[items[i].getAttribute("id")] = items[i];
		}
	}
}

/**
 * Insert/replace text in the little photo by box
 *
 * @param {string} title The attribution you're putting in
 */
function fillPhotoAttribution(attribution)
{
	var doc = Utilities.Window.document;

	var attr = doc.getElementById("storyPhotoAttribution");
	while(attr.firstChild)
		attr.removeChild(attr.firstChild);
	attr.appendChild(doc.createTextNode(attribution));
}

/**
 * Insert/replace text in the little headline preview box below the story box
 *
 * @param {string} title The headline you're putting in
 */
function fillHeadlinePreview(title)
{
	var doc = Utilities.Window.document;

	var headline = doc.getElementById("storyBoxHeadlinePreview");
	while(headline.firstChild)
		headline.removeChild(headline.firstChild);
	headline.appendChild(doc.createTextNode(title));
}

/**
 * Set a given story box to be moving
 *
 * @param {string} id The DOM id of the story box element
 */
var BoxInMotion = false;
function setStoryBoxMoving(id)
{
	if(BoxInMotion) return null;

	var storyBox = Utilities.Window.document.getElementById(id);

	// Don't do anything if it's current
	if(storyBox && CurrentStoryBoxId!=id)
	{
		storyBox.style.marginLeft = StoryBoxWidth + "px";
		storyBox.className = "storyBoxMoving";
		BoxInMotion = true;
		return storyBox;
	}
	
	return null;
}

/**
 * Set a given story box to be current
 *
 * @param {string} id The DOM id of the story box element
 */
function setStoryBoxCurrent(id)
{
	if(BoxInMotion) return;

	for(var p in StoryBoxes)
	{
		if(p==id)
		{
			StoryBoxes[p].className = "storyBoxCurrent";
			CurrentStoryBoxId = id;
		}
		else
		{
			StoryBoxes[p].className = "storyBoxHidden";
			StoryBoxes[p].style.marginLeft = StoryBoxWidth + "px";
		}
	}

	// Add the photo attribution
	fillPhotoAttribution(StoryBoxes[id].attribution);
}

/**
 * Set a preview button to be current
 *
 * @param {string} id The DOM id of the preivew button element
 */
function setPreviewButtonCurrent(id)
{
	for(var p in PreviewButtons)
	{
		if(p==id)
			PreviewButtons[p].className = "queuedStoryBox queuedStoryBoxCurrent";
		else
			PreviewButtons[p].className = "queuedStoryBox";
	}
}

/**
 * Slide an element by a given increment over a given interval
 *
 * @param {object} id The DOM id of the preview button corresponding to the element you're moving
 * @param {number} increment The increment in pixels
 * @param {number} interval The interval over which you're operating
 * @param {number} stop The point at which you stop
 */
var slideStopInterval = false;
function startSlideElement(id, increment, interval, stop)
{
	if(BoxInMotion
		|| isNaN(increment)
		|| isNaN(interval)
		|| isNaN(stop)) return;
	increment = parseInt(increment);
	interval = parseInt(interval);
	stop = parseInt(stop);

	// Set it current and grab a reference
	var storyBoxId = "s" + id;
	var storyBox = setStoryBoxMoving(storyBoxId);

	// Get it going
	if(storyBox!=null)
	{
		// Set this button to current
		setPreviewButtonCurrent(id);
		
		// Kick off slide
		slideStopInterval = Utilities.Window.setInterval("slideElement(\""+storyBoxId+"\","+increment+","+stop+")", interval);
	}
}

/**
 * Manual slide
 *
 * @param {number} i The number of slides you want to jump
 */
function slide(i)
{
	if(!StoryBoxes[CurrentStoryBoxId]) return;

	// Compute new index
	var currentIndex = StoryBoxes[CurrentStoryBoxId].index;
	var newIndex = (i + currentIndex) % StoryBoxes[CurrentStoryBoxId].length;
	if(newIndex<0)
		newIndex = newIndex + StoryBoxes[CurrentStoryBoxId].length;

	// Find new box
	var newStoryBoxId = "";
	for(var p in StoryBoxes)
	{
		if(StoryBoxes[p].index==newIndex)
		{
			startSlideElement(p.substr(1),StoryBoxIncrement,StoryBoxInterval,StoryBoxStop);
			return;
		}
	}
}

/**
 * Displace an element by a given increment by adjusting its margin
 *
 * @param {object} id The element you're moving
 * @param {number} increment The increment in pixels
 * @param {number} intervalId The setInterval id
 */
function slideElement(id, increment, stop)
{
	var el = StoryBoxes[id];

	if(typeof el=="undefined" || !el.style || isNaN(increment) || isNaN(stop)) return;
	increment = parseInt(increment);
	
	var newMargin = parseInt(el.style.marginLeft) + increment;
	if(newMargin<=stop)
	{
		newMargin = stop;
		el.style.marginLeft = newMargin + "px";
		Utilities.Window.clearInterval(slideStopInterval);
		BoxInMotion = false;
		setStoryBoxCurrent(id);
		return;
	}

	el.style.marginLeft = newMargin + "px";	
}

/**
 * Stop story box auto-rotation
 */
function stopStoryBoxAutoRotate()
{
	Utilities.Window.clearInterval(StoryBoxAutoId);
}

/**
 * Global object for referencing story boxes
 */
var StoryBoxes = {};
var PreviewButtons = {};

/**
 * Set up the page events on page load; ignore for non-tested browsers
 */
if(Utilities.Browser.tested_inter)
{
	Utilities.addEventHandler(Utilities.Window, "load", function () {
		
		// Get references to story boxes into StoryBoxes
		collectStoryBoxes();

		// Set up story box preview button events
		for(var p in PreviewButtons)
		{
			// Remove the title attribute of the links; this prevents the browser
			// from displaying the title if the user hovers too long... it's just
			// redundant and confusing since the headline preview box does the same
			// thing
			PreviewButtons[p].headline = PreviewButtons[p].getAttribute("title");
			PreviewButtons[p].setAttribute("title", "");
			
			// Add mouseover events
			Utilities.addEventHandler(PreviewButtons[p], "mouseover", function () {
				
				// Only preview a headline if it's not displayed in the story box
				if(!Utilities.hasClass(this,"queuedStoryBoxCurrent"))
					fillHeadlinePreview(this.headline);
			});
			
			// Wipe the slate on mouseout
			Utilities.addEventHandler(PreviewButtons[p], "mouseout", function () { fillHeadlinePreview(""); });
			
			// Add the sliding functionality
			PreviewButtons[p].onclick = function () { stopStoryBoxAutoRotate(); startSlideElement(this.getAttribute("id"),StoryBoxIncrement,StoryBoxInterval,StoryBoxStop); return false; };
		}
		
		// Set up next/previous button events
		var button = Utilities.Window.document.getElementById("storyBoxPrevious");
		if(button)
			Utilities.addEventHandler(button, "click", function () { stopStoryBoxAutoRotate(); slide(-1); });
		button = Utilities.Window.document.getElementById("storyBoxNext");
		if(button)
			Utilities.addEventHandler(button, "click", function () { stopStoryBoxAutoRotate(); slide(1); });
		
		// Set up auto-rotation
		StoryBoxAutoId = Utilities.Window.setInterval("slide(1)",StoryBoxAutoInterval);
	});
}
