////  iWeb - iWebSite.js//  Copyright (c) 2007 Apple Inc. All rights reserved.//////  This file includes a copy of the Prototype JavaScript framework:////  Prototype JavaScript framework, version 1.5.0//  (c) 2005-2007 Sam Stephenson////  Prototype is freely distributable under the terms of an MIT-style license.//  For details, see the Prototype web site: http://prototype.conio.net/var windowsInternetExplorer=false;var isGecko=false;var isMozilla=false;var isFirefox=false;var isCamino=false;var isSafari=false;var isNS=false;var isWebKit=false;var isOpera=false;var isiPhone=false;var isEarlyWebKitVersion=false;var browserDetected=false;var listOfIE7FloatsFix=[];function detectBrowser(){if(browserDetected===false){windowsInternetExplorer=false;var appVersion=navigator.appVersion;if((appVersion.indexOf("MSIE")!=-1)&&(appVersion.indexOf("Macintosh")==-1)){var temp=appVersion.split("MSIE");browserVersion=parseFloat(temp[1]);windowsInternetExplorer=true;if(typeof(Node)=="undefined"){Node={};Node.ELEMENT_NODE=1;Node.ATTRIBUTE_NODE=2;Node.TEXT_NODE=3;Node.CDATA_SECTION_NODE=4;Node.ENTITY_REFERENCE_NODE=5;Node.ENTITY_NODE=6;Node.PROCESSING_INSTRUCTION_NODE=7;Node.COMMENT_NODE=8;}}else{var ua=navigator.userAgent.toLowerCase();isGecko=(ua.indexOf('gecko')!=-1);isMozilla=(this.isGecko&&ua.indexOf("gecko/")+14==ua.length);isFirefox=(this.isGecko&&ua.indexOf("firefox")!=-1);isCamino=(this.isGecko&&ua.indexOf("camino")!=-1);isSafari=(this.isGecko&&ua.indexOf("safari")!=-1);isNS=((this.isGecko)?(ua.indexOf('netscape')!=-1):((ua.indexOf('mozilla')!=-1)&&(ua.indexOf('spoofer')==-1)&&(ua.indexOf('compatible')==-1)&&(ua.indexOf('opera')==-1)&&(ua.indexOf('webtv')==-1)&&(ua.indexOf('hotjava')==-1)));isOpera=!!window.opera;var matchResult=ua.match(/applewebkit\/(\d+)/);if(matchResult){isiPhone=(ua.indexOf("mobile/")!=-1);isWebKit=true;webKitVersion=parseInt(matchResult[1]);isEarlyWebKitVersion=(webKitVersion<522);}}browserDetected=true;}}function shouldApplyCSSBackgroundPNGFix(){detectBrowser();return(windowsInternetExplorer&&(browserVersion<7));}function photocastHelper(url){var feed=new IWURL(url);var iPhotoVersionMin=600;var iPhotoMimeTypePlugin="application/photo";if(navigator.mimeTypes&&navigator.mimeTypes.length>0){var iPhoto=navigator.mimeTypes[iPhotoMimeTypePlugin];if(iPhoto){var description=iPhoto.description;try{var components=description.split(" ");if(components&&components.length>1){var pluginVersion=components[1];if(pluginVersion>=iPhotoVersionMin){feed.mProtocol="photo";}}}catch(exception){}}}window.location=feed.toURLString();}function loadCSS(file){var cssNode=document.createElement('link');cssNode.setAttribute('rel','stylesheet');cssNode.setAttribute('type','text/css');cssNode.setAttribute('href',file);document.getElementsByTagName('head')[0].appendChild(cssNode);}function loadMozillaCSS(file){detectBrowser();if((isMozilla)||(isFirefox)||(isCamino)){loadCSS(file);}}function utf8sequence(c){if(c<=0x0000007f)return[c];if(c<=0x000007ff)return[(0xc0|(c>>>6)),(0x80|(c&0x3f))];if(c<=0x0000ffff)return[(0xe0|(c>>>12)),(0x80|((c>>>6)&0x3f)),(0x80|(c&0x3f))];if(c<=0x001fffff)return[(0xf0|(c>>>18)),(0x80|((c>>>12)&0x3f)),(0x80|((c>>>6)&0x3f)),(0x80|(c&0x3f))];if(c<=0x03ffffff)return[(0xf8|(c>>>24)),(0x80|((c>>>18)&0x3f)),(0x80|((c>>>12)&0x3f)),(0x80|((c>>>6)&0x3f)),(0x80|(c&0x3f))];if(c<=0x7fffffff)return[(0xfc|(c>>>30)),(0x80|((c>>>24)&0x3f)),(0x80|((c>>>18)&0x3f)),(0x80|((c>>>12)&0x3f)),(0x80|((c>>>6)&0x3f)),(0x80|(c&0x3f))];return[];}function utf8encode(s){var result=[];var firstSurrogate=0;for(var i=0;i<s.length;++i){var code=s.charCodeAt(i);if(firstSurrogate!=0){if((code>=0xDC00)&&(code<=0xDFFF)){code=(firstSurrogate-0xD800)*0x400+(code-0xDC00)+0x10000;firstSurrogate=0;}}else{if((code<0xD800)||(code>0xDFFF)){}else if((code>=0xD800)&&(code<0xDC00)){firstSurrogate=code;continue;}else{continue;}}result=result.concat(utf8sequence(code));}var resultString="";for(i=0;i<result.length;++i){resultString+=String.fromCharCode(result[i]);}return resultString;}function IELatin1Munge(UTF8String){var munged="";for(var i=0;i<UTF8String.length;i++){var c=UTF8String.charCodeAt(i);switch(c){case 0x0080:c=0x20AC;break;case 0x0081:break;case 0x0082:c=0x201A;break;case 0x0083:c=0x0192;break;case 0x0084:c=0x201E;break;case 0x0085:c=0x2026;break;case 0x0086:c=0x2020;break;case 0x0087:c=0x2021;break;case 0x0088:c=0x02C6;break;case 0x0089:c=0x2030;break;case 0x008A:c=0x0160;break;case 0x008B:c=0x2039;break;case 0x008C:c=0x0152;break;case 0x008D:break;case 0x008E:c=0x017D;break;case 0x008F:break;case 0x0090:break;case 0x0091:c=0x2018;break;case 0x0092:c=0x2019;break;case 0x0093:c=0x201C;break;case 0x0094:c=0x201D;break;case 0x0095:c=0x2022;break;case 0x0096:c=0x2013;break;case 0x0097:c=0x2014;break;case 0x0098:c=0x02DC;break;case 0x0099:c=0x2122;break;case 0x009A:c=0x0161;break;case 0x009B:c=0x203A;break;case 0x009C:c=0x0153;break;case 0x009D:break;case 0x009E:c=0x017E;break;case 0x009F:c=0x0178;break;}munged+=String.fromCharCode(c);}return munged;}function IEConvertURLForPNGFix(urlString){var result=urlString;detectBrowser();if(windowsInternetExplorer){var decoded=decodeURI(urlString);if(decoded.match(/[^\x00-\x7f]/)){result=IELatin1Munge(utf8encode(decodeURI(urlString)));}}return result;}function fixAllIEPNGs(transparentGif){detectBrowser();if(windowsInternetExplorer){for(var i=0;i<document.images.length;++i){if(document.images[i].src.slice(-4).toLowerCase()==".png"){var img=$(document.images[i]);var fixPng=function(img){if(!img.originalSrc){if((img.style.width=="")&&(img.style.height=="")){var width=img.width;var height=img.height;img.style.width=width+"px";img.style.height=height+"px";}var filterName='progid:DXImageTransform.Microsoft.AlphaImageLoader';var filterParams='src="'+IEConvertURLForPNGFix(img.src)+'", sizingMethod="scale"';img.setFilter(filterName,filterParams);img.originalSrc=img.src;img.src=transparentGif;}};if(img.complete){fixPng(img);}else{img.onload=fixPng.bind(null,img);}}}}}function toPixels(value){var converted=0;var px_per_pt=window.screen.logicalXDPI?(window.screen.logicalXDPI/72.0):1.3333;if(value.indexOf("px")>0){converted=parseFloat(value);}else if(value.indexOf("pt")>0){converted=px_per_pt*parseFloat(value);}else if(value.indexOf("in")>0){converted=72*px_per_pt*parseFloat(value);}else if(value.indexOf("pc")>0){converted=12*px_per_pt*parseFloat(value);}else if(value.indexOf("mm")>0){converted=2.83465*px_per_pt*parseFloat(value);}else if(value.indexOf("cm")>0){converted=28.3465*px_per_pt*parseFloat(value);}return converted;}function toPixelsAtElement(element,value,vertical){var converted=0;if(value.indexOf("%")>0){var containerSize=0;if(vertical){containerSize=$(element.parentNode).getHeight();}else{containerSize=$(element.parentNode).getWidth();}converted=containerSize*parseFloat(value)/100.0;}else if(value.indexOf("em")>0){converted=parseFloat(value)*toPixels(Element.getStyle(element,'fontSize'));}else{converted=toPixels(value);}return converted;}function backgroundPositionDimension(oBlock,currentBGPosition,blockDimension,imageDimension){var position=0;if(currentBGPosition==='center'){position=(blockDimension/2)-(imageDimension/2);}else if((currentBGPosition==='right')||(currentBGPosition==='bottom')){position=blockDimension-imageDimension;}else if((currentBGPosition==='left')||(currentBGPosition==='top')){position=0;}else if(currentBGPosition.indexOf("px")>0){position=parseFloat(currentBGPosition);}else if(currentBGPosition.indexOf("em")>0){position=parseFloat(currentBGPosition)*toPixels(oBlock.currentStyle.fontSize);}else if(currentBGPosition.indexOf("%")>0){position=parseFloat(currentBGPosition)*blockDimension/100.0;}else if((currentBGPosition.indexOf("pt")>0)||(currentBGPosition.indexOf("in")>0)||(currentBGPosition.indexOf("pc")>0)||(currentBGPosition.indexOf("cm")>0)||(currentBGPosition.indexOf("mm")>0)){position=toPixels(currentBGPosition);}return position;}function elementHasCSSBGPNG(element){return(element.currentStyle&&element.currentStyle.backgroundImage&&(element.currentStyle.backgroundImage.indexOf('url(')!=-1)&&(element.currentStyle.backgroundImage.indexOf('.png")')!=-1));}function fixupIEPNGBG(oBlock){if(oBlock){if(elementHasCSSBGPNG(oBlock)){var currentBGImage=oBlock.currentStyle.backgroundImage;var currentBGRepeat=oBlock.currentStyle.backgroundRepeat;var currentBGPositionX=oBlock.currentStyle.backgroundPositionX;var currentBGPositionY=oBlock.currentStyle.backgroundPositionY;var urlStart=currentBGImage.indexOf('url(');var urlEnd=currentBGImage.indexOf(')',urlStart);var imageURL=currentBGImage.substring(urlStart+4,urlEnd);if(imageURL.charAt(0)=='"'){imageURL=imageURL.substring(1);}if(imageURL.charAt(imageURL.length-1)=='"'){imageURL=imageURL.substring(0,imageURL.length-1);}imageURL=IEConvertURLForPNGFix(imageURL);var overrideRepeat=false;var filterStyle="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+imageURL+"', sizingMethod='crop');";if(RegExp("/C[0-9A-F]{8}.png$").exec(imageURL)!==null){filterStyle="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+imageURL+"', sizingMethod='scale');";overrideRepeat=true;}var fixupIEPNGBG_helper=function(img){var tileWidth=img.width;var tileHeight=img.height;var blockWidth=0;var blockHeight=0;if(oBlock.style.width){blockWidth=parseInt(oBlock.style.width,10);}else{blockWidth=oBlock.offsetWidth;}if(oBlock.style.height){blockHeight=parseInt(oBlock.style.height,10);}else{blockHeight=oBlock.offsetHeight;}var blockPaddingLeft=parseInt(oBlock.style.paddingLeft||0,10);if((blockWidth===0)||(blockHeight===0)){return;}var wholeRows=1;var wholeCols=1;var extraHeight=0;var extraWidth=0;if((currentBGRepeat.indexOf("no-repeat")!=-1)||((tileWidth===0)&&(tileHeight===0))||overrideRepeat){tileWidth=blockWidth;tileHeight=blockHeight;}else if((currentBGRepeat.indexOf("repeat-x")!=-1)||(tileHeight===0)){wholeCols=Math.floor(blockWidth/tileWidth);extraWidth=blockWidth-(tileWidth*wholeCols);tileHeight=blockHeight;}else if(currentBGRepeat.indexOf("repeat-y")!=-1){wholeRows=Math.floor(blockHeight/tileHeight);extraHeight=blockHeight-(tileHeight*wholeRows);tileWidth=blockWidth;}else{wholeCols=Math.floor(blockWidth/tileWidth);wholeRows=Math.floor(blockHeight/tileHeight);extraWidth=blockWidth-(tileWidth*wholeCols);extraHeight=blockHeight-(tileHeight*wholeRows);}var wrappedContent=document.createElement("div");var pngBGFixIsWrappedContentEmpty=true;wrappedContent.style.position="relative";wrappedContent.style.zIndex="1";wrappedContent.style.left="0px";wrappedContent.style.top="0px";wrappedContent.style.background="transparent";if(!isNaN(parseInt(oBlock.style.width,10))){wrappedContent.style.width=""+blockWidth+"px";}if(!isNaN(parseInt(oBlock.style.height,10))){wrappedContent.style.height=""+blockHeight+"px";}while(oBlock.hasChildNodes()){if(oBlock.firstChild.nodeType==3){if(RegExp("^ *$").exec(oBlock.firstChild.data)===null){pngBGFixIsWrappedContentEmpty=false;}}else{pngBGFixIsWrappedContentEmpty=false;}wrappedContent.appendChild(oBlock.firstChild);}if(pngBGFixIsWrappedContentEmpty){wrappedContent.style.lineHeight="0px";}var bgPositionX=backgroundPositionDimension(oBlock,currentBGPositionX,blockWidth,img.width);var bgPositionY=backgroundPositionDimension(oBlock,currentBGPositionY,blockHeight,img.height);bgPositionX-=blockPaddingLeft;var newMarkup="";for(var currentRow=0;currentRow<wholeRows;currentRow++){for(currentCol=0;currentCol<wholeCols;currentCol++){newMarkup+="<div class='pngtile' style="+"\"position: absolute; line-height: 0px; "+"width: "+tileWidth+"px; "+"height: "+tileHeight+"px; "+"left:"+(bgPositionX+(currentCol*tileWidth))+"px; "+"top:"+(bgPositionY+(currentRow*tileHeight))+"px; "+"filter:"+filterStyle+"\" > </div>";}if(extraWidth!==0){newMarkup+="<div class='pngtile' style="+"\"position: absolute; line-height: 0px; "+"width: "+extraWidth+"px; "+"height: "+tileHeight+"px; "+"left:"+(bgPositionX+(currentCol*tileWidth))+"px; "+"top:"+(bgPositionY+(currentRow*tileHeight))+"px; "+"filter:"+filterStyle+"\" > </div>";}}if(extraHeight!==0){for(currentCol=0;currentCol<wholeCols;currentCol++){newMarkup+="<div class='pngtile' style="+"\"position: absolute; line-height: 0px; "+"width: "+tileWidth+"px; "+"height: "+extraHeight+"px; "+"left:"+(bgPositionX+(currentCol*tileWidth))+"px; "+"top:"+(bgPositionY+(currentRow*tileHeight))+"px; "+"filter:"+filterStyle+"\" > </div>";}if(extraWidth!==0){newMarkup+="<div class='pngtile' style="+"\"position: absolute; line-height: 0px; "+"width: "+extraWidth+"px; "+"height: "+extraHeight+"px; "+"left:"+(bgPositionX+(currentCol*tileWidth))+"px; "+"top:"+(bgPositionY+(currentRow*tileHeight))+"px; "+"filter:"+filterStyle+"\" > </div>";}}oBlock.innerHTML=newMarkup;if(!pngBGFixIsWrappedContentEmpty){oBlock.appendChild(wrappedContent);}oBlock.style.background="";}var backgroundImage=new Image();backgroundImage.src=imageURL;if(backgroundImage.complete){fixupIEPNGBG_helper(backgroundImage);}else{backgroundImage.onload=fixupIEPNGBG_helper.bind(null,backgroundImage);}}}}function fixupIEPNGBGsInTree(oAncestor,forceAutoFixup){if(shouldApplyCSSBackgroundPNGFix()){try{var allDivs=$A(oAncestor.getElementsByTagName('DIV'));if(isDiv(oAncestor)){allDivs.push(oAncestor);}allDivs.each(function(oNode){if(!$(oNode).hasClassName("noAutoPNGFix")||forceAutoFixup){fixupIEPNGBG(oNode);}});}catch(e){}}}function fixupAllIEPNGBGs(){setTimeout(fixupIEPNGBGsInTree.bind(null,document),1);}function optOutOfCSSBackgroundPNGFix(element){if(shouldApplyCSSBackgroundPNGFix()){var allDivs=$A(element.getElementsByTagName("DIV"));allDivs.each(function(item){if(elementHasCSSBGPNG(item)){$(item).addClassName("noAutoPNGFix");}});}}function fixupIECSS3Opacity(strElementID){detectBrowser();if(windowsInternetExplorer){var oNode=$(strElementID);if(oNode&&(oNode.getStyle('opacity')<1)){var opacity=oNode.getStyle('opacity');oNode.style.height=''+oNode.offsetHeight+'px';var targetNode=oNode;if(oNode.tagName.toLowerCase()=='img'){targetNode=$(document.createElement('div'));targetNode.style.position=oNode.style.position;targetNode.style.top=oNode.style.top;targetNode.style.left=oNode.style.left;targetNode.style.width=oNode.style.width;targetNode.style.height=oNode.style.height;targetNode.style.opacity=oNode.style.opacity;targetNode.style.zIndex=oNode.style.zIndex;oNode.style.left='0px';oNode.style.top='0px';oNode.style.opacity='';if(oNode.parentNode.tagName.toLowerCase()=='a'){var anchor=oNode.parentNode;anchor.parentNode.insertBefore(targetNode,anchor);targetNode.appendChild(anchor);}else{oNode.parentNode.insertBefore(targetNode,oNode);targetNode.appendChild(oNode);}}else if(oNode.tagName.toLowerCase()=='div'){var bufferWidth=100;var oNodeWidth=oNode.offsetWidth;var oNodeHeight=oNode.offsetHeight;extents=new IWExtents(-bufferWidth,-bufferWidth,oNodeWidth+bufferWidth,oNodeHeight*2+bufferWidth);var positionStyleVal=oNode.getStyle("position");var floatStyleVal=oNode.getStyle("float");var positioned=((positionStyleVal=="relative")||(positionStyleVal=="absolute"));var absolutelyPositioned=(positionStyleVal=="absolute"&&(floatStyleVal=="none"));targetNode=$(document.createElement('div'));var classString=oNode.className;classString=classString.replace(/(shadow_\d+)/g,'');classString=classString.replace(/(stroke_\d+)/g,'');classString=classString.replace(/(reflection_\d+)/g,'');targetNode.className=classString;targetNode.style.position=positioned?positionStyleVal:"relative";targetNode.style.styleFloat=floatStyleVal;targetNode.style.clear=oNode.getStyle("clear");targetNode.style.width=extents.right-extents.left+"px";targetNode.style.height=extents.bottom-extents.top+"px";targetNode.style.opacity=oNode.style.opacity;targetNode.style.zIndex=oNode.style.zIndex;if(absolutelyPositioned){targetNode.style.top=(parseFloat(oNode.getStyle("top"))||0)+extents.top+"px";targetNode.style.left=(parseFloat(oNode.getStyle("left"))||0)+extents.left+"px";}else{targetNode.style.marginTop=(parseFloat(oNode.getStyle("marginTop"))||0)+extents.top+"px";targetNode.style.marginLeft=(parseFloat(oNode.getStyle("marginLeft"))||0)+extents.left+"px";targetNode.style.marginBottom=(parseFloat(oNode.getStyle("marginBottom"))||0)-(extents.bottom-oNodeHeight)+"px";targetNode.style.marginRight=(parseFloat(oNode.getStyle("marginRight"))||0)-(extents.right-oNodeWidth)+"px";}oNode.style.position="absolute";oNode.style.styleFloat="none";oNode.style.clear="none";oNode.style.left=-extents.left+"px";oNode.style.top=-extents.top+"px";oNode.style.margin='0px';oNode.style.verticalAlign='baseline';oNode.style.display='block';oNode.style.opacity='';if(browserVersion<7){oNode.className=oNode.className.replace(/(shadow_\d+)/g,'');}oNode.parentNode.insertBefore(targetNode,oNode);targetNode.appendChild(oNode);}$(targetNode).setFilter('progid:DXImageTransform.Microsoft.BasicImage','opacity='+opacity);}}}function IWSetDivOpacity(div,fraction,suppressFilterRemoval){if(windowsInternetExplorer){if(fraction<.99||(suppressFilterRemoval==true)){$(div).setFilter('alpha','opacity='+fraction*100);}else{$(div).killFilter('alpha');}}else{div.style.opacity=fraction;}}function IMpreload(path,name,areaIndex){var rolloverName=name+'_rollover_'+areaIndex;var rolloverPath=path+'/'+rolloverName+'.png';self[rolloverName]=new Image();self[rolloverName].src=rolloverPath;var linkName=name+'_link_'+areaIndex;var linkPath=path+'/'+linkName+'.png';self[linkName]=new Image();self[linkName].src=linkPath;return true;}function swapAlphaImageLoaderFilterSrc(img,src){var filterName='progid:DXImageTransform.Microsoft.AlphaImageLoader';var filterParams='src="'+IEConvertURLForPNGFix(src)+'", sizingMethod="scale"';img.setFilter(filterName,filterParams);img.originalSrc=img.src;}function IMmouseover(name,areaIndex){var rolloverName=name+'_rollover_'+areaIndex;var linkName=name+'_link_'+areaIndex;var img=document.getElementById(linkName);if(img){detectBrowser();if(windowsInternetExplorer&&img.originalSrc){swapAlphaImageLoaderFilterSrc(img,self[rolloverName].src);}else{img.src=self[rolloverName].src;}}return true;}function IMmouseout(name,areaIndex){var linkName=name+'_link_'+areaIndex;var img=document.getElementById(linkName);if(img){detectBrowser();if(windowsInternetExplorer&&img.originalSrc){swapAlphaImageLoaderFilterSrc(img,self[linkName].src);}else{img.src=self[linkName].src;}}return true;}var quicktimeAvailable=false;var quicktimeVersion702=false;var isQuicktimeDetectionInitialized=false;var minVersionNum=0x7028000;var minVersionArray=['7','0','2'];function initializeQuicktimeDetection(){if((navigator.plugins!==null)&&(navigator.plugins.length>0)){for(i=0;i<navigator.plugins.length;i++){var plugin=navigator.plugins[i];if(plugin.name.toLowerCase().indexOf('quicktime plug-in ')!=-1){quicktimeAvailable=true;quicktimeVersionString=plugin.name.substring(18);var qtVersionArray=quicktimeVersionString.split('.');for(j=0;j<minVersionArray.length&&j<qtVersionArray.length;j++){var qtVersionComponent=qtVersionArray[j];var minVersionComponent=minVersionArray[j];if((qtVersionComponent>minVersionComponent)||((qtVersionComponent==minVersionComponent)&&(j==minVersionArray.length-1))){quicktimeVersion702=true;break;}else if(qtVersionComponent<minVersionComponent){break;}}break;}}}else if(window.ActiveXObject){try{quicktimeObj=new ActiveXObject('QuickTimeCheckObject.QuickTimeCheck.1');if(quicktimeObj!==null){quicktimeAvailable=true;quicktimeVersionNum=quicktimeObj.QuickTimeVersion;if(quicktimeVersionNum>=minVersionNum){quicktimeVersion702=true;}}}catch(e){}}isQuictimeDetectionInitialized=true;}function fixupPodcast(mediaId,anchorId){if(!isQuicktimeDetectionInitialized){initializeQuicktimeDetection();}if(!quicktimeVersion702){var oMediaElem=document.getElementById(mediaId);var oAnchorElem=document.getElementById(anchorId);if(oMediaElem&&oAnchorElem){oAnchorElem.style.display='inline';oMediaElem.parentNode.removeChild(oMediaElem);}}}function allListBulletImagesContainedBy(node){var result=[];for(var i=0;i<node.childNodes.length;++i){var child=node.childNodes[i];if((child.nodeName=="IMG")&&((node.nodeName=="SPAN")||(node.nodeName=="A"))&&(node.parentNode!=null)&&(node.parentNode.nodeName=="P")&&(node.parentNode.parentNode!=null)&&(node.parentNode.parentNode.nodeName=="LI")){result=result.concat([child]);}result=result.concat(allListBulletImagesContainedBy(child));}return result;}function hideAllListBulletImagesContainedBy(node){var images=allListBulletImagesContainedBy(node);for(var i=0;((images!=null)&&(i<images.length));++i){images[i].style.display="none";}}function showAllListBulletImagesContainedBy(node){var images=allListBulletImagesContainedBy(node);for(var i=0;((images!=null)&&(i<images.length));++i){images[i].style.display="";}}function getChildOfType(oParent,sNodeName,requestedIndex){var childrenOfType=oParent.getElementsByTagName(sNodeName);return(requestedIndex<childrenOfType.length)?childrenOfType.item(requestedIndex):null;}function isDescendantInsideFixedHeightDescendantOfAncestor(oDescendant,oAncestor){if(oDescendant===oAncestor||oDescendant==null){return false;}else if(parseFloat(oDescendant.style.height)>0){return true;}else{return isDescendantInsideFixedHeightDescendantOfAncestor(oDescendant.parentNode,oAncestor);}}function getShrinkableParaDescendants(oAncestor){var oParaDescendants=[];var oPotentialParagraphs=oAncestor.getElementsByTagName('DIV');for(var iIndex=0;iIndex<oPotentialParagraphs.length;iIndex++){var oNode=oPotentialParagraphs.item(iIndex);if(oNode.className.lastIndexOf('paragraph')!=-1){if(isDescendantInsideFixedHeightDescendantOfAncestor(oNode,oAncestor)){continue;}oParaDescendants.push(oNode);}}var oPotentialParagraphs=oAncestor.getElementsByTagName('P');for(var iIndex=0;iIndex<oPotentialParagraphs.length;iIndex++){var oNode=oPotentialParagraphs.item(iIndex);if(isDescendantInsideFixedHeightDescendantOfAncestor(oNode,oAncestor)){continue;}oParaDescendants.push(oNode);}return oParaDescendants;}var MINIMUM_FONT="10";var UNITS="";function elementFontSize(element){var fontSize=MINIMUM_FONT;if(document.defaultView){var computedStyle=document.defaultView.getComputedStyle(element,null);if(computedStyle){fontSize=computedStyle.getPropertyValue("font-size");}}else if(element.currentStyle){fontSize=element.currentStyle.fontSize;}if((UNITS.length===0)&&(fontSize!=MINIMUM_FONT)){UNITS=fontSize.substring(fontSize.length-2,fontSize.length);}return parseFloat(fontSize);}function isExceptionToOneLineRule(element){return($(element).hasClassName("Header"))}var HEIGHT_ERROR_MARGIN=2;function adjustFontSizeIfTooBig(idOfElement){var oParagraphDiv;var oSpan;var oTextBoxInnerDiv;var oTextBoxOuterDiv=document.getElementById(idOfElement);if(oTextBoxOuterDiv){oTextBoxInnerDiv=getElementsByTagAndClassName(oTextBoxOuterDiv,"DIV","text-content")[0];if(oTextBoxInnerDiv){hideAllListBulletImagesContainedBy(oTextBoxInnerDiv);var offsetHeight=oTextBoxInnerDiv.offsetHeight;var specifiedHeight=offsetHeight;if(oTextBoxOuterDiv.style.height!==""){specifiedHeight=parseFloat(oTextBoxOuterDiv.style.height);}if(offsetHeight>(specifiedHeight+HEIGHT_ERROR_MARGIN)){var smallestFontSize=200;var aParaChildren=getShrinkableParaDescendants(oTextBoxInnerDiv);var oneLine=false;var exceptionToOneLineRule=false;for(i=0;i<aParaChildren.length;i++){oParagraphDiv=aParaChildren[i];var lineHeight=elementLineHeight(oParagraphDiv);if(!isNaN(lineHeight)){oneLine=oneLine||(lineHeight*1.5>=specifiedHeight);exceptionToOneLineRule=oneLine&&isExceptionToOneLineRule(oParagraphDiv);}var fontSize=elementFontSize(oParagraphDiv);if(!isNaN(fontSize)){smallestFontSize=Math.min(smallestFontSize,fontSize);}for(j=0;j<oParagraphDiv.childNodes.length;j++){oSpan=oParagraphDiv.childNodes[j];if((oSpan.nodeName=="SPAN")||(oSpan.nodeName=="A")){fontSize=elementFontSize(oSpan);if(!isNaN(fontSize)){smallestFontSize=Math.min(smallestFontSize,fontSize);}}}}var minimum=parseFloat(MINIMUM_FONT);var count=0;while((smallestFontSize>minimum)&&(offsetHeight>(specifiedHeight+HEIGHT_ERROR_MARGIN))&&(count<10)){++count;if(oneLine&&!exceptionToOneLineRule){var oldWidth=parseInt(oTextBoxOuterDiv.style.width,10);oTextBoxInnerDiv.style.width=""+oldWidth*Math.pow(1.05,count)+"px";}else{var scale=Math.max(0.95,minimum/smallestFontSize);for(i=0;i<aParaChildren.length;i++){oParagraphDiv=aParaChildren[i];var paraFontSize=elementFontSize(oParagraphDiv)*scale;var paraLineHeight=elementLineHeight(oParagraphDiv)*scale;for(j=0;j<oParagraphDiv.childNodes.length;j++){oSpan=oParagraphDiv.childNodes[j];if((oSpan.nodeName=="SPAN")||(oSpan.nodeName=="A")){var spanLineHeight=elementLineHeight(oSpan)*scale;if(!isNaN(spanLineHeight)){oSpan.style.lineHeight=spanLineHeight+UNITS;}var spanFontSize=elementFontSize(oSpan)*scale;if(!isNaN(spanFontSize)){oSpan.style.fontSize=spanFontSize+UNITS;smallestFontSize=Math.min(smallestFontSize,spanFontSize);}}}if(!isNaN(paraLineHeight)){oParagraphDiv.style.lineHeight=paraLineHeight+UNITS;}if(!isNaN(paraFontSize)){oParagraphDiv.style.fontSize=paraFontSize+UNITS;smallestFontSize=Math.min(smallestFontSize,paraFontSize);}}}offsetHeight=oTextBoxInnerDiv.offsetHeight;}}showAllListBulletImagesContainedBy(oTextBoxInnerDiv);}}}function elementLineHeight(element){var lineHeight=MINIMUM_FONT;if(document.defaultView){var computedStyle=document.defaultView.getComputedStyle(element,null);if(computedStyle){lineHeight=computedStyle.getPropertyValue("line-height");}}else if(element.currentStyle){lineHeight=element.currentStyle.lineHeight;}if((UNITS.length===0)&&(lineHeight!=MINIMUM_FONT)){UNITS=lineHeight.substring(lineHeight.length-2,lineHeight.length);}return parseFloat(lineHeight);}function adjustLineHeightIfTooBig(idOfElement){var oTextBoxInnerDiv;var oTextBoxOuterDiv=document.getElementById(idOfElement);if(oTextBoxOuterDiv){oTextBoxInnerDiv=getElementsByTagAndClassName(oTextBoxOuterDiv,"DIV","text-content")[0];if(oTextBoxInnerDiv){hideAllListBulletImagesContainedBy(oTextBoxInnerDiv);var offsetHeight=oTextBoxInnerDiv.offsetHeight;var specifiedHeight=offsetHeight;if(oTextBoxOuterDiv.style.height!==""){specifiedHeight=parseFloat(oTextBoxOuterDiv.style.height);}if(offsetHeight>(specifiedHeight+HEIGHT_ERROR_MARGIN)){var adjusted=true;var count=0;while((adjusted)&&(offsetHeight>(specifiedHeight+HEIGHT_ERROR_MARGIN))&&(count<10)){adjusted=false;++count;var aParaChildren=getShrinkableParaDescendants(oTextBoxInnerDiv);for(i=0;i<aParaChildren.length;i++){var fontSize;var lineHeight;var oParagraphDiv=aParaChildren[i];fontSize=elementFontSize(oParagraphDiv);lineHeight=elementLineHeight(oParagraphDiv)*0.95;if(!isNaN(lineHeight)&&lineHeight>=(fontSize*1.1)){oParagraphDiv.style.lineHeight=lineHeight+UNITS;adjusted=true;}for(j=0;j<oParagraphDiv.childNodes.length;j++){var oSpan=oParagraphDiv.childNodes[j];if((oSpan.nodeName=="SPAN")||(oSpan.nodeName=="A")){fontSize=elementFontSize(oSpan);lineHeight=elementLineHeight(oSpan)*0.95;if(!isNaN(lineHeight)&&lineHeight>=(fontSize*1.1)){oSpan.style.lineHeight=lineHeight+UNITS;adjusted=true;}}}}offsetHeight=oTextBoxInnerDiv.offsetHeight;}}showAllListBulletImagesContainedBy(oTextBoxInnerDiv);}}}function isDiv(node){return(node.nodeType==Node.ELEMENT_NODE)&&(node.tagName=="DIV");}function fixupAllMozInlineBlocks(){detectBrowser();if(isFirefox||isCamino){var oInlineBlocks=getElementsByTagAndClassName(document.body,"DIV","inline-block");for(var i=0,inlineBlocksLength=oInlineBlocks.length;i<inlineBlocksLength;++i){var oInlineBlock=oInlineBlocks[i];var oInterposingDiv=document.createElement("div");oInterposingDiv.style.position="relative";oInterposingDiv.style.overflow="visible";for(var j=0,childNodesLength=oInlineBlock.childNodes.length;j<childNodesLength;++j){var oChildNode=oInlineBlock.childNodes[0];oInlineBlock.removeChild(oChildNode);oInterposingDiv.appendChild(oChildNode);}oInlineBlock.appendChild(oInterposingDiv);}}}function getWidthDefiningAncestor(elem){var ancestor=elem.up('[style~="width:"]');if(!ancestor){ancestor=$$('body')[0];}return ancestor;}function updateListOfIE7FloatsFix(div){var div=$(div);var floatValue=div.getStyle("float");if(floatValue=="left"||floatValue=="right"){var commonAncestor=getWidthDefiningAncestor(div);var floatDescendants=commonAncestor.getElementsBySelector('[style~="float:"]');while(floatDescendants.length>0){var floatElem=floatDescendants.shift();floatValue=floatElem.getStyle("float");if(floatValue=="left"||floatValue=="right"){var floatAncestor=getWidthDefiningAncestor(floatElem);if(floatAncestor===commonAncestor){if(!listOfIE7FloatsFix.include(floatElem)){listOfIE7FloatsFix.push(floatElem);}}}}}}function fixupFloatsIfIE7(){detectBrowser();if(windowsInternetExplorer&&browserVersion==7){if(listOfIE7FloatsFix.length>0){var floatsToRestore=[];var floatElem;var displayStyle;while(listOfIE7FloatsFix.length>0){floatElem=listOfIE7FloatsFix.shift();displayStyle=floatElem.getStyle("display");floatElem.setStyle({"display":"none"});floatsToRestore.push({element:floatElem,displayStyle:displayStyle});}while(floatsToRestore.length>0){var queueEntry=floatsToRestore.shift();floatElem=queueEntry.element;displayStyle=queueEntry.displayStyle;floatElem.setStyle({"display":displayStyle});}}}}function performPostEffectsFixups(){fixupAllMozInlineBlocks();fixupFloatsIfIE7();}function reduceLeftMarginIfIE6(element){detectBrowser();if(windowsInternetExplorer&&browserVersion<7){$(element).style.marginLeft=px(parseFloat($(element).style.marginLeft||0)-1);}}function reduceRightMarginIfIE6(element){detectBrowser();if(windowsInternetExplorer&&browserVersion<7){$(element).style.marginRight=px(parseFloat($(element).style.marginRight||0)-1);}}if(Object.keys===undefined){Object.keys=function(obj){var result=[];for(attr in obj)result.push(attr);return result;}}Object.objectType=function(obj){var result=typeof obj;if(result=="object"){if(obj.constructor==Array)result="Array";}return result;}Array.prototype.contains=function(value){for(var i=0;i<this.length;++i){if(this[i]==value){return true;}}return false;};Array.prototype.forEach=function(f){for(var i=0;i<this.length;++i){f(this[i]);}};Array.prototype.indexOf=function(value){for(var i=0;i<this.length;++i){if(this[i]==value){return i;}}return null;};Array.prototype.isEqual=function(that){if(this.length==that.length){for(var i=0;i<this.length;++i){if(this[i]!=that[i])return false;}return true;}return false;}Array.prototype.minusArray=function(that){var i=0;while(i<this.length){if(that.contains(this[i]))this.splice(i,1);else++i;}}String.stringWithFormat=function(format){var formatted="";var nextArgument=1;var formatPattern=/%((\d+)\$)?([%s])?/;while(true){foundIndex=format.search(formatPattern);if(foundIndex==-1){formatted+=format;break;}if(foundIndex>0){formatted+=format.substring(0,foundIndex)}var matchInfo=format.match(formatPattern);var formatCharacter=matchInfo[3];if(formatCharacter=="%"){formatted+="%";}else{if(matchInfo[2]){argumentNumber=parseInt(matchInfo[2]);}else{argumentNumber=nextArgument++;}argument=(argumentNumber<arguments.length)?arguments[argumentNumber]:"";if(formatCharacter=="s"){formatted+=argument;}}format=format.substring(foundIndex+matchInfo[0].length);}return formatted;}String.prototype.hasSuffix=function(suffix){return this.slice(-1*suffix.length)==suffix;};String.prototype.hasPrefix=function(prefix){return this.substr(0,prefix.length)==prefix;}String.prototype.lastPathComponent=function(){return this.substr(this.lastIndexOf("/")+1);};String.prototype.stringByDeletingLastPathComponent=function(){return this.substr(0,this.lastIndexOf("/"));};String.prototype.stringByDeletingPathExtension=function(){var lastSeparatorIndex=this.lastIndexOf("/");var lastDotIndex=this.lastIndexOf(".");if((lastDotIndex>lastSeparatorIndex+1)&&lastDotIndex>0)return this.slice(0,lastDotIndex);return this;}String.prototype.stringByAppendingPathComponent=function(component){if(this.hasSuffix("/")){return this+component;}return this+"/"+component;};String.prototype.stringByAppendingAsQueryString=function(parameters){var result=this;if(parameters){var prependChar="?";Object.keys(parameters).forEach(function(key){if(parameters.hasOwnProperty(key)){result+=prependChar+escape(key)+"="+escape(parameters[key]);prependChar="&";}});}return result;};String.prototype.stringByUnescapingXML=function(){var str=this.replace(/&lt;/g,'<');str=str.replace(/&gt;/g,'>');str=str.replace(/&quot;/g,'"');str=str.replace(/&apos;/g,"'");str=str.replace(/&amp;/g,'&');return str;};String.prototype.stringByEscapingXML=function(escapeAdditionalCharacters){var str=this.replace(/&/g,'&amp;');str=str.replace(/</g,'&lt;');if(escapeAdditionalCharacters){str=str.replace(/>/g,'&gt;');str=str.replace(/"/g,'&quot;');str=str.replace(/'/g,'&apos;');}return str;};String.prototype.stringByConvertingNewlinesToBreakTags=function(){return this.replace(/\n\r|\n|\r/g,'<br />');};String.prototype.urlStringByDeletingQueryAndFragment=function(){var result=this;var lastIndex=result.lastIndexOf("?");if(lastIndex>0)return result.substr(0,lastIndex);lastIndex=result.lastIndexOf("#");if(lastIndex>0)result=result.substr(0,lastIndex);return result;}String.prototype.toRelativeURL=function(baseURL){var result=this;if(baseURL&&this.indexOf(baseURL)==0){var chop=baseURL.length;if(this.charAt(chop)=='/')++chop;result=this.substring(chop);}return result;}String.prototype.toAbsoluteURL=function(){var result=this;if(this.indexOf(":/")==-1){var pageURL=document.URL.urlStringByDeletingQueryAndFragment();var pathURL=pageURL.stringByDeletingLastPathComponent();result=pathURL.stringByAppendingPathComponent(this);}return result;}String.prototype.toRebasedURL=function(baseURL){return this.toRelativeURL(baseURL).toAbsoluteURL();}String.prototype.replaceStringWithString=function(target,replacement,global){var result=this;while(true){var pos=result.indexOf(target);if(pos==-1)break;result=result.substr(0,pos)+replacement+result.substr(pos+target.length);pos+=replacement.length;if(pos>=result.length||!global)break;}return result;}var trace=function(){};function ajaxRequest(url,func,obj){if(window.XMLHttpRequest){var req=new XMLHttpRequest();}else if(window.ActiveXObject){isIE=true;try{req=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){req=new ActiveXObject("Microsoft.XMLHTTP");}}if(func){req.onreadystatechange=function(){func(req,obj);}}req.open('GET',url,true);req.setRequestHeader('X-Requested-With','XMLHttpRequest');if(req.overrideMimeType){req.overrideMimeType("text/xml");}req.send(null);return false;}function isAjaxRequestReady(req){var result=req.readyState==4&&(req.status==null||req.status==0||req.status==200);return result;}function ajaxGetDocumentElement(req){var elem=null;if(req.responseXML.documentElement){elem=req.responseXML.documentElement;}else{var dom=new ActiveXObject("MSXML.DOMDocument");dom.loadXML(req.responseText);elem=dom.documentElement;}return elem;}function iWLog(str){if(window.console){window.console.log(str);}else if(window.dump){window.dump(str+"\n");}}function position(abs,left,top,width,height){var pos="";if(abs)pos="position: absolute; ";var size="";if(width&&height)size=' width: '+width+'px; height: '+height+'px;';return pos+'left: '+left+'px; top: '+top+'px;'+size;}var gIWUtilsTransparentGifURL="";function setTransparentGifURL(url){if(gIWUtilsTransparentGifURL==""){gIWUtilsTransparentGifURL=url;}}function transparentGifURL(){(function(){return gIWUtilsTransparentGifURL!=""}).assert("Transparent image URL not set");return gIWUtilsTransparentGifURL;}function imgMarkup(src,style,attributes,alt){var markup="";if(src){if(style==null){style="";}if(attributes==null){attributes="";}if(alt==null){alt="";}detectBrowser();if(windowsInternetExplorer){style+=" filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+IEConvertURLForPNGFix(src)+"', sizingMethod='scale');";src=gIWUtilsTransparentGifURL;}if(style.length>0){style=' style="'+style+'"';}if(attributes.length>0){attributes=' '+attributes;}if(alt.length>0){alt=' alt="'+alt.stringByEscapingXML(true)+'"';}markup='<img src="'+src+'"'+style+attributes+alt+' />';}return markup;}function setImgSrc(imgElement,src){detectBrowser();if(windowsInternetExplorer&&src.slice(-4).toLowerCase()==".png"){$(imgElement).setFilter('progid:DXImageTransform.Microsoft.AlphaImageLoader','src="'+IEConvertURLForPNGFix(src)+'", sizingMethod="scale"');imgElement.src=gIWUtilsTransparentGifURL;}else{imgElement.src=src;}}function iWOpacity(opacity){var style="";detectBrowser();if(windowsInternetExplorer){style=" progid:DXImageTransform.Microsoft.Alpha(opacity="+opacity*100+"); ";}else{style=" opacity: "+opacity+"; ";}return style;}function getElementsByTagAndClassName(that,tagName,className){var elementsByClassAndTag=[];var elementsByClass=$(that).getElementsByClassName(className);if(tagName=='*'){elementsByClassAndTag=elementsByClass;}else{tagName=tagName.toLowerCase();for(var i=0,len=elementsByClass.length;i<len;++i){if(elementsByClass[i].tagName.toLowerCase()==tagName){elementsByClassAndTag.push(elementsByClass[i]);}}}return elementsByClassAndTag;}function getArgs(){var args=new Object();var query=location.search.substring(1);var pairs=query.split("&");for(var i=0;i<pairs.length;++i){var pair=pairs[i];var pos=pair.indexOf('=');if(pos>0){var argname=decodeURIComponent(pair.substring(0,pos));var value=decodeURIComponent(pair.substring(pos+1));args[argname]=value;}}return args;}function IWRange(location,length){this.setLocation(location);this.setLength(length);}IWRange.prototype.length=function(){return this.p_length;}IWRange.prototype.setLength=function(length){this.p_length=parseFloat(length);}IWRange.prototype.location=function(){return this.p_location;}IWRange.prototype.setLocation=function(location){this.p_location=parseFloat(location);}IWRange.prototype.max=function(){return this.location()+this.length();}IWRange.prototype.min=function(){return this.location();}IWRange.prototype.shift=function(amount){this.setLocation(this.location()+amount);}IWRange.prototype.containsLocation=function(location){return((location>=this.min())&&(location<this.max()));}function IWPageRange(location,length){IWRange.apply(this,arguments);}IWPageRange.prototype=new IWRange();IWPageRange.prototype.constructor=IWRange;IWPageRange.prototype.setMax=function(newMax){var maxLength=this.p_lengthForMax(newMax);this.setLocation(Math.max(newMax-maxLength,0))this.setLength(newMax-this.location());}IWPageRange.prototype.shift=function(amount){IWRange.prototype.shift.call(this,amount);this.setMax(this.max());}IWPageRange.prototype.p_lengthForMax=function(max){return(max<=9)?5:3;}function px(s){return s.toString()+"px";}function depx(s){return parseInt(s||0);}function globalOriginOfDivNode(div){(function(){return div!==null;}).assert("div must not be null");(function(){return div.offsetParent!==null;}).assert("div has null offset parent, maybe hidden?");var p=Position.cumulativeOffset(div);return new IWPoint(p[0],p[1]);}function globalRectOfDivNode(div){var globalOrigin=globalOriginOfDivNode(div);var size=new IWSize(div.offsetWidth,div.offsetHeight);return new IWRect(globalOrigin,size);}function pageSetBodyLayerResidentRectangle(divId,rectangle){var div=$(divId);if(div){if(window.bodyLayerResidents===undefined){window.bodyLayerResidents=new Hash({});}if(rectangle===null){bodyLayerResidents.remove(divId);}else{bodyLayerResidents[divId]=rectangle;}var desiredBottom=0;bodyLayerResidents.each(function(pair){var itemBottom=pair.value.origin.y+pair.value.size.height;desiredBottom=Math.max(desiredBottom,itemBottom);});var bodyLayer=$('body_layer');if(bodyLayer){var bodyLayerSpacer=bodyLayer.getElementsByClassName('spacer')[0];if(bodyLayerSpacer){var bodySpacerRect=globalRectOfDivNode(bodyLayerSpacer);var desiredHeight=desiredBottom-bodySpacerRect.origin.y;bodyLayerSpacer.style.height=px(desiredHeight);}}}}function locationHRef(){var result=window.location.href;if(result.match(/file:\/[^\/]/)){result="file://"+result.substr(5);}return result;}function IWSize(width,height){this.width=width;this.height=height;}function IWZeroSize(){return new IWSize(0,0);}IWSize.prototype.scale=function(hscale,vscale,round){if(round===undefined)round=false;if(vscale===undefined)vscale=hscale;var scaled=new IWSize(this.width*hscale,this.height*vscale);if(round){scaled.width=Math.round(scaled.width);scaled.height=Math.round(scaled.height);}return scaled;}IWSize.prototype.round=function(){return this.scale(1,1,true);}IWSize.prototype.toString=function(){return"Size("+this.width+", "+this.height+")";}IWSize.prototype.aspectRatio=function(){return this.width/this.height;}IWSize.prototype.subtractSize=function(s){return new IWSize(this.width-s.width,this.height-s.height);}function IWPoint(x,y){this.x=x;this.y=y;}function IWZeroPoint(){return new IWPoint(0,0);}IWPoint.prototype.scale=function(hscale,vscale,round){if(round===undefined)round=false;if(vscale===undefined)vscale=hscale;var scaled=new IWPoint(this.x*hscale,this.y*vscale);if(round){scaled.x=Math.round(scaled.x);scaled.y=Math.round(scaled.y);}return scaled;}IWPoint.prototype.round=function(){return this.scale(1,1,true);}IWPoint.prototype.offset=function(deltaX,deltaY){return new IWPoint(this.x+deltaX,this.y+deltaY);}IWPoint.prototype.toString=function(){return"Point("+this.x+", "+this.y+")";}function IWRect(){if(arguments.length==1){this.origin=arguments[0].origin;this.size=arguments[0].size;}else if(arguments.length==2){this.origin=arguments[0];this.size=arguments[1];}else if(arguments.length==4){this.origin=new IWPoint(arguments[0],arguments[1]);this.size=new IWSize(arguments[2],arguments[3]);}}IWRect.prototype.clone=function(){return new IWRect(this.origin.x,this.origin.y,this.size.width,this.size.height);}function IWZeroRect(){return new IWRect(0,0,0,0);}IWRect.prototype.toString=function(){return"Rect("+this.origin.toString()+", "+this.size.toString()+")";}IWRect.prototype.maxX=function(){return this.origin.x+this.size.width;}IWRect.prototype.maxY=function(){return this.origin.y+this.size.height;}IWRect.prototype.union=function(that){var minX=Math.min(this.origin.x,that.origin.x);var minY=Math.min(this.origin.y,that.origin.y);var maxX=Math.max(this.maxX(),that.maxX());var maxY=Math.max(this.maxY(),that.maxY());return new IWRect(minX,minY,maxX-minX,maxY-minY);}IWRect.prototype.intersection=function(that){var intersectionRect;var minX=Math.max(this.origin.x,that.origin.x);var minY=Math.max(this.origin.y,that.origin.y);var maxX=Math.min(this.maxX(),that.maxX());var maxY=Math.min(this.maxY(),that.maxY());if((minX<maxX)&&(minY<maxY)){intersectionRect=new IWRect(minX,minY,maxX-minX,maxY-minY);}else{intersectionRect=new IWRect(0,0,0,0);}return intersectionRect;}IWRect.prototype.scale=function(hscale,vscale,round){if(round===undefined)round=false;if(vscale===undefined)vscale=hscale;var scaledOrigin=this.origin.scale(hscale,vscale,round);var scaledSize=this.size.scale(hscale,vscale,round);return new IWRect(scaledOrigin.x,scaledOrigin.y,scaledSize.width,scaledSize.height);}IWRect.prototype.scaleSize=function(hscale,vscale,round){var scaledSize=this.size.scale(hscale,vscale,round);return new IWRect(this.origin.x,this.origin.y,scaledSize.width,scaledSize.height);}IWRect.prototype.round=function(){return this.scale(1,1,true);}IWRect.prototype.offset=function(deltaX,deltaY){var offsetOrigin=this.origin.offset(deltaX,deltaY);return new IWRect(offsetOrigin.x,offsetOrigin.y,this.size.width,this.size.height);}IWRect.prototype.offsetToOrigin=function(){return this.offset(-this.origin.x,-this.origin.y)}IWRect.prototype.centerPoint=function(){return this.offset(this.size.width/2,this.size.height/2);}IWRect.prototype.position=function(){return"position: absolute; left: "+this.origin.x+"px; top: "+this.origin.y+"px; width: "+this.size.width+"px; height: "+this.size.height+"px; ";}IWRect.prototype.clip=function(){return"clip: rect("+this.origin.y+"px, "+this.maxX()+"px, "+this.maxY()+"px, "+this.origin.x+"px);";}IWRect.prototype.toExtents=function(){return new IWExtents(this.origin.x,this.origin.y,this.origin.x+this.size.width,this.origin.y+this.size.height);}IWRect.prototype.paddingToRect=function(padded){return new IWPadding(this.origin.x-padded.origin.x,this.origin.y-padded.origin.y,padded.maxX()-this.maxX(),padded.maxY()-this.maxY());}function IWExtents(left,top,right,bottom){this.left=left;this.top=top;this.right=right;this.bottom=bottom;}IWExtents.prototype.clone=function(){return new IWExtents(this.left,this.top,this.right,this.bottom);}IWExtents.prototype.toRect=function(){return new IWRect(this.left,this.top,this.right-this.left,this.bottom-this.top);}function IWPadding(left,top,right,bottom){this.left=left;this.top=top;this.right=right;this.bottom=bottom;}IWRect.prototype.fill=function(context){context.fillRect(this.origin.x,this.origin.y,this.size.width,this.size.height);}IWRect.prototype.clear=function(context){context.clearRect(this.origin.x,this.origin.y,this.size.width,this.size.height);}var NotificationCenter=new IWNotificationCenter();function IWNotificationCenter(){this.mDispatchTable=new Array();}IWNotificationCenter.prototype.addObserver=function(observer,method,name,object){this.p_observersForName(name).push(new Array(observer,method,object));}IWNotificationCenter.prototype.removeObserver=function(observer){}IWNotificationCenter.prototype.postNotification=function(notification){if(notification.name()!=null){var observersForName=this.mDispatchTable[notification.name()];this.p_postNotificationToObservers(notification,observersForName);}var observersForNullName=this.mDispatchTable[null];this.p_postNotificationToObservers(notification,observersForNullName);}IWNotificationCenter.prototype.postNotificationWithInfo=function(name,object,userInfo){this.postNotification(new IWNotification(name,object,userInfo));}IWNotificationCenter.prototype.p_postNotificationToObservers=function(notification,observers){if(notification!=null&&observers!=null){for(var i=0;i<observers.length;i++){var observer=observers[i][0];var method=observers[i][1];var obj=observers[i][2];if(obj==null||obj===notification.object()){method.call(observer,notification);}}}}IWNotificationCenter.prototype.p_observersForName=function(name){if(this.mDispatchTable[name]===undefined){this.mDispatchTable[name]=new Array();}return this.mDispatchTable[name];}function IWNotification(name,object,userInfo){this.mName=name;this.mObject=object;this.mUserInfo=userInfo;}IWNotification.prototype.name=function(){return this.mName;}IWNotification.prototype.object=function(){return this.mObject;}IWNotification.prototype.userInfo=function(){return this.mUserInfo;}var IWAssertionsEnabled=true;function IWAssert(func,description){if(IWAssertionsEnabled){function IWAssertionFailed(func,description){var formatter=new RegExp("return[\t\r ]*([^};\r]*)");var assertionText=func.toString().match(formatter)[1];var message='Assertion failed: "'+assertionText+'"';if(description!=null)message+='.  '+description;iWLog(message);}function IWCoreAssert(func,description){if(func()==false){IWAssertionFailed(func,description);}}IWCoreAssert(function(){return typeof(func)=='function'},"IWAssert requires its first argument to be a function.  "+"Try wrapping your assertion in function(){return ... }");var result=func();IWCoreAssert(function(){return result!=null},"The result of your assertion function is null; "+"did you remember your return statement?");IWCoreAssert(function(){return result==true||result==false},"The result of your assertion function is neither true nor false");if(result==false){IWAssertionFailed(func,description);}}}Function.prototype.assert=function(description){IWAssert(this,description);}function makeAjaxHandler(callback){return function(request){if(request.readyState==4){callback(request,(request.status==200)||(request.status===undefined)||(request.status==0));}};}function makeXmlHttpRequest(url,handler){var request=false;if(window.XMLHttpRequest){request=new XMLHttpRequest();}else if(window.ActiveXObject){try{request=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){request=new ActiveXObject("Microsoft.XMLHTTP");}}if(!request){return false;}if(handler){request.onreadystatechange=function(){handler(request);};}try{request.open('GET',url,true);request.setRequestHeader('X-Requested-With','XMLHttpRequest');request.setRequestHeader('If-Modified-Since','Wed, 15 Nov 1995 00:00:00 GMT');if(request.overrideMimeType){request.overrideMimeType('text/xml');}request.send(null);}catch(e){return false;}return true;}function getTextFromNode(node){var result="";if(node.nodeType==Node.ELEMENT_NODE){var children=node.childNodes;for(var i=0;i<children.length;++i){result=result+getTextFromNode(children[i]);}}else if(node.nodeType==Node.TEXT_NODE){return node.nodeValue;}return result;}function getChildElementsByTagName(node,name){var result=[];for(var i=0;i<node.childNodes.length;++i){if(node.childNodes[i].tagName==name){result.push(node.childNodes[i]);}}return result;}function getChildElementsByTagNameNS(node,ns,nsPrefix,localName){var result=[];for(var i=0;i<node.childNodes.length;++i){var childNode=node.childNodes[i];if(childNode.namespaceURI){if(childNode.namespaceURI==ns){if(childNode.localName&&(childNode.localName==localName)){result.push(childNode);}else if(childNode.tagName==(nsPrefix+":"+localName)){result.push(childNode);}}}else{if((ns=="")&&(childNode.tagName==localName)){result.push(childNode);}}}return result;}function getFirstChildElementByTagNameNS(node,ns,nsPrefix,localName){var children=getChildElementsByTagNameNS(node,ns,nsPrefix,localName);if(children.length>0)return children[0];return null;}function getFirstChildElementByTagName(node,name){for(var i=0;i<node.childNodes.length;++i){if(node.childNodes[i].tagName==name){return node.childNodes[i];}}return null;}function getChildElementTextByTagName(node,tagName){var result="";if(node!==null){var children=getChildElementsByTagName(node,tagName);if(children.length>1){throw"MultipleResults";}if(children.length==1){result=getTextFromNode(children[0]);}}return result;}function getChildElementTextByTagNameNS(node,ns,nsPrefix,localName){var result="";if(node){var children=getChildElementsByTagNameNS(node,ns,nsPrefix,localName);if(children.length>1)throw"MultipleResults";if(children.length==1){result=getTextFromNode(children[0]);}}return result;}function getChildElements(node){var result=[];for(var i=0;i<node.childNodes.length;++i){var child=node.childNodes[i];if(child.nodeType==Node.ELEMENT_NODE)result.push(child);}return result;}function adjustNodeIds(node,suffix){var undefined;if(node.id!=""){node.id+=("$"+suffix);}var childElements=getChildElements(node);for(var i=0;i<childElements.length;++i){adjustNodeIds(childElements[i],suffix);}}function removeAllChildNodes(node){while(node.childNodes.length>0){node.removeChild(node.childNodes[0]);}}function nodeIsChildOf(node,ancestor){if(node){if(node.parentNode==ancestor)return true;elsereturn nodeIsChildOf(node.parentNode,ancestor)}return false;}function substituteSpans(parentNode,replacements){Object.keys(replacements).forEach(function(key){var spans=getElementsByTagAndClassName(parentNode,"span",key);spans.forEach(function(node){var contentType=replacements[key][0];var newContent=replacements[key][1];if(contentType=="text"){removeAllChildNodes(node);node.appendChild(document.createTextNode(newContent));}else if(contentType=="html"){node.innerHTML=newContent;}});});}var Prototype = {  Version: '1.6.0',  Browser: {    IE:     !!(window.attachEvent && !window.opera),    Opera:  !!window.opera,    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)  },  BrowserFeatures: {    XPath: !!document.evaluate,    ElementExtensions: !!window.HTMLElement,    SpecificElementExtensions:      document.createElement('div').__proto__ &&      document.createElement('div').__proto__ !==        document.createElement('form').__proto__  },  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,  emptyFunction: function() { },  K: function(x) { return x }};if (Prototype.Browser.MobileSafari)  Prototype.BrowserFeatures.SpecificElementExtensions = false;if (Prototype.Browser.WebKit)  Prototype.BrowserFeatures.XPath = false;/* Based on Alex Arnell's inheritance implementation. */var Class = {  create: function() {    var parent = null, properties = $A(arguments);    if (Object.isFunction(properties[0]))      parent = properties.shift();    function klass() {      this.initialize.apply(this, arguments);    }    Object.extend(klass, Class.Methods);    klass.superclass = parent;    klass.subclasses = [];    if (parent) {      var subclass = function() { };      subclass.prototype = parent.prototype;      klass.prototype = new subclass;      parent.subclasses.push(klass);    }    for (var i = 0; i < properties.length; i++)      klass.addMethods(properties[i]);    if (!klass.prototype.initialize)      klass.prototype.initialize = Prototype.emptyFunction;    klass.prototype.constructor = klass;    return klass;  }};Class.Methods = {  addMethods: function(source) {    var ancestor   = this.superclass && this.superclass.prototype;    var properties = Object.keys(source);    if (!Object.keys({ toString: true }).length)      properties.push("toString", "valueOf");    for (var i = 0, length = properties.length; i < length; i++) {      var property = properties[i], value = source[property];      if (ancestor && Object.isFunction(value) &&          value.argumentNames().first() == "$super") {        var method = value, value = Object.extend((function(m) {          return function() { return ancestor[m].apply(this, arguments) };        })(property).wrap(method), {          valueOf:  function() { return method },          toString: function() { return method.toString() }        });      }      this.prototype[property] = value;    }    return this;  }};var Abstract = { };Object.extend = function(destination, source) {  for (var property in source)    destination[property] = source[property];  return destination;};Object.extend(Object, {  inspect: function(object) {    try {      if (object === undefined) return 'undefined';      if (object === null) return 'null';      return object.inspect ? object.inspect() : object.toString();    } catch (e) {      if (e instanceof RangeError) return '...';      throw e;    }  },  toJSON: function(object) {    var type = typeof object;    switch (type) {      case 'undefined':      case 'function':      case 'unknown': return;      case 'boolean': return object.toString();    }    if (object === null) return 'null';    if (object.toJSON) return object.toJSON();    if (Object.isElement(object)) return;    var results = [];    for (var property in object) {      var value = Object.toJSON(object[property]);      if (value !== undefined)        results.push(property.toJSON() + ': ' + value);    }    return '{' + results.join(', ') + '}';  },  toQueryString: function(object) {    return $H(object).toQueryString();  },  toHTML: function(object) {    return object && object.toHTML ? object.toHTML() : String.interpret(object);  },  keys: function(object) {    var keys = [];    for (var property in object)      keys.push(property);    return keys;  },  values: function(object) {    var values = [];    for (var property in object)      values.push(object[property]);    return values;  },  clone: function(object) {    return Object.extend({ }, object);  },  isElement: function(object) {    return object && object.nodeType == 1;  },  isArray: function(object) {    return object && object.constructor === Array;  },  isHash: function(object) {    return object instanceof Hash;  },  isFunction: function(object) {    return typeof object == "function";  },  isString: function(object) {    return typeof object == "string";  },  isNumber: function(object) {    return typeof object == "number";  },  isUndefined: function(object) {    return typeof object == "undefined";  }});Object.extend(Function.prototype, {  argumentNames: function() {    var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");    return names.length == 1 && !names[0] ? [] : names;  },  bind: function() {    if (arguments.length < 2 && arguments[0] === undefined) return this;    var __method = this, args = $A(arguments), object = args.shift();    return function() {      return __method.apply(object, args.concat($A(arguments)));    }  },  bindAsEventListener: function() {    var __method = this, args = $A(arguments), object = args.shift();    return function(event) {      return __method.apply(object, [event || window.event].concat(args));    }  },  curry: function() {    if (!arguments.length) return this;    var __method = this, args = $A(arguments);    return function() {      return __method.apply(this, args.concat($A(arguments)));    }  },  delay: function() {    var __method = this, args = $A(arguments), timeout = args.shift() * 1000;    return window.setTimeout(function() {      return __method.apply(__method, args);    }, timeout);  },  wrap: function(wrapper) {    var __method = this;    return function() {      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));    }  },  methodize: function() {    if (this._methodized) return this._methodized;    var __method = this;    return this._methodized = function() {      return __method.apply(null, [this].concat($A(arguments)));    };  }});Function.prototype.defer = Function.prototype.delay.curry(0.01);Date.prototype.toJSON = function() {  return '"' + this.getUTCFullYear() + '-' +    (this.getUTCMonth() + 1).toPaddedString(2) + '-' +    this.getUTCDate().toPaddedString(2) + 'T' +    this.getUTCHours().toPaddedString(2) + ':' +    this.getUTCMinutes().toPaddedString(2) + ':' +    this.getUTCSeconds().toPaddedString(2) + 'Z"';};var Try = {  these: function() {    var returnValue;    for (var i = 0, length = arguments.length; i < length; i++) {      var lambda = arguments[i];      try {        returnValue = lambda();        break;      } catch (e) { }    }    return returnValue;  }};RegExp.prototype.match = RegExp.prototype.test;RegExp.escape = function(str) {  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');};/*--------------------------------------------------------------------------*/var PeriodicalExecuter = Class.create({  initialize: function(callback, frequency) {    this.callback = callback;    this.frequency = frequency;    this.currentlyExecuting = false;    this.registerCallback();  },  registerCallback: function() {    this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);  },  execute: function() {    this.callback(this);  },  stop: function() {    if (!this.timer) return;    clearInterval(this.timer);    this.timer = null;  },  onTimerEvent: function() {    if (!this.currentlyExecuting) {      try {        this.currentlyExecuting = true;        this.execute();      } finally {        this.currentlyExecuting = false;      }    }  }});Object.extend(String, {  interpret: function(value) {    return value == null ? '' : String(value);  },  specialChar: {    '\b': '\\b',    '\t': '\\t',    '\n': '\\n',    '\f': '\\f',    '\r': '\\r',    '\\': '\\\\'  }});Object.extend(String.prototype, {  gsub: function(pattern, replacement) {    var result = '', source = this, match;    replacement = arguments.callee.prepareReplacement(replacement);    while (source.length > 0) {      if (match = source.match(pattern)) {        result += source.slice(0, match.index);        result += String.interpret(replacement(match));        source  = source.slice(match.index + match[0].length);      } else {        result += source, source = '';      }    }    return result;  },  sub: function(pattern, replacement, count) {    replacement = this.gsub.prepareReplacement(replacement);    count = count === undefined ? 1 : count;    return this.gsub(pattern, function(match) {      if (--count < 0) return match[0];      return replacement(match);    });  },  scan: function(pattern, iterator) {    this.gsub(pattern, iterator);    return String(this);  },  truncate: function(length, truncation) {    length = length || 30;    truncation = truncation === undefined ? '...' : truncation;    return this.length > length ?      this.slice(0, length - truncation.length) + truncation : String(this);  },  strip: function() {    return this.replace(/^\s+/, '').replace(/\s+$/, '');  },  stripTags: function() {    return this.replace(/<\/?[^>]+>/gi, '');  },  stripScripts: function() {    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');  },  extractScripts: function() {    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');    return (this.match(matchAll) || []).map(function(scriptTag) {      return (scriptTag.match(matchOne) || ['', ''])[1];    });  },  evalScripts: function() {    return this.extractScripts().map(function(script) { return eval(script) });  },  escapeHTML: function() {    var self = arguments.callee;    self.text.data = this;    return self.div.innerHTML;  },  unescapeHTML: function() {    var div = new Element('div');    div.innerHTML = this.stripTags();    return div.childNodes[0] ? (div.childNodes.length > 1 ?      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :      div.childNodes[0].nodeValue) : '';  },  toQueryParams: function(separator) {    var match = this.strip().match(/([^?#]*)(#.*)?$/);    if (!match) return { };    return match[1].split(separator || '&').inject({ }, function(hash, pair) {      if ((pair = pair.split('='))[0]) {        var key = decodeURIComponent(pair.shift());        var value = pair.length > 1 ? pair.join('=') : pair[0];        if (value != undefined) value = decodeURIComponent(value);        if (key in hash) {          if (!Object.isArray(hash[key])) hash[key] = [hash[key]];          hash[key].push(value);        }        else hash[key] = value;      }      return hash;    });  },  toArray: function() {    return this.split('');  },  succ: function() {    return this.slice(0, this.length - 1) +      String.fromCharCode(this.charCodeAt(this.length - 1) + 1);  },  times: function(count) {    return count < 1 ? '' : new Array(count + 1).join(this);  },  camelize: function() {    var parts = this.split('-'), len = parts.length;    if (len == 1) return parts[0];    var camelized = this.charAt(0) == '-'      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)      : parts[0];    for (var i = 1; i < len; i++)      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);    return camelized;  },  capitalize: function() {    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();  },  underscore: function() {    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();  },  dasherize: function() {    return this.gsub(/_/,'-');  },  inspect: function(useDoubleQuotes) {    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {      var character = String.specialChar[match[0]];      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);    });    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';    return "'" + escapedString.replace(/'/g, '\\\'') + "'";  },  toJSON: function() {    return this.inspect(true);  },  unfilterJSON: function(filter) {    return this.sub(filter || Prototype.JSONFilter, '#{1}');  },  isJSON: function() {    var str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');    return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);  },  evalJSON: function(sanitize) {    var json = this.unfilterJSON();    try {      if (!sanitize || json.isJSON()) return eval('(' + json + ')');    } catch (e) { }    throw new SyntaxError('Badly formed JSON string: ' + this.inspect());  },  include: function(pattern) {    return this.indexOf(pattern) > -1;  },  startsWith: function(pattern) {    return this.indexOf(pattern) === 0;  },  endsWith: function(pattern) {    var d = this.length - pattern.length;    return d >= 0 && this.lastIndexOf(pattern) === d;  },  empty: function() {    return this == '';  },  blank: function() {    return /^\s*$/.test(this);  },  interpolate: function(object, pattern) {    return new Template(this, pattern).evaluate(object);  }});if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {  escapeHTML: function() {    return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');  },  unescapeHTML: function() {    return this.replace(/&amp;/g,'&').replace(/&lt;/g,'<').replace(/&gt;/g,'>');  }});String.prototype.gsub.prepareReplacement = function(replacement) {  if (Object.isFunction(replacement)) return replacement;  var template = new Template(replacement);  return function(match) { return template.evaluate(match) };};String.prototype.parseQuery = String.prototype.toQueryParams;Object.extend(String.prototype.escapeHTML, {  div:  document.createElement('div'),  text: document.createTextNode('')});with (String.prototype.escapeHTML) div.appendChild(text);var Template = Class.create({  initialize: function(template, pattern) {    this.template = template.toString();    this.pattern = pattern || Template.Pattern;  },  evaluate: function(object) {    if (Object.isFunction(object.toTemplateReplacements))      object = object.toTemplateReplacements();    return this.template.gsub(this.pattern, function(match) {      if (object == null) return '';      var before = match[1] || '';      if (before == '\\') return match[2];      var ctx = object, expr = match[3];      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/, match = pattern.exec(expr);      if (match == null) return before;      while (match != null) {        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];        ctx = ctx[comp];        if (null == ctx || '' == match[3]) break;        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);        match = pattern.exec(expr);      }      return before + String.interpret(ctx);    }.bind(this));  }});Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;var $break = { };var Enumerable = {  each: function(iterator, context) {    var index = 0;    iterator = iterator.bind(context);    try {      this._each(function(value) {        iterator(value, index++);      });    } catch (e) {      if (e != $break) throw e;    }    return this;  },  eachSlice: function(number, iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var index = -number, slices = [], array = this.toArray();    while ((index += number) < array.length)      slices.push(array.slice(index, index+number));    return slices.collect(iterator, context);  },  all: function(iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var result = true;    this.each(function(value, index) {      result = result && !!iterator(value, index);      if (!result) throw $break;    });    return result;  },  any: function(iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var result = false;    this.each(function(value, index) {      if (result = !!iterator(value, index))        throw $break;    });    return result;  },  collect: function(iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var results = [];    this.each(function(value, index) {      results.push(iterator(value, index));    });    return results;  },  detect: function(iterator, context) {    iterator = iterator.bind(context);    var result;    this.each(function(value, index) {      if (iterator(value, index)) {        result = value;        throw $break;      }    });    return result;  },  findAll: function(iterator, context) {    iterator = iterator.bind(context);    var results = [];    this.each(function(value, index) {      if (iterator(value, index))        results.push(value);    });    return results;  },  grep: function(filter, iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var results = [];    if (Object.isString(filter))      filter = new RegExp(filter);    this.each(function(value, index) {      if (filter.match(value))        results.push(iterator(value, index));    });    return results;  },  include: function(object) {    if (Object.isFunction(this.indexOf))      if (this.indexOf(object) != -1) return true;    var found = false;    this.each(function(value) {      if (value == object) {        found = true;        throw $break;      }    });    return found;  },  inGroupsOf: function(number, fillWith) {    fillWith = fillWith === undefined ? null : fillWith;    return this.eachSlice(number, function(slice) {      while(slice.length < number) slice.push(fillWith);      return slice;    });  },  inject: function(memo, iterator, context) {    iterator = iterator.bind(context);    this.each(function(value, index) {      memo = iterator(memo, value, index);    });    return memo;  },  invoke: function(method) {    var args = $A(arguments).slice(1);    return this.map(function(value) {      return value[method].apply(value, args);    });  },  max: function(iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var result;    this.each(function(value, index) {      value = iterator(value, index);      if (result == undefined || value >= result)        result = value;    });    return result;  },  min: function(iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var result;    this.each(function(value, index) {      value = iterator(value, index);      if (result == undefined || value < result)        result = value;    });    return result;  },  partition: function(iterator, context) {    iterator = iterator ? iterator.bind(context) : Prototype.K;    var trues = [], falses = [];    this.each(function(value, index) {      (iterator(value, index) ?        trues : falses).push(value);    });    return [trues, falses];  },  pluck: function(property) {    var results = [];    this.each(function(value) {      results.push(value[property]);    });    return results;  },  reject: function(iterator, context) {    iterator = iterator.bind(context);    var results = [];    this.each(function(value, index) {      if (!iterator(value, index))        results.push(value);    });    return results;  },  sortBy: function(iterator, context) {    iterator = iterator.bind(context);    return this.map(function(value, index) {      return {value: value, criteria: iterator(value, index)};    }).sort(function(left, right) {      var a = left.criteria, b = right.criteria;      return a < b ? -1 : a > b ? 1 : 0;    }).pluck('value');  },  toArray: function() {    return this.map();  },  zip: function() {    var iterator = Prototype.K, args = $A(arguments);    if (Object.isFunction(args.last()))      iterator = args.pop();    var collections = [this].concat(args).map($A);    return this.map(function(value, index) {      return iterator(collections.pluck(index));    });  },  size: function() {    return this.toArray().length;  },  inspect: function() {    return '#<Enumerable:' + this.toArray().inspect() + '>';  }};Object.extend(Enumerable, {  map:     Enumerable.collect,  find:    Enumerable.detect,  select:  Enumerable.findAll,  filter:  Enumerable.findAll,  member:  Enumerable.include,  entries: Enumerable.toArray,  every:   Enumerable.all,  some:    Enumerable.any});function $A(iterable) {  if (!iterable) return [];  if (iterable.toArray) return iterable.toArray();  var length = iterable.length, results = new Array(length);  while (length--) results[length] = iterable[length];  return results;}if (Prototype.Browser.WebKit) {  function $A(iterable) {    if (!iterable) return [];    if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&        iterable.toArray) return iterable.toArray();    var length = iterable.length, results = new Array(length);    while (length--) results[length] = iterable[length];    return results;  }}Array.from = $A;Object.extend(Array.prototype, Enumerable);if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;Object.extend(Array.prototype, {  _each: function(iterator) {    for (var i = 0, length = this.length; i < length; i++)      iterator(this[i]);  },  clear: function() {    this.length = 0;    return this;  },  first: function() {    return this[0];  },  last: function() {    return this[this.length - 1];  },  compact: function() {    return this.select(function(value) {      return value != null;    });  },  flatten: function() {    return this.inject([], function(array, value) {      return array.concat(Object.isArray(value) ?        value.flatten() : [value]);    });  },  without: function() {    var values = $A(arguments);    return this.select(function(value) {      return !values.include(value);    });  },  reverse: function(inline) {    return (inline !== false ? this : this.toArray())._reverse();  },  reduce: function() {    return this.length > 1 ? this : this[0];  },  uniq: function(sorted) {    return this.inject([], function(array, value, index) {      if (0 == index || (sorted ? array.last() != value : !array.include(value)))        array.push(value);      return array;    });  },  intersect: function(array) {    return this.uniq().findAll(function(item) {      return array.detect(function(value) { return item === value });    });  },  clone: function() {    return [].concat(this);  },  size: function() {    return this.length;  },  inspect: function() {    return '[' + this.map(Object.inspect).join(', ') + ']';  },  toJSON: function() {    var results = [];    this.each(function(object) {      var value = Object.toJSON(object);      if (value !== undefined) results.push(value);    });    return '[' + results.join(', ') + ']';  }});// use native browser JS 1.6 implementation if availableif (Object.isFunction(Array.prototype.forEach))  Array.prototype._each = Array.prototype.forEach;if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {  i || (i = 0);  var length = this.length;  if (i < 0) i = length + i;  for (; i < length; i++)    if (this[i] === item) return i;  return -1;};if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;  var n = this.slice(0, i).reverse().indexOf(item);  return (n < 0) ? n : i - n - 1;};Array.prototype.toArray = Array.prototype.clone;function $w(string) {  if (!Object.isString(string)) return [];  string = string.strip();  return string ? string.split(/\s+/) : [];}if (Prototype.Browser.Opera){  Array.prototype.concat = function() {    var array = [];    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);    for (var i = 0, length = arguments.length; i < length; i++) {      if (Object.isArray(arguments[i])) {        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)          array.push(arguments[i][j]);      } else {        array.push(arguments[i]);      }    }    return array;  };}Object.extend(Number.prototype, {  toColorPart: function() {    return this.toPaddedString(2, 16);  },  succ: function() {    return this + 1;  },  times: function(iterator) {    $R(0, this, true).each(iterator);    return this;  },  toPaddedString: function(length, radix) {    var string = this.toString(radix || 10);    return '0'.times(length - string.length) + string;  },  toJSON: function() {    return isFinite(this) ? this.toString() : 'null';  }});$w('abs round ceil floor').each(function(method){  Number.prototype[method] = Math[method].methodize();});function $H(object) {  return new Hash(object);};var Hash = Class.create(Enumerable, (function() {  if (function() {    var i = 0, Test = function(value) { this.key = value };    Test.prototype.key = 'foo';    for (var property in new Test('bar')) i++;    return i > 1;  }()) {    function each(iterator) {      var cache = [];      for (var key in this._object) {        var value = this._object[key];        if (cache.include(key)) continue;        cache.push(key);        var pair = [key, value];        pair.key = key;        pair.value = value;        iterator(pair);      }    }  } else {    function each(iterator) {      for (var key in this._object) {        var value = this._object[key], pair = [key, value];        pair.key = key;        pair.value = value;        iterator(pair);      }    }  }  function toQueryPair(key, value) {    if (Object.isUndefined(value)) return key;    return key + '=' + encodeURIComponent(String.interpret(value));  }  return {    initialize: function(object) {      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);    },    _each: each,    set: function(key, value) {      return this._object[key] = value;    },    get: function(key) {      return this._object[key];    },    unset: function(key) {      var value = this._object[key];      delete this._object[key];      return value;    },    toObject: function() {      return Object.clone(this._object);    },    keys: function() {      return this.pluck('key');    },    values: function() {      return this.pluck('value');    },    index: function(value) {      var match = this.detect(function(pair) {        return pair.value === value;      });      return match && match.key;    },    merge: function(object) {      return this.clone().update(object);    },    update: function(object) {      return new Hash(object).inject(this, function(result, pair) {        result.set(pair.key, pair.value);        return result;      });    },    toQueryString: function() {      return this.map(function(pair) {        var key = encodeURIComponent(pair.key), values = pair.value;        if (values && typeof values == 'object') {          if (Object.isArray(values))            return values.map(toQueryPair.curry(key)).join('&');        }        return toQueryPair(key, values);      }).join('&');    },    inspect: function() {      return '#<Hash:{' + this.map(function(pair) {        return pair.map(Object.inspect).join(': ');      }).join(', ') + '}>';    },    toJSON: function() {      return Object.toJSON(this.toObject());    },    clone: function() {      return new Hash(this);    }  }})());Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;Hash.from = $H;var ObjectRange = Class.create(Enumerable, {  initialize: function(start, end, exclusive) {    this.start = start;    this.end = end;    this.exclusive = exclusive;  },  _each: function(iterator) {    var value = this.start;    while (this.include(value)) {      iterator(value);      value = value.succ();    }  },  include: function(value) {    if (value < this.start)      return false;    if (this.exclusive)      return value < this.end;    return value <= this.end;  }});var $R = function(start, end, exclusive) {  return new ObjectRange(start, end, exclusive);};var Ajax = {  getTransport: function() {    return Try.these(      function() {return new XMLHttpRequest()},      function() {return new ActiveXObject('Msxml2.XMLHTTP')},      function() {return new ActiveXObject('Microsoft.XMLHTTP')}    ) || false;  },  activeRequestCount: 0};Ajax.Responders = {  responders: [],  _each: function(iterator) {    this.responders._each(iterator);  },  register: function(responder) {    if (!this.include(responder))      this.responders.push(responder);  },  unregister: function(responder) {    this.responders = this.responders.without(responder);  },  dispatch: function(callback, request, transport, json) {    this.each(function(responder) {      if (Object.isFunction(responder[callback])) {        try {          responder[callback].apply(responder, [request, transport, json]);        } catch (e) { }      }    });  }};Object.extend(Ajax.Responders, Enumerable);Ajax.Responders.register({  onCreate:   function() { Ajax.activeRequestCount++ },  onComplete: function() { Ajax.activeRequestCount-- }});Ajax.Base = Class.create({  initialize: function(options) {    this.options = {      method:       'post',      asynchronous: true,      contentType:  'application/x-www-form-urlencoded',      encoding:     'UTF-8',      parameters:   '',      evalJSON:     true,      evalJS:       true    };    Object.extend(this.options, options || { });    this.options.method = this.options.method.toLowerCase();    if (Object.isString(this.options.parameters))      this.options.parameters = this.options.parameters.toQueryParams();  }});Ajax.Request = Class.create(Ajax.Base, {  _complete: false,  initialize: function($super, url, options) {    $super(options);    this.transport = Ajax.getTransport();    this.request(url);  },  request: function(url) {    this.url = url;    this.method = this.options.method;    var params = Object.clone(this.options.parameters);    if (!['get', 'post'].include(this.method)) {      // simulate other verbs over post      params['_method'] = this.method;      this.method = 'post';    }    this.parameters = params;    if (params = Object.toQueryString(params)) {      // when GET, append parameters to URL      if (this.method == 'get')        this.url += (this.url.include('?') ? '&' : '?') + params;      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))        params += '&_=';    }    try {      var response = new Ajax.Response(this);      if (this.options.onCreate) this.options.onCreate(response);      Ajax.Responders.dispatch('onCreate', this, response);      this.transport.open(this.method.toUpperCase(), this.url,        this.options.asynchronous);      if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);      this.transport.onreadystatechange = this.onStateChange.bind(this);      this.setRequestHeaders();      this.body = this.method == 'post' ? (this.options.postBody || params) : null;      this.transport.send(this.body);      /* Force Firefox to handle ready state 4 for synchronous requests */      if (!this.options.asynchronous && this.transport.overrideMimeType)        this.onStateChange();    }    catch (e) {      this.dispatchException(e);    }  },  onStateChange: function() {    var readyState = this.transport.readyState;    if (readyState > 1 && !((readyState == 4) && this._complete))      this.respondToReadyState(this.transport.readyState);  },  setRequestHeaders: function() {    var headers = {      'X-Requested-With': 'XMLHttpRequest',      'X-Prototype-Version': Prototype.Version,      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'    };    if (this.method == 'post') {      headers['Content-type'] = this.options.contentType +        (this.options.encoding ? '; charset=' + this.options.encoding : '');      /* Force "Connection: close" for older Mozilla browsers to work       * around a bug where XMLHttpRequest sends an incorrect       * Content-length header. See Mozilla Bugzilla #246651.       */      if (this.transport.overrideMimeType &&          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)            headers['Connection'] = 'close';    }    // user-defined headers    if (typeof this.options.requestHeaders == 'object') {      var extras = this.options.requestHeaders;      if (Object.isFunction(extras.push))        for (var i = 0, length = extras.length; i < length; i += 2)          headers[extras[i]] = extras[i+1];      else        $H(extras).each(function(pair) { headers[pair.key] = pair.value });    }    for (var name in headers)      this.transport.setRequestHeader(name, headers[name]);  },  success: function() {    var status = this.getStatus();    return !status || (status >= 200 && status < 300);  },  getStatus: function() {    try {      return this.transport.status || 0;    } catch (e) { return 0 }  },  respondToReadyState: function(readyState) {    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);    if (state == 'Complete') {      try {        this._complete = true;        (this.options['on' + response.status]         || this.options['on' + (this.success() ? 'Success' : 'Failure')]         || Prototype.emptyFunction)(response, response.headerJSON);      } catch (e) {        this.dispatchException(e);      }      var contentType = response.getHeader('Content-type');      if (this.options.evalJS == 'force'          || (this.options.evalJS && contentType          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))        this.evalResponse();    }    try {      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);    } catch (e) {      this.dispatchException(e);    }    if (state == 'Complete') {      // avoid memory leak in MSIE: clean up      this.transport.onreadystatechange = Prototype.emptyFunction;    }  },  getHeader: function(name) {    try {      return this.transport.getResponseHeader(name);    } catch (e) { return null }  },  evalResponse: function() {    try {      return eval((this.transport.responseText || '').unfilterJSON());    } catch (e) {      this.dispatchException(e);    }  },  dispatchException: function(exception) {    (this.options.onException || Prototype.emptyFunction)(this, exception);    Ajax.Responders.dispatch('onException', this, exception);  }});Ajax.Request.Events =  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];Ajax.Response = Class.create({  initialize: function(request){    this.request = request;    var transport  = this.transport  = request.transport,        readyState = this.readyState = transport.readyState;    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {      this.status       = this.getStatus();      this.statusText   = this.getStatusText();      this.responseText = String.interpret(transport.responseText);      this.headerJSON   = this._getHeaderJSON();    }    if(readyState == 4) {      var xml = transport.responseXML;      this.responseXML  = xml === undefined ? null : xml;      this.responseJSON = this._getResponseJSON();    }  },  status:      0,  statusText: '',  getStatus: Ajax.Request.prototype.getStatus,  getStatusText: function() {    try {      return this.transport.statusText || '';    } catch (e) { return '' }  },  getHeader: Ajax.Request.prototype.getHeader,  getAllHeaders: function() {    try {      return this.getAllResponseHeaders();    } catch (e) { return null }  },  getResponseHeader: function(name) {    return this.transport.getResponseHeader(name);  },  getAllResponseHeaders: function() {    return this.transport.getAllResponseHeaders();  },  _getHeaderJSON: function() {    var json = this.getHeader('X-JSON');    if (!json) return null;    json = decodeURIComponent(escape(json));    try {      return json.evalJSON(this.request.options.sanitizeJSON);    } catch (e) {      this.request.dispatchException(e);    }  },  _getResponseJSON: function() {    var options = this.request.options;    if (!options.evalJSON || (options.evalJSON != 'force' &&      !(this.getHeader('Content-type') || '').include('application/json')))        return null;    try {      return this.transport.responseText.evalJSON(options.sanitizeJSON);    } catch (e) {      this.request.dispatchException(e);    }  }});Ajax.Updater = Class.create(Ajax.Request, {  initialize: function($super, container, url, options) {    this.container = {      success: (container.success || container),      failure: (container.failure || (container.success ? null : container))    };    options = options || { };    var onComplete = options.onComplete;    options.onComplete = (function(response, param) {      this.updateContent(response.responseText);      if (Object.isFunction(onComplete)) onComplete(response, param);    }).bind(this);    $super(url, options);  },  updateContent: function(responseText) {    var receiver = this.container[this.success() ? 'success' : 'failure'],        options = this.options;    if (!options.evalScripts) responseText = responseText.stripScripts();    if (receiver = $(receiver)) {      if (options.insertion) {        if (Object.isString(options.insertion)) {          var insertion = { }; insertion[options.insertion] = responseText;          receiver.insert(insertion);        }        else options.insertion(receiver, responseText);      }      else receiver.update(responseText);    }    if (this.success()) {      if (this.onComplete) this.onComplete.bind(this).defer();    }  }});Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {  initialize: function($super, container, url, options) {    $super(options);    this.onComplete = this.options.onComplete;    this.frequency = (this.options.frequency || 2);    this.decay = (this.options.decay || 1);    this.updater = { };    this.container = container;    this.url = url;    this.start();  },  start: function() {    this.options.onComplete = this.updateComplete.bind(this);    this.onTimerEvent();  },  stop: function() {    this.updater.options.onComplete = undefined;    clearTimeout(this.timer);    (this.onComplete || Prototype.emptyFunction).apply(this, arguments);  },  updateComplete: function(response) {    if (this.options.decay) {      this.decay = (response.responseText == this.lastText ?        this.decay * this.options.decay : 1);      this.lastText = response.responseText;    }    this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);  },  onTimerEvent: function() {    this.updater = new Ajax.Updater(this.container, this.url, this.options);  }});function $(element) {  if (arguments.length > 1) {    for (var i = 0, elements = [], length = arguments.length; i < length; i++)      elements.push($(arguments[i]));    return elements;  }  if (Object.isString(element))    element = document.getElementById(element);  return Element.extend(element);}if (Prototype.BrowserFeatures.XPath) {  document._getElementsByXPath = function(expression, parentElement) {    var results = [];    var query = document.evaluate(expression, $(parentElement) || document,      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);    for (var i = 0, length = query.snapshotLength; i < length; i++)      results.push(Element.extend(query.snapshotItem(i)));    return results;  };}/*--------------------------------------------------------------------------*/if (!window.Node) var Node = { };if (!Node.ELEMENT_NODE) {  // DOM level 2 ECMAScript Language Binding  Object.extend(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  });}(function() {  var element = this.Element;  this.Element = function(tagName, attributes) {    attributes = attributes || { };    tagName = tagName.toLowerCase();    var cache = Element.cache;    if (Prototype.Browser.IE && attributes.name) {      tagName = '<' + tagName + ' name="' + attributes.name + '">';      delete attributes.name;      return Element.writeAttribute(document.createElement(tagName), attributes);    }    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);  };  Object.extend(this.Element, element || { });}).call(window);Element.cache = { };Element.Methods = {  visible: function(element) {    return $(element).style.display != 'none';  },  toggle: function(element) {    element = $(element);    Element[Element.visible(element) ? 'hide' : 'show'](element);    return element;  },  hide: function(element) {    $(element).style.display = 'none';    return element;  },  show: function(element) {    $(element).style.display = '';    return element;  },  remove: function(element) {    element = $(element);    element.parentNode.removeChild(element);    return element;  },  update: function(element, content) {    element = $(element);    if (content && content.toElement) content = content.toElement();    if (Object.isElement(content)) return element.update().insert(content);    content = Object.toHTML(content);    element.innerHTML = content.stripScripts();    content.evalScripts.bind(content).defer();    return element;  },  replace: function(element, content) {    element = $(element);    if (content && content.toElement) content = content.toElement();    else if (!Object.isElement(content)) {      content = Object.toHTML(content);      var range = element.ownerDocument.createRange();      range.selectNode(element);      content.evalScripts.bind(content).defer();      content = range.createContextualFragment(content.stripScripts());    }    element.parentNode.replaceChild(content, element);    return element;  },  insert: function(element, insertions) {    element = $(element);    if (Object.isString(insertions) || Object.isNumber(insertions) ||        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))          insertions = {bottom:insertions};    var content, t, range;    for (position in insertions) {      content  = insertions[position];      position = position.toLowerCase();      t = Element._insertionTranslations[position];      if (content && content.toElement) content = content.toElement();      if (Object.isElement(content)) {        t.insert(element, content);        continue;      }      content = Object.toHTML(content);      range = element.ownerDocument.createRange();      t.initializeRange(element, range);      t.insert(element, range.createContextualFragment(content.stripScripts()));      content.evalScripts.bind(content).defer();    }    return element;  },  wrap: function(element, wrapper, attributes) {    element = $(element);    if (Object.isElement(wrapper))      $(wrapper).writeAttribute(attributes || { });    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);    else wrapper = new Element('div', wrapper);    if (element.parentNode)      element.parentNode.replaceChild(wrapper, element);    wrapper.appendChild(element);    return wrapper;  },  inspect: function(element) {    element = $(element);    var result = '<' + element.tagName.toLowerCase();    $H({'id': 'id', 'className': 'class'}).each(function(pair) {      var property = pair.first(), attribute = pair.last();      var value = (element[property] || '').toString();      if (value) result += ' ' + attribute + '=' + value.inspect(true);    });    return result + '>';  },  recursivelyCollect: function(element, property) {    element = $(element);    var elements = [];    while (element = element[property])      if (element.nodeType == 1)        elements.push(Element.extend(element));    return elements;  },  ancestors: function(element) {    return $(element).recursivelyCollect('parentNode');  },  descendants: function(element) {    return $A($(element).getElementsByTagName('*')).each(Element.extend);  },  firstDescendant: function(element) {    element = $(element).firstChild;    while (element && element.nodeType != 1) element = element.nextSibling;    return $(element);  },  immediateDescendants: function(element) {    if (!(element = $(element).firstChild)) return [];    while (element && element.nodeType != 1) element = element.nextSibling;    if (element) return [element].concat($(element).nextSiblings());    return [];  },  previousSiblings: function(element) {    return $(element).recursivelyCollect('previousSibling');  },  nextSiblings: function(element) {    return $(element).recursivelyCollect('nextSibling');  },  siblings: function(element) {    element = $(element);    return element.previousSiblings().reverse().concat(element.nextSiblings());  },  match: function(element, selector) {    if (Object.isString(selector))      selector = new Selector(selector);    return selector.match($(element));  },  up: function(element, expression, index) {    element = $(element);    if (arguments.length == 1) return $(element.parentNode);    var ancestors = element.ancestors();    return expression ? Selector.findElement(ancestors, expression, index) :      ancestors[index || 0];  },  down: function(element, expression, index) {    element = $(element);    if (arguments.length == 1) return element.firstDescendant();    var descendants = element.descendants();    return expression ? Selector.findElement(descendants, expression, index) :      descendants[index || 0];  },  previous: function(element, expression, index) {    element = $(element);    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));    var previousSiblings = element.previousSiblings();    return expression ? Selector.findElement(previousSiblings, expression, index) :      previousSiblings[index || 0];  },  next: function(element, expression, index) {    element = $(element);    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));    var nextSiblings = element.nextSiblings();    return expression ? Selector.findElement(nextSiblings, expression, index) :      nextSiblings[index || 0];  },  select: function() {    var args = $A(arguments), element = $(args.shift());    return Selector.findChildElements(element, args);  },  adjacent: function() {    var args = $A(arguments), element = $(args.shift());    return Selector.findChildElements(element.parentNode, args).without(element);  },  identify: function(element) {    element = $(element);    var id = element.readAttribute('id'), self = arguments.callee;    if (id) return id;    do { id = 'anonymous_element_' + self.counter++ } while ($(id));    element.writeAttribute('id', id);    return id;  },  readAttribute: function(element, name) {    element = $(element);    if (Prototype.Browser.IE) {      var t = Element._attributeTranslations.read;      if (t.values[name]) return t.values[name](element, name);      if (t.names[name]) name = t.names[name];      if (name.include(':')) {        return (!element.attributes || !element.attributes[name]) ? null :         element.attributes[name].value;      }    }    return element.getAttribute(name);  },  writeAttribute: function(element, name, value) {    element = $(element);    var attributes = { }, t = Element._attributeTranslations.write;    if (typeof name == 'object') attributes = name;    else attributes[name] = value === undefined ? true : value;    for (var attr in attributes) {      var name = t.names[attr] || attr, value = attributes[attr];      if (t.values[attr]) name = t.values[attr](element, value);      if (value === false || value === null)        element.removeAttribute(name);      else if (value === true)        element.setAttribute(name, name);      else element.setAttribute(name, value);    }    return element;  },  getHeight: function(element) {    return $(element).getDimensions().height;  },  getWidth: function(element) {    return $(element).getDimensions().width;  },  classNames: function(element) {    return new Element.ClassNames(element);  },  hasClassName: function(element, className) {    if (!(element = $(element))) return;    var elementClassName = element.className;    return (elementClassName.length > 0 && (elementClassName == className ||      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));  },  addClassName: function(element, className) {    if (!(element = $(element))) return;    if (!element.hasClassName(className))      element.className += (element.className ? ' ' : '') + className;    return element;  },  removeClassName: function(element, className) {    if (!(element = $(element))) return;    element.className = element.className.replace(      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();    return element;  },  toggleClassName: function(element, className) {    if (!(element = $(element))) return;    return element[element.hasClassName(className) ?      'removeClassName' : 'addClassName'](className);  },  // removes whitespace-only text node children  cleanWhitespace: function(element) {    element = $(element);    var node = element.firstChild;    while (node) {      var nextNode = node.nextSibling;      if (node.nodeType == 3 && !/\S/.test(node.nodeValue))        element.removeChild(node);      node = nextNode;    }    return element;  },  empty: function(element) {    return $(element).innerHTML.blank();  },  descendantOf: function(element, ancestor) {    element = $(element), ancestor = $(ancestor);    if (element.compareDocumentPosition)      return (element.compareDocumentPosition(ancestor) & 8) === 8;    if (element.sourceIndex && !Prototype.Browser.Opera) {      var e = element.sourceIndex, a = ancestor.sourceIndex,       nextAncestor = ancestor.nextSibling;      if (!nextAncestor) {        do { ancestor = ancestor.parentNode; }        while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);      }      if (nextAncestor) return (e > a && e < nextAncestor.sourceIndex);    }    while (element = element.parentNode)      if (element == ancestor) return true;    return false;  },  scrollTo: function(element) {    element = $(element);    var pos = element.cumulativeOffset();    window.scrollTo(pos[0], pos[1]);    return element;  },  getStyle: function(element, style) {    element = $(element);    style = style == 'float' ? 'cssFloat' : style.camelize();    var value = element.style[style];    if (!value) {      var css = document.defaultView.getComputedStyle(element, null);      value = css ? css[style] : null;    }    if (style == 'opacity') return value ? parseFloat(value) : 1.0;    return value == 'auto' ? null : value;  },  getOpacity: function(element) {    return $(element).getStyle('opacity');  },  setStyle: function(element, styles) {    element = $(element);    var elementStyle = element.style, match;    if (Object.isString(styles)) {      element.style.cssText += ';' + styles;      return styles.include('opacity') ?        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;    }    for (var property in styles)      if (property == 'opacity') element.setOpacity(styles[property]);      else        elementStyle[(property == 'float' || property == 'cssFloat') ?          (elementStyle.styleFloat === undefined ? 'cssFloat' : 'styleFloat') :            property] = styles[property];    return element;  },  setOpacity: function(element, value) {    element = $(element);    element.style.opacity = (value == 1 || value === '') ? '' :      (value < 0.00001) ? 0 : value;    return element;  },  getDimensions: function(element) {    element = $(element);    var display = $(element).getStyle('display');    if (display != 'none' && display != null) // Safari bug      return {width: element.offsetWidth, height: element.offsetHeight};    // All *Width and *Height properties give 0 on elements with display none,    // so enable the element temporarily    var els = element.style;    var originalVisibility = els.visibility;    var originalPosition = els.position;    var originalDisplay = els.display;    els.visibility = 'hidden';    els.position = 'absolute';    els.display = 'block';    var originalWidth = element.clientWidth;    var originalHeight = element.clientHeight;    els.display = originalDisplay;    els.position = originalPosition;    els.visibility = originalVisibility;    return {width: originalWidth, height: originalHeight};  },  makePositioned: function(element) {    element = $(element);    var pos = Element.getStyle(element, 'position');    if (pos == 'static' || !pos) {      element._madePositioned = true;      element.style.position = 'relative';      // Opera returns the offset relative to the positioning context, when an      // element is position relative but top and left have not been defined      if (window.opera) {        element.style.top = 0;        element.style.left = 0;      }    }    return element;  },  undoPositioned: function(element) {    element = $(element);    if (element._madePositioned) {      element._madePositioned = undefined;      element.style.position =        element.style.top =        element.style.left =        element.style.bottom =        element.style.right = '';    }    return element;  },  makeClipping: function(element) {    element = $(element);    if (element._overflow) return element;    element._overflow = Element.getStyle(element, 'overflow') || 'auto';    if (element._overflow !== 'hidden')      element.style.overflow = 'hidden';    return element;  },  undoClipping: function(element) {    element = $(element);    if (!element._overflow) return element;    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;    element._overflow = null;    return element;  },  cumulativeOffset: function(element) {    var valueT = 0, valueL = 0;    do {      valueT += element.offsetTop  || 0;      valueL += element.offsetLeft || 0;      element = element.offsetParent;    } while (element);    return Element._returnOffset(valueL, valueT);  },  positionedOffset: function(element) {    var valueT = 0, valueL = 0;    do {      valueT += element.offsetTop  || 0;      valueL += element.offsetLeft || 0;      element = element.offsetParent;      if (element) {        if (element.tagName == 'BODY') break;        var p = Element.getStyle(element, 'position');        if (p == 'relative' || p == 'absolute') break;      }    } while (element);    return Element._returnOffset(valueL, valueT);  },  absolutize: function(element) {    element = $(element);    if (element.getStyle('position') == 'absolute') return;    // Position.prepare(); // To be done manually by Scripty when it needs it.    var offsets = element.positionedOffset();    var top     = offsets[1];    var left    = offsets[0];    var width   = element.clientWidth;    var height  = element.clientHeight;    element._originalLeft   = left - parseFloat(element.style.left  || 0);    element._originalTop    = top  - parseFloat(element.style.top || 0);    element._originalWidth  = element.style.width;    element._originalHeight = element.style.height;    element.style.position = 'absolute';    element.style.top    = top + 'px';    element.style.left   = left + 'px';    element.style.width  = width + 'px';    element.style.height = height + 'px';    return element;  },  relativize: function(element) {    element = $(element);    if (element.getStyle('position') == 'relative') return;    // Position.prepare(); // To be done manually by Scripty when it needs it.    element.style.position = 'relative';    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0);    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);    element.style.top    = top + 'px';    element.style.left   = left + 'px';    element.style.height = element._originalHeight;    element.style.width  = element._originalWidth;    return element;  },  cumulativeScrollOffset: function(element) {    var valueT = 0, valueL = 0;    do {      valueT += element.scrollTop  || 0;      valueL += element.scrollLeft || 0;      element = element.parentNode;    } while (element);    return Element._returnOffset(valueL, valueT);  },  getOffsetParent: function(element) {    if (element.offsetParent) return $(element.offsetParent);    if (element == document.body) return $(element);    while ((element = element.parentNode) && element != document.body)      if (Element.getStyle(element, 'position') != 'static')        return $(element);    return $(document.body);  },  viewportOffset: function(forElement) {    var valueT = 0, valueL = 0;    var element = forElement;    do {      valueT += element.offsetTop  || 0;      valueL += element.offsetLeft || 0;      // Safari fix      if (element.offsetParent == document.body &&        Element.getStyle(element, 'position') == 'absolute') break;    } while (element = element.offsetParent);    element = forElement;    do {      if (!Prototype.Browser.Opera || element.tagName == 'BODY') {        valueT -= element.scrollTop  || 0;        valueL -= element.scrollLeft || 0;      }    } while (element = element.parentNode);    return Element._returnOffset(valueL, valueT);  },  clonePosition: function(element, source) {    var options = Object.extend({      setLeft:    true,      setTop:     true,      setWidth:   true,      setHeight:  true,      offsetTop:  0,      offsetLeft: 0    }, arguments[2] || { });    // find page position of source    source = $(source);    var p = source.viewportOffset();    // find coordinate system to use    element = $(element);    var delta = [0, 0];    var parent = null;    // delta [0,0] will do fine with position: fixed elements,    // position:absolute needs offsetParent deltas    if (Element.getStyle(element, 'position') == 'absolute') {      parent = element.getOffsetParent();      delta = parent.viewportOffset();    }    // correct by body offsets (fixes Safari)    if (parent == document.body) {      delta[0] -= document.body.offsetLeft;      delta[1] -= document.body.offsetTop;    }    // set position    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px';    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px';    if (options.setWidth)  element.style.width = source.offsetWidth + 'px';    if (options.setHeight) element.style.height = source.offsetHeight + 'px';    return element;  }};Element.Methods.identify.counter = 1;Object.extend(Element.Methods, {  getElementsBySelector: Element.Methods.select,  childElements: Element.Methods.immediateDescendants});Element._attributeTranslations = {  write: {    names: {      className: 'class',      htmlFor:   'for'    },    values: { }  }};if (!document.createRange || Prototype.Browser.Opera) {  Element.Methods.insert = function(element, insertions) {    element = $(element);    if (Object.isString(insertions) || Object.isNumber(insertions) ||        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))          insertions = { bottom: insertions };    var t = Element._insertionTranslations, content, position, pos, tagName;    for (position in insertions) {      content  = insertions[position];      position = position.toLowerCase();      pos      = t[position];      if (content && content.toElement) content = content.toElement();      if (Object.isElement(content)) {        pos.insert(element, content);        continue;      }      content = Object.toHTML(content);      tagName = ((position == 'before' || position == 'after')        ? element.parentNode : element).tagName.toUpperCase();      if (t.tags[tagName]) {        var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());        if (position == 'top' || position == 'after') fragments.reverse();        fragments.each(pos.insert.curry(element));      }      else element.insertAdjacentHTML(pos.adjacency, content.stripScripts());      content.evalScripts.bind(content).defer();    }    return element;  };}if (Prototype.Browser.Opera) {  Element.Methods._getStyle = Element.Methods.getStyle;  Element.Methods.getStyle = function(element, style) {    switch(style) {      case 'left':      case 'top':      case 'right':      case 'bottom':        if (Element._getStyle(element, 'position') == 'static') return null;      default: return Element._getStyle(element, style);    }  };  Element.Methods._readAttribute = Element.Methods.readAttribute;  Element.Methods.readAttribute = function(element, attribute) {    if (attribute == 'title') return element.title;    return Element._readAttribute(element, attribute);  };}else if (Prototype.Browser.IE) {  $w('positionedOffset getOffsetParent viewportOffset').each(function(method) {    Element.Methods[method] = Element.Methods[method].wrap(      function(proceed, element) {        element = $(element);        var position = element.getStyle('position');        if (position != 'static') return proceed(element);        element.setStyle({ position: 'relative' });        var value = proceed(element);        element.setStyle({ position: position });        return value;      }    );  });  Element.Methods.getStyle = function(element, style) {    element = $(element);    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();    var value = element.style[style];    if (!value && element.currentStyle) value = element.currentStyle[style];    if (style == 'opacity') {      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))        if (value[1]) return parseFloat(value[1]) / 100;      return 1.0;    }    if (value == 'auto') {      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))        return element['offset' + style.capitalize()] + 'px';      return null;    }    return value;  };  Element.Methods.setOpacity = function(element, value) {    function stripAlpha(filter){      return filter.replace(/alpha\([^\)]*\)/gi,'');    }    element = $(element);    var currentStyle = element.currentStyle;    if ((currentStyle && !currentStyle.hasLayout) ||      (!currentStyle && element.style.zoom == 'normal'))        element.style.zoom = 1;    var filter = element.getStyle('filter'), style = element.style;    if (value == 1 || value === '') {      (filter = stripAlpha(filter)) ?        style.filter = filter : style.removeAttribute('filter');      return element;    } else if (value < 0.00001) value = 0;    style.filter = stripAlpha(filter) +      'alpha(opacity=' + (value * 100) + ')';    return element;  };  Element._attributeTranslations = {    read: {      names: {        'class': 'className',        'for':   'htmlFor'      },      values: {        _getAttr: function(element, attribute) {          return element.getAttribute(attribute, 2);        },        _getAttrNode: function(element, attribute) {          var node = element.getAttributeNode(attribute);          return node ? node.value : "";        },        _getEv: function(element, attribute) {          var attribute = element.getAttribute(attribute);          return attribute ? attribute.toString().slice(23, -2) : null;        },        _flag: function(element, attribute) {          return $(element).hasAttribute(attribute) ? attribute : null;        },        style: function(element) {          return element.style.cssText.toLowerCase();        },        title: function(element) {          return element.title;        }      }    }  };  Element._attributeTranslations.write = {    names: Object.clone(Element._attributeTranslations.read.names),    values: {      checked: function(element, value) {        element.checked = !!value;      },      style: function(element, value) {        element.style.cssText = value ? value : '';      }    }  };  Element._attributeTranslations.has = {};  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +      'encType maxLength readOnly longDesc').each(function(attr) {    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;    Element._attributeTranslations.has[attr.toLowerCase()] = attr;  });  (function(v) {    Object.extend(v, {      href:        v._getAttr,      src:         v._getAttr,      type:        v._getAttr,      action:      v._getAttrNode,      disabled:    v._flag,      checked:     v._flag,      readonly:    v._flag,      multiple:    v._flag,      onload:      v._getEv,      onunload:    v._getEv,      onclick:     v._getEv,      ondblclick:  v._getEv,      onmousedown: v._getEv,      onmouseup:   v._getEv,      onmouseover: v._getEv,      onmousemove: v._getEv,      onmouseout:  v._getEv,      onfocus:     v._getEv,      onblur:      v._getEv,      onkeypress:  v._getEv,      onkeydown:   v._getEv,      onkeyup:     v._getEv,      onsubmit:    v._getEv,      onreset:     v._getEv,      onselect:    v._getEv,      onchange:    v._getEv    });  })(Element._attributeTranslations.read.values);}else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {  Element.Methods.setOpacity = function(element, value) {    element = $(element);    element.style.opacity = (value == 1) ? 0.999999 :      (value === '') ? '' : (value < 0.00001) ? 0 : value;    return element;  };}else if (Prototype.Browser.WebKit) {  Element.Methods.setOpacity = function(element, value) {    element = $(element);    element.style.opacity = (value == 1 || value === '') ? '' :      (value < 0.00001) ? 0 : value;    if (value == 1)      if(element.tagName == 'IMG' && element.width) {        element.width++; element.width--;      } else try {        var n = document.createTextNode(' ');        element.appendChild(n);        element.removeChild(n);      } catch (e) { }    return element;  };  // Safari returns margins on body which is incorrect if the child is absolutely  // positioned.  For performance reasons, redefine Position.cumulativeOffset for  // KHTML/WebKit only.  Element.Methods.cumulativeOffset = function(element) {    var valueT = 0, valueL = 0;    do {      valueT += element.offsetTop  || 0;      valueL += element.offsetLeft || 0;      if (element.offsetParent == document.body)        if (Element.getStyle(element, 'position') == 'absolute') break;      element = element.offsetParent;    } while (element);    return Element._returnOffset(valueL, valueT);  };}if (Prototype.Browser.IE || Prototype.Browser.Opera) {  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements  Element.Methods.update = function(element, content) {    element = $(element);    if (content && content.toElement) content = content.toElement();    if (Object.isElement(content)) return element.update().insert(content);    content = Object.toHTML(content);    var tagName = element.tagName.toUpperCase();    if (tagName in Element._insertionTranslations.tags) {      $A(element.childNodes).each(function(node) { element.removeChild(node) });      Element._getContentFromAnonymousElement(tagName, content.stripScripts())        .each(function(node) { element.appendChild(node) });    }    else element.innerHTML = content.stripScripts();    content.evalScripts.bind(content).defer();    return element;  };}if (document.createElement('div').outerHTML) {  Element.Met