{"version":3,"file":"components/com_appbuilder/assets/compressed/js/html.js","sources":["components/com_appbuilder/libraries/tinySHA1.r4.js","components/com_appbuilder/assets/scripts/maps/maps.js","components/com_appbuilder/libraries/elabel.js","components/com_appbuilder/libraries/mootools/mootools-core.js","components/com_appbuilder/libraries/mootools/mootools-more.js","components/com_appbuilder/libraries/iscroll/src/iscroll.js","components/com_appbuilder/libraries/pdfobject/code/pdfobject.js","components/com_appbuilder/libraries/lscache/lscache.js","components/com_appbuilder/assets/scripts/phone/functions.js","components/com_appbuilder/libraries/spinningwheel/spinningwheel.js","components/com_appbuilder/assets/scripts/phone/scroller.js","components/com_appbuilder/assets/scripts/phone/analytics.js","components/com_appbuilder/assets/scripts/phone/bbm.js","components/com_appbuilder/assets/scripts/phone/phone.js","components/com_appbuilder/assets/scripts/phone/navigator.js","components/com_appbuilder/assets/scripts/phone/navigator.screen.appsscreen.js","components/com_appbuilder/assets/scripts/phone/navigator.screen.gallery.js","components/com_appbuilder/assets/scripts/phone/navigator.screen.list.js","components/com_appbuilder/assets/scripts/phone/navigator.screen.map.js","components/com_appbuilder/assets/scripts/phone/jsapi.js","components/com_appbuilder/assets/scripts/phone/history.js","components/com_appbuilder/assets/scripts/phone/loader.js","components/com_appbuilder/assets/scripts/phone/fileloader.js","components/com_appbuilder/assets/scripts/phone/storage.js","components/com_appbuilder/assets/scripts/phone/sound.js","components/com_appbuilder/libraries/add2home/src/add2home.js","components/com_appbuilder/assets/scripts/phone/cache.js"],"names":["SHA1","s","U","a","b","c","push","L","P","A","d","B","e","length","i","charAt","join","f","g","h","v","w","x","y","z","M","j","O","k","t","charCodeAt","slice","appbuilder","window","map","delay","NOT_INCLUDED","LOADING","INCLUDED","FAILED","included","navigator","offline","failed","onInitialize","each","cb","this","include","script","document","createElement","type","async","src","location","protocol","getElementsByTagName","parentNode","insertBefore","initialize","clearTimeout","setupInfoBox","failedTimeout","position","requested","onPosition","after","ret","getPosition","Date","getTime","timestamp","geolocation","getCurrentPosition","p","timeout","maximumAge","InfoBox","opts","google","maps","OverlayView","call","latlng_","latlng","map_","offsetVertical_","offsetHorizontal_","height_","element_","element","me","boundsChangedListener_","event","addListener","panMap","apply","infoboxes","setMap","prototype","remove","div_","removeChild","draw","pixPosition","getProjection","fromLatLngToDivPixel","style","display","left","clientWidth","clientHeight","top","panes","getPanes","div","floatPane","appendChild","className","bounds","getBounds","iwWidth","width_","iwHeight","iwOffsetX","iwOffsetY","padX","padY","mapDiv","getDiv","mapWidth","offsetWidth","mapHeight","offsetHeight","boundsSpan","toSpan","longSpan","lng","latSpan","lat","degPixelX","degPixelY","mapWestLng","getSouthWest","mapEastLng","getNorthEast","mapNorthLat","mapSouthLat","iwWestLng","iwEastLng","iwNorthLat","iwSouthLat","shiftLng","shiftLat","center","getCenter","centerX","centerY","setCenter","LatLng","removeListener","MooTools","version","build","typeOf","item","$family","nodeName","nodeType","test","nodeValue","callee","Function","instanceOf","object","constructor","$constructor","parent","hasOwnProperty","enumerables","toString","overloadSetter","usePlural","self","overloadGetter","args","result","arguments","extend","key","value","implement","Array","from","Type","isEnumerable","Number","number","parseFloat","isFinite","String","hide","$hidden","protect","$protected","name","lower","toLowerCase","typeCheck","Object","hooks","hooksOf","method","hook","previous","alias","existing","mirror","force","methods","isType","l","generic","proto","methodsEnumerable","propertyIsEnumerable","forEachMethod","fn","RegExp","Boolean","min","max","Math","floor","random","bind","forEach","cloneOf","clone","mergeOne","source","current","merge","append","original","extended","UID","now","every","filter","results","indexOf","some","clean","invoke","methodName","associate","keys","obj","link","contains","array","getLast","getRandom","combine","erase","splice","empty","flatten","concat","pick","hexToRgb","rgb","toInt","rgbToHex","hex","bit","regex","params","string","separator","trim","replace","camelCase","match","toUpperCase","hyphenate","capitalize","escapeRegExp","base","parseInt","toFloat","substitute","regexp","limit","round","precision","pow","toFixed","times","math","attempt","that","F","bound","context","pass","setTimeout","periodical","setInterval","subset","values","getLength","keyOf","toQueryString","queryString","qs","val","encodeURIComponent","ua","userAgent","platform","UA","mode","documentMode","Browser","Platform","Features","xpath","air","query","json","Plugins","Request","XMLHTTP","XMLHttpRequest","MSXML2","ActiveXObject","MSXML","xhr","plugins","description","GetVariable","Flash","exec","text","execScript","setAttribute","head","scripts","all","code","Document","Window","Element","Event","html","documentElement","execCommand","attachEvent","addEventListener","unloadEvent","detachEvent","arrayFrom","childNodes","_keys","DOMEvent","win","$extended","shift","shiftKey","control","ctrlKey","alt","altKey","meta","metaKey","target","srcElement","id","which","keyCode","fromCharCode","doc","compatMode","body","page","pageX","clientX","scrollLeft","pageY","clientY","scrollTop","client","pageXOffset","pageYOffset","wheel","wheelDelta","detail","rightClick","button","related","relatedTarget","rotation","scale","targetTouches","changedTouches","touches","touch","stop","preventDefault","stopPropagation","cancelBubble","returnValue","defineKey","defineKeys","38","40","37","39","27","32","8","9","46","13","Class","newClass","reset","$prototyping","$caller","caller","Error","$name","$owner","wrap","$origin","wrapper","retain","Mutators","getInstance","klass","Extends","Implements","items","instance","Chain","$chain","chain","callChain","clearChain","removeOn","full","first","Events","$events","addEvent","internal","addEvents","events","fireEvent","removeEvent","index","removeEvents","fns","Options","setOptions","options","option","parser","rawMatch","combinator","combinatorChildren","tagName","attributeKey","attributeOperator","attributeQuote","attributeValue","pseudoMarker","pseudoClass","pseudoQuote","pseudoClassQuotedValue","pseudoClassValue","separatorIndex","parsed","expressions","combinatorIndex","currentSeparator","reversed","reverseCombinator","tag","currentParsed","reUnescape","classList","classes","pseudos","attributes","operator","cache","reverseCache","parse","expression","isReversed","Slick","currentCache","raw","reverse","exp","last","parts","cexp","exports","local","featuresCache","isNativeCode","isXML","xmlVersion","xml","setDocument","ownerDocument","feature","root","rootUid","getUIDXML","features","isXMLDocument","brokenStarGEBTN","starSelectsClosedQSA","idGetsName","brokenMixedCaseQSA","brokenGEBCN","brokenCheckedQSA","brokenEmptyAttributeQSA","isHTMLDocument","nativeMatchesSelector","starSelectsClosed","starSelectsComments","brokenSecondClassNameGEBCN","cachedGetElementsByClassName","brokenFormAttributeGetter","selected","testNode","testRoot","innerHTML","getElementById","createComment","firstChild","getElementsByClassName","querySelectorAll","getAttribute","matchesSelector","mozMatchesSelector","webkitMatchesSelector","slick_expando","getUID","getUIDHTML","node","attributeGetters","attributeNode","getAttributeNode","hasAttribute","attribute","specified","nativeRootContains","nativeDocumentContains","compareDocumentPosition","documentSorter","sourceIndex","aRange","createRange","bRange","setStart","setEnd","compareBoundaryPoints","Range","START_TO_END","reSimpleSelector","reEmptyAttribute","qsaFailExpCache","search","found","uniques","hasOthers","contextIsDocument","simpleSelector","simpleSelectors","nodes","symbol","matchClass","sort","querySelector","disableQSA","_expression","_context","currentId","slickid","removeAttribute","posNTH","posNTHLast","posNTHType","posNTHTypeLast","pushArray","pushUID","m","n","currentItems","currentExpression","currentBit","lastBit","bitUniques","uidx","uidk","uid","uniqueNumber","cacheNTH","matchNTH","parseNTHArgument","argument","special","createNTHPseudo","child","sibling","positions","ofType","el","count","pos","matchSelector","matchNode","selector","matchError","simpleExpCounter","matchPseudo","pseudoName","part","cls","combinators"," ","children","getById","idNode","getByClass",">","nextSibling","+","^","~","++","~~","!","!>","!+","previousSibling","!^","lastChild","!~","innerText","textContent","not","first-child","last-child","only-child","prev","next","nth-child","nth-last-child","nth-of-type","nth-last-of-type","even","odd","first-of-type","last-of-type","only-of-type","enabled","disabled","checked","focus","activeElement","href","for","htmlFor","cssText","tabindex","maxlength","MAXLENGTH","maxLength","find","container","defineAttributeGetter","lookupAttributeGetter","definePseudo","lookupPseudo","pseudo","override","uidOf","props","konstructor","Constructors","set","attr","newElement","_fireEvent","elements","Elements","Prototype","IFrame","iframe","properties","isObject","onload","uniqueID","onLoad","contentWindow","frames","unshift","newElements","collection","0","1","createElementAcceptsHTML","escapeQuotes","defaultChecked","newTextNode","createTextNode","getDocument","getWindow","types","nocash","toElement","textnode","whitespace","zero","$","nc","getElements","getElement","injectCombinator","getNext","getPrevious","getParent","getAllNext","getAllPrevious","getSiblings","getChildren","getParents","getFirst","$$","inserters","before","bottom","inside","propertyGetters","propertySetters","property","real","bools","booleans","bool","class","input","pollutesGetAttribute","setProperty","setter","attributeWhiteList","retrieve","setProperties","getProperty","getter","expando","outer","outerHTML","substr","getProperties","removeProperty","removeProperties","prop","Properties","get","hasClass","addClass","removeClass","toggleClass","adopt","fragment","createDocumentFragment","appendText","where","grab","inject","replaces","replaceChild","wraps","getSelected","opt","collected","storage","clearAttributes","formProps","textarea","destroy","dispose","contents","keepid","cloneNode","ce","te","mergeAttributes","no","eo","ie","co","to","old","removeEventListener","dflt","store","eliminate","CollectGarbage","supportsHTML5Elements","tags","split","supportsTableInnerHTML","table","tr","supportsTRInnerHTML","translations","select","tbody","thead","tfoot","level","testForm","optionValue","color","doesNotRemoveStyles","styles","setStyles","hasOpacity","opacity","hasFilter","reAlpha","setVisibility","visibility","setOpacity","currentStyle","hasLayout","zoom","getComputedStyle","getOpacity","floatName","cssFloat","defaultView","computed","getPropertyValue","setStyle","Styles","getStyle","ShortStyles","isNaN","size","opera","getStyles","right","width","height","maxWidth","maxHeight","minWidth","minHeight","backgroundColor","backgroundPosition","fontSize","letterSpacing","lineHeight","clip","margin","padding","border","borderWidth","borderStyle","borderColor","zIndex","fontWeight","textIndent","direction","Short","All","sd","bd","bdw","bds","bdc","realType","custom","condition","onAdd","defn","nativeEvent","NativeEvents","list","onRemove","attached","cloneEvents","eventType","click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","gesturestart","gesturechange","gestureend","blur","change","submit","paste","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll","mouseenter","mouseleave","check","prefix","propertychange","propertyName","eventListenerSupport","focusin","focusout","bubbleUp","capture","_key","formObserver","forms","listen","form","listeners","listener","_fn","inputObserver","relay","useCapture","newType","delegation","stored","_uid","_type","_match","_map","elementEvent","__match","delegator","__uid","styleNumber","styleString","borderBox","topBorder","leftBorder","isBody","getCompatElement","brokenOffsetParent","offsetParent","isOffset","isOffsetStatic","scrollTo","getSize","getScrollSize","scrollWidth","scrollHeight","getScroll","getScrolls","getOffsetParent","isOffsetCheck","getOffsets","getBoundingClientRect","ios","htmlScroll","elemScrolls","isFixed","clientLeft","clientTop","offsetLeft","offsetTop","firefox","safari","relative","offset","relativePosition","getCoordinates","computePosition","setPosition","getHeight","getWidth","getScrollTop","getScrollLeft","getScrollHeight","getScrollWidth","getTop","getLeft","Fx","fps","unit","duration","frameSkip","subject","getTransition","cos","PI","step","diff","time","frameInterval","frame","delta","transition","compute","isRunning","cancel","start","Durations","pushInstance","pullInstance","pause","resume","instances","short","normal","long","timers","loop","clearInterval","CSS","prepare","pixelLeft","Parsers","serve","returned","render","Cache","selectorTest","styleSheets","sheet","domain","rules","cssRules","rule","selectorText","Color","one","Tween","tween","fade","toggle","flag","highlight","end","Morph","morph","trans","Transitions","Sine","easeInOut","data","Transition","easeIn","easeOut","linear","transitions","Pow","Expo","Circ","sin","acos","Back","Bounce","Elastic","progressSupport","url","headers","X-Requested-With","Accept","format","isSuccess","emulation","urlEncoded","encoding","evalScripts","evalResponse","noCache","onStateChange","readyState","running","status","onreadystatechange","onprogress","onloadstart","timer","response","responseText","responseXML","success","failure","processScripts","getHeader","stripScripts","onSuccess","onFailure","loadstart","progress","setHeader","getResponseHeader","send","_method","pathname","trimPosition","lastIndexOf","open","user","password","withCredentials","setRequestHeader","sender","HTML","update","javascript","temp","tree","isString","JSON","\b","\t","\n","\f","\r","\"","\\","escape","chr","validate","encode","stringify","toJSON","decode","secure","eval","X-Request","Cookie","path","write","date","setTime","toGMTString","cookie","read","decodeURIComponent","ready","loaded","shouldPoll","checks","testElement","domready","poll","doScrollWorks","doScroll","state","Swiff","quality","allowScriptAccess","wMode","swLiveConnect","callBacks","vars","CallBacks","callBack","flashVars","classid","movie","param","remote","rs","CallFunction","__flash__argumentsToXML","More","Pseudos","storeKey","storageOf","_monitorEvents","splitType","parsedPseudos","splits","stack","stackFn","monitor","once","throttle","_throttled","_pause","refactor","refactors","origin","Binds","binds","Occlude","occlude","occluded","wait","chains","effects","effect","pauseFx","nil","average","sum","unique","shuffle","r","reduce","reduceRight","defined","getFromPath","cleanValues","run","locales","getSet","Locale","Set","define","locale","use","getCurrent","inherit","inherits","sets","defineData","_base","names","months","months_abbr","days","days_abbr","dateOrder","shortDate","shortTime","AM","PM","firstDayOfWeek","ordinal","dayOfMonth","lessThanMinuteAgo","minuteAgo","minutesAgo","hourAgo","hoursAgo","dayAgo","daysAgo","weekAgo","weeksAgo","monthAgo","monthsAgo","yearAgo","yearsAgo","lessThanMinuteUntil","minuteUntil","minutesUntil","hourUntil","hoursUntil","dayUntil","daysUntil","weekUntil","weeksUntil","monthUntil","monthsUntil","yearUntil","yearsUntil","DateMethods","Methods","ms","year","mo","sec","hr","pad","digits","increment","interval","units","decrement","isLeapYear","clearTime","resolution","getLastDayOfMonth","daysInMonth","getDayOfYear","UTC","day","setDay","getMsg","parseDay","currentDay","getWeek","firstDayOfYear","dayOfWeek","dividend","month","startOfWeek","getOrdinal","getTimezone","getGMTOffset","off","abs","setAMPM","ampm","getAMPM","str","isValid","valueOf","formats","$0","$1","toISOString","compare","strftime","rfcDayAbbr","rfcMonthAbbr","db","compact","rfc822","rfc2822","iso8601","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","getUTCMilliseconds","parsePatterns","nativeParse","parseWord","word","num","translated","startCentury","startYear","second","minute","hour","week","pattern","bits","re","handler","parseMonth","parseUTC","localDate","utcSeconds","orderIndex","defineFormat","defineParser","defineParsers","define2DigitYearStart","defineFormats","regexOf","replacers","H","I","o","Y","S","currentLanguage","recompile","language","handle","getTimezoneOffset","timeDiffInWords","distanceOfTimeInWords","timeDiff","vals","durations","getTimePhrase","suffix","eon","Infinity","msg","getDay","newDay","addDays","getDate","decimal","group","currency","getOption","negative","decimals","negativeLocale","toPrecision","zeros","newOutput","substring","formatCurrency","scientific","formatPercentage","C","D","E","G","N","R","T","ue","UE","u","Z","th","TH","dh","DH","ss","oe","OE","ae","AE","tidy","*","'","...","-","»","walk","replacements","getRegexForTag","regstr","reg","standardize","repeat","ceil","getTags","stripTags","truncate","trail","atChar","parseQueryString","decodeKeys","decodeValues","cleanQueryString","URI","schemes","http","https","ftp","rtsp","mms","file","uri","scheme","port","directory","parseDirectory","baseDirectory","regs","directoryDot","endSlash","dir","pop","host","setData","getData","go","toURI","clearData","baseDir","relDir","toAbsolute","toRelative","Hash","getClean","$H","has","hasValue","undefined","getKeys","getValues","notation","getTextInRange","getSelectedText","setSelectionRange","getSelectionStart","getSelectionEnd","selection","getSelectedRange","selectionStart","selectionEnd","range","parentElement","duplicate","moveStart","moveToElementText","setEndPoint","setCaretPosition","selectRange","getCaretPosition","createTextRange","collapse","moveEnd","insertAtCursor","insertAroundCursor","defaultMiddle","selStart","excludeScripts","copyFromEvents","keysStoreKey","keysKeyupStoreKey","pressed","16","17","18","20","33","34","35","36","144","145","186","187","188","190","191","192","219","220","221","222","107","getStylesList","planes","directions","edge","calculateEdgeSize","total","isVisible","measure","toMeasure","expose","restore","getDimensions","computeSize","dim","getComputedSize","dimensions","edges","plane","capitalized","edgesize","supportsPositionFixed","supportTested","testPositionFixed","pin","enable","forceScroll","pinnedPosition","scrollFixer","currentPosition","unpin","togglePin","Position","relativeTo","getOptions","setPositionOption","setEdgeOption","setOffsetOption","setDimensionsOption","getCoordinateFromValue","edgeOption","parentOffset","parentScroll","parentPositioned","setPositionCoordinates","toEdge","allowNegative","toMinMax","relFixedPosition","toRelFixedPosition","ignoreScroll","toIgnoreScroll","ignoreMargins","toIgnoreMargins","offsetY","offsetX","calc","winSize","xy","minmax","lr","winScroll","relScroll","edgeOffset","computedRight","computedLeft","totalWidth","computedTop","computedBottom","totalHeight","calculatePosition","returnPos","isDisplayed","show","swapClass","add","clearSelection","getSelection","removeAllRanges","IframeShim","browsers","ie6","mac","makeShim","shim","scrolling","frameborder","Mask","maskMargins","useIframeShim","iframeShimOptions","hideOnClick","hidden","showMask","hideMask","destroyOnHide","mask","unmask","Spinner","containerPosition","content","messageContainer","img","fxOptions","deactivate","active","message","noFx","useSpinner","spinnerOptions","spinnerTarget","_send","spinner","getSpinner","spin","unspin","Form","requestOptions","sendButtonClicked","extraData","resetForm","setTarget","attach","request","makeRequest","evt","exception","attachReset","OverText","saveClickedButton","fv","onFormValidate","onSubmit","detach","disable","valid","stopOnFailure","targetName","clickedCleaner","fq","hideTheseOf","hideThese","hideInputs","otClasses","ot","labelClass","Reveal","transitionOpacity","dissolve","hiding","showing","startStyles","overflow","reveal","heightOverride","widthOverride","nix","isBoolean","wink","isNumber","Append","useReveal","revealOptions","kids","finish","required","minLength","integer","numeric","alpha","alphanum","dateSuchAs","dateInFormatMDY","email","currencyDollar","oneRequired","errorPrefix","warningPrefix","noSpace","reqChkByNode","requiredChk","reqChkByName","startDate","endDate","currendDate","afterDate","beforeDate","startMonth","sameMonth","creditcard","InputValidator","errorMsg","field","getProps","getError","err","validators","validatorProps","Validator","fieldSelectors","ignoreHidden","ignoreDisabled","useTitles","evaluateOnSubmit","evaluateFieldsOnBlur","evaluateFieldsOnChange","serial","watchFields","getFields","fields","validationMonitor","validateField","resetField","paused","warned","passed","validationTypes","cn","getValidator","validatorsFailed","hasValidator","warn","validator","ignoreField","enforceField","adders","addAllThese","selectedIndex","elLength","dateFormat","dateLocale","dateNouns","wordsInValue","formatted","Inline","showError","errorElement","hideError","scrollToErrorsOnSubmit","scrollToErrorsOnBlur","scrollToErrorsOnChange","scrollFxOptions","advice","makeAdvice","insertAdvice","showAdvice","hideAdvice","title","cssClass","getAdvice","getFieldId","getPropName","getAllAdviceMessages","warner","warnOnly","msgPos","par","fx","Scroll","toEnforce","enforceChildrenOf","toIgnore","ignoreChildrenOf","eleArr","toToggle","toToggleChildrenOf","nodeId","useTitle","label","grpName","groupName","oneCheckedItem","getElementsByName","matchName","matchInput","eleVal","matchVal","afterLabel","afterElement","beforeLabel","beforeElement","emptyValue","startMo","sameMonthAs","d1","d2","ccNum","valid_type","cur","chunks","positionOptions","pollInterval","textOverride","cursor","textHolder","assert","reposition","startPolling","pollingPaused","poller","stopPolling","suppressFocus","hideAll","showAll","iFrom","iTo","iNow","iProps","Accordion","fixedHeight","fixedWidth","alwaysHide","trigger","initialDisplayFx","resetHeight","isElement","togglers","internalChain","addSection","toggler","idx","displayer","padding-top","border-top","padding-bottom","border-bottom","padding-left","border-left","padding-right","border-right","fullOpacity","fullWidth","fullHeight","removeSection","displayIndex","remover","useFx","selfHidden","Move","destination","topLeft","wheelStops","stopper","calculateScroll","scrollSize","toTop","toLeft","toRight","toBottom","axes","axis","toElementEdge","containerSize","toElementCenter","Slide","hideOverflow","layout","vertical","horizontal","how","caseIn","caseOut","slideIn","slideOut","slide","SmoothScroll","links","anchor","useLink","hash","Sort","setDefaultOrder","currentOrder","newOrder","vert","newPos","mapped","rearrangeDOM","rearranged","getDefaultOrder","getCurrentOrder","forward","backward","sortByElements","swap","two","Drag","snap","grid","invert","modifiers","htype","handles","mouse","ondragstartFixed","ondragstart","drag","eventStop","coordinates","limitZI","distance","sqrt","makeResizable","droppables","precalculate","includeMargins","checkDroppables","overed","calculateLimit","containerCoordinates","elementMargin","elementBorder","containerMargin","containerBorder","offsetParentPadding","coords","ie7","getDroppableCoordinates","makeDraggable","Slider","onTick","setKnobPosition","initialStep","steps","knob","previousChange","previousEnd","setSliderDimensions","setRange","dragOptions","onDrag","draggedKnob","onStart","onBeforeStart","isDragging","onCancel","onComplete","setSnap","clickedElement","scrolledElement","autosize","toPosition","stepWidth","half","checkStep","stepSize","toStep","Sortables","revert","lists","idle","addLists","removeLists","addItems","removeItems","getClone","getDroppables","constrain","insert","dragging","onSnap","onEnter","serialize","modifier","isFunction","JSONP","onRequest","log","console","onError","callbackKey","injectScript","counter","request_map","getScript","clear","Queue","autoAdvance","concurrent","requests","queue","reqBinders","addRequests","addRequest","req","getName","_groupSend","removeRequest","getRunning","q","hasNext","runNext","runAll","onException","initialDelay","startTimer","lastDelay","completeCheck","stopTimer","hsbToRgb","hsb","rgbToHsb","mix","colors","setHue","setSaturation","percent","setBrightness","$RGB","$HSB","$HEX","red","green","blue","hue","brightness","saturation","rr","gr","br","Group","len","togo","autoSave","save","Table","HtmlTable","cellpadding","cellspacing","rows","footers","tBodies","setHeaders","tHead","getHead","setFooters","tFoot","foot","row","what","tds","td","rowProperties","pushMany","classZebra","zebra","zebraOnlyVisibleRows","updateZebras","setRowStyle","pushed","sortIndex","sortReverse","parsers","defaultParser","classSortable","classHeadSort","classHeadSortRev","classNoSort","classGroupHead","classGroup","classCellSort","classSortSpan","sortable","thSelector","sorted","headClick","sortSpans","enableSort","attachSorts","detachSorts","sortEnabled","setParsers","detectParsers","detectParser","cell","thDiv","sortSpan","convert","ParserPriority","parserName","cells","previousSerialization","tableState","setSortedState","setHeadSort","setRowSort","pre","rowIndex","setGroupSort","getParser","clearSort","rel","parseData","reSort","disableSort","span","input-checked","input-value","numberLax","float","floatLax","Keyboard","defaultEventType","manager","nonParsedEvents","_manager","_setup","toggleActive","isActive","activate","_activeKB","relinquish","manage","drop","_instances","trace","_disable","_handle","preventKeyboardPropagation","bubbles","ignore","mods","ctrl","mod","keyboard","hasConsole","widget","wiget","addShortcut","shortcut","_shortcuts","_shortcutIndex","getKeyboard","addShortcuts","removeShortcut","getShortcut","removeShortcuts","getShortcuts","rebind","newKeys","shortcuts","getActiveShortcuts","activeKBS","activeSCS","kb","many","useKeyboard","classRowSelected","classRowHovered","classSelectable","shiftForMultiSelect","allowMultiSelect","selectable","selectHiddenRows","selectedRows","clickRow","activateKeyboard","selectEnabled","enableSelect","selectNone","attachSelects","disableSelect","updateSelects","toggleRow","isSelected","selectRow","_nocheck","focused","deselectRow","selectAll","startRow","endRow","_deselect","tmp","deselectRange","enterRow","hovered","leaveRow","binders","shiftFocus","getRowByOffset","selecting","rangeStart","includeHiddenRows","click:relay(tr)","contextmenu:relay(tr)","selectKeysDefined","held","mover","keydown:shift+up","keydown:shift+down","keyup:shift+up","keyup:shift+down","keyup:up","keyup:down","shiftHint","Select Previous Row","Select Next Row","Scroller","area","velocity","onChange","docBody","getCoords","prefixStyle","vendor","dummyStyle","vendors","cssVendor","transform","transitionProperty","transitionDuration","transformOrigin","transitionTimingFunction","transitionDelay","isAndroid","appVersion","isIDevice","isTouchPad","has3d","hasTouch","hasTransform","hasTransitionEnd","RESIZE_EV","START_EV","MOVE_EV","END_EV","CANCEL_EV","TRNEND_EV","transitionEnd","webkit","Moz","nextFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","callback","cancelFrame","cancelRequestAnimationFrame","webkitCancelAnimationFrame","webkitCancelRequestAnimationFrame","mozCancelRequestAnimationFrame","oCancelRequestAnimationFrame","msCancelRequestAnimationFrame","translateZ","iScroll","scroller","hScroll","vScroll","bounce","bounceLock","momentum","lockDirection","useTransform","useTransition","topOffset","checkDOMChanges","handleClick","hScrollbar","vScrollbar","fixedScrollbar","hideScrollbar","fadeScrollbar","scrollbarClass","zoomMin","zoomMax","doubleTapZoom","wheelAction","snapThreshold","onRefresh","onBeforeScrollStart","onScrollStart","onBeforeScrollMove","onScrollMove","onBeforeScrollEnd","onScrollEnd","onTouchEnd","onDestroy","onZoomStart","onZoom","onZoomEnd","refresh","_bind","checkDOMTime","_checkDOMChanges","canIScroll","currPageX","currPageY","pagesX","pagesY","aniTime","wheelZoomCount","handleEvent","_start","_move","_end","_resize","_wheel","_transitionEnd","moved","zoomed","animating","scrollerW","scrollerH","_scrollbar","bar","hScrollbarSize","hScrollbarWrapper","hScrollbarIndicatorSize","hScrollbarIndicator","hScrollbarMaxScroll","hScrollbarProp","maxScrollX","vScrollbarSize","vScrollbarWrapper","vScrollbarIndicatorSize","vScrollbarIndicator","vScrollbarMaxScroll","vScrollbarProp","maxScrollY","_scrollbarPos","_pos","matrix","c1","c2","point","_transitionTime","distX","distY","absDistX","absDistY","dirX","dirY","touchesDistStart","originX","wrapperOffsetLeft","originY","wrapperOffsetTop","_unbind","absStartX","absStartY","startX","startY","pointX","pointY","startTime","timeStamp","deltaX","deltaY","newX","newY","touchesDist","lastScale","minScrollY","ev","newDuration","momentumX","dist","momentumY","newPosX","newPosY","doubleTapTimer","createEvent","initMouseEvent","view","screenX","screenY","_fake","dispatchEvent","_resetPos","_momentum","wrapperW","wrapperH","_snap","resetX","resetY","wheelDeltaX","wheelDeltaY","deltaScale","_startAni","animate","onAnimationEnd","maxDistUpper","maxDistLower","deceleration","speed","newDist","newTime","outsideDist","_offset","sizeX","sizeY","bubble","els","scrollToElement","scrollToPage","relScale","isReady","PDFObject","pluginTypeFound","pdfobjectversion","pdfOpenParams","hasReaderActiveX","axObj","hasReader","regx","hasGeneric","plugin","mimeTypes","enabledPlugin","pluginFound","setCssForFullWindowPdf","html_style","body_style","buildQueryString","pdfParams","encodeURI","embed","targetID","targetNode","lscache","expirationKey","CACHESUFFIX","currentTime","supportsStorage","localStorage","getItem","supportsJSON","setItem","removeItem","storedKey","mainKey","storedKeys","expiration","parsedStorage","expirationTime","SpinningWheel","cellHeight","friction","slotData","lockScreen","currentTarget","tapDown","scrollStart","tapCancel","scrollHasStarted","scrollMove","tapUp","scrollEnd","backWithinBoundaries","onOrientationChange","onScroll","swWrapper","innerHeight","calculateSlotsWidth","slotEl","activeSlot","swSlotWrapper","swSlots","swFrame","slotWidth","create","out","ul","background","slotPosition","slotYPosition","slotMaxScroll","defaultValue","scrollToValue","cancelAction","cancelDone","close","addSlot","getSelectedValues","slot","xPos","scrollStartY","scrollStartTime","topDelta","scrollDistance","scrollDuration","newScrollDistance","newPosition","slotNum","dest","runtime","yPos","doneAction","setCancelAction","action","setDoneAction","app","makeElement","createScreen","hasBack","scrolls","back","tab","inner","makeConfirm","question","okfnc","cancelfnc","okbtn","cancelbtn","confirm","alert","isPhoneGap","notification","isMobile","btnIndex","loadScript","onfail","online","decoy","decoyEl","svg","isIE","debug","a1","a2","a3","a4","agent","platformBB","android","BB10","playBook","ipodIos7","iphoneIos7","ipadIos7","smartphone","blackberry","cordova","PhoneGap","hasPhoneDialer","PhoneDialer","info","telPreview","emailPreview","hasCORS","hasGAPlugin","gaPlugin","device","canCapture","captureVideo","captureImage","captureAudio","camera","getPicture","canChoose","mapMarker","system","hasDataCoverage","onLine","blankImage","canvas","getContext","toDataURL","canGetImageData","getImageDataURL","Image","drawImage","crossOrigin","onerror","onabort","started","startHeightTracker","headerElement","styleElement","updateMinHeight","styleSheet","Analytics","pages","phone","currentAppName","currentAppId","pushVar","pushEvent","pushPageview","screen","screenName","setAccount","account","accountHandle","ga","cat","pluginReady","trackEvent","eventCategory","eventAction","eventLabel","eventValue","mainonly","trackPage","setVariable","init","BBM","bbmSetup","access","cbs","uuid","canBBM","setup","postSetup","accessChanged","bbm","onaccesschanged","processCbs","register","accessible","shareApp","users","inviteToDownload","Phone","controller","timeoutUpdate","fullscreen","statusbar","files","updateSingle","browserHistory","splash","homeButton","fixed","masking","prefixes","currentIOS7","temporaryStorage","Storage","LocalStorage","history","History","loader","Loader","Navigator","currentMasking","applyTabMask","standalone","innerWidth","resetPos","setHorizontal","setRealSize","realSize","data-linktype","data-href","data-no-glow","checkHistory","linktypes","noresize","removeTabMask","hor","updateApp","showLoading","getLastUpdate","setLastUpdate","flush","hideLoading","fetch","published","getUniqueId","uniqueId","getMilliseconds","fetchId","fetchUrl","direct","loadingcb","FileLoader","fetchLive","fetchedObj","postVars","alwaysLive","updated","updatedObj","refreshes","storeObj","flushStorage","currentApp","currentScreen","refreshScreen","clearStorage","afterSearch","appObj","searchword","jsAPI","JSAPI","linkCatcher","web","linktype","tabBar","clearHistory","isScrolling","callEventHandler","postLink","appUrl","sound","stopAll","currentAppUrl","showApp","currentTabId","login","historyChange","checkVariables","appid","screenid","ok","session_time","showScreen","onTimeout","currentScreenId","popHistory","typeX","weblinks","external","inappbrowser","slash","dot","filename","strPath","pdfobject","toolbar","messages","navpanes","support","play","youtube","findTitle","vimeo","twitter","screenname","twttr","widgets","createTimeline","facebook","face","screenId","fetchObj","settings","maintype","mainScreenId","jscode","screenObj","javascripts","typeurl","APP_BROWSER","BrowserArguments","dispatch","initEvent","AndroidPdfPlugin","openOnlinePDF","openPDF","mess","getTitle","defaultTitle","tEl","thisEl","showapphtml","fixIEStyles","appNavigatorInner","sides","innerA","innerB","swapAB","morpher","changeScreens","showScreenHTML","backParam","checkAds","splashhtml","inserted","secured","loginLink","highlightSearchWords","showTabs","statusType","phoneEl","selectedTab","newTab","headerEl","backEl","titleEl","titleSpan","titleText","backWidth","amendHistory","hasHistory","backCenter","backRight","resizeTitle","titleWidth","headerWidth","pushHistory","screenSetups","func","gallery","appsscreen","iphone","resizeE","screenorientationchange","orientation","loadVar","varName","saveVar","post","href2","inp","holder","gads","gad","showAd","adsbygoogle","ad","getAd","editor","screenEl","bodyText","highlightStartTag","highlightEndTag","newText","lcBodyText","pageData","-webkit-mask","-o-mask","-ms-mask","searchBox","searchResults","apps","gotoPage","getPage","otext","onwebkitspeechchange","itemsEl","selectEl","opEl","done","oset","oget","op","pickerEl","2","3","4","5","6","7","10","11","12","14","15","19","21","22","23","24","25","26","28","29","30","31","years","thisYear","getFullYear","yearRange","toLocaleDateString","appbuild","getMonth","hours","mins","45","50","55","am","pm","getHours","getMinutes","autocompleteEl","completionsEl","completionsInner","showCompletions","getCompletions","localSearchBoxes","searchData","localSearchBox","resultsArray","matchesCount","searchTerm","words","screenIds","resultElement","data-highlight","screens","more","formEl","varTagName","captureEl","on","capturebtn","choosebtn","icon","captured","mediaFiles","setURL","fullPath","scrollRefresh","disableRefresh","newicon","audio","playing","destinationType","DestinationType","FILE_URI","sourceType","PictureSourceType","PHOTOLIBRARY","mediaType","MediaType","PICTURE","allowEdit","VIDEO","ALLMEDIA","markerEl","lon","mapHolder","mapsLoading","hiddenItems","mapOptions","mapTypeId","MapTypeId","ROADMAP","Map","LatLngBounds","latitude","longitude","infoBox","MarkerImage","Size","Point","markerOptions","clickable","marker","Marker","setZoom","fitBounds","setMessage","hideLoadingAni","api","showTab","showRemoteScreen","showWeb","showFile","showYoutube","showVimeo","showTwitter","username","showFacebook","showBBM","playSound","stopSound","getVariable","formField","addTabEvent","eid","removeTabEvent","identifier","addScreenEvent","removeScreenEvent","addVariableEvent","ename","removeVariableEvent","runOnce","runonce","getAppId","getTabId","getScreenId","getItemId","getCurrentAppId","getCurrentTabId","getCurrentScreenId","closeConfirm","confirms","BrowserHistory","resumeListener","handleHistory","disableAnimation","appChange","registered","historyIgnore","handlePopHistory","encodeHistoryHash","decodeHistoryHash","hashchange","onhashchange","messageEl","loadingAni","showTimeout","showLoadingAni","fetchedType","requestKey","FileUploadOptions","fileKey","fileName","mimeType","fetchURL","lastupdate","ft","FileTransfer","upload","res","getRequestQueue","rand","requestQueue","scriptEl","fetched","remotedbs","keyStacks","keyStackLimits","image","inputs","pushKey","keyStack","internalStore","getKey","rdb","internalFetch","storeQueue","work","refreshAfter","storeAppScreen","fetchAppScreen","objCopy","pattern2","handleUrl","storeImg","im","extra","quote","rep","iScrollOptions","scrollToTop","setEnabled","dots","currentPage","homeUnderlay","setopacity","iscroll","xx","elementSize","innerSize","scrollWheel","mouseTimeout","makeScrollBar","scrollBar","scrollKnob","sT","sH","elem","canPlayType","ogg","mp3","wav","m4a","audios","Audio","addToHome","addToHomeConfig","autostart","hookOnLoad","isIPad","nav","isRetina","devicePixelRatio","isSafari","isStandalone","OSVersion","lastVisit","isSessionActive","sessionStorage","isReturningVisitor","returningVisitor","isExpired","expire","overrideChecks","touchIcon","balloon","intl","arrow","closeButton","clicked","orientationCheck","startDelay","iPadXShift","scrollY","scrollX","bottomOffset","animationIn","webkitTransform","marginLeft","webkitTransitionDuration","closeTimeout","lifespan","manualShow","positionInterval","posY","posX","webkitTransitionProperty","animationOut","iterations","WebKitCSSMatrix","m42","m41","ar","ca_es","cs_cz","da_dk","de_de","el_gr","en_us","es_es","fi_fi","fr_fr","he_il","hr_hr","hu_hu","it_it","ja_jp","ko_kr","nb_no","nl_nl","pl_pl","pt_br","pt_pt","ru_ru","sv_se","th_th","tr_tr","uk_ua","zh_cn","zh_tw","applicationCache","startUpdate","updateEl","UPDATEREADY","swapCache","reload"],"mappings":"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","sourcesContent":["function SHA1(s){function U(a,b,c){while(0>>(32-b))}function P(a,b,c){return a^b^c}function A(a,b){var c=(b&0xFFFF)+(a&0xFFFF),d=(b>>>16)+(a>>>16)+(c>>>16);return((d&0xFFFF)<<16)|(c&0xFFFF)}var B=\"0123456789abcdef\";return(function(a){var c=[],d=a.length*4,e;for(var i=0;i>2]>>((3-(i%4))*8);c.push(B.charAt((e>>4)&0xF)+B.charAt(e&0xF))}return c.join('')}((function(a,b){var c,d,e,f,g,h=a.length,v=0x67452301,w=0xefcdab89,x=0x98badcfe,y=0x10325476,z=0xc3d2e1f0,M=[];U(M,0x5a827999,20);U(M,0x6ed9eba1,20);U(M,0x8f1bbcdc,20);U(M,0xca62c1d6,20);a[b>>5]|=0x80<<(24-(b%32));a[(((b+65)>>9)<<4)+15]=b;for(var i=0;i>>16)+(a>>>16)+(b>>>16)+(c>>>16)+(d>>>16)+(f>>>16);return((g&0xFFFF)<<16)|(f&0xFFFF)})(j<20?(function(t,a,b){return(t&a)^(~t&b)}(d,e,f)):j<40?P(d,e,f):j<60?(function(t,a,b){return(t&a)^(t&b)^(a&b)}(d,e,f)):P(d,e,f),g,M[j],O[j],L(c,5));g=f;f=e;e=L(d,30);d=c;c=k}v=A(v,c);w=A(w,d);x=A(x,e);y=A(y,f);z=A(z,g)}return[v,w,x,y,z]}((function(t){var a=[],b=255,c=t.length*8;for(var i=0;i>5]|=(t.charCodeAt(i/8)&b)<<(24-(i%32))}return a}(s)).slice(),s.length*8))))}","appbuilder = window.appbuilder || {};\n\n(function() {\n\tappbuilder.map = {};\n\tvar NOT_INCLUDED = 0, LOADING = 1, INCLUDED = 2, FAILED = 3;\n\n\tvar included = window.navigator.offline !== false ? NOT_INCLUDED : FAILED;\n\t\n\tvar delay;\n\t\n\tvar failed = function() {\n\t\tif(included == LOADING) {\n\t\t\tincluded = FAILED;\n\t\t\tonInitialize.each(function(cb) {\n\t\t\t\tcb.delay(0, this, [false]);\n\t\t\t});\n\t\t\tonInitialize = [];\n\t\t}\n\t};\n\n\tappbuilder.map.include = function(cb) {\n\t\tif(included == INCLUDED) {\n\t\t\tcb(true);\n\t\t}\n\t\telse if(included == FAILED) {\n\t\t\tcb(false);\n\t\t}\n\t\telse if(included == LOADING) {\n\t\t\tonInitialize.push(cb);\n\t\t}\n\t\telse {\n\t\t\tvar script = document.createElement(\"script\");\n\t\t\tscript.type = \"text/javascript\";\n\t\t\tscript.async = true;\n\t\t\tscript.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'maps.googleapis.com/maps/api/js?sensor=false&callback=appbuilder.map.initialize';\n\t\t\tincluded = LOADING;\n\t\t\tonInitialize.push(cb);\n\t\t\tvar s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(script, s);\n\t\t\tdelay = failed.delay(10000);\n\t\t}\n\t};\n\n\tvar onInitialize = [];\n\tappbuilder.map.initialize = function() {\n\t\tclearTimeout(delay);\n\t\tsetupInfoBox();\n\t\tincluded = INCLUDED;\n\t\tonInitialize.each(function(cb) {\n\t\t\tcb.delay(0, this, [true]);\n\t\t});\n\t\tonInitialize = [];\n\t};\n\t\n\tvar position = false;\n\tvar requested = false;\n\tvar onPosition = [];\n\tvar failedTimeout;\n\t\n\tvar after = function(ret) {\n\t\tposition = ret;\n\t\tonPosition.each(function(cb) {\n\t\t\tcb(ret);\n\t\t});\n\t\trequested = false;\n\t\tonPosition = [];\n\t\tclearTimeout(failedTimeout);\n\t};\n\t\n\tappbuilder.map.getPosition = function(cb) {\n\t\tif(position && (new Date().getTime() - position.timestamp) < 60000) {\n\t\t\tcb(position);\n\t\t}\n\t\telse if(requested) {\n\t\t\tonPosition.push(cb);\n\t\t}\n\t\telse if(navigator.geolocation) {\n\t\t\trequested = true;\n\t\t\tonPosition.push(cb);\n\t\t\tnavigator.geolocation.getCurrentPosition(function(p) {\n\t\t\t\tafter(p);\n\t\t\t}, function() {\n\t\t\t\tafter(false);\n\t\t\t}, {\n\t\t\t\ttimeout: 10000,\n\t\t\t\tmaximumAge: 60000\n\t\t\t});\n\t\t\tfailedTimeout = (function() {\n\t\t\t\tafter(false);\n\t\t\t}).delay(12000);\n\t\t}\n\t\telse {\n\t\t\tcb(false);\n\t\t}\n\t};\n\t\n})();","var setupInfoBox = function() {\n\n\n\tvar infoboxes = [];\n\n\tfunction InfoBox(opts) {\n\t\tgoogle.maps.OverlayView.call(this);\n\t\tthis.latlng_ = opts.latlng;\n\t\tthis.map_ = opts.map;\n\t\tthis.offsetVertical_ = -35;\n\t\tthis.offsetHorizontal_ = -145;\n\t\tthis.height_ = 25;\n\t\t//this.width_ = 290;\n\t\tthis.element_ = opts.element;\n \n\t\tvar me = this;\n\t\tthis.boundsChangedListener_ = google.maps.event.addListener(this.map_, \"bounds_changed\", function() {\n\t\t\treturn me.panMap.apply(me);\n\t\t});\n \n\t\tinfoboxes.push(this);\n \n\t\t// Once the properties of this OverlayView are initialized, set its map so\n\t\t// that we can display it. This will trigger calls to panes_changed and\n\t\t// draw.\n\t\tthis.setMap(this.map_);\n\t}\n \n\t/* InfoBox extends GOverlay class from the Google Maps API\n */\n\tInfoBox.prototype = new google.maps.OverlayView();\n\t\n\tvar setMap = InfoBox.prototype.setMap;\n\t\n\tInfoBox.prototype.setMap = function(map) {\n\t\tinfoboxes.each(function(i) {\n\t\t\tif(i != this) {\n\t\t\t\tsetMap.call(i, null);\n\t\t\t}\n\t\t});\n\t\tsetMap.call(this, map);\n\t}\n \n\t/* Creates the DIV representing this InfoBox\n */\n\tInfoBox.prototype.remove = function() {\n\t\tif (this.div_) {\n\t\t\tthis.div_.parentNode.removeChild(this.div_);\n\t\t\tthis.div_ = null;\n\t\t}\n\t};\n \n\t/* Redraw the Bar based on the current projection and zoom level\n */\n\tInfoBox.prototype.draw = function() {\n\t\t// Creates the element if it doesn't exist already.\n\t\tthis.createElement();\n\t\tif (!this.div_) return;\n \n\t\t// Calculate the DIV coordinates of two opposite corners of our bounds to\n\t\t// get the size and position of our Bar\n\t\tvar pixPosition = this.getProjection().fromLatLngToDivPixel(this.latlng_);\n\t\tif (!pixPosition) return;\n \n\t\t// Now position our DIV based on the DIV coordinates of our bounds\n\t\tthis.div_.style.display = 'block';\n\t\t//this.div_.style.width = this.width_ + \"px\";\n\t\tthis.div_.style.left = (pixPosition.x - (this.div_.clientWidth / 2)) + \"px\";\n\t\tthis.height_ = this.div_.clientHeight;\n\t\tthis.div_.style.top = (pixPosition.y - this.div_.clientHeight - 48) + \"px\";\n\n \n\t};\n \n\t/* Creates the DIV representing this InfoBox in the floatPane. If the panes\n * object, retrieved by calling getPanes, is null, remove the element from the\n * DOM. If the div exists, but its parent is not the floatPane, move the div\n * to the new pane.\n * Called from within draw. Alternatively, this can be called specifically on\n * a panes_changed event.\n */\n\tInfoBox.prototype.createElement = function() {\n\t\tvar panes = this.getPanes();\n\t\tvar div = this.div_;\n\t\tif (!div) {\n\t\t\tdiv = this.div_ = document.createElement(\"div\");\n\t\t\t//div.style.position = \"absolute\";\n\t\t\tdiv.className=\"ios-map-marker\";\n\t\t\tdiv.style.display = 'none';\n\t\t\t\n\t\t\tvar a = document.createElement('div');\n\t\t\ta.className = 'arrow';\n\t\t\tdiv.appendChild(a);\n\t\t\t\n\t\t\tdiv.appendChild(this.element_);\n\t\t\t\n\t\t\tpanes.floatPane.appendChild(div);\n\t\t\tthis.panMap();\n\t\t} else if (div.parentNode != panes.floatPane) {\n\t\t\t// The panes have changed. Move the div.\n\t\t\tdiv.parentNode.removeChild(div);\n\t\t\tpanes.floatPane.appendChild(div);\n\t\t} else {\n\t\t// The panes have not changed, so no need to create or move the div.\n\t\t}\n\t}\n \n\t/* Pan the map to fit the InfoBox.\n */\n\tInfoBox.prototype.panMap = function() {\n\t\t// if we go beyond map, pan map\n\t\tvar map = this.map_;\n\t\tvar bounds = map.getBounds();\n\t\tif (!bounds) return;\n \n\t\t// The position of the infowindow\n\t\tvar position = this.latlng_;\n \n\t\t// The dimension of the infowindow\n\t\tvar iwWidth = this.width_;\n\t\tvar iwHeight = this.height_;\n \n\t\t// The offset position of the infowindow\n\t\tvar iwOffsetX = this.offsetHorizontal_;\n\t\tvar iwOffsetY = this.offsetVertical_;\n \n\t\t// Padding on the infowindow\n\t\tvar padX = 40;\n\t\tvar padY = 40;\n \n\t\t// The degrees per pixel\n\t\tvar mapDiv = map.getDiv();\n\t\tvar mapWidth = mapDiv.offsetWidth;\n\t\tvar mapHeight = mapDiv.offsetHeight;\n\t\tvar boundsSpan = bounds.toSpan();\n\t\tvar longSpan = boundsSpan.lng();\n\t\tvar latSpan = boundsSpan.lat();\n\t\tvar degPixelX = longSpan / mapWidth;\n\t\tvar degPixelY = latSpan / mapHeight;\n \n\t\t// The bounds of the map\n\t\tvar mapWestLng = bounds.getSouthWest().lng();\n\t\tvar mapEastLng = bounds.getNorthEast().lng();\n\t\tvar mapNorthLat = bounds.getNorthEast().lat();\n\t\tvar mapSouthLat = bounds.getSouthWest().lat();\n \n\t\t// The bounds of the infowindow\n\t\tvar iwWestLng = position.lng() + (iwOffsetX - padX) * degPixelX;\n\t\tvar iwEastLng = position.lng() + (iwOffsetX + iwWidth + padX) * degPixelX;\n\t\tvar iwNorthLat = position.lat() - (iwOffsetY - padY) * degPixelY;\n\t\tvar iwSouthLat = position.lat() - (iwOffsetY + iwHeight + padY) * degPixelY;\n \n\t\t// calculate center shift\n\t\tvar shiftLng =\n\t\t(iwWestLng < mapWestLng ? mapWestLng - iwWestLng : 0) +\n\t\t(iwEastLng > mapEastLng ? mapEastLng - iwEastLng : 0);\n\t\tvar shiftLat =\n\t\t(iwNorthLat > mapNorthLat ? mapNorthLat - iwNorthLat : 0) +\n\t\t(iwSouthLat < mapSouthLat ? mapSouthLat - iwSouthLat : 0);\n \n\t\t// The center of the map\n\t\tvar center = map.getCenter();\n \n\t\t// The new map center\n\t\tvar centerX = center.lng() - shiftLng;\n\t\tvar centerY = center.lat() - shiftLat;\n \n\t\t// center the map to the new shifted center\n\t\tmap.setCenter(new google.maps.LatLng(centerY, centerX));\n \n\t\t// Remove the listener after panning is complete.\n\t\tif(this.boundsChangedListener_) {\n\t\t\tgoogle.maps.event.removeListener(this.boundsChangedListener_);\n\t\t\tthis.boundsChangedListener_ = null;\n\t\t}\n\t};\n\n\tthis.InfoBox = InfoBox;\n\n};","/*\n---\nMooTools: the javascript framework\n\nweb build:\n - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0\n\npackager build:\n - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff\n\n...\n*/\n\n/*\n---\n\nname: Core\n\ndescription: The heart of MooTools.\n\nlicense: MIT-style license.\n\ncopyright: Copyright (c) 2006-2012 [Valerio Proietti](http://mad4milk.net/).\n\nauthors: The MooTools production team (http://mootools.net/developers/)\n\ninspiration:\n - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)\n - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)\n\nprovides: [Core, MooTools, Type, typeOf, instanceOf, Native]\n\n...\n*/\n\n(function(){\n\nthis.MooTools = {\n\tversion: '1.4.5',\n\tbuild: '74e34796f5f76640cdb98853004650aea1499d69'\n};\n\n// typeOf, instanceOf\n\nvar typeOf = this.typeOf = function(item){\n\tif (item == null) return 'null';\n\tif (item.$family != null) return item.$family();\n\n\tif (item.nodeName){\n\t\tif (item.nodeType == 1) return 'element';\n\t\tif (item.nodeType == 3) return (/\\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';\n\t} else if (typeof item.length == 'number'){\n\t\tif (item.callee) return 'arguments';\n\t\tif ('item' in item) return 'collection';\n\t}\n\n\treturn typeof item;\n};\n\nvar instanceOf = this.instanceOf = function(item, object){\n\tif (item == null) return false;\n\tvar constructor = item.$constructor || item.constructor;\n\twhile (constructor){\n\t\tif (constructor === object) return true;\n\t\tconstructor = constructor.parent;\n\t}\n\t/**/\n\tif (!item.hasOwnProperty) return false;\n\t/**/\n\treturn item instanceof object;\n};\n\n// Function overloading\n\nvar Function = this.Function;\n\nvar enumerables = true;\nfor (var i in {toString: 1}) enumerables = null;\nif (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];\n\nFunction.prototype.overloadSetter = function(usePlural){\n\tvar self = this;\n\treturn function(a, b){\n\t\tif (a == null) return this;\n\t\tif (usePlural || typeof a != 'string'){\n\t\t\tfor (var k in a) self.call(this, k, a[k]);\n\t\t\tif (enumerables) for (var i = enumerables.length; i--;){\n\t\t\t\tk = enumerables[i];\n\t\t\t\tif (a.hasOwnProperty(k)) self.call(this, k, a[k]);\n\t\t\t}\n\t\t} else {\n\t\t\tself.call(this, a, b);\n\t\t}\n\t\treturn this;\n\t};\n};\n\nFunction.prototype.overloadGetter = function(usePlural){\n\tvar self = this;\n\treturn function(a){\n\t\tvar args, result;\n\t\tif (typeof a != 'string') args = a;\n\t\telse if (arguments.length > 1) args = arguments;\n\t\telse if (usePlural) args = [a];\n\t\tif (args){\n\t\t\tresult = {};\n\t\t\tfor (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);\n\t\t} else {\n\t\t\tresult = self.call(this, a);\n\t\t}\n\t\treturn result;\n\t};\n};\n\nFunction.prototype.extend = function(key, value){\n\tthis[key] = value;\n}.overloadSetter();\n\nFunction.prototype.implement = function(key, value){\n\tthis.prototype[key] = value;\n}.overloadSetter();\n\n// From\n\nvar slice = Array.prototype.slice;\n\nFunction.from = function(item){\n\treturn (typeOf(item) == 'function') ? item : function(){\n\t\treturn item;\n\t};\n};\n\nArray.from = function(item){\n\tif (item == null) return [];\n\treturn (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];\n};\n\nNumber.from = function(item){\n\tvar number = parseFloat(item);\n\treturn isFinite(number) ? number : null;\n};\n\nString.from = function(item){\n\treturn item + '';\n};\n\n// hide, protect\n\nFunction.implement({\n\n\thide: function(){\n\t\tthis.$hidden = true;\n\t\treturn this;\n\t},\n\n\tprotect: function(){\n\t\tthis.$protected = true;\n\t\treturn this;\n\t}\n\n});\n\n// Type\n\nvar Type = this.Type = function(name, object){\n\tif (name){\n\t\tvar lower = name.toLowerCase();\n\t\tvar typeCheck = function(item){\n\t\t\treturn (typeOf(item) == lower);\n\t\t};\n\n\t\tType['is' + name] = typeCheck;\n\t\tif (object != null){\n\t\t\tobject.prototype.$family = (function(){\n\t\t\t\treturn lower;\n\t\t\t}).hide();\n\t\t\t\n\t\t}\n\t}\n\n\tif (object == null) return null;\n\n\tobject.extend(this);\n\tobject.$constructor = Type;\n\tobject.prototype.$constructor = object;\n\n\treturn object;\n};\n\nvar toString = Object.prototype.toString;\n\nType.isEnumerable = function(item){\n\treturn (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );\n};\n\nvar hooks = {};\n\nvar hooksOf = function(object){\n\tvar type = typeOf(object.prototype);\n\treturn hooks[type] || (hooks[type] = []);\n};\n\nvar implement = function(name, method){\n\tif (method && method.$hidden) return;\n\n\tvar hooks = hooksOf(this);\n\n\tfor (var i = 0; i < hooks.length; i++){\n\t\tvar hook = hooks[i];\n\t\tif (typeOf(hook) == 'type') implement.call(hook, name, method);\n\t\telse hook.call(this, name, method);\n\t}\n\n\tvar previous = this.prototype[name];\n\tif (previous == null || !previous.$protected) this.prototype[name] = method;\n\n\tif (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){\n\t\treturn method.apply(item, slice.call(arguments, 1));\n\t});\n};\n\nvar extend = function(name, method){\n\tif (method && method.$hidden) return;\n\tvar previous = this[name];\n\tif (previous == null || !previous.$protected) this[name] = method;\n};\n\nType.implement({\n\n\timplement: implement.overloadSetter(),\n\n\textend: extend.overloadSetter(),\n\n\talias: function(name, existing){\n\t\timplement.call(this, name, this.prototype[existing]);\n\t}.overloadSetter(),\n\n\tmirror: function(hook){\n\t\thooksOf(this).push(hook);\n\t\treturn this;\n\t}\n\n});\n\nnew Type('Type', Type);\n\n// Default Types\n\nvar force = function(name, object, methods){\n\tvar isType = (object != Object),\n\t\tprototype = object.prototype;\n\n\tif (isType) object = new Type(name, object);\n\n\tfor (var i = 0, l = methods.length; i < l; i++){\n\t\tvar key = methods[i],\n\t\t\tgeneric = object[key],\n\t\t\tproto = prototype[key];\n\n\t\tif (generic) generic.protect();\n\t\tif (isType && proto) object.implement(key, proto.protect());\n\t}\n\n\tif (isType){\n\t\tvar methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);\n\t\tobject.forEachMethod = function(fn){\n\t\t\tif (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){\n\t\t\t\tfn.call(prototype, prototype[methods[i]], methods[i]);\n\t\t\t}\n\t\t\tfor (var key in prototype) fn.call(prototype, prototype[key], key)\n\t\t};\n\t}\n\n\treturn force;\n};\n\nforce('String', String, [\n\t'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',\n\t'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'\n])('Array', Array, [\n\t'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',\n\t'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'\n])('Number', Number, [\n\t'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'\n])('Function', Function, [\n\t'apply', 'call', 'bind'\n])('RegExp', RegExp, [\n\t'exec', 'test'\n])('Object', Object, [\n\t'create', 'defineProperty', 'defineProperties', 'keys',\n\t'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',\n\t'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'\n])('Date', Date, ['now']);\n\nObject.extend = extend.overloadSetter();\n\nDate.extend('now', function(){\n\treturn +(new Date);\n});\n\nnew Type('Boolean', Boolean);\n\n// fixes NaN returning as Number\n\nNumber.prototype.$family = function(){\n\treturn isFinite(this) ? 'number' : 'null';\n}.hide();\n\n// Number.random\n\nNumber.extend('random', function(min, max){\n\treturn Math.floor(Math.random() * (max - min + 1) + min);\n});\n\n// forEach, each\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nObject.extend('forEach', function(object, fn, bind){\n\tfor (var key in object){\n\t\tif (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);\n\t}\n});\n\nObject.each = Object.forEach;\n\nArray.implement({\n\n\tforEach: function(fn, bind){\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tif (i in this) fn.call(bind, this[i], i, this);\n\t\t}\n\t},\n\n\teach: function(fn, bind){\n\t\tArray.forEach(this, fn, bind);\n\t\treturn this;\n\t}\n\n});\n\n// Array & Object cloning, Object merging and appending\n\nvar cloneOf = function(item){\n\tswitch (typeOf(item)){\n\t\tcase 'array': return item.clone();\n\t\tcase 'object': return Object.clone(item);\n\t\tdefault: return item;\n\t}\n};\n\nArray.implement('clone', function(){\n\tvar i = this.length, clone = new Array(i);\n\twhile (i--) clone[i] = cloneOf(this[i]);\n\treturn clone;\n});\n\nvar mergeOne = function(source, key, current){\n\tswitch (typeOf(current)){\n\t\tcase 'object':\n\t\t\tif (typeOf(source[key]) == 'object') Object.merge(source[key], current);\n\t\t\telse source[key] = Object.clone(current);\n\t\tbreak;\n\t\tcase 'array': source[key] = current.clone(); break;\n\t\tdefault: source[key] = current;\n\t}\n\treturn source;\n};\n\nObject.extend({\n\n\tmerge: function(source, k, v){\n\t\tif (typeOf(k) == 'string') return mergeOne(source, k, v);\n\t\tfor (var i = 1, l = arguments.length; i < l; i++){\n\t\t\tvar object = arguments[i];\n\t\t\tfor (var key in object) mergeOne(source, key, object[key]);\n\t\t}\n\t\treturn source;\n\t},\n\n\tclone: function(object){\n\t\tvar clone = {};\n\t\tfor (var key in object) clone[key] = cloneOf(object[key]);\n\t\treturn clone;\n\t},\n\n\tappend: function(original){\n\t\tfor (var i = 1, l = arguments.length; i < l; i++){\n\t\t\tvar extended = arguments[i] || {};\n\t\t\tfor (var key in extended) original[key] = extended[key];\n\t\t}\n\t\treturn original;\n\t}\n\n});\n\n// Object-less types\n\n['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){\n\tnew Type(name);\n});\n\n// Unique ID\n\nvar UID = Date.now();\n\nString.extend('uniqueID', function(){\n\treturn (UID++).toString(36);\n});\n\n\n\n})();\n\n\n/*\n---\n\nname: Array\n\ndescription: Contains Array Prototypes like each, contains, and erase.\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: Array\n\n...\n*/\n\nArray.implement({\n\n\t/**/\n\tevery: function(fn, bind){\n\t\tfor (var i = 0, l = this.length >>> 0; i < l; i++){\n\t\t\tif ((i in this) && !fn.call(bind, this[i], i, this)) return false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tfilter: function(fn, bind){\n\t\tvar results = [];\n\t\tfor (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){\n\t\t\tvalue = this[i];\n\t\t\tif (fn.call(bind, value, i, this)) results.push(value);\n\t\t}\n\t\treturn results;\n\t},\n\n\tindexOf: function(item, from){\n\t\tvar length = this.length >>> 0;\n\t\tfor (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){\n\t\t\tif (this[i] === item) return i;\n\t\t}\n\t\treturn -1;\n\t},\n\n\tmap: function(fn, bind){\n\t\tvar length = this.length >>> 0, results = Array(length);\n\t\tfor (var i = 0; i < length; i++){\n\t\t\tif (i in this) results[i] = fn.call(bind, this[i], i, this);\n\t\t}\n\t\treturn results;\n\t},\n\n\tsome: function(fn, bind){\n\t\tfor (var i = 0, l = this.length >>> 0; i < l; i++){\n\t\t\tif ((i in this) && fn.call(bind, this[i], i, this)) return true;\n\t\t}\n\t\treturn false;\n\t},\n\t/**/\n\n\tclean: function(){\n\t\treturn this.filter(function(item){\n\t\t\treturn item != null;\n\t\t});\n\t},\n\n\tinvoke: function(methodName){\n\t\tvar args = Array.slice(arguments, 1);\n\t\treturn this.map(function(item){\n\t\t\treturn item[methodName].apply(item, args);\n\t\t});\n\t},\n\n\tassociate: function(keys){\n\t\tvar obj = {}, length = Math.min(this.length, keys.length);\n\t\tfor (var i = 0; i < length; i++) obj[keys[i]] = this[i];\n\t\treturn obj;\n\t},\n\n\tlink: function(object){\n\t\tvar result = {};\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tfor (var key in object){\n\t\t\t\tif (object[key](this[i])){\n\t\t\t\t\tresult[key] = this[i];\n\t\t\t\t\tdelete object[key];\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t},\n\n\tcontains: function(item, from){\n\t\treturn this.indexOf(item, from) != -1;\n\t},\n\n\tappend: function(array){\n\t\tthis.push.apply(this, array);\n\t\treturn this;\n\t},\n\n\tgetLast: function(){\n\t\treturn (this.length) ? this[this.length - 1] : null;\n\t},\n\n\tgetRandom: function(){\n\t\treturn (this.length) ? this[Number.random(0, this.length - 1)] : null;\n\t},\n\n\tinclude: function(item){\n\t\tif (!this.contains(item)) this.push(item);\n\t\treturn this;\n\t},\n\n\tcombine: function(array){\n\t\tfor (var i = 0, l = array.length; i < l; i++) this.include(array[i]);\n\t\treturn this;\n\t},\n\n\terase: function(item){\n\t\tfor (var i = this.length; i--;){\n\t\t\tif (this[i] === item) this.splice(i, 1);\n\t\t}\n\t\treturn this;\n\t},\n\n\tempty: function(){\n\t\tthis.length = 0;\n\t\treturn this;\n\t},\n\n\tflatten: function(){\n\t\tvar array = [];\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tvar type = typeOf(this[i]);\n\t\t\tif (type == 'null') continue;\n\t\t\tarray = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);\n\t\t}\n\t\treturn array;\n\t},\n\n\tpick: function(){\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tif (this[i] != null) return this[i];\n\t\t}\n\t\treturn null;\n\t},\n\n\thexToRgb: function(array){\n\t\tif (this.length != 3) return null;\n\t\tvar rgb = this.map(function(value){\n\t\t\tif (value.length == 1) value += value;\n\t\t\treturn value.toInt(16);\n\t\t});\n\t\treturn (array) ? rgb : 'rgb(' + rgb + ')';\n\t},\n\n\trgbToHex: function(array){\n\t\tif (this.length < 3) return null;\n\t\tif (this.length == 4 && this[3] == 0 && !array) return 'transparent';\n\t\tvar hex = [];\n\t\tfor (var i = 0; i < 3; i++){\n\t\t\tvar bit = (this[i] - 0).toString(16);\n\t\t\thex.push((bit.length == 1) ? '0' + bit : bit);\n\t\t}\n\t\treturn (array) ? hex : '#' + hex.join('');\n\t}\n\n});\n\n\n\n\n/*\n---\n\nname: String\n\ndescription: Contains String Prototypes like camelCase, capitalize, test, and toInt.\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: String\n\n...\n*/\n\nString.implement({\n\n\ttest: function(regex, params){\n\t\treturn ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);\n\t},\n\n\tcontains: function(string, separator){\n\t\treturn (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : String(this).indexOf(string) > -1;\n\t},\n\n\ttrim: function(){\n\t\treturn String(this).replace(/^\\s+|\\s+$/g, '');\n\t},\n\n\tclean: function(){\n\t\treturn String(this).replace(/\\s+/g, ' ').trim();\n\t},\n\n\tcamelCase: function(){\n\t\treturn String(this).replace(/-\\D/g, function(match){\n\t\t\treturn match.charAt(1).toUpperCase();\n\t\t});\n\t},\n\n\thyphenate: function(){\n\t\treturn String(this).replace(/[A-Z]/g, function(match){\n\t\t\treturn ('-' + match.charAt(0).toLowerCase());\n\t\t});\n\t},\n\n\tcapitalize: function(){\n\t\treturn String(this).replace(/\\b[a-z]/g, function(match){\n\t\t\treturn match.toUpperCase();\n\t\t});\n\t},\n\n\tescapeRegExp: function(){\n\t\treturn String(this).replace(/([-.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n\t},\n\n\ttoInt: function(base){\n\t\treturn parseInt(this, base || 10);\n\t},\n\n\ttoFloat: function(){\n\t\treturn parseFloat(this);\n\t},\n\n\thexToRgb: function(array){\n\t\tvar hex = String(this).match(/^#?(\\w{1,2})(\\w{1,2})(\\w{1,2})$/);\n\t\treturn (hex) ? hex.slice(1).hexToRgb(array) : null;\n\t},\n\n\trgbToHex: function(array){\n\t\tvar rgb = String(this).match(/\\d{1,3}/g);\n\t\treturn (rgb) ? rgb.rgbToHex(array) : null;\n\t},\n\n\tsubstitute: function(object, regexp){\n\t\treturn String(this).replace(regexp || (/\\\\?\\{([^{}]+)\\}/g), function(match, name){\n\t\t\tif (match.charAt(0) == '\\\\') return match.slice(1);\n\t\t\treturn (object[name] != null) ? object[name] : '';\n\t\t});\n\t}\n\n});\n\n\n/*\n---\n\nname: Number\n\ndescription: Contains Number Prototypes like limit, round, times, and ceil.\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: Number\n\n...\n*/\n\nNumber.implement({\n\n\tlimit: function(min, max){\n\t\treturn Math.min(max, Math.max(min, this));\n\t},\n\n\tround: function(precision){\n\t\tprecision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);\n\t\treturn Math.round(this * precision) / precision;\n\t},\n\n\ttimes: function(fn, bind){\n\t\tfor (var i = 0; i < this; i++) fn.call(bind, i, this);\n\t},\n\n\ttoFloat: function(){\n\t\treturn parseFloat(this);\n\t},\n\n\ttoInt: function(base){\n\t\treturn parseInt(this, base || 10);\n\t}\n\n});\n\nNumber.alias('each', 'times');\n\n(function(math){\n\tvar methods = {};\n\tmath.each(function(name){\n\t\tif (!Number[name]) methods[name] = function(){\n\t\t\treturn Math[name].apply(null, [this].concat(Array.from(arguments)));\n\t\t};\n\t});\n\tNumber.implement(methods);\n})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);\n\n\n/*\n---\n\nname: Function\n\ndescription: Contains Function Prototypes like create, bind, pass, and delay.\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: Function\n\n...\n*/\n\nFunction.extend({\n\n\tattempt: function(){\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\ttry {\n\t\t\t\treturn arguments[i]();\n\t\t\t} catch (e){}\n\t\t}\n\t\treturn null;\n\t}\n\n});\n\nFunction.implement({\n\n\tattempt: function(args, bind){\n\t\ttry {\n\t\t\treturn this.apply(bind, Array.from(args));\n\t\t} catch (e){}\n\n\t\treturn null;\n\t},\n\n\t/**/\n\tbind: function(that){\n\t\tvar self = this,\n\t\t\targs = arguments.length > 1 ? Array.slice(arguments, 1) : null,\n\t\t\tF = function(){};\n\n\t\tvar bound = function(){\n\t\t\tvar context = that, length = arguments.length;\n\t\t\tif (this instanceof bound){\n\t\t\t\tF.prototype = self.prototype;\n\t\t\t\tcontext = new F;\n\t\t\t}\n\t\t\tvar result = (!args && !length)\n\t\t\t\t? self.call(context)\n\t\t\t\t: self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);\n\t\t\treturn context == that ? result : context;\n\t\t};\n\t\treturn bound;\n\t},\n\t/**/\n\n\tpass: function(args, bind){\n\t\tvar self = this;\n\t\tif (args != null) args = Array.from(args);\n\t\treturn function(){\n\t\t\treturn self.apply(bind, args || arguments);\n\t\t};\n\t},\n\n\tdelay: function(delay, bind, args){\n\t\treturn setTimeout(this.pass((args == null ? [] : args), bind), delay);\n\t},\n\n\tperiodical: function(periodical, bind, args){\n\t\treturn setInterval(this.pass((args == null ? [] : args), bind), periodical);\n\t}\n\n});\n\n\n\n\n/*\n---\n\nname: Object\n\ndescription: Object generic methods\n\nlicense: MIT-style license.\n\nrequires: Type\n\nprovides: [Object, Hash]\n\n...\n*/\n\n(function(){\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nObject.extend({\n\n\tsubset: function(object, keys){\n\t\tvar results = {};\n\t\tfor (var i = 0, l = keys.length; i < l; i++){\n\t\t\tvar k = keys[i];\n\t\t\tif (k in object) results[k] = object[k];\n\t\t}\n\t\treturn results;\n\t},\n\n\tmap: function(object, fn, bind){\n\t\tvar results = {};\n\t\tfor (var key in object){\n\t\t\tif (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);\n\t\t}\n\t\treturn results;\n\t},\n\n\tfilter: function(object, fn, bind){\n\t\tvar results = {};\n\t\tfor (var key in object){\n\t\t\tvar value = object[key];\n\t\t\tif (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value;\n\t\t}\n\t\treturn results;\n\t},\n\n\tevery: function(object, fn, bind){\n\t\tfor (var key in object){\n\t\t\tif (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;\n\t\t}\n\t\treturn true;\n\t},\n\n\tsome: function(object, fn, bind){\n\t\tfor (var key in object){\n\t\t\tif (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;\n\t\t}\n\t\treturn false;\n\t},\n\n\tkeys: function(object){\n\t\tvar keys = [];\n\t\tfor (var key in object){\n\t\t\tif (hasOwnProperty.call(object, key)) keys.push(key);\n\t\t}\n\t\treturn keys;\n\t},\n\n\tvalues: function(object){\n\t\tvar values = [];\n\t\tfor (var key in object){\n\t\t\tif (hasOwnProperty.call(object, key)) values.push(object[key]);\n\t\t}\n\t\treturn values;\n\t},\n\n\tgetLength: function(object){\n\t\treturn Object.keys(object).length;\n\t},\n\n\tkeyOf: function(object, value){\n\t\tfor (var key in object){\n\t\t\tif (hasOwnProperty.call(object, key) && object[key] === value) return key;\n\t\t}\n\t\treturn null;\n\t},\n\n\tcontains: function(object, value){\n\t\treturn Object.keyOf(object, value) != null;\n\t},\n\n\ttoQueryString: function(object, base){\n\t\tvar queryString = [];\n\n\t\tObject.each(object, function(value, key){\n\t\t\tif (base) key = base + '[' + key + ']';\n\t\t\tvar result;\n\t\t\tswitch (typeOf(value)){\n\t\t\t\tcase 'object': result = Object.toQueryString(value, key); break;\n\t\t\t\tcase 'array':\n\t\t\t\t\tvar qs = {};\n\t\t\t\t\tvalue.each(function(val, i){\n\t\t\t\t\t\tqs[i] = val;\n\t\t\t\t\t});\n\t\t\t\t\tresult = Object.toQueryString(qs, key);\n\t\t\t\tbreak;\n\t\t\t\tdefault: result = key + '=' + encodeURIComponent(value);\n\t\t\t}\n\t\t\tif (value != null) queryString.push(result);\n\t\t});\n\n\t\treturn queryString.join('&');\n\t}\n\n});\n\n})();\n\n\n\n\n/*\n---\n\nname: Browser\n\ndescription: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.\n\nlicense: MIT-style license.\n\nrequires: [Array, Function, Number, String]\n\nprovides: [Browser, Window, Document]\n\n...\n*/\n\n(function(){\n\nvar document = this.document;\nvar window = document.window = this;\n\nvar ua = navigator.userAgent.toLowerCase(),\n\tplatform = navigator.platform.toLowerCase(),\n\tUA = ua.match(/(opera|ie|firefox|chrome|version)[\\s\\/:]([\\w\\d\\.]+)?.*?(safari|version[\\s\\/:]([\\w\\d\\.]+)|$)/) || [null, 'unknown', 0],\n\tmode = UA[1] == 'ie' && document.documentMode;\n\nvar Browser = this.Browser = {\n\n\textend: Function.prototype.extend,\n\n\tname: (UA[1] == 'version') ? UA[3] : UA[1],\n\n\tversion: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),\n\n\tPlatform: {\n\t\tname: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]\n\t},\n\n\tFeatures: {\n\t\txpath: !!(document.evaluate),\n\t\tair: !!(window.runtime),\n\t\tquery: !!(document.querySelector),\n\t\tjson: !!(window.JSON)\n\t},\n\n\tPlugins: {}\n\n};\n\nBrowser[Browser.name] = true;\nBrowser[Browser.name + parseInt(Browser.version, 10)] = true;\nBrowser.Platform[Browser.Platform.name] = true;\n\n// Request\n\nBrowser.Request = (function(){\n\n\tvar XMLHTTP = function(){\n\t\treturn new XMLHttpRequest();\n\t};\n\n\tvar MSXML2 = function(){\n\t\treturn new ActiveXObject('MSXML2.XMLHTTP');\n\t};\n\n\tvar MSXML = function(){\n\t\treturn new ActiveXObject('Microsoft.XMLHTTP');\n\t};\n\n\treturn Function.attempt(function(){\n\t\tXMLHTTP();\n\t\treturn XMLHTTP;\n\t}, function(){\n\t\tMSXML2();\n\t\treturn MSXML2;\n\t}, function(){\n\t\tMSXML();\n\t\treturn MSXML;\n\t});\n\n})();\n\nBrowser.Features.xhr = !!(Browser.Request);\n\n// Flash detection\n\nvar version = (Function.attempt(function(){\n\treturn navigator.plugins['Shockwave Flash'].description;\n}, function(){\n\treturn new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');\n}) || '0 r0').match(/\\d+/g);\n\nBrowser.Plugins.Flash = {\n\tversion: Number(version[0] || '0.' + version[1]) || 0,\n\tbuild: Number(version[2]) || 0\n};\n\n// String scripts\n\nBrowser.exec = function(text){\n\tif (!text) return text;\n\tif (window.execScript){\n\t\twindow.execScript(text);\n\t} else {\n\t\tvar script = document.createElement('script');\n\t\tscript.setAttribute('type', 'text/javascript');\n\t\tscript.text = text;\n\t\tdocument.head.appendChild(script);\n\t\tdocument.head.removeChild(script);\n\t}\n\treturn text;\n};\n\nString.implement('stripScripts', function(exec){\n\tvar scripts = '';\n\tvar text = this.replace(/]*>([\\s\\S]*?)<\\/script>/gi, function(all, code){\n\t\tscripts += code + '\\n';\n\t\treturn '';\n\t});\n\tif (exec === true) Browser.exec(scripts);\n\telse if (typeOf(exec) == 'function') exec(scripts, text);\n\treturn text;\n});\n\n// Window, Document\n\nBrowser.extend({\n\tDocument: this.Document,\n\tWindow: this.Window,\n\tElement: this.Element,\n\tEvent: this.Event\n});\n\nthis.Window = this.$constructor = new Type('Window', function(){});\n\nthis.$family = Function.from('window').hide();\n\nWindow.mirror(function(name, method){\n\twindow[name] = method;\n});\n\nthis.Document = document.$constructor = new Type('Document', function(){});\n\ndocument.$family = Function.from('document').hide();\n\nDocument.mirror(function(name, method){\n\tdocument[name] = method;\n});\n\ndocument.html = document.documentElement;\nif (!document.head) document.head = document.getElementsByTagName('head')[0];\n\nif (document.execCommand) try {\n\tdocument.execCommand(\"BackgroundImageCache\", false, true);\n} catch (e){}\n\n/**/\nif (this.attachEvent && !this.addEventListener){\n\tvar unloadEvent = function(){\n\t\tthis.detachEvent('onunload', unloadEvent);\n\t\tdocument.head = document.html = document.window = null;\n\t};\n\tthis.attachEvent('onunload', unloadEvent);\n}\n\n// IE fails on collections and )\nvar arrayFrom = Array.from;\ntry {\n\tarrayFrom(document.html.childNodes);\n} catch(e){\n\tArray.from = function(item){\n\t\tif (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){\n\t\t\tvar i = item.length, array = new Array(i);\n\t\t\twhile (i--) array[i] = item[i];\n\t\t\treturn array;\n\t\t}\n\t\treturn arrayFrom(item);\n\t};\n\n\tvar prototype = Array.prototype,\n\t\tslice = prototype.slice;\n\t['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){\n\t\tvar method = prototype[name];\n\t\tArray[name] = function(item){\n\t\t\treturn method.apply(Array.from(item), slice.call(arguments, 1));\n\t\t};\n\t});\n}\n/**/\n\n\n\n})();\n\n\n/*\n---\n\nname: Event\n\ndescription: Contains the Event Type, to make the event object cross-browser.\n\nlicense: MIT-style license.\n\nrequires: [Window, Document, Array, Function, String, Object]\n\nprovides: Event\n\n...\n*/\n\n(function() {\n\nvar _keys = {};\n\nvar DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){\n\tif (!win) win = window;\n\tevent = event || win.event;\n\tif (event.$extended) return event;\n\tthis.event = event;\n\tthis.$extended = true;\n\tthis.shift = event.shiftKey;\n\tthis.control = event.ctrlKey;\n\tthis.alt = event.altKey;\n\tthis.meta = event.metaKey;\n\tvar type = this.type = event.type;\n\tvar target = event.target || event.srcElement;\n\twhile (target && target.nodeType == 3) target = target.parentNode;\n\tthis.target = document.id(target);\n\n\tif (type.indexOf('key') == 0){\n\t\tvar code = this.code = (event.which || event.keyCode);\n\t\tthis.key = _keys[code];\n\t\tif (type == 'keydown'){\n\t\t\tif (code > 111 && code < 124) this.key = 'f' + (code - 111);\n\t\t\telse if (code > 95 && code < 106) this.key = code - 96;\n\t\t}\n\t\tif (this.key == null) this.key = String.fromCharCode(code).toLowerCase();\n\t} else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){\n\t\tvar doc = win.document;\n\t\tdoc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;\n\t\tthis.page = {\n\t\t\tx: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,\n\t\t\ty: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop\n\t\t};\n\t\tthis.client = {\n\t\t\tx: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,\n\t\t\ty: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY\n\t\t};\n\t\tif (type == 'DOMMouseScroll' || type == 'mousewheel')\n\t\t\tthis.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;\n\n\t\tthis.rightClick = (event.which == 3 || event.button == 2);\n\t\tif (type == 'mouseover' || type == 'mouseout'){\n\t\t\tvar related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];\n\t\t\twhile (related && related.nodeType == 3) related = related.parentNode;\n\t\t\tthis.relatedTarget = document.id(related);\n\t\t}\n\t} else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){\n\t\tthis.rotation = event.rotation;\n\t\tthis.scale = event.scale;\n\t\tthis.targetTouches = event.targetTouches;\n\t\tthis.changedTouches = event.changedTouches;\n\t\tvar touches = this.touches = event.touches;\n\t\tif (touches && touches[0]){\n\t\t\tvar touch = touches[0];\n\t\t\tthis.page = {x: touch.pageX, y: touch.pageY};\n\t\t\tthis.client = {x: touch.clientX, y: touch.clientY};\n\t\t}\n\t}\n\n\tif (!this.client) this.client = {};\n\tif (!this.page) this.page = {};\n});\n\nDOMEvent.implement({\n\n\tstop: function(){\n\t\treturn this.preventDefault().stopPropagation();\n\t},\n\n\tstopPropagation: function(){\n\t\tif (this.event.stopPropagation) this.event.stopPropagation();\n\t\telse this.event.cancelBubble = true;\n\t\treturn this;\n\t},\n\n\tpreventDefault: function(){\n\t\tif (this.event.preventDefault) this.event.preventDefault();\n\t\telse this.event.returnValue = false;\n\t\treturn this;\n\t}\n\n});\n\nDOMEvent.defineKey = function(code, key){\n\t_keys[code] = key;\n\treturn this;\n};\n\nDOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);\n\nDOMEvent.defineKeys({\n\t'38': 'up', '40': 'down', '37': 'left', '39': 'right',\n\t'27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab',\n\t'46': 'delete', '13': 'enter'\n});\n\n})();\n\n\n\n\n\n\n/*\n---\n\nname: Class\n\ndescription: Contains the Class Function for easily creating, extending, and implementing reusable Classes.\n\nlicense: MIT-style license.\n\nrequires: [Array, String, Function, Number]\n\nprovides: Class\n\n...\n*/\n\n(function(){\n\nvar Class = this.Class = new Type('Class', function(params){\n\tif (instanceOf(params, Function)) params = {initialize: params};\n\n\tvar newClass = function(){\n\t\treset(this);\n\t\tif (newClass.$prototyping) return this;\n\t\tthis.$caller = null;\n\t\tvar value = (this.initialize) ? this.initialize.apply(this, arguments) : this;\n\t\tthis.$caller = this.caller = null;\n\t\treturn value;\n\t}.extend(this).implement(params);\n\n\tnewClass.$constructor = Class;\n\tnewClass.prototype.$constructor = newClass;\n\tnewClass.prototype.parent = parent;\n\n\treturn newClass;\n});\n\nvar parent = function(){\n\tif (!this.$caller) throw new Error('The method \"parent\" cannot be called.');\n\tvar name = this.$caller.$name,\n\t\tparent = this.$caller.$owner.parent,\n\t\tprevious = (parent) ? parent.prototype[name] : null;\n\tif (!previous) throw new Error('The method \"' + name + '\" has no parent.');\n\treturn previous.apply(this, arguments);\n};\n\nvar reset = function(object){\n\tfor (var key in object){\n\t\tvar value = object[key];\n\t\tswitch (typeOf(value)){\n\t\t\tcase 'object':\n\t\t\t\tvar F = function(){};\n\t\t\t\tF.prototype = value;\n\t\t\t\tobject[key] = reset(new F);\n\t\t\tbreak;\n\t\t\tcase 'array': object[key] = value.clone(); break;\n\t\t}\n\t}\n\treturn object;\n};\n\nvar wrap = function(self, key, method){\n\tif (method.$origin) method = method.$origin;\n\tvar wrapper = function(){\n\t\tif (method.$protected && this.$caller == null) throw new Error('The method \"' + key + '\" cannot be called.');\n\t\tvar caller = this.caller, current = this.$caller;\n\t\tthis.caller = current; this.$caller = wrapper;\n\t\tvar result = method.apply(this, arguments);\n\t\tthis.$caller = current; this.caller = caller;\n\t\treturn result;\n\t}.extend({$owner: self, $origin: method, $name: key});\n\treturn wrapper;\n};\n\nvar implement = function(key, value, retain){\n\tif (Class.Mutators.hasOwnProperty(key)){\n\t\tvalue = Class.Mutators[key].call(this, value);\n\t\tif (value == null) return this;\n\t}\n\n\tif (typeOf(value) == 'function'){\n\t\tif (value.$hidden) return this;\n\t\tthis.prototype[key] = (retain) ? value : wrap(this, key, value);\n\t} else {\n\t\tObject.merge(this.prototype, key, value);\n\t}\n\n\treturn this;\n};\n\nvar getInstance = function(klass){\n\tklass.$prototyping = true;\n\tvar proto = new klass;\n\tdelete klass.$prototyping;\n\treturn proto;\n};\n\nClass.implement('implement', implement.overloadSetter());\n\nClass.Mutators = {\n\n\tExtends: function(parent){\n\t\tthis.parent = parent;\n\t\tthis.prototype = getInstance(parent);\n\t},\n\n\tImplements: function(items){\n\t\tArray.from(items).each(function(item){\n\t\t\tvar instance = new item;\n\t\t\tfor (var key in instance) implement.call(this, key, instance[key], true);\n\t\t}, this);\n\t}\n};\n\n})();\n\n\n/*\n---\n\nname: Class.Extras\n\ndescription: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.\n\nlicense: MIT-style license.\n\nrequires: Class\n\nprovides: [Class.Extras, Chain, Events, Options]\n\n...\n*/\n\n(function(){\n\nthis.Chain = new Class({\n\n\t$chain: [],\n\n\tchain: function(){\n\t\tthis.$chain.append(Array.flatten(arguments));\n\t\treturn this;\n\t},\n\n\tcallChain: function(){\n\t\treturn (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;\n\t},\n\n\tclearChain: function(){\n\t\tthis.$chain.empty();\n\t\treturn this;\n\t}\n\n});\n\nvar removeOn = function(string){\n\treturn string.replace(/^on([A-Z])/, function(full, first){\n\t\treturn first.toLowerCase();\n\t});\n};\n\nthis.Events = new Class({\n\n\t$events: {},\n\n\taddEvent: function(type, fn, internal){\n\t\ttype = removeOn(type);\n\n\t\t\n\n\t\tthis.$events[type] = (this.$events[type] || []).include(fn);\n\t\tif (internal) fn.internal = true;\n\t\treturn this;\n\t},\n\n\taddEvents: function(events){\n\t\tfor (var type in events) this.addEvent(type, events[type]);\n\t\treturn this;\n\t},\n\n\tfireEvent: function(type, args, delay){\n\t\ttype = removeOn(type);\n\t\tvar events = this.$events[type];\n\t\tif (!events) return this;\n\t\targs = Array.from(args);\n\t\tevents.each(function(fn){\n\t\t\tif (delay) fn.delay(delay, this, args);\n\t\t\telse fn.apply(this, args);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tremoveEvent: function(type, fn){\n\t\ttype = removeOn(type);\n\t\tvar events = this.$events[type];\n\t\tif (events && !fn.internal){\n\t\t\tvar index = events.indexOf(fn);\n\t\t\tif (index != -1) delete events[index];\n\t\t}\n\t\treturn this;\n\t},\n\n\tremoveEvents: function(events){\n\t\tvar type;\n\t\tif (typeOf(events) == 'object'){\n\t\t\tfor (type in events) this.removeEvent(type, events[type]);\n\t\t\treturn this;\n\t\t}\n\t\tif (events) events = removeOn(events);\n\t\tfor (type in this.$events){\n\t\t\tif (events && events != type) continue;\n\t\t\tvar fns = this.$events[type];\n\t\t\tfor (var i = fns.length; i--;) if (i in fns){\n\t\t\t\tthis.removeEvent(type, fns[i]);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\nthis.Options = new Class({\n\n\tsetOptions: function(){\n\t\tvar options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));\n\t\tif (this.addEvent) for (var option in options){\n\t\t\tif (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;\n\t\t\tthis.addEvent(option, options[option]);\n\t\t\tdelete options[option];\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\n})();\n\n\n/*\n---\nname: Slick.Parser\ndescription: Standalone CSS3 Selector parser\nprovides: Slick.Parser\n...\n*/\n\n;(function(){\n\nvar parsed,\n\tseparatorIndex,\n\tcombinatorIndex,\n\treversed,\n\tcache = {},\n\treverseCache = {},\n\treUnescape = /\\\\/g;\n\nvar parse = function(expression, isReversed){\n\tif (expression == null) return null;\n\tif (expression.Slick === true) return expression;\n\texpression = ('' + expression).replace(/^\\s+|\\s+$/g, '');\n\treversed = !!isReversed;\n\tvar currentCache = (reversed) ? reverseCache : cache;\n\tif (currentCache[expression]) return currentCache[expression];\n\tparsed = {\n\t\tSlick: true,\n\t\texpressions: [],\n\t\traw: expression,\n\t\treverse: function(){\n\t\t\treturn parse(this.raw, true);\n\t\t}\n\t};\n\tseparatorIndex = -1;\n\twhile (expression != (expression = expression.replace(regexp, parser)));\n\tparsed.length = parsed.expressions.length;\n\treturn currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;\n};\n\nvar reverseCombinator = function(combinator){\n\tif (combinator === '!') return ' ';\n\telse if (combinator === ' ') return '!';\n\telse if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');\n\telse return '!' + combinator;\n};\n\nvar reverse = function(expression){\n\tvar expressions = expression.expressions;\n\tfor (var i = 0; i < expressions.length; i++){\n\t\tvar exp = expressions[i];\n\t\tvar last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};\n\n\t\tfor (var j = 0; j < exp.length; j++){\n\t\t\tvar cexp = exp[j];\n\t\t\tif (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';\n\t\t\tcexp.combinator = cexp.reverseCombinator;\n\t\t\tdelete cexp.reverseCombinator;\n\t\t}\n\n\t\texp.reverse().push(last);\n\t}\n\treturn expression;\n};\n\nvar escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan MIT License\n\treturn string.replace(/[-[\\]{}()*+?.\\\\^$|,#\\s]/g, function(match){\n\t\treturn '\\\\' + match;\n\t});\n};\n\nvar regexp = new RegExp(\n/*\n#!/usr/bin/env ruby\nputs \"\\t\\t\" + DATA.read.gsub(/\\(\\?x\\)|\\s+#.*$|\\s+|\\\\$|\\\\n/,'')\n__END__\n\t\"(?x)^(?:\\\n\t \\\\s* ( , ) \\\\s* # Separator \\n\\\n\t| \\\\s* ( + ) \\\\s* # Combinator \\n\\\n\t| ( \\\\s+ ) # CombinatorChildren \\n\\\n\t| ( + | \\\\* ) # Tag \\n\\\n\t| \\\\# ( + ) # ID \\n\\\n\t| \\\\. ( + ) # ClassName \\n\\\n\t| # Attribute \\n\\\n\t\\\\[ \\\n\t\t\\\\s* (+) (?: \\\n\t\t\t\\\\s* ([*^$!~|]?=) (?: \\\n\t\t\t\t\\\\s* (?:\\\n\t\t\t\t\t([\\\"']?)(.*?)\\\\9 \\\n\t\t\t\t)\\\n\t\t\t) \\\n\t\t)? \\\\s* \\\n\t\\\\](?!\\\\]) \\n\\\n\t| :+ ( + )(?:\\\n\t\\\\( (?:\\\n\t\t(?:([\\\"'])([^\\\\12]*)\\\\12)|((?:\\\\([^)]+\\\\)|[^()]*)+)\\\n\t) \\\\)\\\n\t)?\\\n\t)\"\n*/\n\t\"^(?:\\\\s*(,)\\\\s*|\\\\s*(+)\\\\s*|(\\\\s+)|(+|\\\\*)|\\\\#(+)|\\\\.(+)|\\\\[\\\\s*(+)(?:\\\\s*([*^$!~|]?=)(?:\\\\s*(?:([\\\"']?)(.*?)\\\\9)))?\\\\s*\\\\](?!\\\\])|(:+)(+)(?:\\\\((?:(?:([\\\"'])([^\\\\13]*)\\\\13)|((?:\\\\([^)]+\\\\)|[^()]*)+))\\\\))?)\"\n\t.replace(//, '[' + escapeRegExp(\">+~`!@$%^&={}\\\\;/g, '(?:[\\\\w\\\\u00a1-\\\\uFFFF-]|\\\\\\\\[^\\\\s0-9a-f])')\n\t.replace(//g, '(?:[:\\\\w\\\\u00a1-\\\\uFFFF-]|\\\\\\\\[^\\\\s0-9a-f])')\n);\n\nfunction parser(\n\trawMatch,\n\n\tseparator,\n\tcombinator,\n\tcombinatorChildren,\n\n\ttagName,\n\tid,\n\tclassName,\n\n\tattributeKey,\n\tattributeOperator,\n\tattributeQuote,\n\tattributeValue,\n\n\tpseudoMarker,\n\tpseudoClass,\n\tpseudoQuote,\n\tpseudoClassQuotedValue,\n\tpseudoClassValue\n){\n\tif (separator || separatorIndex === -1){\n\t\tparsed.expressions[++separatorIndex] = [];\n\t\tcombinatorIndex = -1;\n\t\tif (separator) return '';\n\t}\n\n\tif (combinator || combinatorChildren || combinatorIndex === -1){\n\t\tcombinator = combinator || ' ';\n\t\tvar currentSeparator = parsed.expressions[separatorIndex];\n\t\tif (reversed && currentSeparator[combinatorIndex])\n\t\t\tcurrentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);\n\t\tcurrentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};\n\t}\n\n\tvar currentParsed = parsed.expressions[separatorIndex][combinatorIndex];\n\n\tif (tagName){\n\t\tcurrentParsed.tag = tagName.replace(reUnescape, '');\n\n\t} else if (id){\n\t\tcurrentParsed.id = id.replace(reUnescape, '');\n\n\t} else if (className){\n\t\tclassName = className.replace(reUnescape, '');\n\n\t\tif (!currentParsed.classList) currentParsed.classList = [];\n\t\tif (!currentParsed.classes) currentParsed.classes = [];\n\t\tcurrentParsed.classList.push(className);\n\t\tcurrentParsed.classes.push({\n\t\t\tvalue: className,\n\t\t\tregexp: new RegExp('(^|\\\\s)' + escapeRegExp(className) + '(\\\\s|$)')\n\t\t});\n\n\t} else if (pseudoClass){\n\t\tpseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;\n\t\tpseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;\n\n\t\tif (!currentParsed.pseudos) currentParsed.pseudos = [];\n\t\tcurrentParsed.pseudos.push({\n\t\t\tkey: pseudoClass.replace(reUnescape, ''),\n\t\t\tvalue: pseudoClassValue,\n\t\t\ttype: pseudoMarker.length == 1 ? 'class' : 'element'\n\t\t});\n\n\t} else if (attributeKey){\n\t\tattributeKey = attributeKey.replace(reUnescape, '');\n\t\tattributeValue = (attributeValue || '').replace(reUnescape, '');\n\n\t\tvar test, regexp;\n\n\t\tswitch (attributeOperator){\n\t\t\tcase '^=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) ); break;\n\t\t\tcase '$=' : regexp = new RegExp( escapeRegExp(attributeValue) +'$' ); break;\n\t\t\tcase '~=' : regexp = new RegExp( '(^|\\\\s)'+ escapeRegExp(attributeValue) +'(\\\\s|$)' ); break;\n\t\t\tcase '|=' : regexp = new RegExp( '^'+ escapeRegExp(attributeValue) +'(-|$)' ); break;\n\t\t\tcase '=' : test = function(value){\n\t\t\t\treturn attributeValue == value;\n\t\t\t}; break;\n\t\t\tcase '*=' : test = function(value){\n\t\t\t\treturn value && value.indexOf(attributeValue) > -1;\n\t\t\t}; break;\n\t\t\tcase '!=' : test = function(value){\n\t\t\t\treturn attributeValue != value;\n\t\t\t}; break;\n\t\t\tdefault : test = function(value){\n\t\t\t\treturn !!value;\n\t\t\t};\n\t\t}\n\n\t\tif (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){\n\t\t\treturn false;\n\t\t};\n\n\t\tif (!test) test = function(value){\n\t\t\treturn value && regexp.test(value);\n\t\t};\n\n\t\tif (!currentParsed.attributes) currentParsed.attributes = [];\n\t\tcurrentParsed.attributes.push({\n\t\t\tkey: attributeKey,\n\t\t\toperator: attributeOperator,\n\t\t\tvalue: attributeValue,\n\t\t\ttest: test\n\t\t});\n\n\t}\n\n\treturn '';\n};\n\n// Slick NS\n\nvar Slick = (this.Slick || {});\n\nSlick.parse = function(expression){\n\treturn parse(expression);\n};\n\nSlick.escapeRegExp = escapeRegExp;\n\nif (!this.Slick) this.Slick = Slick;\n\n}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this);\n\n\n/*\n---\nname: Slick.Finder\ndescription: The new, superfast css selector engine.\nprovides: Slick.Finder\nrequires: Slick.Parser\n...\n*/\n\n;(function(){\n\nvar local = {},\n\tfeaturesCache = {},\n\ttoString = Object.prototype.toString;\n\n// Feature / Bug detection\n\nlocal.isNativeCode = function(fn){\n\treturn (/\\{\\s*\\[native code\\]\\s*\\}/).test('' + fn);\n};\n\nlocal.isXML = function(document){\n\treturn (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||\n\t(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');\n};\n\nlocal.setDocument = function(document){\n\n\t// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.\n\tvar nodeType = document.nodeType;\n\tif (nodeType == 9); // document\n\telse if (nodeType) document = document.ownerDocument; // node\n\telse if (document.navigator) document = document.document; // window\n\telse return;\n\n\t// check if it's the old document\n\n\tif (this.document === document) return;\n\tthis.document = document;\n\n\t// check if we have done feature detection on this document before\n\n\tvar root = document.documentElement,\n\t\trootUid = this.getUIDXML(root),\n\t\tfeatures = featuresCache[rootUid],\n\t\tfeature;\n\n\tif (features){\n\t\tfor (feature in features){\n\t\t\tthis[feature] = features[feature];\n\t\t}\n\t\treturn;\n\t}\n\n\tfeatures = featuresCache[rootUid] = {};\n\n\tfeatures.root = root;\n\tfeatures.isXMLDocument = this.isXML(document);\n\n\tfeatures.brokenStarGEBTN\n\t= features.starSelectsClosedQSA\n\t= features.idGetsName\n\t= features.brokenMixedCaseQSA\n\t= features.brokenGEBCN\n\t= features.brokenCheckedQSA\n\t= features.brokenEmptyAttributeQSA\n\t= features.isHTMLDocument\n\t= features.nativeMatchesSelector\n\t= false;\n\n\tvar starSelectsClosed, starSelectsComments,\n\t\tbrokenSecondClassNameGEBCN, cachedGetElementsByClassName,\n\t\tbrokenFormAttributeGetter;\n\n\tvar selected, id = 'slick_uniqueid';\n\tvar testNode = document.createElement('div');\n\n\tvar testRoot = document.body || document.getElementsByTagName('body')[0] || root;\n\ttestRoot.appendChild(testNode);\n\n\t// on non-HTML documents innerHTML and getElementsById doesnt work properly\n\ttry {\n\t\ttestNode.innerHTML = '';\n\t\tfeatures.isHTMLDocument = !!document.getElementById(id);\n\t} catch(e){};\n\n\tif (features.isHTMLDocument){\n\n\t\ttestNode.style.display = 'none';\n\n\t\t// IE returns comment nodes for getElementsByTagName('*') for some documents\n\t\ttestNode.appendChild(document.createComment(''));\n\t\tstarSelectsComments = (testNode.getElementsByTagName('*').length > 1);\n\n\t\t// IE returns closed nodes (EG:\"\") for getElementsByTagName('*') for some documents\n\t\ttry {\n\t\t\ttestNode.innerHTML = 'foo';\n\t\t\tselected = testNode.getElementsByTagName('*');\n\t\t\tstarSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');\n\t\t} catch(e){};\n\n\t\tfeatures.brokenStarGEBTN = starSelectsComments || starSelectsClosed;\n\n\t\t// IE returns elements with the name instead of just id for getElementsById for some documents\n\t\ttry {\n\t\t\ttestNode.innerHTML = '';\n\t\t\tfeatures.idGetsName = document.getElementById(id) === testNode.firstChild;\n\t\t} catch(e){};\n\n\t\tif (testNode.getElementsByClassName){\n\n\t\t\t// Safari 3.2 getElementsByClassName caches results\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '';\n\t\t\t\ttestNode.getElementsByClassName('b').length;\n\t\t\t\ttestNode.firstChild.className = 'b';\n\t\t\t\tcachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);\n\t\t\t} catch(e){};\n\n\t\t\t// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '';\n\t\t\t\tbrokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);\n\t\t\t} catch(e){};\n\n\t\t\tfeatures.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;\n\t\t}\n\n\t\tif (testNode.querySelectorAll){\n\t\t\t// IE 8 returns closed nodes (EG:\"\") for querySelectorAll('*') for some documents\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = 'foo';\n\t\t\t\tselected = testNode.querySelectorAll('*');\n\t\t\t\tfeatures.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');\n\t\t\t} catch(e){};\n\n\t\t\t// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '';\n\t\t\t\tfeatures.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;\n\t\t\t} catch(e){};\n\n\t\t\t// Webkit and Opera dont return selected options on querySelectorAll\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '';\n\t\t\t\tfeatures.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);\n\t\t\t} catch(e){};\n\n\t\t\t// IE returns incorrect results for attr[*^$]=\"\" selectors on querySelectorAll\n\t\t\ttry {\n\t\t\t\ttestNode.innerHTML = '';\n\t\t\t\tfeatures.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=\"\"]').length != 0);\n\t\t\t} catch(e){};\n\n\t\t}\n\n\t\t// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input\n\t\ttry {\n\t\t\ttestNode.innerHTML = '
';\n\t\t\tbrokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');\n\t\t} catch(e){};\n\n\t\t// native matchesSelector function\n\n\t\tfeatures.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;\n\t\tif (features.nativeMatchesSelector) try {\n\t\t\t// if matchesSelector trows errors on incorrect sintaxes we can use it\n\t\t\tfeatures.nativeMatchesSelector.call(root, ':slick');\n\t\t\tfeatures.nativeMatchesSelector = null;\n\t\t} catch(e){};\n\n\t}\n\n\ttry {\n\t\troot.slick_expando = 1;\n\t\tdelete root.slick_expando;\n\t\tfeatures.getUID = this.getUIDHTML;\n\t} catch(e) {\n\t\tfeatures.getUID = this.getUIDXML;\n\t}\n\n\ttestRoot.removeChild(testNode);\n\ttestNode = selected = testRoot = null;\n\n\t// getAttribute\n\n\tfeatures.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){\n\t\tvar method = this.attributeGetters[name];\n\t\tif (method) return method.call(node);\n\t\tvar attributeNode = node.getAttributeNode(name);\n\t\treturn (attributeNode) ? attributeNode.nodeValue : null;\n\t} : function(node, name){\n\t\tvar method = this.attributeGetters[name];\n\t\treturn (method) ? method.call(node) : node.getAttribute(name);\n\t};\n\n\t// hasAttribute\n\n\tfeatures.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {\n\t\treturn node.hasAttribute(attribute);\n\t} : function(node, attribute) {\n\t\tnode = node.getAttributeNode(attribute);\n\t\treturn !!(node && (node.specified || node.nodeValue));\n\t};\n\n\t// contains\n\t// FIXME: Add specs: local.contains should be different for xml and html documents?\n\tvar nativeRootContains = root && this.isNativeCode(root.contains),\n\t\tnativeDocumentContains = document && this.isNativeCode(document.contains);\n\n\tfeatures.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){\n\t\treturn context.contains(node);\n\t} : (nativeRootContains && !nativeDocumentContains) ? function(context, node){\n\t\t// IE8 does not have .contains on document.\n\t\treturn context === node || ((context === document) ? document.documentElement : context).contains(node);\n\t} : (root && root.compareDocumentPosition) ? function(context, node){\n\t\treturn context === node || !!(context.compareDocumentPosition(node) & 16);\n\t} : function(context, node){\n\t\tif (node) do {\n\t\t\tif (node === context) return true;\n\t\t} while ((node = node.parentNode));\n\t\treturn false;\n\t};\n\n\t// document order sorting\n\t// credits to Sizzle (http://sizzlejs.com/)\n\n\tfeatures.documentSorter = (root.compareDocumentPosition) ? function(a, b){\n\t\tif (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;\n\t\treturn a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;\n\t} : ('sourceIndex' in root) ? function(a, b){\n\t\tif (!a.sourceIndex || !b.sourceIndex) return 0;\n\t\treturn a.sourceIndex - b.sourceIndex;\n\t} : (document.createRange) ? function(a, b){\n\t\tif (!a.ownerDocument || !b.ownerDocument) return 0;\n\t\tvar aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();\n\t\taRange.setStart(a, 0);\n\t\taRange.setEnd(a, 0);\n\t\tbRange.setStart(b, 0);\n\t\tbRange.setEnd(b, 0);\n\t\treturn aRange.compareBoundaryPoints(Range.START_TO_END, bRange);\n\t} : null ;\n\n\troot = null;\n\n\tfor (feature in features){\n\t\tthis[feature] = features[feature];\n\t}\n};\n\n// Main Method\n\nvar reSimpleSelector = /^([#.]?)((?:[\\w-]+|\\*))$/,\n\treEmptyAttribute = /\\[.+[*$^]=(?:\"\"|'')?\\]/,\n\tqsaFailExpCache = {};\n\nlocal.search = function(context, expression, append, first){\n\n\tvar found = this.found = (first) ? null : (append || []);\n\n\tif (!context) return found;\n\telse if (context.navigator) context = context.document; // Convert the node from a window to a document\n\telse if (!context.nodeType) return found;\n\n\t// setup\n\n\tvar parsed, i,\n\t\tuniques = this.uniques = {},\n\t\thasOthers = !!(append && append.length),\n\t\tcontextIsDocument = (context.nodeType == 9);\n\n\tif (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);\n\n\t// avoid duplicating items already in the append array\n\tif (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;\n\n\t// expression checks\n\n\tif (typeof expression == 'string'){ // expression is a string\n\n\t\t/**/\n\t\tvar simpleSelector = expression.match(reSimpleSelector);\n\t\tsimpleSelectors: if (simpleSelector) {\n\n\t\t\tvar symbol = simpleSelector[1],\n\t\t\t\tname = simpleSelector[2],\n\t\t\t\tnode, nodes;\n\n\t\t\tif (!symbol){\n\n\t\t\t\tif (name == '*' && this.brokenStarGEBTN) break simpleSelectors;\n\t\t\t\tnodes = context.getElementsByTagName(name);\n\t\t\t\tif (first) return nodes[0] || null;\n\t\t\t\tfor (i = 0; node = nodes[i++];){\n\t\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t\t}\n\n\t\t\t} else if (symbol == '#'){\n\n\t\t\t\tif (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;\n\t\t\t\tnode = context.getElementById(name);\n\t\t\t\tif (!node) return found;\n\t\t\t\tif (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;\n\t\t\t\tif (first) return node || null;\n\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\n\t\t\t} else if (symbol == '.'){\n\n\t\t\t\tif (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;\n\t\t\t\tif (context.getElementsByClassName && !this.brokenGEBCN){\n\t\t\t\t\tnodes = context.getElementsByClassName(name);\n\t\t\t\t\tif (first) return nodes[0] || null;\n\t\t\t\t\tfor (i = 0; node = nodes[i++];){\n\t\t\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar matchClass = new RegExp('(^|\\\\s)'+ Slick.escapeRegExp(name) +'(\\\\s|$)');\n\t\t\t\t\tnodes = context.getElementsByTagName('*');\n\t\t\t\t\tfor (i = 0; node = nodes[i++];){\n\t\t\t\t\t\tclassName = node.className;\n\t\t\t\t\t\tif (!(className && matchClass.test(className))) continue;\n\t\t\t\t\t\tif (first) return node;\n\t\t\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (hasOthers) this.sort(found);\n\t\t\treturn (first) ? null : found;\n\n\t\t}\n\t\t/**/\n\n\t\t/**/\n\t\tquerySelector: if (context.querySelectorAll) {\n\n\t\t\tif (!this.isHTMLDocument\n\t\t\t\t|| qsaFailExpCache[expression]\n\t\t\t\t//TODO: only skip when expression is actually mixed case\n\t\t\t\t|| this.brokenMixedCaseQSA\n\t\t\t\t|| (this.brokenCheckedQSA && expression.indexOf(':checked') > -1)\n\t\t\t\t|| (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression))\n\t\t\t\t|| (!contextIsDocument //Abort when !contextIsDocument and...\n\t\t\t\t\t// there are multiple expressions in the selector\n\t\t\t\t\t// since we currently only fix non-document rooted QSA for single expression selectors\n\t\t\t\t\t&& expression.indexOf(',') > -1\n\t\t\t\t)\n\t\t\t\t|| Slick.disableQSA\n\t\t\t) break querySelector;\n\n\t\t\tvar _expression = expression, _context = context;\n\t\t\tif (!contextIsDocument){\n\t\t\t\t// non-document rooted QSA\n\t\t\t\t// credits to Andrew Dupont\n\t\t\t\tvar currentId = _context.getAttribute('id'), slickid = 'slickid__';\n\t\t\t\t_context.setAttribute('id', slickid);\n\t\t\t\t_expression = '#' + slickid + ' ' + _expression;\n\t\t\t\tcontext = _context.parentNode;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tif (first) return context.querySelector(_expression) || null;\n\t\t\t\telse nodes = context.querySelectorAll(_expression);\n\t\t\t} catch(e) {\n\t\t\t\tqsaFailExpCache[expression] = 1;\n\t\t\t\tbreak querySelector;\n\t\t\t} finally {\n\t\t\t\tif (!contextIsDocument){\n\t\t\t\t\tif (currentId) _context.setAttribute('id', currentId);\n\t\t\t\t\telse _context.removeAttribute('id');\n\t\t\t\t\tcontext = _context;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){\n\t\t\t\tif (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t} else for (i = 0; node = nodes[i++];){\n\t\t\t\tif (!(hasOthers && uniques[this.getUID(node)])) found.push(node);\n\t\t\t}\n\n\t\t\tif (hasOthers) this.sort(found);\n\t\t\treturn found;\n\n\t\t}\n\t\t/**/\n\n\t\tparsed = this.Slick.parse(expression);\n\t\tif (!parsed.length) return found;\n\t} else if (expression == null){ // there is no expression\n\t\treturn found;\n\t} else if (expression.Slick){ // expression is a parsed Slick object\n\t\tparsed = expression;\n\t} else if (this.contains(context.documentElement || context, expression)){ // expression is a node\n\t\t(found) ? found.push(expression) : found = expression;\n\t\treturn found;\n\t} else { // other junk\n\t\treturn found;\n\t}\n\n\t/**//**/\n\n\t// cache elements for the nth selectors\n\n\tthis.posNTH = {};\n\tthis.posNTHLast = {};\n\tthis.posNTHType = {};\n\tthis.posNTHTypeLast = {};\n\n\t/**//**/\n\n\t// if append is null and there is only a single selector with one expression use pushArray, else use pushUID\n\tthis.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;\n\n\tif (found == null) found = [];\n\n\t// default engine\n\n\tvar j, m, n;\n\tvar combinator, tag, id, classList, classes, attributes, pseudos;\n\tvar currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;\n\n\tsearch: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){\n\n\t\tcombinator = 'combinator:' + currentBit.combinator;\n\t\tif (!this[combinator]) continue search;\n\n\t\ttag = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();\n\t\tid = currentBit.id;\n\t\tclassList = currentBit.classList;\n\t\tclasses = currentBit.classes;\n\t\tattributes = currentBit.attributes;\n\t\tpseudos = currentBit.pseudos;\n\t\tlastBit = (j === (currentExpression.length - 1));\n\n\t\tthis.bitUniques = {};\n\n\t\tif (lastBit){\n\t\t\tthis.uniques = uniques;\n\t\t\tthis.found = found;\n\t\t} else {\n\t\t\tthis.uniques = {};\n\t\t\tthis.found = [];\n\t\t}\n\n\t\tif (j === 0){\n\t\t\tthis[combinator](context, tag, id, classes, attributes, pseudos, classList);\n\t\t\tif (first && lastBit && found.length) break search;\n\t\t} else {\n\t\t\tif (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){\n\t\t\t\tthis[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);\n\t\t\t\tif (found.length) break search;\n\t\t\t} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);\n\t\t}\n\n\t\tcurrentItems = this.found;\n\t}\n\n\t// should sort if there are nodes in append and if you pass multiple expressions.\n\tif (hasOthers || (parsed.expressions.length > 1)) this.sort(found);\n\n\treturn (first) ? (found[0] || null) : found;\n};\n\n// Utils\n\nlocal.uidx = 1;\nlocal.uidk = 'slick-uniqueid';\n\nlocal.getUIDXML = function(node){\n\tvar uid = node.getAttribute(this.uidk);\n\tif (!uid){\n\t\tuid = this.uidx++;\n\t\tnode.setAttribute(this.uidk, uid);\n\t}\n\treturn uid;\n};\n\nlocal.getUIDHTML = function(node){\n\treturn node.uniqueNumber || (node.uniqueNumber = this.uidx++);\n};\n\n// sort based on the setDocument documentSorter method.\n\nlocal.sort = function(results){\n\tif (!this.documentSorter) return results;\n\tresults.sort(this.documentSorter);\n\treturn results;\n};\n\n/**//**/\n\nlocal.cacheNTH = {};\n\nlocal.matchNTH = /^([+-]?\\d*)?([a-z]+)?([+-]\\d+)?$/;\n\nlocal.parseNTHArgument = function(argument){\n\tvar parsed = argument.match(this.matchNTH);\n\tif (!parsed) return false;\n\tvar special = parsed[2] || false;\n\tvar a = parsed[1] || 1;\n\tif (a == '-') a = -1;\n\tvar b = +parsed[3] || 0;\n\tparsed =\n\t\t(special == 'n')\t? {a: a, b: b} :\n\t\t(special == 'odd')\t? {a: 2, b: 1} :\n\t\t(special == 'even')\t? {a: 2, b: 0} : {a: 0, b: a};\n\n\treturn (this.cacheNTH[argument] = parsed);\n};\n\nlocal.createNTHPseudo = function(child, sibling, positions, ofType){\n\treturn function(node, argument){\n\t\tvar uid = this.getUID(node);\n\t\tif (!this[positions][uid]){\n\t\t\tvar parent = node.parentNode;\n\t\t\tif (!parent) return false;\n\t\t\tvar el = parent[child], count = 1;\n\t\t\tif (ofType){\n\t\t\t\tvar nodeName = node.nodeName;\n\t\t\t\tdo {\n\t\t\t\t\tif (el.nodeName != nodeName) continue;\n\t\t\t\t\tthis[positions][this.getUID(el)] = count++;\n\t\t\t\t} while ((el = el[sibling]));\n\t\t\t} else {\n\t\t\t\tdo {\n\t\t\t\t\tif (el.nodeType != 1) continue;\n\t\t\t\t\tthis[positions][this.getUID(el)] = count++;\n\t\t\t\t} while ((el = el[sibling]));\n\t\t\t}\n\t\t}\n\t\targument = argument || 'n';\n\t\tvar parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);\n\t\tif (!parsed) return false;\n\t\tvar a = parsed.a, b = parsed.b, pos = this[positions][uid];\n\t\tif (a == 0) return b == pos;\n\t\tif (a > 0){\n\t\t\tif (pos < b) return false;\n\t\t} else {\n\t\t\tif (b < pos) return false;\n\t\t}\n\t\treturn ((pos - b) % a) == 0;\n\t};\n};\n\n/**//**/\n\nlocal.pushArray = function(node, tag, id, classes, attributes, pseudos){\n\tif (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);\n};\n\nlocal.pushUID = function(node, tag, id, classes, attributes, pseudos){\n\tvar uid = this.getUID(node);\n\tif (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){\n\t\tthis.uniques[uid] = true;\n\t\tthis.found.push(node);\n\t}\n};\n\nlocal.matchNode = function(node, selector){\n\tif (this.isHTMLDocument && this.nativeMatchesSelector){\n\t\ttry {\n\t\t\treturn this.nativeMatchesSelector.call(node, selector.replace(/\\[([^=]+)=\\s*([^'\"\\]]+?)\\s*\\]/g, '[$1=\"$2\"]'));\n\t\t} catch(matchError) {}\n\t}\n\n\tvar parsed = this.Slick.parse(selector);\n\tif (!parsed) return true;\n\n\t// simple (single) selectors\n\tvar expressions = parsed.expressions, simpleExpCounter = 0, i;\n\tfor (i = 0; (currentExpression = expressions[i]); i++){\n\t\tif (currentExpression.length == 1){\n\t\t\tvar exp = currentExpression[0];\n\t\t\tif (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;\n\t\t\tsimpleExpCounter++;\n\t\t}\n\t}\n\n\tif (simpleExpCounter == parsed.length) return false;\n\n\tvar nodes = this.search(this.document, parsed), item;\n\tfor (i = 0; item = nodes[i++];){\n\t\tif (item === node) return true;\n\t}\n\treturn false;\n};\n\nlocal.matchPseudo = function(node, name, argument){\n\tvar pseudoName = 'pseudo:' + name;\n\tif (this[pseudoName]) return this[pseudoName](node, argument);\n\tvar attribute = this.getAttribute(node, name);\n\treturn (argument) ? argument == attribute : !!attribute;\n};\n\nlocal.matchSelector = function(node, tag, id, classes, attributes, pseudos){\n\tif (tag){\n\t\tvar nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();\n\t\tif (tag == '*'){\n\t\t\tif (nodeName < '@') return false; // Fix for comment nodes and closed nodes\n\t\t} else {\n\t\t\tif (nodeName != tag) return false;\n\t\t}\n\t}\n\n\tif (id && node.getAttribute('id') != id) return false;\n\n\tvar i, part, cls;\n\tif (classes) for (i = classes.length; i--;){\n\t\tcls = this.getAttribute(node, 'class');\n\t\tif (!(cls && classes[i].regexp.test(cls))) return false;\n\t}\n\tif (attributes) for (i = attributes.length; i--;){\n\t\tpart = attributes[i];\n\t\tif (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;\n\t}\n\tif (pseudos) for (i = pseudos.length; i--;){\n\t\tpart = pseudos[i];\n\t\tif (!this.matchPseudo(node, part.key, part.value)) return false;\n\t}\n\treturn true;\n};\n\nvar combinators = {\n\n\t' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level\n\n\t\tvar i, item, children;\n\n\t\tif (this.isHTMLDocument){\n\t\t\tgetById: if (id){\n\t\t\t\titem = this.document.getElementById(id);\n\t\t\t\tif ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){\n\t\t\t\t\t// all[id] returns all the elements with that name or id inside node\n\t\t\t\t\t// if theres just one it will return the element, else it will be a collection\n\t\t\t\t\tchildren = node.all[id];\n\t\t\t\t\tif (!children) return;\n\t\t\t\t\tif (!children[0]) children = [children];\n\t\t\t\t\tfor (i = 0; item = children[i++];){\n\t\t\t\t\t\tvar idNode = item.getAttributeNode('id');\n\t\t\t\t\t\tif (idNode && idNode.nodeValue == id){\n\t\t\t\t\t\t\tthis.push(item, tag, null, classes, attributes, pseudos);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!item){\n\t\t\t\t\t// if the context is in the dom we return, else we will try GEBTN, breaking the getById label\n\t\t\t\t\tif (this.contains(this.root, node)) return;\n\t\t\t\t\telse break getById;\n\t\t\t\t} else if (this.document !== node && !this.contains(node, item)) return;\n\t\t\t\tthis.push(item, tag, null, classes, attributes, pseudos);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tgetByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){\n\t\t\t\tchildren = node.getElementsByClassName(classList.join(' '));\n\t\t\t\tif (!(children && children.length)) break getByClass;\n\t\t\t\tfor (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tgetByTag: {\n\t\t\tchildren = node.getElementsByTagName(tag);\n\t\t\tif (!(children && children.length)) break getByTag;\n\t\t\tif (!this.brokenStarGEBTN) tag = null;\n\t\t\tfor (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'>': function(node, tag, id, classes, attributes, pseudos){ // direct children\n\t\tif ((node = node.firstChild)) do {\n\t\t\tif (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);\n\t\t} while ((node = node.nextSibling));\n\t},\n\n\t'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling\n\t\twhile ((node = node.nextSibling)) if (node.nodeType == 1){\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t'^': function(node, tag, id, classes, attributes, pseudos){ // first child\n\t\tnode = node.firstChild;\n\t\tif (node){\n\t\t\tif (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);\n\t\t\telse this['combinator:+'](node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings\n\t\twhile ((node = node.nextSibling)){\n\t\t\tif (node.nodeType != 1) continue;\n\t\t\tvar uid = this.getUID(node);\n\t\t\tif (this.bitUniques[uid]) break;\n\t\t\tthis.bitUniques[uid] = true;\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling\n\t\tthis['combinator:+'](node, tag, id, classes, attributes, pseudos);\n\t\tthis['combinator:!+'](node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings\n\t\tthis['combinator:~'](node, tag, id, classes, attributes, pseudos);\n\t\tthis['combinator:!~'](node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document\n\t\twhile ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)\n\t\tnode = node.parentNode;\n\t\tif (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);\n\t},\n\n\t'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling\n\t\twhile ((node = node.previousSibling)) if (node.nodeType == 1){\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t\tbreak;\n\t\t}\n\t},\n\n\t'!^': function(node, tag, id, classes, attributes, pseudos){ // last child\n\t\tnode = node.lastChild;\n\t\tif (node){\n\t\t\tif (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);\n\t\t\telse this['combinator:!+'](node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t},\n\n\t'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings\n\t\twhile ((node = node.previousSibling)){\n\t\t\tif (node.nodeType != 1) continue;\n\t\t\tvar uid = this.getUID(node);\n\t\t\tif (this.bitUniques[uid]) break;\n\t\t\tthis.bitUniques[uid] = true;\n\t\t\tthis.push(node, tag, id, classes, attributes, pseudos);\n\t\t}\n\t}\n\n};\n\nfor (var c in combinators) local['combinator:' + c] = combinators[c];\n\nvar pseudos = {\n\n\t/**/\n\n\t'empty': function(node){\n\t\tvar child = node.firstChild;\n\t\treturn !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;\n\t},\n\n\t'not': function(node, expression){\n\t\treturn !this.matchNode(node, expression);\n\t},\n\n\t'contains': function(node, text){\n\t\treturn (node.innerText || node.textContent || '').indexOf(text) > -1;\n\t},\n\n\t'first-child': function(node){\n\t\twhile ((node = node.previousSibling)) if (node.nodeType == 1) return false;\n\t\treturn true;\n\t},\n\n\t'last-child': function(node){\n\t\twhile ((node = node.nextSibling)) if (node.nodeType == 1) return false;\n\t\treturn true;\n\t},\n\n\t'only-child': function(node){\n\t\tvar prev = node;\n\t\twhile ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;\n\t\tvar next = node;\n\t\twhile ((next = next.nextSibling)) if (next.nodeType == 1) return false;\n\t\treturn true;\n\t},\n\n\t/**/\n\n\t'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),\n\n\t'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),\n\n\t'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),\n\n\t'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),\n\n\t'index': function(node, index){\n\t\treturn this['pseudo:nth-child'](node, '' + (index + 1));\n\t},\n\n\t'even': function(node){\n\t\treturn this['pseudo:nth-child'](node, '2n');\n\t},\n\n\t'odd': function(node){\n\t\treturn this['pseudo:nth-child'](node, '2n+1');\n\t},\n\n\t/**/\n\n\t/**/\n\n\t'first-of-type': function(node){\n\t\tvar nodeName = node.nodeName;\n\t\twhile ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;\n\t\treturn true;\n\t},\n\n\t'last-of-type': function(node){\n\t\tvar nodeName = node.nodeName;\n\t\twhile ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;\n\t\treturn true;\n\t},\n\n\t'only-of-type': function(node){\n\t\tvar prev = node, nodeName = node.nodeName;\n\t\twhile ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;\n\t\tvar next = node;\n\t\twhile ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;\n\t\treturn true;\n\t},\n\n\t/**/\n\n\t// custom pseudos\n\n\t'enabled': function(node){\n\t\treturn !node.disabled;\n\t},\n\n\t'disabled': function(node){\n\t\treturn node.disabled;\n\t},\n\n\t'checked': function(node){\n\t\treturn node.checked || node.selected;\n\t},\n\n\t'focus': function(node){\n\t\treturn this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));\n\t},\n\n\t'root': function(node){\n\t\treturn (node === this.root);\n\t},\n\n\t'selected': function(node){\n\t\treturn node.selected;\n\t}\n\n\t/**/\n};\n\nfor (var p in pseudos) local['pseudo:' + p] = pseudos[p];\n\n// attributes methods\n\nvar attributeGetters = local.attributeGetters = {\n\n\t'for': function(){\n\t\treturn ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');\n\t},\n\n\t'href': function(){\n\t\treturn ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');\n\t},\n\n\t'style': function(){\n\t\treturn (this.style) ? this.style.cssText : this.getAttribute('style');\n\t},\n\n\t'tabindex': function(){\n\t\tvar attributeNode = this.getAttributeNode('tabindex');\n\t\treturn (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;\n\t},\n\n\t'type': function(){\n\t\treturn this.getAttribute('type');\n\t},\n\n\t'maxlength': function(){\n\t\tvar attributeNode = this.getAttributeNode('maxLength');\n\t\treturn (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;\n\t}\n\n};\n\nattributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength;\n\n// Slick\n\nvar Slick = local.Slick = (this.Slick || {});\n\nSlick.version = '1.1.7';\n\n// Slick finder\n\nSlick.search = function(context, expression, append){\n\treturn local.search(context, expression, append);\n};\n\nSlick.find = function(context, expression){\n\treturn local.search(context, expression, null, true);\n};\n\n// Slick containment checker\n\nSlick.contains = function(container, node){\n\tlocal.setDocument(container);\n\treturn local.contains(container, node);\n};\n\n// Slick attribute getter\n\nSlick.getAttribute = function(node, name){\n\tlocal.setDocument(node);\n\treturn local.getAttribute(node, name);\n};\n\nSlick.hasAttribute = function(node, name){\n\tlocal.setDocument(node);\n\treturn local.hasAttribute(node, name);\n};\n\n// Slick matcher\n\nSlick.match = function(node, selector){\n\tif (!(node && selector)) return false;\n\tif (!selector || selector === node) return true;\n\tlocal.setDocument(node);\n\treturn local.matchNode(node, selector);\n};\n\n// Slick attribute accessor\n\nSlick.defineAttributeGetter = function(name, fn){\n\tlocal.attributeGetters[name] = fn;\n\treturn this;\n};\n\nSlick.lookupAttributeGetter = function(name){\n\treturn local.attributeGetters[name];\n};\n\n// Slick pseudo accessor\n\nSlick.definePseudo = function(name, fn){\n\tlocal['pseudo:' + name] = function(node, argument){\n\t\treturn fn.call(node, argument);\n\t};\n\treturn this;\n};\n\nSlick.lookupPseudo = function(name){\n\tvar pseudo = local['pseudo:' + name];\n\tif (pseudo) return function(argument){\n\t\treturn pseudo.call(this, argument);\n\t};\n\treturn null;\n};\n\n// Slick overrides accessor\n\nSlick.override = function(regexp, fn){\n\tlocal.override(regexp, fn);\n\treturn this;\n};\n\nSlick.isXML = local.isXML;\n\nSlick.uidOf = function(node){\n\treturn local.getUIDHTML(node);\n};\n\nif (!this.Slick) this.Slick = Slick;\n\n}).apply(/**/(typeof exports != 'undefined') ? exports : /**/this);\n\n\n/*\n---\n\nname: Element\n\ndescription: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.\n\nlicense: MIT-style license.\n\nrequires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder]\n\nprovides: [Element, Elements, $, $$, Iframe, Selectors]\n\n...\n*/\n\nvar Element = function(tag, props){\n\tvar konstructor = Element.Constructors[tag];\n\tif (konstructor) return konstructor(props);\n\tif (typeof tag != 'string') return document.id(tag).set(props);\n\n\tif (!props) props = {};\n\n\tif (!(/^[\\w-]+$/).test(tag)){\n\t\tvar parsed = Slick.parse(tag).expressions[0][0];\n\t\ttag = (parsed.tag == '*') ? 'div' : parsed.tag;\n\t\tif (parsed.id && props.id == null) props.id = parsed.id;\n\n\t\tvar attributes = parsed.attributes;\n\t\tif (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){\n\t\t\tattr = attributes[i];\n\t\t\tif (props[attr.key] != null) continue;\n\n\t\t\tif (attr.value != null && attr.operator == '=') props[attr.key] = attr.value;\n\t\t\telse if (!attr.value && !attr.operator) props[attr.key] = true;\n\t\t}\n\n\t\tif (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');\n\t}\n\n\treturn document.newElement(tag, props);\n};\n\n\nif (Browser.Element){\n\tElement.prototype = Browser.Element.prototype;\n\t// IE8 and IE9 require the wrapping.\n\tElement.prototype._fireEvent = (function(fireEvent){\n\t\treturn function(type, event){\n\t\t\treturn fireEvent.call(this, type, event);\n\t\t};\n\t})(Element.prototype.fireEvent);\n}\n\nnew Type('Element', Element).mirror(function(name){\n\tif (Array.prototype[name]) return;\n\n\tvar obj = {};\n\tobj[name] = function(){\n\t\tvar results = [], args = arguments, elements = true;\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tvar element = this[i], result = results[i] = element[name].apply(element, args);\n\t\t\telements = (elements && typeOf(result) == 'element');\n\t\t}\n\t\treturn (elements) ? new Elements(results) : results;\n\t};\n\n\tElements.implement(obj);\n});\n\nif (!Browser.Element){\n\tElement.parent = Object;\n\n\tElement.Prototype = {\n\t\t'$constructor': Element,\n\t\t'$family': Function.from('element').hide()\n\t};\n\n\tElement.mirror(function(name, method){\n\t\tElement.Prototype[name] = method;\n\t});\n}\n\nElement.Constructors = {};\n\n\n\nvar IFrame = new Type('IFrame', function(){\n\tvar params = Array.link(arguments, {\n\t\tproperties: Type.isObject,\n\t\tiframe: function(obj){\n\t\t\treturn (obj != null);\n\t\t}\n\t});\n\n\tvar props = params.properties || {}, iframe;\n\tif (params.iframe) iframe = document.id(params.iframe);\n\tvar onload = props.onload || function(){};\n\tdelete props.onload;\n\tprops.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();\n\tiframe = new Element(iframe || 'iframe', props);\n\n\tvar onLoad = function(){\n\t\tonload.call(iframe.contentWindow);\n\t};\n\n\tif (window.frames[props.id]) onLoad();\n\telse iframe.addListener('load', onLoad);\n\treturn iframe;\n});\n\nvar Elements = this.Elements = function(nodes){\n\tif (nodes && nodes.length){\n\t\tvar uniques = {}, node;\n\t\tfor (var i = 0; node = nodes[i++];){\n\t\t\tvar uid = Slick.uidOf(node);\n\t\t\tif (!uniques[uid]){\n\t\t\t\tuniques[uid] = true;\n\t\t\t\tthis.push(node);\n\t\t\t}\n\t\t}\n\t}\n};\n\nElements.prototype = {length: 0};\nElements.parent = Array;\n\nnew Type('Elements', Elements).implement({\n\n\tfilter: function(filter, bind){\n\t\tif (!filter) return this;\n\t\treturn new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){\n\t\t\treturn item.match(filter);\n\t\t} : filter, bind));\n\t}.protect(),\n\n\tpush: function(){\n\t\tvar length = this.length;\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\tvar item = document.id(arguments[i]);\n\t\t\tif (item) this[length++] = item;\n\t\t}\n\t\treturn (this.length = length);\n\t}.protect(),\n\n\tunshift: function(){\n\t\tvar items = [];\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\tvar item = document.id(arguments[i]);\n\t\t\tif (item) items.push(item);\n\t\t}\n\t\treturn Array.prototype.unshift.apply(this, items);\n\t}.protect(),\n\n\tconcat: function(){\n\t\tvar newElements = new Elements(this);\n\t\tfor (var i = 0, l = arguments.length; i < l; i++){\n\t\t\tvar item = arguments[i];\n\t\t\tif (Type.isEnumerable(item)) newElements.append(item);\n\t\t\telse newElements.push(item);\n\t\t}\n\t\treturn newElements;\n\t}.protect(),\n\n\tappend: function(collection){\n\t\tfor (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);\n\t\treturn this;\n\t}.protect(),\n\n\tempty: function(){\n\t\twhile (this.length) delete this[--this.length];\n\t\treturn this;\n\t}.protect()\n\n});\n\n\n\n(function(){\n\n// FF, IE\nvar splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};\n\nsplice.call(object, 1, 1);\nif (object[1] == 1) Elements.implement('splice', function(){\n\tvar length = this.length;\n\tvar result = splice.apply(this, arguments);\n\twhile (length >= this.length) delete this[length--];\n\treturn result;\n}.protect());\n\nArray.forEachMethod(function(method, name){\n\tElements.implement(name, method);\n});\n\nArray.mirror(Elements);\n\n/**/\nvar createElementAcceptsHTML;\ntry {\n createElementAcceptsHTML = (document.createElement('').name == 'x');\n} catch (e){}\n\nvar escapeQuotes = function(html){\n\treturn ('' + html).replace(/&/g, '&').replace(/\"/g, '"');\n};\n/**/\n\nDocument.implement({\n\n\tnewElement: function(tag, props){\n\t\tif (props && props.checked != null) props.defaultChecked = props.checked;\n\t\t/**/// Fix for readonly name and type properties in IE < 8\n\t\tif (createElementAcceptsHTML && props){\n\t\t\ttag = '<' + tag;\n\t\t\tif (props.name) tag += ' name=\"' + escapeQuotes(props.name) + '\"';\n\t\t\tif (props.type) tag += ' type=\"' + escapeQuotes(props.type) + '\"';\n\t\t\ttag += '>';\n\t\t\tdelete props.name;\n\t\t\tdelete props.type;\n\t\t}\n\t\t/**/\n\t\treturn this.id(this.createElement(tag)).set(props);\n\t}\n\n});\n\n})();\n\n(function(){\n\nSlick.uidOf(window);\nSlick.uidOf(document);\n\nDocument.implement({\n\n\tnewTextNode: function(text){\n\t\treturn this.createTextNode(text);\n\t},\n\n\tgetDocument: function(){\n\t\treturn this;\n\t},\n\n\tgetWindow: function(){\n\t\treturn this.window;\n\t},\n\n\tid: (function(){\n\n\t\tvar types = {\n\n\t\t\tstring: function(id, nocash, doc){\n\t\t\t\tid = Slick.find(doc, '#' + id.replace(/(\\W)/g, '\\\\$1'));\n\t\t\t\treturn (id) ? types.element(id, nocash) : null;\n\t\t\t},\n\n\t\t\telement: function(el, nocash){\n\t\t\t\tSlick.uidOf(el);\n\t\t\t\tif (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){\n\t\t\t\t\tvar fireEvent = el.fireEvent;\n\t\t\t\t\t// wrapping needed in IE7, or else crash\n\t\t\t\t\tel._fireEvent = function(type, event){\n\t\t\t\t\t\treturn fireEvent(type, event);\n\t\t\t\t\t};\n\t\t\t\t\tObject.append(el, Element.Prototype);\n\t\t\t\t}\n\t\t\t\treturn el;\n\t\t\t},\n\n\t\t\tobject: function(obj, nocash, doc){\n\t\t\t\tif (obj.toElement) return types.element(obj.toElement(doc), nocash);\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t};\n\n\t\ttypes.textnode = types.whitespace = types.window = types.document = function(zero){\n\t\t\treturn zero;\n\t\t};\n\n\t\treturn function(el, nocash, doc){\n\t\t\tif (el && el.$family && el.uniqueNumber) return el;\n\t\t\tvar type = typeOf(el);\n\t\t\treturn (types[type]) ? types[type](el, nocash, doc || document) : null;\n\t\t};\n\n\t})()\n\n});\n\nif (window.$ == null) Window.implement('$', function(el, nc){\n\treturn document.id(el, nc, this.document);\n});\n\nWindow.implement({\n\n\tgetDocument: function(){\n\t\treturn this.document;\n\t},\n\n\tgetWindow: function(){\n\t\treturn this;\n\t}\n\n});\n\n[Document, Element].invoke('implement', {\n\n\tgetElements: function(expression){\n\t\treturn Slick.search(this, expression, new Elements);\n\t},\n\n\tgetElement: function(expression){\n\t\treturn document.id(Slick.find(this, expression));\n\t}\n\n});\n\nvar contains = {contains: function(element){\n\treturn Slick.contains(this, element);\n}};\n\nif (!document.contains) Document.implement(contains);\nif (!document.createElement('div').contains) Element.implement(contains);\n\n\n\n// tree walking\n\nvar injectCombinator = function(expression, combinator){\n\tif (!expression) return combinator;\n\n\texpression = Object.clone(Slick.parse(expression));\n\n\tvar expressions = expression.expressions;\n\tfor (var i = expressions.length; i--;)\n\t\texpressions[i][0].combinator = combinator;\n\n\treturn expression;\n};\n\nObject.forEach({\n\tgetNext: '~',\n\tgetPrevious: '!~',\n\tgetParent: '!'\n}, function(combinator, method){\n\tElement.implement(method, function(expression){\n\t\treturn this.getElement(injectCombinator(expression, combinator));\n\t});\n});\n\nObject.forEach({\n\tgetAllNext: '~',\n\tgetAllPrevious: '!~',\n\tgetSiblings: '~~',\n\tgetChildren: '>',\n\tgetParents: '!'\n}, function(combinator, method){\n\tElement.implement(method, function(expression){\n\t\treturn this.getElements(injectCombinator(expression, combinator));\n\t});\n});\n\nElement.implement({\n\n\tgetFirst: function(expression){\n\t\treturn document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);\n\t},\n\n\tgetLast: function(expression){\n\t\treturn document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());\n\t},\n\n\tgetWindow: function(){\n\t\treturn this.ownerDocument.window;\n\t},\n\n\tgetDocument: function(){\n\t\treturn this.ownerDocument;\n\t},\n\n\tgetElementById: function(id){\n\t\treturn document.id(Slick.find(this, '#' + ('' + id).replace(/(\\W)/g, '\\\\$1')));\n\t},\n\n\tmatch: function(expression){\n\t\treturn !expression || Slick.match(this, expression);\n\t}\n\n});\n\n\n\nif (window.$$ == null) Window.implement('$$', function(selector){\n\tif (arguments.length == 1){\n\t\tif (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);\n\t\telse if (Type.isEnumerable(selector)) return new Elements(selector);\n\t}\n\treturn new Elements(arguments);\n});\n\n// Inserters\n\nvar inserters = {\n\n\tbefore: function(context, element){\n\t\tvar parent = element.parentNode;\n\t\tif (parent) parent.insertBefore(context, element);\n\t},\n\n\tafter: function(context, element){\n\t\tvar parent = element.parentNode;\n\t\tif (parent) parent.insertBefore(context, element.nextSibling);\n\t},\n\n\tbottom: function(context, element){\n\t\telement.appendChild(context);\n\t},\n\n\ttop: function(context, element){\n\t\telement.insertBefore(context, element.firstChild);\n\t}\n\n};\n\ninserters.inside = inserters.bottom;\n\n\n\n// getProperty / setProperty\n\nvar propertyGetters = {}, propertySetters = {};\n\n// properties\n\nvar properties = {};\nArray.forEach([\n\t'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan',\n\t'frameBorder', 'rowSpan', 'tabIndex', 'useMap'\n], function(property){\n\tproperties[property.toLowerCase()] = property;\n});\n\nproperties.html = 'innerHTML';\nproperties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';\n\nObject.forEach(properties, function(real, key){\n\tpropertySetters[key] = function(node, value){\n\t\tnode[real] = value;\n\t};\n\tpropertyGetters[key] = function(node){\n\t\treturn node[real];\n\t};\n});\n\n// Booleans\n\nvar bools = [\n\t'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked',\n\t'disabled', 'readOnly', 'multiple', 'selected', 'noresize',\n\t'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay',\n\t'loop'\n];\n\nvar booleans = {};\nArray.forEach(bools, function(bool){\n\tvar lower = bool.toLowerCase();\n\tbooleans[lower] = bool;\n\tpropertySetters[lower] = function(node, value){\n\t\tnode[bool] = !!value;\n\t};\n\tpropertyGetters[lower] = function(node){\n\t\treturn !!node[bool];\n\t};\n});\n\n// Special cases\n\nObject.append(propertySetters, {\n\n\t'class': function(node, value){\n\t\t('className' in node) ? node.className = (value || '') : node.setAttribute('class', value);\n\t},\n\n\t'for': function(node, value){\n\t\t('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value);\n\t},\n\n\t'style': function(node, value){\n\t\t(node.style) ? node.style.cssText = value : node.setAttribute('style', value);\n\t},\n\n\t'value': function(node, value){\n\t\tnode.value = (value != null) ? value : '';\n\t}\n\n});\n\npropertyGetters['class'] = function(node){\n\treturn ('className' in node) ? node.className || null : node.getAttribute('class');\n};\n\n/* */\nvar el = document.createElement('button');\n// IE sets type as readonly and throws\ntry { el.type = 'button'; } catch(e){}\nif (el.type != 'button') propertySetters.type = function(node, value){\n\tnode.setAttribute('type', value);\n};\nel = null;\n/* */\n\n/**/\nvar input = document.createElement('input');\ninput.value = 't';\ninput.type = 'submit';\nif (input.value != 't') propertySetters.type = function(node, type){\n\tvar value = node.value;\n\tnode.type = type;\n\tnode.value = value;\n};\ninput = null;\n/**/\n\n/* getProperty, setProperty */\n\n/* */\nvar pollutesGetAttribute = (function(div){\n\tdiv.random = 'attribute';\n\treturn (div.getAttribute('random') == 'attribute');\n})(document.createElement('div'));\n\n/* */\n\nElement.implement({\n\n\tsetProperty: function(name, value){\n\t\tvar setter = propertySetters[name.toLowerCase()];\n\t\tif (setter){\n\t\t\tsetter(this, value);\n\t\t} else {\n\t\t\t/* */\n\t\t\tif (pollutesGetAttribute) var attributeWhiteList = this.retrieve('$attributeWhiteList', {});\n\t\t\t/* */\n\n\t\t\tif (value == null){\n\t\t\t\tthis.removeAttribute(name);\n\t\t\t\t/* */\n\t\t\t\tif (pollutesGetAttribute) delete attributeWhiteList[name];\n\t\t\t\t/* */\n\t\t\t} else {\n\t\t\t\tthis.setAttribute(name, '' + value);\n\t\t\t\t/* */\n\t\t\t\tif (pollutesGetAttribute) attributeWhiteList[name] = true;\n\t\t\t\t/* */\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\tsetProperties: function(attributes){\n\t\tfor (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);\n\t\treturn this;\n\t},\n\n\tgetProperty: function(name){\n\t\tvar getter = propertyGetters[name.toLowerCase()];\n\t\tif (getter) return getter(this);\n\t\t/* */\n\t\tif (pollutesGetAttribute){\n\t\t\tvar attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {});\n\t\t\tif (!attr) return null;\n\t\t\tif (attr.expando && !attributeWhiteList[name]){\n\t\t\t\tvar outer = this.outerHTML;\n\t\t\t\t// segment by the opening tag and find mention of attribute name\n\t\t\t\tif (outer.substr(0, outer.search(/\\/?['\"]?>(?![^<]*<['\"])/)).indexOf(name) < 0) return null;\n\t\t\t\tattributeWhiteList[name] = true;\n\t\t\t}\n\t\t}\n\t\t/* */\n\t\tvar result = Slick.getAttribute(this, name);\n\t\treturn (!result && !Slick.hasAttribute(this, name)) ? null : result;\n\t},\n\n\tgetProperties: function(){\n\t\tvar args = Array.from(arguments);\n\t\treturn args.map(this.getProperty, this).associate(args);\n\t},\n\n\tremoveProperty: function(name){\n\t\treturn this.setProperty(name, null);\n\t},\n\n\tremoveProperties: function(){\n\t\tArray.each(arguments, this.removeProperty, this);\n\t\treturn this;\n\t},\n\n\tset: function(prop, value){\n\t\tvar property = Element.Properties[prop];\n\t\t(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);\n\t}.overloadSetter(),\n\n\tget: function(prop){\n\t\tvar property = Element.Properties[prop];\n\t\treturn (property && property.get) ? property.get.apply(this) : this.getProperty(prop);\n\t}.overloadGetter(),\n\n\terase: function(prop){\n\t\tvar property = Element.Properties[prop];\n\t\t(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);\n\t\treturn this;\n\t},\n\n\thasClass: function(className){\n\t\treturn this.className.clean().contains(className, ' ');\n\t},\n\n\taddClass: function(className){\n\t\tif (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();\n\t\treturn this;\n\t},\n\n\tremoveClass: function(className){\n\t\tthis.className = this.className.replace(new RegExp('(^|\\\\s)' + className + '(?:\\\\s|$)'), '$1');\n\t\treturn this;\n\t},\n\n\ttoggleClass: function(className, force){\n\t\tif (force == null) force = !this.hasClass(className);\n\t\treturn (force) ? this.addClass(className) : this.removeClass(className);\n\t},\n\n\tadopt: function(){\n\t\tvar parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;\n\t\tif (length > 1) parent = fragment = document.createDocumentFragment();\n\n\t\tfor (var i = 0; i < length; i++){\n\t\t\tvar element = document.id(elements[i], true);\n\t\t\tif (element) parent.appendChild(element);\n\t\t}\n\n\t\tif (fragment) this.appendChild(fragment);\n\n\t\treturn this;\n\t},\n\n\tappendText: function(text, where){\n\t\treturn this.grab(this.getDocument().newTextNode(text), where);\n\t},\n\n\tgrab: function(el, where){\n\t\tinserters[where || 'bottom'](document.id(el, true), this);\n\t\treturn this;\n\t},\n\n\tinject: function(el, where){\n\t\tinserters[where || 'bottom'](this, document.id(el, true));\n\t\treturn this;\n\t},\n\n\treplaces: function(el){\n\t\tel = document.id(el, true);\n\t\tel.parentNode.replaceChild(this, el);\n\t\treturn this;\n\t},\n\n\twraps: function(el, where){\n\t\tel = document.id(el, true);\n\t\treturn this.replaces(el).grab(el, where);\n\t},\n\n\tgetSelected: function(){\n\t\tthis.selectedIndex; // Safari 3.2.1\n\t\treturn new Elements(Array.from(this.options).filter(function(option){\n\t\t\treturn option.selected;\n\t\t}));\n\t},\n\n\ttoQueryString: function(){\n\t\tvar queryString = [];\n\t\tthis.getElements('input, select, textarea').each(function(el){\n\t\t\tvar type = el.type;\n\t\t\tif (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;\n\n\t\t\tvar value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){\n\t\t\t\t// IE\n\t\t\t\treturn document.id(opt).get('value');\n\t\t\t}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');\n\n\t\t\tArray.from(value).each(function(val){\n\t\t\t\tif (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));\n\t\t\t});\n\t\t});\n\t\treturn queryString.join('&');\n\t}\n\n});\n\nvar collected = {}, storage = {};\n\nvar get = function(uid){\n\treturn (storage[uid] || (storage[uid] = {}));\n};\n\nvar clean = function(item){\n\tvar uid = item.uniqueNumber;\n\tif (item.removeEvents) item.removeEvents();\n\tif (item.clearAttributes) item.clearAttributes();\n\tif (uid != null){\n\t\tdelete collected[uid];\n\t\tdelete storage[uid];\n\t}\n\treturn item;\n};\n\nvar formProps = {input: 'checked', option: 'selected', textarea: 'value'};\n\nElement.implement({\n\n\tdestroy: function(){\n\t\tvar children = clean(this).getElementsByTagName('*');\n\t\tArray.each(children, clean);\n\t\tElement.dispose(this);\n\t\treturn null;\n\t},\n\n\tempty: function(){\n\t\tArray.from(this.childNodes).each(Element.dispose);\n\t\treturn this;\n\t},\n\n\tdispose: function(){\n\t\treturn (this.parentNode) ? this.parentNode.removeChild(this) : this;\n\t},\n\n\tclone: function(contents, keepid){\n\t\tcontents = contents !== false;\n\t\tvar clone = this.cloneNode(contents), ce = [clone], te = [this], i;\n\n\t\tif (contents){\n\t\t\tce.append(Array.from(clone.getElementsByTagName('*')));\n\t\t\tte.append(Array.from(this.getElementsByTagName('*')));\n\t\t}\n\n\t\tfor (i = ce.length; i--;){\n\t\t\tvar node = ce[i], element = te[i];\n\t\t\tif (!keepid) node.removeAttribute('id');\n\t\t\t/**/\n\t\t\tif (node.clearAttributes){\n\t\t\t\tnode.clearAttributes();\n\t\t\t\tnode.mergeAttributes(element);\n\t\t\t\tnode.removeAttribute('uniqueNumber');\n\t\t\t\tif (node.options){\n\t\t\t\t\tvar no = node.options, eo = element.options;\n\t\t\t\t\tfor (var j = no.length; j--;) no[j].selected = eo[j].selected;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/**/\n\t\t\tvar prop = formProps[element.tagName.toLowerCase()];\n\t\t\tif (prop && element[prop]) node[prop] = element[prop];\n\t\t}\n\n\t\t/**/\n\t\tif (Browser.ie){\n\t\t\tvar co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');\n\t\t\tfor (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;\n\t\t}\n\t\t/**/\n\t\treturn document.id(clone);\n\t}\n\n});\n\n[Element, Window, Document].invoke('implement', {\n\n\taddListener: function(type, fn){\n\t\tif (type == 'unload'){\n\t\t\tvar old = fn, self = this;\n\t\t\tfn = function(){\n\t\t\t\tself.removeListener('unload', fn);\n\t\t\t\told();\n\t\t\t};\n\t\t} else {\n\t\t\tcollected[Slick.uidOf(this)] = this;\n\t\t}\n\t\tif (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);\n\t\telse this.attachEvent('on' + type, fn);\n\t\treturn this;\n\t},\n\n\tremoveListener: function(type, fn){\n\t\tif (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);\n\t\telse this.detachEvent('on' + type, fn);\n\t\treturn this;\n\t},\n\n\tretrieve: function(property, dflt){\n\t\tvar storage = get(Slick.uidOf(this)), prop = storage[property];\n\t\tif (dflt != null && prop == null) prop = storage[property] = dflt;\n\t\treturn prop != null ? prop : null;\n\t},\n\n\tstore: function(property, value){\n\t\tvar storage = get(Slick.uidOf(this));\n\t\tstorage[property] = value;\n\t\treturn this;\n\t},\n\n\teliminate: function(property){\n\t\tvar storage = get(Slick.uidOf(this));\n\t\tdelete storage[property];\n\t\treturn this;\n\t}\n\n});\n\n/**/\nif (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){\n\tObject.each(collected, clean);\n\tif (window.CollectGarbage) CollectGarbage();\n});\n/**/\n\nElement.Properties = {};\n\n\n\nElement.Properties.style = {\n\n\tset: function(style){\n\t\tthis.style.cssText = style;\n\t},\n\n\tget: function(){\n\t\treturn this.style.cssText;\n\t},\n\n\terase: function(){\n\t\tthis.style.cssText = '';\n\t}\n\n};\n\nElement.Properties.tag = {\n\n\tget: function(){\n\t\treturn this.tagName.toLowerCase();\n\t}\n\n};\n\nElement.Properties.html = {\n\n\tset: function(html){\n\t\tif (html == null) html = '';\n\t\telse if (typeOf(html) == 'array') html = html.join('');\n\t\tthis.innerHTML = html;\n\t},\n\n\terase: function(){\n\t\tthis.innerHTML = '';\n\t}\n\n};\n\n/**/\n// technique by jdbarlett - http://jdbartlett.com/innershiv/\nvar div = document.createElement('div');\ndiv.innerHTML = '';\nvar supportsHTML5Elements = (div.childNodes.length == 1);\nif (!supportsHTML5Elements){\n\tvar tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '),\n\t\tfragment = document.createDocumentFragment(), l = tags.length;\n\twhile (l--) fragment.createElement(tags[l]);\n}\ndiv = null;\n/**/\n\n/**/\nvar supportsTableInnerHTML = Function.attempt(function(){\n\tvar table = document.createElement('table');\n\ttable.innerHTML = '';\n\treturn true;\n});\n\n/**/\nvar tr = document.createElement('tr'), html = '';\ntr.innerHTML = html;\nvar supportsTRInnerHTML = (tr.innerHTML == html);\ntr = null;\n/**/\n\nif (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){\n\n\tElement.Properties.html.set = (function(set){\n\n\t\tvar translations = {\n\t\t\ttable: [1, '', '
'],\n\t\t\tselect: [1, ''],\n\t\t\ttbody: [2, '', '
'],\n\t\t\ttr: [3, '', '
']\n\t\t};\n\n\t\ttranslations.thead = translations.tfoot = translations.tbody;\n\n\t\treturn function(html){\n\t\t\tvar wrap = translations[this.get('tag')];\n\t\t\tif (!wrap && !supportsHTML5Elements) wrap = [0, '', ''];\n\t\t\tif (!wrap) return set.call(this, html);\n\n\t\t\tvar level = wrap[0], wrapper = document.createElement('div'), target = wrapper;\n\t\t\tif (!supportsHTML5Elements) fragment.appendChild(wrapper);\n\t\t\twrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join('');\n\t\t\twhile (level--) target = target.firstChild;\n\t\t\tthis.empty().adopt(target.childNodes);\n\t\t\tif (!supportsHTML5Elements) fragment.removeChild(wrapper);\n\t\t\twrapper = null;\n\t\t};\n\n\t})(Element.Properties.html.set);\n}\n/*
*/\n\n/**/\nvar testForm = document.createElement('form');\ntestForm.innerHTML = '';\n\nif (testForm.firstChild.value != 's') Element.Properties.value = {\n\n\tset: function(value){\n\t\tvar tag = this.get('tag');\n\t\tif (tag != 'select') return this.setProperty('value', value);\n\t\tvar options = this.getElements('option');\n\t\tfor (var i = 0; i < options.length; i++){\n\t\t\tvar option = options[i],\n\t\t\t\tattr = option.getAttributeNode('value'),\n\t\t\t\toptionValue = (attr && attr.specified) ? option.value : option.get('text');\n\t\t\tif (optionValue == value) return option.selected = true;\n\t\t}\n\t},\n\n\tget: function(){\n\t\tvar option = this, tag = option.get('tag');\n\n\t\tif (tag != 'select' && tag != 'option') return this.getProperty('value');\n\n\t\tif (tag == 'select' && !(option = option.getSelected()[0])) return '';\n\n\t\tvar attr = option.getAttributeNode('value');\n\t\treturn (attr && attr.specified) ? option.value : option.get('text');\n\t}\n\n};\ntestForm = null;\n/**/\n\n/**/\nif (document.createElement('div').getAttributeNode('id')) Element.Properties.id = {\n\tset: function(id){\n\t\tthis.id = this.getAttributeNode('id').value = id;\n\t},\n\tget: function(){\n\t\treturn this.id || null;\n\t},\n\terase: function(){\n\t\tthis.id = this.getAttributeNode('id').value = '';\n\t}\n};\n/**/\n\n})();\n\n\n/*\n---\n\nname: Element.Style\n\ndescription: Contains methods for interacting with the styles of Elements in a fashionable way.\n\nlicense: MIT-style license.\n\nrequires: Element\n\nprovides: Element.Style\n\n...\n*/\n\n(function(){\n\nvar html = document.html;\n\n//\n// Check for oldIE, which does not remove styles when they're set to null\nvar el = document.createElement('div');\nel.style.color = 'red';\nel.style.color = null;\nvar doesNotRemoveStyles = el.style.color == 'red';\nel = null;\n//\n\nElement.Properties.styles = {set: function(styles){\n\tthis.setStyles(styles);\n}};\n\nvar hasOpacity = (html.style.opacity != null),\n\thasFilter = (html.style.filter != null),\n\treAlpha = /alpha\\(opacity=([\\d.]+)\\)/i;\n\nvar setVisibility = function(element, opacity){\n\telement.store('$opacity', opacity);\n\telement.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden';\n};\n\nvar setOpacity = (hasOpacity ? function(element, opacity){\n\telement.style.opacity = opacity;\n} : (hasFilter ? function(element, opacity){\n\tvar style = element.style;\n\tif (!element.currentStyle || !element.currentStyle.hasLayout) style.zoom = 1;\n\tif (opacity == null || opacity == 1) opacity = '';\n\telse opacity = 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')';\n\tvar filter = style.filter || element.getComputedStyle('filter') || '';\n\tstyle.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity;\n\tif (!style.filter) style.removeAttribute('filter');\n} : setVisibility));\n\nvar getOpacity = (hasOpacity ? function(element){\n\tvar opacity = element.style.opacity || element.getComputedStyle('opacity');\n\treturn (opacity == '') ? 1 : opacity.toFloat();\n} : (hasFilter ? function(element){\n\tvar filter = (element.style.filter || element.getComputedStyle('filter')),\n\t\topacity;\n\tif (filter) opacity = filter.match(reAlpha);\n\treturn (opacity == null || filter == null) ? 1 : (opacity[1] / 100);\n} : function(element){\n\tvar opacity = element.retrieve('$opacity');\n\tif (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1);\n\treturn opacity;\n}));\n\nvar floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat';\n\nElement.implement({\n\n\tgetComputedStyle: function(property){\n\t\tif (this.currentStyle) return this.currentStyle[property.camelCase()];\n\t\tvar defaultView = Element.getDocument(this).defaultView,\n\t\t\tcomputed = defaultView ? defaultView.getComputedStyle(this, null) : null;\n\t\treturn (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null;\n\t},\n\n\tsetStyle: function(property, value){\n\t\tif (property == 'opacity'){\n\t\t\tif (value != null) value = parseFloat(value);\n\t\t\tsetOpacity(this, value);\n\t\t\treturn this;\n\t\t}\n\t\tproperty = (property == 'float' ? floatName : property).camelCase();\n\t\tif (typeOf(value) != 'string'){\n\t\t\tvar map = (Element.Styles[property] || '@').split(' ');\n\t\t\tvalue = Array.from(value).map(function(val, i){\n\t\t\t\tif (!map[i]) return '';\n\t\t\t\treturn (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;\n\t\t\t}).join(' ');\n\t\t} else if (value == String(Number(value))){\n\t\t\tvalue = Math.round(value);\n\t\t}\n\t\tthis.style[property] = value;\n\t\t//\n\t\tif ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){\n\t\t\tthis.style.removeAttribute(property);\n\t\t}\n\t\t//\n\t\treturn this;\n\t},\n\n\tgetStyle: function(property){\n\t\tif (property == 'opacity') return getOpacity(this);\n\t\tproperty = (property == 'float' ? floatName : property).camelCase();\n\t\tvar result = this.style[property];\n\t\tif (!result || property == 'zIndex'){\n\t\t\tresult = [];\n\t\t\tfor (var style in Element.ShortStyles){\n\t\t\t\tif (property != style) continue;\n\t\t\t\tfor (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));\n\t\t\t\treturn result.join(' ');\n\t\t\t}\n\t\t\tresult = this.getComputedStyle(property);\n\t\t}\n\t\tif (result){\n\t\t\tresult = String(result);\n\t\t\tvar color = result.match(/rgba?\\([\\d\\s,]+\\)/);\n\t\t\tif (color) result = result.replace(color[0], color[0].rgbToHex());\n\t\t}\n\t\tif (Browser.ie && isNaN(parseFloat(result))){\n\t\t\tif ((/^(height|width)$/).test(property)){\n\t\t\t\tvar values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;\n\t\t\t\tvalues.each(function(value){\n\t\t\t\t\tsize += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();\n\t\t\t\t}, this);\n\t\t\t\treturn this['offset' + property.capitalize()] - size + 'px';\n\t\t\t}\n\t\t\tif (Browser.opera && String(result).indexOf('px') != -1) return result;\n\t\t\tif ((/^border(.+)Width|margin|padding/).test(property)) return '0px';\n\t\t}\n\t\treturn result;\n\t},\n\n\tsetStyles: function(styles){\n\t\tfor (var style in styles) this.setStyle(style, styles[style]);\n\t\treturn this;\n\t},\n\n\tgetStyles: function(){\n\t\tvar result = {};\n\t\tArray.flatten(arguments).each(function(key){\n\t\t\tresult[key] = this.getStyle(key);\n\t\t}, this);\n\t\treturn result;\n\t}\n\n});\n\nElement.Styles = {\n\tleft: '@px', top: '@px', bottom: '@px', right: '@px',\n\twidth: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',\n\tbackgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',\n\tfontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',\n\tmargin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',\n\tborderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',\n\tzIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'\n};\n\n\n\n\n\nElement.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};\n\n['Top', 'Right', 'Bottom', 'Left'].each(function(direction){\n\tvar Short = Element.ShortStyles;\n\tvar All = Element.Styles;\n\t['margin', 'padding'].each(function(style){\n\t\tvar sd = style + direction;\n\t\tShort[style][sd] = All[sd] = '@px';\n\t});\n\tvar bd = 'border' + direction;\n\tShort.border[bd] = All[bd] = '@px @ rgb(@, @, @)';\n\tvar bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';\n\tShort[bd] = {};\n\tShort.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';\n\tShort.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';\n\tShort.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';\n});\n\n})();\n\n\n/*\n---\n\nname: Element.Event\n\ndescription: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary.\n\nlicense: MIT-style license.\n\nrequires: [Element, Event]\n\nprovides: Element.Event\n\n...\n*/\n\n(function(){\n\nElement.Properties.events = {set: function(events){\n\tthis.addEvents(events);\n}};\n\n[Element, Window, Document].invoke('implement', {\n\n\taddEvent: function(type, fn){\n\t\tvar events = this.retrieve('events', {});\n\t\tif (!events[type]) events[type] = {keys: [], values: []};\n\t\tif (events[type].keys.contains(fn)) return this;\n\t\tevents[type].keys.push(fn);\n\t\tvar realType = type,\n\t\t\tcustom = Element.Events[type],\n\t\t\tcondition = fn,\n\t\t\tself = this;\n\t\tif (custom){\n\t\t\tif (custom.onAdd) custom.onAdd.call(this, fn, type);\n\t\t\tif (custom.condition){\n\t\t\t\tcondition = function(event){\n\t\t\t\t\tif (custom.condition.call(this, event, type)) return fn.call(this, event);\n\t\t\t\t\treturn true;\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (custom.base) realType = Function.from(custom.base).call(this, type);\n\t\t}\n\t\tvar defn = function(){\n\t\t\treturn fn.call(self);\n\t\t};\n\t\tvar nativeEvent = Element.NativeEvents[realType];\n\t\tif (nativeEvent){\n\t\t\tif (nativeEvent == 2){\n\t\t\t\tdefn = function(event){\n\t\t\t\t\tevent = new DOMEvent(event, self.getWindow());\n\t\t\t\t\tif (condition.call(self, event) === false) event.stop();\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis.addListener(realType, defn, arguments[2]);\n\t\t}\n\t\tevents[type].values.push(defn);\n\t\treturn this;\n\t},\n\n\tremoveEvent: function(type, fn){\n\t\tvar events = this.retrieve('events');\n\t\tif (!events || !events[type]) return this;\n\t\tvar list = events[type];\n\t\tvar index = list.keys.indexOf(fn);\n\t\tif (index == -1) return this;\n\t\tvar value = list.values[index];\n\t\tdelete list.keys[index];\n\t\tdelete list.values[index];\n\t\tvar custom = Element.Events[type];\n\t\tif (custom){\n\t\t\tif (custom.onRemove) custom.onRemove.call(this, fn, type);\n\t\t\tif (custom.base) type = Function.from(custom.base).call(this, type);\n\t\t}\n\t\treturn (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;\n\t},\n\n\taddEvents: function(events){\n\t\tfor (var event in events) this.addEvent(event, events[event]);\n\t\treturn this;\n\t},\n\n\tremoveEvents: function(events){\n\t\tvar type;\n\t\tif (typeOf(events) == 'object'){\n\t\t\tfor (type in events) this.removeEvent(type, events[type]);\n\t\t\treturn this;\n\t\t}\n\t\tvar attached = this.retrieve('events');\n\t\tif (!attached) return this;\n\t\tif (!events){\n\t\t\tfor (type in attached) this.removeEvents(type);\n\t\t\tthis.eliminate('events');\n\t\t} else if (attached[events]){\n\t\t\tattached[events].keys.each(function(fn){\n\t\t\t\tthis.removeEvent(events, fn);\n\t\t\t}, this);\n\t\t\tdelete attached[events];\n\t\t}\n\t\treturn this;\n\t},\n\n\tfireEvent: function(type, args, delay){\n\t\tvar events = this.retrieve('events');\n\t\tif (!events || !events[type]) return this;\n\t\targs = Array.from(args);\n\n\t\tevents[type].keys.each(function(fn){\n\t\t\tif (delay) fn.delay(delay, this, args);\n\t\t\telse fn.apply(this, args);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tcloneEvents: function(from, type){\n\t\tfrom = document.id(from);\n\t\tvar events = from.retrieve('events');\n\t\tif (!events) return this;\n\t\tif (!type){\n\t\t\tfor (var eventType in events) this.cloneEvents(from, eventType);\n\t\t} else if (events[type]){\n\t\t\tevents[type].keys.each(function(fn){\n\t\t\t\tthis.addEvent(type, fn);\n\t\t\t}, this);\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\nElement.NativeEvents = {\n\tclick: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons\n\tmousewheel: 2, DOMMouseScroll: 2, //mouse wheel\n\tmouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement\n\tkeydown: 2, keypress: 2, keyup: 2, //keyboard\n\torientationchange: 2, // mobile\n\ttouchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch\n\tgesturestart: 2, gesturechange: 2, gestureend: 2, // gesture\n\tfocus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements\n\tload: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window\n\terror: 1, abort: 1, scroll: 1 //misc\n};\n\nElement.Events = {mousewheel: {\n\tbase: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel'\n}};\n\nif ('onmouseenter' in document.documentElement){\n\tElement.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;\n} else {\n\tvar check = function(event){\n\t\tvar related = event.relatedTarget;\n\t\tif (related == null) return true;\n\t\tif (!related) return false;\n\t\treturn (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));\n\t};\n\n\tElement.Events.mouseenter = {\n\t\tbase: 'mouseover',\n\t\tcondition: check\n\t};\n\n\tElement.Events.mouseleave = {\n\t\tbase: 'mouseout',\n\t\tcondition: check\n\t};\n}\n\n/**/\nif (!window.addEventListener){\n\tElement.NativeEvents.propertychange = 2;\n\tElement.Events.change = {\n\t\tbase: function(){\n\t\t\tvar type = this.type;\n\t\t\treturn (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change'\n\t\t},\n\t\tcondition: function(event){\n\t\t\treturn this.type != 'radio' || (event.event.propertyName == 'checked' && this.checked);\n\t\t}\n\t}\n}\n/**/\n\n\n\n})();\n\n\n/*\n---\n\nname: Element.Delegation\n\ndescription: Extends the Element native object to include the delegate method for more efficient event management.\n\nlicense: MIT-style license.\n\nrequires: [Element.Event]\n\nprovides: [Element.Delegation]\n\n...\n*/\n\n(function(){\n\nvar eventListenerSupport = !!window.addEventListener;\n\nElement.NativeEvents.focusin = Element.NativeEvents.focusout = 2;\n\nvar bubbleUp = function(self, match, fn, event, target){\n\twhile (target && target != self){\n\t\tif (match(target, event)) return fn.call(target, event, target);\n\t\ttarget = document.id(target.parentNode);\n\t}\n};\n\nvar map = {\n\tmouseenter: {\n\t\tbase: 'mouseover'\n\t},\n\tmouseleave: {\n\t\tbase: 'mouseout'\n\t},\n\tfocus: {\n\t\tbase: 'focus' + (eventListenerSupport ? '' : 'in'),\n\t\tcapture: true\n\t},\n\tblur: {\n\t\tbase: eventListenerSupport ? 'blur' : 'focusout',\n\t\tcapture: true\n\t}\n};\n\n/**/\nvar _key = '$delegation:';\nvar formObserver = function(type){\n\n\treturn {\n\n\t\tbase: 'focusin',\n\n\t\tremove: function(self, uid){\n\t\t\tvar list = self.retrieve(_key + type + 'listeners', {})[uid];\n\t\t\tif (list && list.forms) for (var i = list.forms.length; i--;){\n\t\t\t\tlist.forms[i].removeEvent(type, list.fns[i]);\n\t\t\t}\n\t\t},\n\n\t\tlisten: function(self, match, fn, event, target, uid){\n\t\t\tvar form = (target.get('tag') == 'form') ? target : event.target.getParent('form');\n\t\t\tif (!form) return;\n\n\t\t\tvar listeners = self.retrieve(_key + type + 'listeners', {}),\n\t\t\t\tlistener = listeners[uid] || {forms: [], fns: []},\n\t\t\t\tforms = listener.forms, fns = listener.fns;\n\n\t\t\tif (forms.indexOf(form) != -1) return;\n\t\t\tforms.push(form);\n\n\t\t\tvar _fn = function(event){\n\t\t\t\tbubbleUp(self, match, fn, event, target);\n\t\t\t};\n\t\t\tform.addEvent(type, _fn);\n\t\t\tfns.push(_fn);\n\n\t\t\tlisteners[uid] = listener;\n\t\t\tself.store(_key + type + 'listeners', listeners);\n\t\t}\n\t};\n};\n\nvar inputObserver = function(type){\n\treturn {\n\t\tbase: 'focusin',\n\t\tlisten: function(self, match, fn, event, target){\n\t\t\tvar events = {blur: function(){\n\t\t\t\tthis.removeEvents(events);\n\t\t\t}};\n\t\t\tevents[type] = function(event){\n\t\t\t\tbubbleUp(self, match, fn, event, target);\n\t\t\t};\n\t\t\tevent.target.addEvents(events);\n\t\t}\n\t};\n};\n\nif (!eventListenerSupport) Object.append(map, {\n\tsubmit: formObserver('submit'),\n\treset: formObserver('reset'),\n\tchange: inputObserver('change'),\n\tselect: inputObserver('select')\n});\n/**/\n\nvar proto = Element.prototype,\n\taddEvent = proto.addEvent,\n\tremoveEvent = proto.removeEvent;\n\nvar relay = function(old, method){\n\treturn function(type, fn, useCapture){\n\t\tif (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture);\n\t\tvar parsed = Slick.parse(type).expressions[0][0];\n\t\tif (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture);\n\t\tvar newType = parsed.tag;\n\t\tparsed.pseudos.slice(1).each(function(pseudo){\n\t\t\tnewType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : '');\n\t\t});\n\t\told.call(this, type, fn);\n\t\treturn method.call(this, newType, parsed.pseudos[0].value, fn);\n\t};\n};\n\nvar delegation = {\n\n\taddEvent: function(type, match, fn){\n\t\tvar storage = this.retrieve('$delegates', {}), stored = storage[type];\n\t\tif (stored) for (var _uid in stored){\n\t\t\tif (stored[_uid].fn == fn && stored[_uid].match == match) return this;\n\t\t}\n\n\t\tvar _type = type, _match = match, _fn = fn, _map = map[type] || {};\n\t\ttype = _map.base || _type;\n\n\t\tmatch = function(target){\n\t\t\treturn Slick.match(target, _match);\n\t\t};\n\n\t\tvar elementEvent = Element.Events[_type];\n\t\tif (elementEvent && elementEvent.condition){\n\t\t\tvar __match = match, condition = elementEvent.condition;\n\t\t\tmatch = function(target, event){\n\t\t\t\treturn __match(target, event) && condition.call(target, event, type);\n\t\t\t};\n\t\t}\n\n\t\tvar self = this, uid = String.uniqueID();\n\t\tvar delegator = _map.listen ? function(event, target){\n\t\t\tif (!target && event && event.target) target = event.target;\n\t\t\tif (target) _map.listen(self, match, fn, event, target, uid);\n\t\t} : function(event, target){\n\t\t\tif (!target && event && event.target) target = event.target;\n\t\t\tif (target) bubbleUp(self, match, fn, event, target);\n\t\t};\n\n\t\tif (!stored) stored = {};\n\t\tstored[uid] = {\n\t\t\tmatch: _match,\n\t\t\tfn: _fn,\n\t\t\tdelegator: delegator\n\t\t};\n\t\tstorage[_type] = stored;\n\t\treturn addEvent.call(this, type, delegator, _map.capture);\n\t},\n\n\tremoveEvent: function(type, match, fn, _uid){\n\t\tvar storage = this.retrieve('$delegates', {}), stored = storage[type];\n\t\tif (!stored) return this;\n\n\t\tif (_uid){\n\t\t\tvar _type = type, delegator = stored[_uid].delegator, _map = map[type] || {};\n\t\t\ttype = _map.base || _type;\n\t\t\tif (_map.remove) _map.remove(this, _uid);\n\t\t\tdelete stored[_uid];\n\t\t\tstorage[_type] = stored;\n\t\t\treturn removeEvent.call(this, type, delegator);\n\t\t}\n\n\t\tvar __uid, s;\n\t\tif (fn) for (__uid in stored){\n\t\t\ts = stored[__uid];\n\t\t\tif (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid);\n\t\t} else for (__uid in stored){\n\t\t\ts = stored[__uid];\n\t\t\tif (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid);\n\t\t}\n\t\treturn this;\n\t}\n\n};\n\n[Element, Window, Document].invoke('implement', {\n\taddEvent: relay(addEvent, delegation.addEvent),\n\tremoveEvent: relay(removeEvent, delegation.removeEvent)\n});\n\n})();\n\n\n/*\n---\n\nname: Element.Dimensions\n\ndescription: Contains methods to work with size, scroll, or positioning of Elements and the window object.\n\nlicense: MIT-style license.\n\ncredits:\n - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).\n - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).\n\nrequires: [Element, Element.Style]\n\nprovides: [Element.Dimensions]\n\n...\n*/\n\n(function(){\n\nvar element = document.createElement('div'),\n\tchild = document.createElement('div');\nelement.style.height = '0';\nelement.appendChild(child);\nvar brokenOffsetParent = (child.offsetParent === element);\nelement = child = null;\n\nvar isOffset = function(el){\n\treturn styleString(el, 'position') != 'static' || isBody(el);\n};\n\nvar isOffsetStatic = function(el){\n\treturn isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);\n};\n\nElement.implement({\n\n\tscrollTo: function(x, y){\n\t\tif (isBody(this)){\n\t\t\tthis.getWindow().scrollTo(x, y);\n\t\t} else {\n\t\t\tthis.scrollLeft = x;\n\t\t\tthis.scrollTop = y;\n\t\t}\n\t\treturn this;\n\t},\n\n\tgetSize: function(){\n\t\tif (isBody(this)) return this.getWindow().getSize();\n\t\treturn {x: this.offsetWidth, y: this.offsetHeight};\n\t},\n\n\tgetScrollSize: function(){\n\t\tif (isBody(this)) return this.getWindow().getScrollSize();\n\t\treturn {x: this.scrollWidth, y: this.scrollHeight};\n\t},\n\n\tgetScroll: function(){\n\t\tif (isBody(this)) return this.getWindow().getScroll();\n\t\treturn {x: this.scrollLeft, y: this.scrollTop};\n\t},\n\n\tgetScrolls: function(){\n\t\tvar element = this.parentNode, position = {x: 0, y: 0};\n\t\twhile (element && !isBody(element)){\n\t\t\tposition.x += element.scrollLeft;\n\t\t\tposition.y += element.scrollTop;\n\t\t\telement = element.parentNode;\n\t\t}\n\t\treturn position;\n\t},\n\n\tgetOffsetParent: brokenOffsetParent ? function(){\n\t\tvar element = this;\n\t\tif (isBody(element) || styleString(element, 'position') == 'fixed') return null;\n\n\t\tvar isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;\n\t\twhile ((element = element.parentNode)){\n\t\t\tif (isOffsetCheck(element)) return element;\n\t\t}\n\t\treturn null;\n\t} : function(){\n\t\tvar element = this;\n\t\tif (isBody(element) || styleString(element, 'position') == 'fixed') return null;\n\n\t\ttry {\n\t\t\treturn element.offsetParent;\n\t\t} catch(e) {}\n\t\treturn null;\n\t},\n\n\tgetOffsets: function(){\n\t\tif (this.getBoundingClientRect && !Browser.Platform.ios){\n\t\t\tvar bound = this.getBoundingClientRect(),\n\t\t\t\thtml = document.id(this.getDocument().documentElement),\n\t\t\t\thtmlScroll = html.getScroll(),\n\t\t\t\telemScrolls = this.getScrolls(),\n\t\t\t\tisFixed = (styleString(this, 'position') == 'fixed');\n\n\t\t\treturn {\n\t\t\t\tx: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,\n\t\t\t\ty: bound.top.toInt() + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop\n\t\t\t};\n\t\t}\n\n\t\tvar element = this, position = {x: 0, y: 0};\n\t\tif (isBody(this)) return position;\n\n\t\twhile (element && !isBody(element)){\n\t\t\tposition.x += element.offsetLeft;\n\t\t\tposition.y += element.offsetTop;\n\n\t\t\tif (Browser.firefox){\n\t\t\t\tif (!borderBox(element)){\n\t\t\t\t\tposition.x += leftBorder(element);\n\t\t\t\t\tposition.y += topBorder(element);\n\t\t\t\t}\n\t\t\t\tvar parent = element.parentNode;\n\t\t\t\tif (parent && styleString(parent, 'overflow') != 'visible'){\n\t\t\t\t\tposition.x += leftBorder(parent);\n\t\t\t\t\tposition.y += topBorder(parent);\n\t\t\t\t}\n\t\t\t} else if (element != this && Browser.safari){\n\t\t\t\tposition.x += leftBorder(element);\n\t\t\t\tposition.y += topBorder(element);\n\t\t\t}\n\n\t\t\telement = element.offsetParent;\n\t\t}\n\t\tif (Browser.firefox && !borderBox(this)){\n\t\t\tposition.x -= leftBorder(this);\n\t\t\tposition.y -= topBorder(this);\n\t\t}\n\t\treturn position;\n\t},\n\n\tgetPosition: function(relative){\n\t\tvar offset = this.getOffsets(),\n\t\t\tscroll = this.getScrolls();\n\t\tvar position = {\n\t\t\tx: offset.x - scroll.x,\n\t\t\ty: offset.y - scroll.y\n\t\t};\n\n\t\tif (relative && (relative = document.id(relative))){\n\t\t\tvar relativePosition = relative.getPosition();\n\t\t\treturn {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};\n\t\t}\n\t\treturn position;\n\t},\n\n\tgetCoordinates: function(element){\n\t\tif (isBody(this)) return this.getWindow().getCoordinates();\n\t\tvar position = this.getPosition(element),\n\t\t\tsize = this.getSize();\n\t\tvar obj = {\n\t\t\tleft: position.x,\n\t\t\ttop: position.y,\n\t\t\twidth: size.x,\n\t\t\theight: size.y\n\t\t};\n\t\tobj.right = obj.left + obj.width;\n\t\tobj.bottom = obj.top + obj.height;\n\t\treturn obj;\n\t},\n\n\tcomputePosition: function(obj){\n\t\treturn {\n\t\t\tleft: obj.x - styleNumber(this, 'margin-left'),\n\t\t\ttop: obj.y - styleNumber(this, 'margin-top')\n\t\t};\n\t},\n\n\tsetPosition: function(obj){\n\t\treturn this.setStyles(this.computePosition(obj));\n\t}\n\n});\n\n\n[Document, Window].invoke('implement', {\n\n\tgetSize: function(){\n\t\tvar doc = getCompatElement(this);\n\t\treturn {x: doc.clientWidth, y: doc.clientHeight};\n\t},\n\n\tgetScroll: function(){\n\t\tvar win = this.getWindow(), doc = getCompatElement(this);\n\t\treturn {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};\n\t},\n\n\tgetScrollSize: function(){\n\t\tvar doc = getCompatElement(this),\n\t\t\tmin = this.getSize(),\n\t\t\tbody = this.getDocument().body;\n\n\t\treturn {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};\n\t},\n\n\tgetPosition: function(){\n\t\treturn {x: 0, y: 0};\n\t},\n\n\tgetCoordinates: function(){\n\t\tvar size = this.getSize();\n\t\treturn {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};\n\t}\n\n});\n\n// private methods\n\nvar styleString = Element.getComputedStyle;\n\nfunction styleNumber(element, style){\n\treturn styleString(element, style).toInt() || 0;\n}\n\nfunction borderBox(element){\n\treturn styleString(element, '-moz-box-sizing') == 'border-box';\n}\n\nfunction topBorder(element){\n\treturn styleNumber(element, 'border-top-width');\n}\n\nfunction leftBorder(element){\n\treturn styleNumber(element, 'border-left-width');\n}\n\nfunction isBody(element){\n\treturn (/^(?:body|html)$/i).test(element.tagName);\n}\n\nfunction getCompatElement(element){\n\tvar doc = element.getDocument();\n\treturn (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;\n}\n\n})();\n\n//aliases\nElement.alias({position: 'setPosition'}); //compatability\n\n[Window, Document, Element].invoke('implement', {\n\n\tgetHeight: function(){\n\t\treturn this.getSize().y;\n\t},\n\n\tgetWidth: function(){\n\t\treturn this.getSize().x;\n\t},\n\n\tgetScrollTop: function(){\n\t\treturn this.getScroll().y;\n\t},\n\n\tgetScrollLeft: function(){\n\t\treturn this.getScroll().x;\n\t},\n\n\tgetScrollHeight: function(){\n\t\treturn this.getScrollSize().y;\n\t},\n\n\tgetScrollWidth: function(){\n\t\treturn this.getScrollSize().x;\n\t},\n\n\tgetTop: function(){\n\t\treturn this.getPosition().y;\n\t},\n\n\tgetLeft: function(){\n\t\treturn this.getPosition().x;\n\t}\n\n});\n\n\n/*\n---\n\nname: Fx\n\ndescription: Contains the basic animation logic to be extended by all other Fx Classes.\n\nlicense: MIT-style license.\n\nrequires: [Chain, Events, Options]\n\nprovides: Fx\n\n...\n*/\n\n(function(){\n\nvar Fx = this.Fx = new Class({\n\n\tImplements: [Chain, Events, Options],\n\n\toptions: {\n\t\t/*\n\t\tonStart: nil,\n\t\tonCancel: nil,\n\t\tonComplete: nil,\n\t\t*/\n\t\tfps: 60,\n\t\tunit: false,\n\t\tduration: 500,\n\t\tframes: null,\n\t\tframeSkip: true,\n\t\tlink: 'ignore'\n\t},\n\n\tinitialize: function(options){\n\t\tthis.subject = this.subject || this;\n\t\tthis.setOptions(options);\n\t},\n\n\tgetTransition: function(){\n\t\treturn function(p){\n\t\t\treturn -(Math.cos(Math.PI * p) - 1) / 2;\n\t\t};\n\t},\n\n\tstep: function(now){\n\t\tif (this.options.frameSkip){\n\t\t\tvar diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;\n\t\t\tthis.time = now;\n\t\t\tthis.frame += frames;\n\t\t} else {\n\t\t\tthis.frame++;\n\t\t}\n\n\t\tif (this.frame < this.frames){\n\t\t\tvar delta = this.transition(this.frame / this.frames);\n\t\t\tthis.set(this.compute(this.from, this.to, delta));\n\t\t} else {\n\t\t\tthis.frame = this.frames;\n\t\t\tthis.set(this.compute(this.from, this.to, 1));\n\t\t\tthis.stop();\n\t\t}\n\t},\n\n\tset: function(now){\n\t\treturn now;\n\t},\n\n\tcompute: function(from, to, delta){\n\t\treturn Fx.compute(from, to, delta);\n\t},\n\n\tcheck: function(){\n\t\tif (!this.isRunning()) return true;\n\t\tswitch (this.options.link){\n\t\t\tcase 'cancel': this.cancel(); return true;\n\t\t\tcase 'chain': this.chain(this.caller.pass(arguments, this)); return false;\n\t\t}\n\t\treturn false;\n\t},\n\n\tstart: function(from, to){\n\t\tif (!this.check(from, to)) return this;\n\t\tthis.from = from;\n\t\tthis.to = to;\n\t\tthis.frame = (this.options.frameSkip) ? 0 : -1;\n\t\tthis.time = null;\n\t\tthis.transition = this.getTransition();\n\t\tvar frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;\n\t\tthis.duration = Fx.Durations[duration] || duration.toInt();\n\t\tthis.frameInterval = 1000 / fps;\n\t\tthis.frames = frames || Math.round(this.duration / this.frameInterval);\n\t\tthis.fireEvent('start', this.subject);\n\t\tpushInstance.call(this, fps);\n\t\treturn this;\n\t},\n\n\tstop: function(){\n\t\tif (this.isRunning()){\n\t\t\tthis.time = null;\n\t\t\tpullInstance.call(this, this.options.fps);\n\t\t\tif (this.frames == this.frame){\n\t\t\t\tthis.fireEvent('complete', this.subject);\n\t\t\t\tif (!this.callChain()) this.fireEvent('chainComplete', this.subject);\n\t\t\t} else {\n\t\t\t\tthis.fireEvent('stop', this.subject);\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\tcancel: function(){\n\t\tif (this.isRunning()){\n\t\t\tthis.time = null;\n\t\t\tpullInstance.call(this, this.options.fps);\n\t\t\tthis.frame = this.frames;\n\t\t\tthis.fireEvent('cancel', this.subject).clearChain();\n\t\t}\n\t\treturn this;\n\t},\n\n\tpause: function(){\n\t\tif (this.isRunning()){\n\t\t\tthis.time = null;\n\t\t\tpullInstance.call(this, this.options.fps);\n\t\t}\n\t\treturn this;\n\t},\n\n\tresume: function(){\n\t\tif ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps);\n\t\treturn this;\n\t},\n\n\tisRunning: function(){\n\t\tvar list = instances[this.options.fps];\n\t\treturn list && list.contains(this);\n\t}\n\n});\n\nFx.compute = function(from, to, delta){\n\treturn (to - from) * delta + from;\n};\n\nFx.Durations = {'short': 250, 'normal': 500, 'long': 1000};\n\n// global timers\n\nvar instances = {}, timers = {};\n\nvar loop = function(){\n\tvar now = Date.now();\n\tfor (var i = this.length; i--;){\n\t\tvar instance = this[i];\n\t\tif (instance) instance.step(now);\n\t}\n};\n\nvar pushInstance = function(fps){\n\tvar list = instances[fps] || (instances[fps] = []);\n\tlist.push(this);\n\tif (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);\n};\n\nvar pullInstance = function(fps){\n\tvar list = instances[fps];\n\tif (list){\n\t\tlist.erase(this);\n\t\tif (!list.length && timers[fps]){\n\t\t\tdelete instances[fps];\n\t\t\ttimers[fps] = clearInterval(timers[fps]);\n\t\t}\n\t}\n};\n\n})();\n\n\n/*\n---\n\nname: Fx.CSS\n\ndescription: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.\n\nlicense: MIT-style license.\n\nrequires: [Fx, Element.Style]\n\nprovides: Fx.CSS\n\n...\n*/\n\nFx.CSS = new Class({\n\n\tExtends: Fx,\n\n\t//prepares the base from/to object\n\n\tprepare: function(element, property, values){\n\t\tvalues = Array.from(values);\n\t\tvar from = values[0], to = values[1];\n\t\tif (to == null){\n\t\t\tto = from;\n\t\t\tfrom = element.getStyle(property);\n\t\t\tvar unit = this.options.unit;\n\t\t\t// adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299\n\t\t\tif (unit && from.slice(-unit.length) != unit && parseFloat(from) != 0){\n\t\t\t\telement.setStyle(property, to + unit);\n\t\t\t\tvar value = element.getComputedStyle(property);\n\t\t\t\t// IE and Opera support pixelLeft or pixelWidth\n\t\t\t\tif (!(/px$/.test(value))){\n\t\t\t\t\tvalue = element.style[('pixel-' + property).camelCase()];\n\t\t\t\t\tif (value == null){\n\t\t\t\t\t\t// adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\n\t\t\t\t\t\tvar left = element.style.left;\n\t\t\t\t\t\telement.style.left = to + unit;\n\t\t\t\t\t\tvalue = element.style.pixelLeft;\n\t\t\t\t\t\telement.style.left = left;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfrom = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0);\n\t\t\t\telement.setStyle(property, from + unit);\n\t\t\t}\n\t\t}\n\t\treturn {from: this.parse(from), to: this.parse(to)};\n\t},\n\n\t//parses a value into an array\n\n\tparse: function(value){\n\t\tvalue = Function.from(value)();\n\t\tvalue = (typeof value == 'string') ? value.split(' ') : Array.from(value);\n\t\treturn value.map(function(val){\n\t\t\tval = String(val);\n\t\t\tvar found = false;\n\t\t\tObject.each(Fx.CSS.Parsers, function(parser, key){\n\t\t\t\tif (found) return;\n\t\t\t\tvar parsed = parser.parse(val);\n\t\t\t\tif (parsed || parsed === 0) found = {value: parsed, parser: parser};\n\t\t\t});\n\t\t\tfound = found || {value: val, parser: Fx.CSS.Parsers.String};\n\t\t\treturn found;\n\t\t});\n\t},\n\n\t//computes by a from and to prepared objects, using their parsers.\n\n\tcompute: function(from, to, delta){\n\t\tvar computed = [];\n\t\t(Math.min(from.length, to.length)).times(function(i){\n\t\t\tcomputed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});\n\t\t});\n\t\tcomputed.$family = Function.from('fx:css:value');\n\t\treturn computed;\n\t},\n\n\t//serves the value as settable\n\n\tserve: function(value, unit){\n\t\tif (typeOf(value) != 'fx:css:value') value = this.parse(value);\n\t\tvar returned = [];\n\t\tvalue.each(function(bit){\n\t\t\treturned = returned.concat(bit.parser.serve(bit.value, unit));\n\t\t});\n\t\treturn returned;\n\t},\n\n\t//renders the change to an element\n\n\trender: function(element, property, value, unit){\n\t\telement.setStyle(property, this.serve(value, unit));\n\t},\n\n\t//searches inside the page css to find the values for a selector\n\n\tsearch: function(selector){\n\t\tif (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];\n\t\tvar to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');\n\t\tArray.each(document.styleSheets, function(sheet, j){\n\t\t\tvar href = sheet.href;\n\t\t\tif (href && href.contains('://') && !href.contains(document.domain)) return;\n\t\t\tvar rules = sheet.rules || sheet.cssRules;\n\t\t\tArray.each(rules, function(rule, i){\n\t\t\t\tif (!rule.style) return;\n\t\t\t\tvar selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\\w+/, function(m){\n\t\t\t\t\treturn m.toLowerCase();\n\t\t\t\t}) : null;\n\t\t\t\tif (!selectorText || !selectorTest.test(selectorText)) return;\n\t\t\t\tObject.each(Element.Styles, function(value, style){\n\t\t\t\t\tif (!rule.style[style] || Element.ShortStyles[style]) return;\n\t\t\t\t\tvalue = String(rule.style[style]);\n\t\t\t\t\tto[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t\treturn Fx.CSS.Cache[selector] = to;\n\t}\n\n});\n\nFx.CSS.Cache = {};\n\nFx.CSS.Parsers = {\n\n\tColor: {\n\t\tparse: function(value){\n\t\t\tif (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);\n\t\t\treturn ((value = value.match(/(\\d+),\\s*(\\d+),\\s*(\\d+)/))) ? [value[1], value[2], value[3]] : false;\n\t\t},\n\t\tcompute: function(from, to, delta){\n\t\t\treturn from.map(function(value, i){\n\t\t\t\treturn Math.round(Fx.compute(from[i], to[i], delta));\n\t\t\t});\n\t\t},\n\t\tserve: function(value){\n\t\t\treturn value.map(Number);\n\t\t}\n\t},\n\n\tNumber: {\n\t\tparse: parseFloat,\n\t\tcompute: Fx.compute,\n\t\tserve: function(value, unit){\n\t\t\treturn (unit) ? value + unit : value;\n\t\t}\n\t},\n\n\tString: {\n\t\tparse: Function.from(false),\n\t\tcompute: function(zero, one){\n\t\t\treturn one;\n\t\t},\n\t\tserve: function(zero){\n\t\t\treturn zero;\n\t\t}\n\t}\n\n};\n\n\n\n\n/*\n---\n\nname: Fx.Tween\n\ndescription: Formerly Fx.Style, effect to transition any CSS property for an element.\n\nlicense: MIT-style license.\n\nrequires: Fx.CSS\n\nprovides: [Fx.Tween, Element.fade, Element.highlight]\n\n...\n*/\n\nFx.Tween = new Class({\n\n\tExtends: Fx.CSS,\n\n\tinitialize: function(element, options){\n\t\tthis.element = this.subject = document.id(element);\n\t\tthis.parent(options);\n\t},\n\n\tset: function(property, now){\n\t\tif (arguments.length == 1){\n\t\t\tnow = property;\n\t\t\tproperty = this.property || this.options.property;\n\t\t}\n\t\tthis.render(this.element, property, now, this.options.unit);\n\t\treturn this;\n\t},\n\n\tstart: function(property, from, to){\n\t\tif (!this.check(property, from, to)) return this;\n\t\tvar args = Array.flatten(arguments);\n\t\tthis.property = this.options.property || args.shift();\n\t\tvar parsed = this.prepare(this.element, this.property, args);\n\t\treturn this.parent(parsed.from, parsed.to);\n\t}\n\n});\n\nElement.Properties.tween = {\n\n\tset: function(options){\n\t\tthis.get('tween').cancel().setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar tween = this.retrieve('tween');\n\t\tif (!tween){\n\t\t\ttween = new Fx.Tween(this, {link: 'cancel'});\n\t\t\tthis.store('tween', tween);\n\t\t}\n\t\treturn tween;\n\t}\n\n};\n\nElement.implement({\n\n\ttween: function(property, from, to){\n\t\tthis.get('tween').start(property, from, to);\n\t\treturn this;\n\t},\n\n\tfade: function(how){\n\t\tvar fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle;\n\t\tif (args[1] == null) args[1] = 'toggle';\n\t\tswitch (args[1]){\n\t\t\tcase 'in': method = 'start'; args[1] = 1; break;\n\t\t\tcase 'out': method = 'start'; args[1] = 0; break;\n\t\t\tcase 'show': method = 'set'; args[1] = 1; break;\n\t\t\tcase 'hide': method = 'set'; args[1] = 0; break;\n\t\t\tcase 'toggle':\n\t\t\t\tvar flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1);\n\t\t\t\tmethod = 'start';\n\t\t\t\targs[1] = flag ? 0 : 1;\n\t\t\t\tthis.store('fade:flag', !flag);\n\t\t\t\ttoggle = true;\n\t\t\tbreak;\n\t\t\tdefault: method = 'start';\n\t\t}\n\t\tif (!toggle) this.eliminate('fade:flag');\n\t\tfade[method].apply(fade, args);\n\t\tvar to = args[args.length - 1];\n\t\tif (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible');\n\t\telse fade.chain(function(){\n\t\t\tthis.element.setStyle('visibility', 'hidden');\n\t\t\tthis.callChain();\n\t\t});\n\t\treturn this;\n\t},\n\n\thighlight: function(start, end){\n\t\tif (!end){\n\t\t\tend = this.retrieve('highlight:original', this.getStyle('background-color'));\n\t\t\tend = (end == 'transparent') ? '#fff' : end;\n\t\t}\n\t\tvar tween = this.get('tween');\n\t\ttween.start('background-color', start || '#ffff88', end).chain(function(){\n\t\t\tthis.setStyle('background-color', this.retrieve('highlight:original'));\n\t\t\ttween.callChain();\n\t\t}.bind(this));\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nname: Fx.Morph\n\ndescription: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.\n\nlicense: MIT-style license.\n\nrequires: Fx.CSS\n\nprovides: Fx.Morph\n\n...\n*/\n\nFx.Morph = new Class({\n\n\tExtends: Fx.CSS,\n\n\tinitialize: function(element, options){\n\t\tthis.element = this.subject = document.id(element);\n\t\tthis.parent(options);\n\t},\n\n\tset: function(now){\n\t\tif (typeof now == 'string') now = this.search(now);\n\t\tfor (var p in now) this.render(this.element, p, now[p], this.options.unit);\n\t\treturn this;\n\t},\n\n\tcompute: function(from, to, delta){\n\t\tvar now = {};\n\t\tfor (var p in from) now[p] = this.parent(from[p], to[p], delta);\n\t\treturn now;\n\t},\n\n\tstart: function(properties){\n\t\tif (!this.check(properties)) return this;\n\t\tif (typeof properties == 'string') properties = this.search(properties);\n\t\tvar from = {}, to = {};\n\t\tfor (var p in properties){\n\t\t\tvar parsed = this.prepare(this.element, p, properties[p]);\n\t\t\tfrom[p] = parsed.from;\n\t\t\tto[p] = parsed.to;\n\t\t}\n\t\treturn this.parent(from, to);\n\t}\n\n});\n\nElement.Properties.morph = {\n\n\tset: function(options){\n\t\tthis.get('morph').cancel().setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar morph = this.retrieve('morph');\n\t\tif (!morph){\n\t\t\tmorph = new Fx.Morph(this, {link: 'cancel'});\n\t\t\tthis.store('morph', morph);\n\t\t}\n\t\treturn morph;\n\t}\n\n};\n\nElement.implement({\n\n\tmorph: function(props){\n\t\tthis.get('morph').start(props);\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nname: Fx.Transitions\n\ndescription: Contains a set of advanced transitions to be used with any of the Fx Classes.\n\nlicense: MIT-style license.\n\ncredits:\n - Easing Equations by Robert Penner, , modified and optimized to be used with MooTools.\n\nrequires: Fx\n\nprovides: Fx.Transitions\n\n...\n*/\n\nFx.implement({\n\n\tgetTransition: function(){\n\t\tvar trans = this.options.transition || Fx.Transitions.Sine.easeInOut;\n\t\tif (typeof trans == 'string'){\n\t\t\tvar data = trans.split(':');\n\t\t\ttrans = Fx.Transitions;\n\t\t\ttrans = trans[data[0]] || trans[data[0].capitalize()];\n\t\t\tif (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];\n\t\t}\n\t\treturn trans;\n\t}\n\n});\n\nFx.Transition = function(transition, params){\n\tparams = Array.from(params);\n\tvar easeIn = function(pos){\n\t\treturn transition(pos, params);\n\t};\n\treturn Object.append(easeIn, {\n\t\teaseIn: easeIn,\n\t\teaseOut: function(pos){\n\t\t\treturn 1 - transition(1 - pos, params);\n\t\t},\n\t\teaseInOut: function(pos){\n\t\t\treturn (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;\n\t\t}\n\t});\n};\n\nFx.Transitions = {\n\n\tlinear: function(zero){\n\t\treturn zero;\n\t}\n\n};\n\n\n\nFx.Transitions.extend = function(transitions){\n\tfor (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);\n};\n\nFx.Transitions.extend({\n\n\tPow: function(p, x){\n\t\treturn Math.pow(p, x && x[0] || 6);\n\t},\n\n\tExpo: function(p){\n\t\treturn Math.pow(2, 8 * (p - 1));\n\t},\n\n\tCirc: function(p){\n\t\treturn 1 - Math.sin(Math.acos(p));\n\t},\n\n\tSine: function(p){\n\t\treturn 1 - Math.cos(p * Math.PI / 2);\n\t},\n\n\tBack: function(p, x){\n\t\tx = x && x[0] || 1.618;\n\t\treturn Math.pow(p, 2) * ((x + 1) * p - x);\n\t},\n\n\tBounce: function(p){\n\t\tvar value;\n\t\tfor (var a = 0, b = 1; 1; a += b, b /= 2){\n\t\t\tif (p >= (7 - 4 * a) / 11){\n\t\t\t\tvalue = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn value;\n\t},\n\n\tElastic: function(p, x){\n\t\treturn Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);\n\t}\n\n});\n\n['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){\n\tFx.Transitions[transition] = new Fx.Transition(function(p){\n\t\treturn Math.pow(p, i + 2);\n\t});\n});\n\n\n/*\n---\n\nname: Request\n\ndescription: Powerful all purpose Request Class. Uses XMLHTTPRequest.\n\nlicense: MIT-style license.\n\nrequires: [Object, Element, Chain, Events, Options, Browser]\n\nprovides: Request\n\n...\n*/\n\n(function(){\n\nvar empty = function(){},\n\tprogressSupport = ('onprogress' in new Browser.Request);\n\nvar Request = this.Request = new Class({\n\n\tImplements: [Chain, Events, Options],\n\n\toptions: {/*\n\t\tonRequest: function(){},\n\t\tonLoadstart: function(event, xhr){},\n\t\tonProgress: function(event, xhr){},\n\t\tonComplete: function(){},\n\t\tonCancel: function(){},\n\t\tonSuccess: function(responseText, responseXML){},\n\t\tonFailure: function(xhr){},\n\t\tonException: function(headerName, value){},\n\t\tonTimeout: function(){},\n\t\tuser: '',\n\t\tpassword: '',*/\n\t\turl: '',\n\t\tdata: '',\n\t\theaders: {\n\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'\n\t\t},\n\t\tasync: true,\n\t\tformat: false,\n\t\tmethod: 'post',\n\t\tlink: 'ignore',\n\t\tisSuccess: null,\n\t\temulation: true,\n\t\turlEncoded: true,\n\t\tencoding: 'utf-8',\n\t\tevalScripts: false,\n\t\tevalResponse: false,\n\t\ttimeout: 0,\n\t\tnoCache: false\n\t},\n\n\tinitialize: function(options){\n\t\tthis.xhr = new Browser.Request();\n\t\tthis.setOptions(options);\n\t\tthis.headers = this.options.headers;\n\t},\n\n\tonStateChange: function(){\n\t\tvar xhr = this.xhr;\n\t\tif (xhr.readyState != 4 || !this.running) return;\n\t\tthis.running = false;\n\t\tthis.status = 0;\n\t\tFunction.attempt(function(){\n\t\t\tvar status = xhr.status;\n\t\t\tthis.status = (status == 1223) ? 204 : status;\n\t\t}.bind(this));\n\t\txhr.onreadystatechange = empty;\n\t\tif (progressSupport) xhr.onprogress = xhr.onloadstart = empty;\n\t\tclearTimeout(this.timer);\n\n\t\tthis.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};\n\t\tif (this.options.isSuccess.call(this, this.status))\n\t\t\tthis.success(this.response.text, this.response.xml);\n\t\telse\n\t\t\tthis.failure();\n\t},\n\n\tisSuccess: function(){\n\t\tvar status = this.status;\n\t\treturn (status >= 200 && status < 300);\n\t},\n\n\tisRunning: function(){\n\t\treturn !!this.running;\n\t},\n\n\tprocessScripts: function(text){\n\t\tif (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);\n\t\treturn text.stripScripts(this.options.evalScripts);\n\t},\n\n\tsuccess: function(text, xml){\n\t\tthis.onSuccess(this.processScripts(text), xml);\n\t},\n\n\tonSuccess: function(){\n\t\tthis.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();\n\t},\n\n\tfailure: function(){\n\t\tthis.onFailure();\n\t},\n\n\tonFailure: function(){\n\t\tthis.fireEvent('complete').fireEvent('failure', this.xhr);\n\t},\n\n\tloadstart: function(event){\n\t\tthis.fireEvent('loadstart', [event, this.xhr]);\n\t},\n\n\tprogress: function(event){\n\t\tthis.fireEvent('progress', [event, this.xhr]);\n\t},\n\n\ttimeout: function(){\n\t\tthis.fireEvent('timeout', this.xhr);\n\t},\n\n\tsetHeader: function(name, value){\n\t\tthis.headers[name] = value;\n\t\treturn this;\n\t},\n\n\tgetHeader: function(name){\n\t\treturn Function.attempt(function(){\n\t\t\treturn this.xhr.getResponseHeader(name);\n\t\t}.bind(this));\n\t},\n\n\tcheck: function(){\n\t\tif (!this.running) return true;\n\t\tswitch (this.options.link){\n\t\t\tcase 'cancel': this.cancel(); return true;\n\t\t\tcase 'chain': this.chain(this.caller.pass(arguments, this)); return false;\n\t\t}\n\t\treturn false;\n\t},\n\n\tsend: function(options){\n\t\tif (!this.check(options)) return this;\n\n\t\tthis.options.isSuccess = this.options.isSuccess || this.isSuccess;\n\t\tthis.running = true;\n\n\t\tvar type = typeOf(options);\n\t\tif (type == 'string' || type == 'element') options = {data: options};\n\n\t\tvar old = this.options;\n\t\toptions = Object.append({data: old.data, url: old.url, method: old.method}, options);\n\t\tvar data = options.data, url = String(options.url), method = options.method.toLowerCase();\n\n\t\tswitch (typeOf(data)){\n\t\t\tcase 'element': data = document.id(data).toQueryString(); break;\n\t\t\tcase 'object': case 'hash': data = Object.toQueryString(data);\n\t\t}\n\n\t\tif (this.options.format){\n\t\t\tvar format = 'format=' + this.options.format;\n\t\t\tdata = (data) ? format + '&' + data : format;\n\t\t}\n\n\t\tif (this.options.emulation && !['get', 'post'].contains(method)){\n\t\t\tvar _method = '_method=' + method;\n\t\t\tdata = (data) ? _method + '&' + data : _method;\n\t\t\tmethod = 'post';\n\t\t}\n\n\t\tif (this.options.urlEncoded && ['post', 'put'].contains(method)){\n\t\t\tvar encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';\n\t\t\tthis.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;\n\t\t}\n\n\t\tif (!url) url = document.location.pathname;\n\n\t\tvar trimPosition = url.lastIndexOf('/');\n\t\tif (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);\n\n\t\tif (this.options.noCache)\n\t\t\turl += (url.contains('?') ? '&' : '?') + String.uniqueID();\n\n\t\tif (data && method == 'get'){\n\t\t\turl += (url.contains('?') ? '&' : '?') + data;\n\t\t\tdata = null;\n\t\t}\n\n\t\tvar xhr = this.xhr;\n\t\tif (progressSupport){\n\t\t\txhr.onloadstart = this.loadstart.bind(this);\n\t\t\txhr.onprogress = this.progress.bind(this);\n\t\t}\n\n\t\txhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);\n\t\tif (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;\n\n\t\txhr.onreadystatechange = this.onStateChange.bind(this);\n\n\t\tObject.each(this.headers, function(value, key){\n\t\t\ttry {\n\t\t\t\txhr.setRequestHeader(key, value);\n\t\t\t} catch (e){\n\t\t\t\tthis.fireEvent('exception', [key, value]);\n\t\t\t}\n\t\t}, this);\n\n\t\tthis.fireEvent('request');\n\t\txhr.send(data);\n\t\tif (!this.options.async) this.onStateChange();\n\t\telse if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);\n\t\treturn this;\n\t},\n\n\tcancel: function(){\n\t\tif (!this.running) return this;\n\t\tthis.running = false;\n\t\tvar xhr = this.xhr;\n\t\txhr.abort();\n\t\tclearTimeout(this.timer);\n\t\txhr.onreadystatechange = empty;\n\t\tif (progressSupport) xhr.onprogress = xhr.onloadstart = empty;\n\t\tthis.xhr = new Browser.Request();\n\t\tthis.fireEvent('cancel');\n\t\treturn this;\n\t}\n\n});\n\nvar methods = {};\n['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){\n\tmethods[method] = function(data){\n\t\tvar object = {\n\t\t\tmethod: method\n\t\t};\n\t\tif (data != null) object.data = data;\n\t\treturn this.send(object);\n\t};\n});\n\nRequest.implement(methods);\n\nElement.Properties.send = {\n\n\tset: function(options){\n\t\tvar send = this.get('send').cancel();\n\t\tsend.setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar send = this.retrieve('send');\n\t\tif (!send){\n\t\t\tsend = new Request({\n\t\t\t\tdata: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')\n\t\t\t});\n\t\t\tthis.store('send', send);\n\t\t}\n\t\treturn send;\n\t}\n\n};\n\nElement.implement({\n\n\tsend: function(url){\n\t\tvar sender = this.get('send');\n\t\tsender.send({data: this, url: url || sender.options.url});\n\t\treturn this;\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nname: Request.HTML\n\ndescription: Extends the basic Request Class with additional methods for interacting with HTML responses.\n\nlicense: MIT-style license.\n\nrequires: [Element, Request]\n\nprovides: Request.HTML\n\n...\n*/\n\nRequest.HTML = new Class({\n\n\tExtends: Request,\n\n\toptions: {\n\t\tupdate: false,\n\t\tappend: false,\n\t\tevalScripts: true,\n\t\tfilter: false,\n\t\theaders: {\n\t\t\tAccept: 'text/html, application/xml, text/xml, */*'\n\t\t}\n\t},\n\n\tsuccess: function(text){\n\t\tvar options = this.options, response = this.response;\n\n\t\tresponse.html = text.stripScripts(function(script){\n\t\t\tresponse.javascript = script;\n\t\t});\n\n\t\tvar match = response.html.match(/]*>([\\s\\S]*?)<\\/body>/i);\n\t\tif (match) response.html = match[1];\n\t\tvar temp = new Element('div').set('html', response.html);\n\n\t\tresponse.tree = temp.childNodes;\n\t\tresponse.elements = temp.getElements(options.filter || '*');\n\n\t\tif (options.filter) response.tree = response.elements;\n\t\tif (options.update){\n\t\t\tvar update = document.id(options.update).empty();\n\t\t\tif (options.filter) update.adopt(response.elements);\n\t\t\telse update.set('html', response.html);\n\t\t} else if (options.append){\n\t\t\tvar append = document.id(options.append);\n\t\t\tif (options.filter) response.elements.reverse().inject(append);\n\t\t\telse append.adopt(temp.getChildren());\n\t\t}\n\t\tif (options.evalScripts) Browser.exec(response.javascript);\n\n\t\tthis.onSuccess(response.tree, response.elements, response.html, response.javascript);\n\t}\n\n});\n\nElement.Properties.load = {\n\n\tset: function(options){\n\t\tvar load = this.get('load').cancel();\n\t\tload.setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar load = this.retrieve('load');\n\t\tif (!load){\n\t\t\tload = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});\n\t\t\tthis.store('load', load);\n\t\t}\n\t\treturn load;\n\t}\n\n};\n\nElement.implement({\n\n\tload: function(){\n\t\tthis.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nname: JSON\n\ndescription: JSON encoder and decoder.\n\nlicense: MIT-style license.\n\nSeeAlso: \n\nrequires: [Array, String, Number, Function]\n\nprovides: JSON\n\n...\n*/\n\nif (typeof JSON == 'undefined') this.JSON = {};\n\n\n\n(function(){\n\nvar special = {'\\b': '\\\\b', '\\t': '\\\\t', '\\n': '\\\\n', '\\f': '\\\\f', '\\r': '\\\\r', '\"' : '\\\\\"', '\\\\': '\\\\\\\\'};\n\nvar escape = function(chr){\n\treturn special[chr] || '\\\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);\n};\n\nJSON.validate = function(string){\n\tstring = string.replace(/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').\n\t\t\t\t\treplace(/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g, ']').\n\t\t\t\t\treplace(/(?:^|:|,)(?:\\s*\\[)+/g, '');\n\n\treturn (/^[\\],:{}\\s]*$/).test(string);\n};\n\nJSON.encode = JSON.stringify ? function(obj){\n\treturn JSON.stringify(obj);\n} : function(obj){\n\tif (obj && obj.toJSON) obj = obj.toJSON();\n\n\tswitch (typeOf(obj)){\n\t\tcase 'string':\n\t\t\treturn '\"' + obj.replace(/[\\x00-\\x1f\\\\\"]/g, escape) + '\"';\n\t\tcase 'array':\n\t\t\treturn '[' + obj.map(JSON.encode).clean() + ']';\n\t\tcase 'object': case 'hash':\n\t\t\tvar string = [];\n\t\t\tObject.each(obj, function(value, key){\n\t\t\t\tvar json = JSON.encode(value);\n\t\t\t\tif (json) string.push(JSON.encode(key) + ':' + json);\n\t\t\t});\n\t\t\treturn '{' + string + '}';\n\t\tcase 'number': case 'boolean': return '' + obj;\n\t\tcase 'null': return 'null';\n\t}\n\n\treturn null;\n};\n\nJSON.decode = function(string, secure){\n\tif (!string || typeOf(string) != 'string') return null;\n\n\tif (secure || JSON.secure){\n\t\tif (JSON.parse) return JSON.parse(string);\n\t\tif (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');\n\t}\n\n\treturn eval('(' + string + ')');\n};\n\n})();\n\n\n/*\n---\n\nname: Request.JSON\n\ndescription: Extends the basic Request Class with additional methods for sending and receiving JSON data.\n\nlicense: MIT-style license.\n\nrequires: [Request, JSON]\n\nprovides: Request.JSON\n\n...\n*/\n\nRequest.JSON = new Class({\n\n\tExtends: Request,\n\n\toptions: {\n\t\t/*onError: function(text, error){},*/\n\t\tsecure: true\n\t},\n\n\tinitialize: function(options){\n\t\tthis.parent(options);\n\t\tObject.append(this.headers, {\n\t\t\t'Accept': 'application/json',\n\t\t\t'X-Request': 'JSON'\n\t\t});\n\t},\n\n\tsuccess: function(text){\n\t\tvar json;\n\t\ttry {\n\t\t\tjson = this.response.json = JSON.decode(text, this.options.secure);\n\t\t} catch (error){\n\t\t\tthis.fireEvent('error', [text, error]);\n\t\t\treturn;\n\t\t}\n\t\tif (json == null) this.onFailure();\n\t\telse this.onSuccess(json, text);\n\t}\n\n});\n\n\n/*\n---\n\nname: Cookie\n\ndescription: Class for creating, reading, and deleting browser Cookies.\n\nlicense: MIT-style license.\n\ncredits:\n - Based on the functions by Peter-Paul Koch (http://quirksmode.org).\n\nrequires: [Options, Browser]\n\nprovides: Cookie\n\n...\n*/\n\nvar Cookie = new Class({\n\n\tImplements: Options,\n\n\toptions: {\n\t\tpath: '/',\n\t\tdomain: false,\n\t\tduration: false,\n\t\tsecure: false,\n\t\tdocument: document,\n\t\tencode: true\n\t},\n\n\tinitialize: function(key, options){\n\t\tthis.key = key;\n\t\tthis.setOptions(options);\n\t},\n\n\twrite: function(value){\n\t\tif (this.options.encode) value = encodeURIComponent(value);\n\t\tif (this.options.domain) value += '; domain=' + this.options.domain;\n\t\tif (this.options.path) value += '; path=' + this.options.path;\n\t\tif (this.options.duration){\n\t\t\tvar date = new Date();\n\t\t\tdate.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);\n\t\t\tvalue += '; expires=' + date.toGMTString();\n\t\t}\n\t\tif (this.options.secure) value += '; secure';\n\t\tthis.options.document.cookie = this.key + '=' + value;\n\t\treturn this;\n\t},\n\n\tread: function(){\n\t\tvar value = this.options.document.cookie.match('(?:^|;)\\\\s*' + this.key.escapeRegExp() + '=([^;]*)');\n\t\treturn (value) ? decodeURIComponent(value[1]) : null;\n\t},\n\n\tdispose: function(){\n\t\tnew Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');\n\t\treturn this;\n\t}\n\n});\n\nCookie.write = function(key, value, options){\n\treturn new Cookie(key, options).write(value);\n};\n\nCookie.read = function(key){\n\treturn new Cookie(key).read();\n};\n\nCookie.dispose = function(key, options){\n\treturn new Cookie(key, options).dispose();\n};\n\n\n/*\n---\n\nname: DOMReady\n\ndescription: Contains the custom event domready.\n\nlicense: MIT-style license.\n\nrequires: [Browser, Element, Element.Event]\n\nprovides: [DOMReady, DomReady]\n\n...\n*/\n\n(function(window, document){\n\nvar ready,\n\tloaded,\n\tchecks = [],\n\tshouldPoll,\n\ttimer,\n\ttestElement = document.createElement('div');\n\nvar domready = function(){\n\tclearTimeout(timer);\n\tif (ready) return;\n\tBrowser.loaded = ready = true;\n\tdocument.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);\n\n\tdocument.fireEvent('domready');\n\twindow.fireEvent('domready');\n};\n\nvar check = function(){\n\tfor (var i = checks.length; i--;) if (checks[i]()){\n\t\tdomready();\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nvar poll = function(){\n\tclearTimeout(timer);\n\tif (!check()) timer = setTimeout(poll, 10);\n};\n\ndocument.addListener('DOMContentLoaded', domready);\n\n/**/\n// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/\n// testElement.doScroll() throws when the DOM is not ready, only in the top window\nvar doScrollWorks = function(){\n\ttry {\n\t\ttestElement.doScroll();\n\t\treturn true;\n\t} catch (e){}\n\treturn false;\n};\n// If doScroll works already, it can't be used to determine domready\n// e.g. in an iframe\nif (testElement.doScroll && !doScrollWorks()){\n\tchecks.push(doScrollWorks);\n\tshouldPoll = true;\n}\n/**/\n\nif (document.readyState) checks.push(function(){\n\tvar state = document.readyState;\n\treturn (state == 'loaded' || state == 'complete');\n});\n\nif ('onreadystatechange' in document) document.addListener('readystatechange', check);\nelse shouldPoll = true;\n\nif (shouldPoll) poll();\n\nElement.Events.domready = {\n\tonAdd: function(fn){\n\t\tif (ready) fn.call(this);\n\t}\n};\n\n// Make sure that domready fires before load\nElement.Events.load = {\n\tbase: 'load',\n\tonAdd: function(fn){\n\t\tif (loaded && this == window) fn.call(this);\n\t},\n\tcondition: function(){\n\t\tif (this == window){\n\t\t\tdomready();\n\t\t\tdelete Element.Events.load;\n\t\t}\n\t\treturn true;\n\t}\n};\n\n// This is based on the custom load event\nwindow.addEvent('load', function(){\n\tloaded = true;\n});\n\n})(window, document);\n\n\n/*\n---\n\nname: Swiff\n\ndescription: Wrapper for embedding SWF movies. Supports External Interface Communication.\n\nlicense: MIT-style license.\n\ncredits:\n - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.\n\nrequires: [Options, Object, Element]\n\nprovides: Swiff\n\n...\n*/\n\n(function(){\n\nvar Swiff = this.Swiff = new Class({\n\n\tImplements: Options,\n\n\toptions: {\n\t\tid: null,\n\t\theight: 1,\n\t\twidth: 1,\n\t\tcontainer: null,\n\t\tproperties: {},\n\t\tparams: {\n\t\t\tquality: 'high',\n\t\t\tallowScriptAccess: 'always',\n\t\t\twMode: 'window',\n\t\t\tswLiveConnect: true\n\t\t},\n\t\tcallBacks: {},\n\t\tvars: {}\n\t},\n\n\ttoElement: function(){\n\t\treturn this.object;\n\t},\n\n\tinitialize: function(path, options){\n\t\tthis.instance = 'Swiff_' + String.uniqueID();\n\n\t\tthis.setOptions(options);\n\t\toptions = this.options;\n\t\tvar id = this.id = options.id || this.instance;\n\t\tvar container = document.id(options.container);\n\n\t\tSwiff.CallBacks[this.instance] = {};\n\n\t\tvar params = options.params, vars = options.vars, callBacks = options.callBacks;\n\t\tvar properties = Object.append({height: options.height, width: options.width}, options.properties);\n\n\t\tvar self = this;\n\n\t\tfor (var callBack in callBacks){\n\t\t\tSwiff.CallBacks[this.instance][callBack] = (function(option){\n\t\t\t\treturn function(){\n\t\t\t\t\treturn option.apply(self.object, arguments);\n\t\t\t\t};\n\t\t\t})(callBacks[callBack]);\n\t\t\tvars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;\n\t\t}\n\n\t\tparams.flashVars = Object.toQueryString(vars);\n\t\tif (Browser.ie){\n\t\t\tproperties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';\n\t\t\tparams.movie = path;\n\t\t} else {\n\t\t\tproperties.type = 'application/x-shockwave-flash';\n\t\t}\n\t\tproperties.data = path;\n\n\t\tvar build = '';\n\t\t}\n\t\tbuild += '';\n\t\tthis.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;\n\t},\n\n\treplaces: function(element){\n\t\telement = document.id(element, true);\n\t\telement.parentNode.replaceChild(this.toElement(), element);\n\t\treturn this;\n\t},\n\n\tinject: function(element){\n\t\tdocument.id(element, true).appendChild(this.toElement());\n\t\treturn this;\n\t},\n\n\tremote: function(){\n\t\treturn Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));\n\t}\n\n});\n\nSwiff.CallBacks = {};\n\nSwiff.remote = function(obj, fn){\n\tvar rs = obj.CallFunction('' + __flash__argumentsToXML(arguments, 2) + '');\n\treturn eval(rs);\n};\n\n})();\n\n","// MooTools: the javascript framework.\n// Load this file's selection again by visiting: http://mootools.net/more/193490474eafe3d118569348e4f6215f \n// Or build this file again with packager using: packager build More/More More/Events.Pseudos More/Class.Refactor More/Class.Binds More/Class.Occlude More/Chain.Wait More/Array.Extras More/Date More/Date.Extras More/Number.Format More/Object.Extras More/String.Extras More/String.QueryString More/URI More/URI.Relative More/Hash More/Hash.Extras More/Element.Forms More/Elements.From More/Element.Event.Pseudos More/Element.Event.Pseudos.Keys More/Element.Measure More/Element.Pin More/Element.Position More/Element.Shortcuts More/Form.Request More/Form.Request.Append More/Form.Validator More/Form.Validator.Inline More/Form.Validator.Extras More/OverText More/Fx.Elements More/Fx.Accordion More/Fx.Move More/Fx.Reveal More/Fx.Scroll More/Fx.Slide More/Fx.SmoothScroll More/Fx.Sort More/Drag More/Drag.Move More/Slider More/Sortables More/Request.JSONP More/Request.Queue More/Request.Periodical More/Color More/Group More/Hash.Cookie More/IframeShim More/Table More/HtmlTable More/HtmlTable.Zebra More/HtmlTable.Sort More/HtmlTable.Select More/Keyboard More/Keyboard.Extras More/Mask More/Spinner More/Locale More/Locale.Set.From More/Locale.en-US.Date More/Locale.en-US.Form.Validator More/Locale.en-US.Number\n/*\n---\n\nscript: More.js\n\nname: More\n\ndescription: MooTools More\n\nlicense: MIT-style license\n\nauthors:\n - Guillermo Rauch\n - Thomas Aylott\n - Scott Kyle\n - Arian Stolwijk\n - Tim Wienk\n - Christoph Pojer\n - Aaron Newton\n - Jacob Thornton\n\nrequires:\n - Core/MooTools\n\nprovides: [MooTools.More]\n\n...\n*/\n\nMooTools.More = {\n\t'version': '1.4.0.1',\n\t'build': 'a4244edf2aa97ac8a196fc96082dd35af1abab87'\n};\n\n\n/*\n---\n\nname: Events.Pseudos\n\ndescription: Adds the functionality to add pseudo events\n\nlicense: MIT-style license\n\nauthors:\n - Arian Stolwijk\n\nrequires: [Core/Class.Extras, Core/Slick.Parser, More/MooTools.More]\n\nprovides: [Events.Pseudos]\n\n...\n*/\n\n(function(){\n\nEvents.Pseudos = function(pseudos, addEvent, removeEvent){\n\n\tvar storeKey = '_monitorEvents:';\n\n\tvar storageOf = function(object){\n\t\treturn {\n\t\t\tstore: object.store ? function(key, value){\n\t\t\t\tobject.store(storeKey + key, value);\n\t\t\t} : function(key, value){\n\t\t\t\t(object._monitorEvents || (object._monitorEvents = {}))[key] = value;\n\t\t\t},\n\t\t\tretrieve: object.retrieve ? function(key, dflt){\n\t\t\t\treturn object.retrieve(storeKey + key, dflt);\n\t\t\t} : function(key, dflt){\n\t\t\t\tif (!object._monitorEvents) return dflt;\n\t\t\t\treturn object._monitorEvents[key] || dflt;\n\t\t\t}\n\t\t};\n\t};\n\n\tvar splitType = function(type){\n\t\tif (type.indexOf(':') == -1 || !pseudos) return null;\n\n\t\tvar parsed = Slick.parse(type).expressions[0][0],\n\t\t\tparsedPseudos = parsed.pseudos,\n\t\t\tl = parsedPseudos.length,\n\t\t\tsplits = [];\n\n\t\twhile (l--){\n\t\t\tvar pseudo = parsedPseudos[l].key,\n\t\t\t\tlistener = pseudos[pseudo];\n\t\t\tif (listener != null) splits.push({\n\t\t\t\tevent: parsed.tag,\n\t\t\t\tvalue: parsedPseudos[l].value,\n\t\t\t\tpseudo: pseudo,\n\t\t\t\toriginal: type,\n\t\t\t\tlistener: listener\n\t\t\t});\n\t\t}\n\t\treturn splits.length ? splits : null;\n\t};\n\n\treturn {\n\n\t\taddEvent: function(type, fn, internal){\n\t\t\tvar split = splitType(type);\n\t\t\tif (!split) return addEvent.call(this, type, fn, internal);\n\n\t\t\tvar storage = storageOf(this),\n\t\t\t\tevents = storage.retrieve(type, []),\n\t\t\t\teventType = split[0].event,\n\t\t\t\targs = Array.slice(arguments, 2),\n\t\t\t\tstack = fn,\n\t\t\t\tself = this;\n\n\t\t\tsplit.each(function(item){\n\t\t\t\tvar listener = item.listener,\n\t\t\t\t\tstackFn = stack;\n\t\t\t\tif (listener == false) eventType += ':' + item.pseudo + '(' + item.value + ')';\n\t\t\t\telse stack = function(){\n\t\t\t\t\tlistener.call(self, item, stackFn, arguments, stack);\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tevents.include({type: eventType, event: fn, monitor: stack});\n\t\t\tstorage.store(type, events);\n\n\t\t\tif (type != eventType) addEvent.apply(this, [type, fn].concat(args));\n\t\t\treturn addEvent.apply(this, [eventType, stack].concat(args));\n\t\t},\n\n\t\tremoveEvent: function(type, fn){\n\t\t\tvar split = splitType(type);\n\t\t\tif (!split) return removeEvent.call(this, type, fn);\n\n\t\t\tvar storage = storageOf(this),\n\t\t\t\tevents = storage.retrieve(type);\n\t\t\tif (!events) return this;\n\n\t\t\tvar args = Array.slice(arguments, 2);\n\n\t\t\tremoveEvent.apply(this, [type, fn].concat(args));\n\t\t\tevents.each(function(monitor, i){\n\t\t\t\tif (!fn || monitor.event == fn) removeEvent.apply(this, [monitor.type, monitor.monitor].concat(args));\n\t\t\t\tdelete events[i];\n\t\t\t}, this);\n\n\t\t\tstorage.store(type, events);\n\t\t\treturn this;\n\t\t}\n\n\t};\n\n};\n\nvar pseudos = {\n\n\tonce: function(split, fn, args, monitor){\n\t\tfn.apply(this, args);\n\t\tthis.removeEvent(split.event, monitor)\n\t\t\t.removeEvent(split.original, fn);\n\t},\n\n\tthrottle: function(split, fn, args){\n\t\tif (!fn._throttled){\n\t\t\tfn.apply(this, args);\n\t\t\tfn._throttled = setTimeout(function(){\n\t\t\t\tfn._throttled = false;\n\t\t\t}, split.value || 250);\n\t\t}\n\t},\n\n\tpause: function(split, fn, args){\n\t\tclearTimeout(fn._pause);\n\t\tfn._pause = fn.delay(split.value || 250, this, args);\n\t}\n\n};\n\nEvents.definePseudo = function(key, listener){\n\tpseudos[key] = listener;\n\treturn this;\n};\n\nEvents.lookupPseudo = function(key){\n\treturn pseudos[key];\n};\n\nvar proto = Events.prototype;\nEvents.implement(Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));\n\n['Request', 'Fx'].each(function(klass){\n\tif (this[klass]) this[klass].implement(Events.prototype);\n});\n\n})();\n\n\n/*\n---\n\nscript: Class.Refactor.js\n\nname: Class.Refactor\n\ndescription: Extends a class onto itself with new property, preserving any items attached to the class's namespace.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Class\n - /MooTools.More\n\n# Some modules declare themselves dependent on Class.Refactor\nprovides: [Class.refactor, Class.Refactor]\n\n...\n*/\n\nClass.refactor = function(original, refactors){\n\n\tObject.each(refactors, function(item, name){\n\t\tvar origin = original.prototype[name];\n\t\torigin = (origin && origin.$origin) || origin || function(){};\n\t\toriginal.implement(name, (typeof item == 'function') ? function(){\n\t\t\tvar old = this.previous;\n\t\t\tthis.previous = origin;\n\t\t\tvar value = item.apply(this, arguments);\n\t\t\tthis.previous = old;\n\t\t\treturn value;\n\t\t} : item);\n\t});\n\n\treturn original;\n\n};\n\n\n/*\n---\n\nscript: Class.Binds.js\n\nname: Class.Binds\n\ndescription: Automagically binds specified methods in a class to the instance of the class.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Class\n - /MooTools.More\n\nprovides: [Class.Binds]\n\n...\n*/\n\nClass.Mutators.Binds = function(binds){\n\tif (!this.prototype.initialize) this.implement('initialize', function(){});\n\treturn Array.from(binds).concat(this.prototype.Binds || []);\n};\n\nClass.Mutators.initialize = function(initialize){\n\treturn function(){\n\t\tArray.from(this.Binds).each(function(name){\n\t\t\tvar original = this[name];\n\t\t\tif (original) this[name] = original.bind(this);\n\t\t}, this);\n\t\treturn initialize.apply(this, arguments);\n\t};\n};\n\n\n/*\n---\n\nscript: Class.Occlude.js\n\nname: Class.Occlude\n\ndescription: Prevents a class from being applied to a DOM element twice.\n\nlicense: MIT-style license.\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Class\n - Core/Element\n - /MooTools.More\n\nprovides: [Class.Occlude]\n\n...\n*/\n\nClass.Occlude = new Class({\n\n\tocclude: function(property, element){\n\t\telement = document.id(element || this.element);\n\t\tvar instance = element.retrieve(property || this.property);\n\t\tif (instance && !this.occluded)\n\t\t\treturn (this.occluded = instance);\n\n\t\tthis.occluded = false;\n\t\telement.store(property || this.property, this);\n\t\treturn this.occluded;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Chain.Wait.js\n\nname: Chain.Wait\n\ndescription: value, Adds a method to inject pauses between chained events.\n\nlicense: MIT-style license.\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Chain\n - Core/Element\n - Core/Fx\n - /MooTools.More\n\nprovides: [Chain.Wait]\n\n...\n*/\n\n(function(){\n\n\tvar wait = {\n\t\twait: function(duration){\n\t\t\treturn this.chain(function(){\n\t\t\t\tthis.callChain.delay(duration == null ? 500 : duration, this);\n\t\t\t\treturn this;\n\t\t\t}.bind(this));\n\t\t}\n\t};\n\n\tChain.implement(wait);\n\n\tif (this.Fx) Fx.implement(wait);\n\n\tif (this.Element && Element.implement && this.Fx){\n\t\tElement.implement({\n\n\t\t\tchains: function(effects){\n\t\t\t\tArray.from(effects || ['tween', 'morph', 'reveal']).each(function(effect){\n\t\t\t\t\teffect = this.get(effect);\n\t\t\t\t\tif (!effect) return;\n\t\t\t\t\teffect.setOptions({\n\t\t\t\t\t\tlink:'chain'\n\t\t\t\t\t});\n\t\t\t\t}, this);\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\tpauseFx: function(duration, effect){\n\t\t\t\tthis.chains(effect).get(effect || 'tween').wait(duration);\n\t\t\t\treturn this;\n\t\t\t}\n\n\t\t});\n\t}\n\n})();\n\n\n/*\n---\n\nscript: Array.Extras.js\n\nname: Array.Extras\n\ndescription: Extends the Array native object to include useful methods to work with arrays.\n\nlicense: MIT-style license\n\nauthors:\n - Christoph Pojer\n - Sebastian Markbåge\n\nrequires:\n - Core/Array\n - MooTools.More\n\nprovides: [Array.Extras]\n\n...\n*/\n\n(function(nil){\n\nArray.implement({\n\n\tmin: function(){\n\t\treturn Math.min.apply(null, this);\n\t},\n\n\tmax: function(){\n\t\treturn Math.max.apply(null, this);\n\t},\n\n\taverage: function(){\n\t\treturn this.length ? this.sum() / this.length : 0;\n\t},\n\n\tsum: function(){\n\t\tvar result = 0, l = this.length;\n\t\tif (l){\n\t\t\twhile (l--) result += this[l];\n\t\t}\n\t\treturn result;\n\t},\n\n\tunique: function(){\n\t\treturn [].combine(this);\n\t},\n\n\tshuffle: function(){\n\t\tfor (var i = this.length; i && --i;){\n\t\t\tvar temp = this[i], r = Math.floor(Math.random() * ( i + 1 ));\n\t\t\tthis[i] = this[r];\n\t\t\tthis[r] = temp;\n\t\t}\n\t\treturn this;\n\t},\n\n\treduce: function(fn, value){\n\t\tfor (var i = 0, l = this.length; i < l; i++){\n\t\t\tif (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);\n\t\t}\n\t\treturn value;\n\t},\n\n\treduceRight: function(fn, value){\n\t\tvar i = this.length;\n\t\twhile (i--){\n\t\t\tif (i in this) value = value === nil ? this[i] : fn.call(null, value, this[i], i, this);\n\t\t}\n\t\treturn value;\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nscript: Object.Extras.js\n\nname: Object.Extras\n\ndescription: Extra Object generics, like getFromPath which allows a path notation to child elements.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Object\n - /MooTools.More\n\nprovides: [Object.Extras]\n\n...\n*/\n\n(function(){\n\nvar defined = function(value){\n\treturn value != null;\n};\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nObject.extend({\n\n\tgetFromPath: function(source, parts){\n\t\tif (typeof parts == 'string') parts = parts.split('.');\n\t\tfor (var i = 0, l = parts.length; i < l; i++){\n\t\t\tif (hasOwnProperty.call(source, parts[i])) source = source[parts[i]];\n\t\t\telse return null;\n\t\t}\n\t\treturn source;\n\t},\n\n\tcleanValues: function(object, method){\n\t\tmethod = method || defined;\n\t\tfor (var key in object) if (!method(object[key])){\n\t\t\tdelete object[key];\n\t\t}\n\t\treturn object;\n\t},\n\n\terase: function(object, key){\n\t\tif (hasOwnProperty.call(object, key)) delete object[key];\n\t\treturn object;\n\t},\n\n\trun: function(object){\n\t\tvar args = Array.slice(arguments, 1);\n\t\tfor (var key in object) if (object[key].apply){\n\t\t\tobject[key].apply(object, args);\n\t\t}\n\t\treturn object;\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nscript: Locale.js\n\nname: Locale\n\ndescription: Provides methods for localization.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n - Arian Stolwijk\n\nrequires:\n - Core/Events\n - /Object.Extras\n - /MooTools.More\n\nprovides: [Locale, Lang]\n\n...\n*/\n\n(function(){\n\nvar current = null,\n\tlocales = {},\n\tinherits = {};\n\nvar getSet = function(set){\n\tif (instanceOf(set, Locale.Set)) return set;\n\telse return locales[set];\n};\n\nvar Locale = this.Locale = {\n\n\tdefine: function(locale, set, key, value){\n\t\tvar name;\n\t\tif (instanceOf(locale, Locale.Set)){\n\t\t\tname = locale.name;\n\t\t\tif (name) locales[name] = locale;\n\t\t} else {\n\t\t\tname = locale;\n\t\t\tif (!locales[name]) locales[name] = new Locale.Set(name);\n\t\t\tlocale = locales[name];\n\t\t}\n\n\t\tif (set) locale.define(set, key, value);\n\n\t\t\n\n\t\tif (!current) current = locale;\n\n\t\treturn locale;\n\t},\n\n\tuse: function(locale){\n\t\tlocale = getSet(locale);\n\n\t\tif (locale){\n\t\t\tcurrent = locale;\n\n\t\t\tthis.fireEvent('change', locale);\n\n\t\t\t\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tgetCurrent: function(){\n\t\treturn current;\n\t},\n\n\tget: function(key, args){\n\t\treturn (current) ? current.get(key, args) : '';\n\t},\n\n\tinherit: function(locale, inherits, set){\n\t\tlocale = getSet(locale);\n\n\t\tif (locale) locale.inherit(inherits, set);\n\t\treturn this;\n\t},\n\n\tlist: function(){\n\t\treturn Object.keys(locales);\n\t}\n\n};\n\nObject.append(Locale, new Events);\n\nLocale.Set = new Class({\n\n\tsets: {},\n\n\tinherits: {\n\t\tlocales: [],\n\t\tsets: {}\n\t},\n\n\tinitialize: function(name){\n\t\tthis.name = name || '';\n\t},\n\n\tdefine: function(set, key, value){\n\t\tvar defineData = this.sets[set];\n\t\tif (!defineData) defineData = {};\n\n\t\tif (key){\n\t\t\tif (typeOf(key) == 'object') defineData = Object.merge(defineData, key);\n\t\t\telse defineData[key] = value;\n\t\t}\n\t\tthis.sets[set] = defineData;\n\n\t\treturn this;\n\t},\n\n\tget: function(key, args, _base){\n\t\tvar value = Object.getFromPath(this.sets, key);\n\t\tif (value != null){\n\t\t\tvar type = typeOf(value);\n\t\t\tif (type == 'function') value = value.apply(null, Array.from(args));\n\t\t\telse if (type == 'object') value = Object.clone(value);\n\t\t\treturn value;\n\t\t}\n\n\t\t// get value of inherited locales\n\t\tvar index = key.indexOf('.'),\n\t\t\tset = index < 0 ? key : key.substr(0, index),\n\t\t\tnames = (this.inherits.sets[set] || []).combine(this.inherits.locales).include('en-US');\n\t\tif (!_base) _base = [];\n\n\t\tfor (var i = 0, l = names.length; i < l; i++){\n\t\t\tif (_base.contains(names[i])) continue;\n\t\t\t_base.include(names[i]);\n\n\t\t\tvar locale = locales[names[i]];\n\t\t\tif (!locale) continue;\n\n\t\t\tvalue = locale.get(key, args, _base);\n\t\t\tif (value != null) return value;\n\t\t}\n\n\t\treturn '';\n\t},\n\n\tinherit: function(names, set){\n\t\tnames = Array.from(names);\n\n\t\tif (set && !this.inherits.sets[set]) this.inherits.sets[set] = [];\n\n\t\tvar l = names.length;\n\t\twhile (l--) (set ? this.inherits.sets[set] : this.inherits.locales).unshift(names[l]);\n\n\t\treturn this;\n\t}\n\n});\n\n\n\n})();\n\n\n/*\n---\n\nname: Locale.en-US.Date\n\ndescription: Date messages for US English.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - /Locale\n\nprovides: [Locale.en-US.Date]\n\n...\n*/\n\nLocale.define('en-US', 'Date', {\n\n\tmonths: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n\tmonths_abbr: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n\tdays: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n\tdays_abbr: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n\n\t// Culture's date order: MM/DD/YYYY\n\tdateOrder: ['month', 'date', 'year'],\n\tshortDate: '%m/%d/%Y',\n\tshortTime: '%I:%M%p',\n\tAM: 'AM',\n\tPM: 'PM',\n\tfirstDayOfWeek: 0,\n\n\t// Date.Extras\n\tordinal: function(dayOfMonth){\n\t\t// 1st, 2nd, 3rd, etc.\n\t\treturn (dayOfMonth > 3 && dayOfMonth < 21) ? 'th' : ['th', 'st', 'nd', 'rd', 'th'][Math.min(dayOfMonth % 10, 4)];\n\t},\n\n\tlessThanMinuteAgo: 'less than a minute ago',\n\tminuteAgo: 'about a minute ago',\n\tminutesAgo: '{delta} minutes ago',\n\thourAgo: 'about an hour ago',\n\thoursAgo: 'about {delta} hours ago',\n\tdayAgo: '1 day ago',\n\tdaysAgo: '{delta} days ago',\n\tweekAgo: '1 week ago',\n\tweeksAgo: '{delta} weeks ago',\n\tmonthAgo: '1 month ago',\n\tmonthsAgo: '{delta} months ago',\n\tyearAgo: '1 year ago',\n\tyearsAgo: '{delta} years ago',\n\n\tlessThanMinuteUntil: 'less than a minute from now',\n\tminuteUntil: 'about a minute from now',\n\tminutesUntil: '{delta} minutes from now',\n\thourUntil: 'about an hour from now',\n\thoursUntil: 'about {delta} hours from now',\n\tdayUntil: '1 day from now',\n\tdaysUntil: '{delta} days from now',\n\tweekUntil: '1 week from now',\n\tweeksUntil: '{delta} weeks from now',\n\tmonthUntil: '1 month from now',\n\tmonthsUntil: '{delta} months from now',\n\tyearUntil: '1 year from now',\n\tyearsUntil: '{delta} years from now'\n\n});\n\n\n/*\n---\n\nscript: Date.js\n\nname: Date\n\ndescription: Extends the Date native object to include methods useful in managing dates.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n - Nicholas Barthelemy - https://svn.nbarthelemy.com/date-js/\n - Harald Kirshner - mail [at] digitarald.de; http://digitarald.de\n - Scott Kyle - scott [at] appden.com; http://appden.com\n\nrequires:\n - Core/Array\n - Core/String\n - Core/Number\n - MooTools.More\n - Locale\n - Locale.en-US.Date\n\nprovides: [Date]\n\n...\n*/\n\n(function(){\n\nvar Date = this.Date;\n\nvar DateMethods = Date.Methods = {\n\tms: 'Milliseconds',\n\tyear: 'FullYear',\n\tmin: 'Minutes',\n\tmo: 'Month',\n\tsec: 'Seconds',\n\thr: 'Hours'\n};\n\n['Date', 'Day', 'FullYear', 'Hours', 'Milliseconds', 'Minutes', 'Month', 'Seconds', 'Time', 'TimezoneOffset',\n\t'Week', 'Timezone', 'GMTOffset', 'DayOfYear', 'LastMonth', 'LastDayOfMonth', 'UTCDate', 'UTCDay', 'UTCFullYear',\n\t'AMPM', 'Ordinal', 'UTCHours', 'UTCMilliseconds', 'UTCMinutes', 'UTCMonth', 'UTCSeconds', 'UTCMilliseconds'].each(function(method){\n\tDate.Methods[method.toLowerCase()] = method;\n});\n\nvar pad = function(n, digits, string){\n\tif (digits == 1) return n;\n\treturn n < Math.pow(10, digits - 1) ? (string || '0') + pad(n, digits - 1, string) : n;\n};\n\nDate.implement({\n\n\tset: function(prop, value){\n\t\tprop = prop.toLowerCase();\n\t\tvar method = DateMethods[prop] && 'set' + DateMethods[prop];\n\t\tif (method && this[method]) this[method](value);\n\t\treturn this;\n\t}.overloadSetter(),\n\n\tget: function(prop){\n\t\tprop = prop.toLowerCase();\n\t\tvar method = DateMethods[prop] && 'get' + DateMethods[prop];\n\t\tif (method && this[method]) return this[method]();\n\t\treturn null;\n\t}.overloadGetter(),\n\n\tclone: function(){\n\t\treturn new Date(this.get('time'));\n\t},\n\n\tincrement: function(interval, times){\n\t\tinterval = interval || 'day';\n\t\ttimes = times != null ? times : 1;\n\n\t\tswitch (interval){\n\t\t\tcase 'year':\n\t\t\t\treturn this.increment('month', times * 12);\n\t\t\tcase 'month':\n\t\t\t\tvar d = this.get('date');\n\t\t\t\tthis.set('date', 1).set('mo', this.get('mo') + times);\n\t\t\t\treturn this.set('date', d.min(this.get('lastdayofmonth')));\n\t\t\tcase 'week':\n\t\t\t\treturn this.increment('day', times * 7);\n\t\t\tcase 'day':\n\t\t\t\treturn this.set('date', this.get('date') + times);\n\t\t}\n\n\t\tif (!Date.units[interval]) throw new Error(interval + ' is not a supported interval');\n\n\t\treturn this.set('time', this.get('time') + times * Date.units[interval]());\n\t},\n\n\tdecrement: function(interval, times){\n\t\treturn this.increment(interval, -1 * (times != null ? times : 1));\n\t},\n\n\tisLeapYear: function(){\n\t\treturn Date.isLeapYear(this.get('year'));\n\t},\n\n\tclearTime: function(){\n\t\treturn this.set({hr: 0, min: 0, sec: 0, ms: 0});\n\t},\n\n\tdiff: function(date, resolution){\n\t\tif (typeOf(date) == 'string') date = Date.parse(date);\n\n\t\treturn ((date - this) / Date.units[resolution || 'day'](3, 3)).round(); // non-leap year, 30-day month\n\t},\n\n\tgetLastDayOfMonth: function(){\n\t\treturn Date.daysInMonth(this.get('mo'), this.get('year'));\n\t},\n\n\tgetDayOfYear: function(){\n\t\treturn (Date.UTC(this.get('year'), this.get('mo'), this.get('date') + 1)\n\t\t\t- Date.UTC(this.get('year'), 0, 1)) / Date.units.day();\n\t},\n\n\tsetDay: function(day, firstDayOfWeek){\n\t\tif (firstDayOfWeek == null){\n\t\t\tfirstDayOfWeek = Date.getMsg('firstDayOfWeek');\n\t\t\tif (firstDayOfWeek === '') firstDayOfWeek = 1;\n\t\t}\n\n\t\tday = (7 + Date.parseDay(day, true) - firstDayOfWeek) % 7;\n\t\tvar currentDay = (7 + this.get('day') - firstDayOfWeek) % 7;\n\n\t\treturn this.increment('day', day - currentDay);\n\t},\n\n\tgetWeek: function(firstDayOfWeek){\n\t\tif (firstDayOfWeek == null){\n\t\t\tfirstDayOfWeek = Date.getMsg('firstDayOfWeek');\n\t\t\tif (firstDayOfWeek === '') firstDayOfWeek = 1;\n\t\t}\n\n\t\tvar date = this,\n\t\t\tdayOfWeek = (7 + date.get('day') - firstDayOfWeek) % 7,\n\t\t\tdividend = 0,\n\t\t\tfirstDayOfYear;\n\n\t\tif (firstDayOfWeek == 1){\n\t\t\t// ISO-8601, week belongs to year that has the most days of the week (i.e. has the thursday of the week)\n\t\t\tvar month = date.get('month'),\n\t\t\t\tstartOfWeek = date.get('date') - dayOfWeek;\n\n\t\t\tif (month == 11 && startOfWeek > 28) return 1; // Week 1 of next year\n\n\t\t\tif (month == 0 && startOfWeek < -2){\n\t\t\t\t// Use a date from last year to determine the week\n\t\t\t\tdate = new Date(date).decrement('day', dayOfWeek);\n\t\t\t\tdayOfWeek = 0;\n\t\t\t}\n\n\t\t\tfirstDayOfYear = new Date(date.get('year'), 0, 1).get('day') || 7;\n\t\t\tif (firstDayOfYear > 4) dividend = -7; // First week of the year is not week 1\n\t\t} else {\n\t\t\t// In other cultures the first week of the year is always week 1 and the last week always 53 or 54.\n\t\t\t// Days in the same week can have a different weeknumber if the week spreads across two years.\n\t\t\tfirstDayOfYear = new Date(date.get('year'), 0, 1).get('day');\n\t\t}\n\n\t\tdividend += date.get('dayofyear');\n\t\tdividend += 6 - dayOfWeek; // Add days so we calculate the current date's week as a full week\n\t\tdividend += (7 + firstDayOfYear - firstDayOfWeek) % 7; // Make up for first week of the year not being a full week\n\n\t\treturn (dividend / 7);\n\t},\n\n\tgetOrdinal: function(day){\n\t\treturn Date.getMsg('ordinal', day || this.get('date'));\n\t},\n\n\tgetTimezone: function(){\n\t\treturn this.toString()\n\t\t\t.replace(/^.*? ([A-Z]{3}).[0-9]{4}.*$/, '$1')\n\t\t\t.replace(/^.*?\\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\\)$/, '$1$2$3');\n\t},\n\n\tgetGMTOffset: function(){\n\t\tvar off = this.get('timezoneOffset');\n\t\treturn ((off > 0) ? '-' : '+') + pad((off.abs() / 60).floor(), 2) + pad(off % 60, 2);\n\t},\n\n\tsetAMPM: function(ampm){\n\t\tampm = ampm.toUpperCase();\n\t\tvar hr = this.get('hr');\n\t\tif (hr > 11 && ampm == 'AM') return this.decrement('hour', 12);\n\t\telse if (hr < 12 && ampm == 'PM') return this.increment('hour', 12);\n\t\treturn this;\n\t},\n\n\tgetAMPM: function(){\n\t\treturn (this.get('hr') < 12) ? 'AM' : 'PM';\n\t},\n\n\tparse: function(str){\n\t\tthis.set('time', Date.parse(str));\n\t\treturn this;\n\t},\n\n\tisValid: function(date){\n\t\tif (!date) date = this;\n\t\treturn typeOf(date) == 'date' && !isNaN(date.valueOf());\n\t},\n\n\tformat: function(format){\n\t\tif (!this.isValid()) return 'invalid date';\n\n\t\tif (!format) format = '%x %X';\n\t\tif (typeof format == 'string') format = formats[format.toLowerCase()] || format;\n\t\tif (typeof format == 'function') return format(this);\n\n\t\tvar d = this;\n\t\treturn format.replace(/%([a-z%])/gi,\n\t\t\tfunction($0, $1){\n\t\t\t\tswitch ($1){\n\t\t\t\t\tcase 'a': return Date.getMsg('days_abbr')[d.get('day')];\n\t\t\t\t\tcase 'A': return Date.getMsg('days')[d.get('day')];\n\t\t\t\t\tcase 'b': return Date.getMsg('months_abbr')[d.get('month')];\n\t\t\t\t\tcase 'B': return Date.getMsg('months')[d.get('month')];\n\t\t\t\t\tcase 'c': return d.format('%a %b %d %H:%M:%S %Y');\n\t\t\t\t\tcase 'd': return pad(d.get('date'), 2);\n\t\t\t\t\tcase 'e': return pad(d.get('date'), 2, ' ');\n\t\t\t\t\tcase 'H': return pad(d.get('hr'), 2);\n\t\t\t\t\tcase 'I': return pad((d.get('hr') % 12) || 12, 2);\n\t\t\t\t\tcase 'j': return pad(d.get('dayofyear'), 3);\n\t\t\t\t\tcase 'k': return pad(d.get('hr'), 2, ' ');\n\t\t\t\t\tcase 'l': return pad((d.get('hr') % 12) || 12, 2, ' ');\n\t\t\t\t\tcase 'L': return pad(d.get('ms'), 3);\n\t\t\t\t\tcase 'm': return pad((d.get('mo') + 1), 2);\n\t\t\t\t\tcase 'M': return pad(d.get('min'), 2);\n\t\t\t\t\tcase 'o': return d.get('ordinal');\n\t\t\t\t\tcase 'p': return Date.getMsg(d.get('ampm'));\n\t\t\t\t\tcase 's': return Math.round(d / 1000);\n\t\t\t\t\tcase 'S': return pad(d.get('seconds'), 2);\n\t\t\t\t\tcase 'T': return d.format('%H:%M:%S');\n\t\t\t\t\tcase 'U': return pad(d.get('week'), 2);\n\t\t\t\t\tcase 'w': return d.get('day');\n\t\t\t\t\tcase 'x': return d.format(Date.getMsg('shortDate'));\n\t\t\t\t\tcase 'X': return d.format(Date.getMsg('shortTime'));\n\t\t\t\t\tcase 'y': return d.get('year').toString().substr(2);\n\t\t\t\t\tcase 'Y': return d.get('year');\n\t\t\t\t\tcase 'z': return d.get('GMTOffset');\n\t\t\t\t\tcase 'Z': return d.get('Timezone');\n\t\t\t\t}\n\t\t\t\treturn $1;\n\t\t\t}\n\t\t);\n\t},\n\n\ttoISOString: function(){\n\t\treturn this.format('iso8601');\n\t}\n\n}).alias({\n\ttoJSON: 'toISOString',\n\tcompare: 'diff',\n\tstrftime: 'format'\n});\n\n// The day and month abbreviations are standardized, so we cannot use simply %a and %b because they will get localized\nvar rfcDayAbbr = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n\trfcMonthAbbr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nvar formats = {\n\tdb: '%Y-%m-%d %H:%M:%S',\n\tcompact: '%Y%m%dT%H%M%S',\n\t'short': '%d %b %H:%M',\n\t'long': '%B %d, %Y %H:%M',\n\trfc822: function(date){\n\t\treturn rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %Z');\n\t},\n\trfc2822: function(date){\n\t\treturn rfcDayAbbr[date.get('day')] + date.format(', %d ') + rfcMonthAbbr[date.get('month')] + date.format(' %Y %H:%M:%S %z');\n\t},\n\tiso8601: function(date){\n\t\treturn (\n\t\t\tdate.getUTCFullYear() + '-' +\n\t\t\tpad(date.getUTCMonth() + 1, 2) + '-' +\n\t\t\tpad(date.getUTCDate(), 2) + 'T' +\n\t\t\tpad(date.getUTCHours(), 2) + ':' +\n\t\t\tpad(date.getUTCMinutes(), 2) + ':' +\n\t\t\tpad(date.getUTCSeconds(), 2) + '.' +\n\t\t\tpad(date.getUTCMilliseconds(), 3) + 'Z'\n\t\t);\n\t}\n};\n\nvar parsePatterns = [],\n\tnativeParse = Date.parse;\n\nvar parseWord = function(type, word, num){\n\tvar ret = -1,\n\t\ttranslated = Date.getMsg(type + 's');\n\tswitch (typeOf(word)){\n\t\tcase 'object':\n\t\t\tret = translated[word.get(type)];\n\t\t\tbreak;\n\t\tcase 'number':\n\t\t\tret = translated[word];\n\t\t\tif (!ret) throw new Error('Invalid ' + type + ' index: ' + word);\n\t\t\tbreak;\n\t\tcase 'string':\n\t\t\tvar match = translated.filter(function(name){\n\t\t\t\treturn this.test(name);\n\t\t\t}, new RegExp('^' + word, 'i'));\n\t\t\tif (!match.length) throw new Error('Invalid ' + type + ' string');\n\t\t\tif (match.length > 1) throw new Error('Ambiguous ' + type);\n\t\t\tret = match[0];\n\t}\n\n\treturn (num) ? translated.indexOf(ret) : ret;\n};\n\nvar startCentury = 1900,\n\tstartYear = 70;\n\nDate.extend({\n\n\tgetMsg: function(key, args){\n\t\treturn Locale.get('Date.' + key, args);\n\t},\n\n\tunits: {\n\t\tms: Function.from(1),\n\t\tsecond: Function.from(1000),\n\t\tminute: Function.from(60000),\n\t\thour: Function.from(3600000),\n\t\tday: Function.from(86400000),\n\t\tweek: Function.from(608400000),\n\t\tmonth: function(month, year){\n\t\t\tvar d = new Date;\n\t\t\treturn Date.daysInMonth(month != null ? month : d.get('mo'), year != null ? year : d.get('year')) * 86400000;\n\t\t},\n\t\tyear: function(year){\n\t\t\tyear = year || new Date().get('year');\n\t\t\treturn Date.isLeapYear(year) ? 31622400000 : 31536000000;\n\t\t}\n\t},\n\n\tdaysInMonth: function(month, year){\n\t\treturn [31, Date.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n\t},\n\n\tisLeapYear: function(year){\n\t\treturn ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);\n\t},\n\n\tparse: function(from){\n\t\tvar t = typeOf(from);\n\t\tif (t == 'number') return new Date(from);\n\t\tif (t != 'string') return from;\n\t\tfrom = from.clean();\n\t\tif (!from.length) return null;\n\n\t\tvar parsed;\n\t\tparsePatterns.some(function(pattern){\n\t\t\tvar bits = pattern.re.exec(from);\n\t\t\treturn (bits) ? (parsed = pattern.handler(bits)) : false;\n\t\t});\n\n\t\tif (!(parsed && parsed.isValid())){\n\t\t\tparsed = new Date(nativeParse(from));\n\t\t\tif (!(parsed && parsed.isValid())) parsed = new Date(from.toInt());\n\t\t}\n\t\treturn parsed;\n\t},\n\n\tparseDay: function(day, num){\n\t\treturn parseWord('day', day, num);\n\t},\n\n\tparseMonth: function(month, num){\n\t\treturn parseWord('month', month, num);\n\t},\n\n\tparseUTC: function(value){\n\t\tvar localDate = new Date(value);\n\t\tvar utcSeconds = Date.UTC(\n\t\t\tlocalDate.get('year'),\n\t\t\tlocalDate.get('mo'),\n\t\t\tlocalDate.get('date'),\n\t\t\tlocalDate.get('hr'),\n\t\t\tlocalDate.get('min'),\n\t\t\tlocalDate.get('sec'),\n\t\t\tlocalDate.get('ms')\n\t\t);\n\t\treturn new Date(utcSeconds);\n\t},\n\n\torderIndex: function(unit){\n\t\treturn Date.getMsg('dateOrder').indexOf(unit) + 1;\n\t},\n\n\tdefineFormat: function(name, format){\n\t\tformats[name] = format;\n\t\treturn this;\n\t},\n\n\t\n\n\tdefineParser: function(pattern){\n\t\tparsePatterns.push((pattern.re && pattern.handler) ? pattern : build(pattern));\n\t\treturn this;\n\t},\n\n\tdefineParsers: function(){\n\t\tArray.flatten(arguments).each(Date.defineParser);\n\t\treturn this;\n\t},\n\n\tdefine2DigitYearStart: function(year){\n\t\tstartYear = year % 100;\n\t\tstartCentury = year - startYear;\n\t\treturn this;\n\t}\n\n}).extend({\n\tdefineFormats: Date.defineFormat.overloadSetter()\n});\n\nvar regexOf = function(type){\n\treturn new RegExp('(?:' + Date.getMsg(type).map(function(name){\n\t\treturn name.substr(0, 3);\n\t}).join('|') + ')[a-z]*');\n};\n\nvar replacers = function(key){\n\tswitch (key){\n\t\tcase 'T':\n\t\t\treturn '%H:%M:%S';\n\t\tcase 'x': // iso8601 covers yyyy-mm-dd, so just check if month is first\n\t\t\treturn ((Date.orderIndex('month') == 1) ? '%m[-./]%d' : '%d[-./]%m') + '([-./]%y)?';\n\t\tcase 'X':\n\t\t\treturn '%H([.:]%M)?([.:]%S([.:]%s)?)? ?%p? ?%z?';\n\t}\n\treturn null;\n};\n\nvar keys = {\n\td: /[0-2]?[0-9]|3[01]/,\n\tH: /[01]?[0-9]|2[0-3]/,\n\tI: /0?[1-9]|1[0-2]/,\n\tM: /[0-5]?\\d/,\n\ts: /\\d+/,\n\to: /[a-z]*/,\n\tp: /[ap]\\.?m\\.?/,\n\ty: /\\d{2}|\\d{4}/,\n\tY: /\\d{4}/,\n\tz: /Z|[+-]\\d{2}(?::?\\d{2})?/\n};\n\nkeys.m = keys.I;\nkeys.S = keys.M;\n\nvar currentLanguage;\n\nvar recompile = function(language){\n\tcurrentLanguage = language;\n\n\tkeys.a = keys.A = regexOf('days');\n\tkeys.b = keys.B = regexOf('months');\n\n\tparsePatterns.each(function(pattern, i){\n\t\tif (pattern.format) parsePatterns[i] = build(pattern.format);\n\t});\n};\n\nvar build = function(format){\n\tif (!currentLanguage) return {format: format};\n\n\tvar parsed = [];\n\tvar re = (format.source || format) // allow format to be regex\n\t .replace(/%([a-z])/gi,\n\t\tfunction($0, $1){\n\t\t\treturn replacers($1) || $0;\n\t\t}\n\t).replace(/\\((?!\\?)/g, '(?:') // make all groups non-capturing\n\t .replace(/ (?!\\?|\\*)/g, ',? ') // be forgiving with spaces and commas\n\t .replace(/%([a-z%])/gi,\n\t\tfunction($0, $1){\n\t\t\tvar p = keys[$1];\n\t\t\tif (!p) return $1;\n\t\t\tparsed.push($1);\n\t\t\treturn '(' + p.source + ')';\n\t\t}\n\t).replace(/\\[a-z\\]/gi, '[a-z\\\\u00c0-\\\\uffff;\\&]'); // handle unicode words\n\n\treturn {\n\t\tformat: format,\n\t\tre: new RegExp('^' + re + '$', 'i'),\n\t\thandler: function(bits){\n\t\t\tbits = bits.slice(1).associate(parsed);\n\t\t\tvar date = new Date().clearTime(),\n\t\t\t\tyear = bits.y || bits.Y;\n\n\t\t\tif (year != null) handle.call(date, 'y', year); // need to start in the right year\n\t\t\tif ('d' in bits) handle.call(date, 'd', 1);\n\t\t\tif ('m' in bits || bits.b || bits.B) handle.call(date, 'm', 1);\n\n\t\t\tfor (var key in bits) handle.call(date, key, bits[key]);\n\t\t\treturn date;\n\t\t}\n\t};\n};\n\nvar handle = function(key, value){\n\tif (!value) return this;\n\n\tswitch (key){\n\t\tcase 'a': case 'A': return this.set('day', Date.parseDay(value, true));\n\t\tcase 'b': case 'B': return this.set('mo', Date.parseMonth(value, true));\n\t\tcase 'd': return this.set('date', value);\n\t\tcase 'H': case 'I': return this.set('hr', value);\n\t\tcase 'm': return this.set('mo', value - 1);\n\t\tcase 'M': return this.set('min', value);\n\t\tcase 'p': return this.set('ampm', value.replace(/\\./g, ''));\n\t\tcase 'S': return this.set('sec', value);\n\t\tcase 's': return this.set('ms', ('0.' + value) * 1000);\n\t\tcase 'w': return this.set('day', value);\n\t\tcase 'Y': return this.set('year', value);\n\t\tcase 'y':\n\t\t\tvalue = +value;\n\t\t\tif (value < 100) value += startCentury + (value < startYear ? 100 : 0);\n\t\t\treturn this.set('year', value);\n\t\tcase 'z':\n\t\t\tif (value == 'Z') value = '+00';\n\t\t\tvar offset = value.match(/([+-])(\\d{2}):?(\\d{2})?/);\n\t\t\toffset = (offset[1] + '1') * (offset[2] * 60 + (+offset[3] || 0)) + this.getTimezoneOffset();\n\t\t\treturn this.set('time', this - offset * 60000);\n\t}\n\n\treturn this;\n};\n\nDate.defineParsers(\n\t'%Y([-./]%m([-./]%d((T| )%X)?)?)?', // \"1999-12-31\", \"1999-12-31 11:59pm\", \"1999-12-31 23:59:59\", ISO8601\n\t'%Y%m%d(T%H(%M%S?)?)?', // \"19991231\", \"19991231T1159\", compact\n\t'%x( %X)?', // \"12/31\", \"12.31.99\", \"12-31-1999\", \"12/31/2008 11:59 PM\"\n\t'%d%o( %b( %Y)?)?( %X)?', // \"31st\", \"31st December\", \"31 Dec 1999\", \"31 Dec 1999 11:59pm\"\n\t'%b( %d%o)?( %Y)?( %X)?', // Same as above with month and day switched\n\t'%Y %b( %d%o( %X)?)?', // Same as above with year coming first\n\t'%o %b %d %X %z %Y', // \"Thu Oct 22 08:11:23 +0000 2009\"\n\t'%T', // %H:%M:%S\n\t'%H:%M( ?%p)?' // \"11:05pm\", \"11:05 am\" and \"11:05\"\n);\n\nLocale.addEvent('change', function(language){\n\tif (Locale.get('Date')) recompile(language);\n}).fireEvent('change', Locale.getCurrent());\n\n})();\n\n\n/*\n---\n\nscript: Date.Extras.js\n\nname: Date.Extras\n\ndescription: Extends the Date native object to include extra methods (on top of those in Date.js).\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n - Scott Kyle\n\nrequires:\n - /Date\n\nprovides: [Date.Extras]\n\n...\n*/\n\nDate.implement({\n\n\ttimeDiffInWords: function(to){\n\t\treturn Date.distanceOfTimeInWords(this, to || new Date);\n\t},\n\n\ttimeDiff: function(to, separator){\n\t\tif (to == null) to = new Date;\n\t\tvar delta = ((to - this) / 1000).floor().abs();\n\n\t\tvar vals = [],\n\t\t\tdurations = [60, 60, 24, 365, 0],\n\t\t\tnames = ['s', 'm', 'h', 'd', 'y'],\n\t\t\tvalue, duration;\n\n\t\tfor (var item = 0; item < durations.length; item++){\n\t\t\tif (item && !delta) break;\n\t\t\tvalue = delta;\n\t\t\tif ((duration = durations[item])){\n\t\t\t\tvalue = (delta % duration);\n\t\t\t\tdelta = (delta / duration).floor();\n\t\t\t}\n\t\t\tvals.unshift(value + (names[item] || ''));\n\t\t}\n\n\t\treturn vals.join(separator || ':');\n\t}\n\n}).extend({\n\n\tdistanceOfTimeInWords: function(from, to){\n\t\treturn Date.getTimePhrase(((to - from) / 1000).toInt());\n\t},\n\n\tgetTimePhrase: function(delta){\n\t\tvar suffix = (delta < 0) ? 'Until' : 'Ago';\n\t\tif (delta < 0) delta *= -1;\n\n\t\tvar units = {\n\t\t\tminute: 60,\n\t\t\thour: 60,\n\t\t\tday: 24,\n\t\t\tweek: 7,\n\t\t\tmonth: 52 / 12,\n\t\t\tyear: 12,\n\t\t\teon: Infinity\n\t\t};\n\n\t\tvar msg = 'lessThanMinute';\n\n\t\tfor (var unit in units){\n\t\t\tvar interval = units[unit];\n\t\t\tif (delta < 1.5 * interval){\n\t\t\t\tif (delta > 0.75 * interval) msg = unit;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdelta /= interval;\n\t\t\tmsg = unit + 's';\n\t\t}\n\n\t\tdelta = delta.round();\n\t\treturn Date.getMsg(msg + suffix, delta).substitute({delta: delta});\n\t}\n\n}).defineParsers(\n\n\t{\n\t\t// \"today\", \"tomorrow\", \"yesterday\"\n\t\tre: /^(?:tod|tom|yes)/i,\n\t\thandler: function(bits){\n\t\t\tvar d = new Date().clearTime();\n\t\t\tswitch (bits[0]){\n\t\t\t\tcase 'tom': return d.increment();\n\t\t\t\tcase 'yes': return d.decrement();\n\t\t\t\tdefault: return d;\n\t\t\t}\n\t\t}\n\t},\n\n\t{\n\t\t// \"next Wednesday\", \"last Thursday\"\n\t\tre: /^(next|last) ([a-z]+)$/i,\n\t\thandler: function(bits){\n\t\t\tvar d = new Date().clearTime();\n\t\t\tvar day = d.getDay();\n\t\t\tvar newDay = Date.parseDay(bits[2], true);\n\t\t\tvar addDays = newDay - day;\n\t\t\tif (newDay <= day) addDays += 7;\n\t\t\tif (bits[1] == 'last') addDays -= 7;\n\t\t\treturn d.set('date', d.getDate() + addDays);\n\t\t}\n\t}\n\n).alias('timeAgoInWords', 'timeDiffInWords');\n\n\n/*\n---\n\nname: Locale.en-US.Number\n\ndescription: Number messages for US English.\n\nlicense: MIT-style license\n\nauthors:\n - Arian Stolwijk\n\nrequires:\n - /Locale\n\nprovides: [Locale.en-US.Number]\n\n...\n*/\n\nLocale.define('en-US', 'Number', {\n\n\tdecimal: '.',\n\tgroup: ',',\n\n/* \tCommented properties are the defaults for Number.format\n\tdecimals: 0,\n\tprecision: 0,\n\tscientific: null,\n\n\tprefix: null,\n\tsuffic: null,\n\n\t// Negative/Currency/percentage will mixin Number\n\tnegative: {\n\t\tprefix: '-'\n\t},*/\n\n\tcurrency: {\n//\t\tdecimals: 2,\n\t\tprefix: '$ '\n\t}/*,\n\n\tpercentage: {\n\t\tdecimals: 2,\n\t\tsuffix: '%'\n\t}*/\n\n});\n\n\n\n\n/*\n---\nname: Number.Format\ndescription: Extends the Number Type object to include a number formatting method.\nlicense: MIT-style license\nauthors: [Arian Stolwijk]\nrequires: [Core/Number, Locale.en-US.Number]\n# Number.Extras is for compatibility\nprovides: [Number.Format, Number.Extras]\n...\n*/\n\n\nNumber.implement({\n\n\tformat: function(options){\n\t\t// Thanks dojo and YUI for some inspiration\n\t\tvar value = this;\n\t\toptions = options ? Object.clone(options) : {};\n\t\tvar getOption = function(key){\n\t\t\tif (options[key] != null) return options[key];\n\t\t\treturn Locale.get('Number.' + key);\n\t\t};\n\n\t\tvar negative = value < 0,\n\t\t\tdecimal = getOption('decimal'),\n\t\t\tprecision = getOption('precision'),\n\t\t\tgroup = getOption('group'),\n\t\t\tdecimals = getOption('decimals');\n\n\t\tif (negative){\n\t\t\tvar negativeLocale = getOption('negative') || {};\n\t\t\tif (negativeLocale.prefix == null && negativeLocale.suffix == null) negativeLocale.prefix = '-';\n\t\t\t['prefix', 'suffix'].each(function(key){\n\t\t\t\tif (negativeLocale[key]) options[key] = getOption(key) + negativeLocale[key];\n\t\t\t});\n\n\t\t\tvalue = -value;\n\t\t}\n\n\t\tvar prefix = getOption('prefix'),\n\t\t\tsuffix = getOption('suffix');\n\n\t\tif (decimals !== '' && decimals >= 0 && decimals <= 20) value = value.toFixed(decimals);\n\t\tif (precision >= 1 && precision <= 21) value = (+value).toPrecision(precision);\n\n\t\tvalue += '';\n\t\tvar index;\n\t\tif (getOption('scientific') === false && value.indexOf('e') > -1){\n\t\t\tvar match = value.split('e'),\n\t\t\t\tzeros = +match[1];\n\t\t\tvalue = match[0].replace('.', '');\n\n\t\t\tif (zeros < 0){\n\t\t\t\tzeros = -zeros - 1;\n\t\t\t\tindex = match[0].indexOf('.');\n\t\t\t\tif (index > -1) zeros -= index - 1;\n\t\t\t\twhile (zeros--) value = '0' + value;\n\t\t\t\tvalue = '0.' + value;\n\t\t\t} else {\n\t\t\t\tindex = match[0].lastIndexOf('.');\n\t\t\t\tif (index > -1) zeros -= match[0].length - index - 1;\n\t\t\t\twhile (zeros--) value += '0';\n\t\t\t}\n\t\t}\n\n\t\tif (decimal != '.') value = value.replace('.', decimal);\n\n\t\tif (group){\n\t\t\tindex = value.lastIndexOf(decimal);\n\t\t\tindex = (index > -1) ? index : value.length;\n\t\t\tvar newOutput = value.substring(index),\n\t\t\t\ti = index;\n\n\t\t\twhile (i--){\n\t\t\t\tif ((index - i - 1) % 3 == 0 && i != (index - 1)) newOutput = group + newOutput;\n\t\t\t\tnewOutput = value.charAt(i) + newOutput;\n\t\t\t}\n\n\t\t\tvalue = newOutput;\n\t\t}\n\n\t\tif (prefix) value = prefix + value;\n\t\tif (suffix) value += suffix;\n\n\t\treturn value;\n\t},\n\n\tformatCurrency: function(decimals){\n\t\tvar locale = Locale.get('Number.currency') || {};\n\t\tif (locale.scientific == null) locale.scientific = false;\n\t\tlocale.decimals = decimals != null ? decimals\n\t\t\t: (locale.decimals == null ? 2 : locale.decimals);\n\n\t\treturn this.format(locale);\n\t},\n\n\tformatPercentage: function(decimals){\n\t\tvar locale = Locale.get('Number.percentage') || {};\n\t\tif (locale.suffix == null) locale.suffix = '%';\n\t\tlocale.decimals = decimals != null ? decimals\n\t\t\t: (locale.decimals == null ? 2 : locale.decimals);\n\n\t\treturn this.format(locale);\n\t}\n\n});\n\n\n/*\n---\n\nscript: String.Extras.js\n\nname: String.Extras\n\ndescription: Extends the String native object to include methods useful in managing various kinds of strings (query strings, urls, html, etc).\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n - Guillermo Rauch\n - Christopher Pitt\n\nrequires:\n - Core/String\n - Core/Array\n - MooTools.More\n\nprovides: [String.Extras]\n\n...\n*/\n\n(function(){\n\nvar special = {\n\t'a': /[àáâãäåăą]/g,\n\t'A': /[ÀÁÂÃÄÅĂĄ]/g,\n\t'c': /[ćčç]/g,\n\t'C': /[ĆČÇ]/g,\n\t'd': /[ďđ]/g,\n\t'D': /[ĎÐ]/g,\n\t'e': /[èéêëěę]/g,\n\t'E': /[ÈÉÊËĚĘ]/g,\n\t'g': /[ğ]/g,\n\t'G': /[Ğ]/g,\n\t'i': /[ìíîï]/g,\n\t'I': /[ÌÍÎÏ]/g,\n\t'l': /[ĺľł]/g,\n\t'L': /[ĹĽŁ]/g,\n\t'n': /[ñňń]/g,\n\t'N': /[ÑŇŃ]/g,\n\t'o': /[òóôõöøő]/g,\n\t'O': /[ÒÓÔÕÖØ]/g,\n\t'r': /[řŕ]/g,\n\t'R': /[ŘŔ]/g,\n\t's': /[ššş]/g,\n\t'S': /[ŠŞŚ]/g,\n\t't': /[ťţ]/g,\n\t'T': /[ŤŢ]/g,\n\t'ue': /[ü]/g,\n\t'UE': /[Ü]/g,\n\t'u': /[ùúûůµ]/g,\n\t'U': /[ÙÚÛŮ]/g,\n\t'y': /[ÿý]/g,\n\t'Y': /[ŸÝ]/g,\n\t'z': /[žźż]/g,\n\t'Z': /[ŽŹŻ]/g,\n\t'th': /[þ]/g,\n\t'TH': /[Þ]/g,\n\t'dh': /[ð]/g,\n\t'DH': /[Ð]/g,\n\t'ss': /[ß]/g,\n\t'oe': /[œ]/g,\n\t'OE': /[Œ]/g,\n\t'ae': /[æ]/g,\n\t'AE': /[Æ]/g\n},\n\ntidy = {\n\t' ': /[\\xa0\\u2002\\u2003\\u2009]/g,\n\t'*': /[\\xb7]/g,\n\t'\\'': /[\\u2018\\u2019]/g,\n\t'\"': /[\\u201c\\u201d]/g,\n\t'...': /[\\u2026]/g,\n\t'-': /[\\u2013]/g,\n//\t'--': /[\\u2014]/g,\n\t'»': /[\\uFFFD]/g\n};\n\nvar walk = function(string, replacements){\n\tvar result = string, key;\n\tfor (key in replacements) result = result.replace(replacements[key], key);\n\treturn result;\n};\n\nvar getRegexForTag = function(tag, contents){\n\ttag = tag || '';\n\tvar regstr = contents ? \"<\" + tag + \"(?!\\\\w)[^>]*>([\\\\s\\\\S]*?)<\\/\" + tag + \"(?!\\\\w)>\" : \"<\\/?\" + tag + \"([^>]+)?>\",\n\t\treg = new RegExp(regstr, \"gi\");\n\treturn reg;\n};\n\nString.implement({\n\n\tstandardize: function(){\n\t\treturn walk(this, special);\n\t},\n\n\trepeat: function(times){\n\t\treturn new Array(times + 1).join(this);\n\t},\n\n\tpad: function(length, str, direction){\n\t\tif (this.length >= length) return this;\n\n\t\tvar pad = (str == null ? ' ' : '' + str)\n\t\t\t.repeat(length - this.length)\n\t\t\t.substr(0, length - this.length);\n\n\t\tif (!direction || direction == 'right') return this + pad;\n\t\tif (direction == 'left') return pad + this;\n\n\t\treturn pad.substr(0, (pad.length / 2).floor()) + this + pad.substr(0, (pad.length / 2).ceil());\n\t},\n\n\tgetTags: function(tag, contents){\n\t\treturn this.match(getRegexForTag(tag, contents)) || [];\n\t},\n\n\tstripTags: function(tag, contents){\n\t\treturn this.replace(getRegexForTag(tag, contents), '');\n\t},\n\n\ttidy: function(){\n\t\treturn walk(this, tidy);\n\t},\n\n\ttruncate: function(max, trail, atChar){\n\t\tvar string = this;\n\t\tif (trail == null && arguments.length == 1) trail = '…';\n\t\tif (string.length > max){\n\t\t\tstring = string.substring(0, max);\n\t\t\tif (atChar){\n\t\t\t\tvar index = string.lastIndexOf(atChar);\n\t\t\t\tif (index != -1) string = string.substr(0, index);\n\t\t\t}\n\t\t\tif (trail) string += trail;\n\t\t}\n\t\treturn string;\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nscript: String.QueryString.js\n\nname: String.QueryString\n\ndescription: Methods for dealing with URI query strings.\n\nlicense: MIT-style license\n\nauthors:\n - Sebastian Markbåge\n - Aaron Newton\n - Lennart Pilon\n - Valerio Proietti\n\nrequires:\n - Core/Array\n - Core/String\n - /MooTools.More\n\nprovides: [String.QueryString]\n\n...\n*/\n\nString.implement({\n\n\tparseQueryString: function(decodeKeys, decodeValues){\n\t\tif (decodeKeys == null) decodeKeys = true;\n\t\tif (decodeValues == null) decodeValues = true;\n\n\t\tvar vars = this.split(/[&;]/),\n\t\t\tobject = {};\n\t\tif (!vars.length) return object;\n\n\t\tvars.each(function(val){\n\t\t\tvar index = val.indexOf('=') + 1,\n\t\t\t\tvalue = index ? val.substr(index) : '',\n\t\t\t\tkeys = index ? val.substr(0, index - 1).match(/([^\\]\\[]+|(\\B)(?=\\]))/g) : [val],\n\t\t\t\tobj = object;\n\t\t\tif (!keys) return;\n\t\t\tif (decodeValues) value = decodeURIComponent(value);\n\t\t\tkeys.each(function(key, i){\n\t\t\t\tif (decodeKeys) key = decodeURIComponent(key);\n\t\t\t\tvar current = obj[key];\n\n\t\t\t\tif (i < keys.length - 1) obj = obj[key] = current || {};\n\t\t\t\telse if (typeOf(current) == 'array') current.push(value);\n\t\t\t\telse obj[key] = current != null ? [current, value] : value;\n\t\t\t});\n\t\t});\n\n\t\treturn object;\n\t},\n\n\tcleanQueryString: function(method){\n\t\treturn this.split('&').filter(function(val){\n\t\t\tvar index = val.indexOf('='),\n\t\t\t\tkey = index < 0 ? '' : val.substr(0, index),\n\t\t\t\tvalue = val.substr(index + 1);\n\n\t\t\treturn method ? method.call(null, key, value) : (value || value === 0);\n\t\t}).join('&');\n\t}\n\n});\n\n\n/*\n---\n\nscript: URI.js\n\nname: URI\n\ndescription: Provides methods useful in managing the window location and uris.\n\nlicense: MIT-style license\n\nauthors:\n - Sebastian Markbåge\n - Aaron Newton\n\nrequires:\n - Core/Object\n - Core/Class\n - Core/Class.Extras\n - Core/Element\n - /String.QueryString\n\nprovides: [URI]\n\n...\n*/\n\n(function(){\n\nvar toString = function(){\n\treturn this.get('value');\n};\n\nvar URI = this.URI = new Class({\n\n\tImplements: Options,\n\n\toptions: {\n\t\t/*base: false*/\n\t},\n\n\tregex: /^(?:(\\w+):)?(?:\\/\\/(?:(?:([^:@\\/]*):?([^:@\\/]*))?@)?([^:\\/?#]*)(?::(\\d*))?)?(\\.\\.?$|(?:[^?#\\/]*\\/)*)([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/,\n\tparts: ['scheme', 'user', 'password', 'host', 'port', 'directory', 'file', 'query', 'fragment'],\n\tschemes: {http: 80, https: 443, ftp: 21, rtsp: 554, mms: 1755, file: 0},\n\n\tinitialize: function(uri, options){\n\t\tthis.setOptions(options);\n\t\tvar base = this.options.base || URI.base;\n\t\tif (!uri) uri = base;\n\n\t\tif (uri && uri.parsed) this.parsed = Object.clone(uri.parsed);\n\t\telse this.set('value', uri.href || uri.toString(), base ? new URI(base) : false);\n\t},\n\n\tparse: function(value, base){\n\t\tvar bits = value.match(this.regex);\n\t\tif (!bits) return false;\n\t\tbits.shift();\n\t\treturn this.merge(bits.associate(this.parts), base);\n\t},\n\n\tmerge: function(bits, base){\n\t\tif ((!bits || !bits.scheme) && (!base || !base.scheme)) return false;\n\t\tif (base){\n\t\t\tthis.parts.every(function(part){\n\t\t\t\tif (bits[part]) return false;\n\t\t\t\tbits[part] = base[part] || '';\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t\tbits.port = bits.port || this.schemes[bits.scheme.toLowerCase()];\n\t\tbits.directory = bits.directory ? this.parseDirectory(bits.directory, base ? base.directory : '') : '/';\n\t\treturn bits;\n\t},\n\n\tparseDirectory: function(directory, baseDirectory){\n\t\tdirectory = (directory.substr(0, 1) == '/' ? '' : (baseDirectory || '/')) + directory;\n\t\tif (!directory.test(URI.regs.directoryDot)) return directory;\n\t\tvar result = [];\n\t\tdirectory.replace(URI.regs.endSlash, '').split('/').each(function(dir){\n\t\t\tif (dir == '..' && result.length > 0) result.pop();\n\t\t\telse if (dir != '.') result.push(dir);\n\t\t});\n\t\treturn result.join('/') + '/';\n\t},\n\n\tcombine: function(bits){\n\t\treturn bits.value || bits.scheme + '://' +\n\t\t\t(bits.user ? bits.user + (bits.password ? ':' + bits.password : '') + '@' : '') +\n\t\t\t(bits.host || '') + (bits.port && bits.port != this.schemes[bits.scheme] ? ':' + bits.port : '') +\n\t\t\t(bits.directory || '/') + (bits.file || '') +\n\t\t\t(bits.query ? '?' + bits.query : '') +\n\t\t\t(bits.fragment ? '#' + bits.fragment : '');\n\t},\n\n\tset: function(part, value, base){\n\t\tif (part == 'value'){\n\t\t\tvar scheme = value.match(URI.regs.scheme);\n\t\t\tif (scheme) scheme = scheme[1];\n\t\t\tif (scheme && this.schemes[scheme.toLowerCase()] == null) this.parsed = { scheme: scheme, value: value };\n\t\t\telse this.parsed = this.parse(value, (base || this).parsed) || (scheme ? { scheme: scheme, value: value } : { value: value });\n\t\t} else if (part == 'data'){\n\t\t\tthis.setData(value);\n\t\t} else {\n\t\t\tthis.parsed[part] = value;\n\t\t}\n\t\treturn this;\n\t},\n\n\tget: function(part, base){\n\t\tswitch (part){\n\t\t\tcase 'value': return this.combine(this.parsed, base ? base.parsed : false);\n\t\t\tcase 'data' : return this.getData();\n\t\t}\n\t\treturn this.parsed[part] || '';\n\t},\n\n\tgo: function(){\n\t\tdocument.location.href = this.toString();\n\t},\n\n\ttoURI: function(){\n\t\treturn this;\n\t},\n\n\tgetData: function(key, part){\n\t\tvar qs = this.get(part || 'query');\n\t\tif (!(qs || qs === 0)) return key ? null : {};\n\t\tvar obj = qs.parseQueryString();\n\t\treturn key ? obj[key] : obj;\n\t},\n\n\tsetData: function(values, merge, part){\n\t\tif (typeof values == 'string'){\n\t\t\tvar data = this.getData();\n\t\t\tdata[arguments[0]] = arguments[1];\n\t\t\tvalues = data;\n\t\t} else if (merge){\n\t\t\tvalues = Object.merge(this.getData(), values);\n\t\t}\n\t\treturn this.set(part || 'query', Object.toQueryString(values));\n\t},\n\n\tclearData: function(part){\n\t\treturn this.set(part || 'query', '');\n\t},\n\n\ttoString: toString,\n\tvalueOf: toString\n\n});\n\nURI.regs = {\n\tendSlash: /\\/$/,\n\tscheme: /^(\\w+):/,\n\tdirectoryDot: /\\.\\/|\\.$/\n};\n\nURI.base = new URI(Array.from(document.getElements('base[href]', true)).getLast(), {base: document.location});\n\nString.implement({\n\n\ttoURI: function(options){\n\t\treturn new URI(this, options);\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nscript: URI.Relative.js\n\nname: URI.Relative\n\ndescription: Extends the URI class to add methods for computing relative and absolute urls.\n\nlicense: MIT-style license\n\nauthors:\n - Sebastian Markbåge\n\n\nrequires:\n - /Class.refactor\n - /URI\n\nprovides: [URI.Relative]\n\n...\n*/\n\nURI = Class.refactor(URI, {\n\n\tcombine: function(bits, base){\n\t\tif (!base || bits.scheme != base.scheme || bits.host != base.host || bits.port != base.port)\n\t\t\treturn this.previous.apply(this, arguments);\n\t\tvar end = bits.file + (bits.query ? '?' + bits.query : '') + (bits.fragment ? '#' + bits.fragment : '');\n\n\t\tif (!base.directory) return (bits.directory || (bits.file ? '' : './')) + end;\n\n\t\tvar baseDir = base.directory.split('/'),\n\t\t\trelDir = bits.directory.split('/'),\n\t\t\tpath = '',\n\t\t\toffset;\n\n\t\tvar i = 0;\n\t\tfor (offset = 0; offset < baseDir.length && offset < relDir.length && baseDir[offset] == relDir[offset]; offset++);\n\t\tfor (i = 0; i < baseDir.length - offset - 1; i++) path += '../';\n\t\tfor (i = offset; i < relDir.length - 1; i++) path += relDir[i] + '/';\n\n\t\treturn (path || (bits.file ? '' : './')) + end;\n\t},\n\n\ttoAbsolute: function(base){\n\t\tbase = new URI(base);\n\t\tif (base) base.set('directory', '').set('file', '');\n\t\treturn this.toRelative(base);\n\t},\n\n\ttoRelative: function(base){\n\t\treturn this.get('value', new URI(base));\n\t}\n\n});\n\n\n/*\n---\n\nname: Hash\n\ndescription: Contains Hash Prototypes. Provides a means for overcoming the JavaScript practical impossibility of extending native Objects.\n\nlicense: MIT-style license.\n\nrequires:\n - Core/Object\n - /MooTools.More\n\nprovides: [Hash]\n\n...\n*/\n\n(function(){\n\nif (this.Hash) return;\n\nvar Hash = this.Hash = new Type('Hash', function(object){\n\tif (typeOf(object) == 'hash') object = Object.clone(object.getClean());\n\tfor (var key in object) this[key] = object[key];\n\treturn this;\n});\n\nthis.$H = function(object){\n\treturn new Hash(object);\n};\n\nHash.implement({\n\n\tforEach: function(fn, bind){\n\t\tObject.forEach(this, fn, bind);\n\t},\n\n\tgetClean: function(){\n\t\tvar clean = {};\n\t\tfor (var key in this){\n\t\t\tif (this.hasOwnProperty(key)) clean[key] = this[key];\n\t\t}\n\t\treturn clean;\n\t},\n\n\tgetLength: function(){\n\t\tvar length = 0;\n\t\tfor (var key in this){\n\t\t\tif (this.hasOwnProperty(key)) length++;\n\t\t}\n\t\treturn length;\n\t}\n\n});\n\nHash.alias('each', 'forEach');\n\nHash.implement({\n\n\thas: Object.prototype.hasOwnProperty,\n\n\tkeyOf: function(value){\n\t\treturn Object.keyOf(this, value);\n\t},\n\n\thasValue: function(value){\n\t\treturn Object.contains(this, value);\n\t},\n\n\textend: function(properties){\n\t\tHash.each(properties || {}, function(value, key){\n\t\t\tHash.set(this, key, value);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tcombine: function(properties){\n\t\tHash.each(properties || {}, function(value, key){\n\t\t\tHash.include(this, key, value);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\terase: function(key){\n\t\tif (this.hasOwnProperty(key)) delete this[key];\n\t\treturn this;\n\t},\n\n\tget: function(key){\n\t\treturn (this.hasOwnProperty(key)) ? this[key] : null;\n\t},\n\n\tset: function(key, value){\n\t\tif (!this[key] || this.hasOwnProperty(key)) this[key] = value;\n\t\treturn this;\n\t},\n\n\tempty: function(){\n\t\tHash.each(this, function(value, key){\n\t\t\tdelete this[key];\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tinclude: function(key, value){\n\t\tif (this[key] == undefined) this[key] = value;\n\t\treturn this;\n\t},\n\n\tmap: function(fn, bind){\n\t\treturn new Hash(Object.map(this, fn, bind));\n\t},\n\n\tfilter: function(fn, bind){\n\t\treturn new Hash(Object.filter(this, fn, bind));\n\t},\n\n\tevery: function(fn, bind){\n\t\treturn Object.every(this, fn, bind);\n\t},\n\n\tsome: function(fn, bind){\n\t\treturn Object.some(this, fn, bind);\n\t},\n\n\tgetKeys: function(){\n\t\treturn Object.keys(this);\n\t},\n\n\tgetValues: function(){\n\t\treturn Object.values(this);\n\t},\n\n\ttoQueryString: function(base){\n\t\treturn Object.toQueryString(this, base);\n\t}\n\n});\n\nHash.alias({indexOf: 'keyOf', contains: 'hasValue'});\n\n\n})();\n\n\n\n/*\n---\n\nscript: Hash.Extras.js\n\nname: Hash.Extras\n\ndescription: Extends the Hash Type to include getFromPath which allows a path notation to child elements.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - /Hash\n - /Object.Extras\n\nprovides: [Hash.Extras]\n\n...\n*/\n\nHash.implement({\n\n\tgetFromPath: function(notation){\n\t\treturn Object.getFromPath(this, notation);\n\t},\n\n\tcleanValues: function(method){\n\t\treturn new Hash(Object.cleanValues(this, method));\n\t},\n\n\trun: function(){\n\t\tObject.run(arguments);\n\t}\n\n});\n\n\n/*\n---\n\nscript: Element.Forms.js\n\nname: Element.Forms\n\ndescription: Extends the Element native object to include methods useful in managing inputs.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Element\n - /String.Extras\n - /MooTools.More\n\nprovides: [Element.Forms]\n\n...\n*/\n\nElement.implement({\n\n\ttidy: function(){\n\t\tthis.set('value', this.get('value').tidy());\n\t},\n\n\tgetTextInRange: function(start, end){\n\t\treturn this.get('value').substring(start, end);\n\t},\n\n\tgetSelectedText: function(){\n\t\tif (this.setSelectionRange) return this.getTextInRange(this.getSelectionStart(), this.getSelectionEnd());\n\t\treturn document.selection.createRange().text;\n\t},\n\n\tgetSelectedRange: function(){\n\t\tif (this.selectionStart != null){\n\t\t\treturn {\n\t\t\t\tstart: this.selectionStart,\n\t\t\t\tend: this.selectionEnd\n\t\t\t};\n\t\t}\n\n\t\tvar pos = {\n\t\t\tstart: 0,\n\t\t\tend: 0\n\t\t};\n\t\tvar range = this.getDocument().selection.createRange();\n\t\tif (!range || range.parentElement() != this) return pos;\n\t\tvar duplicate = range.duplicate();\n\n\t\tif (this.type == 'text'){\n\t\t\tpos.start = 0 - duplicate.moveStart('character', -100000);\n\t\t\tpos.end = pos.start + range.text.length;\n\t\t} else {\n\t\t\tvar value = this.get('value');\n\t\t\tvar offset = value.length;\n\t\t\tduplicate.moveToElementText(this);\n\t\t\tduplicate.setEndPoint('StartToEnd', range);\n\t\t\tif (duplicate.text.length) offset -= value.match(/[\\n\\r]*$/)[0].length;\n\t\t\tpos.end = offset - duplicate.text.length;\n\t\t\tduplicate.setEndPoint('StartToStart', range);\n\t\t\tpos.start = offset - duplicate.text.length;\n\t\t}\n\t\treturn pos;\n\t},\n\n\tgetSelectionStart: function(){\n\t\treturn this.getSelectedRange().start;\n\t},\n\n\tgetSelectionEnd: function(){\n\t\treturn this.getSelectedRange().end;\n\t},\n\n\tsetCaretPosition: function(pos){\n\t\tif (pos == 'end') pos = this.get('value').length;\n\t\tthis.selectRange(pos, pos);\n\t\treturn this;\n\t},\n\n\tgetCaretPosition: function(){\n\t\treturn this.getSelectedRange().start;\n\t},\n\n\tselectRange: function(start, end){\n\t\tif (this.setSelectionRange){\n\t\t\tthis.focus();\n\t\t\tthis.setSelectionRange(start, end);\n\t\t} else {\n\t\t\tvar value = this.get('value');\n\t\t\tvar diff = value.substr(start, end - start).replace(/\\r/g, '').length;\n\t\t\tstart = value.substr(0, start).replace(/\\r/g, '').length;\n\t\t\tvar range = this.createTextRange();\n\t\t\trange.collapse(true);\n\t\t\trange.moveEnd('character', start + diff);\n\t\t\trange.moveStart('character', start);\n\t\t\trange.select();\n\t\t}\n\t\treturn this;\n\t},\n\n\tinsertAtCursor: function(value, select){\n\t\tvar pos = this.getSelectedRange();\n\t\tvar text = this.get('value');\n\t\tthis.set('value', text.substring(0, pos.start) + value + text.substring(pos.end, text.length));\n\t\tif (select !== false) this.selectRange(pos.start, pos.start + value.length);\n\t\telse this.setCaretPosition(pos.start + value.length);\n\t\treturn this;\n\t},\n\n\tinsertAroundCursor: function(options, select){\n\t\toptions = Object.append({\n\t\t\tbefore: '',\n\t\t\tdefaultMiddle: '',\n\t\t\tafter: ''\n\t\t}, options);\n\n\t\tvar value = this.getSelectedText() || options.defaultMiddle;\n\t\tvar pos = this.getSelectedRange();\n\t\tvar text = this.get('value');\n\n\t\tif (pos.start == pos.end){\n\t\t\tthis.set('value', text.substring(0, pos.start) + options.before + value + options.after + text.substring(pos.end, text.length));\n\t\t\tthis.selectRange(pos.start + options.before.length, pos.end + options.before.length + value.length);\n\t\t} else {\n\t\t\tvar current = text.substring(pos.start, pos.end);\n\t\t\tthis.set('value', text.substring(0, pos.start) + options.before + current + options.after + text.substring(pos.end, text.length));\n\t\t\tvar selStart = pos.start + options.before.length;\n\t\t\tif (select !== false) this.selectRange(selStart, selStart + current.length);\n\t\t\telse this.setCaretPosition(selStart + text.length);\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Elements.From.js\n\nname: Elements.From\n\ndescription: Returns a collection of elements from a string of html.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/String\n - Core/Element\n - /MooTools.More\n\nprovides: [Elements.from, Elements.From]\n\n...\n*/\n\nElements.from = function(text, excludeScripts){\n\tif (excludeScripts || excludeScripts == null) text = text.stripScripts();\n\n\tvar container, match = text.match(/^\\s*<(t[dhr]|tbody|tfoot|thead)/i);\n\n\tif (match){\n\t\tcontainer = new Element('table');\n\t\tvar tag = match[1].toLowerCase();\n\t\tif (['td', 'th', 'tr'].contains(tag)){\n\t\t\tcontainer = new Element('tbody').inject(container);\n\t\t\tif (tag != 'tr') container = new Element('tr').inject(container);\n\t\t}\n\t}\n\n\treturn (container || new Element('div')).set('html', text).getChildren();\n};\n\n\n/*\n---\n\nname: Element.Event.Pseudos\n\ndescription: Adds the functionality to add pseudo events for Elements\n\nlicense: MIT-style license\n\nauthors:\n - Arian Stolwijk\n\nrequires: [Core/Element.Event, Core/Element.Delegation, Events.Pseudos]\n\nprovides: [Element.Event.Pseudos, Element.Delegation]\n\n...\n*/\n\n(function(){\n\nvar pseudos = {relay: false},\n\tcopyFromEvents = ['once', 'throttle', 'pause'],\n\tcount = copyFromEvents.length;\n\nwhile (count--) pseudos[copyFromEvents[count]] = Events.lookupPseudo(copyFromEvents[count]);\n\nDOMEvent.definePseudo = function(key, listener){\n\tpseudos[key] = listener;\n\treturn this;\n};\n\nvar proto = Element.prototype;\n[Element, Window, Document].invoke('implement', Events.Pseudos(pseudos, proto.addEvent, proto.removeEvent));\n\n})();\n\n\n/*\n---\n\nname: Element.Event.Pseudos.Keys\n\ndescription: Adds functionality fire events if certain keycombinations are pressed\n\nlicense: MIT-style license\n\nauthors:\n - Arian Stolwijk\n\nrequires: [Element.Event.Pseudos]\n\nprovides: [Element.Event.Pseudos.Keys]\n\n...\n*/\n\n(function(){\n\nvar keysStoreKey = '$moo:keys-pressed',\n\tkeysKeyupStoreKey = '$moo:keys-keyup';\n\n\nDOMEvent.definePseudo('keys', function(split, fn, args){\n\n\tvar event = args[0],\n\t\tkeys = [],\n\t\tpressed = this.retrieve(keysStoreKey, []);\n\n\tkeys.append(split.value.replace('++', function(){\n\t\tkeys.push('+'); // shift++ and shift+++a\n\t\treturn '';\n\t}).split('+'));\n\n\tpressed.include(event.key);\n\n\tif (keys.every(function(key){\n\t\treturn pressed.contains(key);\n\t})) fn.apply(this, args);\n\n\tthis.store(keysStoreKey, pressed);\n\n\tif (!this.retrieve(keysKeyupStoreKey)){\n\t\tvar keyup = function(event){\n\t\t\t(function(){\n\t\t\t\tpressed = this.retrieve(keysStoreKey, []).erase(event.key);\n\t\t\t\tthis.store(keysStoreKey, pressed);\n\t\t\t}).delay(0, this); // Fix for IE\n\t\t};\n\t\tthis.store(keysKeyupStoreKey, keyup).addEvent('keyup', keyup);\n\t}\n\n});\n\nDOMEvent.defineKeys({\n\t'16': 'shift',\n\t'17': 'control',\n\t'18': 'alt',\n\t'20': 'capslock',\n\t'33': 'pageup',\n\t'34': 'pagedown',\n\t'35': 'end',\n\t'36': 'home',\n\t'144': 'numlock',\n\t'145': 'scrolllock',\n\t'186': ';',\n\t'187': '=',\n\t'188': ',',\n\t'190': '.',\n\t'191': '/',\n\t'192': '`',\n\t'219': '[',\n\t'220': '\\\\',\n\t'221': ']',\n\t'222': \"'\",\n\t'107': '+'\n}).defineKey(Browser.firefox ? 109 : 189, '-');\n\n})();\n\n\n/*\n---\n\nscript: Element.Measure.js\n\nname: Element.Measure\n\ndescription: Extends the Element native object to include methods useful in measuring dimensions.\n\ncredits: \"Element.measure / .expose methods by Daniel Steigerwald License: MIT-style license. Copyright: Copyright (c) 2008 Daniel Steigerwald, daniel.steigerwald.cz\"\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Element.Style\n - Core/Element.Dimensions\n - /MooTools.More\n\nprovides: [Element.Measure]\n\n...\n*/\n\n(function(){\n\nvar getStylesList = function(styles, planes){\n\tvar list = [];\n\tObject.each(planes, function(directions){\n\t\tObject.each(directions, function(edge){\n\t\t\tstyles.each(function(style){\n\t\t\t\tlist.push(style + '-' + edge + (style == 'border' ? '-width' : ''));\n\t\t\t});\n\t\t});\n\t});\n\treturn list;\n};\n\nvar calculateEdgeSize = function(edge, styles){\n\tvar total = 0;\n\tObject.each(styles, function(value, style){\n\t\tif (style.test(edge)) total = total + value.toInt();\n\t});\n\treturn total;\n};\n\nvar isVisible = function(el){\n\treturn !!(!el || el.offsetHeight || el.offsetWidth);\n};\n\n\nElement.implement({\n\n\tmeasure: function(fn){\n\t\tif (isVisible(this)) return fn.call(this);\n\t\tvar parent = this.getParent(),\n\t\t\ttoMeasure = [];\n\t\twhile (!isVisible(parent) && parent != document.body){\n\t\t\ttoMeasure.push(parent.expose());\n\t\t\tparent = parent.getParent();\n\t\t}\n\t\tvar restore = this.expose(),\n\t\t\tresult = fn.call(this);\n\t\trestore();\n\t\ttoMeasure.each(function(restore){\n\t\t\trestore();\n\t\t});\n\t\treturn result;\n\t},\n\n\texpose: function(){\n\t\tif (this.getStyle('display') != 'none') return function(){};\n\t\tvar before = this.style.cssText;\n\t\tthis.setStyles({\n\t\t\tdisplay: 'block',\n\t\t\tposition: 'absolute',\n\t\t\tvisibility: 'hidden'\n\t\t});\n\t\treturn function(){\n\t\t\tthis.style.cssText = before;\n\t\t}.bind(this);\n\t},\n\n\tgetDimensions: function(options){\n\t\toptions = Object.merge({computeSize: false}, options);\n\t\tvar dim = {x: 0, y: 0};\n\n\t\tvar getSize = function(el, options){\n\t\t\treturn (options.computeSize) ? el.getComputedSize(options) : el.getSize();\n\t\t};\n\n\t\tvar parent = this.getParent('body');\n\n\t\tif (parent && this.getStyle('display') == 'none'){\n\t\t\tdim = this.measure(function(){\n\t\t\t\treturn getSize(this, options);\n\t\t\t});\n\t\t} else if (parent){\n\t\t\ttry { //safari sometimes crashes here, so catch it\n\t\t\t\tdim = getSize(this, options);\n\t\t\t}catch(e){}\n\t\t}\n\n\t\treturn Object.append(dim, (dim.x || dim.x === 0) ? {\n\t\t\t\twidth: dim.x,\n\t\t\t\theight: dim.y\n\t\t\t} : {\n\t\t\t\tx: dim.width,\n\t\t\t\ty: dim.height\n\t\t\t}\n\t\t);\n\t},\n\n\tgetComputedSize: function(options){\n\t\t\n\n\t\toptions = Object.merge({\n\t\t\tstyles: ['padding','border'],\n\t\t\tplanes: {\n\t\t\t\theight: ['top','bottom'],\n\t\t\t\twidth: ['left','right']\n\t\t\t},\n\t\t\tmode: 'both'\n\t\t}, options);\n\n\t\tvar styles = {},\n\t\t\tsize = {width: 0, height: 0},\n\t\t\tdimensions;\n\n\t\tif (options.mode == 'vertical'){\n\t\t\tdelete size.width;\n\t\t\tdelete options.planes.width;\n\t\t} else if (options.mode == 'horizontal'){\n\t\t\tdelete size.height;\n\t\t\tdelete options.planes.height;\n\t\t}\n\n\t\tgetStylesList(options.styles, options.planes).each(function(style){\n\t\t\tstyles[style] = this.getStyle(style).toInt();\n\t\t}, this);\n\n\t\tObject.each(options.planes, function(edges, plane){\n\n\t\t\tvar capitalized = plane.capitalize(),\n\t\t\t\tstyle = this.getStyle(plane);\n\n\t\t\tif (style == 'auto' && !dimensions) dimensions = this.getDimensions();\n\n\t\t\tstyle = styles[plane] = (style == 'auto') ? dimensions[plane] : style.toInt();\n\t\t\tsize['total' + capitalized] = style;\n\n\t\t\tedges.each(function(edge){\n\t\t\t\tvar edgesize = calculateEdgeSize(edge, styles);\n\t\t\t\tsize['computed' + edge.capitalize()] = edgesize;\n\t\t\t\tsize['total' + capitalized] += edgesize;\n\t\t\t});\n\n\t\t}, this);\n\n\t\treturn Object.append(size, styles);\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nscript: Element.Pin.js\n\nname: Element.Pin\n\ndescription: Extends the Element native object to include the pin method useful for fixed positioning for elements.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Element.Event\n - Core/Element.Dimensions\n - Core/Element.Style\n - /MooTools.More\n\nprovides: [Element.Pin]\n\n...\n*/\n\n(function(){\n\tvar supportsPositionFixed = false,\n\t\tsupportTested = false;\n\n\tvar testPositionFixed = function(){\n\t\tvar test = new Element('div').setStyles({\n\t\t\tposition: 'fixed',\n\t\t\ttop: 0,\n\t\t\tright: 0\n\t\t}).inject(document.body);\n\t\tsupportsPositionFixed = (test.offsetTop === 0);\n\t\ttest.dispose();\n\t\tsupportTested = true;\n\t};\n\n\tElement.implement({\n\n\t\tpin: function(enable, forceScroll){\n\t\t\tif (!supportTested) testPositionFixed();\n\t\t\tif (this.getStyle('display') == 'none') return this;\n\n\t\t\tvar pinnedPosition,\n\t\t\t\tscroll = window.getScroll(),\n\t\t\t\tparent,\n\t\t\t\tscrollFixer;\n\n\t\t\tif (enable !== false){\n\t\t\t\tpinnedPosition = this.getPosition(supportsPositionFixed ? document.body : this.getOffsetParent());\n\t\t\t\tif (!this.retrieve('pin:_pinned')){\n\t\t\t\t\tvar currentPosition = {\n\t\t\t\t\t\ttop: pinnedPosition.y - scroll.y,\n\t\t\t\t\t\tleft: pinnedPosition.x - scroll.x\n\t\t\t\t\t};\n\n\t\t\t\t\tif (supportsPositionFixed && !forceScroll){\n\t\t\t\t\t\tthis.setStyle('position', 'fixed').setStyles(currentPosition);\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tparent = this.getOffsetParent();\n\t\t\t\t\t\tvar position = this.getPosition(parent),\n\t\t\t\t\t\t\tstyles = this.getStyles('left', 'top');\n\n\t\t\t\t\t\tif (parent && styles.left == 'auto' || styles.top == 'auto') this.setPosition(position);\n\t\t\t\t\t\tif (this.getStyle('position') == 'static') this.setStyle('position', 'absolute');\n\n\t\t\t\t\t\tposition = {\n\t\t\t\t\t\t\tx: styles.left.toInt() - scroll.x,\n\t\t\t\t\t\t\ty: styles.top.toInt() - scroll.y\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tscrollFixer = function(){\n\t\t\t\t\t\t\tif (!this.retrieve('pin:_pinned')) return;\n\t\t\t\t\t\t\tvar scroll = window.getScroll();\n\t\t\t\t\t\t\tthis.setStyles({\n\t\t\t\t\t\t\t\tleft: position.x + scroll.x,\n\t\t\t\t\t\t\t\ttop: position.y + scroll.y\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}.bind(this);\n\n\t\t\t\t\t\tthis.store('pin:_scrollFixer', scrollFixer);\n\t\t\t\t\t\twindow.addEvent('scroll', scrollFixer);\n\t\t\t\t\t}\n\t\t\t\t\tthis.store('pin:_pinned', true);\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\tif (!this.retrieve('pin:_pinned')) return this;\n\n\t\t\t\tparent = this.getParent();\n\t\t\t\tvar offsetParent = (parent.getComputedStyle('position') != 'static' ? parent : parent.getOffsetParent());\n\n\t\t\t\tpinnedPosition = this.getPosition(offsetParent);\n\n\t\t\t\tthis.store('pin:_pinned', false);\n\t\t\t\tscrollFixer = this.retrieve('pin:_scrollFixer');\n\t\t\t\tif (!scrollFixer){\n\t\t\t\t\tthis.setStyles({\n\t\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\t\ttop: pinnedPosition.y + scroll.y,\n\t\t\t\t\t\tleft: pinnedPosition.x + scroll.x\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.store('pin:_scrollFixer', null);\n\t\t\t\t\twindow.removeEvent('scroll', scrollFixer);\n\t\t\t\t}\n\t\t\t\tthis.removeClass('isPinned');\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\n\t\tunpin: function(){\n\t\t\treturn this.pin(false);\n\t\t},\n\n\t\ttogglePin: function(){\n\t\t\treturn this.pin(!this.retrieve('pin:_pinned'));\n\t\t}\n\n\t});\n\n\n\n})();\n\n\n/*\n---\n\nscript: Element.Position.js\n\nname: Element.Position\n\ndescription: Extends the Element native object to include methods useful positioning elements relative to others.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n - Jacob Thornton\n\nrequires:\n - Core/Options\n - Core/Element.Dimensions\n - Element.Measure\n\nprovides: [Element.Position]\n\n...\n*/\n\n(function(original){\n\nvar local = Element.Position = {\n\n\toptions: {/*\n\t\tedge: false,\n\t\treturnPos: false,\n\t\tminimum: {x: 0, y: 0},\n\t\tmaximum: {x: 0, y: 0},\n\t\trelFixedPosition: false,\n\t\tignoreMargins: false,\n\t\tignoreScroll: false,\n\t\tallowNegative: false,*/\n\t\trelativeTo: document.body,\n\t\tposition: {\n\t\t\tx: 'center', //left, center, right\n\t\t\ty: 'center' //top, center, bottom\n\t\t},\n\t\toffset: {x: 0, y: 0}\n\t},\n\n\tgetOptions: function(element, options){\n\t\toptions = Object.merge({}, local.options, options);\n\t\tlocal.setPositionOption(options);\n\t\tlocal.setEdgeOption(options);\n\t\tlocal.setOffsetOption(element, options);\n\t\tlocal.setDimensionsOption(element, options);\n\t\treturn options;\n\t},\n\n\tsetPositionOption: function(options){\n\t\toptions.position = local.getCoordinateFromValue(options.position);\n\t},\n\n\tsetEdgeOption: function(options){\n\t\tvar edgeOption = local.getCoordinateFromValue(options.edge);\n\t\toptions.edge = edgeOption ? edgeOption :\n\t\t\t(options.position.x == 'center' && options.position.y == 'center') ? {x: 'center', y: 'center'} :\n\t\t\t{x: 'left', y: 'top'};\n\t},\n\n\tsetOffsetOption: function(element, options){\n\t\tvar parentOffset = {x: 0, y: 0},\n\t\t\toffsetParent = element.measure(function(){\n\t\t\t\treturn document.id(this.getOffsetParent());\n\t\t\t}),\n\t\t\tparentScroll = offsetParent.getScroll();\n\n\t\tif (!offsetParent || offsetParent == element.getDocument().body) return;\n\t\tparentOffset = offsetParent.measure(function(){\n\t\t\tvar position = this.getPosition();\n\t\t\tif (this.getStyle('position') == 'fixed'){\n\t\t\t\tvar scroll = window.getScroll();\n\t\t\t\tposition.x += scroll.x;\n\t\t\t\tposition.y += scroll.y;\n\t\t\t}\n\t\t\treturn position;\n\t\t});\n\n\t\toptions.offset = {\n\t\t\tparentPositioned: offsetParent != document.id(options.relativeTo),\n\t\t\tx: options.offset.x - parentOffset.x + parentScroll.x,\n\t\t\ty: options.offset.y - parentOffset.y + parentScroll.y\n\t\t};\n\t},\n\n\tsetDimensionsOption: function(element, options){\n\t\toptions.dimensions = element.getDimensions({\n\t\t\tcomputeSize: true,\n\t\t\tstyles: ['padding', 'border', 'margin']\n\t\t});\n\t},\n\n\tgetPosition: function(element, options){\n\t\tvar position = {};\n\t\toptions = local.getOptions(element, options);\n\t\tvar relativeTo = document.id(options.relativeTo) || document.body;\n\n\t\tlocal.setPositionCoordinates(options, position, relativeTo);\n\t\tif (options.edge) local.toEdge(position, options);\n\n\t\tvar offset = options.offset;\n\t\tposition.left = ((position.x >= 0 || offset.parentPositioned || options.allowNegative) ? position.x : 0).toInt();\n\t\tposition.top = ((position.y >= 0 || offset.parentPositioned || options.allowNegative) ? position.y : 0).toInt();\n\n\t\tlocal.toMinMax(position, options);\n\n\t\tif (options.relFixedPosition || relativeTo.getStyle('position') == 'fixed') local.toRelFixedPosition(relativeTo, position);\n\t\tif (options.ignoreScroll) local.toIgnoreScroll(relativeTo, position);\n\t\tif (options.ignoreMargins) local.toIgnoreMargins(position, options);\n\n\t\tposition.left = Math.ceil(position.left);\n\t\tposition.top = Math.ceil(position.top);\n\t\tdelete position.x;\n\t\tdelete position.y;\n\n\t\treturn position;\n\t},\n\n\tsetPositionCoordinates: function(options, position, relativeTo){\n\t\tvar offsetY = options.offset.y,\n\t\t\toffsetX = options.offset.x,\n\t\t\tcalc = (relativeTo == document.body) ? window.getScroll() : relativeTo.getPosition(),\n\t\t\ttop = calc.y,\n\t\t\tleft = calc.x,\n\t\t\twinSize = window.getSize();\n\n\t\tswitch(options.position.x){\n\t\t\tcase 'left': position.x = left + offsetX; break;\n\t\t\tcase 'right': position.x = left + offsetX + relativeTo.offsetWidth; break;\n\t\t\tdefault: position.x = left + ((relativeTo == document.body ? winSize.x : relativeTo.offsetWidth) / 2) + offsetX; break;\n\t\t}\n\n\t\tswitch(options.position.y){\n\t\t\tcase 'top': position.y = top + offsetY; break;\n\t\t\tcase 'bottom': position.y = top + offsetY + relativeTo.offsetHeight; break;\n\t\t\tdefault: position.y = top + ((relativeTo == document.body ? winSize.y : relativeTo.offsetHeight) / 2) + offsetY; break;\n\t\t}\n\t},\n\n\ttoMinMax: function(position, options){\n\t\tvar xy = {left: 'x', top: 'y'}, value;\n\t\t['minimum', 'maximum'].each(function(minmax){\n\t\t\t['left', 'top'].each(function(lr){\n\t\t\t\tvalue = options[minmax] ? options[minmax][xy[lr]] : null;\n\t\t\t\tif (value != null && ((minmax == 'minimum') ? position[lr] < value : position[lr] > value)) position[lr] = value;\n\t\t\t});\n\t\t});\n\t},\n\n\ttoRelFixedPosition: function(relativeTo, position){\n\t\tvar winScroll = window.getScroll();\n\t\tposition.top += winScroll.y;\n\t\tposition.left += winScroll.x;\n\t},\n\n\ttoIgnoreScroll: function(relativeTo, position){\n\t\tvar relScroll = relativeTo.getScroll();\n\t\tposition.top -= relScroll.y;\n\t\tposition.left -= relScroll.x;\n\t},\n\n\ttoIgnoreMargins: function(position, options){\n\t\tposition.left += options.edge.x == 'right'\n\t\t\t? options.dimensions['margin-right']\n\t\t\t: (options.edge.x != 'center'\n\t\t\t\t? -options.dimensions['margin-left']\n\t\t\t\t: -options.dimensions['margin-left'] + ((options.dimensions['margin-right'] + options.dimensions['margin-left']) / 2));\n\n\t\tposition.top += options.edge.y == 'bottom'\n\t\t\t? options.dimensions['margin-bottom']\n\t\t\t: (options.edge.y != 'center'\n\t\t\t\t? -options.dimensions['margin-top']\n\t\t\t\t: -options.dimensions['margin-top'] + ((options.dimensions['margin-bottom'] + options.dimensions['margin-top']) / 2));\n\t},\n\n\ttoEdge: function(position, options){\n\t\tvar edgeOffset = {},\n\t\t\tdimensions = options.dimensions,\n\t\t\tedge = options.edge;\n\n\t\tswitch(edge.x){\n\t\t\tcase 'left': edgeOffset.x = 0; break;\n\t\t\tcase 'right': edgeOffset.x = -dimensions.x - dimensions.computedRight - dimensions.computedLeft; break;\n\t\t\t// center\n\t\t\tdefault: edgeOffset.x = -(Math.round(dimensions.totalWidth / 2)); break;\n\t\t}\n\n\t\tswitch(edge.y){\n\t\t\tcase 'top': edgeOffset.y = 0; break;\n\t\t\tcase 'bottom': edgeOffset.y = -dimensions.y - dimensions.computedTop - dimensions.computedBottom; break;\n\t\t\t// center\n\t\t\tdefault: edgeOffset.y = -(Math.round(dimensions.totalHeight / 2)); break;\n\t\t}\n\n\t\tposition.x += edgeOffset.x;\n\t\tposition.y += edgeOffset.y;\n\t},\n\n\tgetCoordinateFromValue: function(option){\n\t\tif (typeOf(option) != 'string') return option;\n\t\toption = option.toLowerCase();\n\n\t\treturn {\n\t\t\tx: option.test('left') ? 'left'\n\t\t\t\t: (option.test('right') ? 'right' : 'center'),\n\t\t\ty: option.test(/upper|top/) ? 'top'\n\t\t\t\t: (option.test('bottom') ? 'bottom' : 'center')\n\t\t};\n\t}\n\n};\n\nElement.implement({\n\n\tposition: function(options){\n\t\tif (options && (options.x != null || options.y != null)){\n\t\t\treturn (original ? original.apply(this, arguments) : this);\n\t\t}\n\t\tvar position = this.setStyle('position', 'absolute').calculatePosition(options);\n\t\treturn (options && options.returnPos) ? position : this.setStyles(position);\n\t},\n\n\tcalculatePosition: function(options){\n\t\treturn local.getPosition(this, options);\n\t}\n\n});\n\n})(Element.prototype.position);\n\n\n/*\n---\n\nscript: Element.Shortcuts.js\n\nname: Element.Shortcuts\n\ndescription: Extends the Element native object to include some shortcut methods.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Element.Style\n - /MooTools.More\n\nprovides: [Element.Shortcuts]\n\n...\n*/\n\nElement.implement({\n\n\tisDisplayed: function(){\n\t\treturn this.getStyle('display') != 'none';\n\t},\n\n\tisVisible: function(){\n\t\tvar w = this.offsetWidth,\n\t\t\th = this.offsetHeight;\n\t\treturn (w == 0 && h == 0) ? false : (w > 0 && h > 0) ? true : this.style.display != 'none';\n\t},\n\n\ttoggle: function(){\n\t\treturn this[this.isDisplayed() ? 'hide' : 'show']();\n\t},\n\n\thide: function(){\n\t\tvar d;\n\t\ttry {\n\t\t\t//IE fails here if the element is not in the dom\n\t\t\td = this.getStyle('display');\n\t\t} catch(e){}\n\t\tif (d == 'none') return this;\n\t\treturn this.store('element:_originalDisplay', d || '').setStyle('display', 'none');\n\t},\n\n\tshow: function(display){\n\t\tif (!display && this.isDisplayed()) return this;\n\t\tdisplay = display || this.retrieve('element:_originalDisplay') || 'block';\n\t\treturn this.setStyle('display', (display == 'none') ? 'block' : display);\n\t},\n\n\tswapClass: function(remove, add){\n\t\treturn this.removeClass(remove).addClass(add);\n\t}\n\n});\n\nDocument.implement({\n\n\tclearSelection: function(){\n\t\tif (window.getSelection){\n\t\t\tvar selection = window.getSelection();\n\t\t\tif (selection && selection.removeAllRanges) selection.removeAllRanges();\n\t\t} else if (document.selection && document.selection.empty){\n\t\t\ttry {\n\t\t\t\t//IE fails here if selected element is not in dom\n\t\t\t\tdocument.selection.empty();\n\t\t\t} catch(e){}\n\t\t}\n\t}\n\n});\n\n\n/*\n---\n\nscript: IframeShim.js\n\nname: IframeShim\n\ndescription: Defines IframeShim, a class for obscuring select lists and flash objects in IE.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Element.Event\n - Core/Element.Style\n - Core/Options\n - Core/Events\n - /Element.Position\n - /Class.Occlude\n\nprovides: [IframeShim]\n\n...\n*/\n\nvar IframeShim = new Class({\n\n\tImplements: [Options, Events, Class.Occlude],\n\n\toptions: {\n\t\tclassName: 'iframeShim',\n\t\tsrc: 'javascript:false;document.write(\"\");',\n\t\tdisplay: false,\n\t\tzIndex: null,\n\t\tmargin: 0,\n\t\toffset: {x: 0, y: 0},\n\t\tbrowsers: (Browser.ie6 || (Browser.firefox && Browser.version < 3 && Browser.Platform.mac))\n\t},\n\n\tproperty: 'IframeShim',\n\n\tinitialize: function(element, options){\n\t\tthis.element = document.id(element);\n\t\tif (this.occlude()) return this.occluded;\n\t\tthis.setOptions(options);\n\t\tthis.makeShim();\n\t\treturn this;\n\t},\n\n\tmakeShim: function(){\n\t\tif (this.options.browsers){\n\t\t\tvar zIndex = this.element.getStyle('zIndex').toInt();\n\n\t\t\tif (!zIndex){\n\t\t\t\tzIndex = 1;\n\t\t\t\tvar pos = this.element.getStyle('position');\n\t\t\t\tif (pos == 'static' || !pos) this.element.setStyle('position', 'relative');\n\t\t\t\tthis.element.setStyle('zIndex', zIndex);\n\t\t\t}\n\t\t\tzIndex = ((this.options.zIndex != null || this.options.zIndex === 0) && zIndex > this.options.zIndex) ? this.options.zIndex : zIndex - 1;\n\t\t\tif (zIndex < 0) zIndex = 1;\n\t\t\tthis.shim = new Element('iframe', {\n\t\t\t\tsrc: this.options.src,\n\t\t\t\tscrolling: 'no',\n\t\t\t\tframeborder: 0,\n\t\t\t\tstyles: {\n\t\t\t\t\tzIndex: zIndex,\n\t\t\t\t\tposition: 'absolute',\n\t\t\t\t\tborder: 'none',\n\t\t\t\t\tfilter: 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0)'\n\t\t\t\t},\n\t\t\t\t'class': this.options.className\n\t\t\t}).store('IframeShim', this);\n\t\t\tvar inject = (function(){\n\t\t\t\tthis.shim.inject(this.element, 'after');\n\t\t\t\tthis[this.options.display ? 'show' : 'hide']();\n\t\t\t\tthis.fireEvent('inject');\n\t\t\t}).bind(this);\n\t\t\tif (!IframeShim.ready) window.addEvent('load', inject);\n\t\t\telse inject();\n\t\t} else {\n\t\t\tthis.position = this.hide = this.show = this.dispose = Function.from(this);\n\t\t}\n\t},\n\n\tposition: function(){\n\t\tif (!IframeShim.ready || !this.shim) return this;\n\t\tvar size = this.element.measure(function(){\n\t\t\treturn this.getSize();\n\t\t});\n\t\tif (this.options.margin != undefined){\n\t\t\tsize.x = size.x - (this.options.margin * 2);\n\t\t\tsize.y = size.y - (this.options.margin * 2);\n\t\t\tthis.options.offset.x += this.options.margin;\n\t\t\tthis.options.offset.y += this.options.margin;\n\t\t}\n\t\tthis.shim.set({width: size.x, height: size.y}).position({\n\t\t\trelativeTo: this.element,\n\t\t\toffset: this.options.offset\n\t\t});\n\t\treturn this;\n\t},\n\n\thide: function(){\n\t\tif (this.shim) this.shim.setStyle('display', 'none');\n\t\treturn this;\n\t},\n\n\tshow: function(){\n\t\tif (this.shim) this.shim.setStyle('display', 'block');\n\t\treturn this.position();\n\t},\n\n\tdispose: function(){\n\t\tif (this.shim) this.shim.dispose();\n\t\treturn this;\n\t},\n\n\tdestroy: function(){\n\t\tif (this.shim) this.shim.destroy();\n\t\treturn this;\n\t}\n\n});\n\nwindow.addEvent('load', function(){\n\tIframeShim.ready = true;\n});\n\n\n/*\n---\n\nscript: Mask.js\n\nname: Mask\n\ndescription: Creates a mask element to cover another.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Options\n - Core/Events\n - Core/Element.Event\n - /Class.Binds\n - /Element.Position\n - /IframeShim\n\nprovides: [Mask]\n\n...\n*/\n\nvar Mask = new Class({\n\n\tImplements: [Options, Events],\n\n\tBinds: ['position'],\n\n\toptions: {/*\n\t\tonShow: function(){},\n\t\tonHide: function(){},\n\t\tonDestroy: function(){},\n\t\tonClick: function(event){},\n\t\tinject: {\n\t\t\twhere: 'after',\n\t\t\ttarget: null,\n\t\t},\n\t\thideOnClick: false,\n\t\tid: null,\n\t\tdestroyOnHide: false,*/\n\t\tstyle: {},\n\t\t'class': 'mask',\n\t\tmaskMargins: false,\n\t\tuseIframeShim: true,\n\t\tiframeShimOptions: {}\n\t},\n\n\tinitialize: function(target, options){\n\t\tthis.target = document.id(target) || document.id(document.body);\n\t\tthis.target.store('mask', this);\n\t\tthis.setOptions(options);\n\t\tthis.render();\n\t\tthis.inject();\n\t},\n\n\trender: function(){\n\t\tthis.element = new Element('div', {\n\t\t\t'class': this.options['class'],\n\t\t\tid: this.options.id || 'mask-' + String.uniqueID(),\n\t\t\tstyles: Object.merge({}, this.options.style, {\n\t\t\t\tdisplay: 'none'\n\t\t\t}),\n\t\t\tevents: {\n\t\t\t\tclick: function(event){\n\t\t\t\t\tthis.fireEvent('click', event);\n\t\t\t\t\tif (this.options.hideOnClick) this.hide();\n\t\t\t\t}.bind(this)\n\t\t\t}\n\t\t});\n\n\t\tthis.hidden = true;\n\t},\n\n\ttoElement: function(){\n\t\treturn this.element;\n\t},\n\n\tinject: function(target, where){\n\t\twhere = where || (this.options.inject ? this.options.inject.where : '') || this.target == document.body ? 'inside' : 'after';\n\t\ttarget = target || (this.options.inject && this.options.inject.target) || this.target;\n\n\t\tthis.element.inject(target, where);\n\n\t\tif (this.options.useIframeShim){\n\t\t\tthis.shim = new IframeShim(this.element, this.options.iframeShimOptions);\n\n\t\t\tthis.addEvents({\n\t\t\t\tshow: this.shim.show.bind(this.shim),\n\t\t\t\thide: this.shim.hide.bind(this.shim),\n\t\t\t\tdestroy: this.shim.destroy.bind(this.shim)\n\t\t\t});\n\t\t}\n\t},\n\n\tposition: function(){\n\t\tthis.resize(this.options.width, this.options.height);\n\n\t\tthis.element.position({\n\t\t\trelativeTo: this.target,\n\t\t\tposition: 'topLeft',\n\t\t\tignoreMargins: !this.options.maskMargins,\n\t\t\tignoreScroll: this.target == document.body\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tresize: function(x, y){\n\t\tvar opt = {\n\t\t\tstyles: ['padding', 'border']\n\t\t};\n\t\tif (this.options.maskMargins) opt.styles.push('margin');\n\n\t\tvar dim = this.target.getComputedSize(opt);\n\t\tif (this.target == document.body){\n\t\t\tthis.element.setStyles({width: 0, height: 0});\n\t\t\tvar win = window.getScrollSize();\n\t\t\tif (dim.totalHeight < win.y) dim.totalHeight = win.y;\n\t\t\tif (dim.totalWidth < win.x) dim.totalWidth = win.x;\n\t\t}\n\t\tthis.element.setStyles({\n\t\t\twidth: Array.pick([x, dim.totalWidth, dim.x]),\n\t\t\theight: Array.pick([y, dim.totalHeight, dim.y])\n\t\t});\n\n\t\treturn this;\n\t},\n\n\tshow: function(){\n\t\tif (!this.hidden) return this;\n\n\t\twindow.addEvent('resize', this.position);\n\t\tthis.position();\n\t\tthis.showMask.apply(this, arguments);\n\n\t\treturn this;\n\t},\n\n\tshowMask: function(){\n\t\tthis.element.setStyle('display', 'block');\n\t\tthis.hidden = false;\n\t\tthis.fireEvent('show');\n\t},\n\n\thide: function(){\n\t\tif (this.hidden) return this;\n\n\t\twindow.removeEvent('resize', this.position);\n\t\tthis.hideMask.apply(this, arguments);\n\t\tif (this.options.destroyOnHide) return this.destroy();\n\n\t\treturn this;\n\t},\n\n\thideMask: function(){\n\t\tthis.element.setStyle('display', 'none');\n\t\tthis.hidden = true;\n\t\tthis.fireEvent('hide');\n\t},\n\n\ttoggle: function(){\n\t\tthis[this.hidden ? 'show' : 'hide']();\n\t},\n\n\tdestroy: function(){\n\t\tthis.hide();\n\t\tthis.element.destroy();\n\t\tthis.fireEvent('destroy');\n\t\tthis.target.eliminate('mask');\n\t}\n\n});\n\nElement.Properties.mask = {\n\n\tset: function(options){\n\t\tvar mask = this.retrieve('mask');\n\t\tif (mask) mask.destroy();\n\t\treturn this.eliminate('mask').store('mask:options', options);\n\t},\n\n\tget: function(){\n\t\tvar mask = this.retrieve('mask');\n\t\tif (!mask){\n\t\t\tmask = new Mask(this, this.retrieve('mask:options'));\n\t\t\tthis.store('mask', mask);\n\t\t}\n\t\treturn mask;\n\t}\n\n};\n\nElement.implement({\n\n\tmask: function(options){\n\t\tif (options) this.set('mask', options);\n\t\tthis.get('mask').show();\n\t\treturn this;\n\t},\n\n\tunmask: function(){\n\t\tthis.get('mask').hide();\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Spinner.js\n\nname: Spinner\n\ndescription: Adds a semi-transparent overlay over a dom element with a spinnin ajax icon.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Fx.Tween\n - Core/Request\n - /Class.refactor\n - /Mask\n\nprovides: [Spinner]\n\n...\n*/\n\nvar Spinner = new Class({\n\n\tExtends: Mask,\n\n\tImplements: Chain,\n\n\toptions: {/*\n\t\tmessage: false,*/\n\t\t'class': 'spinner',\n\t\tcontainerPosition: {},\n\t\tcontent: {\n\t\t\t'class': 'spinner-content'\n\t\t},\n\t\tmessageContainer: {\n\t\t\t'class': 'spinner-msg'\n\t\t},\n\t\timg: {\n\t\t\t'class': 'spinner-img'\n\t\t},\n\t\tfxOptions: {\n\t\t\tlink: 'chain'\n\t\t}\n\t},\n\n\tinitialize: function(target, options){\n\t\tthis.target = document.id(target) || document.id(document.body);\n\t\tthis.target.store('spinner', this);\n\t\tthis.setOptions(options);\n\t\tthis.render();\n\t\tthis.inject();\n\n\t\t// Add this to events for when noFx is true; parent methods handle hide/show.\n\t\tvar deactivate = function(){ this.active = false; }.bind(this);\n\t\tthis.addEvents({\n\t\t\thide: deactivate,\n\t\t\tshow: deactivate\n\t\t});\n\t},\n\n\trender: function(){\n\t\tthis.parent();\n\n\t\tthis.element.set('id', this.options.id || 'spinner-' + String.uniqueID());\n\n\t\tthis.content = document.id(this.options.content) || new Element('div', this.options.content);\n\t\tthis.content.inject(this.element);\n\n\t\tif (this.options.message){\n\t\t\tthis.msg = document.id(this.options.message) || new Element('p', this.options.messageContainer).appendText(this.options.message);\n\t\t\tthis.msg.inject(this.content);\n\t\t}\n\n\t\tif (this.options.img){\n\t\t\tthis.img = document.id(this.options.img) || new Element('div', this.options.img);\n\t\t\tthis.img.inject(this.content);\n\t\t}\n\n\t\tthis.element.set('tween', this.options.fxOptions);\n\t},\n\n\tshow: function(noFx){\n\t\tif (this.active) return this.chain(this.show.bind(this));\n\t\tif (!this.hidden){\n\t\t\tthis.callChain.delay(20, this);\n\t\t\treturn this;\n\t\t}\n\n\t\tthis.active = true;\n\n\t\treturn this.parent(noFx);\n\t},\n\n\tshowMask: function(noFx){\n\t\tvar pos = function(){\n\t\t\tthis.content.position(Object.merge({\n\t\t\t\trelativeTo: this.element\n\t\t\t}, this.options.containerPosition));\n\t\t}.bind(this);\n\n\t\tif (noFx){\n\t\t\tthis.parent();\n\t\t\tpos();\n\t\t} else {\n\t\t\tif (!this.options.style.opacity) this.options.style.opacity = this.element.getStyle('opacity').toFloat();\n\t\t\tthis.element.setStyles({\n\t\t\t\tdisplay: 'block',\n\t\t\t\topacity: 0\n\t\t\t}).tween('opacity', this.options.style.opacity);\n\t\t\tpos();\n\t\t\tthis.hidden = false;\n\t\t\tthis.fireEvent('show');\n\t\t\tthis.callChain();\n\t\t}\n\t},\n\n\thide: function(noFx){\n\t\tif (this.active) return this.chain(this.hide.bind(this));\n\t\tif (this.hidden){\n\t\t\tthis.callChain.delay(20, this);\n\t\t\treturn this;\n\t\t}\n\t\tthis.active = true;\n\t\treturn this.parent(noFx);\n\t},\n\n\thideMask: function(noFx){\n\t\tif (noFx) return this.parent();\n\t\tthis.element.tween('opacity', 0).get('tween').chain(function(){\n\t\t\tthis.element.setStyle('display', 'none');\n\t\t\tthis.hidden = true;\n\t\t\tthis.fireEvent('hide');\n\t\t\tthis.callChain();\n\t\t}.bind(this));\n\t},\n\n\tdestroy: function(){\n\t\tthis.content.destroy();\n\t\tthis.parent();\n\t\tthis.target.eliminate('spinner');\n\t}\n\n});\n\nRequest = Class.refactor(Request, {\n\n\toptions: {\n\t\tuseSpinner: false,\n\t\tspinnerOptions: {},\n\t\tspinnerTarget: false\n\t},\n\n\tinitialize: function(options){\n\t\tthis._send = this.send;\n\t\tthis.send = function(options){\n\t\t\tvar spinner = this.getSpinner();\n\t\t\tif (spinner) spinner.chain(this._send.pass(options, this)).show();\n\t\t\telse this._send(options);\n\t\t\treturn this;\n\t\t};\n\t\tthis.previous(options);\n\t},\n\n\tgetSpinner: function(){\n\t\tif (!this.spinner){\n\t\t\tvar update = document.id(this.options.spinnerTarget) || document.id(this.options.update);\n\t\t\tif (this.options.useSpinner && update){\n\t\t\t\tupdate.set('spinner', this.options.spinnerOptions);\n\t\t\t\tvar spinner = this.spinner = update.get('spinner');\n\t\t\t\t['complete', 'exception', 'cancel'].each(function(event){\n\t\t\t\t\tthis.addEvent(event, spinner.hide.bind(spinner));\n\t\t\t\t}, this);\n\t\t\t}\n\t\t}\n\t\treturn this.spinner;\n\t}\n\n});\n\nElement.Properties.spinner = {\n\n\tset: function(options){\n\t\tvar spinner = this.retrieve('spinner');\n\t\tif (spinner) spinner.destroy();\n\t\treturn this.eliminate('spinner').store('spinner:options', options);\n\t},\n\n\tget: function(){\n\t\tvar spinner = this.retrieve('spinner');\n\t\tif (!spinner){\n\t\t\tspinner = new Spinner(this, this.retrieve('spinner:options'));\n\t\t\tthis.store('spinner', spinner);\n\t\t}\n\t\treturn spinner;\n\t}\n\n};\n\nElement.implement({\n\n\tspin: function(options){\n\t\tif (options) this.set('spinner', options);\n\t\tthis.get('spinner').show();\n\t\treturn this;\n\t},\n\n\tunspin: function(){\n\t\tthis.get('spinner').hide();\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Form.Request.js\n\nname: Form.Request\n\ndescription: Handles the basic functionality of submitting a form and updating a dom element with the result.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Request.HTML\n - /Class.Binds\n - /Class.Occlude\n - /Spinner\n - /String.QueryString\n - /Element.Delegation\n\nprovides: [Form.Request]\n\n...\n*/\n\nif (!window.Form) window.Form = {};\n\n(function(){\n\n\tForm.Request = new Class({\n\n\t\tBinds: ['onSubmit', 'onFormValidate'],\n\n\t\tImplements: [Options, Events, Class.Occlude],\n\n\t\toptions: {/*\n\t\t\tonFailure: function(){},\n\t\t\tonSuccess: function(){}, // aliased to onComplete,\n\t\t\tonSend: function(){}*/\n\t\t\trequestOptions: {\n\t\t\t\tevalScripts: true,\n\t\t\t\tuseSpinner: true,\n\t\t\t\temulation: false,\n\t\t\t\tlink: 'ignore'\n\t\t\t},\n\t\t\tsendButtonClicked: true,\n\t\t\textraData: {},\n\t\t\tresetForm: true\n\t\t},\n\n\t\tproperty: 'form.request',\n\n\t\tinitialize: function(form, target, options){\n\t\t\tthis.element = document.id(form);\n\t\t\tif (this.occlude()) return this.occluded;\n\t\t\tthis.setOptions(options)\n\t\t\t\t.setTarget(target)\n\t\t\t\t.attach();\n\t\t},\n\n\t\tsetTarget: function(target){\n\t\t\tthis.target = document.id(target);\n\t\t\tif (!this.request){\n\t\t\t\tthis.makeRequest();\n\t\t\t} else {\n\t\t\t\tthis.request.setOptions({\n\t\t\t\t\tupdate: this.target\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn this;\n\t\t},\n\n\t\ttoElement: function(){\n\t\t\treturn this.element;\n\t\t},\n\n\t\tmakeRequest: function(){\n\t\t\tvar self = this;\n\t\t\tthis.request = new Request.HTML(Object.merge({\n\t\t\t\t\tupdate: this.target,\n\t\t\t\t\temulation: false,\n\t\t\t\t\tspinnerTarget: this.element,\n\t\t\t\t\tmethod: this.element.get('method') || 'post'\n\t\t\t}, this.options.requestOptions)).addEvents({\n\t\t\t\tsuccess: function(tree, elements, html, javascript){\n\t\t\t\t\t['complete', 'success'].each(function(evt){\n\t\t\t\t\t\tself.fireEvent(evt, [self.target, tree, elements, html, javascript]);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tfailure: function(){\n\t\t\t\t\tself.fireEvent('complete', arguments).fireEvent('failure', arguments);\n\t\t\t\t},\n\t\t\t\texception: function(){\n\t\t\t\t\tself.fireEvent('failure', arguments);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn this.attachReset();\n\t\t},\n\n\t\tattachReset: function(){\n\t\t\tif (!this.options.resetForm) return this;\n\t\t\tthis.request.addEvent('success', function(){\n\t\t\t\tFunction.attempt(function(){\n\t\t\t\t\tthis.element.reset();\n\t\t\t\t}.bind(this));\n\t\t\t\tif (window.OverText) OverText.update();\n\t\t\t}.bind(this));\n\t\t\treturn this;\n\t\t},\n\n\t\tattach: function(attach){\n\t\t\tvar method = (attach != false) ? 'addEvent' : 'removeEvent';\n\t\t\tthis.element[method]('click:relay(button, input[type=submit])', this.saveClickedButton.bind(this));\n\n\t\t\tvar fv = this.element.retrieve('validator');\n\t\t\tif (fv) fv[method]('onFormValidate', this.onFormValidate);\n\t\t\telse this.element[method]('submit', this.onSubmit);\n\n\t\t\treturn this;\n\t\t},\n\n\t\tdetach: function(){\n\t\t\treturn this.attach(false);\n\t\t},\n\n\t\t//public method\n\t\tenable: function(){\n\t\t\treturn this.attach();\n\t\t},\n\n\t\t//public method\n\t\tdisable: function(){\n\t\t\treturn this.detach();\n\t\t},\n\n\t\tonFormValidate: function(valid, form, event){\n\t\t\t//if there's no event, then this wasn't a submit event\n\t\t\tif (!event) return;\n\t\t\tvar fv = this.element.retrieve('validator');\n\t\t\tif (valid || (fv && !fv.options.stopOnFailure)){\n\t\t\t\tevent.stop();\n\t\t\t\tthis.send();\n\t\t\t}\n\t\t},\n\n\t\tonSubmit: function(event){\n\t\t\tvar fv = this.element.retrieve('validator');\n\t\t\tif (fv){\n\t\t\t\t//form validator was created after Form.Request\n\t\t\t\tthis.element.removeEvent('submit', this.onSubmit);\n\t\t\t\tfv.addEvent('onFormValidate', this.onFormValidate);\n\t\t\t\tthis.element.validate();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (event) event.stop();\n\t\t\tthis.send();\n\t\t},\n\n\t\tsaveClickedButton: function(event, target){\n\t\t\tvar targetName = target.get('name');\n\t\t\tif (!targetName || !this.options.sendButtonClicked) return;\n\t\t\tthis.options.extraData[targetName] = target.get('value') || true;\n\t\t\tthis.clickedCleaner = function(){\n\t\t\t\tdelete this.options.extraData[targetName];\n\t\t\t\tthis.clickedCleaner = function(){};\n\t\t\t}.bind(this);\n\t\t},\n\n\t\tclickedCleaner: function(){},\n\n\t\tsend: function(){\n\t\t\tvar str = this.element.toQueryString().trim(),\n\t\t\t\tdata = Object.toQueryString(this.options.extraData);\n\n\t\t\tif (str) str += \"&\" + data;\n\t\t\telse str = data;\n\n\t\t\tthis.fireEvent('send', [this.element, str.parseQueryString()]);\n\t\t\tthis.request.send({\n\t\t\t\tdata: str,\n\t\t\t\turl: this.options.requestOptions.url || this.element.get('action')\n\t\t\t});\n\t\t\tthis.clickedCleaner();\n\t\t\treturn this;\n\t\t}\n\n\t});\n\n\tElement.implement('formUpdate', function(update, options){\n\t\tvar fq = this.retrieve('form.request');\n\t\tif (!fq){\n\t\t\tfq = new Form.Request(this, update, options);\n\t\t} else {\n\t\t\tif (update) fq.setTarget(update);\n\t\t\tif (options) fq.setOptions(options).makeRequest();\n\t\t}\n\t\tfq.send();\n\t\treturn this;\n\t});\n\n})();\n\n\n/*\n---\n\nscript: Fx.Reveal.js\n\nname: Fx.Reveal\n\ndescription: Defines Fx.Reveal, a class that shows and hides elements with a transition.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Fx.Morph\n - /Element.Shortcuts\n - /Element.Measure\n\nprovides: [Fx.Reveal]\n\n...\n*/\n\n(function(){\n\n\nvar hideTheseOf = function(object){\n\tvar hideThese = object.options.hideInputs;\n\tif (window.OverText){\n\t\tvar otClasses = [null];\n\t\tOverText.each(function(ot){\n\t\t\totClasses.include('.' + ot.options.labelClass);\n\t\t});\n\t\tif (otClasses) hideThese += otClasses.join(', ');\n\t}\n\treturn (hideThese) ? object.element.getElements(hideThese) : null;\n};\n\n\nFx.Reveal = new Class({\n\n\tExtends: Fx.Morph,\n\n\toptions: {/*\n\t\tonShow: function(thisElement){},\n\t\tonHide: function(thisElement){},\n\t\tonComplete: function(thisElement){},\n\t\theightOverride: null,\n\t\twidthOverride: null,*/\n\t\tlink: 'cancel',\n\t\tstyles: ['padding', 'border', 'margin'],\n\t\ttransitionOpacity: !Browser.ie6,\n\t\tmode: 'vertical',\n\t\tdisplay: function(){\n\t\t\treturn this.element.get('tag') != 'tr' ? 'block' : 'table-row';\n\t\t},\n\t\topacity: 1,\n\t\thideInputs: Browser.ie ? 'select, input, textarea, object, embed' : null\n\t},\n\n\tdissolve: function(){\n\t\tif (!this.hiding && !this.showing){\n\t\t\tif (this.element.getStyle('display') != 'none'){\n\t\t\t\tthis.hiding = true;\n\t\t\t\tthis.showing = false;\n\t\t\t\tthis.hidden = true;\n\t\t\t\tthis.cssText = this.element.style.cssText;\n\n\t\t\t\tvar startStyles = this.element.getComputedSize({\n\t\t\t\t\tstyles: this.options.styles,\n\t\t\t\t\tmode: this.options.mode\n\t\t\t\t});\n\t\t\t\tif (this.options.transitionOpacity) startStyles.opacity = this.options.opacity;\n\n\t\t\t\tvar zero = {};\n\t\t\t\tObject.each(startStyles, function(style, name){\n\t\t\t\t\tzero[name] = [style, 0];\n\t\t\t\t});\n\n\t\t\t\tthis.element.setStyles({\n\t\t\t\t\tdisplay: Function.from(this.options.display).call(this),\n\t\t\t\t\toverflow: 'hidden'\n\t\t\t\t});\n\n\t\t\t\tvar hideThese = hideTheseOf(this);\n\t\t\t\tif (hideThese) hideThese.setStyle('visibility', 'hidden');\n\n\t\t\t\tthis.$chain.unshift(function(){\n\t\t\t\t\tif (this.hidden){\n\t\t\t\t\t\tthis.hiding = false;\n\t\t\t\t\t\tthis.element.style.cssText = this.cssText;\n\t\t\t\t\t\tthis.element.setStyle('display', 'none');\n\t\t\t\t\t\tif (hideThese) hideThese.setStyle('visibility', 'visible');\n\t\t\t\t\t}\n\t\t\t\t\tthis.fireEvent('hide', this.element);\n\t\t\t\t\tthis.callChain();\n\t\t\t\t}.bind(this));\n\n\t\t\t\tthis.start(zero);\n\t\t\t} else {\n\t\t\t\tthis.callChain.delay(10, this);\n\t\t\t\tthis.fireEvent('complete', this.element);\n\t\t\t\tthis.fireEvent('hide', this.element);\n\t\t\t}\n\t\t} else if (this.options.link == 'chain'){\n\t\t\tthis.chain(this.dissolve.bind(this));\n\t\t} else if (this.options.link == 'cancel' && !this.hiding){\n\t\t\tthis.cancel();\n\t\t\tthis.dissolve();\n\t\t}\n\t\treturn this;\n\t},\n\n\treveal: function(){\n\t\tif (!this.showing && !this.hiding){\n\t\t\tif (this.element.getStyle('display') == 'none'){\n\t\t\t\tthis.hiding = false;\n\t\t\t\tthis.showing = true;\n\t\t\t\tthis.hidden = false;\n\t\t\t\tthis.cssText = this.element.style.cssText;\n\n\t\t\t\tvar startStyles;\n\t\t\t\tthis.element.measure(function(){\n\t\t\t\t\tstartStyles = this.element.getComputedSize({\n\t\t\t\t\t\tstyles: this.options.styles,\n\t\t\t\t\t\tmode: this.options.mode\n\t\t\t\t\t});\n\t\t\t\t}.bind(this));\n\t\t\t\tif (this.options.heightOverride != null) startStyles.height = this.options.heightOverride.toInt();\n\t\t\t\tif (this.options.widthOverride != null) startStyles.width = this.options.widthOverride.toInt();\n\t\t\t\tif (this.options.transitionOpacity){\n\t\t\t\t\tthis.element.setStyle('opacity', 0);\n\t\t\t\t\tstartStyles.opacity = this.options.opacity;\n\t\t\t\t}\n\n\t\t\t\tvar zero = {\n\t\t\t\t\theight: 0,\n\t\t\t\t\tdisplay: Function.from(this.options.display).call(this)\n\t\t\t\t};\n\t\t\t\tObject.each(startStyles, function(style, name){\n\t\t\t\t\tzero[name] = 0;\n\t\t\t\t});\n\t\t\t\tzero.overflow = 'hidden';\n\n\t\t\t\tthis.element.setStyles(zero);\n\n\t\t\t\tvar hideThese = hideTheseOf(this);\n\t\t\t\tif (hideThese) hideThese.setStyle('visibility', 'hidden');\n\n\t\t\t\tthis.$chain.unshift(function(){\n\t\t\t\t\tthis.element.style.cssText = this.cssText;\n\t\t\t\t\tthis.element.setStyle('display', Function.from(this.options.display).call(this));\n\t\t\t\t\tif (!this.hidden) this.showing = false;\n\t\t\t\t\tif (hideThese) hideThese.setStyle('visibility', 'visible');\n\t\t\t\t\tthis.callChain();\n\t\t\t\t\tthis.fireEvent('show', this.element);\n\t\t\t\t}.bind(this));\n\n\t\t\t\tthis.start(startStyles);\n\t\t\t} else {\n\t\t\t\tthis.callChain();\n\t\t\t\tthis.fireEvent('complete', this.element);\n\t\t\t\tthis.fireEvent('show', this.element);\n\t\t\t}\n\t\t} else if (this.options.link == 'chain'){\n\t\t\tthis.chain(this.reveal.bind(this));\n\t\t} else if (this.options.link == 'cancel' && !this.showing){\n\t\t\tthis.cancel();\n\t\t\tthis.reveal();\n\t\t}\n\t\treturn this;\n\t},\n\n\ttoggle: function(){\n\t\tif (this.element.getStyle('display') == 'none'){\n\t\t\tthis.reveal();\n\t\t} else {\n\t\t\tthis.dissolve();\n\t\t}\n\t\treturn this;\n\t},\n\n\tcancel: function(){\n\t\tthis.parent.apply(this, arguments);\n\t\tif (this.cssText != null) this.element.style.cssText = this.cssText;\n\t\tthis.hiding = false;\n\t\tthis.showing = false;\n\t\treturn this;\n\t}\n\n});\n\nElement.Properties.reveal = {\n\n\tset: function(options){\n\t\tthis.get('reveal').cancel().setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar reveal = this.retrieve('reveal');\n\t\tif (!reveal){\n\t\t\treveal = new Fx.Reveal(this);\n\t\t\tthis.store('reveal', reveal);\n\t\t}\n\t\treturn reveal;\n\t}\n\n};\n\nElement.Properties.dissolve = Element.Properties.reveal;\n\nElement.implement({\n\n\treveal: function(options){\n\t\tthis.get('reveal').setOptions(options).reveal();\n\t\treturn this;\n\t},\n\n\tdissolve: function(options){\n\t\tthis.get('reveal').setOptions(options).dissolve();\n\t\treturn this;\n\t},\n\n\tnix: function(options){\n\t\tvar params = Array.link(arguments, {destroy: Type.isBoolean, options: Type.isObject});\n\t\tthis.get('reveal').setOptions(options).dissolve().chain(function(){\n\t\t\tthis[params.destroy ? 'destroy' : 'dispose']();\n\t\t}.bind(this));\n\t\treturn this;\n\t},\n\n\twink: function(){\n\t\tvar params = Array.link(arguments, {duration: Type.isNumber, options: Type.isObject});\n\t\tvar reveal = this.get('reveal').setOptions(params.options);\n\t\treveal.reveal().chain(function(){\n\t\t\t(function(){\n\t\t\t\treveal.dissolve();\n\t\t\t}).delay(params.duration || 2000);\n\t\t});\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nscript: Form.Request.Append.js\n\nname: Form.Request.Append\n\ndescription: Handles the basic functionality of submitting a form and updating a dom element with the result. The result is appended to the DOM element instead of replacing its contents.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - /Form.Request\n - /Fx.Reveal\n - /Elements.from\n\nprovides: [Form.Request.Append]\n\n...\n*/\n\nForm.Request.Append = new Class({\n\n\tExtends: Form.Request,\n\n\toptions: {\n\t\t//onBeforeEffect: function(){},\n\t\tuseReveal: true,\n\t\trevealOptions: {},\n\t\tinject: 'bottom'\n\t},\n\n\tmakeRequest: function(){\n\t\tthis.request = new Request.HTML(Object.merge({\n\t\t\t\turl: this.element.get('action'),\n\t\t\t\tmethod: this.element.get('method') || 'post',\n\t\t\t\tspinnerTarget: this.element\n\t\t\t}, this.options.requestOptions, {\n\t\t\t\tevalScripts: false\n\t\t\t})\n\t\t).addEvents({\n\t\t\tsuccess: function(tree, elements, html, javascript){\n\t\t\t\tvar container;\n\t\t\t\tvar kids = Elements.from(html);\n\t\t\t\tif (kids.length == 1){\n\t\t\t\t\tcontainer = kids[0];\n\t\t\t\t} else {\n\t\t\t\t\t container = new Element('div', {\n\t\t\t\t\t\tstyles: {\n\t\t\t\t\t\t\tdisplay: 'none'\n\t\t\t\t\t\t}\n\t\t\t\t\t}).adopt(kids);\n\t\t\t\t}\n\t\t\t\tcontainer.inject(this.target, this.options.inject);\n\t\t\t\tif (this.options.requestOptions.evalScripts) Browser.exec(javascript);\n\t\t\t\tthis.fireEvent('beforeEffect', container);\n\t\t\t\tvar finish = function(){\n\t\t\t\t\tthis.fireEvent('success', [container, this.target, tree, elements, html, javascript]);\n\t\t\t\t}.bind(this);\n\t\t\t\tif (this.options.useReveal){\n\t\t\t\t\tcontainer.set('reveal', this.options.revealOptions).get('reveal').chain(finish);\n\t\t\t\t\tcontainer.reveal();\n\t\t\t\t} else {\n\t\t\t\t\tfinish();\n\t\t\t\t}\n\t\t\t}.bind(this),\n\t\t\tfailure: function(xhr){\n\t\t\t\tthis.fireEvent('failure', xhr);\n\t\t\t}.bind(this)\n\t\t});\n\t\tthis.attachReset();\n\t}\n\n});\n\n\n/*\n---\n\nname: Locale.en-US.Form.Validator\n\ndescription: Form Validator messages for English.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - /Locale\n\nprovides: [Locale.en-US.Form.Validator]\n\n...\n*/\n\nLocale.define('en-US', 'FormValidator', {\n\n\trequired: 'This field is required.',\n\tlength: 'Please enter {length} characters (you entered {elLength} characters)',\n\tminLength: 'Please enter at least {minLength} characters (you entered {length} characters).',\n\tmaxLength: 'Please enter no more than {maxLength} characters (you entered {length} characters).',\n\tinteger: 'Please enter an integer in this field. Numbers with decimals (e.g. 1.25) are not permitted.',\n\tnumeric: 'Please enter only numeric values in this field (i.e. \"1\" or \"1.1\" or \"-1\" or \"-1.1\").',\n\tdigits: 'Please use numbers and punctuation only in this field (for example, a phone number with dashes or dots is permitted).',\n\talpha: 'Please use only letters (a-z) within this field. No spaces or other characters are allowed.',\n\talphanum: 'Please use only letters (a-z) or numbers (0-9) in this field. No spaces or other characters are allowed.',\n\tdateSuchAs: 'Please enter a valid date such as {date}',\n\tdateInFormatMDY: 'Please enter a valid date such as MM/DD/YYYY (i.e. \"12/31/1999\")',\n\temail: 'Please enter a valid email address. For example \"fred@domain.com\".',\n\turl: 'Please enter a valid URL such as http://www.example.com.',\n\tcurrencyDollar: 'Please enter a valid $ amount. For example $100.00 .',\n\toneRequired: 'Please enter something for at least one of these inputs.',\n\terrorPrefix: 'Error: ',\n\twarningPrefix: 'Warning: ',\n\n\t// Form.Validator.Extras\n\tnoSpace: 'There can be no spaces in this input.',\n\treqChkByNode: 'No items are selected.',\n\trequiredChk: 'This field is required.',\n\treqChkByName: 'Please select a {label}.',\n\tmatch: 'This field needs to match the {matchName} field',\n\tstartDate: 'the start date',\n\tendDate: 'the end date',\n\tcurrendDate: 'the current date',\n\tafterDate: 'The date should be the same or after {label}.',\n\tbeforeDate: 'The date should be the same or before {label}.',\n\tstartMonth: 'Please select a start month',\n\tsameMonth: 'These two dates must be in the same month - you must change one or the other.',\n\tcreditcard: 'The credit card number entered is invalid. Please check the number and try again. {length} digits entered.'\n\n});\n\n\n/*\n---\n\nscript: Form.Validator.js\n\nname: Form.Validator\n\ndescription: A css-class based form validation system.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Options\n - Core/Events\n - Core/Slick.Finder\n - Core/Element.Event\n - Core/Element.Style\n - Core/JSON\n - /Locale\n - /Class.Binds\n - /Date\n - /Element.Forms\n - /Locale.en-US.Form.Validator\n - /Element.Shortcuts\n\nprovides: [Form.Validator, InputValidator, FormValidator.BaseValidators]\n\n...\n*/\nif (!window.Form) window.Form = {};\n\nvar InputValidator = this.InputValidator = new Class({\n\n\tImplements: [Options],\n\n\toptions: {\n\t\terrorMsg: 'Validation failed.',\n\t\ttest: Function.from(true)\n\t},\n\n\tinitialize: function(className, options){\n\t\tthis.setOptions(options);\n\t\tthis.className = className;\n\t},\n\n\ttest: function(field, props){\n\t\tfield = document.id(field);\n\t\treturn (field) ? this.options.test(field, props || this.getProps(field)) : false;\n\t},\n\n\tgetError: function(field, props){\n\t\tfield = document.id(field);\n\t\tvar err = this.options.errorMsg;\n\t\tif (typeOf(err) == 'function') err = err(field, props || this.getProps(field));\n\t\treturn err;\n\t},\n\n\tgetProps: function(field){\n\t\tfield = document.id(field);\n\t\treturn (field) ? field.get('validatorProps') : {};\n\t}\n\n});\n\nElement.Properties.validators = {\n\n\tget: function(){\n\t\treturn (this.get('data-validators') || this.className).clean().split(' ');\n\t}\n\n};\n\nElement.Properties.validatorProps = {\n\n\tset: function(props){\n\t\treturn this.eliminate('$moo:validatorProps').store('$moo:validatorProps', props);\n\t},\n\n\tget: function(props){\n\t\tif (props) this.set(props);\n\t\tif (this.retrieve('$moo:validatorProps')) return this.retrieve('$moo:validatorProps');\n\t\tif (this.getProperty('data-validator-properties') || this.getProperty('validatorProps')){\n\t\t\ttry {\n\t\t\t\tthis.store('$moo:validatorProps', JSON.decode(this.getProperty('validatorProps') || this.getProperty('data-validator-properties')));\n\t\t\t}catch(e){\n\t\t\t\treturn {};\n\t\t\t}\n\t\t} else {\n\t\t\tvar vals = this.get('validators').filter(function(cls){\n\t\t\t\treturn cls.test(':');\n\t\t\t});\n\t\t\tif (!vals.length){\n\t\t\t\tthis.store('$moo:validatorProps', {});\n\t\t\t} else {\n\t\t\t\tprops = {};\n\t\t\t\tvals.each(function(cls){\n\t\t\t\t\tvar split = cls.split(':');\n\t\t\t\t\tif (split[1]){\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tprops[split[0]] = JSON.decode(split[1]);\n\t\t\t\t\t\t} catch(e){}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tthis.store('$moo:validatorProps', props);\n\t\t\t}\n\t\t}\n\t\treturn this.retrieve('$moo:validatorProps');\n\t}\n\n};\n\nForm.Validator = new Class({\n\n\tImplements: [Options, Events],\n\n\tBinds: ['onSubmit'],\n\n\toptions: {/*\n\t\tonFormValidate: function(isValid, form, event){},\n\t\tonElementValidate: function(isValid, field, className, warn){},\n\t\tonElementPass: function(field){},\n\t\tonElementFail: function(field, validatorsFailed){}, */\n\t\tfieldSelectors: 'input, select, textarea',\n\t\tignoreHidden: true,\n\t\tignoreDisabled: true,\n\t\tuseTitles: false,\n\t\tevaluateOnSubmit: true,\n\t\tevaluateFieldsOnBlur: true,\n\t\tevaluateFieldsOnChange: true,\n\t\tserial: true,\n\t\tstopOnFailure: true,\n\t\twarningPrefix: function(){\n\t\t\treturn Form.Validator.getMsg('warningPrefix') || 'Warning: ';\n\t\t},\n\t\terrorPrefix: function(){\n\t\t\treturn Form.Validator.getMsg('errorPrefix') || 'Error: ';\n\t\t}\n\t},\n\n\tinitialize: function(form, options){\n\t\tthis.setOptions(options);\n\t\tthis.element = document.id(form);\n\t\tthis.element.store('validator', this);\n\t\tthis.warningPrefix = Function.from(this.options.warningPrefix)();\n\t\tthis.errorPrefix = Function.from(this.options.errorPrefix)();\n\t\tif (this.options.evaluateOnSubmit) this.element.addEvent('submit', this.onSubmit);\n\t\tif (this.options.evaluateFieldsOnBlur || this.options.evaluateFieldsOnChange) this.watchFields(this.getFields());\n\t},\n\n\ttoElement: function(){\n\t\treturn this.element;\n\t},\n\n\tgetFields: function(){\n\t\treturn (this.fields = this.element.getElements(this.options.fieldSelectors));\n\t},\n\n\twatchFields: function(fields){\n\t\tfields.each(function(el){\n\t\t\tif (this.options.evaluateFieldsOnBlur)\n\t\t\t\tel.addEvent('blur', this.validationMonitor.pass([el, false], this));\n\t\t\tif (this.options.evaluateFieldsOnChange)\n\t\t\t\tel.addEvent('change', this.validationMonitor.pass([el, true], this));\n\t\t}, this);\n\t},\n\n\tvalidationMonitor: function(){\n\t\tclearTimeout(this.timer);\n\t\tthis.timer = this.validateField.delay(50, this, arguments);\n\t},\n\n\tonSubmit: function(event){\n\t\tif (this.validate(event)) this.reset();\n\t},\n\n\treset: function(){\n\t\tthis.getFields().each(this.resetField, this);\n\t\treturn this;\n\t},\n\n\tvalidate: function(event){\n\t\tvar result = this.getFields().map(function(field){\n\t\t\treturn this.validateField(field, true);\n\t\t}, this).every(function(v){\n\t\t\treturn v;\n\t\t});\n\t\tthis.fireEvent('formValidate', [result, this.element, event]);\n\t\tif (this.options.stopOnFailure && !result && event) event.preventDefault();\n\t\treturn result;\n\t},\n\n\tvalidateField: function(field, force){\n\t\tif (this.paused) return true;\n\t\tfield = document.id(field);\n\t\tvar passed = !field.hasClass('validation-failed');\n\t\tvar failed, warned;\n\t\tif (this.options.serial && !force){\n\t\t\tfailed = this.element.getElement('.validation-failed');\n\t\t\twarned = this.element.getElement('.warning');\n\t\t}\n\t\tif (field && (!failed || force || field.hasClass('validation-failed') || (failed && !this.options.serial))){\n\t\t\tvar validationTypes = field.get('validators');\n\t\t\tvar validators = validationTypes.some(function(cn){\n\t\t\t\treturn this.getValidator(cn);\n\t\t\t}, this);\n\t\t\tvar validatorsFailed = [];\n\t\t\tvalidationTypes.each(function(className){\n\t\t\t\tif (className && !this.test(className, field)) validatorsFailed.include(className);\n\t\t\t}, this);\n\t\t\tpassed = validatorsFailed.length === 0;\n\t\t\tif (validators && !this.hasValidator(field, 'warnOnly')){\n\t\t\t\tif (passed){\n\t\t\t\t\tfield.addClass('validation-passed').removeClass('validation-failed');\n\t\t\t\t\tthis.fireEvent('elementPass', [field]);\n\t\t\t\t} else {\n\t\t\t\t\tfield.addClass('validation-failed').removeClass('validation-passed');\n\t\t\t\t\tthis.fireEvent('elementFail', [field, validatorsFailed]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!warned){\n\t\t\t\tvar warnings = validationTypes.some(function(cn){\n\t\t\t\t\tif (cn.test('^warn'))\n\t\t\t\t\t\treturn this.getValidator(cn.replace(/^warn-/,''));\n\t\t\t\t\telse return null;\n\t\t\t\t}, this);\n\t\t\t\tfield.removeClass('warning');\n\t\t\t\tvar warnResult = validationTypes.map(function(cn){\n\t\t\t\t\tif (cn.test('^warn'))\n\t\t\t\t\t\treturn this.test(cn.replace(/^warn-/,''), field, true);\n\t\t\t\t\telse return null;\n\t\t\t\t}, this);\n\t\t\t}\n\t\t}\n\t\treturn passed;\n\t},\n\n\ttest: function(className, field, warn){\n\t\tfield = document.id(field);\n\t\tif ((this.options.ignoreHidden && !field.isVisible()) || (this.options.ignoreDisabled && field.get('disabled'))) return true;\n\t\tvar validator = this.getValidator(className);\n\t\tif (warn != null) warn = false;\n\t\tif (this.hasValidator(field, 'warnOnly')) warn = true;\n\t\tvar isValid = this.hasValidator(field, 'ignoreValidation') || (validator ? validator.test(field) : true);\n\t\tif (validator && field.isVisible()) this.fireEvent('elementValidate', [isValid, field, className, warn]);\n\t\tif (warn) return true;\n\t\treturn isValid;\n\t},\n\n\thasValidator: function(field, value){\n\t\treturn field.get('validators').contains(value);\n\t},\n\n\tresetField: function(field){\n\t\tfield = document.id(field);\n\t\tif (field){\n\t\t\tfield.get('validators').each(function(className){\n\t\t\t\tif (className.test('^warn-')) className = className.replace(/^warn-/, '');\n\t\t\t\tfield.removeClass('validation-failed');\n\t\t\t\tfield.removeClass('warning');\n\t\t\t\tfield.removeClass('validation-passed');\n\t\t\t}, this);\n\t\t}\n\t\treturn this;\n\t},\n\n\tstop: function(){\n\t\tthis.paused = true;\n\t\treturn this;\n\t},\n\n\tstart: function(){\n\t\tthis.paused = false;\n\t\treturn this;\n\t},\n\n\tignoreField: function(field, warn){\n\t\tfield = document.id(field);\n\t\tif (field){\n\t\t\tthis.enforceField(field);\n\t\t\tif (warn) field.addClass('warnOnly');\n\t\t\telse field.addClass('ignoreValidation');\n\t\t}\n\t\treturn this;\n\t},\n\n\tenforceField: function(field){\n\t\tfield = document.id(field);\n\t\tif (field) field.removeClass('warnOnly').removeClass('ignoreValidation');\n\t\treturn this;\n\t}\n\n});\n\nForm.Validator.getMsg = function(key){\n\treturn Locale.get('FormValidator.' + key);\n};\n\nForm.Validator.adders = {\n\n\tvalidators:{},\n\n\tadd : function(className, options){\n\t\tthis.validators[className] = new InputValidator(className, options);\n\t\t//if this is a class (this method is used by instances of Form.Validator and the Form.Validator namespace)\n\t\t//extend these validators into it\n\t\t//this allows validators to be global and/or per instance\n\t\tif (!this.initialize){\n\t\t\tthis.implement({\n\t\t\t\tvalidators: this.validators\n\t\t\t});\n\t\t}\n\t},\n\n\taddAllThese : function(validators){\n\t\tArray.from(validators).each(function(validator){\n\t\t\tthis.add(validator[0], validator[1]);\n\t\t}, this);\n\t},\n\n\tgetValidator: function(className){\n\t\treturn this.validators[className.split(':')[0]];\n\t}\n\n};\n\nObject.append(Form.Validator, Form.Validator.adders);\n\nForm.Validator.implement(Form.Validator.adders);\n\nForm.Validator.add('IsEmpty', {\n\n\terrorMsg: false,\n\ttest: function(element){\n\t\tif (element.type == 'select-one' || element.type == 'select')\n\t\t\treturn !(element.selectedIndex >= 0 && element.options[element.selectedIndex].value != '');\n\t\telse\n\t\t\treturn ((element.get('value') == null) || (element.get('value').length == 0));\n\t}\n\n});\n\nForm.Validator.addAllThese([\n\n\t['required', {\n\t\terrorMsg: function(){\n\t\t\treturn Form.Validator.getMsg('required');\n\t\t},\n\t\ttest: function(element){\n\t\t\treturn !Form.Validator.getValidator('IsEmpty').test(element);\n\t\t}\n\t}],\n\n\t['length', {\n\t\terrorMsg: function(element, props){\n\t\t\tif (typeOf(props.length) != 'null')\n\t\t\t\treturn Form.Validator.getMsg('length').substitute({length: props.length, elLength: element.get('value').length});\n\t\t\telse return '';\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tif (typeOf(props.length) != 'null') return (element.get('value').length == props.length || element.get('value').length == 0);\n\t\t\telse return true;\n\t\t}\n\t}],\t\n\n\t['minLength', {\n\t\terrorMsg: function(element, props){\n\t\t\tif (typeOf(props.minLength) != 'null')\n\t\t\t\treturn Form.Validator.getMsg('minLength').substitute({minLength: props.minLength, length: element.get('value').length});\n\t\t\telse return '';\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tif (typeOf(props.minLength) != 'null') return (element.get('value').length >= (props.minLength || 0));\n\t\t\telse return true;\n\t\t}\n\t}],\n\n\t['maxLength', {\n\t\terrorMsg: function(element, props){\n\t\t\t//props is {maxLength:10}\n\t\t\tif (typeOf(props.maxLength) != 'null')\n\t\t\t\treturn Form.Validator.getMsg('maxLength').substitute({maxLength: props.maxLength, length: element.get('value').length});\n\t\t\telse return '';\n\t\t},\n\t\ttest: function(element, props){\n\t\t\treturn element.get('value').length <= (props.maxLength || 10000);\n\t\t}\n\t}],\n\n\t['validate-integer', {\n\t\terrorMsg: Form.Validator.getMsg.pass('integer'),\n\t\ttest: function(element){\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) || (/^(-?[1-9]\\d*|0)$/).test(element.get('value'));\n\t\t}\n\t}],\n\n\t['validate-numeric', {\n\t\terrorMsg: Form.Validator.getMsg.pass('numeric'),\n\t\ttest: function(element){\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) ||\n\t\t\t\t(/^-?(?:0$0(?=\\d*\\.)|[1-9]|0)\\d*(\\.\\d+)?$/).test(element.get('value'));\n\t\t}\n\t}],\n\n\t['validate-digits', {\n\t\terrorMsg: Form.Validator.getMsg.pass('digits'),\n\t\ttest: function(element){\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) || (/^[\\d() .:\\-\\+#]+$/.test(element.get('value')));\n\t\t}\n\t}],\n\n\t['validate-alpha', {\n\t\terrorMsg: Form.Validator.getMsg.pass('alpha'),\n\t\ttest: function(element){\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) || (/^[a-zA-Z]+$/).test(element.get('value'));\n\t\t}\n\t}],\n\n\t['validate-alphanum', {\n\t\terrorMsg: Form.Validator.getMsg.pass('alphanum'),\n\t\ttest: function(element){\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) || !(/\\W/).test(element.get('value'));\n\t\t}\n\t}],\n\n\t['validate-date', {\n\t\terrorMsg: function(element, props){\n\t\t\tif (Date.parse){\n\t\t\t\tvar format = props.dateFormat || '%x';\n\t\t\t\treturn Form.Validator.getMsg('dateSuchAs').substitute({date: new Date().format(format)});\n\t\t\t} else {\n\t\t\t\treturn Form.Validator.getMsg('dateInFormatMDY');\n\t\t\t}\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tif (Form.Validator.getValidator('IsEmpty').test(element)) return true;\n\t\t\tvar dateLocale = Locale.getCurrent().sets.Date,\n\t\t\t\tdateNouns = new RegExp([dateLocale.days, dateLocale.days_abbr, dateLocale.months, dateLocale.months_abbr].flatten().join('|'), 'i'),\n\t\t\t\tvalue = element.get('value'),\n\t\t\t\twordsInValue = value.match(/[a-z]+/gi);\n\n\t\t\t\tif (wordsInValue && !wordsInValue.every(dateNouns.exec, dateNouns)) return false;\n\n\t\t\t\tvar date = Date.parse(value),\n\t\t\t\t\tformat = props.dateFormat || '%x',\n\t\t\t\t\tformatted = date.format(format);\n\n\t\t\t\tif (formatted != 'invalid date') element.set('value', formatted);\n\t\t\t\treturn date.isValid();\n\t\t}\n\t}],\n\n\t['validate-email', {\n\t\terrorMsg: Form.Validator.getMsg.pass('email'),\n\t\ttest: function(element){\n\t\t\t/*\n\t\t\tvar chars = \"[a-z0-9!#$%&'*+/=?^_`{|}~-]\",\n\t\t\t\tlocal = '(?:' + chars + '\\\\.?){0,63}' + chars,\n\n\t\t\t\tlabel = '[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?',\n\t\t\t\thostname = '(?:' + label + '\\\\.)*' + label;\n\n\t\t\t\toctet = '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)',\n\t\t\t\tipv4 = '\\\\[(?:' + octet + '\\\\.){3}' + octet + '\\\\]',\n\n\t\t\t\tdomain = '(?:' + hostname + '|' + ipv4 + ')';\n\n\t\t\tvar regex = new RegExp('^' + local + '@' + domain + '$', 'i');\n\t\t\t*/\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]\\.?){0,63}[a-z0-9!#$%&'*+\\/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\])$/i).test(element.get('value'));\n\t\t}\n\t}],\n\n\t['validate-url', {\n\t\terrorMsg: Form.Validator.getMsg.pass('url'),\n\t\ttest: function(element){\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) || (/^(https?|ftp|rmtp|mms):\\/\\/(([A-Z0-9][A-Z0-9_-]*)(\\.[A-Z0-9][A-Z0-9_-]*)+)(:(\\d+))?\\/?/i).test(element.get('value'));\n\t\t}\n\t}],\n\n\t['validate-currency-dollar', {\n\t\terrorMsg: Form.Validator.getMsg.pass('currencyDollar'),\n\t\ttest: function(element){\n\t\t\treturn Form.Validator.getValidator('IsEmpty').test(element) || (/^\\$?\\-?([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}\\d*(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$/).test(element.get('value'));\n\t\t}\n\t}],\n\n\t['validate-one-required', {\n\t\terrorMsg: Form.Validator.getMsg.pass('oneRequired'),\n\t\ttest: function(element, props){\n\t\t\tvar p = document.id(props['validate-one-required']) || element.getParent(props['validate-one-required']);\n\t\t\treturn p.getElements('input').some(function(el){\n\t\t\t\tif (['checkbox', 'radio'].contains(el.get('type'))) return el.get('checked');\n\t\t\t\treturn el.get('value');\n\t\t\t});\n\t\t}\n\t}]\n\n]);\n\nElement.Properties.validator = {\n\n\tset: function(options){\n\t\tthis.get('validator').setOptions(options);\n\t},\n\n\tget: function(){\n\t\tvar validator = this.retrieve('validator');\n\t\tif (!validator){\n\t\t\tvalidator = new Form.Validator(this);\n\t\t\tthis.store('validator', validator);\n\t\t}\n\t\treturn validator;\n\t}\n\n};\n\nElement.implement({\n\n\tvalidate: function(options){\n\t\tif (options) this.set('validator', options);\n\t\treturn this.get('validator').validate();\n\t}\n\n});\n\n\n\n\n\n\n\n/*\n---\n\nscript: Form.Validator.Inline.js\n\nname: Form.Validator.Inline\n\ndescription: Extends Form.Validator to add inline messages.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - /Form.Validator\n\nprovides: [Form.Validator.Inline]\n\n...\n*/\n\nForm.Validator.Inline = new Class({\n\n\tExtends: Form.Validator,\n\n\toptions: {\n\t\tshowError: function(errorElement){\n\t\t\tif (errorElement.reveal) errorElement.reveal();\n\t\t\telse errorElement.setStyle('display', 'block');\n\t\t},\n\t\thideError: function(errorElement){\n\t\t\tif (errorElement.dissolve) errorElement.dissolve();\n\t\t\telse errorElement.setStyle('display', 'none');\n\t\t},\n\t\tscrollToErrorsOnSubmit: true,\n\t\tscrollToErrorsOnBlur: false,\n\t\tscrollToErrorsOnChange: false,\n\t\tscrollFxOptions: {\n\t\t\ttransition: 'quad:out',\n\t\t\toffset: {\n\t\t\t\ty: -20\n\t\t\t}\n\t\t}\n\t},\n\n\tinitialize: function(form, options){\n\t\tthis.parent(form, options);\n\t\tthis.addEvent('onElementValidate', function(isValid, field, className, warn){\n\t\t\tvar validator = this.getValidator(className);\n\t\t\tif (!isValid && validator.getError(field)){\n\t\t\t\tif (warn) field.addClass('warning');\n\t\t\t\tvar advice = this.makeAdvice(className, field, validator.getError(field), warn);\n\t\t\t\tthis.insertAdvice(advice, field);\n\t\t\t\tthis.showAdvice(className, field);\n\t\t\t} else {\n\t\t\t\tthis.hideAdvice(className, field);\n\t\t\t}\n\t\t});\n\t},\n\n\tmakeAdvice: function(className, field, error, warn){\n\t\tvar errorMsg = (warn) ? this.warningPrefix : this.errorPrefix;\n\t\t\terrorMsg += (this.options.useTitles) ? field.title || error:error;\n\t\tvar cssClass = (warn) ? 'warning-advice' : 'validation-advice';\n\t\tvar advice = this.getAdvice(className, field);\n\t\tif (advice){\n\t\t\tadvice = advice.set('html', errorMsg);\n\t\t} else {\n\t\t\tadvice = new Element('div', {\n\t\t\t\thtml: errorMsg,\n\t\t\t\tstyles: { display: 'none' },\n\t\t\t\tid: 'advice-' + className.split(':')[0] + '-' + this.getFieldId(field)\n\t\t\t}).addClass(cssClass);\n\t\t}\n\t\tfield.store('$moo:advice-' + className, advice);\n\t\treturn advice;\n\t},\n\n\tgetFieldId : function(field){\n\t\treturn field.id ? field.id : field.id = 'input_' + field.name;\n\t},\n\n\tshowAdvice: function(className, field){\n\t\tvar advice = this.getAdvice(className, field);\n\t\tif (\n\t\t\tadvice &&\n\t\t\t!field.retrieve('$moo:' + this.getPropName(className)) &&\n\t\t\t(\n\t\t\t\tadvice.getStyle('display') == 'none' ||\n\t\t\t\tadvice.getStyle('visiblity') == 'hidden' ||\n\t\t\t\tadvice.getStyle('opacity') == 0\n\t\t\t)\n\t\t){\n\t\t\tfield.store('$moo:' + this.getPropName(className), true);\n\t\t\tthis.options.showError(advice);\n\t\t\tthis.fireEvent('showAdvice', [field, advice, className]);\n\t\t}\n\t},\n\n\thideAdvice: function(className, field){\n\t\tvar advice = this.getAdvice(className, field);\n\t\tif (advice && field.retrieve('$moo:' + this.getPropName(className))){\n\t\t\tfield.store('$moo:' + this.getPropName(className), false);\n\t\t\tthis.options.hideError(advice);\n\t\t\tthis.fireEvent('hideAdvice', [field, advice, className]);\n\t\t}\n\t},\n\n\tgetPropName: function(className){\n\t\treturn 'advice' + className;\n\t},\n\n\tresetField: function(field){\n\t\tfield = document.id(field);\n\t\tif (!field) return this;\n\t\tthis.parent(field);\n\t\tfield.get('validators').each(function(className){\n\t\t\tthis.hideAdvice(className, field);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tgetAllAdviceMessages: function(field, force){\n\t\tvar advice = [];\n\t\tif (field.hasClass('ignoreValidation') && !force) return advice;\n\t\tvar validators = field.get('validators').some(function(cn){\n\t\t\tvar warner = cn.test('^warn-') || field.hasClass('warnOnly');\n\t\t\tif (warner) cn = cn.replace(/^warn-/, '');\n\t\t\tvar validator = this.getValidator(cn);\n\t\t\tif (!validator) return;\n\t\t\tadvice.push({\n\t\t\t\tmessage: validator.getError(field),\n\t\t\t\twarnOnly: warner,\n\t\t\t\tpassed: validator.test(),\n\t\t\t\tvalidator: validator\n\t\t\t});\n\t\t}, this);\n\t\treturn advice;\n\t},\n\n\tgetAdvice: function(className, field){\n\t\treturn field.retrieve('$moo:advice-' + className);\n\t},\n\n\tinsertAdvice: function(advice, field){\n\t\t//Check for error position prop\n\t\tvar props = field.get('validatorProps');\n\t\t//Build advice\n\t\tif (!props.msgPos || !document.id(props.msgPos)){\n\t\t\tif (field.type && field.type.toLowerCase() == 'radio') field.getParent().adopt(advice);\n\t\t\telse advice.inject(document.id(field), 'after');\n\t\t} else {\n\t\t\tdocument.id(props.msgPos).grab(advice);\n\t\t}\n\t},\n\n\tvalidateField: function(field, force, scroll){\n\t\tvar result = this.parent(field, force);\n\t\tif (((this.options.scrollToErrorsOnSubmit && scroll == null) || scroll) && !result){\n\t\t\tvar failed = document.id(this).getElement('.validation-failed');\n\t\t\tvar par = document.id(this).getParent();\n\t\t\twhile (par != document.body && par.getScrollSize().y == par.getSize().y){\n\t\t\t\tpar = par.getParent();\n\t\t\t}\n\t\t\tvar fx = par.retrieve('$moo:fvScroller');\n\t\t\tif (!fx && window.Fx && Fx.Scroll){\n\t\t\t\tfx = new Fx.Scroll(par, this.options.scrollFxOptions);\n\t\t\t\tpar.store('$moo:fvScroller', fx);\n\t\t\t}\n\t\t\tif (failed){\n\t\t\t\tif (fx) fx.toElement(failed);\n\t\t\t\telse par.scrollTo(par.getScroll().x, failed.getPosition(par).y - 20);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t},\n\n\twatchFields: function(fields){\n\t\tfields.each(function(el){\n\t\tif (this.options.evaluateFieldsOnBlur){\n\t\t\tel.addEvent('blur', this.validationMonitor.pass([el, false, this.options.scrollToErrorsOnBlur], this));\n\t\t}\n\t\tif (this.options.evaluateFieldsOnChange){\n\t\t\t\tel.addEvent('change', this.validationMonitor.pass([el, true, this.options.scrollToErrorsOnChange], this));\n\t\t\t}\n\t\t}, this);\n\t}\n\n});\n\n\n/*\n---\n\nscript: Form.Validator.Extras.js\n\nname: Form.Validator.Extras\n\ndescription: Additional validators for the Form.Validator class.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - /Form.Validator\n\nprovides: [Form.Validator.Extras]\n\n...\n*/\nForm.Validator.addAllThese([\n\n\t['validate-enforce-oncheck', {\n\t\ttest: function(element, props){\n\t\t\tvar fv = element.getParent('form').retrieve('validator');\n\t\t\tif (!fv) return true;\n\t\t\t(props.toEnforce || document.id(props.enforceChildrenOf).getElements('input, select, textarea')).map(function(item){\n\t\t\t\tif (element.checked){\n\t\t\t\t\tfv.enforceField(item);\n\t\t\t\t} else {\n\t\t\t\t\tfv.ignoreField(item);\n\t\t\t\t\tfv.resetField(item);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t}],\n\n\t['validate-ignore-oncheck', {\n\t\ttest: function(element, props){\n\t\t\tvar fv = element.getParent('form').retrieve('validator');\n\t\t\tif (!fv) return true;\n\t\t\t(props.toIgnore || document.id(props.ignoreChildrenOf).getElements('input, select, textarea')).each(function(item){\n\t\t\t\tif (element.checked){\n\t\t\t\t\tfv.ignoreField(item);\n\t\t\t\t\tfv.resetField(item);\n\t\t\t\t} else {\n\t\t\t\t\tfv.enforceField(item);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn true;\n\t\t}\n\t}],\n\n\t['validate-nospace', {\n\t\terrorMsg: function(){\n\t\t\treturn Form.Validator.getMsg('noSpace');\n\t\t},\n\t\ttest: function(element, props){\n\t\t\treturn !element.get('value').test(/\\s/);\n\t\t}\n\t}],\n\n\t['validate-toggle-oncheck', {\n\t\ttest: function(element, props){\n\t\t\tvar fv = element.getParent('form').retrieve('validator');\n\t\t\tif (!fv) return true;\n\t\t\tvar eleArr = props.toToggle || document.id(props.toToggleChildrenOf).getElements('input, select, textarea');\n\t\t\tif (!element.checked){\n\t\t\t\teleArr.each(function(item){\n\t\t\t\t\tfv.ignoreField(item);\n\t\t\t\t\tfv.resetField(item);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\teleArr.each(function(item){\n\t\t\t\t\tfv.enforceField(item);\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t}],\n\n\t['validate-reqchk-bynode', {\n\t\terrorMsg: function(){\n\t\t\treturn Form.Validator.getMsg('reqChkByNode');\n\t\t},\n\t\ttest: function(element, props){\n\t\t\treturn (document.id(props.nodeId).getElements(props.selector || 'input[type=checkbox], input[type=radio]')).some(function(item){\n\t\t\t\treturn item.checked;\n\t\t\t});\n\t\t}\n\t}],\n\n\t['validate-required-check', {\n\t\terrorMsg: function(element, props){\n\t\t\treturn props.useTitle ? element.get('title') : Form.Validator.getMsg('requiredChk');\n\t\t},\n\t\ttest: function(element, props){\n\t\t\treturn !!element.checked;\n\t\t}\n\t}],\n\n\t['validate-reqchk-byname', {\n\t\terrorMsg: function(element, props){\n\t\t\treturn Form.Validator.getMsg('reqChkByName').substitute({label: props.label || element.get('type')});\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tvar grpName = props.groupName || element.get('name');\n\t\t\tvar oneCheckedItem = $$(document.getElementsByName(grpName)).some(function(item, index){\n\t\t\t\treturn item.checked;\n\t\t\t});\n\t\t\tvar fv = element.getParent('form').retrieve('validator');\n\t\t\tif (oneCheckedItem && fv) fv.resetField(element);\n\t\t\treturn oneCheckedItem;\n\t\t}\n\t}],\n\n\t['validate-match', {\n\t\terrorMsg: function(element, props){\n\t\t\treturn Form.Validator.getMsg('match').substitute({matchName: props.matchName || document.id(props.matchInput).get('name')});\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tvar eleVal = element.get('value');\n\t\t\tvar matchVal = document.id(props.matchInput) && document.id(props.matchInput).get('value');\n\t\t\treturn eleVal && matchVal ? eleVal == matchVal : true;\n\t\t}\n\t}],\n\n\t['validate-after-date', {\n\t\terrorMsg: function(element, props){\n\t\t\treturn Form.Validator.getMsg('afterDate').substitute({\n\t\t\t\tlabel: props.afterLabel || (props.afterElement ? Form.Validator.getMsg('startDate') : Form.Validator.getMsg('currentDate'))\n\t\t\t});\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tvar start = document.id(props.afterElement) ? Date.parse(document.id(props.afterElement).get('value')) : new Date();\n\t\t\tvar end = Date.parse(element.get('value'));\n\t\t\treturn end && start ? end >= start : true;\n\t\t}\n\t}],\n\n\t['validate-before-date', {\n\t\terrorMsg: function(element, props){\n\t\t\treturn Form.Validator.getMsg('beforeDate').substitute({\n\t\t\t\tlabel: props.beforeLabel || (props.beforeElement ? Form.Validator.getMsg('endDate') : Form.Validator.getMsg('currentDate'))\n\t\t\t});\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tvar start = Date.parse(element.get('value'));\n\t\t\tvar end = document.id(props.beforeElement) ? Date.parse(document.id(props.beforeElement).get('value')) : new Date();\n\t\t\treturn end && start ? end >= start : true;\n\t\t}\n\t}],\n\n\t['validate-custom-required', {\n\t\terrorMsg: function(){\n\t\t\treturn Form.Validator.getMsg('required');\n\t\t},\n\t\ttest: function(element, props){\n\t\t\treturn element.get('value') != props.emptyValue;\n\t\t}\n\t}],\n\n\t['validate-same-month', {\n\t\terrorMsg: function(element, props){\n\t\t\tvar startMo = document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value');\n\t\t\tvar eleVal = element.get('value');\n\t\t\tif (eleVal != '') return Form.Validator.getMsg(startMo ? 'sameMonth' : 'startMonth');\n\t\t},\n\t\ttest: function(element, props){\n\t\t\tvar d1 = Date.parse(element.get('value'));\n\t\t\tvar d2 = Date.parse(document.id(props.sameMonthAs) && document.id(props.sameMonthAs).get('value'));\n\t\t\treturn d1 && d2 ? d1.format('%B') == d2.format('%B') : true;\n\t\t}\n\t}],\n\n\n\t['validate-cc-num', {\n\t\terrorMsg: function(element){\n\t\t\tvar ccNum = element.get('value').replace(/[^0-9]/g, '');\n\t\t\treturn Form.Validator.getMsg('creditcard').substitute({length: ccNum.length});\n\t\t},\n\t\ttest: function(element){\n\t\t\t// required is a different test\n\t\t\tif (Form.Validator.getValidator('IsEmpty').test(element)) return true;\n\n\t\t\t// Clean number value\n\t\t\tvar ccNum = element.get('value');\n\t\t\tccNum = ccNum.replace(/[^0-9]/g, '');\n\n\t\t\tvar valid_type = false;\n\n\t\t\tif (ccNum.test(/^4[0-9]{12}([0-9]{3})?$/)) valid_type = 'Visa';\n\t\t\telse if (ccNum.test(/^5[1-5]([0-9]{14})$/)) valid_type = 'Master Card';\n\t\t\telse if (ccNum.test(/^3[47][0-9]{13}$/)) valid_type = 'American Express';\n\t\t\telse if (ccNum.test(/^6011[0-9]{12}$/)) valid_type = 'Discover';\n\n\t\t\tif (valid_type){\n\t\t\t\tvar sum = 0;\n\t\t\t\tvar cur = 0;\n\n\t\t\t\tfor (var i=ccNum.length-1; i>=0; --i){\n\t\t\t\t\tcur = ccNum.charAt(i).toInt();\n\t\t\t\t\tif (cur == 0) continue;\n\n\t\t\t\t\tif ((ccNum.length-i) % 2 == 0) cur += cur;\n\t\t\t\t\tif (cur > 9){\n\t\t\t\t\t\tcur = cur.toString().charAt(0).toInt() + cur.toString().charAt(1).toInt();\n\t\t\t\t\t}\n\n\t\t\t\t\tsum += cur;\n\t\t\t\t}\n\t\t\t\tif ((sum % 10) == 0) return true;\n\t\t\t}\n\n\t\t\tvar chunks = '';\n\t\t\twhile (ccNum != ''){\n\t\t\t\tchunks += ' ' + ccNum.substr(0,4);\n\t\t\t\tccNum = ccNum.substr(4);\n\t\t\t}\n\n\t\t\telement.getParent('form').retrieve('validator').ignoreField(element);\n\t\t\telement.set('value', chunks.clean());\n\t\t\telement.getParent('form').retrieve('validator').enforceField(element);\n\t\t\treturn false;\n\t\t}\n\t}]\n\n\n]);\n\n\n/*\n---\n\nscript: OverText.js\n\nname: OverText\n\ndescription: Shows text over an input that disappears when the user clicks into it. The text remains hidden if the user adds a value.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Options\n - Core/Events\n - Core/Element.Event\n - Class.Binds\n - Class.Occlude\n - Element.Position\n - Element.Shortcuts\n\nprovides: [OverText]\n\n...\n*/\n\nvar OverText = new Class({\n\n\tImplements: [Options, Events, Class.Occlude],\n\n\tBinds: ['reposition', 'assert', 'focus', 'hide'],\n\n\toptions: {/*\n\t\ttextOverride: null,\n\t\tonFocus: function(){},\n\t\tonTextHide: function(textEl, inputEl){},\n\t\tonTextShow: function(textEl, inputEl){}, */\n\t\telement: 'label',\n\t\tlabelClass: 'overTxtLabel',\n\t\tpositionOptions: {\n\t\t\tposition: 'upperLeft',\n\t\t\tedge: 'upperLeft',\n\t\t\toffset: {\n\t\t\t\tx: 4,\n\t\t\t\ty: 2\n\t\t\t}\n\t\t},\n\t\tpoll: false,\n\t\tpollInterval: 250,\n\t\twrap: false\n\t},\n\n\tproperty: 'OverText',\n\n\tinitialize: function(element, options){\n\t\telement = this.element = document.id(element);\n\n\t\tif (this.occlude()) return this.occluded;\n\t\tthis.setOptions(options);\n\n\t\tthis.attach(element);\n\t\tOverText.instances.push(this);\n\n\t\tif (this.options.poll) this.poll();\n\t},\n\n\ttoElement: function(){\n\t\treturn this.element;\n\t},\n\n\tattach: function(){\n\t\tvar element = this.element,\n\t\t\toptions = this.options,\n\t\t\tvalue = options.textOverride || element.get('alt') || element.get('title');\n\n\t\tif (!value) return this;\n\n\t\tvar text = this.text = new Element(options.element, {\n\t\t\t'class': options.labelClass,\n\t\t\tstyles: {\n\t\t\t\tlineHeight: 'normal',\n\t\t\t\tposition: 'absolute',\n\t\t\t\tcursor: 'text'\n\t\t\t},\n\t\t\thtml: value,\n\t\t\tevents: {\n\t\t\t\tclick: this.hide.pass(options.element == 'label', this)\n\t\t\t}\n\t\t}).inject(element, 'after');\n\n\t\tif (options.element == 'label'){\n\t\t\tif (!element.get('id')) element.set('id', 'input_' + String.uniqueID());\n\t\t\ttext.set('for', element.get('id'));\n\t\t}\n\n\t\tif (options.wrap){\n\t\t\tthis.textHolder = new Element('div.overTxtWrapper', {\n\t\t\t\tstyles: {\n\t\t\t\t\tlineHeight: 'normal',\n\t\t\t\t\tposition: 'relative'\n\t\t\t\t}\n\t\t\t}).grab(text).inject(element, 'before');\n\t\t}\n\n\t\treturn this.enable();\n\t},\n\n\tdestroy: function(){\n\t\tthis.element.eliminate(this.property); // Class.Occlude storage\n\t\tthis.disable();\n\t\tif (this.text) this.text.destroy();\n\t\tif (this.textHolder) this.textHolder.destroy();\n\t\treturn this;\n\t},\n\n\tdisable: function(){\n\t\tthis.element.removeEvents({\n\t\t\tfocus: this.focus,\n\t\t\tblur: this.assert,\n\t\t\tchange: this.assert\n\t\t});\n\t\twindow.removeEvent('resize', this.reposition);\n\t\tthis.hide(true, true);\n\t\treturn this;\n\t},\n\n\tenable: function(){\n\t\tthis.element.addEvents({\n\t\t\tfocus: this.focus,\n\t\t\tblur: this.assert,\n\t\t\tchange: this.assert\n\t\t});\n\t\twindow.addEvent('resize', this.reposition);\n\t\tthis.reposition();\n\t\treturn this;\n\t},\n\n\twrap: function(){\n\t\tif (this.options.element == 'label'){\n\t\t\tif (!this.element.get('id')) this.element.set('id', 'input_' + String.uniqueID());\n\t\t\tthis.text.set('for', this.element.get('id'));\n\t\t}\n\t},\n\n\tstartPolling: function(){\n\t\tthis.pollingPaused = false;\n\t\treturn this.poll();\n\t},\n\n\tpoll: function(stop){\n\t\t//start immediately\n\t\t//pause on focus\n\t\t//resumeon blur\n\t\tif (this.poller && !stop) return this;\n\t\tif (stop){\n\t\t\tclearInterval(this.poller);\n\t\t} else {\n\t\t\tthis.poller = (function(){\n\t\t\t\tif (!this.pollingPaused) this.assert(true);\n\t\t\t}).periodical(this.options.pollInterval, this);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tstopPolling: function(){\n\t\tthis.pollingPaused = true;\n\t\treturn this.poll(true);\n\t},\n\n\tfocus: function(){\n\t\tif (this.text && (!this.text.isDisplayed() || this.element.get('disabled'))) return this;\n\t\treturn this.hide();\n\t},\n\n\thide: function(suppressFocus, force){\n\t\tif (this.text && (this.text.isDisplayed() && (!this.element.get('disabled') || force))){\n\t\t\tthis.text.hide();\n\t\t\tthis.fireEvent('textHide', [this.text, this.element]);\n\t\t\tthis.pollingPaused = true;\n\t\t\tif (!suppressFocus){\n\t\t\t\ttry {\n\t\t\t\t\tthis.element.fireEvent('focus');\n\t\t\t\t\tthis.element.focus();\n\t\t\t\t} catch(e){} //IE barfs if you call focus on hidden elements\n\t\t\t}\n\t\t}\n\t\treturn this;\n\t},\n\n\tshow: function(){\n\t\tif (this.text && !this.text.isDisplayed()){\n\t\t\tthis.text.show();\n\t\t\tthis.reposition();\n\t\t\tthis.fireEvent('textShow', [this.text, this.element]);\n\t\t\tthis.pollingPaused = false;\n\t\t}\n\t\treturn this;\n\t},\n\n\ttest: function(){\n\t\treturn !this.element.get('value');\n\t},\n\n\tassert: function(suppressFocus){\n\t\treturn this[this.test() ? 'show' : 'hide'](suppressFocus);\n\t},\n\n\treposition: function(){\n\t\tthis.assert(true);\n\t\tif (!this.element.isVisible()) return this.stopPolling().hide();\n\t\tif (this.text && this.test()){\n\t\t\tthis.text.position(Object.merge(this.options.positionOptions, {\n\t\t\t\trelativeTo: this.element\n\t\t\t}));\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\nOverText.instances = [];\n\nObject.append(OverText, {\n\n\teach: function(fn){\n\t\treturn OverText.instances.each(function(ot, i){\n\t\t\tif (ot.element && ot.text) fn.call(OverText, ot, i);\n\t\t});\n\t},\n\n\tupdate: function(){\n\n\t\treturn OverText.each(function(ot){\n\t\t\treturn ot.reposition();\n\t\t});\n\n\t},\n\n\thideAll: function(){\n\n\t\treturn OverText.each(function(ot){\n\t\t\treturn ot.hide(true, true);\n\t\t});\n\n\t},\n\n\tshowAll: function(){\n\t\treturn OverText.each(function(ot){\n\t\t\treturn ot.show();\n\t\t});\n\t}\n\n});\n\n\n\n/*\n---\n\nscript: Fx.Elements.js\n\nname: Fx.Elements\n\ndescription: Effect to change any number of CSS properties of any number of Elements.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Fx.CSS\n - /MooTools.More\n\nprovides: [Fx.Elements]\n\n...\n*/\n\nFx.Elements = new Class({\n\n\tExtends: Fx.CSS,\n\n\tinitialize: function(elements, options){\n\t\tthis.elements = this.subject = $$(elements);\n\t\tthis.parent(options);\n\t},\n\n\tcompute: function(from, to, delta){\n\t\tvar now = {};\n\n\t\tfor (var i in from){\n\t\t\tvar iFrom = from[i], iTo = to[i], iNow = now[i] = {};\n\t\t\tfor (var p in iFrom) iNow[p] = this.parent(iFrom[p], iTo[p], delta);\n\t\t}\n\n\t\treturn now;\n\t},\n\n\tset: function(now){\n\t\tfor (var i in now){\n\t\t\tif (!this.elements[i]) continue;\n\n\t\t\tvar iNow = now[i];\n\t\t\tfor (var p in iNow) this.render(this.elements[i], p, iNow[p], this.options.unit);\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tstart: function(obj){\n\t\tif (!this.check(obj)) return this;\n\t\tvar from = {}, to = {};\n\n\t\tfor (var i in obj){\n\t\t\tif (!this.elements[i]) continue;\n\n\t\t\tvar iProps = obj[i], iFrom = from[i] = {}, iTo = to[i] = {};\n\n\t\t\tfor (var p in iProps){\n\t\t\t\tvar parsed = this.prepare(this.elements[i], p, iProps[p]);\n\t\t\t\tiFrom[p] = parsed.from;\n\t\t\t\tiTo[p] = parsed.to;\n\t\t\t}\n\t\t}\n\n\t\treturn this.parent(from, to);\n\t}\n\n});\n\n\n/*\n---\n\nscript: Fx.Accordion.js\n\nname: Fx.Accordion\n\ndescription: An Fx.Elements extension which allows you to easily create accordion type controls.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Element.Event\n - /Fx.Elements\n\nprovides: [Fx.Accordion]\n\n...\n*/\n\nFx.Accordion = new Class({\n\n\tExtends: Fx.Elements,\n\n\toptions: {/*\n\t\tonActive: function(toggler, section){},\n\t\tonBackground: function(toggler, section){},*/\n\t\tfixedHeight: false,\n\t\tfixedWidth: false,\n\t\tdisplay: 0,\n\t\tshow: false,\n\t\theight: true,\n\t\twidth: false,\n\t\topacity: true,\n\t\talwaysHide: false,\n\t\ttrigger: 'click',\n\t\tinitialDisplayFx: true,\n\t\tresetHeight: true\n\t},\n\n\tinitialize: function(){\n\t\tvar defined = function(obj){\n\t\t\treturn obj != null;\n\t\t};\n\n\t\tvar params = Array.link(arguments, {\n\t\t\t'container': Type.isElement, //deprecated\n\t\t\t'options': Type.isObject,\n\t\t\t'togglers': defined,\n\t\t\t'elements': defined\n\t\t});\n\t\tthis.parent(params.elements, params.options);\n\n\t\tvar options = this.options,\n\t\t\ttogglers = this.togglers = $$(params.togglers);\n\n\t\tthis.previous = -1;\n\t\tthis.internalChain = new Chain();\n\n\t\tif (options.alwaysHide) this.options.link = 'chain';\n\n\t\tif (options.show || this.options.show === 0){\n\t\t\toptions.display = false;\n\t\t\tthis.previous = options.show;\n\t\t}\n\n\t\tif (options.start){\n\t\t\toptions.display = false;\n\t\t\toptions.show = false;\n\t\t}\n\n\t\tvar effects = this.effects = {};\n\n\t\tif (options.opacity) effects.opacity = 'fullOpacity';\n\t\tif (options.width) effects.width = options.fixedWidth ? 'fullWidth' : 'offsetWidth';\n\t\tif (options.height) effects.height = options.fixedHeight ? 'fullHeight' : 'scrollHeight';\n\n\t\tfor (var i = 0, l = togglers.length; i < l; i++) this.addSection(togglers[i], this.elements[i]);\n\n\t\tthis.elements.each(function(el, i){\n\t\t\tif (options.show === i){\n\t\t\t\tthis.fireEvent('active', [togglers[i], el]);\n\t\t\t} else {\n\t\t\t\tfor (var fx in effects) el.setStyle(fx, 0);\n\t\t\t}\n\t\t}, this);\n\n\t\tif (options.display || options.display === 0 || options.initialDisplayFx === false){\n\t\t\tthis.display(options.display, options.initialDisplayFx);\n\t\t}\n\n\t\tif (options.fixedHeight !== false) options.resetHeight = false;\n\t\tthis.addEvent('complete', this.internalChain.callChain.bind(this.internalChain));\n\t},\n\n\taddSection: function(toggler, element){\n\t\ttoggler = document.id(toggler);\n\t\telement = document.id(element);\n\t\tthis.togglers.include(toggler);\n\t\tthis.elements.include(element);\n\n\t\tvar togglers = this.togglers,\n\t\t\toptions = this.options,\n\t\t\ttest = togglers.contains(toggler),\n\t\t\tidx = togglers.indexOf(toggler),\n\t\t\tdisplayer = this.display.pass(idx, this);\n\n\t\ttoggler.store('accordion:display', displayer)\n\t\t\t.addEvent(options.trigger, displayer);\n\n\t\tif (options.height) element.setStyles({'padding-top': 0, 'border-top': 'none', 'padding-bottom': 0, 'border-bottom': 'none'});\n\t\tif (options.width) element.setStyles({'padding-left': 0, 'border-left': 'none', 'padding-right': 0, 'border-right': 'none'});\n\n\t\telement.fullOpacity = 1;\n\t\tif (options.fixedWidth) element.fullWidth = options.fixedWidth;\n\t\tif (options.fixedHeight) element.fullHeight = options.fixedHeight;\n\t\telement.setStyle('overflow', 'hidden');\n\n\t\tif (!test) for (var fx in this.effects){\n\t\t\telement.setStyle(fx, 0);\n\t\t}\n\t\treturn this;\n\t},\n\n\tremoveSection: function(toggler, displayIndex){\n\t\tvar togglers = this.togglers,\n\t\t\tidx = togglers.indexOf(toggler),\n\t\t\telement = this.elements[idx];\n\n\t\tvar remover = function(){\n\t\t\ttogglers.erase(toggler);\n\t\t\tthis.elements.erase(element);\n\t\t\tthis.detach(toggler);\n\t\t}.bind(this);\n\n\t\tif (this.now == idx || displayIndex != null){\n\t\t\tthis.display(displayIndex != null ? displayIndex : (idx - 1 >= 0 ? idx - 1 : 0)).chain(remover);\n\t\t} else {\n\t\t\tremover();\n\t\t}\n\t\treturn this;\n\t},\n\n\tdetach: function(toggler){\n\t\tvar remove = function(toggler){\n\t\t\ttoggler.removeEvent(this.options.trigger, toggler.retrieve('accordion:display'));\n\t\t}.bind(this);\n\n\t\tif (!toggler) this.togglers.each(remove);\n\t\telse remove(toggler);\n\t\treturn this;\n\t},\n\n\tdisplay: function(index, useFx){\n\t\tif (!this.check(index, useFx)) return this;\n\n\t\tvar obj = {},\n\t\t\telements = this.elements,\n\t\t\toptions = this.options,\n\t\t\teffects = this.effects;\n\n\t\tif (useFx == null) useFx = true;\n\t\tif (typeOf(index) == 'element') index = elements.indexOf(index);\n\t\tif (index == this.previous && !options.alwaysHide) return this;\n\n\t\tif (options.resetHeight){\n\t\t\tvar prev = elements[this.previous];\n\t\t\tif (prev && !this.selfHidden){\n\t\t\t\tfor (var fx in effects) prev.setStyle(fx, prev[effects[fx]]);\n\t\t\t}\n\t\t}\n\n\t\tif ((this.timer && options.link == 'chain') || (index === this.previous && !options.alwaysHide)) return this;\n\n\t\tthis.previous = index;\n\t\tthis.selfHidden = false;\n\n\t\telements.each(function(el, i){\n\t\t\tobj[i] = {};\n\t\t\tvar hide;\n\t\t\tif (i != index){\n\t\t\t\thide = true;\n\t\t\t} else if (options.alwaysHide && ((el.offsetHeight > 0 && options.height) || el.offsetWidth > 0 && options.width)){\n\t\t\t\thide = true;\n\t\t\t\tthis.selfHidden = true;\n\t\t\t}\n\t\t\tthis.fireEvent(hide ? 'background' : 'active', [this.togglers[i], el]);\n\t\t\tfor (var fx in effects) obj[i][fx] = hide ? 0 : el[effects[fx]];\n\t\t\tif (!useFx && !hide && options.resetHeight) obj[i].height = 'auto';\n\t\t}, this);\n\n\t\tthis.internalChain.clearChain();\n\t\tthis.internalChain.chain(function(){\n\t\t\tif (options.resetHeight && !this.selfHidden){\n\t\t\t\tvar el = elements[index];\n\t\t\t\tif (el) el.setStyle('height', 'auto');\n\t\t\t}\n\t\t}.bind(this));\n\n\t\treturn useFx ? this.start(obj) : this.set(obj).internalChain.callChain();\n\t}\n\n});\n\n\n\n\n/*\n---\n\nscript: Fx.Move.js\n\nname: Fx.Move\n\ndescription: Defines Fx.Move, a class that works with Element.Position.js to transition an element from one location to another.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Fx.Morph\n - /Element.Position\n\nprovides: [Fx.Move]\n\n...\n*/\n\nFx.Move = new Class({\n\n\tExtends: Fx.Morph,\n\n\toptions: {\n\t\trelativeTo: document.body,\n\t\tposition: 'center',\n\t\tedge: false,\n\t\toffset: {x: 0, y: 0}\n\t},\n\n\tstart: function(destination){\n\t\tvar element = this.element,\n\t\t\ttopLeft = element.getStyles('top', 'left');\n\t\tif (topLeft.top == 'auto' || topLeft.left == 'auto'){\n\t\t\telement.setPosition(element.getPosition(element.getOffsetParent()));\n\t\t}\n\t\treturn this.parent(element.position(Object.merge({}, this.options, destination, {returnPos: true})));\n\t}\n\n});\n\nElement.Properties.move = {\n\n\tset: function(options){\n\t\tthis.get('move').cancel().setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar move = this.retrieve('move');\n\t\tif (!move){\n\t\t\tmove = new Fx.Move(this, {link: 'cancel'});\n\t\t\tthis.store('move', move);\n\t\t}\n\t\treturn move;\n\t}\n\n};\n\nElement.implement({\n\n\tmove: function(options){\n\t\tthis.get('move').start(options);\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Fx.Scroll.js\n\nname: Fx.Scroll\n\ndescription: Effect to smoothly scroll any element, including the window.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Fx\n - Core/Element.Event\n - Core/Element.Dimensions\n - /MooTools.More\n\nprovides: [Fx.Scroll]\n\n...\n*/\n\n(function(){\n\nFx.Scroll = new Class({\n\n\tExtends: Fx,\n\n\toptions: {\n\t\toffset: {x: 0, y: 0},\n\t\twheelStops: true\n\t},\n\n\tinitialize: function(element, options){\n\t\tthis.element = this.subject = document.id(element);\n\t\tthis.parent(options);\n\n\t\tif (typeOf(this.element) != 'element') this.element = document.id(this.element.getDocument().body);\n\n\t\tif (this.options.wheelStops){\n\t\t\tvar stopper = this.element,\n\t\t\t\tcancel = this.cancel.pass(false, this);\n\t\t\tthis.addEvent('start', function(){\n\t\t\t\tstopper.addEvent('mousewheel', cancel);\n\t\t\t}, true);\n\t\t\tthis.addEvent('complete', function(){\n\t\t\t\tstopper.removeEvent('mousewheel', cancel);\n\t\t\t}, true);\n\t\t}\n\t},\n\n\tset: function(){\n\t\tvar now = Array.flatten(arguments);\n\t\tif (Browser.firefox) now = [Math.round(now[0]), Math.round(now[1])]; // not needed anymore in newer firefox versions\n\t\tthis.element.scrollTo(now[0], now[1]);\n\t\treturn this;\n\t},\n\n\tcompute: function(from, to, delta){\n\t\treturn [0, 1].map(function(i){\n\t\t\treturn Fx.compute(from[i], to[i], delta);\n\t\t});\n\t},\n\n\tstart: function(x, y){\n\t\tif (!this.check(x, y)) return this;\n\t\tvar scroll = this.element.getScroll();\n\t\treturn this.parent([scroll.x, scroll.y], [x, y]);\n\t},\n\n\tcalculateScroll: function(x, y){\n\t\tvar element = this.element,\n\t\t\tscrollSize = element.getScrollSize(),\n\t\t\tscroll = element.getScroll(),\n\t\t\tsize = element.getSize(),\n\t\t\toffset = this.options.offset,\n\t\t\tvalues = {x: x, y: y};\n\n\t\tfor (var z in values){\n\t\t\tif (!values[z] && values[z] !== 0) values[z] = scroll[z];\n\t\t\tif (typeOf(values[z]) != 'number') values[z] = scrollSize[z] - size[z];\n\t\t\tvalues[z] += offset[z];\n\t\t}\n\n\t\treturn [values.x, values.y];\n\t},\n\n\ttoTop: function(){\n\t\treturn this.start.apply(this, this.calculateScroll(false, 0));\n\t},\n\n\ttoLeft: function(){\n\t\treturn this.start.apply(this, this.calculateScroll(0, false));\n\t},\n\n\ttoRight: function(){\n\t\treturn this.start.apply(this, this.calculateScroll('right', false));\n\t},\n\n\ttoBottom: function(){\n\t\treturn this.start.apply(this, this.calculateScroll(false, 'bottom'));\n\t},\n\n\ttoElement: function(el, axes){\n\t\taxes = axes ? Array.from(axes) : ['x', 'y'];\n\t\tvar scroll = isBody(this.element) ? {x: 0, y: 0} : this.element.getScroll();\n\t\tvar position = Object.map(document.id(el).getPosition(this.element), function(value, axis){\n\t\t\treturn axes.contains(axis) ? value + scroll[axis] : false;\n\t\t});\n\t\treturn this.start.apply(this, this.calculateScroll(position.x, position.y));\n\t},\n\n\ttoElementEdge: function(el, axes, offset){\n\t\taxes = axes ? Array.from(axes) : ['x', 'y'];\n\t\tel = document.id(el);\n\t\tvar to = {},\n\t\t\tposition = el.getPosition(this.element),\n\t\t\tsize = el.getSize(),\n\t\t\tscroll = this.element.getScroll(),\n\t\t\tcontainerSize = this.element.getSize(),\n\t\t\tedge = {\n\t\t\t\tx: position.x + size.x,\n\t\t\t\ty: position.y + size.y\n\t\t\t};\n\n\t\t['x', 'y'].each(function(axis){\n\t\t\tif (axes.contains(axis)){\n\t\t\t\tif (edge[axis] > scroll[axis] + containerSize[axis]) to[axis] = edge[axis] - containerSize[axis];\n\t\t\t\tif (position[axis] < scroll[axis]) to[axis] = position[axis];\n\t\t\t}\n\t\t\tif (to[axis] == null) to[axis] = scroll[axis];\n\t\t\tif (offset && offset[axis]) to[axis] = to[axis] + offset[axis];\n\t\t}, this);\n\n\t\tif (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);\n\t\treturn this;\n\t},\n\n\ttoElementCenter: function(el, axes, offset){\n\t\taxes = axes ? Array.from(axes) : ['x', 'y'];\n\t\tel = document.id(el);\n\t\tvar to = {},\n\t\t\tposition = el.getPosition(this.element),\n\t\t\tsize = el.getSize(),\n\t\t\tscroll = this.element.getScroll(),\n\t\t\tcontainerSize = this.element.getSize();\n\n\t\t['x', 'y'].each(function(axis){\n\t\t\tif (axes.contains(axis)){\n\t\t\t\tto[axis] = position[axis] - (containerSize[axis] - size[axis]) / 2;\n\t\t\t}\n\t\t\tif (to[axis] == null) to[axis] = scroll[axis];\n\t\t\tif (offset && offset[axis]) to[axis] = to[axis] + offset[axis];\n\t\t}, this);\n\n\t\tif (to.x != scroll.x || to.y != scroll.y) this.start(to.x, to.y);\n\t\treturn this;\n\t}\n\n});\n\n\n\nfunction isBody(element){\n\treturn (/^(?:body|html)$/i).test(element.tagName);\n}\n\n})();\n\n\n/*\n---\n\nscript: Fx.Slide.js\n\nname: Fx.Slide\n\ndescription: Effect to slide an element in and out of view.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Fx\n - Core/Element.Style\n - /MooTools.More\n\nprovides: [Fx.Slide]\n\n...\n*/\n\nFx.Slide = new Class({\n\n\tExtends: Fx,\n\n\toptions: {\n\t\tmode: 'vertical',\n\t\twrapper: false,\n\t\thideOverflow: true,\n\t\tresetHeight: false\n\t},\n\n\tinitialize: function(element, options){\n\t\telement = this.element = this.subject = document.id(element);\n\t\tthis.parent(options);\n\t\toptions = this.options;\n\n\t\tvar wrapper = element.retrieve('wrapper'),\n\t\t\tstyles = element.getStyles('margin', 'position', 'overflow');\n\n\t\tif (options.hideOverflow) styles = Object.append(styles, {overflow: 'hidden'});\n\t\tif (options.wrapper) wrapper = document.id(options.wrapper).setStyles(styles);\n\n\t\tif (!wrapper) wrapper = new Element('div', {\n\t\t\tstyles: styles\n\t\t}).wraps(element);\n\n\t\telement.store('wrapper', wrapper).setStyle('margin', 0);\n\t\tif (element.getStyle('overflow') == 'visible') element.setStyle('overflow', 'hidden');\n\n\t\tthis.now = [];\n\t\tthis.open = true;\n\t\tthis.wrapper = wrapper;\n\n\t\tthis.addEvent('complete', function(){\n\t\t\tthis.open = (wrapper['offset' + this.layout.capitalize()] != 0);\n\t\t\tif (this.open && this.options.resetHeight) wrapper.setStyle('height', '');\n\t\t}, true);\n\t},\n\n\tvertical: function(){\n\t\tthis.margin = 'margin-top';\n\t\tthis.layout = 'height';\n\t\tthis.offset = this.element.offsetHeight;\n\t},\n\n\thorizontal: function(){\n\t\tthis.margin = 'margin-left';\n\t\tthis.layout = 'width';\n\t\tthis.offset = this.element.offsetWidth;\n\t},\n\n\tset: function(now){\n\t\tthis.element.setStyle(this.margin, now[0]);\n\t\tthis.wrapper.setStyle(this.layout, now[1]);\n\t\treturn this;\n\t},\n\n\tcompute: function(from, to, delta){\n\t\treturn [0, 1].map(function(i){\n\t\t\treturn Fx.compute(from[i], to[i], delta);\n\t\t});\n\t},\n\n\tstart: function(how, mode){\n\t\tif (!this.check(how, mode)) return this;\n\t\tthis[mode || this.options.mode]();\n\n\t\tvar margin = this.element.getStyle(this.margin).toInt(),\n\t\t\tlayout = this.wrapper.getStyle(this.layout).toInt(),\n\t\t\tcaseIn = [[margin, layout], [0, this.offset]],\n\t\t\tcaseOut = [[margin, layout], [-this.offset, 0]],\n\t\t\tstart;\n\n\t\tswitch (how){\n\t\t\tcase 'in': start = caseIn; break;\n\t\t\tcase 'out': start = caseOut; break;\n\t\t\tcase 'toggle': start = (layout == 0) ? caseIn : caseOut;\n\t\t}\n\t\treturn this.parent(start[0], start[1]);\n\t},\n\n\tslideIn: function(mode){\n\t\treturn this.start('in', mode);\n\t},\n\n\tslideOut: function(mode){\n\t\treturn this.start('out', mode);\n\t},\n\n\thide: function(mode){\n\t\tthis[mode || this.options.mode]();\n\t\tthis.open = false;\n\t\treturn this.set([-this.offset, 0]);\n\t},\n\n\tshow: function(mode){\n\t\tthis[mode || this.options.mode]();\n\t\tthis.open = true;\n\t\treturn this.set([0, this.offset]);\n\t},\n\n\ttoggle: function(mode){\n\t\treturn this.start('toggle', mode);\n\t}\n\n});\n\nElement.Properties.slide = {\n\n\tset: function(options){\n\t\tthis.get('slide').cancel().setOptions(options);\n\t\treturn this;\n\t},\n\n\tget: function(){\n\t\tvar slide = this.retrieve('slide');\n\t\tif (!slide){\n\t\t\tslide = new Fx.Slide(this, {link: 'cancel'});\n\t\t\tthis.store('slide', slide);\n\t\t}\n\t\treturn slide;\n\t}\n\n};\n\nElement.implement({\n\n\tslide: function(how, mode){\n\t\thow = how || 'toggle';\n\t\tvar slide = this.get('slide'), toggle;\n\t\tswitch (how){\n\t\t\tcase 'hide': slide.hide(mode); break;\n\t\t\tcase 'show': slide.show(mode); break;\n\t\t\tcase 'toggle':\n\t\t\t\tvar flag = this.retrieve('slide:flag', slide.open);\n\t\t\t\tslide[flag ? 'slideOut' : 'slideIn'](mode);\n\t\t\t\tthis.store('slide:flag', !flag);\n\t\t\t\ttoggle = true;\n\t\t\tbreak;\n\t\t\tdefault: slide.start(how, mode);\n\t\t}\n\t\tif (!toggle) this.eliminate('slide:flag');\n\t\treturn this;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Fx.SmoothScroll.js\n\nname: Fx.SmoothScroll\n\ndescription: Class for creating a smooth scrolling effect to all internal links on the page.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Slick.Finder\n - /Fx.Scroll\n\nprovides: [Fx.SmoothScroll]\n\n...\n*/\n\nFx.SmoothScroll = new Class({\n\n\tExtends: Fx.Scroll,\n\n\toptions: {\n\t\taxes: ['x', 'y']\n\t},\n\n\tinitialize: function(options, context){\n\t\tcontext = context || document;\n\t\tthis.doc = context.getDocument();\n\t\tthis.parent(this.doc, options);\n\n\t\tvar win = context.getWindow(),\n\t\t\tlocation = win.location.href.match(/^[^#]*/)[0] + '#',\n\t\t\tlinks = $$(this.options.links || this.doc.links);\n\n\t\tlinks.each(function(link){\n\t\t\tif (link.href.indexOf(location) != 0) return;\n\t\t\tvar anchor = link.href.substr(location.length);\n\t\t\tif (anchor) this.useLink(link, anchor);\n\t\t}, this);\n\n\t\tthis.addEvent('complete', function(){\n\t\t\twin.location.hash = this.anchor;\n\t\t\tthis.element.scrollTo(this.to[0], this.to[1]);\n\t\t}, true);\n\t},\n\n\tuseLink: function(link, anchor){\n\n\t\tlink.addEvent('click', function(event){\n\t\t\tvar el = document.id(anchor) || this.doc.getElement('a[name=' + anchor + ']');\n\t\t\tif (!el) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tthis.toElement(el, this.options.axes).chain(function(){\n\t\t\t\tthis.fireEvent('scrolledTo', [link, el]);\n\t\t\t}.bind(this));\n\n\t\t\tthis.anchor = anchor;\n\n\t\t}.bind(this));\n\n\t\treturn this;\n\t}\n});\n\n\n/*\n---\n\nscript: Fx.Sort.js\n\nname: Fx.Sort\n\ndescription: Defines Fx.Sort, a class that reorders lists with a transition.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Element.Dimensions\n - /Fx.Elements\n - /Element.Measure\n\nprovides: [Fx.Sort]\n\n...\n*/\n\nFx.Sort = new Class({\n\n\tExtends: Fx.Elements,\n\n\toptions: {\n\t\tmode: 'vertical'\n\t},\n\n\tinitialize: function(elements, options){\n\t\tthis.parent(elements, options);\n\t\tthis.elements.each(function(el){\n\t\t\tif (el.getStyle('position') == 'static') el.setStyle('position', 'relative');\n\t\t});\n\t\tthis.setDefaultOrder();\n\t},\n\n\tsetDefaultOrder: function(){\n\t\tthis.currentOrder = this.elements.map(function(el, index){\n\t\t\treturn index;\n\t\t});\n\t},\n\n\tsort: function(){\n\t\tif (!this.check(arguments)) return this;\n\t\tvar newOrder = Array.flatten(arguments);\n\n\t\tvar top = 0,\n\t\t\tleft = 0,\n\t\t\tnext = {},\n\t\t\tzero = {},\n\t\t\tvert = this.options.mode == 'vertical';\n\n\t\tvar current = this.elements.map(function(el, index){\n\t\t\tvar size = el.getComputedSize({styles: ['border', 'padding', 'margin']});\n\t\t\tvar val;\n\t\t\tif (vert){\n\t\t\t\tval = {\n\t\t\t\t\ttop: top,\n\t\t\t\t\tmargin: size['margin-top'],\n\t\t\t\t\theight: size.totalHeight\n\t\t\t\t};\n\t\t\t\ttop += val.height - size['margin-top'];\n\t\t\t} else {\n\t\t\t\tval = {\n\t\t\t\t\tleft: left,\n\t\t\t\t\tmargin: size['margin-left'],\n\t\t\t\t\twidth: size.totalWidth\n\t\t\t\t};\n\t\t\t\tleft += val.width;\n\t\t\t}\n\t\t\tvar plane = vert ? 'top' : 'left';\n\t\t\tzero[index] = {};\n\t\t\tvar start = el.getStyle(plane).toInt();\n\t\t\tzero[index][plane] = start || 0;\n\t\t\treturn val;\n\t\t}, this);\n\n\t\tthis.set(zero);\n\t\tnewOrder = newOrder.map(function(i){ return i.toInt(); });\n\t\tif (newOrder.length != this.elements.length){\n\t\t\tthis.currentOrder.each(function(index){\n\t\t\t\tif (!newOrder.contains(index)) newOrder.push(index);\n\t\t\t});\n\t\t\tif (newOrder.length > this.elements.length)\n\t\t\t\tnewOrder.splice(this.elements.length-1, newOrder.length - this.elements.length);\n\t\t}\n\t\tvar margin = 0;\n\t\ttop = left = 0;\n\t\tnewOrder.each(function(item){\n\t\t\tvar newPos = {};\n\t\t\tif (vert){\n\t\t\t\tnewPos.top = top - current[item].top - margin;\n\t\t\t\ttop += current[item].height;\n\t\t\t} else {\n\t\t\t\tnewPos.left = left - current[item].left;\n\t\t\t\tleft += current[item].width;\n\t\t\t}\n\t\t\tmargin = margin + current[item].margin;\n\t\t\tnext[item]=newPos;\n\t\t}, this);\n\t\tvar mapped = {};\n\t\tArray.clone(newOrder).sort().each(function(index){\n\t\t\tmapped[index] = next[index];\n\t\t});\n\t\tthis.start(mapped);\n\t\tthis.currentOrder = newOrder;\n\n\t\treturn this;\n\t},\n\n\trearrangeDOM: function(newOrder){\n\t\tnewOrder = newOrder || this.currentOrder;\n\t\tvar parent = this.elements[0].getParent();\n\t\tvar rearranged = [];\n\t\tthis.elements.setStyle('opacity', 0);\n\t\t//move each element and store the new default order\n\t\tnewOrder.each(function(index){\n\t\t\trearranged.push(this.elements[index].inject(parent).setStyles({\n\t\t\t\ttop: 0,\n\t\t\t\tleft: 0\n\t\t\t}));\n\t\t}, this);\n\t\tthis.elements.setStyle('opacity', 1);\n\t\tthis.elements = $$(rearranged);\n\t\tthis.setDefaultOrder();\n\t\treturn this;\n\t},\n\n\tgetDefaultOrder: function(){\n\t\treturn this.elements.map(function(el, index){\n\t\t\treturn index;\n\t\t});\n\t},\n\n\tgetCurrentOrder: function(){\n\t\treturn this.currentOrder;\n\t},\n\n\tforward: function(){\n\t\treturn this.sort(this.getDefaultOrder());\n\t},\n\n\tbackward: function(){\n\t\treturn this.sort(this.getDefaultOrder().reverse());\n\t},\n\n\treverse: function(){\n\t\treturn this.sort(this.currentOrder.reverse());\n\t},\n\n\tsortByElements: function(elements){\n\t\treturn this.sort(elements.map(function(el){\n\t\t\treturn this.elements.indexOf(el);\n\t\t}, this));\n\t},\n\n\tswap: function(one, two){\n\t\tif (typeOf(one) == 'element') one = this.elements.indexOf(one);\n\t\tif (typeOf(two) == 'element') two = this.elements.indexOf(two);\n\n\t\tvar newOrder = Array.clone(this.currentOrder);\n\t\tnewOrder[this.currentOrder.indexOf(one)] = two;\n\t\tnewOrder[this.currentOrder.indexOf(two)] = one;\n\n\t\treturn this.sort(newOrder);\n\t}\n\n});\n\n\n/*\n---\n\nscript: Drag.js\n\nname: Drag\n\ndescription: The base Drag Class. Can be used to drag and resize Elements using mouse events.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n - Tom Occhinno\n - Jan Kassens\n\nrequires:\n - Core/Events\n - Core/Options\n - Core/Element.Event\n - Core/Element.Style\n - Core/Element.Dimensions\n - /MooTools.More\n\nprovides: [Drag]\n...\n\n*/\n\nvar Drag = new Class({\n\n\tImplements: [Events, Options],\n\n\toptions: {/*\n\t\tonBeforeStart: function(thisElement){},\n\t\tonStart: function(thisElement, event){},\n\t\tonSnap: function(thisElement){},\n\t\tonDrag: function(thisElement, event){},\n\t\tonCancel: function(thisElement){},\n\t\tonComplete: function(thisElement, event){},*/\n\t\tsnap: 6,\n\t\tunit: 'px',\n\t\tgrid: false,\n\t\tstyle: true,\n\t\tlimit: false,\n\t\thandle: false,\n\t\tinvert: false,\n\t\tpreventDefault: false,\n\t\tstopPropagation: false,\n\t\tmodifiers: {x: 'left', y: 'top'}\n\t},\n\n\tinitialize: function(){\n\t\tvar params = Array.link(arguments, {\n\t\t\t'options': Type.isObject,\n\t\t\t'element': function(obj){\n\t\t\t\treturn obj != null;\n\t\t\t}\n\t\t});\n\n\t\tthis.element = document.id(params.element);\n\t\tthis.document = this.element.getDocument();\n\t\tthis.setOptions(params.options || {});\n\t\tvar htype = typeOf(this.options.handle);\n\t\tthis.handles = ((htype == 'array' || htype == 'collection') ? $$(this.options.handle) : document.id(this.options.handle)) || this.element;\n\t\tthis.mouse = {'now': {}, 'pos': {}};\n\t\tthis.value = {'start': {}, 'now': {}};\n\n\t\tthis.selection = (Browser.ie) ? 'selectstart' : 'mousedown';\n\n\n\t\tif (Browser.ie && !Drag.ondragstartFixed){\n\t\t\tdocument.ondragstart = Function.from(false);\n\t\t\tDrag.ondragstartFixed = true;\n\t\t}\n\n\t\tthis.bound = {\n\t\t\tstart: this.start.bind(this),\n\t\t\tcheck: this.check.bind(this),\n\t\t\tdrag: this.drag.bind(this),\n\t\t\tstop: this.stop.bind(this),\n\t\t\tcancel: this.cancel.bind(this),\n\t\t\teventStop: Function.from(false)\n\t\t};\n\t\tthis.attach();\n\t},\n\n\tattach: function(){\n\t\tthis.handles.addEvent('mousedown', this.bound.start);\n\t\treturn this;\n\t},\n\n\tdetach: function(){\n\t\tthis.handles.removeEvent('mousedown', this.bound.start);\n\t\treturn this;\n\t},\n\n\tstart: function(event){\n\t\tvar options = this.options;\n\n\t\tif (event.rightClick) return;\n\n\t\tif (options.preventDefault) event.preventDefault();\n\t\tif (options.stopPropagation) event.stopPropagation();\n\t\tthis.mouse.start = event.page;\n\n\t\tthis.fireEvent('beforeStart', this.element);\n\n\t\tvar limit = options.limit;\n\t\tthis.limit = {x: [], y: []};\n\n\t\tvar z, coordinates;\n\t\tfor (z in options.modifiers){\n\t\t\tif (!options.modifiers[z]) continue;\n\n\t\t\tvar style = this.element.getStyle(options.modifiers[z]);\n\n\t\t\t// Some browsers (IE and Opera) don't always return pixels.\n\t\t\tif (style && !style.match(/px$/)){\n\t\t\t\tif (!coordinates) coordinates = this.element.getCoordinates(this.element.getOffsetParent());\n\t\t\t\tstyle = coordinates[options.modifiers[z]];\n\t\t\t}\n\n\t\t\tif (options.style) this.value.now[z] = (style || 0).toInt();\n\t\t\telse this.value.now[z] = this.element[options.modifiers[z]];\n\n\t\t\tif (options.invert) this.value.now[z] *= -1;\n\n\t\t\tthis.mouse.pos[z] = event.page[z] - this.value.now[z];\n\n\t\t\tif (limit && limit[z]){\n\t\t\t\tvar i = 2;\n\t\t\t\twhile (i--){\n\t\t\t\t\tvar limitZI = limit[z][i];\n\t\t\t\t\tif (limitZI || limitZI === 0) this.limit[z][i] = (typeof limitZI == 'function') ? limitZI() : limitZI;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (typeOf(this.options.grid) == 'number') this.options.grid = {\n\t\t\tx: this.options.grid,\n\t\t\ty: this.options.grid\n\t\t};\n\n\t\tvar events = {\n\t\t\tmousemove: this.bound.check,\n\t\t\tmouseup: this.bound.cancel\n\t\t};\n\t\tevents[this.selection] = this.bound.eventStop;\n\t\tthis.document.addEvents(events);\n\t},\n\n\tcheck: function(event){\n\t\tif (this.options.preventDefault) event.preventDefault();\n\t\tvar distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));\n\t\tif (distance > this.options.snap){\n\t\t\tthis.cancel();\n\t\t\tthis.document.addEvents({\n\t\t\t\tmousemove: this.bound.drag,\n\t\t\t\tmouseup: this.bound.stop\n\t\t\t});\n\t\t\tthis.fireEvent('start', [this.element, event]).fireEvent('snap', this.element);\n\t\t}\n\t},\n\n\tdrag: function(event){\n\t\tvar options = this.options;\n\n\t\tif (options.preventDefault) event.preventDefault();\n\t\tthis.mouse.now = event.page;\n\n\t\tfor (var z in options.modifiers){\n\t\t\tif (!options.modifiers[z]) continue;\n\t\t\tthis.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];\n\n\t\t\tif (options.invert) this.value.now[z] *= -1;\n\n\t\t\tif (options.limit && this.limit[z]){\n\t\t\t\tif ((this.limit[z][1] || this.limit[z][1] === 0) && (this.value.now[z] > this.limit[z][1])){\n\t\t\t\t\tthis.value.now[z] = this.limit[z][1];\n\t\t\t\t} else if ((this.limit[z][0] || this.limit[z][0] === 0) && (this.value.now[z] < this.limit[z][0])){\n\t\t\t\t\tthis.value.now[z] = this.limit[z][0];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options.grid[z]) this.value.now[z] -= ((this.value.now[z] - (this.limit[z][0]||0)) % options.grid[z]);\n\n\t\t\tif (options.style) this.element.setStyle(options.modifiers[z], this.value.now[z] + options.unit);\n\t\t\telse this.element[options.modifiers[z]] = this.value.now[z];\n\t\t}\n\n\t\tthis.fireEvent('drag', [this.element, event]);\n\t},\n\n\tcancel: function(event){\n\t\tthis.document.removeEvents({\n\t\t\tmousemove: this.bound.check,\n\t\t\tmouseup: this.bound.cancel\n\t\t});\n\t\tif (event){\n\t\t\tthis.document.removeEvent(this.selection, this.bound.eventStop);\n\t\t\tthis.fireEvent('cancel', this.element);\n\t\t}\n\t},\n\n\tstop: function(event){\n\t\tvar events = {\n\t\t\tmousemove: this.bound.drag,\n\t\t\tmouseup: this.bound.stop\n\t\t};\n\t\tevents[this.selection] = this.bound.eventStop;\n\t\tthis.document.removeEvents(events);\n\t\tif (event) this.fireEvent('complete', [this.element, event]);\n\t}\n\n});\n\nElement.implement({\n\n\tmakeResizable: function(options){\n\t\tvar drag = new Drag(this, Object.merge({\n\t\t\tmodifiers: {\n\t\t\t\tx: 'width',\n\t\t\t\ty: 'height'\n\t\t\t}\n\t\t}, options));\n\n\t\tthis.store('resizer', drag);\n\t\treturn drag.addEvent('drag', function(){\n\t\t\tthis.fireEvent('resize', drag);\n\t\t}.bind(this));\n\t}\n\n});\n\n\n/*\n---\n\nscript: Drag.Move.js\n\nname: Drag.Move\n\ndescription: A Drag extension that provides support for the constraining of draggables to containers and droppables.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n - Tom Occhinno\n - Jan Kassens\n - Aaron Newton\n - Scott Kyle\n\nrequires:\n - Core/Element.Dimensions\n - /Drag\n\nprovides: [Drag.Move]\n\n...\n*/\n\nDrag.Move = new Class({\n\n\tExtends: Drag,\n\n\toptions: {/*\n\t\tonEnter: function(thisElement, overed){},\n\t\tonLeave: function(thisElement, overed){},\n\t\tonDrop: function(thisElement, overed, event){},*/\n\t\tdroppables: [],\n\t\tcontainer: false,\n\t\tprecalculate: false,\n\t\tincludeMargins: true,\n\t\tcheckDroppables: true\n\t},\n\n\tinitialize: function(element, options){\n\t\tthis.parent(element, options);\n\t\telement = this.element;\n\n\t\tthis.droppables = $$(this.options.droppables);\n\t\tthis.container = document.id(this.options.container);\n\n\t\tif (this.container && typeOf(this.container) != 'element')\n\t\t\tthis.container = document.id(this.container.getDocument().body);\n\n\t\tif (this.options.style){\n\t\t\tif (this.options.modifiers.x == 'left' && this.options.modifiers.y == 'top'){\n\t\t\t\tvar parent = element.getOffsetParent(),\n\t\t\t\t\tstyles = element.getStyles('left', 'top');\n\t\t\t\tif (parent && (styles.left == 'auto' || styles.top == 'auto')){\n\t\t\t\t\telement.setPosition(element.getPosition(parent));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (element.getStyle('position') == 'static') element.setStyle('position', 'absolute');\n\t\t}\n\n\t\tthis.addEvent('start', this.checkDroppables, true);\n\t\tthis.overed = null;\n\t},\n\n\tstart: function(event){\n\t\tif (this.container) this.options.limit = this.calculateLimit();\n\n\t\tif (this.options.precalculate){\n\t\t\tthis.positions = this.droppables.map(function(el){\n\t\t\t\treturn el.getCoordinates();\n\t\t\t});\n\t\t}\n\n\t\tthis.parent(event);\n\t},\n\n\tcalculateLimit: function(){\n\t\tvar element = this.element,\n\t\t\tcontainer = this.container,\n\n\t\t\toffsetParent = document.id(element.getOffsetParent()) || document.body,\n\t\t\tcontainerCoordinates = container.getCoordinates(offsetParent),\n\t\t\telementMargin = {},\n\t\t\telementBorder = {},\n\t\t\tcontainerMargin = {},\n\t\t\tcontainerBorder = {},\n\t\t\toffsetParentPadding = {};\n\n\t\t['top', 'right', 'bottom', 'left'].each(function(pad){\n\t\t\telementMargin[pad] = element.getStyle('margin-' + pad).toInt();\n\t\t\telementBorder[pad] = element.getStyle('border-' + pad).toInt();\n\t\t\tcontainerMargin[pad] = container.getStyle('margin-' + pad).toInt();\n\t\t\tcontainerBorder[pad] = container.getStyle('border-' + pad).toInt();\n\t\t\toffsetParentPadding[pad] = offsetParent.getStyle('padding-' + pad).toInt();\n\t\t}, this);\n\n\t\tvar width = element.offsetWidth + elementMargin.left + elementMargin.right,\n\t\t\theight = element.offsetHeight + elementMargin.top + elementMargin.bottom,\n\t\t\tleft = 0,\n\t\t\ttop = 0,\n\t\t\tright = containerCoordinates.right - containerBorder.right - width,\n\t\t\tbottom = containerCoordinates.bottom - containerBorder.bottom - height;\n\n\t\tif (this.options.includeMargins){\n\t\t\tleft += elementMargin.left;\n\t\t\ttop += elementMargin.top;\n\t\t} else {\n\t\t\tright += elementMargin.right;\n\t\t\tbottom += elementMargin.bottom;\n\t\t}\n\n\t\tif (element.getStyle('position') == 'relative'){\n\t\t\tvar coords = element.getCoordinates(offsetParent);\n\t\t\tcoords.left -= element.getStyle('left').toInt();\n\t\t\tcoords.top -= element.getStyle('top').toInt();\n\n\t\t\tleft -= coords.left;\n\t\t\ttop -= coords.top;\n\t\t\tif (container.getStyle('position') != 'relative'){\n\t\t\t\tleft += containerBorder.left;\n\t\t\t\ttop += containerBorder.top;\n\t\t\t}\n\t\t\tright += elementMargin.left - coords.left;\n\t\t\tbottom += elementMargin.top - coords.top;\n\n\t\t\tif (container != offsetParent){\n\t\t\t\tleft += containerMargin.left + offsetParentPadding.left;\n\t\t\t\ttop += ((Browser.ie6 || Browser.ie7) ? 0 : containerMargin.top) + offsetParentPadding.top;\n\t\t\t}\n\t\t} else {\n\t\t\tleft -= elementMargin.left;\n\t\t\ttop -= elementMargin.top;\n\t\t\tif (container != offsetParent){\n\t\t\t\tleft += containerCoordinates.left + containerBorder.left;\n\t\t\t\ttop += containerCoordinates.top + containerBorder.top;\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\tx: [left, right],\n\t\t\ty: [top, bottom]\n\t\t};\n\t},\n\n\tgetDroppableCoordinates: function(element){\n\t\tvar position = element.getCoordinates();\n\t\tif (element.getStyle('position') == 'fixed'){\n\t\t\tvar scroll = window.getScroll();\n\t\t\tposition.left += scroll.x;\n\t\t\tposition.right += scroll.x;\n\t\t\tposition.top += scroll.y;\n\t\t\tposition.bottom += scroll.y;\n\t\t}\n\t\treturn position;\n\t},\n\n\tcheckDroppables: function(){\n\t\tvar overed = this.droppables.filter(function(el, i){\n\t\t\tel = this.positions ? this.positions[i] : this.getDroppableCoordinates(el);\n\t\t\tvar now = this.mouse.now;\n\t\t\treturn (now.x > el.left && now.x < el.right && now.y < el.bottom && now.y > el.top);\n\t\t}, this).getLast();\n\n\t\tif (this.overed != overed){\n\t\t\tif (this.overed) this.fireEvent('leave', [this.element, this.overed]);\n\t\t\tif (overed) this.fireEvent('enter', [this.element, overed]);\n\t\t\tthis.overed = overed;\n\t\t}\n\t},\n\n\tdrag: function(event){\n\t\tthis.parent(event);\n\t\tif (this.options.checkDroppables && this.droppables.length) this.checkDroppables();\n\t},\n\n\tstop: function(event){\n\t\tthis.checkDroppables();\n\t\tthis.fireEvent('drop', [this.element, this.overed, event]);\n\t\tthis.overed = null;\n\t\treturn this.parent(event);\n\t}\n\n});\n\nElement.implement({\n\n\tmakeDraggable: function(options){\n\t\tvar drag = new Drag.Move(this, options);\n\t\tthis.store('dragger', drag);\n\t\treturn drag;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Slider.js\n\nname: Slider\n\ndescription: Class for creating horizontal and vertical slider controls.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Element.Dimensions\n - /Class.Binds\n - /Drag\n - /Element.Measure\n\nprovides: [Slider]\n\n...\n*/\n\nvar Slider = new Class({\n\n\tImplements: [Events, Options],\n\n\tBinds: ['clickedElement', 'draggedKnob', 'scrolledElement'],\n\n\toptions: {/*\n\t\tonTick: function(intPosition){},\n\t\tonChange: function(intStep){},\n\t\tonComplete: function(strStep){},*/\n\t\tonTick: function(position){\n\t\t\tthis.setKnobPosition(position);\n\t\t},\n\t\tinitialStep: 0,\n\t\tsnap: false,\n\t\toffset: 0,\n\t\trange: false,\n\t\twheel: false,\n\t\tsteps: 100,\n\t\tmode: 'horizontal'\n\t},\n\n\tinitialize: function(element, knob, options){\n\t\tthis.setOptions(options);\n\t\toptions = this.options;\n\t\tthis.element = document.id(element);\n\t\tknob = this.knob = document.id(knob);\n\t\tthis.previousChange = this.previousEnd = this.step = -1;\n\n\t\tvar limit = {},\n\t\t\tmodifiers = {x: false, y: false};\n\n\t\tswitch (options.mode){\n\t\t\tcase 'vertical':\n\t\t\t\tthis.axis = 'y';\n\t\t\t\tthis.property = 'top';\n\t\t\t\tthis.offset = 'offsetHeight';\n\t\t\t\tbreak;\n\t\t\tcase 'horizontal':\n\t\t\t\tthis.axis = 'x';\n\t\t\t\tthis.property = 'left';\n\t\t\t\tthis.offset = 'offsetWidth';\n\t\t}\n\n\t\tthis.setSliderDimensions();\n\t\tthis.setRange(options.range);\n\n\t\tif (knob.getStyle('position') == 'static') knob.setStyle('position', 'relative');\n\t\tknob.setStyle(this.property, -options.offset);\n\t\tmodifiers[this.axis] = this.property;\n\t\tlimit[this.axis] = [-options.offset, this.full - options.offset];\n\n\t\tvar dragOptions = {\n\t\t\tsnap: 0,\n\t\t\tlimit: limit,\n\t\t\tmodifiers: modifiers,\n\t\t\tonDrag: this.draggedKnob,\n\t\t\tonStart: this.draggedKnob,\n\t\t\tonBeforeStart: (function(){\n\t\t\t\tthis.isDragging = true;\n\t\t\t}).bind(this),\n\t\t\tonCancel: function(){\n\t\t\t\tthis.isDragging = false;\n\t\t\t}.bind(this),\n\t\t\tonComplete: function(){\n\t\t\t\tthis.isDragging = false;\n\t\t\t\tthis.draggedKnob();\n\t\t\t\tthis.end();\n\t\t\t}.bind(this)\n\t\t};\n\t\tif (options.snap) this.setSnap(dragOptions);\n\n\t\tthis.drag = new Drag(knob, dragOptions);\n\t\tthis.attach();\n\t\tif (options.initialStep != null) this.set(options.initialStep);\n\t},\n\n\tattach: function(){\n\t\tthis.element.addEvent('mousedown', this.clickedElement);\n\t\tif (this.options.wheel) this.element.addEvent('mousewheel', this.scrolledElement);\n\t\tthis.drag.attach();\n\t\treturn this;\n\t},\n\n\tdetach: function(){\n\t\tthis.element.removeEvent('mousedown', this.clickedElement)\n\t\t\t.removeEvent('mousewheel', this.scrolledElement);\n\t\tthis.drag.detach();\n\t\treturn this;\n\t},\n\n\tautosize: function(){\n\t\tthis.setSliderDimensions()\n\t\t\t.setKnobPosition(this.toPosition(this.step));\n\t\tthis.drag.options.limit[this.axis] = [-this.options.offset, this.full - this.options.offset];\n\t\tif (this.options.snap) this.setSnap();\n\t\treturn this;\n\t},\n\n\tsetSnap: function(options){\n\t\tif (!options) options = this.drag.options;\n\t\toptions.grid = Math.ceil(this.stepWidth);\n\t\toptions.limit[this.axis][1] = this.full;\n\t\treturn this;\n\t},\n\n\tsetKnobPosition: function(position){\n\t\tif (this.options.snap) position = this.toPosition(this.step);\n\t\tthis.knob.setStyle(this.property, position);\n\t\treturn this;\n\t},\n\n\tsetSliderDimensions: function(){\n\t\tthis.full = this.element.measure(function(){\n\t\t\tthis.half = this.knob[this.offset] / 2;\n\t\t\treturn this.element[this.offset] - this.knob[this.offset] + (this.options.offset * 2);\n\t\t}.bind(this));\n\t\treturn this;\n\t},\n\n\tset: function(step){\n\t\tif (!((this.range > 0) ^ (step < this.min))) step = this.min;\n\t\tif (!((this.range > 0) ^ (step > this.max))) step = this.max;\n\n\t\tthis.step = Math.round(step);\n\t\treturn this.checkStep()\n\t\t\t.fireEvent('tick', this.toPosition(this.step))\n\t\t\t.end();\n\t},\n\n\tsetRange: function(range, pos){\n\t\tthis.min = Array.pick([range[0], 0]);\n\t\tthis.max = Array.pick([range[1], this.options.steps]);\n\t\tthis.range = this.max - this.min;\n\t\tthis.steps = this.options.steps || this.full;\n\t\tthis.stepSize = Math.abs(this.range) / this.steps;\n\t\tthis.stepWidth = this.stepSize * this.full / Math.abs(this.range);\n\t\tif (range) this.set(Array.pick([pos, this.step]).floor(this.min).max(this.max));\n\t\treturn this;\n\t},\n\n\tclickedElement: function(event){\n\t\tif (this.isDragging || event.target == this.knob) return;\n\n\t\tvar dir = this.range < 0 ? -1 : 1,\n\t\t\tposition = event.page[this.axis] - this.element.getPosition()[this.axis] - this.half;\n\n\t\tposition = position.limit(-this.options.offset, this.full - this.options.offset);\n\n\t\tthis.step = Math.round(this.min + dir * this.toStep(position));\n\n\t\tthis.checkStep()\n\t\t\t.fireEvent('tick', position)\n\t\t\t.end();\n\t},\n\n\tscrolledElement: function(event){\n\t\tvar mode = (this.options.mode == 'horizontal') ? (event.wheel < 0) : (event.wheel > 0);\n\t\tthis.set(this.step + (mode ? -1 : 1) * this.stepSize);\n\t\tevent.stop();\n\t},\n\n\tdraggedKnob: function(){\n\t\tvar dir = this.range < 0 ? -1 : 1,\n\t\t\tposition = this.drag.value.now[this.axis];\n\n\t\tposition = position.limit(-this.options.offset, this.full -this.options.offset);\n\n\t\tthis.step = Math.round(this.min + dir * this.toStep(position));\n\t\tthis.checkStep();\n\t},\n\n\tcheckStep: function(){\n\t\tvar step = this.step;\n\t\tif (this.previousChange != step){\n\t\t\tthis.previousChange = step;\n\t\t\tthis.fireEvent('change', step);\n\t\t}\n\t\treturn this;\n\t},\n\n\tend: function(){\n\t\tvar step = this.step;\n\t\tif (this.previousEnd !== step){\n\t\t\tthis.previousEnd = step;\n\t\t\tthis.fireEvent('complete', step + '');\n\t\t}\n\t\treturn this;\n\t},\n\n\ttoStep: function(position){\n\t\tvar step = (position + this.options.offset) * this.stepSize / this.full * this.steps;\n\t\treturn this.options.steps ? Math.round(step -= step % this.stepSize) : step;\n\t},\n\n\ttoPosition: function(step){\n\t\treturn (this.full * Math.abs(this.min - step)) / (this.steps * this.stepSize) - this.options.offset;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Sortables.js\n\nname: Sortables\n\ndescription: Class for creating a drag and drop sorting interface for lists of items.\n\nlicense: MIT-style license\n\nauthors:\n - Tom Occhino\n\nrequires:\n - Core/Fx.Morph\n - /Drag.Move\n\nprovides: [Sortables]\n\n...\n*/\n\nvar Sortables = new Class({\n\n\tImplements: [Events, Options],\n\n\toptions: {/*\n\t\tonSort: function(element, clone){},\n\t\tonStart: function(element, clone){},\n\t\tonComplete: function(element){},*/\n\t\topacity: 1,\n\t\tclone: false,\n\t\trevert: false,\n\t\thandle: false,\n\t\tdragOptions: {}\n\t},\n\n\tinitialize: function(lists, options){\n\t\tthis.setOptions(options);\n\n\t\tthis.elements = [];\n\t\tthis.lists = [];\n\t\tthis.idle = true;\n\n\t\tthis.addLists($$(document.id(lists) || lists));\n\n\t\tif (!this.options.clone) this.options.revert = false;\n\t\tif (this.options.revert) this.effect = new Fx.Morph(null, Object.merge({\n\t\t\tduration: 250,\n\t\t\tlink: 'cancel'\n\t\t}, this.options.revert));\n\t},\n\n\tattach: function(){\n\t\tthis.addLists(this.lists);\n\t\treturn this;\n\t},\n\n\tdetach: function(){\n\t\tthis.lists = this.removeLists(this.lists);\n\t\treturn this;\n\t},\n\n\taddItems: function(){\n\t\tArray.flatten(arguments).each(function(element){\n\t\t\tthis.elements.push(element);\n\t\t\tvar start = element.retrieve('sortables:start', function(event){\n\t\t\t\tthis.start.call(this, event, element);\n\t\t\t}.bind(this));\n\t\t\t(this.options.handle ? element.getElement(this.options.handle) || element : element).addEvent('mousedown', start);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\taddLists: function(){\n\t\tArray.flatten(arguments).each(function(list){\n\t\t\tthis.lists.include(list);\n\t\t\tthis.addItems(list.getChildren());\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tremoveItems: function(){\n\t\treturn $$(Array.flatten(arguments).map(function(element){\n\t\t\tthis.elements.erase(element);\n\t\t\tvar start = element.retrieve('sortables:start');\n\t\t\t(this.options.handle ? element.getElement(this.options.handle) || element : element).removeEvent('mousedown', start);\n\n\t\t\treturn element;\n\t\t}, this));\n\t},\n\n\tremoveLists: function(){\n\t\treturn $$(Array.flatten(arguments).map(function(list){\n\t\t\tthis.lists.erase(list);\n\t\t\tthis.removeItems(list.getChildren());\n\n\t\t\treturn list;\n\t\t}, this));\n\t},\n\n\tgetClone: function(event, element){\n\t\tif (!this.options.clone) return new Element(element.tagName).inject(document.body);\n\t\tif (typeOf(this.options.clone) == 'function') return this.options.clone.call(this, event, element, this.list);\n\t\tvar clone = element.clone(true).setStyles({\n\t\t\tmargin: 0,\n\t\t\tposition: 'absolute',\n\t\t\tvisibility: 'hidden',\n\t\t\twidth: element.getStyle('width')\n\t\t}).addEvent('mousedown', function(event){\n\t\t\telement.fireEvent('mousedown', event);\n\t\t});\n\t\t//prevent the duplicated radio inputs from unchecking the real one\n\t\tif (clone.get('html').test('radio')){\n\t\t\tclone.getElements('input[type=radio]').each(function(input, i){\n\t\t\t\tinput.set('name', 'clone_' + i);\n\t\t\t\tif (input.get('checked')) element.getElements('input[type=radio]')[i].set('checked', true);\n\t\t\t});\n\t\t}\n\n\t\treturn clone.inject(this.list).setPosition(element.getPosition(element.getOffsetParent()));\n\t},\n\n\tgetDroppables: function(){\n\t\tvar droppables = this.list.getChildren().erase(this.clone).erase(this.element);\n\t\tif (!this.options.constrain) droppables.append(this.lists).erase(this.list);\n\t\treturn droppables;\n\t},\n\n\tinsert: function(dragging, element){\n\t\tvar where = 'inside';\n\t\tif (this.lists.contains(element)){\n\t\t\tthis.list = element;\n\t\t\tthis.drag.droppables = this.getDroppables();\n\t\t} else {\n\t\t\twhere = this.element.getAllPrevious().contains(element) ? 'before' : 'after';\n\t\t}\n\t\tthis.element.inject(element, where);\n\t\tthis.fireEvent('sort', [this.element, this.clone]);\n\t},\n\n\tstart: function(event, element){\n\t\tif (\n\t\t\t!this.idle ||\n\t\t\tevent.rightClick ||\n\t\t\t['button', 'input', 'a', 'textarea'].contains(event.target.get('tag'))\n\t\t) return;\n\n\t\tthis.idle = false;\n\t\tthis.element = element;\n\t\tthis.opacity = element.getStyle('opacity');\n\t\tthis.list = element.getParent();\n\t\tthis.clone = this.getClone(event, element);\n\n\t\tthis.drag = new Drag.Move(this.clone, Object.merge({\n\t\t\t\n\t\t\tdroppables: this.getDroppables()\n\t\t}, this.options.dragOptions)).addEvents({\n\t\t\tonSnap: function(){\n\t\t\t\tevent.stop();\n\t\t\t\tthis.clone.setStyle('visibility', 'visible');\n\t\t\t\tthis.element.setStyle('opacity', this.options.opacity || 0);\n\t\t\t\tthis.fireEvent('start', [this.element, this.clone]);\n\t\t\t}.bind(this),\n\t\t\tonEnter: this.insert.bind(this),\n\t\t\tonCancel: this.end.bind(this),\n\t\t\tonComplete: this.end.bind(this)\n\t\t});\n\n\t\tthis.clone.inject(this.element, 'before');\n\t\tthis.drag.start(event);\n\t},\n\n\tend: function(){\n\t\tthis.drag.detach();\n\t\tthis.element.setStyle('opacity', this.opacity);\n\t\tif (this.effect){\n\t\t\tvar dim = this.element.getStyles('width', 'height'),\n\t\t\t\tclone = this.clone,\n\t\t\t\tpos = clone.computePosition(this.element.getPosition(this.clone.getOffsetParent()));\n\n\t\t\tvar destroy = function(){\n\t\t\t\tthis.removeEvent('cancel', destroy);\n\t\t\t\tclone.destroy();\n\t\t\t};\n\n\t\t\tthis.effect.element = clone;\n\t\t\tthis.effect.start({\n\t\t\t\ttop: pos.top,\n\t\t\t\tleft: pos.left,\n\t\t\t\twidth: dim.width,\n\t\t\t\theight: dim.height,\n\t\t\t\topacity: 0.25\n\t\t\t}).addEvent('cancel', destroy).chain(destroy);\n\t\t} else {\n\t\t\tthis.clone.destroy();\n\t\t}\n\t\tthis.reset();\n\t},\n\n\treset: function(){\n\t\tthis.idle = true;\n\t\tthis.fireEvent('complete', this.element);\n\t},\n\n\tserialize: function(){\n\t\tvar params = Array.link(arguments, {\n\t\t\tmodifier: Type.isFunction,\n\t\t\tindex: function(obj){\n\t\t\t\treturn obj != null;\n\t\t\t}\n\t\t});\n\t\tvar serial = this.lists.map(function(list){\n\t\t\treturn list.getChildren().map(params.modifier || function(element){\n\t\t\t\treturn element.get('id');\n\t\t\t}, this);\n\t\t}, this);\n\n\t\tvar index = params.index;\n\t\tif (this.lists.length == 1) index = 0;\n\t\treturn (index || index === 0) && index >= 0 && index < this.lists.length ? serial[index] : serial;\n\t}\n\n});\n\n\n/*\n---\n\nscript: Request.JSONP.js\n\nname: Request.JSONP\n\ndescription: Defines Request.JSONP, a class for cross domain javascript via script injection.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n - Guillermo Rauch\n - Arian Stolwijk\n\nrequires:\n - Core/Element\n - Core/Request\n - MooTools.More\n\nprovides: [Request.JSONP]\n\n...\n*/\n\nRequest.JSONP = new Class({\n\n\tImplements: [Chain, Events, Options],\n\n\toptions: {/*\n\t\tonRequest: function(src, scriptElement){},\n\t\tonComplete: function(data){},\n\t\tonSuccess: function(data){},\n\t\tonCancel: function(){},\n\t\tonTimeout: function(){},\n\t\tonError: function(){}, */\n\t\tonRequest: function(src){\n\t\t\tif (this.options.log && window.console && console.log){\n\t\t\t\tconsole.log('JSONP retrieving script with url:' + src);\n\t\t\t}\n\t\t},\n\t\tonError: function(src){\n\t\t\tif (this.options.log && window.console && console.warn){\n\t\t\t\tconsole.warn('JSONP '+ src +' will fail in Internet Explorer, which enforces a 2083 bytes length limit on URIs');\n\t\t\t}\n\t\t},\n\t\turl: '',\n\t\tcallbackKey: 'callback',\n\t\tinjectScript: document.head,\n\t\tdata: '',\n\t\tlink: 'ignore',\n\t\ttimeout: 0,\n\t\tlog: false\n\t},\n\n\tinitialize: function(options){\n\t\tthis.setOptions(options);\n\t},\n\n\tsend: function(options){\n\t\tif (!Request.prototype.check.call(this, options)) return this;\n\t\tthis.running = true;\n\n\t\tvar type = typeOf(options);\n\t\tif (type == 'string' || type == 'element') options = {data: options};\n\t\toptions = Object.merge(this.options, options || {});\n\n\t\tvar data = options.data;\n\t\tswitch (typeOf(data)){\n\t\t\tcase 'element': data = document.id(data).toQueryString(); break;\n\t\t\tcase 'object': case 'hash': data = Object.toQueryString(data);\n\t\t}\n\n\t\tvar index = this.index = Request.JSONP.counter++;\n\n\t\tvar src = options.url +\n\t\t\t(options.url.test('\\\\?') ? '&' :'?') +\n\t\t\t(options.callbackKey) +\n\t\t\t'=Request.JSONP.request_map.request_'+ index +\n\t\t\t(data ? '&' + data : '');\n\n\t\tif (src.length > 2083) this.fireEvent('error', src);\n\n\t\tRequest.JSONP.request_map['request_' + index] = function(){\n\t\t\tthis.success(arguments, index);\n\t\t}.bind(this);\n\n\t\tvar script = this.getScript(src).inject(options.injectScript);\n\t\tthis.fireEvent('request', [src, script]);\n\n\t\tif (options.timeout) this.timeout.delay(options.timeout, this);\n\n\t\treturn this;\n\t},\n\n\tgetScript: function(src){\n\t\tif (!this.script) this.script = new Element('script', {\n\t\t\ttype: 'text/javascript',\n\t\t\tasync: true,\n\t\t\tsrc: src\n\t\t});\n\t\treturn this.script;\n\t},\n\n\tsuccess: function(args, index){\n\t\tif (!this.running) return;\n\t\tthis.clear()\n\t\t\t.fireEvent('complete', args).fireEvent('success', args)\n\t\t\t.callChain();\n\t},\n\n\tcancel: function(){\n\t\tif (this.running) this.clear().fireEvent('cancel');\n\t\treturn this;\n\t},\n\n\tisRunning: function(){\n\t\treturn !!this.running;\n\t},\n\n\tclear: function(){\n\t\tthis.running = false;\n\t\tif (this.script){\n\t\t\tthis.script.destroy();\n\t\t\tthis.script = null;\n\t\t}\n\t\treturn this;\n\t},\n\n\ttimeout: function(){\n\t\tif (this.running){\n\t\t\tthis.running = false;\n\t\t\tthis.fireEvent('timeout', [this.script.get('src'), this.script]).fireEvent('failure').cancel();\n\t\t}\n\t\treturn this;\n\t}\n\n});\n\nRequest.JSONP.counter = 0;\nRequest.JSONP.request_map = {};\n\n\n/*\n---\n\nscript: Request.Queue.js\n\nname: Request.Queue\n\ndescription: Controls several instances of Request and its variants to run only one request at a time.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Element\n - Core/Request\n - /Class.Binds\n\nprovides: [Request.Queue]\n\n...\n*/\n\nRequest.Queue = new Class({\n\n\tImplements: [Options, Events],\n\n\tBinds: ['attach', 'request', 'complete', 'cancel', 'success', 'failure', 'exception'],\n\n\toptions: {/*\n\t\tonRequest: function(argsPassedToOnRequest){},\n\t\tonSuccess: function(argsPassedToOnSuccess){},\n\t\tonComplete: function(argsPassedToOnComplete){},\n\t\tonCancel: function(argsPassedToOnCancel){},\n\t\tonException: function(argsPassedToOnException){},\n\t\tonFailure: function(argsPassedToOnFailure){},\n\t\tonEnd: function(){},\n\t\t*/\n\t\tstopOnFailure: true,\n\t\tautoAdvance: true,\n\t\tconcurrent: 1,\n\t\trequests: {}\n\t},\n\n\tinitialize: function(options){\n\t\tvar requests;\n\t\tif (options){\n\t\t\trequests = options.requests;\n\t\t\tdelete options.requests;\n\t\t}\n\t\tthis.setOptions(options);\n\t\tthis.requests = {};\n\t\tthis.queue = [];\n\t\tthis.reqBinders = {};\n\n\t\tif (requests) this.addRequests(requests);\n\t},\n\n\taddRequest: function(name, request){\n\t\tthis.requests[name] = request;\n\t\tthis.attach(name, request);\n\t\treturn this;\n\t},\n\n\taddRequests: function(obj){\n\t\tObject.each(obj, function(req, name){\n\t\t\tthis.addRequest(name, req);\n\t\t}, this);\n\t\treturn this;\n\t},\n\n\tgetName: function(req){\n\t\treturn Object.keyOf(this.requests, req);\n\t},\n\n\tattach: function(name, req){\n\t\tif (req._groupSend) return this;\n\t\t['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){\n\t\t\tif (!this.reqBinders[name]) this.reqBinders[name] = {};\n\t\t\tthis.reqBinders[name][evt] = function(){\n\t\t\t\tthis['on' + evt.capitalize()].apply(this, [name, req].append(arguments));\n\t\t\t}.bind(this);\n\t\t\treq.addEvent(evt, this.reqBinders[name][evt]);\n\t\t}, this);\n\t\treq._groupSend = req.send;\n\t\treq.send = function(options){\n\t\t\tthis.send(name, options);\n\t\t\treturn req;\n\t\t}.bind(this);\n\t\treturn this;\n\t},\n\n\tremoveRequest: function(req){\n\t\tvar name = typeOf(req) == 'object' ? this.getName(req) : req;\n\t\tif (!name && typeOf(name) != 'string') return this;\n\t\treq = this.requests[name];\n\t\tif (!req) return this;\n\t\t['request', 'complete', 'cancel', 'success', 'failure', 'exception'].each(function(evt){\n\t\t\treq.removeEvent(evt, this.reqBinders[name][evt]);\n\t\t}, this);\n\t\treq.send = req._groupSend;\n\t\tdelete req._groupSend;\n\t\treturn this;\n\t},\n\n\tgetRunning: function(){\n\t\treturn Object.filter(this.requests, function(r){\n\t\t\treturn r.running;\n\t\t});\n\t},\n\n\tisRunning: function(){\n\t\treturn !!(Object.keys(this.getRunning()).length);\n\t},\n\n\tsend: function(name, options){\n\t\tvar q = function(){\n\t\t\tthis.requests[name]._groupSend(options);\n\t\t\tthis.queue.erase(q);\n\t\t}.bind(this);\n\n\t\tq.name = name;\n\t\tif (Object.keys(this.getRunning()).length >= this.options.concurrent || (this.error && this.options.stopOnFailure)) this.queue.push(q);\n\t\telse q();\n\t\treturn this;\n\t},\n\n\thasNext: function(name){\n\t\treturn (!name) ? !!this.queue.length : !!this.queue.filter(function(q){ return q.name == name; }).length;\n\t},\n\n\tresume: function(){\n\t\tthis.error = false;\n\t\t(this.options.concurrent - Object.keys(this.getRunning()).length).times(this.runNext, this);\n\t\treturn this;\n\t},\n\n\trunNext: function(name){\n\t\tif (!this.queue.length) return this;\n\t\tif (!name){\n\t\t\tthis.queue[0]();\n\t\t} else {\n\t\t\tvar found;\n\t\t\tthis.queue.each(function(q){\n\t\t\t\tif (!found && q.name == name){\n\t\t\t\t\tfound = true;\n\t\t\t\t\tq();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t},\n\n\trunAll: function(){\n\t\tthis.queue.each(function(q){\n\t\t\tq();\n\t\t});\n\t\treturn this;\n\t},\n\n\tclear: function(name){\n\t\tif (!name){\n\t\t\tthis.queue.empty();\n\t\t} else {\n\t\t\tthis.queue = this.queue.map(function(q){\n\t\t\t\tif (q.name != name) return q;\n\t\t\t\telse return false;\n\t\t\t}).filter(function(q){\n\t\t\t\treturn q;\n\t\t\t});\n\t\t}\n\t\treturn this;\n\t},\n\n\tcancel: function(name){\n\t\tthis.requests[name].cancel();\n\t\treturn this;\n\t},\n\n\tonRequest: function(){\n\t\tthis.fireEvent('request', arguments);\n\t},\n\n\tonComplete: function(){\n\t\tthis.fireEvent('complete', arguments);\n\t\tif (!this.queue.length) this.fireEvent('end');\n\t},\n\n\tonCancel: function(){\n\t\tif (this.options.autoAdvance && !this.error) this.runNext();\n\t\tthis.fireEvent('cancel', arguments);\n\t},\n\n\tonSuccess: function(){\n\t\tif (this.options.autoAdvance && !this.error) this.runNext();\n\t\tthis.fireEvent('success', arguments);\n\t},\n\n\tonFailure: function(){\n\t\tthis.error = true;\n\t\tif (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();\n\t\tthis.fireEvent('failure', arguments);\n\t},\n\n\tonException: function(){\n\t\tthis.error = true;\n\t\tif (!this.options.stopOnFailure && this.options.autoAdvance) this.runNext();\n\t\tthis.fireEvent('exception', arguments);\n\t}\n\n});\n\n\n/*\n---\n\nscript: Request.Periodical.js\n\nname: Request.Periodical\n\ndescription: Requests the same URL to pull data from a server but increases the intervals if no data is returned to reduce the load\n\nlicense: MIT-style license\n\nauthors:\n - Christoph Pojer\n\nrequires:\n - Core/Request\n - /MooTools.More\n\nprovides: [Request.Periodical]\n\n...\n*/\n\nRequest.implement({\n\n\toptions: {\n\t\tinitialDelay: 5000,\n\t\tdelay: 5000,\n\t\tlimit: 60000\n\t},\n\n\tstartTimer: function(data){\n\t\tvar fn = function(){\n\t\t\tif (!this.running) this.send({data: data});\n\t\t};\n\t\tthis.lastDelay = this.options.initialDelay;\n\t\tthis.timer = fn.delay(this.lastDelay, this);\n\t\tthis.completeCheck = function(response){\n\t\t\tclearTimeout(this.timer);\n\t\t\tthis.lastDelay = (response) ? this.options.delay : (this.lastDelay + this.options.delay).min(this.options.limit);\n\t\t\tthis.timer = fn.delay(this.lastDelay, this);\n\t\t};\n\t\treturn this.addEvent('complete', this.completeCheck);\n\t},\n\n\tstopTimer: function(){\n\t\tclearTimeout(this.timer);\n\t\treturn this.removeEvent('complete', this.completeCheck);\n\t}\n\n});\n\n\n/*\n---\n\nscript: Color.js\n\nname: Color\n\ndescription: Class for creating and manipulating colors in JavaScript. Supports HSB -> RGB Conversions and vice versa.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Array\n - Core/String\n - Core/Number\n - Core/Hash\n - Core/Function\n - MooTools.More\n\nprovides: [Color]\n\n...\n*/\n\n(function(){\n\nvar Color = this.Color = new Type('Color', function(color, type){\n\tif (arguments.length >= 3){\n\t\ttype = 'rgb'; color = Array.slice(arguments, 0, 3);\n\t} else if (typeof color == 'string'){\n\t\tif (color.match(/rgb/)) color = color.rgbToHex().hexToRgb(true);\n\t\telse if (color.match(/hsb/)) color = color.hsbToRgb();\n\t\telse color = color.hexToRgb(true);\n\t}\n\ttype = type || 'rgb';\n\tswitch (type){\n\t\tcase 'hsb':\n\t\t\tvar old = color;\n\t\t\tcolor = color.hsbToRgb();\n\t\t\tcolor.hsb = old;\n\t\tbreak;\n\t\tcase 'hex': color = color.hexToRgb(true); break;\n\t}\n\tcolor.rgb = color.slice(0, 3);\n\tcolor.hsb = color.hsb || color.rgbToHsb();\n\tcolor.hex = color.rgbToHex();\n\treturn Object.append(color, this);\n});\n\nColor.implement({\n\n\tmix: function(){\n\t\tvar colors = Array.slice(arguments);\n\t\tvar alpha = (typeOf(colors.getLast()) == 'number') ? colors.pop() : 50;\n\t\tvar rgb = this.slice();\n\t\tcolors.each(function(color){\n\t\t\tcolor = new Color(color);\n\t\t\tfor (var i = 0; i < 3; i++) rgb[i] = Math.round((rgb[i] / 100 * (100 - alpha)) + (color[i] / 100 * alpha));\n\t\t});\n\t\treturn new Color(rgb, 'rgb');\n\t},\n\n\tinvert: function(){\n\t\treturn new Color(this.map(function(value){\n\t\t\treturn 255 - value;\n\t\t}));\n\t},\n\n\tsetHue: function(value){\n\t\treturn new Color([value, this.hsb[1], this.hsb[2]], 'hsb');\n\t},\n\n\tsetSaturation: function(percent){\n\t\treturn new Color([this.hsb[0], percent, this.hsb[2]], 'hsb');\n\t},\n\n\tsetBrightness: function(percent){\n\t\treturn new Color([this.hsb[0], this.hsb[1], percent], 'hsb');\n\t}\n\n});\n\nthis.$RGB = function(r, g, b){\n\treturn new Color([r, g, b], 'rgb');\n};\n\nthis.$HSB = function(h, s, b){\n\treturn new Color([h, s, b], 'hsb');\n};\n\nthis.$HEX = function(hex){\n\treturn new Color(hex, 'hex');\n};\n\nArray.implement({\n\n\trgbToHsb: function(){\n\t\tvar red = this[0],\n\t\t\t\tgreen = this[1],\n\t\t\t\tblue = this[2],\n\t\t\t\thue = 0;\n\t\tvar max = Math.max(red, green, blue),\n\t\t\t\tmin = Math.min(red, green, blue);\n\t\tvar delta = max - min;\n\t\tvar brightness = max / 255,\n\t\t\t\tsaturation = (max != 0) ? delta / max : 0;\n\t\tif (saturation != 0){\n\t\t\tvar rr = (max - red) / delta;\n\t\t\tvar gr = (max - green) / delta;\n\t\t\tvar br = (max - blue) / delta;\n\t\t\tif (red == max) hue = br - gr;\n\t\t\telse if (green == max) hue = 2 + rr - br;\n\t\t\telse hue = 4 + gr - rr;\n\t\t\thue /= 6;\n\t\t\tif (hue < 0) hue++;\n\t\t}\n\t\treturn [Math.round(hue * 360), Math.round(saturation * 100), Math.round(brightness * 100)];\n\t},\n\n\thsbToRgb: function(){\n\t\tvar br = Math.round(this[2] / 100 * 255);\n\t\tif (this[1] == 0){\n\t\t\treturn [br, br, br];\n\t\t} else {\n\t\t\tvar hue = this[0] % 360;\n\t\t\tvar f = hue % 60;\n\t\t\tvar p = Math.round((this[2] * (100 - this[1])) / 10000 * 255);\n\t\t\tvar q = Math.round((this[2] * (6000 - this[1] * f)) / 600000 * 255);\n\t\t\tvar t = Math.round((this[2] * (6000 - this[1] * (60 - f))) / 600000 * 255);\n\t\t\tswitch (Math.floor(hue / 60)){\n\t\t\t\tcase 0: return [br, t, p];\n\t\t\t\tcase 1: return [q, br, p];\n\t\t\t\tcase 2: return [p, br, t];\n\t\t\t\tcase 3: return [p, q, br];\n\t\t\t\tcase 4: return [t, p, br];\n\t\t\t\tcase 5: return [br, p, q];\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n});\n\nString.implement({\n\n\trgbToHsb: function(){\n\t\tvar rgb = this.match(/\\d{1,3}/g);\n\t\treturn (rgb) ? rgb.rgbToHsb() : null;\n\t},\n\n\thsbToRgb: function(){\n\t\tvar hsb = this.match(/\\d{1,3}/g);\n\t\treturn (hsb) ? hsb.hsbToRgb() : null;\n\t}\n\n});\n\n})();\n\n\n\n/*\n---\n\nscript: Group.js\n\nname: Group\n\ndescription: Class for monitoring collections of events\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n\nrequires:\n - Core/Events\n - /MooTools.More\n\nprovides: [Group]\n\n...\n*/\n\n(function(){\n\nthis.Group = new Class({\n\n\tinitialize: function(){\n\t\tthis.instances = Array.flatten(arguments);\n\t},\n\n\taddEvent: function(type, fn){\n\t\tvar instances = this.instances,\n\t\t\tlen = instances.length,\n\t\t\ttogo = len,\n\t\t\targs = new Array(len),\n\t\t\tself = this;\n\n\t\tinstances.each(function(instance, i){\n\t\t\tinstance.addEvent(type, function(){\n\t\t\t\tif (!args[i]) togo--;\n\t\t\t\targs[i] = arguments;\n\t\t\t\tif (!togo){\n\t\t\t\t\tfn.call(self, instances, instance, args);\n\t\t\t\t\ttogo = len;\n\t\t\t\t\targs = new Array(len);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n});\n\n})();\n\n\n/*\n---\n\nscript: Hash.Cookie.js\n\nname: Hash.Cookie\n\ndescription: Class for creating, reading, and deleting Cookies in JSON format.\n\nlicense: MIT-style license\n\nauthors:\n - Valerio Proietti\n - Aaron Newton\n\nrequires:\n - Core/Cookie\n - Core/JSON\n - /MooTools.More\n - /Hash\n\nprovides: [Hash.Cookie]\n\n...\n*/\n\nHash.Cookie = new Class({\n\n\tExtends: Cookie,\n\n\toptions: {\n\t\tautoSave: true\n\t},\n\n\tinitialize: function(name, options){\n\t\tthis.parent(name, options);\n\t\tthis.load();\n\t},\n\n\tsave: function(){\n\t\tvar value = JSON.encode(this.hash);\n\t\tif (!value || value.length > 4096) return false; //cookie would be truncated!\n\t\tif (value == '{}') this.dispose();\n\t\telse this.write(value);\n\t\treturn true;\n\t},\n\n\tload: function(){\n\t\tthis.hash = new Hash(JSON.decode(this.read(), true));\n\t\treturn this;\n\t}\n\n});\n\nHash.each(Hash.prototype, function(method, name){\n\tif (typeof method == 'function') Hash.Cookie.implement(name, function(){\n\t\tvar value = method.apply(this.hash, arguments);\n\t\tif (this.options.autoSave) this.save();\n\t\treturn value;\n\t});\n});\n\n\n/*\n---\nname: Table\ndescription: LUA-Style table implementation.\nlicense: MIT-style license\nauthors:\n - Valerio Proietti\nrequires: [Core/Array]\nprovides: [Table]\n...\n*/\n\n(function(){\n\nvar Table = this.Table = function(){\n\n\tthis.length = 0;\n\tvar keys = [],\n\t values = [];\n\t\n\tthis.set = function(key, value){\n\t\tvar index = keys.indexOf(key);\n\t\tif (index == -1){\n\t\t\tvar length = keys.length;\n\t\t\tkeys[length] = key;\n\t\t\tvalues[length] = value;\n\t\t\tthis.length++;\n\t\t} else {\n\t\t\tvalues[index] = value;\n\t\t}\n\t\treturn this;\n\t};\n\n\tthis.get = function(key){\n\t\tvar index = keys.indexOf(key);\n\t\treturn (index == -1) ? null : values[index];\n\t};\n\n\tthis.erase = function(key){\n\t\tvar index = keys.indexOf(key);\n\t\tif (index != -1){\n\t\t\tthis.length--;\n\t\t\tkeys.splice(index, 1);\n\t\t\treturn values.splice(index, 1)[0];\n\t\t}\n\t\treturn null;\n\t};\n\n\tthis.each = this.forEach = function(fn, bind){\n\t\tfor (var i = 0, l = this.length; i < l; i++) fn.call(bind, keys[i], values[i], this);\n\t};\n\t\n};\n\nif (this.Type) new Type('Table', Table);\n\n})();\n\n\n/*\n---\n\nscript: HtmlTable.js\n\nname: HtmlTable\n\ndescription: Builds table elements with methods to add rows.\n\nlicense: MIT-style license\n\nauthors:\n - Aaron Newton\n\nrequires:\n - Core/Options\n - Core/Events\n - /Class.Occlude\n\nprovides: [HtmlTable]\n\n...\n*/\n\nvar HtmlTable = new Class({\n\n\tImplements: [Options, Events, Class.Occlude],\n\n\toptions: {\n\t\tproperties: {\n\t\t\tcellpadding: 0,\n\t\t\tcellspacing: 0,\n\t\t\tborder: 0\n\t\t},\n\t\trows: [],\n\t\theaders: [],\n\t\tfooters: []\n\t},\n\n\tproperty: 'HtmlTable',\n\n\tinitialize: function(){\n\t\tvar params = Array.link(arguments, {options: Type.isObject, table: Type.isElement, id: Type.isString});\n\t\tthis.setOptions(params.options);\n\t\tif (!params.table && params.id) params.table = document.id(params.id);\n\t\tthis.element = params.table || new Element('table', this.options.properties);\n\t\tif (this.occlude()) return this.occluded;\n\t\tthis.build();\n\t},\n\n\tbuild: function(){\n\t\tthis.element.store('HtmlTable', this);\n\n\t\tthis.body = document.id(this.element.tBodies[0]) || new Element('tbody').inject(this.element);\n\t\t$$(this.body.rows);\n\n\t\tif (this.options.headers.length) this.setHeaders(this.options.headers);\n\t\telse this.thead = document.id(this.element.tHead);\n\n\t\tif (this.thead) this.head = this.getHead();\n\t\tif (this.options.footers.length) this.setFooters(this.options.footers);\n\n\t\tthis.tfoot = document.id(this.element.tFoot);\n\t\tif (this.tfoot) this.foot = document.id(this.tfoot.rows[0]);\n\n\t\tthis.options.rows.each(function(row){\n\t\t\tthis.push(row);\n\t\t}, this);\n\t},\n\n\ttoElement: function(){\n\t\treturn this.element;\n\t},\n\n\tempty: function(){\n\t\tthis.body.empty();\n\t\treturn this;\n\t},\n\n\tset: function(what, items){\n\t\tvar target = (what == 'headers') ? 'tHead' : 'tFoot',\n\t\t\tlower = target.toLowerCase();\n\n\t\tthis[lower] = (document.id(this.element[target]) || new Element(lower).inject(this.element, 'top')).empty();\n\t\tvar data = this.push(items, {}, this[lower], what == 'headers' ? 'th' : 'td');\n\n\t\tif (what == 'headers') this.head = this.getHead();\n\t\telse this.foot = this.getHead();\n\n\t\treturn data;\n\t},\n\n\tgetHead: function(){\n\t\tvar rows = this.thead.rows;\n\t\treturn rows.length > 1 ? $$(rows) : rows.length ? document.id(rows[0]) : false;\n\t},\n\n\tsetHeaders: function(headers){\n\t\tthis.set('headers', headers);\n\t\treturn this;\n\t},\n\n\tsetFooters: function(footers){\n\t\tthis.set('footers', footers);\n\t\treturn this;\n\t},\n\n\tupdate: function(tr, row, tag){\n\t\tvar tds = tr.getChildren(tag || 'td'), last = tds.length - 1;\n\n\t\trow.each(function(data, index){\n\t\t\tvar td = tds[index] || new Element(tag || 'td').inject(tr),\n\t\t\t\tcontent = (data ? data.content : '') || data,\n\t\t\t\ttype = typeOf(content);\n\n\t\t\tif (data && data.properties) td.set(data.properties);\n\t\t\tif (/(element(s?)|array|collection)/.test(type)) td.empty().adopt(content);\n\t\t\telse td.set('html', content);\n\n\t\t\tif (index > last) tds.push(td);\n\t\t\telse tds[index] = td;\n\t\t});\n\n\t\treturn {\n\t\t\ttr: tr,\n\t\t\ttds: tds\n\t\t};\n\t},\n\n\tpush: function(row, rowProperties, target, tag, where){\n\t\tif (typeOf(row) == 'element' && row.get('tag') == 'tr'){\n\t\t\trow.inject(target || this.body, where);\n\t\t\treturn {\n\t\t\t\ttr: row,\n\t\t\t\ttds: row.getChildren('td')\n\t\t\t};\n\t\t}\n\t\treturn this.update(new Element('tr', rowProperties).inject(target || this.body, where), row, tag);\n\t},\n\n\tpushMany: function(rows, rowProperties, target, tag, where){\n\t\treturn rows.map(function(row){\n\t\t\treturn this.push(row, rowProperties, target, tag, where);\n\t\t}, this);\n\t}\n\n});\n\n\n['adopt', 'inject', 'wraps', 'grab', 'replaces', 'dispose'].each(function(method){\n\tHtmlTable.implement(method, function(){\n\t\tthis.element[method].apply(this.element, arguments);\n\t\treturn this;\n\t});\n});\n\n\n\n\n/*\n---\n\nscript: HtmlTable.Zebra.js\n\nname: HtmlTable.Zebra\n\ndescription: Builds a stripy table with methods to add rows.\n\nlicense: MIT-style license\n\nauthors:\n - Harald Kirschner\n - Aaron Newton\n\nrequires:\n - /HtmlTable\n - /Element.Shortcuts\n - /Class.refactor\n\nprovides: [HtmlTable.Zebra]\n\n...\n*/\n\nHtmlTable = Class.refactor(HtmlTable, {\n\n\toptions: {\n\t\tclassZebra: 'table-tr-odd',\n\t\tzebra: true,\n\t\tzebraOnlyVisibleRows: true\n\t},\n\n\tinitialize: function(){\n\t\tthis.previous.apply(this, arguments);\n\t\tif (this.occluded) return this.occluded;\n\t\tif (this.options.zebra) this.updateZebras();\n\t},\n\n\tupdateZebras: function(){\n\t\tvar index = 0;\n\t\tArray.each(this.body.rows, function(row){\n\t\t\tif (!this.options.zebraOnlyVisibleRows || row.isDisplayed()){\n\t\t\t\tthis.zebra(row, index++);\n\t\t\t}\n\t\t}, this);\n\t},\n\n\tsetRowStyle: function(row, i){\n\t\tif (this.previous) this.previous(row, i);\n\t\tthis.zebra(row, i);\n\t},\n\n\tzebra: function(row, i){\n\t\treturn row[((i % 2) ? 'remove' : 'add')+'Class'](this.options.classZebra);\n\t},\n\n\tpush: function(){\n\t\tvar pushed = this.previous.apply(this, arguments);\n\t\tif (this.options.zebra) this.updateZebras();\n\t\treturn pushed;\n\t}\n\n});\n\n\n/*\n---\n\nscript: HtmlTable.Sort.js\n\nname: HtmlTable.Sort\n\ndescription: Builds a stripy, sortable table with methods to add rows.\n\nlicense: MIT-style license\n\nauthors:\n - Harald Kirschner\n - Aaron Newton\n - Jacob Thornton\n\nrequires:\n - Core/Hash\n - /HtmlTable\n - /Class.refactor\n - /Element.Delegation\n - /String.Extras\n - /Date\n\nprovides: [HtmlTable.Sort]\n\n...\n*/\n\nHtmlTable = Class.refactor(HtmlTable, {\n\n\toptions: {/*\n\t\tonSort: function(){}, */\n\t\tsortIndex: 0,\n\t\tsortReverse: false,\n\t\tparsers: [],\n\t\tdefaultParser: 'string',\n\t\tclassSortable: 'table-sortable',\n\t\tclassHeadSort: 'table-th-sort',\n\t\tclassHeadSortRev: 'table-th-sort-rev',\n\t\tclassNoSort: 'table-th-nosort',\n\t\tclassGroupHead: 'table-tr-group-head',\n\t\tclassGroup: 'table-tr-group',\n\t\tclassCellSort: 'table-td-sort',\n\t\tclassSortSpan: 'table-th-sort-span',\n\t\tsortable: false,\n\t\tthSelector: 'th'\n\t},\n\n\tinitialize: function (){\n\t\tthis.previous.apply(this, arguments);\n\t\tif (this.occluded) return this.occluded;\n\t\tthis.sorted = {index: null, dir: 1};\n\t\tif (!this.bound) this.bound = {};\n\t\tthis.bound.headClick = this.headClick.bind(this);\n\t\tthis.sortSpans = new Elements();\n\t\tif (this.options.sortable){\n\t\t\tthis.enableSort();\n\t\t\tif (this.options.sortIndex != null) this.sort(this.options.sortIndex, this.options.sortReverse);\n\t\t}\n\t},\n\n\tattachSorts: function(attach){\n\t\tthis.detachSorts();\n\t\tif (attach !== false) this.element.addEvent('click:relay(' + this.options.thSelector + ')', this.bound.headClick);\n\t},\n\n\tdetachSorts: function(){\n\t\tthis.element.removeEvents('click:relay(' + this.options.thSelector + ')');\n\t},\n\n\tsetHeaders: function(){\n\t\tthis.previous.apply(this, arguments);\n\t\tif (this.sortEnabled) this.setParsers();\n\t},\n\n\tsetParsers: function(){\n\t\tthis.parsers = this.detectParsers();\n\t},\n\n\tdetectParsers: function(){\n\t\treturn this.head && this.head.getElements(this.options.thSelector).flatten().map(this.detectParser, this);\n\t},\n\n\tdetectParser: function(cell, index){\n\t\tif (cell.hasClass(this.options.classNoSort) || cell.retrieve('htmltable-parser')) return cell.retrieve('htmltable-parser');\n\t\tvar thDiv = new Element('div');\n\t\tthDiv.adopt(cell.childNodes).inject(cell);\n\t\tvar sortSpan = new Element('span', {'class': this.options.classSortSpan}).inject(thDiv, 'top');\n\t\tthis.sortSpans.push(sortSpan);\n\t\tvar parser = this.options.parsers[index],\n\t\t\trows = this.body.rows,\n\t\t\tcancel;\n\t\tswitch (typeOf(parser)){\n\t\t\tcase 'function': parser = {convert: parser}; cancel = true; break;\n\t\t\tcase 'string': parser = parser; cancel = true; break;\n\t\t}\n\t\tif (!cancel){\n\t\t\tHtmlTable.ParserPriority.some(function(parserName){\n\t\t\t\tvar current = HtmlTable.Parsers[parserName],\n\t\t\t\t\tmatch = current.match;\n\t\t\t\tif (!match) return false;\n\t\t\t\tfor (var i = 0, j = rows.length; i < j; i++){\n\t\t\t\t\tvar cell = document.id(rows[i].cells[index]),\n\t\t\t\t\t\ttext = cell ? cell.get('html').clean() : '';\n\t\t\t\t\tif (text && match.test(text)){\n\t\t\t\t\t\tparser = current;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tif (!parser) parser = this.options.defaultParser;\n\t\tcell.store('htmltable-parser', parser);\n\t\treturn parser;\n\t},\n\n\theadClick: function(event, el){\n\t\tif (!this.head || el.hasClass(this.options.classNoSort)) return;\n\t\treturn this.sort(Array.indexOf(this.head.getElements(this.options.thSelector).flatten(), el) % this.body.rows[0].cells.length);\n\t},\n\n\tserialize: function(){\n\t\tvar previousSerialization = this.previous.apply(this, arguments) || {};\n\t\tif (this.options.sortable){\n\t\t\tpreviousSerialization.sortIndex = this.sorted.index;\n\t\t\tpreviousSerialization.sortReverse = this.sorted.reverse;\n\t\t}\n\t\treturn previousSerialization;\n\t},\n\n\trestore: function(tableState){\n\t\tif(this.options.sortable && tableState.sortIndex){\n\t\t\tthis.sort(tableState.sortIndex, tableState.sortReverse);\n\t\t}\n\t\tthis.previous.apply(this, arguments);\n\t},\n\n\tsetSortedState: function(index, reverse){\n\t\tif (reverse != null) this.sorted.reverse = reverse;\n\t\telse if (this.sorted.index == index) this.sorted.reverse = !this.sorted.reverse;\n\t\telse this.sorted.reverse = this.sorted.index == null;\n\n\t\tif (index != null) this.sorted.index = index;\n\t},\n\n\tsetHeadSort: function(sorted){\n\t\tvar head = $$(!this.head.length ? this.head.cells[this.sorted.index] : this.head.map(function(row){\n\t\t\treturn row.getElements(this.options.thSelector)[this.sorted.index];\n\t\t}, this).clean());\n\t\tif (!head.length) return;\n\t\tif (sorted){\n\t\t\thead.addClass(this.options.classHeadSort);\n\t\t\tif (this.sorted.reverse) head.addClass(this.options.classHeadSortRev);\n\t\t\telse head.removeClass(this.options.classHeadSortRev);\n\t\t} else {\n\t\t\thead.removeClass(this.options.classHeadSort).removeClass(this.options.classHeadSortRev);\n\t\t}\n\t},\n\n\tsetRowSort: function(data, pre){\n\t\tvar count = data.length,\n\t\t\tbody = this.body,\n\t\t\tgroup,\n\t\t\trowIndex;\n\n\t\twhile (count){\n\t\t\tvar item = data[--count],\n\t\t\t\tposition = item.position,\n\t\t\t\trow = body.rows[position];\n\n\t\t\tif (row.disabled) continue;\n\t\t\tif (!pre){\n\t\t\t\tgroup = this.setGroupSort(group, row, item);\n\t\t\t\tthis.setRowStyle(row, count);\n\t\t\t}\n\t\t\tbody.appendChild(row);\n\n\t\t\tfor (rowIndex = 0; rowIndex < count; rowIndex++){\n\t\t\t\tif (data[rowIndex].position > position) data[rowIndex].position--;\n\t\t\t}\n\t\t}\n\t},\n\n\tsetRowStyle: function(row, i){\n\t\tthis.previous(row, i);\n\t\trow.cells[this.sorted.index].addClass(this.options.classCellSort);\n\t},\n\n\tsetGroupSort: function(group, row, item){\n\t\tif (group == item.value) row.removeClass(this.options.classGroupHead).addClass(this.options.classGroup);\n\t\telse row.removeClass(this.options.classGroup).addClass(this.options.classGroupHead);\n\t\treturn item.value;\n\t},\n\n\tgetParser: function(){\n\t\tvar parser = this.parsers[this.sorted.index];\n\t\treturn typeOf(parser) == 'string' ? HtmlTable.Parsers[parser] : parser;\n\t},\n\n\tsort: function(index, reverse, pre){\n\t\tif (!this.head) return;\n\n\t\tif (!pre){\n\t\t\tthis.clearSort();\n\t\t\tthis.setSortedState(index, reverse);\n\t\t\tthis.setHeadSort(true);\n\t\t}\n\n\t\tvar parser = this.getParser();\n\t\tif (!parser) return;\n\n\t\tvar rel;\n\t\tif (!Browser.ie){\n\t\t\trel = this.body.getParent();\n\t\t\tthis.body.dispose();\n\t\t}\n\n\t\tvar data = this.parseData(parser).sort(function(a, b){\n\t\t\tif (a.value === b.value) return 0;\n\t\t\treturn a.value > b.value ? 1 : -1;\n\t\t});\n\n\t\tif (this.sorted.reverse == (parser == HtmlTable.Parsers['input-checked'])) data.reverse(true);\n\t\tthis.setRowSort(data, pre);\n\n\t\tif (rel) rel.grab(this.body);\n\t\tthis.fireEvent('stateChanged');\n\t\treturn this.fireEvent('sort', [this.body, this.sorted.index]);\n\t},\n\n\tparseData: function(parser){\n\t\treturn Array.map(this.body.rows, function(row, i){\n\t\t\tvar value = parser.convert.call(document.id(row.cells[this.sorted.index]));\n\t\t\treturn {\n\t\t\t\tposition: i,\n\t\t\t\tvalue: value\n\t\t\t};\n\t\t}, this);\n\t},\n\n\tclearSort: function(){\n\t\tthis.setHeadSort(false);\n\t\tthis.body.getElements('td').removeClass(this.options.classCellSort);\n\t},\n\n\treSort: function(){\n\t\tif (this.sortEnabled) this.sort.call(this, this.sorted.index, this.sorted.reverse);\n\t\treturn this;\n\t},\n\n\tenableSort: function(){\n\t\tthis.element.addClass(this.options.classSortable);\n\t\tthis.attachSorts(true);\n\t\tthis.setParsers();\n\t\tthis.sortEnabled = true;\n\t\treturn this;\n\t},\n\n\tdisableSort: function(){\n\t\tthis.element.removeClass(this.options.classSortable);\n\t\tthis.attachSorts(false);\n\t\tthis.sortSpans.each(function(span){\n\t\t\tspan.destroy();\n\t\t});\n\t\tthis.sortSpans.empty();\n\t\tthis.sortEnabled = false;\n\t\treturn this;\n\t}\n\n});\n\nHtmlTable.ParserPriority = ['date', 'input-checked', 'input-value', 'float', 'number'];\n\nHtmlTable.Parsers = {\n\n\t'date': {\n\t\tmatch: /^\\d{2}[-\\/ ]\\d{2}[-\\/ ]\\d{2,4}$/,\n\t\tconvert: function(){\n\t\t\tvar d = Date.parse(this.get('text').stripTags());\n\t\t\treturn (typeOf(d) == 'date') ? d.format('db') : '';\n\t\t},\n\t\ttype: 'date'\n\t},\n\t'input-checked': {\n\t\tmatch: / type=\"(radio|checkbox)\" /,\n\t\tconvert: function(){\n\t\t\treturn this.getElement('input').checked;\n\t\t}\n\t},\n\t'input-value': {\n\t\tmatch: / 0)) return null;\n\t\tif (includeHiddenRows){\n\t\t\tindex += offset;\n\t\t} else {\n\t\t\tvar limit = 0,\n\t\t\t count = 0;\n\t\t\tif (offset > 0){\n\t\t\t\twhile (count < offset && index < this.body.rows.length -1){\n\t\t\t\t\tif (this.body.rows[++index].isDisplayed()) count++;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile (count > offset && index > 0){\n\t\t\t\t\tif (this.body.rows[--index].isDisplayed()) count--;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn index;\n\t},\n\n\tattachSelects: function(attach){\n\t\tattach = attach != null ? attach : true;\n\n\t\tvar method = attach ? 'addEvents' : 'removeEvents';\n\t\tthis.element[method]({\n\t\t\tmouseleave: this.bound.mouseleave,\n\t\t\tclick: this.bound.activateKeyboard\n\t\t});\n\n\t\tthis.body[method]({\n\t\t\t'click:relay(tr)': this.bound.clickRow,\n\t\t\t'contextmenu:relay(tr)': this.bound.clickRow\n\t\t});\n\n\t\tif (this.options.useKeyboard || this.keyboard){\n\t\t\tif (!this.keyboard) this.keyboard = new Keyboard();\n\t\t\tif (!this.selectKeysDefined){\n\t\t\t\tthis.selectKeysDefined = true;\n\t\t\t\tvar timer, held;\n\n\t\t\t\tvar move = function(offset){\n\t\t\t\t\tvar mover = function(e){\n\t\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tvar to = this.body.rows[this.getRowByOffset(offset, this.options.selectHiddenRows)];\n\t\t\t\t\t\tif (e.shift && to && this.isSelected(to)){\n\t\t\t\t\t\t\tthis.deselectRow(this.focused);\n\t\t\t\t\t\t\tthis.focused = to;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (to && (!this.options.allowMultiSelect || !e.shift)){\n\t\t\t\t\t\t\t\tthis.selectNone();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.shiftFocus(offset, e);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (held){\n\t\t\t\t\t\t\ttimer = mover.delay(100, this, e);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttimer = (function(){\n\t\t\t\t\t\t\t\theld = true;\n\t\t\t\t\t\t\t\tmover(e);\n\t\t\t\t\t\t\t}).delay(400);\n\t\t\t\t\t\t}\n\t\t\t\t\t}.bind(this);\n\t\t\t\t\treturn mover;\n\t\t\t\t}.bind(this);\n\n\t\t\t\tvar clear = function(){\n\t\t\t\t\tclearTimeout(timer);\n\t\t\t\t\theld = false;\n\t\t\t\t};\n\n\t\t\t\tthis.keyboard.addEvents({\n\t\t\t\t\t'keydown:shift+up': move(-1),\n\t\t\t\t\t'keydown:shift+down': move(1),\n\t\t\t\t\t'keyup:shift+up': clear,\n\t\t\t\t\t'keyup:shift+down': clear,\n\t\t\t\t\t'keyup:up': clear,\n\t\t\t\t\t'keyup:down': clear\n\t\t\t\t});\n\n\t\t\t\tvar shiftHint = '';\n\t\t\t\tif (this.options.allowMultiSelect && this.options.shiftForMultiSelect && this.options.useKeyboard){\n\t\t\t\t\tshiftHint = \" (Shift multi-selects).\";\n\t\t\t\t}\n\n\t\t\t\tthis.keyboard.addShortcuts({\n\t\t\t\t\t'Select Previous Row': {\n\t\t\t\t\t\tkeys: 'up',\n\t\t\t\t\t\tshortcut: 'up arrow',\n\t\t\t\t\t\thandler: move(-1),\n\t\t\t\t\t\tdescription: 'Select the previous row in the table.' + shiftHint\n\t\t\t\t\t},\n\t\t\t\t\t'Select Next Row': {\n\t\t\t\t\t\tkeys: 'down',\n\t\t\t\t\t\tshortcut: 'down arrow',\n\t\t\t\t\t\thandler: move(1),\n\t\t\t\t\t\tdescription: 'Select the next row in the table.' + shiftHint\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t}\n\t\t\tthis.keyboard[attach ? 'activate' : 'deactivate']();\n\t\t}\n\t\tthis.updateSelects();\n\t},\n\n\tmouseleave: function(){\n\t\tif (this.hovered) this.leaveRow(this.hovered);\n\t}\n\n});\n\n\n/*\n---\n\nscript: Locale.Set.From.js\n\nname: Locale.Set.From\n\ndescription: Provides an alternative way to create Locale.Set objects.\n\nlicense: MIT-style license\n\nauthors:\n - Tim Wienk\n\nrequires:\n - Core/JSON\n - /Locale\n\nprovides: Locale.Set.From\n\n...\n*/\n\n(function(){\n\nvar parsers = {\n\t'json': JSON.decode\n};\n\nLocale.Set.defineParser = function(name, fn){\n\tparsers[name] = fn;\n};\n\nLocale.Set.from = function(set, type){\n\tif (instanceOf(set, Locale.Set)) return set;\n\n\tif (!type && typeOf(set) == 'string') type = 'json';\n\tif (parsers[type]) set = parsers[type](set);\n\n\tvar locale = new Locale.Set;\n\n\tlocale.sets = set.sets || {};\n\n\tif (set.inherits){\n\t\tlocale.inherits.locales = Array.from(set.inherits.locales);\n\t\tlocale.inherits.sets = set.inherits.sets || {};\n\t}\n\n\treturn locale;\n};\n\n})();\n\nvar Scroller = new Class({\n\n\tImplements: [Events, Options],\n\n\toptions: {\n\t\tarea: 20,\n\t\tvelocity: 1,\n\t\tonChange: function(x, y){\n\t\t\tthis.element.scrollTo(x, y);\n\t\t},\n\t\tfps: 50\n\t},\n\n\tinitialize: function(element, options){\n\t\tthis.setOptions(options);\n\t\tthis.element = document.id(element);\n\t\tthis.docBody = document.id(this.element.getDocument().body);\n\t\tthis.listener = (typeOf(this.element) != 'element') ? this.docBody : this.element;\n\t\tthis.timer = null;\n\t\tthis.bound = {\n\t\t\tattach: this.attach.bind(this),\n\t\t\tdetach: this.detach.bind(this),\n\t\t\tgetCoords: this.getCoords.bind(this)\n\t\t};\n\t},\n\n\tstart: function(){\n\t\tthis.listener.addEvents({\n\t\t\tmouseover: this.bound.attach,\n\t\t\tmouseleave: this.bound.detach\n\t\t});\n\t\treturn this;\n\t},\n\n\tstop: function(){\n\t\tthis.listener.removeEvents({\n\t\t\tmouseover: this.bound.attach,\n\t\t\tmouseleave: this.bound.detach\n\t\t});\n\t\tthis.detach();\n\t\tthis.timer = clearInterval(this.timer);\n\t\treturn this;\n\t},\n\n\tattach: function(){\n\t\tthis.listener.addEvent('mousemove', this.bound.getCoords);\n\t},\n\n\tdetach: function(){\n\t\tthis.listener.removeEvent('mousemove', this.bound.getCoords);\n\t\tthis.timer = clearInterval(this.timer);\n\t},\n\n\tgetCoords: function(event){\n\t\tthis.page = (this.listener.get('tag') == 'body') ? event.client : event.page;\n\t\tif (!this.timer) this.timer = this.scroll.periodical(Math.round(1000 / this.options.fps), this);\n\t},\n\n\tscroll: function(){\n\t\tvar size = this.element.getSize(),\n\t\t\tscroll = this.element.getScroll(),\n\t\t\tpos = this.element != this.docBody ? this.element.getOffsets() : {x: 0, y:0},\n\t\t\tscrollSize = this.element.getScrollSize(),\n\t\t\tchange = {x: 0, y: 0},\n\t\t\ttop = this.options.area.top || this.options.area,\n\t\t\tbottom = this.options.area.bottom || this.options.area;\n\t\tfor (var z in this.page){\n\t\t\tif (this.page[z] < (top + pos[z]) && scroll[z] != 0){\n\t\t\t\tchange[z] = (this.page[z] - top - pos[z]) * this.options.velocity;\n\t\t\t} else if (this.page[z] + bottom > (size[z] + pos[z]) && scroll[z] + size[z] != scrollSize[z]){\n\t\t\t\tchange[z] = (this.page[z] - size[z] + bottom - pos[z]) * this.options.velocity;\n\t\t\t}\n\t\t\tchange[z] = change[z].round();\n\t\t}\n\t\tif (change.y || change.x) this.fireEvent('change', [scroll.x + change.x, scroll.y + change.y]);\n\t}\n\n});\n","/*!\n * iScroll v4.2.5 ~ Copyright (c) 2012 Matteo Spinelli, http://cubiq.org\n * Released under MIT license, http://cubiq.org/license\n */\n(function(window, doc){\nvar m = Math,\n\tdummyStyle = doc.createElement('div').style,\n\tvendor = (function () {\n\t\tvar vendors = 't,webkitT,MozT,msT,OT'.split(','),\n\t\t\tt,\n\t\t\ti = 0,\n\t\t\tl = vendors.length;\n\n\t\tfor ( ; i < l; i++ ) {\n\t\t\tt = vendors[i] + 'ransform';\n\t\t\tif ( t in dummyStyle ) {\n\t\t\t\treturn vendors[i].substr(0, vendors[i].length - 1);\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t})(),\n\tcssVendor = vendor ? '-' + vendor.toLowerCase() + '-' : '',\n\n\t// Style properties\n\ttransform = prefixStyle('transform'),\n\ttransitionProperty = prefixStyle('transitionProperty'),\n\ttransitionDuration = prefixStyle('transitionDuration'),\n\ttransformOrigin = prefixStyle('transformOrigin'),\n\ttransitionTimingFunction = prefixStyle('transitionTimingFunction'),\n\ttransitionDelay = prefixStyle('transitionDelay'),\n\n // Browser capabilities\n\tisAndroid = (/android/gi).test(navigator.appVersion),\n\tisIDevice = (/iphone|ipad/gi).test(navigator.appVersion),\n\tisTouchPad = (/hp-tablet/gi).test(navigator.appVersion),\n\n has3d = prefixStyle('perspective') in dummyStyle,\n hasTouch = 'ontouchstart' in window && !isTouchPad,\n hasTransform = vendor !== false,\n hasTransitionEnd = prefixStyle('transition') in dummyStyle,\n\n\tRESIZE_EV = 'onorientationchange' in window ? 'orientationchange' : 'resize',\n\tSTART_EV = hasTouch ? 'touchstart' : 'mousedown',\n\tMOVE_EV = hasTouch ? 'touchmove' : 'mousemove',\n\tEND_EV = hasTouch ? 'touchend' : 'mouseup',\n\tCANCEL_EV = hasTouch ? 'touchcancel' : 'mouseup',\n\tTRNEND_EV = (function () {\n\t\tif ( vendor === false ) return false;\n\n\t\tvar transitionEnd = {\n\t\t\t\t''\t\t\t: 'transitionend',\n\t\t\t\t'webkit'\t: 'webkitTransitionEnd',\n\t\t\t\t'Moz'\t\t: 'transitionend',\n\t\t\t\t'O'\t\t\t: 'otransitionend',\n\t\t\t\t'ms'\t\t: 'MSTransitionEnd'\n\t\t\t};\n\n\t\treturn transitionEnd[vendor];\n\t})(),\n\n\tnextFrame = (function() {\n\t\treturn window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\twindow.oRequestAnimationFrame ||\n\t\t\twindow.msRequestAnimationFrame ||\n\t\t\tfunction(callback) { return setTimeout(callback, 1); };\n\t})(),\n\tcancelFrame = (function () {\n\t\treturn window.cancelRequestAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\twindow.oCancelRequestAnimationFrame ||\n\t\t\twindow.msCancelRequestAnimationFrame ||\n\t\t\tclearTimeout;\n\t})(),\n\n\t// Helpers\n\ttranslateZ = has3d ? ' translateZ(0)' : '',\n\n\t// Constructor\n\tiScroll = function (el, options) {\n\t\tvar that = this,\n\t\t\ti;\n\n\t\tthat.wrapper = typeof el == 'object' ? el : doc.getElementById(el);\n\t\tthat.wrapper.style.overflow = 'hidden';\n\t\tthat.scroller = that.wrapper.children[0];\n\n\t\t// Default options\n\t\tthat.options = {\n\t\t\thScroll: true,\n\t\t\tvScroll: true,\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tbounce: true,\n\t\t\tbounceLock: false,\n\t\t\tmomentum: true,\n\t\t\tlockDirection: true,\n\t\t\tuseTransform: true,\n\t\t\tuseTransition: false,\n\t\t\ttopOffset: 0,\n\t\t\tcheckDOMChanges: false,\t\t// Experimental\n\t\t\thandleClick: true,\n\n\t\t\t// Scrollbar\n\t\t\thScrollbar: true,\n\t\t\tvScrollbar: true,\n\t\t\tfixedScrollbar: isAndroid,\n\t\t\thideScrollbar: isIDevice,\n\t\t\tfadeScrollbar: isIDevice && has3d,\n\t\t\tscrollbarClass: '',\n\n\t\t\t// Zoom\n\t\t\tzoom: false,\n\t\t\tzoomMin: 1,\n\t\t\tzoomMax: 4,\n\t\t\tdoubleTapZoom: 2,\n\t\t\twheelAction: 'scroll',\n\n\t\t\t// Snap\n\t\t\tsnap: false,\n\t\t\tsnapThreshold: 1,\n\n\t\t\t// Events\n\t\t\tonRefresh: null,\n\t\t\tonBeforeScrollStart: function (e) { e.preventDefault(); },\n\t\t\tonScrollStart: null,\n\t\t\tonBeforeScrollMove: null,\n\t\t\tonScrollMove: null,\n\t\t\tonBeforeScrollEnd: null,\n\t\t\tonScrollEnd: null,\n\t\t\tonTouchEnd: null,\n\t\t\tonDestroy: null,\n\t\t\tonZoomStart: null,\n\t\t\tonZoom: null,\n\t\t\tonZoomEnd: null\n\t\t};\n\n\t\t// User defined options\n\t\tfor (i in options) that.options[i] = options[i];\n\t\t\n\t\t// Set starting position\n\t\tthat.x = that.options.x;\n\t\tthat.y = that.options.y;\n\n\t\t// Normalize options\n\t\tthat.options.useTransform = hasTransform && that.options.useTransform;\n\t\tthat.options.hScrollbar = that.options.hScroll && that.options.hScrollbar;\n\t\tthat.options.vScrollbar = that.options.vScroll && that.options.vScrollbar;\n\t\tthat.options.zoom = that.options.useTransform && that.options.zoom;\n\t\tthat.options.useTransition = hasTransitionEnd && that.options.useTransition;\n\n\t\t// Helpers FIX ANDROID BUG!\n\t\t// translate3d and scale doesn't work together!\n\t\t// Ignoring 3d ONLY WHEN YOU SET that.options.zoom\n\t\tif ( that.options.zoom && isAndroid ){\n\t\t\ttranslateZ = '';\n\t\t}\n\t\t\n\t\t// Set some default styles\n\t\tthat.scroller.style[transitionProperty] = that.options.useTransform ? cssVendor + 'transform' : 'top left';\n\t\tthat.scroller.style[transitionDuration] = '0';\n\t\tthat.scroller.style[transformOrigin] = '0 0';\n\t\tif (that.options.useTransition) that.scroller.style[transitionTimingFunction] = 'cubic-bezier(0.33,0.66,0.66,1)';\n\t\t\n\t\tif (that.options.useTransform) that.scroller.style[transform] = 'translate(' + that.x + 'px,' + that.y + 'px)' + translateZ;\n\t\telse that.scroller.style.cssText += ';position:absolute;top:' + that.y + 'px;left:' + that.x + 'px';\n\n\t\tif (that.options.useTransition) that.options.fixedScrollbar = true;\n\n\t\tthat.refresh();\n\n\t\tthat._bind(RESIZE_EV, window);\n\t\tthat._bind(START_EV);\n\t\tif (!hasTouch) {\n\t\t\tif (that.options.wheelAction != 'none') {\n\t\t\t\tthat._bind('DOMMouseScroll');\n\t\t\t\tthat._bind('mousewheel');\n\t\t\t}\n\t\t}\n\n\t\tif (that.options.checkDOMChanges) that.checkDOMTime = setInterval(function () {\n\t\t\tthat._checkDOMChanges();\n\t\t}, 500);\n\t};\n\t\n\tiScroll.canIScroll = function() {\n\t\tvar m = /MSIE ([0-9]{1,}[\\.0-9]{0,})/.exec(navigator.userAgent);\n\t\treturn !(m && parseFloat(m[1]) < 9);\n\t}\n\n// Prototype\niScroll.prototype = {\n\tenabled: true,\n\tx: 0,\n\ty: 0,\n\tsteps: [],\n\tscale: 1,\n\tcurrPageX: 0, currPageY: 0,\n\tpagesX: [], pagesY: [],\n\taniTime: null,\n\twheelZoomCount: 0,\n\t\n\thandleEvent: function (e) {\n\t\tvar that = this;\n\t\tswitch(e.type) {\n\t\t\tcase START_EV:\n\t\t\t\tif (!hasTouch && e.button !== 0) return;\n\t\t\t\tthat._start(e);\n\t\t\t\tbreak;\n\t\t\tcase MOVE_EV: that._move(e); break;\n\t\t\tcase END_EV:\n\t\t\tcase CANCEL_EV: that._end(e); break;\n\t\t\tcase RESIZE_EV: that._resize(); break;\n\t\t\tcase 'DOMMouseScroll': case 'mousewheel': that._wheel(e); break;\n\t\t\tcase TRNEND_EV: that._transitionEnd(e); break;\n\t\t}\n\t},\n\t\n\t_checkDOMChanges: function () {\n\t\tif (this.moved || this.zoomed || this.animating ||\n\t\t\t(this.scrollerW == this.scroller.offsetWidth * this.scale && this.scrollerH == this.scroller.offsetHeight * this.scale)) return;\n\n\t\tthis.refresh();\n\t},\n\t\n\t_scrollbar: function (dir) {\n\t\tvar that = this,\n\t\t\tbar;\n\n\t\tif (!that[dir + 'Scrollbar']) {\n\t\t\tif (that[dir + 'ScrollbarWrapper']) {\n\t\t\t\tif (hasTransform) that[dir + 'ScrollbarIndicator'].style[transform] = '';\n\t\t\t\tthat[dir + 'ScrollbarWrapper'].parentNode.removeChild(that[dir + 'ScrollbarWrapper']);\n\t\t\t\tthat[dir + 'ScrollbarWrapper'] = null;\n\t\t\t\tthat[dir + 'ScrollbarIndicator'] = null;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!that[dir + 'ScrollbarWrapper']) {\n\t\t\t// Create the scrollbar wrapper\n\t\t\tbar = doc.createElement('div');\n\n\t\t\tif (that.options.scrollbarClass) bar.className = that.options.scrollbarClass + dir.toUpperCase();\n\t\t\telse bar.style.cssText = 'position:absolute;z-index:100;' + (dir == 'h' ? 'height:7px;bottom:1px;left:2px;right:' + (that.vScrollbar ? '7' : '2') + 'px' : 'width:7px;bottom:' + (that.hScrollbar ? '7' : '2') + 'px;top:2px;right:1px');\n\n\t\t\tbar.style.cssText += ';pointer-events:none;' + cssVendor + 'transition-property:opacity;' + cssVendor + 'transition-duration:' + (that.options.fadeScrollbar ? '350ms' : '0') + ';overflow:hidden;opacity:' + (that.options.hideScrollbar ? '0' : '1');\n\n\t\t\tthat.wrapper.appendChild(bar);\n\t\t\tthat[dir + 'ScrollbarWrapper'] = bar;\n\n\t\t\t// Create the scrollbar indicator\n\t\t\tbar = doc.createElement('div');\n\t\t\tif (!that.options.scrollbarClass) {\n\t\t\t\tbar.style.cssText = 'position:absolute;z-index:100;background:rgba(0,0,0,0.5);border:1px solid rgba(255,255,255,0.9);' + cssVendor + 'background-clip:padding-box;' + cssVendor + 'box-sizing:border-box;' + (dir == 'h' ? 'height:100%' : 'width:100%') + ';' + cssVendor + 'border-radius:3px;border-radius:3px';\n\t\t\t}\n\t\t\tbar.style.cssText += ';pointer-events:none;' + cssVendor + 'transition-property:' + cssVendor + 'transform;' + cssVendor + 'transition-timing-function:cubic-bezier(0.33,0.66,0.66,1);' + cssVendor + 'transition-duration:0;' + cssVendor + 'transform: translate(0,0)' + translateZ;\n\t\t\tif (that.options.useTransition) bar.style.cssText += ';' + cssVendor + 'transition-timing-function:cubic-bezier(0.33,0.66,0.66,1)';\n\n\t\t\tthat[dir + 'ScrollbarWrapper'].appendChild(bar);\n\t\t\tthat[dir + 'ScrollbarIndicator'] = bar;\n\t\t}\n\n\t\tif (dir == 'h') {\n\t\t\tthat.hScrollbarSize = that.hScrollbarWrapper.clientWidth;\n\t\t\tthat.hScrollbarIndicatorSize = m.max(m.round(that.hScrollbarSize * that.hScrollbarSize / that.scrollerW), 8);\n\t\t\tthat.hScrollbarIndicator.style.width = that.hScrollbarIndicatorSize + 'px';\n\t\t\tthat.hScrollbarMaxScroll = that.hScrollbarSize - that.hScrollbarIndicatorSize;\n\t\t\tthat.hScrollbarProp = that.hScrollbarMaxScroll / that.maxScrollX;\n\t\t} else {\n\t\t\tthat.vScrollbarSize = that.vScrollbarWrapper.clientHeight;\n\t\t\tthat.vScrollbarIndicatorSize = m.max(m.round(that.vScrollbarSize * that.vScrollbarSize / that.scrollerH), 8);\n\t\t\tthat.vScrollbarIndicator.style.height = that.vScrollbarIndicatorSize + 'px';\n\t\t\tthat.vScrollbarMaxScroll = that.vScrollbarSize - that.vScrollbarIndicatorSize;\n\t\t\tthat.vScrollbarProp = that.vScrollbarMaxScroll / that.maxScrollY;\n\t\t}\n\n\t\t// Reset position\n\t\tthat._scrollbarPos(dir, true);\n\t},\n\t\n\t_resize: function () {\n\t\tvar that = this;\n\t\tsetTimeout(function () { that.refresh(); }, isAndroid ? 200 : 0);\n\t},\n\t\n\t_pos: function (x, y) {\n\t\tif (this.zoomed) return;\n\n\t\tx = this.hScroll ? x : 0;\n\t\ty = this.vScroll ? y : 0;\n\n\t\tif (this.options.useTransform) {\n\t\t\tthis.scroller.style[transform] = 'translate(' + x + 'px,' + y + 'px) scale(' + this.scale + ')' + translateZ;\n\t\t} else {\n\t\t\tx = m.round(x);\n\t\t\ty = m.round(y);\n\t\t\tthis.scroller.style.left = x + 'px';\n\t\t\tthis.scroller.style.top = y + 'px';\n\t\t}\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\tthis._scrollbarPos('h');\n\t\tthis._scrollbarPos('v');\n\t},\n\n\t_scrollbarPos: function (dir, hidden) {\n\t\tvar that = this,\n\t\t\tpos = dir == 'h' ? that.x : that.y,\n\t\t\tsize;\n\n\t\tif (!that[dir + 'Scrollbar']) return;\n\n\t\tpos = that[dir + 'ScrollbarProp'] * pos;\n\n\t\tif (pos < 0) {\n\t\t\tif (!that.options.fixedScrollbar) {\n\t\t\t\tsize = that[dir + 'ScrollbarIndicatorSize'] + m.round(pos * 3);\n\t\t\t\tif (size < 8) size = 8;\n\t\t\t\tthat[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px';\n\t\t\t}\n\t\t\tpos = 0;\n\t\t} else if (pos > that[dir + 'ScrollbarMaxScroll']) {\n\t\t\tif (!that.options.fixedScrollbar) {\n\t\t\t\tsize = that[dir + 'ScrollbarIndicatorSize'] - m.round((pos - that[dir + 'ScrollbarMaxScroll']) * 3);\n\t\t\t\tif (size < 8) size = 8;\n\t\t\t\tthat[dir + 'ScrollbarIndicator'].style[dir == 'h' ? 'width' : 'height'] = size + 'px';\n\t\t\t\tpos = that[dir + 'ScrollbarMaxScroll'] + (that[dir + 'ScrollbarIndicatorSize'] - size);\n\t\t\t} else {\n\t\t\t\tpos = that[dir + 'ScrollbarMaxScroll'];\n\t\t\t}\n\t\t}\n\n\t\tthat[dir + 'ScrollbarWrapper'].style[transitionDelay] = '0';\n\t\tthat[dir + 'ScrollbarWrapper'].style.opacity = hidden && that.options.hideScrollbar ? '0' : '1';\n\t\tthat[dir + 'ScrollbarIndicator'].style[transform] = 'translate(' + (dir == 'h' ? pos + 'px,0)' : '0,' + pos + 'px)') + translateZ;\n\t},\n\t\n\t_start: function (e) {\n\t\tvar that = this,\n\t\t\tpoint = hasTouch ? e.touches[0] : e,\n\t\t\tmatrix, x, y,\n\t\t\tc1, c2;\n\n\t\tif (!that.enabled) return;\n\n\t\tif (that.options.onBeforeScrollStart) {\n\t\t\tif(that.options.onBeforeScrollStart.call(that, e)===false) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (that.options.useTransition || that.options.zoom) that._transitionTime(0);\n\n\t\tthat.moved = false;\n\t\tthat.animating = false;\n\t\tthat.zoomed = false;\n\t\tthat.distX = 0;\n\t\tthat.distY = 0;\n\t\tthat.absDistX = 0;\n\t\tthat.absDistY = 0;\n\t\tthat.dirX = 0;\n\t\tthat.dirY = 0;\n\n\t\t// Gesture start\n\t\tif (that.options.zoom && hasTouch && e.touches.length > 1) {\n\t\t\tc1 = m.abs(e.touches[0].pageX-e.touches[1].pageX);\n\t\t\tc2 = m.abs(e.touches[0].pageY-e.touches[1].pageY);\n\t\t\tthat.touchesDistStart = m.sqrt(c1 * c1 + c2 * c2);\n\n\t\t\tthat.originX = m.abs(e.touches[0].pageX + e.touches[1].pageX - that.wrapperOffsetLeft * 2) / 2 - that.x;\n\t\t\tthat.originY = m.abs(e.touches[0].pageY + e.touches[1].pageY - that.wrapperOffsetTop * 2) / 2 - that.y;\n\n\t\t\tif (that.options.onZoomStart) that.options.onZoomStart.call(that, e);\n\t\t}\n\n\t\tif (that.options.momentum) {\n\t\t\tif (that.options.useTransform) {\n\t\t\t\t// Very lame general purpose alternative to CSSMatrix\n\t\t\t\tmatrix = getComputedStyle(that.scroller, null)[transform].replace(/[^0-9\\-.,]/g, '').split(',');\n\t\t\t\tx = +(matrix[12] || matrix[4]);\n\t\t\t\ty = +(matrix[13] || matrix[5]);\n\t\t\t} else {\n\t\t\t\tx = +getComputedStyle(that.scroller, null).left.replace(/[^0-9-]/g, '');\n\t\t\t\ty = +getComputedStyle(that.scroller, null).top.replace(/[^0-9-]/g, '');\n\t\t\t}\n\t\t\t\n\t\t\tif (x != that.x || y != that.y) {\n\t\t\t\tif (that.options.useTransition) that._unbind(TRNEND_EV);\n\t\t\t\telse cancelFrame(that.aniTime);\n\t\t\t\tthat.steps = [];\n\t\t\t\tthat._pos(x, y);\n\t\t\t\tif (that.options.onScrollEnd) that.options.onScrollEnd.call(that);\n\t\t\t}\n\t\t}\n\n\t\tthat.absStartX = that.x;\t// Needed by snap threshold\n\t\tthat.absStartY = that.y;\n\n\t\tthat.startX = that.x;\n\t\tthat.startY = that.y;\n\t\tthat.pointX = point.pageX;\n\t\tthat.pointY = point.pageY;\n\n\t\tthat.startTime = e.timeStamp || Date.now();\n\n\t\tif (that.options.onScrollStart) that.options.onScrollStart.call(that, e);\n\n\t\tthat._bind(MOVE_EV, window);\n\t\tthat._bind(END_EV, window);\n\t\tthat._bind(CANCEL_EV, window);\n\t},\n\t\n\t_move: function (e) {\n\t\tvar that = this,\n\t\t\tpoint = hasTouch ? e.touches[0] : e,\n\t\t\tdeltaX = point.pageX - that.pointX,\n\t\t\tdeltaY = point.pageY - that.pointY,\n\t\t\tnewX = that.x + deltaX,\n\t\t\tnewY = that.y + deltaY,\n\t\t\tc1, c2, scale,\n\t\t\ttimestamp = e.timeStamp || Date.now();\n\n\t\tif (that.options.onBeforeScrollMove) that.options.onBeforeScrollMove.call(that, e);\n\n\t\t// Zoom\n\t\tif (that.options.zoom && hasTouch && e.touches.length > 1) {\n\t\t\tc1 = m.abs(e.touches[0].pageX - e.touches[1].pageX);\n\t\t\tc2 = m.abs(e.touches[0].pageY - e.touches[1].pageY);\n\t\t\tthat.touchesDist = m.sqrt(c1*c1+c2*c2);\n\n\t\t\tthat.zoomed = true;\n\n\t\t\tscale = 1 / that.touchesDistStart * that.touchesDist * this.scale;\n\n\t\t\tif (scale < that.options.zoomMin) scale = 0.5 * that.options.zoomMin * Math.pow(2.0, scale / that.options.zoomMin);\n\t\t\telse if (scale > that.options.zoomMax) scale = 2.0 * that.options.zoomMax * Math.pow(0.5, that.options.zoomMax / scale);\n\n\t\t\tthat.lastScale = scale / this.scale;\n\n\t\t\tnewX = this.originX - this.originX * that.lastScale + this.x,\n\t\t\tnewY = this.originY - this.originY * that.lastScale + this.y;\n\n\t\t\tthis.scroller.style[transform] = 'translate(' + newX + 'px,' + newY + 'px) scale(' + scale + ')' + translateZ;\n\n\t\t\tif (that.options.onZoom) that.options.onZoom.call(that, e);\n\t\t\treturn;\n\t\t}\n\n\t\tthat.pointX = point.pageX;\n\t\tthat.pointY = point.pageY;\n\n\t\t// Slow down if outside of the boundaries\n\t\tif (newX > 0 || newX < that.maxScrollX) {\n\t\t\tnewX = that.options.bounce ? that.x + (deltaX / 2) : newX >= 0 || that.maxScrollX >= 0 ? 0 : that.maxScrollX;\n\t\t}\n\t\tif (newY > that.minScrollY || newY < that.maxScrollY) {\n\t\t\tnewY = that.options.bounce ? that.y + (deltaY / 2) : newY >= that.minScrollY || that.maxScrollY >= 0 ? that.minScrollY : that.maxScrollY;\n\t\t}\n\n\t\tthat.distX += deltaX;\n\t\tthat.distY += deltaY;\n\t\tthat.absDistX = m.abs(that.distX);\n\t\tthat.absDistY = m.abs(that.distY);\n\n\t\tif (that.absDistX < 6 && that.absDistY < 6) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Lock direction\n\t\tif (that.options.lockDirection) {\n\t\t\tif (that.absDistX > that.absDistY + 5) {\n\t\t\t\tnewY = that.y;\n\t\t\t\tdeltaY = 0;\n\t\t\t} else if (that.absDistY > that.absDistX + 5) {\n\t\t\t\tnewX = that.x;\n\t\t\t\tdeltaX = 0;\n\t\t\t}\n\t\t}\n\n\t\tthat.moved = true;\n\t\tthat._pos(newX, newY);\n\t\tthat.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;\n\t\tthat.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;\n\n\t\tif (timestamp - that.startTime > 300) {\n\t\t\tthat.startTime = timestamp;\n\t\t\tthat.startX = that.x;\n\t\t\tthat.startY = that.y;\n\t\t}\n\t\t\n\t\tif (that.options.onScrollMove) that.options.onScrollMove.call(that, e);\n\t},\n\t\n\t_end: function (e) {\n\t\tif (hasTouch && e.touches.length !== 0) return;\n\n\t\tvar that = this,\n\t\t\tpoint = hasTouch ? e.changedTouches[0] : e,\n\t\t\ttarget, ev,\n\t\t\tmomentumX = { dist:0, time:0 },\n\t\t\tmomentumY = { dist:0, time:0 },\n\t\t\tduration = (e.timeStamp || Date.now()) - that.startTime,\n\t\t\tnewPosX = that.x,\n\t\t\tnewPosY = that.y,\n\t\t\tdistX, distY,\n\t\t\tnewDuration,\n\t\t\tsnap,\n\t\t\tscale;\n\n\t\tthat._unbind(MOVE_EV, window);\n\t\tthat._unbind(END_EV, window);\n\t\tthat._unbind(CANCEL_EV, window);\n\n\t\tif (that.options.onBeforeScrollEnd) that.options.onBeforeScrollEnd.call(that, e);\n\n\t\tif (that.zoomed) {\n\t\t\tscale = that.scale * that.lastScale;\n\t\t\tscale = Math.max(that.options.zoomMin, scale);\n\t\t\tscale = Math.min(that.options.zoomMax, scale);\n\t\t\tthat.lastScale = scale / that.scale;\n\t\t\tthat.scale = scale;\n\n\t\t\tthat.x = that.originX - that.originX * that.lastScale + that.x;\n\t\t\tthat.y = that.originY - that.originY * that.lastScale + that.y;\n\t\t\t\n\t\t\tthat.scroller.style[transitionDuration] = '200ms';\n\t\t\tthat.scroller.style[transform] = 'translate(' + that.x + 'px,' + that.y + 'px) scale(' + that.scale + ')' + translateZ;\n\t\t\t\n\t\t\tthat.zoomed = false;\n\t\t\tthat.refresh();\n\n\t\t\tif (that.options.onZoomEnd) that.options.onZoomEnd.call(that, e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!that.moved) {\n\t\t\tif (hasTouch) {\n\t\t\t\tif (that.doubleTapTimer && that.options.zoom) {\n\t\t\t\t\t// Double tapped\n\t\t\t\t\tclearTimeout(that.doubleTapTimer);\n\t\t\t\t\tthat.doubleTapTimer = null;\n\t\t\t\t\tif (that.options.onZoomStart) that.options.onZoomStart.call(that, e);\n\t\t\t\t\tthat.zoom(that.pointX, that.pointY, that.scale == 1 ? that.options.doubleTapZoom : 1);\n\t\t\t\t\tif (that.options.onZoomEnd) {\n\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\tthat.options.onZoomEnd.call(that, e);\n\t\t\t\t\t\t}, 200); // 200 is default zoom duration\n\t\t\t\t\t}\n\t\t\t\t} else if (this.options.handleClick) {\n\t\t\t\t\tthat.doubleTapTimer = setTimeout(function () {\n\t\t\t\t\t\tthat.doubleTapTimer = null;\n\n\t\t\t\t\t\t// Find the last touched element\n\t\t\t\t\t\ttarget = point.target;\n\t\t\t\t\t\twhile (target.nodeType != 1) target = target.parentNode;\n\n\t\t\t\t\t\tif (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {\n\t\t\t\t\t\t\tev = doc.createEvent('MouseEvents');\n\t\t\t\t\t\t\tev.initMouseEvent('click', true, true, e.view, 1,\n\t\t\t\t\t\t\t\tpoint.screenX, point.screenY, point.clientX, point.clientY,\n\t\t\t\t\t\t\t\te.ctrlKey, e.altKey, e.shiftKey, e.metaKey,\n\t\t\t\t\t\t\t\t0, null);\n\t\t\t\t\t\t\tev._fake = true;\n\t\t\t\t\t\t\ttarget.dispatchEvent(ev);\n\t\t\t\t\t\t}\n\t\t\t\t\t}, that.options.zoom ? 250 : 0);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthat._resetPos(400);\n\n\t\t\tif (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);\n\t\t\treturn;\n\t\t}\n\n\t\tif (duration < 300 && that.options.momentum) {\n\t\t\tmomentumX = newPosX ? that._momentum(newPosX - that.startX, duration, -that.x, that.scrollerW - that.wrapperW + that.x, that.options.bounce ? that.wrapperW : 0) : momentumX;\n\t\t\tmomentumY = newPosY ? that._momentum(newPosY - that.startY, duration, -that.y, (that.maxScrollY < 0 ? that.scrollerH - that.wrapperH + that.y - that.minScrollY : 0), that.options.bounce ? that.wrapperH : 0) : momentumY;\n\n\t\t\tnewPosX = that.x + momentumX.dist;\n\t\t\tnewPosY = that.y + momentumY.dist;\n\n\t\t\tif ((that.x > 0 && newPosX > 0) || (that.x < that.maxScrollX && newPosX < that.maxScrollX)) momentumX = { dist:0, time:0 };\n\t\t\tif ((that.y > that.minScrollY && newPosY > that.minScrollY) || (that.y < that.maxScrollY && newPosY < that.maxScrollY)) momentumY = { dist:0, time:0 };\n\t\t}\n\n\t\tif (momentumX.dist || momentumY.dist) {\n\t\t\tnewDuration = m.max(m.max(momentumX.time, momentumY.time), 10);\n\n\t\t\t// Do we need to snap?\n\t\t\tif (that.options.snap) {\n\t\t\t\tdistX = newPosX - that.absStartX;\n\t\t\t\tdistY = newPosY - that.absStartY;\n\t\t\t\tif (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) { that.scrollTo(that.absStartX, that.absStartY, 200); }\n\t\t\t\telse {\n\t\t\t\t\tsnap = that._snap(newPosX, newPosY);\n\t\t\t\t\tnewPosX = snap.x;\n\t\t\t\t\tnewPosY = snap.y;\n\t\t\t\t\tnewDuration = m.max(snap.time, newDuration);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthat.scrollTo(m.round(newPosX), m.round(newPosY), newDuration);\n\n\t\t\tif (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);\n\t\t\treturn;\n\t\t}\n\n\t\t// Do we need to snap?\n\t\tif (that.options.snap) {\n\t\t\tdistX = newPosX - that.absStartX;\n\t\t\tdistY = newPosY - that.absStartY;\n\t\t\tif (m.abs(distX) < that.options.snapThreshold && m.abs(distY) < that.options.snapThreshold) that.scrollTo(that.absStartX, that.absStartY, 200);\n\t\t\telse {\n\t\t\t\tsnap = that._snap(that.x, that.y);\n\t\t\t\tif (snap.x != that.x || snap.y != that.y) that.scrollTo(snap.x, snap.y, snap.time);\n\t\t\t}\n\n\t\t\tif (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);\n\t\t\treturn;\n\t\t}\n\n\t\tthat._resetPos(200);\n\t\tif (that.options.onTouchEnd) that.options.onTouchEnd.call(that, e);\n\t},\n\t\n\t_resetPos: function (time) {\n\t\tvar that = this,\n\t\t\tresetX = that.x >= 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x,\n\t\t\tresetY = that.y >= that.minScrollY || that.maxScrollY > 0 ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y;\n\n\t\tif (resetX == that.x && resetY == that.y) {\n\t\t\tif (that.moved) {\n\t\t\t\tthat.moved = false;\n\t\t\t\tif (that.options.onScrollEnd) that.options.onScrollEnd.call(that);\t\t// Execute custom code on scroll end\n\t\t\t}\n\n\t\t\tif (that.hScrollbar && that.options.hideScrollbar) {\n\t\t\t\tif (vendor == 'webkit') that.hScrollbarWrapper.style[transitionDelay] = '300ms';\n\t\t\t\tthat.hScrollbarWrapper.style.opacity = '0';\n\t\t\t}\n\t\t\tif (that.vScrollbar && that.options.hideScrollbar) {\n\t\t\t\tif (vendor == 'webkit') that.vScrollbarWrapper.style[transitionDelay] = '300ms';\n\t\t\t\tthat.vScrollbarWrapper.style.opacity = '0';\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tthat.scrollTo(resetX, resetY, time || 0);\n\t},\n\n\t_wheel: function (e) {\n\t\tif(!this.enabled) return;\n\t\te.preventDefault();\n\t\tvar that = this,\n\t\t\twheelDeltaX, wheelDeltaY,\n\t\t\tdeltaX, deltaY,\n\t\t\tdeltaScale;\n\n\t\tif ('wheelDeltaX' in e) {\n\t\t\twheelDeltaX = e.wheelDeltaX / 12;\n\t\t\twheelDeltaY = e.wheelDeltaY / 12;\n\t\t} else if('wheelDelta' in e) {\n\t\t\twheelDeltaX = wheelDeltaY = e.wheelDelta / 12;\n\t\t} else if ('detail' in e) {\n\t\t\twheelDeltaX = wheelDeltaY = -e.detail * 3;\n\t\t} else {\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (that.options.wheelAction == 'zoom') {\n\t\t\tdeltaScale = that.scale * Math.pow(2, 1/3 * (wheelDeltaY ? wheelDeltaY / Math.abs(wheelDeltaY) : 0));\n\t\t\tif (deltaScale < that.options.zoomMin) deltaScale = that.options.zoomMin;\n\t\t\tif (deltaScale > that.options.zoomMax) deltaScale = that.options.zoomMax;\n\t\t\t\n\t\t\tif (deltaScale != that.scale) {\n\t\t\t\tif (!that.wheelZoomCount && that.options.onZoomStart) that.options.onZoomStart.call(that, e);\n\t\t\t\tthat.wheelZoomCount++;\n\t\t\t\t\n\t\t\t\tthat.zoom(e.pageX, e.pageY, deltaScale, 400);\n\t\t\t\t\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tthat.wheelZoomCount--;\n\t\t\t\t\tif (!that.wheelZoomCount && that.options.onZoomEnd) that.options.onZoomEnd.call(that, e);\n\t\t\t\t}, 400);\n\t\t\t}\n\t\t\t\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tdeltaX = that.x + wheelDeltaX;\n\t\tdeltaY = that.y + wheelDeltaY;\n\n\t\tif (deltaX > 0) deltaX = 0;\n\t\telse if (deltaX < that.maxScrollX) deltaX = that.maxScrollX;\n\n\t\tif (deltaY > that.minScrollY) deltaY = that.minScrollY;\n\t\telse if (deltaY < that.maxScrollY) deltaY = that.maxScrollY;\n \n\t\tif (that.maxScrollY < 0) {\n\t\t\tthat.scrollTo(deltaX, deltaY, 0);\n\t\t}\n\t},\n\t\n\t_transitionEnd: function (e) {\n\t\tvar that = this;\n\n\t\tif (e.target != that.scroller) return;\n\n\t\tthat._unbind(TRNEND_EV);\n\t\t\n\t\tthat._startAni();\n\t},\n\n\n\t/**\n\t*\n\t* Utilities\n\t*\n\t*/\n\t_startAni: function () {\n\t\tvar that = this,\n\t\t\tstartX = that.x, startY = that.y,\n\t\t\tstartTime = Date.now(),\n\t\t\tstep, easeOut,\n\t\t\tanimate;\n\n\t\tif (that.animating) return;\n\t\t\n\t\tif (!that.steps.length) {\n\t\t\tthat._resetPos(400);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tstep = that.steps.shift();\n\t\t\n\t\tif (step.x == startX && step.y == startY) step.time = 0;\n\n\t\tthat.animating = true;\n\t\tthat.moved = true;\n\t\t\n\t\tif (that.options.useTransition) {\n\t\t\tthat._transitionTime(step.time);\n\t\t\tthat._pos(step.x, step.y);\n\t\t\tthat.animating = false;\n\t\t\tif (step.time) that._bind(TRNEND_EV);\n\t\t\telse that._resetPos(0);\n\t\t\treturn;\n\t\t}\n\n\t\tanimate = function () {\n\t\t\tvar now = Date.now(),\n\t\t\t\tnewX, newY;\n\n\t\t\tif (now >= startTime + step.time) {\n\t\t\t\tthat._pos(step.x, step.y);\n\t\t\t\tthat.animating = false;\n\t\t\t\tif (that.options.onAnimationEnd) that.options.onAnimationEnd.call(that);\t\t\t// Execute custom code on animation end\n\t\t\t\tthat._startAni();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnow = (now - startTime) / step.time - 1;\n\t\t\teaseOut = m.sqrt(1 - now * now);\n\t\t\tnewX = (step.x - startX) * easeOut + startX;\n\t\t\tnewY = (step.y - startY) * easeOut + startY;\n\t\t\tthat._pos(newX, newY);\n\t\t\tif (that.animating) that.aniTime = nextFrame(animate);\n\t\t};\n\n\t\tanimate();\n\t},\n\n\t_transitionTime: function (time) {\n\t\ttime += 'ms';\n\t\tthis.scroller.style[transitionDuration] = time;\n\t\tif (this.hScrollbar) this.hScrollbarIndicator.style[transitionDuration] = time;\n\t\tif (this.vScrollbar) this.vScrollbarIndicator.style[transitionDuration] = time;\n\t},\n\n\t_momentum: function (dist, time, maxDistUpper, maxDistLower, size) {\n\t\tvar deceleration = 0.0006,\n\t\t\tspeed = m.abs(dist) / time,\n\t\t\tnewDist = (speed * speed) / (2 * deceleration),\n\t\t\tnewTime = 0, outsideDist = 0;\n\n\t\t// Proportinally reduce speed if we are outside of the boundaries\n\t\tif (dist > 0 && newDist > maxDistUpper) {\n\t\t\toutsideDist = size / (6 / (newDist / speed * deceleration));\n\t\t\tmaxDistUpper = maxDistUpper + outsideDist;\n\t\t\tspeed = speed * maxDistUpper / newDist;\n\t\t\tnewDist = maxDistUpper;\n\t\t} else if (dist < 0 && newDist > maxDistLower) {\n\t\t\toutsideDist = size / (6 / (newDist / speed * deceleration));\n\t\t\tmaxDistLower = maxDistLower + outsideDist;\n\t\t\tspeed = speed * maxDistLower / newDist;\n\t\t\tnewDist = maxDistLower;\n\t\t}\n\n\t\tnewDist = newDist * (dist < 0 ? -1 : 1);\n\t\tnewTime = speed / deceleration;\n\n\t\treturn { dist: newDist, time: m.round(newTime) };\n\t},\n\n\t_offset: function (el) {\n\t\tvar left = -el.offsetLeft,\n\t\t\ttop = -el.offsetTop;\n\t\t\t\n\t\twhile (el = el.offsetParent) {\n\t\t\tleft -= el.offsetLeft;\n\t\t\ttop -= el.offsetTop;\n\t\t}\n\t\t\n\t\tif (el != this.wrapper) {\n\t\t\tleft *= this.scale;\n\t\t\ttop *= this.scale;\n\t\t}\n\n\t\treturn { left: left, top: top };\n\t},\n\n\t_snap: function (x, y) {\n\t\tvar that = this,\n\t\t\ti, l,\n\t\t\tpage, time,\n\t\t\tsizeX, sizeY;\n\n\t\t// Check page X\n\t\tpage = that.pagesX.length - 1;\n\t\tfor (i=0, l=that.pagesX.length; i= that.pagesX[i]) {\n\t\t\t\tpage = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (page == that.currPageX && page > 0 && that.dirX < 0) page--;\n\t\tx = that.pagesX[page];\n\t\tsizeX = m.abs(x - that.pagesX[that.currPageX]);\n\t\tsizeX = sizeX ? m.abs(that.x - x) / sizeX * 500 : 0;\n\t\tthat.currPageX = page;\n\n\t\t// Check page Y\n\t\tpage = that.pagesY.length-1;\n\t\tfor (i=0; i= that.pagesY[i]) {\n\t\t\t\tpage = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (page == that.currPageY && page > 0 && that.dirY < 0) page--;\n\t\ty = that.pagesY[page];\n\t\tsizeY = m.abs(y - that.pagesY[that.currPageY]);\n\t\tsizeY = sizeY ? m.abs(that.y - y) / sizeY * 500 : 0;\n\t\tthat.currPageY = page;\n\n\t\t// Snap with constant speed (proportional duration)\n\t\ttime = m.round(m.max(sizeX, sizeY)) || 200;\n\n\t\treturn { x: x, y: y, time: time };\n\t},\n\n\t_bind: function (type, el, bubble) {\n\t\t(el || this.scroller).addEventListener(type, this, !!bubble);\n\t},\n\n\t_unbind: function (type, el, bubble) {\n\t\t(el || this.scroller).removeEventListener(type, this, !!bubble);\n\t},\n\n\n\t/**\n\t*\n\t* Public methods\n\t*\n\t*/\n\tdestroy: function () {\n\t\tvar that = this;\n\n\t\tthat.scroller.style[transform] = '';\n\n\t\t// Remove the scrollbars\n\t\tthat.hScrollbar = false;\n\t\tthat.vScrollbar = false;\n\t\tthat._scrollbar('h');\n\t\tthat._scrollbar('v');\n\n\t\t// Remove the event listeners\n\t\tthat._unbind(RESIZE_EV, window);\n\t\tthat._unbind(START_EV);\n\t\tthat._unbind(MOVE_EV, window);\n\t\tthat._unbind(END_EV, window);\n\t\tthat._unbind(CANCEL_EV, window);\n\t\t\n\t\tif (!that.options.hasTouch) {\n\t\t\tthat._unbind('DOMMouseScroll');\n\t\t\tthat._unbind('mousewheel');\n\t\t}\n\t\t\n\t\tif (that.options.useTransition) that._unbind(TRNEND_EV);\n\t\t\n\t\tif (that.options.checkDOMChanges) clearInterval(that.checkDOMTime);\n\t\t\n\t\tif (that.options.onDestroy) that.options.onDestroy.call(that);\n\t},\n\n\trefresh: function () {\n\t\tvar that = this,\n\t\t\toffset,\n\t\t\ti, l,\n\t\t\tels,\n\t\t\tpos = 0,\n\t\t\tpage = 0;\n\n\t\tif (that.scale < that.options.zoomMin) that.scale = that.options.zoomMin;\n\t\tthat.wrapperW = that.wrapper.clientWidth || 1;\n\t\tthat.wrapperH = that.wrapper.clientHeight || 1;\n\n\t\tthat.minScrollY = -that.options.topOffset || 0;\n\t\tthat.scrollerW = m.round(that.scroller.offsetWidth * that.scale);\n\t\tthat.scrollerH = m.round((that.scroller.offsetHeight + that.minScrollY) * that.scale);\n\t\tthat.maxScrollX = that.wrapperW - that.scrollerW;\n\t\tthat.maxScrollY = that.wrapperH - that.scrollerH + that.minScrollY;\n\t\tthat.dirX = 0;\n\t\tthat.dirY = 0;\n\n\t\tif (that.options.onRefresh) that.options.onRefresh.call(that);\n\n\t\tthat.hScroll = that.options.hScroll && that.maxScrollX < 0;\n\t\tthat.vScroll = that.options.vScroll && (!that.options.bounceLock && !that.hScroll || that.scrollerH > that.wrapperH);\n\n\t\tthat.hScrollbar = that.hScroll && that.options.hScrollbar;\n\t\tthat.vScrollbar = that.vScroll && that.options.vScrollbar && that.scrollerH > that.wrapperH;\n\n\t\toffset = that._offset(that.wrapper);\n\t\tthat.wrapperOffsetLeft = -offset.left;\n\t\tthat.wrapperOffsetTop = -offset.top;\n\n\t\t// Prepare snap\n\t\tif (typeof that.options.snap == 'string') {\n\t\t\tthat.pagesX = [];\n\t\t\tthat.pagesY = [];\n\t\t\tels = that.scroller.querySelectorAll(that.options.snap);\n\t\t\tfor (i=0, l=els.length; i= that.maxScrollX) {\n\t\t\t\tthat.pagesX[page] = pos;\n\t\t\t\tpos = pos - that.wrapperW;\n\t\t\t\tpage++;\n\t\t\t}\n\t\t\tif (that.maxScrollX%that.wrapperW) that.pagesX[that.pagesX.length] = that.maxScrollX - that.pagesX[that.pagesX.length-1] + that.pagesX[that.pagesX.length-1];\n\n\t\t\tpos = 0;\n\t\t\tpage = 0;\n\t\t\tthat.pagesY = [];\n\t\t\twhile (pos >= that.maxScrollY) {\n\t\t\t\tthat.pagesY[page] = pos;\n\t\t\t\tpos = pos - that.wrapperH;\n\t\t\t\tpage++;\n\t\t\t}\n\t\t\tif (that.maxScrollY%that.wrapperH) that.pagesY[that.pagesY.length] = that.maxScrollY - that.pagesY[that.pagesY.length-1] + that.pagesY[that.pagesY.length-1];\n\t\t}\n\n\t\t// Prepare the scrollbars\n\t\tthat._scrollbar('h');\n\t\tthat._scrollbar('v');\n\n\t\tif (!that.zoomed) {\n\t\t\tthat.scroller.style[transitionDuration] = '0';\n\t\t\tthat._resetPos(400);\n\t\t}\n\t},\n\n\tscrollTo: function (x, y, time, relative) {\n\t\tvar that = this,\n\t\t\tstep = x,\n\t\t\ti, l;\n\n\t\tthat.stop();\n\n\t\tif (!step.length) step = [{ x: x, y: y, time: time, relative: relative }];\n\t\t\n\t\tfor (i=0, l=step.length; i 0 ? 0 : pos.left < that.maxScrollX ? that.maxScrollX : pos.left;\n\t\tpos.top = pos.top > that.minScrollY ? that.minScrollY : pos.top < that.maxScrollY ? that.maxScrollY : pos.top;\n\t\ttime = time === undefined ? m.max(m.abs(pos.left)*2, m.abs(pos.top)*2) : time;\n\n\t\tthat.scrollTo(pos.left, pos.top, time);\n\t},\n\n\tscrollToPage: function (pageX, pageY, time) {\n\t\tvar that = this, x, y;\n\t\t\n\t\ttime = time === undefined ? 400 : time;\n\n\t\tif (that.options.onScrollStart) that.options.onScrollStart.call(that);\n\n\t\tif (that.options.snap) {\n\t\t\tpageX = pageX == 'next' ? that.currPageX+1 : pageX == 'prev' ? that.currPageX-1 : pageX;\n\t\t\tpageY = pageY == 'next' ? that.currPageY+1 : pageY == 'prev' ? that.currPageY-1 : pageY;\n\n\t\t\tpageX = pageX < 0 ? 0 : pageX > that.pagesX.length-1 ? that.pagesX.length-1 : pageX;\n\t\t\tpageY = pageY < 0 ? 0 : pageY > that.pagesY.length-1 ? that.pagesY.length-1 : pageY;\n\n\t\t\tthat.currPageX = pageX;\n\t\t\tthat.currPageY = pageY;\n\t\t\tx = that.pagesX[pageX];\n\t\t\ty = that.pagesY[pageY];\n\t\t} else {\n\t\t\tx = -that.wrapperW * pageX;\n\t\t\ty = -that.wrapperH * pageY;\n\t\t\tif (x < that.maxScrollX) x = that.maxScrollX;\n\t\t\tif (y < that.maxScrollY) y = that.maxScrollY;\n\t\t}\n\n\t\tthat.scrollTo(x, y, time);\n\t},\n\n\tdisable: function () {\n\t\tthis.stop();\n\t\tthis._resetPos(0);\n\t\tthis.enabled = false;\n\n\t\t// If disabled after touchstart we make sure that there are no left over events\n\t\tthis._unbind(MOVE_EV, window);\n\t\tthis._unbind(END_EV, window);\n\t\tthis._unbind(CANCEL_EV, window);\n\t},\n\t\n\tenable: function () {\n\t\tthis.enabled = true;\n\t},\n\t\n\tstop: function () {\n\t\tif (this.options.useTransition) this._unbind(TRNEND_EV);\n\t\telse cancelFrame(this.aniTime);\n\t\tthis.steps = [];\n\t\tthis.moved = false;\n\t\tthis.animating = false;\n\t},\n\t\n\tzoom: function (x, y, scale, time) {\n\t\tvar that = this,\n\t\t\trelScale = scale / that.scale;\n\n\t\tif (!that.options.useTransform) return;\n\n\t\tthat.zoomed = true;\n\t\ttime = time === undefined ? 200 : time;\n\t\tx = x - that.wrapperOffsetLeft - that.x;\n\t\ty = y - that.wrapperOffsetTop - that.y;\n\t\tthat.x = x - x * relScale + that.x;\n\t\tthat.y = y - y * relScale + that.y;\n\n\t\tthat.scale = scale;\n\t\tthat.refresh();\n\n\t\tthat.x = that.x > 0 ? 0 : that.x < that.maxScrollX ? that.maxScrollX : that.x;\n\t\tthat.y = that.y > that.minScrollY ? that.minScrollY : that.y < that.maxScrollY ? that.maxScrollY : that.y;\n\n\t\tthat.scroller.style[transitionDuration] = time + 'ms';\n\t\tthat.scroller.style[transform] = 'translate(' + that.x + 'px,' + that.y + 'px) scale(' + scale + ')' + translateZ;\n\t\tthat.zoomed = false;\n\t},\n\t\n\tisReady: function () {\n\t\treturn !this.moved && !this.zoomed && !this.animating;\n\t}\n};\n\nfunction prefixStyle (style) {\n\tif ( vendor === '' ) return style;\n\n\tstyle = style.charAt(0).toUpperCase() + style.substr(1);\n\treturn vendor + style;\n}\n\ndummyStyle = null;\t// for the sake of it\n\nif (typeof exports !== 'undefined') exports.iScroll = iScroll;\nelse window.iScroll = iScroll;\n\n})(window, document);\n","/* \n\tPDFObject, copyright (C) 2008 Philip Hutchison (pipwerks.com)\n\tDocumentation and examples are at www.pdfobject.com \n\tVersion 1.2, April 2011\n\tMIT style license\n*/\n\n/*global ActiveXObject, window */\n\n\nvar PDFObject = function (obj){\n\t\n\tif(!obj || !obj.url){ return false; }\n\n\tvar pdfobjectversion = \"1.2\",\n\t\t//Set reasonable defaults\n\t\tid = obj.id || false,\n\t\twidth = obj.width || \"100%\",\n\t\theight = obj.height || \"100%\",\n\t\tpdfOpenParams = obj.pdfOpenParams,\n\t\turl,\n\t\tpluginTypeFound;\n\t\n\n\t/* ----------------------------------------------------\n\t Supporting functions\n\t ---------------------------------------------------- */\n\n\t//Tests specifically for Adobe Reader (aka Acrobat) in Internet Explorer\n\tvar hasReaderActiveX = function (){\n\n\t\tvar axObj = null;\n\t\t\n\t\tif (window.ActiveXObject) {\n\t\t\ttry {\n\t\t\t\taxObj = new ActiveXObject(\"AcroPDF.PDF\");\n\t\t\t}\n\t\t\tcatch(e) {\n\t\t\t\t\n\t\t\t}\n\t\t\t\t\n\t\t\t//If \"AcroPDF.PDF\" didn't work, try \"PDF.PdfCtrl\"\n\t\t\tif(!axObj){\n\t\t\t\ttry {\n\t\t\t\t\taxObj = new ActiveXObject(\"PDF.PdfCtrl\");\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t//If either \"AcroPDF.PDF\" or \"PDF.PdfCtrl\" are found, return true\n\t\t\tif (axObj !== null) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\n\t\t}\n\t\t\n\t\t//If you got to this point, there's no ActiveXObject for PDFs\n\t\treturn false;\n\t\t\n\t};\n\n\n\n\t//Tests specifically for Adobe Reader (aka Adobe Acrobat) in non-IE browsers\n\tvar hasReader = function (){\n\t\n\t\tvar i,\n\t\t\tn = navigator.plugins,\n\t\t\tcount = n.length,\n\t\t\tregx = /Adobe Reader|Adobe PDF|Acrobat/gi;\n\t\t\n\t\tfor(i=0; i';\n\n\t\treturn targetNode.getElementsByTagName(\"object\")[0];\n\n\t};\n\n\t//The hash (#) prevents odd behavior in Windows\n\t//Append optional Adobe params for opening document\n\turl = encodeURI(obj.url) + \"#\" + buildQueryString(pdfOpenParams);\n\tpluginTypeFound = pluginFound();\n\t\n\tthis.get = function(prop){ return get(prop); };\n\tthis.embed = function(id){ return embed(id); };\n\t\n\treturn this;\n\t\n};","/**\r\n * lscache library\r\n * Copyright (c) 2011, Pamela Fox\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n/**\r\n * Creates a namespace for the lscache functions.\r\n */\r\nvar lscache = function() {\r\n // Prefixes the key name on the expiration items in localStorage \r\n var CACHESUFFIX = '-cacheexpiration';\r\n\r\n // Determines if localStorage is supported in the browser;\r\n // result is cached for better performance instead of being run each time.\r\n // Feature detection is based on how Modernizr does it;\r\n // it's not straightforward due to FF4 issues.\r\n var supportsStorage = function () {\r\n try {\r\n return !!localStorage.getItem;\r\n } catch (e) {\r\n return false;\r\n }\r\n }();\r\n\r\n // Determines if native JSON (de-)serialization is supported in the browser.\r\n var supportsJSON = (window.JSON != null);\r\n\r\n /**\r\n * Returns the full string for the localStorage expiration item.\r\n * @param {String} key\r\n * @return {string}\r\n */\r\n function expirationKey(key) {\r\n return key + CACHESUFFIX;\r\n }\r\n\r\n /**\r\n * Returns the number of seconds since the epoch.\r\n * @return {number}\r\n */\r\n function currentTime() {\r\n return Math.floor((new Date().getTime())/1000);\r\n }\r\n\r\n return {\r\n\r\n /**\r\n * Stores the value in localStorage. Expires after specified number of minutes.\r\n * @param {string} key\r\n * @param {Object|string} value\r\n * @param {number} time\r\n */\r\n set: function(key, value, time) {\r\n if (!supportsStorage) return;\r\n\r\n // If we don't get a string value, try to stringify\r\n // In future, localStorage may properly support storing non-strings\r\n // and this can be removed.\r\n if (typeof value != 'string') {\r\n if (!supportsJSON) return;\r\n try {\r\n value = JSON.stringify(value);\r\n } catch (e) {\r\n // Sometimes we can't stringify due to circular refs\r\n // in complex objects, so we won't bother storing then.\r\n return;\r\n }\r\n }\r\n\r\n // Use this function to loop until the value \"fits\" into available space.\r\n function setItem(key, value) {\r\n try {\r\n\t\t\tif (time) {\r\n\t\t\t if(time == -1) {\r\n\t\t\t\t localStorage.setItem(expirationKey(key), -1);\r\n\t\t\t } else {\r\n\t\t\t\tlocalStorage.setItem(expirationKey(key), currentTime() + time);\r\n\t\t\t }\r\n\t\t } else {\r\n\t\t\t// In case they set a time earlier, remove that info from localStorage.\r\n\t\t\tlocalStorage.removeItem(expirationKey(key));\r\n\t\t }\r\n\t\t\t\r\n return localStorage.setItem(key, value);\r\n } catch (e) {\r\n\t\t\tvar a = e;\r\n if (e.name === 'QUOTA_EXCEEDED_ERR' || e.name == 'NS_ERROR_DOM_QUOTA_REACHED' || e.message == 'QUOTA_EXCEEDED_ERR') {\r\n // If the quota is exceeded, but the localStorage is empty, we can't store the item.\r\n if(localStorage.length <= 0) {\r\n return null;\r\n }\r\n // If we exceeded the quota, then we will sort\r\n // by the expire time, and then remove the N oldest\r\n var storedKeys = [], storedKey, mainKey, i;\r\n for (i = 0; i < localStorage.length; i++) {\r\n storedKey = localStorage.key(i);\r\n if (storedKey.indexOf(CACHESUFFIX) > -1) {\r\n mainKey = storedKey.split(CACHESUFFIX)[0];\r\n storedKeys.push({key: mainKey, expiration: parseInt(localStorage[storedKey])});\r\n }\r\n }\r\n storedKeys.sort(function(a, b) { return a.expiration == -1 ? 1 : (a.expiration-b.expiration); });\r\n\r\n for (i = 0, len = Math.min(30, storedKeys.length); i < len; i++) {\r\n localStorage.removeItem(storedKeys[i].key);\r\n localStorage.removeItem(expirationKey(storedKeys[i].key));\r\n }\r\n return setItem(key, value);\r\n } else {\r\n // If it was some other error, just give up.\r\n return null;\r\n }\r\n }\r\n }\r\n\r\n setItem(key, value);\r\n },\r\n\r\n /**\r\n * Retrieves specified value from localStorage, if not expired.\r\n * @param {string} key\r\n * @return {string|Object}\r\n */\r\n get: function(key) {\r\n if (!supportsStorage) return null;\r\n\r\n /**\r\n * Tries to de-serialize stored value if its an object, and returns the\r\n * normal value otherwise.\r\n * @param {String} key\r\n */\r\n function parsedStorage(key) {\r\n if (supportsJSON) {\r\n try {\r\n // We can't tell if its JSON or a string, so we try to parse\r\n return JSON.parse(localStorage.getItem(key));\r\n } catch(e) {\r\n // If we can't parse, it's probably because it isn't an object\r\n return localStorage.getItem(key);\r\n }\r\n } else {\r\n return localStorage.getItem(key);\r\n }\r\n }\r\n\r\n // Return the de-serialized item if not expired\r\n if (localStorage.getItem(expirationKey(key))) {\r\n var expirationTime = parseInt(localStorage.getItem(expirationKey(key)), 10);\r\n // Check if we should actually kick item out of storage\r\n if (currentTime() >= expirationTime && expirationTime != -1) {\r\n localStorage.removeItem(key);\r\n localStorage.removeItem(expirationKey(key));\r\n return null;\r\n } else {\r\n return parsedStorage(key);\r\n }\r\n } else if (localStorage.getItem(key)) {\r\n return parsedStorage(key);\r\n }\r\n return null;\r\n },\r\n\r\n /**\r\n * Removes a value from localStorage.\r\n * Equivalent to 'delete' in memcache, but that's a keyword in JS.\r\n * @param {string} key\r\n */\r\n remove: function(key) {\r\n if (!supportsStorage) return;\r\n localStorage.removeItem(key);\r\n localStorage.removeItem(expirationKey(key));\r\n }\r\n };\r\n}();\r\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\nappbuilder.app.version = 2.0;\n\nappbuilder.app.makeElement = function(type, options, el) {\n\tif(!el) {\n\t\tel = 'div';\n\t}\n\tif(!options) {\n\t\toptions = {\n\t\t\t'class' : type\n\t\t};\n\t}\n\telse {\n\t\tif(!options['class']) {\n\t\t\toptions['class'] = type;\n\t\t}\n\t\telse {\n\t\t\toptions['class'] = options['class'] + ' ' + type;\n\t\t}\n\t}\n\treturn new Element(el, options);\n};\nappbuilder.app.createScreen = function(id, type, title, content, hasBack, scrolls, back, tab, classes, inner) {\n\treturn '
' +\n\t\t\t(title ? \n\t\t\t'
' + \n\t\t\t\t'
' +\n\t\t\t\t(hasBack ? '
Back
' : '') +\n\t\t\t\t'
' + title + '
' +\n\t\t\t'
' : '' ) + \n\t\t\t'
' + \n\t\t\t\t(inner || scrolls ? '
' : '') +\n\t\t\t\tcontent || '' +\n\t\t\t\t(inner || scrolls ? '
' : '') +\n\t\t\t'
' + \n\t\t'
';\n};\n//Make a confirm dialog\nappbuilder.app.makeConfirm = function(question, okfnc, cancelfnc, okbtn, cancelbtn) {\n\tvar confirm = new Element('div', {\n\t\t'class': 'confirm',\n\t\thtml: '
' +\n\t\t\t'
' + question + '
' +\n\t\t\t'
' +\n\t\t\t\t'' + (okbtn || 'OK') + ' ' +\n\t\t\t\t(cancelbtn !== false ? \n\t\t\t\t\t'' + (cancelbtn || 'Cancel') + '' :\n\t\t\t\t\t'') +\n\t\t\t'
' +\n\t\t'
'\n\t});\n\tconfirm.getElement('.ok').addEvent('click', function(e) {\n\t\tconfirm.destroy.delay(0, confirm);\n\t\tif(typeOf(okfnc) == 'function') {\n\t\t\tokfnc();\n\t\t}\n\t\tif(typeOf(okfnc) != 'string') {\n\t\t\te.stop();\n\t\t}\n\t});\n\tif(cancelbtn !== false) {\n\t\tconfirm.getElement('.cancel').addEvent('click', function(e) {\n\t\t\tconfirm.destroy();\n\t\t\tif(typeOf(cancelfnc) == 'function') {\n\t\t\t\tcancelfnc();\n\t\t\t}\n\t\t\tif(typeOf(cancelfnc) != 'string') {\n\t\t\t\te.stop();\n\t\t\t}\n\t\t});\n\t}\n\treturn confirm;\n};\n//Replacement for alert\nappbuilder.app.alert = function(message, context) {\n\tif(appbuilder.app.isPhoneGap) {\n\t\tnavigator.notification.alert(message);\n\t}\n\telse if(appbuilder.app.isMobile) {\n\t\talert(message);\n\t}\n\telse {\n\t\tappbuilder.app.makeConfirm(message, null, null, null, false).inject(document.id(context || document.getElement('.phone') || document.body));\n\t}\n};\n//Replacement for confirm\nappbuilder.app.confirm = function(message, cb, context) {\n\tif(appbuilder.app.isPhoneGap) {\n\t\tnavigator.notification.confirm(message, function(btnIndex) {\n\t\t\tcb(btnIndex == 1);\n\t\t});\n\t}\n\telse if(appbuilder.app.isMobile) {\n\t\tcb(confirm(message));\n\t}\n\telse {\n\t\tappbuilder.app.makeConfirm(message, function() {cb(true);}, function() {cb(false);}).inject(document.id(context || document.getElement('.phone') || document.body));\n\t}\n};\n\nappbuilder.app.loadScript = (function() {\n\tvar loaded = [];\n\treturn function(url, onload, onfail) {\n\t\tif(loaded.contains(url)) {\n\t\t\tonload();\n\t\t}\n\t\telse if(!appbuilder.app.online()) {\n\t\t\tonfail && onfail();\n\t\t}\n\t\telse {\n\t\t\tvar script = new Element('script');\n\t\t\tscript.type = \"text/javascript\";\n\t\t\t//script.async = true;\n\t\t\tscript.src = url;\n\t\t\tvar after = function() {\n\t\t\t\tloaded.push(url);\n\t\t\t\tonload && onload();\n\t\t\t};\n\t\t\tif (!script.addEventListener){\n\t\t\t\tscript.addEvent('readystatechange', function(){\n\t\t\t\t\tif (['loaded', 'complete'].contains(this.readyState)) after();\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tscript.addEvent('load', after);\n\t\t\t}\n\t\t\tscript.addEvent('fail', function() {\n\t\t\t\tonfail && onfail();\n\t\t\t});\n\t\t\tscript.inject(document.body);\n\t\t}\n\t};\n})();\n\nappbuilder.app.decoy = (function() {\n\tvar decoyEl;\n\treturn function() {\n\t\tif(!decoyEl) {\n\t\t\tdecoyEl = appbuilder.app.makeElement('decoy', {}, 'button').inject(document.getElement('div'),'before');\n\t\t}\n\t\tdecoyEl.setStyle('display', 'block');\n\t\tdecoyEl.focus();\n\t\t(function() {\n\t\t\tdecoyEl.setStyle('display', 'none');\n\t\t}).delay(1);\n\t}\n})();\n\nappbuilder.app.spinner = function() {\n\t/*var svg = '' +\n\t'';\n\tfor (var i = 0; i < 12; i++) {\n\t\tsvg += '' +\n\t\t'';\n\t}\n\tsvg += '';\n\t//container.appendChild(document.adoptNode((new DOMParser).parseFromString(svg, 'text/xml').firstChild));*/\n\tvar svg = '';\n\treturn appbuilder.app.makeElement('loading-ani', {html: svg});\n};\nappbuilder.app.isIE = '\\v'=='v';\nif(window.console) {\n try {\n if (window.console.log.apply) {\n appbuilder.app.debug = function () {\n console.log.apply(console, arguments);\n };\n appbuilder.app.error = function () {\n console.error.apply(console, arguments);\n };\n }\n else {\n throw new Error();\n }\n }\n catch(e) {\n appbuilder.app.debug = function(a1, a2, a3, a4) {\n console.log('app', a1, a2, a3, a4);\n };\n appbuilder.app.error = function(a1, a2, a3, a4) {\n console.error('app', a1, a2, a3, a4);\n };\n }\n}\nelse {\n\tappbuilder.app.debug = function() {};\n\tappbuilder.app.error = function() {};\n}\n(function() {\n\tvar agent = navigator.userAgent,\n\t\tplatformBB = false,\n\t\tv;\n if(Browser.Platform.android) {\n\t\tv = agent.match(/Android.([\\d\\.]+)/);\n\t\tif(v && v[1]) {\n\t\t\tBrowser.version = parseFloat(v[1]) || Browser.version;\n\t\t}\n\t}\n\tif(agent.indexOf('BB10') >=0) {\n\t\tplatformBB = true;\n\t\tBrowser.Platform.BB10 = true;\n\t\tBrowser.version = 10.0;\n\t}\n\telse if(agent.indexOf('PlayBook') >= 0) {\n\t\tplatformBB = true;\n\t\tBrowser.Platform.playBook = true;\n\t\tBrowser.version = 7.2;\n\t}\n\telse if(Browser.Platform.ios) {\n v = agent.match(/OS (\\d+_\\d*) /);\n if (v && v[1]) {\n Browser.version = parseFloat(v[1].replace('_', '.')) || Browser.version;\n }\n if (Browser.version >= 7) {\n if (navigator.platform == \"iPod touch\") {\n Browser.Platform.ipodIos7 = true;\n } else if (navigator.platform == \"iPhone\") {\n Browser.Platform.iphoneIos7 = true;\n } else {\n Browser.Platform.ipadIos7 = true;\n }\n }\n\t}\n\telse if(agent.indexOf('BlackBerry') >= 0) {\n\t\tplatformBB = true;\n\t\tBrowser.Platform.smartphone = true;\n\t\tBrowser.version = 6.0;\n\t}\n\tif(platformBB) {\n\t\tBrowser.Platform[Browser.Platform.name] = false;\n\t\tBrowser.Platform.name = 'blackberry';\n\t\tBrowser.Platform.blackberry = true;\n\t\tBrowser[Browser.name] = false;\n\t\tBrowser.name = 'blackberry';\n\t\tBrowser.blackberry = true;\n\t\t\n\t\tv = agent.match(/(?:Version|BlackBerry\\d+)\\/([\\d\\.]+)/);\n\t\tif(v && v[1]) {\n\t\t\tBrowser.version = parseFloat(v[1]) || Browser.version;\n\t\t}\n\t}\n})();\n//Browser.Platform.fixMobileLandscape = false;\n//function shouldRotateToOrientation (rotation) {\n//\t\tif(Browser.Platform.ipodIos7 || Browser.Platform.iphoneIos7){\n//\t\t\talert(rotation);\n//\t\t\tif(rotation==90 || rotation==-90 ){\n//\t\t\t\tBrowser.Platform.fixMobileLandscape = true;\n//\t\t\t}else{\n//\t\t\t\tBrowser.Platform.fixMobileLandscape = false;\n//\t\t\t}\n//\t\t}\n//\t\treturn true;\n//}\n\nappbuilder.app.isMobile = (Browser.Platform.ios || Browser.Platform.android || Browser.Platform.blackberry);\nappbuilder.app.isPhoneGap = typeof window.cordova !== 'undefined' || typeof window.PhoneGap !== 'undefined';\nappbuilder.app.hasPhoneDialer = appbuilder.app.isPhoneGap && typeof window.PhoneDialer !== 'undefined';\nappbuilder.app.info = {\n\ttelPreview: !appbuilder.app.isMobile,\n\temailPreview: !appbuilder.app.isMobile,\n\tversion: appbuilder.app.version\n};\nappbuilder.app.hasCORS = ('withCredentials' in Browser.Request());\n\nwindow.addEvent('domready', function() {\n\tappbuilder.app.debug('ready', 'dom');\n\tif(appbuilder.app.isPhoneGap) {\n\t\tdocument.addEventListener('deviceready', function() {\n\t\t\tappbuilder.app.debug('ready', 'phonegap');\n\t\t\tif(window.plugins) {\n\t\t\t\tappbuilder.app.hasGAPlugin = appbuilder.app.isPhoneGap && window.plugins.gaPlugin;\n\t\t\t\tappbuilder.app.debug('hasGAPlugin', appbuilder.app.hasGAPlugin ? 'yes' : 'no');\n\t\t\t}\n\t\t\tif(navigator.device && navigator.device.capture) {\n\t\t\t\tappbuilder.app.info.canCapture = [];\n\t\t\t\tif(navigator.device.capture.captureVideo) {\n\t\t\t\t\tappbuilder.app.info.canCapture.push('video');\n\t\t\t\t}\n\t\t\t\tif(navigator.device.capture.captureImage) {\n\t\t\t\t\tappbuilder.app.info.canCapture.push('photo');\n\t\t\t\t}\n\t\t\t\tif(navigator.device.capture.captureAudio) {\n\t\t\t\t\tappbuilder.app.info.canCapture.push('audio');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(navigator.camera && navigator.camera.getPicture) {\n\t\t\t\tappbuilder.app.info.canChoose = ['photo', 'video'];\n\t\t\t}\n\t\t\tif(appbuilder.app.ready) {\n\t\t\t\tappbuilder.app.debug('ready', 'ready');\n\t\t\t\tappbuilder.app.ready();\n\t\t\t}\n\t\t});\n\t\tappbuilder.app.mapMarker = 'mapmarker.png';\n\t}\n\telse {\n\t\tif(appbuilder.base) {\n\t\t\tappbuilder.app.mapMarker = appbuilder.base + 'components/com_appbuilder/assets/images/phone/mapmarker.png';\n\t\t}\n\t\telse {\n\t\t\tappbuilder.app.mapMarker = 'http://static.appshed.com/images/mapmarker.png';\n\t\t}\n\t\tif(appbuilder.app.ready) {\n\t\t\tappbuilder.app.debug('ready', 'ready');\n\t\t\tappbuilder.app.ready();\n\t\t}\n\t}\n});\n\nappbuilder.app.online = function() {\n if(window.blackberry && blackberry.system){\n return blackberry.system.hasDataCoverage();\n }\n return navigator.onLine !== false;\n};\n\nappbuilder.app.blankImage = 'data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAAAAAAALAAAAAABAAEAAAICRAEAOw==';\n\n(function() {\n\tvar canvas = document.createElement(\"canvas\");\n\tif(canvas.getContext) {\n\t\tvar data = canvas.toDataURL(\"image/png\");\n\t\tappbuilder.app.canGetImageData = (data && data.indexOf(\"data:image/png\") == 0);\n\t}\n\telse {\n\t\tappbuilder.app.canGetImageData = false;\n\t}\n\tif(appbuilder.app.canGetImageData) {\n\t\tappbuilder.app.debug('imageData', 'yes');\n\t\tappbuilder.app.getImageDataURL = function(url, cb) {\n\t\t\tappbuilder.app.debug('imageData', 'get', url);\n\t\t\tvar img = new Image();\n\t\t\timg.onload = function() {\n\t\t\t\tvar canvas = document.createElement(\"canvas\");\n\t\t\t\t//Dont save images bigger than 1 mega pixels\n\t\t\t\tif(this.width * this.height < 1000000) {\n\t\t\t\t\tcanvas.width = this.width;\n\t\t\t\t\tcanvas.height = this.height;\n\t\t\t\t\tcanvas.getContext(\"2d\").drawImage(this, 0, 0);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar data = canvas.toDataURL(\"image/png\");\n\t\t\t\t\t\tappbuilder.app.debug('imageData', 'got', url);\n\t\t\t\t\t\tcb(data);\n\t\t\t\t\t}\n\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\tappbuilder.app.debug('imageData', 'fail 2', url);\n\t\t\t\t\t\tcb(false);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tappbuilder.app.debug('imageData', 'tooBig', url);\n\t\t\t\t\tcb(false);\n\t\t\t\t}\n\t\t\t};\n\t\t\timg.crossOrigin = \"Anonymous\";\n\t\t\timg.onerror = img.onabort = function() {\n\t\t\t\tappbuilder.app.debug('imageData', 'fail', url);\n\t\t\t\tcb(false);\n\t\t\t};\n\t\t\ttry {\n\t\t\t\timg.src = url;\n\t\t\t}\n\t\t\tcatch(e) {\n\t\t\t\tappbuilder.app.debug('imageData', 'fail', url);\n\t\t\t\tcb(false);\n\t\t\t}\n\t\t};\n\t}\n\telse {\n\t\tappbuilder.app.debug('imageData', 'no');\n\t\tappbuilder.app.getImageDataURL = function(url, cb) {\n\t\t\tcb(false);\n\t\t};\n\t}\n})();\n\n(function() {\n\tvar started = false;\n\tappbuilder.app.startHeightTracker = function() {\n\t\tif(!started) {\n\t\t\tvar headerElement = document.getElementsByTagName('head')[0],\n\t\t\t\tstyleElement = document.createElement('style'),\n\t\t\t\tupdateMinHeight = appbuilder.app.isIE ? function() {\n\t\t\t\t\tstyleElement.styleSheet.cssText = \n\t\t\t\t\t\t\".phone.fixed .phone-navigator .app .app-navigator .screen .items.scrolling {min-height: \" + window.getSize().y + \"px;}\";\n\t\t\t\t} : function() {\n\t\t\t\t\tstyleElement.innerHTML = \n\t\t\t\t\t\t\".phone.fixed .phone-navigator .app .app-navigator .screen .items.scrolling {min-height: \" + window.getSize().y + \"px;}\";\n\t\t\t\t};\n\t\t\tstyleElement.setAttribute('type', 'text/css');\n\t\t\theaderElement.appendChild(styleElement);\n\t\t\twindow.addEvent('resize', updateMinHeight);\n\t\t\tupdateMinHeight();\n\t\t\tstarted = true;\n\t\t}\n\t};\n})();\n","/**\n * \n * Spinning Wheel\n * \n * Based on origonal by cubiq, \n * http://cubiq.org/spinning-wheel-on-webkit-for-iphone-ipod-touch/11\n * \n * Changes to make a bit more cross browser compatible. Based on code in iScroll 4.\n * Also added a 'container' property to allow the spinner to be embeded within an element.\n * Updated CSS to make use of gradients and data urls to reduce extra requests\n *\n * Changes by Fred Cox\n * Copyright (c) 2011 Fred Cox, http://fedr.co/\n * \n * Origonal by Matteo Spinelli\n * Copyright (c) 2009 Matteo Spinelli, http://cubiq.org/\n * \n * Released under MIT license\n * http://cubiq.org/dropbox/mit-license.txt\n * \n * Version 3.0 - Last updated: 2013.03.01\n * \n */\n(function() {\n\tvar dummyStyle = document.createElement('div').style,\n\t\tvendor = (function () {\n\t\t\tvar vendors = 't,webkitT,MozT,msT,OT'.split(','),\n\t\t\t\tt,\n\t\t\t\ti = 0,\n\t\t\t\tl = vendors.length;\n\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tt = vendors[i] + 'ransform';\n\t\t\t\tif ( t in dummyStyle ) {\n\t\t\t\t\treturn vendors[i].substr(0, vendors[i].length - 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false;\n\t\t})(),\n\t\tcssVendor = vendor ? '-' + vendor.toLowerCase() + '-' : '',\n\n\t\t// Style properties\n\t\ttransform = prefixStyle('transform'),\n\t\ttransitionProperty = prefixStyle('transitionProperty'),\n\t\ttransitionDuration = prefixStyle('transitionDuration'),\n\t\ttransformOrigin = prefixStyle('transformOrigin'),\n\t\ttransitionTimingFunction = prefixStyle('transitionTimingFunction'),\n\t\ttransitionDelay = prefixStyle('transitionDelay'),\n\n\t\t// Browser capabilities\n\t\tisAndroid = (/android/gi).test(navigator.appVersion),\n\t\tisIDevice = (/iphone|ipad/gi).test(navigator.appVersion),\n\t\tisTouchPad = (/hp-tablet/gi).test(navigator.appVersion),\n\t\n\t\thas3d = prefixStyle('perspective') in dummyStyle,\n\t\thasTouch = 'ontouchstart' in window && !isTouchPad,\n\t\thasTransform = vendor !== false,\n\t\thasTransitionEnd = prefixStyle('transition') in dummyStyle,\n\n\t\tRESIZE_EV = 'onorientationchange' in window ? 'orientationchange' : 'resize',\n\t\tSTART_EV = hasTouch ? 'touchstart' : 'mousedown',\n\t\tMOVE_EV = hasTouch ? 'touchmove' : 'mousemove',\n\t\tEND_EV = hasTouch ? 'touchend' : 'mouseup',\n\t\t//CANCEL_EV = hasTouch ? 'touchcancel' : 'mouseup',\n\t\t//WHEEL_EV = vendor == 'Moz' ? 'DOMMouseScroll' : 'mousewheel',\n\t\tTRNEND_EV = (function () {\n\t\t\tif ( vendor === false ) return false;\n\n\t\t\tvar transitionEnd = {\n\t\t\t\t\t''\t\t\t: 'transitionend',\n\t\t\t\t\t'webkit'\t: 'webkitTransitionEnd',\n\t\t\t\t\t'Moz'\t\t: 'transitionend',\n\t\t\t\t\t'O'\t\t\t: 'otransitionend',\n\t\t\t\t\t'ms'\t\t: 'MSTransitionEnd'\n\t\t\t\t};\n\n\t\t\treturn transitionEnd[vendor];\n\t\t})(),\n\t\t\n\t\t// Helpers\n\t\ttranslateZ = has3d ? ' translateZ(0)' : '',\n\t\tSpinningWheel = {\n\t\tcellHeight: 44,\n\t\tfriction: 0.003,\n\t\tslotData: [],\n\n\n\t\t/**\n\t\t *\n\t\t * Event handler\n\t\t *\n\t\t */\n\n\t\thandleEvent: function (e) {\n\t\t\tif (e.type == START_EV) {\n\t\t\t\tthis.lockScreen(e);\n\t\t\t\tif (e.currentTarget.id == 'sw-cancel' || e.currentTarget.id == 'sw-done') {\n\t\t\t\t\tthis.tapDown(e);\n\t\t\t\t} else if (e.currentTarget.id == 'sw-frame') {\n\t\t\t\t\tthis.scrollStart(e);\n\t\t\t\t}\n\t\t\t} else if (e.type == MOVE_EV) {\n\t\t\t\tthis.lockScreen(e);\n\n\t\t\t\tif (e.currentTarget.id == 'sw-cancel' || e.currentTarget.id == 'sw-done') {\n\t\t\t\t\tthis.tapCancel(e);\n\t\t\t\t} else if(this.scrollHasStarted/* || e.currentTarget.id == 'sw-frame'*/) {\n\t\t\t\t\tthis.scrollMove(e);\n\t\t\t\t}\n\t\t\t} else if (e.type == END_EV) {\n\t\t\t\tif (e.currentTarget.id == 'sw-cancel' || e.currentTarget.id == 'sw-done') {\n\t\t\t\t\tthis.tapUp(e);\n\t\t\t\t} else if (this.scrollHasStarted/* || e.currentTarget.id == 'sw-frame'*/) {\n\t\t\t\t\tthis.scrollEnd(e);\n\t\t\t\t}\n\t\t\t} else if (e.type == TRNEND_EV) {\n\t\t\t\tif (e.target.id == 'sw-wrapper') {\n\t\t\t\t\tthis.destroy();\n\t\t\t\t} else {\n\t\t\t\t\tthis.backWithinBoundaries(e);\n\t\t\t\t}\n\t\t\t} else if (e.type == RESIZE_EV) {\n\t\t\t\tthis.onOrientationChange(e);\n\t\t\t} else if (e.type == 'scroll') {\n\t\t\t\tthis.onScroll(e);\n\t\t\t}\n\t\t},\n\n\n\t\t/**\n\t\t *\n\t\t * Global events\n\t\t *\n\t\t */\n\n\t\tonOrientationChange: function (e) {\n\t\t\twindow.scrollTo(0, 0);\n\t\t\tthis.swWrapper.style.top = (this.container ? this.container.clientHeight : (window.innerHeight + window.pageYOffset)) + 'px';\n\t\t\tthis.calculateSlotsWidth();\n\t\t},\n\n\t\tonScroll: function (e) {\n\t\t\tthis.swWrapper.style.top = (this.container ? this.container.clientHeight : (window.innerHeight + window.pageYOffset)) + 'px';\n\t\t},\n\n\t\tlockScreen: function (e) {\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t},\n\n\n\t\t/**\n\t\t *\n\t\t * Initialization\n\t\t *\n\t\t */\n\n\t\treset: function () {\n\t\t\tthis.slotEl = [];\n\n\t\t\tthis.activeSlot = null;\n\n\t\t\tthis.swWrapper = undefined;\n\t\t\tthis.swSlotWrapper = undefined;\n\t\t\tthis.swSlots = undefined;\n\t\t\tthis.swFrame = undefined;\n\t\t},\n\n\t\tcalculateSlotsWidth: function () {\n\t\t\tvar div = this.swSlots.getElementsByTagName('div');\n\t\t\tfor (var i = 0; i < div.length; i += 1) {\n\t\t\t\tthis.slotEl[i].slotWidth = div[i].offsetWidth;\n\t\t\t}\n\t\t},\n\n\t\tcreate: function () {\n\t\t\tvar i, l, out, ul, div;\n\n\t\t\tthis.reset();\t// Initialize object variables\n\n\t\t\t// Create the Spinning Wheel main wrapper\n\t\t\tdiv = document.createElement('div');\n\t\t\tdiv.id = 'sw-wrapper';\n\t\t\tdiv.style.top = (this.container ? this.container.clientHeight : (window.innerHeight + window.pageYOffset)) + 'px';\t\t// Place the SW down the actual viewing screen\n\t\t\tdiv.style[transitionProperty] = hasTransform ? cssVendor + 'transform' : 'top left';\n\t\t\tdiv.style[transitionDuration] = '400ms';\n\t\t\tif(!hasTransform) {\n\t\t\t\tdiv.style.position = 'absolute';\n\t\t\t}\n\t\t\tdiv.innerHTML = '
Cancel
Done
';\n\n\t\t\t(this.container || document.body).appendChild(div);\n\n\t\t\tthis.swWrapper = div;\t\t\t\t\t\t\t\t\t\t\t\t\t// The SW wrapper\n\t\t\tthis.swSlotWrapper = document.getElementById('sw-slots-wrapper');\t\t// Slots visible area\n\t\t\tthis.swSlots = document.getElementById('sw-slots');\t\t\t\t\t\t// Pseudo table element (inner wrapper)\n\t\t\tthis.swFrame = document.getElementById('sw-frame');\t\t\t\t\t\t// The scrolling controller\n\t\t\tif(!('borderImage' in document.body.style || 'webkitBorderImage' in document.body.style)) {\n\t\t\t\tthis.swFrame.style.borderWidth = 0;\n\t\t\t\tthis.swFrame.style.height = '215px';\n\t\t\t\tthis.swFrame.style.background = 'url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAADXCAYAAAAwRYC4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3MzExQUJGOTdBNzAxMUUyQTREQ0Y2NUVCQTI2RTQwNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3MzExQUJGQTdBNzAxMUUyQTREQ0Y2NUVCQTI2RTQwNiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjczMTFBQkY3N0E3MDExRTJBNERDRjY1RUJBMjZFNDA2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjczMTFBQkY4N0E3MDExRTJBNERDRjY1RUJBMjZFNDA2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+CK03FgAAASlJREFUeNpivH799n8GIGC5evUuA5jBwPAfxmAEs5gYoAAh9f8/uhQjI1Rq2bKFjCAGo5KC5h2oLoY/MMZv3CJwxi9SpPCIECP1izJd5Ln5NxGhgUcEk/EXgwGX+ocqlZaRBxH5D4/l//A4hUYlPqn//zFSAroUMdpJtJ0kNXArGAiqYeVRAbMYz51/ugklPQ8hBsvy5RcPDlnHf/nzuAccBUAcDkurr2CMDzDGVxjjJxFJ/R+Gmv+41fxHYTBD8X8YgwGFwYTCgPuCGeoBHAxi1EDKTGtrd7TUC0urzGzMbIxfP39iZIFZzAIzHTuDBYMBl2LFrYYVtwgmg40yEWIYrFRSTJIL8TAgweLr76cKji8FRR1o8kMqmhhRUzgwAhlRykw8UgABBgCFIa30CoPe0wAAAABJRU5ErkJggg==) repeat-x';\n\t\t\t\tdiv.style.background = 'white';\n\t\t\t}\n\t\t\t\n\t\t\t// Create HTML slot elements\n\t\t\tfor (l = 0; l < this.slotData.length; l += 1) {\n\t\t\t\t// Create the slot\n\t\t\t\tul = document.createElement('ul');\n\t\t\t\tout = '';\n\t\t\t\tfor (i in this.slotData[l].values) {\n\t\t\t\t\tif(this.slotData[l].values.hasOwnProperty(i)) {\n\t\t\t\t\t\tout += '
  • ' + this.slotData[l].values[i] + '<' + '/li>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tul.innerHTML = out;\n\n\t\t\t\tdiv = document.createElement('div');\t\t// Create slot container\n\t\t\t\tdiv.className = this.slotData[l].style;\t\t// Add styles to the container\n\t\t\t\tdiv.appendChild(ul);\n\n\t\t\t\t// Append the slot to the wrapper\n\t\t\t\tthis.swSlots.appendChild(div);\n\n\t\t\t\tul.slotPosition = l;\t\t\t// Save the slot position inside the wrapper\n\t\t\t\tul.slotYPosition = 0;\n\t\t\t\tul.slotWidth = 0;\n\t\t\t\tul.slotMaxScroll = this.swSlotWrapper.clientHeight - ul.clientHeight - 86;\n\t\t\t\tif (hasTransform) ul.style[transitionTimingFunction] = 'cubic-bezier(0, 0, 0.2, 1)';\n\n\t\t\t\tthis.slotEl.push(ul);\t\t\t// Save the slot for later use\n\n\t\t\t\t// Place the slot to its default position (if other than 0)\n\t\t\t\tif (this.slotData[l].defaultValue) {\n\t\t\t\t\tthis.scrollToValue(l, this.slotData[l].defaultValue);\t\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.calculateSlotsWidth();\n\n\t\t\t// Global events\n\t\t\tdocument.addEventListener(START_EV, this, false);\t\t\t// Prevent page scrolling\n\t\t\tdocument.addEventListener(MOVE_EV, this, false);\n\t\t\tdocument.addEventListener(END_EV, this, false);\t\t\t// Prevent page scrolling\n\t\t\twindow.addEventListener(RESIZE_EV, this, true);\t\t// Optimize SW on orientation change\n\t\t\twindow.addEventListener('scroll', this, true);\t\t\t\t// Reposition SW on page scroll\n\n\t\t\t// Cancel/Done buttons events\n\t\t\tdocument.getElementById('sw-cancel').addEventListener(START_EV, this, false);\n\t\t\tdocument.getElementById('sw-done').addEventListener(START_EV, this, false);\n\n\t\t\t// Add scrolling to the slots\n\t\t\tthis.swFrame.addEventListener(START_EV, this, false);\n\t\t},\n\n\t\topen: function () {\n\t\t\tthis.create();\n\n\t\t\tthis.swWrapper.style[transitionTimingFunction] = 'ease-out';\n\t\t\tif (hasTransform) {\n\t\t\t\tthis.swWrapper.style[transform] = 'translate(0, -260px)' + translateZ;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.swWrapper.style.left = 0;\n\t\t\t\tthis.swWrapper.style.top = -260 + 'px';\n\t\t\t}\n\t\t},\n\n\n\t\t/**\n\t\t *\n\t\t * Unload\n\t\t *\n\t\t */\n\n\t\tdestroy: function () {\n\t\t\tthis.swWrapper.removeEventListener(TRNEND_EV, this, false);\n\n\t\t\tthis.swFrame.removeEventListener(START_EV, this, false);\n\n\t\t\tdocument.getElementById('sw-cancel').removeEventListener(START_EV, this, false);\n\t\t\tdocument.getElementById('sw-done').removeEventListener(START_EV, this, false);\n\n\t\t\tdocument.removeEventListener(START_EV, this, false);\n\t\t\tdocument.removeEventListener(MOVE_EV, this, false);\n\t\t\twindow.removeEventListener(RESIZE_EV, this, true);\n\t\t\twindow.removeEventListener('scroll', this, true);\n\n\t\t\tthis.slotData = [];\n\t\t\tthis.cancelAction = function () {\n\t\t\t\treturn false;\n\t\t\t};\n\n\t\t\tthis.cancelDone = function () {\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tthis.reset();\n\n\t\t\t(this.container || document.body).removeChild(document.getElementById('sw-wrapper'));\n\t\t},\n\n\t\tclose: function () {\n\t\t\tthis.swWrapper.style[transitionTimingFunction] = 'ease-in';\n\t\t\tif (hasTransform) {\n\t\t\t\tthis.swWrapper.style[transform] = 'translate(0, 0)' + translateZ;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.swWrapper.style.left = 0;\n\t\t\t\tthis.swWrapper.style.top = 0;\n\t\t\t}\n\t\t\t\n\t\t\tthis.swWrapper.addEventListener(TRNEND_EV, this, false);\n\t\t},\n\n\n\t\t/**\n\t\t *\n\t\t * Generic methods\n\t\t *\n\t\t */\n\n\t\taddSlot: function (values, style, defaultValue) {\n\t\t\tif (!style) {\n\t\t\t\tstyle = '';\n\t\t\t}\n\n\t\t\tstyle = style.split(' ');\n\n\t\t\tfor (var i = 0; i < style.length; i += 1) {\n\t\t\t\tstyle[i] = 'sw-' + style[i];\n\t\t\t}\n\n\t\t\tstyle = style.join(' ');\n\n\t\t\tvar obj = { 'values': values, 'style': style, 'defaultValue': defaultValue };\n\t\t\tthis.slotData.push(obj);\n\t\t},\n\n\t\tgetSelectedValues: function () {\n\t\t\tvar index, count,\n\t\t\t\ti, l,\n\t\t\t\tkeys = [], values = [];\n\n\t\t\tfor (i in this.slotEl) {\n\t\t\t\tif(this.slotEl.hasOwnProperty(i)) {\n\t\t\t\t\t// Remove any residual animation\n\t\t\t\t\tthis.slotEl[i].removeEventListener(TRNEND_EV, this, false);\n\t\t\t\t\tthis.slotEl[i].style[transitionDelay] = '0';\n\n\t\t\t\t\tif (this.slotEl[i].slotYPosition > 0) {\n\t\t\t\t\t\tthis.setPosition(i, 0);\n\t\t\t\t\t} else if (this.slotEl[i].slotYPosition < this.slotEl[i].slotMaxScroll) {\n\t\t\t\t\t\tthis.setPosition(i, this.slotEl[i].slotMaxScroll);\n\t\t\t\t\t}\n\n\t\t\t\t\tindex = -Math.round(this.slotEl[i].slotYPosition / this.cellHeight);\n\n\t\t\t\t\tcount = 0;\n\t\t\t\t\tfor (l in this.slotData[i].values) {\n\t\t\t\t\t\tif(this.slotData[i].values.hasOwnProperty(l)) {\n\t\t\t\t\t\t\tif (count == index) {\n\t\t\t\t\t\t\t\tkeys.push(l);\n\t\t\t\t\t\t\t\tvalues.push(this.slotData[i].values[l]);\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcount += 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn { 'keys': keys, 'values': values };\n\t\t},\n\n\n\t\t/**\n\t\t *\n\t\t * Rolling slots\n\t\t *\n\t\t */\n\n\t\tsetPosition: function (slot, pos) {\n\t\t\tthis.slotEl[slot].slotYPosition = pos;\n\t\t\tif(hasTransform) {\n\t\t\t\tthis.slotEl[slot].style[transform] = 'translate(0, ' + pos + 'px)' + translateZ;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.slotEl[slot].style.left = 0;\n\t\t\t\tthis.slotEl[slot].style.top = pos;\n\t\t\t}\n\t\t},\n\n\t\tscrollStart: function (e) {\n\t\t\t// Find the clicked slot\n\t\t\tvar point = hasTouch ? e.touches[0] : e;\n\t\t\t\n\t\t\tvar l = 0, p = this.swSlots;\n\t\t\twhile(p){\n\t\t\t\tl += p.offsetLeft;\n\t\t\t\tp = p.offsetParent;\n\t\t\t}\n\t\t\t\n\t\t\tvar xPos = point.pageX - l;\t// Clicked position minus left offset (should be 11px)\n\n\t\t\t// Find tapped slot\n\t\t\tvar slot = 0;\n\t\t\tfor (var i = 0; i < this.slotEl.length; i += 1) {\n\t\t\t\tslot += this.slotEl[i].slotWidth;\n\n\t\t\t\tif (xPos < slot) {\n\t\t\t\t\tthis.activeSlot = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If slot is readonly do nothing\n\t\t\tif (this.slotData[this.activeSlot].style.match('readonly')) {\n\t\t\t\t//this.swFrame.removeEventListener(MOVE_EV, this, false);\n\t\t\t\t//this.swFrame.removeEventListener(END_EV, this, false);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.slotEl[this.activeSlot].removeEventListener(TRNEND_EV, this, false);\t// Remove transition event (if any)\n\t\t\tthis.slotEl[this.activeSlot].style[transitionDelay] = '0'; // Remove any residual transition\n\n\t\t\t// Stop and hold slot position\n\t\t\t//var theTransform = window.getComputedStyle(this.slotEl[this.activeSlot])[vendor + 'Transform'];\n\t\t\t//theTransform = new WebKitCSSMatrix(theTransform).m42;\n\t\t\t//if (theTransform != this.slotEl[this.activeSlot].slotYPosition) {\n\t\t\t//\tthis.setPosition(this.activeSlot, theTransform);\n\t\t\t//}\n\n\t\t\tthis.startY = point.pageY;\n\t\t\tthis.scrollStartY = this.slotEl[this.activeSlot].slotYPosition;\n\t\t\tthis.scrollStartTime = e.timeStamp;\n\n\t\t\t//this.swFrame.addEventListener(MOVE_EV, this, false);\n\t\t\t//this.swFrame.addEventListener(END_EV, this, false);\n\t\t\t\n\t\t\tthis.scrollHasStarted = true;\n\t\t\t\n\t\t\treturn true;\n\t\t},\n\n\t\tscrollMove: function (e) {\n\t\t\tvar point = hasTouch ? e.touches[0] : e;\n\t\t\tvar topDelta = point.pageY - this.startY;\n\n\t\t\tif (this.slotEl[this.activeSlot].slotYPosition > 0 || this.slotEl[this.activeSlot].slotYPosition < this.slotEl[this.activeSlot].slotMaxScroll) {\n\t\t\t\ttopDelta /= 2;\n\t\t\t}\n\n\t\t\tthis.setPosition(this.activeSlot, this.slotEl[this.activeSlot].slotYPosition + topDelta);\n\t\t\tthis.startY = point.pageY;\n\n\t\t\t// Prevent slingshot effect\n\t\t\tif (e.timeStamp - this.scrollStartTime > 80) {\n\t\t\t\tthis.scrollStartY = this.slotEl[this.activeSlot].slotYPosition;\n\t\t\t\tthis.scrollStartTime = e.timeStamp;\n\t\t\t}\n\t\t},\n\n\t\tscrollEnd: function (e) {\n\t\t\t//this.swFrame.removeEventListener(MOVE_EV, this, false);\n\t\t\t//this.swFrame.removeEventListener(END_EV, this, false);\n\t\t\t\n\t\t\tthis.scrollHasStarted = false;\n\n\t\t\t// If we are outside of the boundaries, let's go back to the sheepfold\n\t\t\tif (this.slotEl[this.activeSlot].slotYPosition > 0 || this.slotEl[this.activeSlot].slotYPosition < this.slotEl[this.activeSlot].slotMaxScroll) {\n\t\t\t\tthis.scrollTo(this.activeSlot, this.slotEl[this.activeSlot].slotYPosition > 0 ? 0 : this.slotEl[this.activeSlot].slotMaxScroll);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// Lame formula to calculate a fake deceleration\n\t\t\tvar scrollDistance = this.slotEl[this.activeSlot].slotYPosition - this.scrollStartY;\n\n\t\t\t// The drag session was too short\n\t\t\tif (scrollDistance < this.cellHeight / 1.5 && scrollDistance > -this.cellHeight / 1.5) {\n\t\t\t\tif (this.slotEl[this.activeSlot].slotYPosition % this.cellHeight) {\n\t\t\t\t\tthis.scrollTo(this.activeSlot, Math.round(this.slotEl[this.activeSlot].slotYPosition / this.cellHeight) * this.cellHeight, '100ms');\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tvar scrollDuration = e.timeStamp - this.scrollStartTime;\n\n\t\t\tvar newDuration = (2 * scrollDistance / scrollDuration) / this.friction;\n\t\t\tvar newScrollDistance = (this.friction / 2) * (newDuration * newDuration);\n\n\t\t\tif (newDuration < 0) {\n\t\t\t\tnewDuration = -newDuration;\n\t\t\t\tnewScrollDistance = -newScrollDistance;\n\t\t\t}\n\n\t\t\tvar newPosition = this.slotEl[this.activeSlot].slotYPosition + newScrollDistance;\n\n\t\t\tif (newPosition > 0) {\n\t\t\t\t// Prevent the slot to be dragged outside the visible area (top margin)\n\t\t\t\tnewPosition /= 2;\n\t\t\t\tnewDuration /= 3;\n\n\t\t\t\tif (newPosition > this.swSlotWrapper.clientHeight / 4) {\n\t\t\t\t\tnewPosition = this.swSlotWrapper.clientHeight / 4;\n\t\t\t\t}\n\t\t\t} else if (newPosition < this.slotEl[this.activeSlot].slotMaxScroll) {\n\t\t\t\t// Prevent the slot to be dragged outside the visible area (bottom margin)\n\t\t\t\tnewPosition = (newPosition - this.slotEl[this.activeSlot].slotMaxScroll) / 2 + this.slotEl[this.activeSlot].slotMaxScroll;\n\t\t\t\tnewDuration /= 3;\n\n\t\t\t\tif (newPosition < this.slotEl[this.activeSlot].slotMaxScroll - this.swSlotWrapper.clientHeight / 4) {\n\t\t\t\t\tnewPosition = this.slotEl[this.activeSlot].slotMaxScroll - this.swSlotWrapper.clientHeight / 4;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tnewPosition = Math.round(newPosition / this.cellHeight) * this.cellHeight;\n\t\t\t}\n\n\t\t\tthis.scrollTo(this.activeSlot, Math.round(newPosition), Math.round(newDuration) + 'ms');\n\n\t\t\treturn true;\n\t\t},\n\n\t\tscrollTo: function (slotNum, dest, runtime) {\n\t\t\tthis.slotEl[slotNum].style[transitionDuration] = runtime ? runtime : '100ms';\n\t\t\tthis.setPosition(slotNum, dest ? dest : 0);\n\n\t\t\t// If we are outside of the boundaries go back to the sheepfold\n\t\t\tif (this.slotEl[slotNum].slotYPosition > 0 || this.slotEl[slotNum].slotYPosition < this.slotEl[slotNum].slotMaxScroll) {\n\t\t\t\tthis.slotEl[slotNum].addEventListener(TRNEND_EV, this, false);\n\t\t\t}\n\t\t},\n\n\t\tscrollToValue: function (slot, value) {\n\t\t\tvar yPos, count, i;\n\n\t\t\tthis.slotEl[slot].removeEventListener(TRNEND_EV, this, false);\n\t\t\tthis.slotEl[slot].style[transitionDuration] = '0';\n\n\t\t\tcount = 0;\n\t\t\tfor (i in this.slotData[slot].values) {\n\t\t\t\tif(this.slotData[slot].values.hasOwnProperty(i)) {\n\t\t\t\t\tif (i == value) {\n\t\t\t\t\t\tyPos = count * this.cellHeight;\n\t\t\t\t\t\tthis.setPosition(slot, yPos);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tcount -= 1;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tbackWithinBoundaries: function (e) {\n\t\t\te.target.removeEventListener(TRNEND_EV, this, false);\n\n\t\t\tthis.scrollTo(e.target.slotPosition, e.target.slotYPosition > 0 ? 0 : e.target.slotMaxScroll, '150ms');\n\t\t\treturn false;\n\t\t},\n\n\n\t\t/**\n\t\t *\n\t\t * Buttons\n\t\t *\n\t\t */\n\n\t\ttapDown: function (e) {\n\t\t\te.currentTarget.addEventListener(MOVE_EV, this, false);\n\t\t\te.currentTarget.addEventListener(END_EV, this, false);\n\t\t\te.currentTarget.className = 'sw-pressed';\n\t\t},\n\n\t\ttapCancel: function (e) {\n\t\t\te.currentTarget.removeEventListener(MOVE_EV, this, false);\n\t\t\te.currentTarget.removeEventListener(END_EV, this, false);\n\t\t\te.currentTarget.className = '';\n\t\t},\n\n\t\ttapUp: function (e) {\n\t\t\tthis.tapCancel(e);\n\n\t\t\tif (e.currentTarget.id == 'sw-cancel') {\n\t\t\t\tthis.cancelAction();\n\t\t\t} else {\n\t\t\t\tthis.doneAction();\n\t\t\t}\n\n\t\t\tthis.close();\n\t\t},\n\n\t\tsetCancelAction: function (action) {\n\t\t\tthis.cancelAction = action;\n\t\t},\n\n\t\tsetDoneAction: function (action) {\n\t\t\tthis.doneAction = action;\n\t\t},\n\n\t\tcancelAction: function () {\n\t\t\treturn false;\n\t\t},\n\n\t\tcancelDone: function () {\n\t\t\treturn true;\n\t\t}\n\t};\n\t\n\tfunction prefixStyle (style) {\n\t\tif ( vendor === '' ) return style;\n\n\t\tstyle = style.charAt(0).toUpperCase() + style.substr(1);\n\t\treturn vendor + style;\n\t}\n\n\tdummyStyle = null;\t// for the sake of it\n\t\n\twindow.SpinningWheel = SpinningWheel;\n})();","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\nappbuilder.app.scroll = appbuilder.app.scroll || {};\nappbuilder.app.scroll.canIScroll = iScroll.canIScroll();\n\nif(appbuilder.app.scroll.canIScroll) {\n\tappbuilder.app.debug('scroll', 'iscroll', 'yes');\n\tappbuilder.app.scroll.iphone = new Class({\n\t\tiScrollOptions : {\n\t\t\thScroll: false,\n\t\t\thideScrollbar: true,\n\t\t\tonBeforeScrollStart: function (e) {\n\t\t\t\tif(e.target.tagName != 'INPUT'\n\t\t\t\t&& e.target.tagName != 'SELECT'\n\t\t\t && e.target.tagName != 'TEXTAREA') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tenabled: true,\n\n\t\tinitialize : function(element, options) {\n\t\t\tthis.iScroll = new iScroll(element, Object.merge(this.iScrollOptions, options || {}));\n\t\t},\n\t\t\n\t\trefresh : function() {\n\t\t\tappbuilder.app.debug('scroll', 'refresh');\n\t\t\tthis.iScroll.refresh();\n\t\t},\n\t\t\n\t\tscrollToElement: function(e, t) {\n\t\t\tthis.iScroll.scrollToElement(e, t);\n\t\t},\n\t\t\n\t\tscrollToTop: function() {\n\t\t\tthis.iScroll.scrollTo(0, 0);\n\t\t},\n\t\t\n\t\tisScrolling : function() {\n\t\t\treturn !this.iScroll.isReady();\n\t\t},\n\t\t\n\t\tsetEnabled: function(enabled) {\n\t\t\tthis.enabled = enabled;\n\t\t\tif(enabled) {\n\t\t\t\tthis.iScroll.enable();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.iScroll.disable();\n\t\t\t}\n\t\t},\t\n\t\t\t\t\n\t\tdisable:function(){\n\t\t\tthis.iScroll.disable();\n\t\t},\n\t\t\n\t\tenable:function(){\n\t\t\tthis.iScroll.enable();\n\t\t}\n\t}, 'scroll.iphone-iscroll');\n\t\n\tappbuilder.app.scroll.gallery = new Class({\n\t\tExtends: appbuilder.app.scroll.iphone,\n\t\tiScrollOptions : {\n\t\t\thScroll: true,\n\t\t\thScrollbar : false,\n\t\t\tvScroll: false,\n\t\t\tmomentum: false,\n\t\t\tsnap : '.item.gallery',\n\t\t\tzoom: true\n\t\t},\n\t\t\n\t\trefresh: function() {\n\t\t\tthis.parent();\n\t\t},\n\n\t\tgotoPage : function(number) {\n\t\t\tthis.iScroll.scrollToPage(number, 0, 1);\n\t\t},\n\n\t\tgetPage : function() {\n\t\t\treturn this.iScroll.currPageX;\n\t\t}\n\t}, 'scroll.gallery-iscroll');\n\n\tappbuilder.app.scroll.appsscreen = new Class({\n\t\tExtends: appbuilder.app.scroll.gallery,\n\t\tiScrollOptions : {\n\t\t\tsnap : '.apps'\n\t\t},\n\t\tinitialize : function(element, options) {\n\t\t\tvar dots = element.getElements('.home-dots .dot');\n\t\t\tvar currentPage = 1;\n\t\t\tvar homeUnderlay = element.getElement('.home-underlay');\n\t\t\tvar setopacity = function(iscroll, xx) {\n\t\t\t\tif(currentPage == 1 || currentPage == 0) {\n\t\t\t\t\tvar width = iscroll.wrapperW;\n\t\t\t\t\tvar x = -xx;\n\t\t\t\t\tx = Math.min(x, width);\n\t\t\t\t\tx = Math.max(x, 0);\n\t\t\t\t\tvar opacity = (1 - (x / width)) * 0.6;\n\t\t\t\t\thomeUnderlay.setStyle('opacity', opacity);\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.iScroll = new iScroll(element, Object.merge(this.iScrollOptions, {\n\t\t\t\tonScrollEnd: (function() {\n\t\t\t\t\tdots.removeClass('curr');\n\t\t\t\t\tcurrentPage = this.getPage();\n\t\t\t\t\tdots[currentPage].addClass('curr');\n\t\t\t\t}).bind(this),\n\t\t\t\tonScrollMove: function(e) {\n\t\t\t\t\tsetopacity(this, this.x);//this is iScroll\n\t\t\t\t},\n\t\t\t\tonTouchEnd: function(e) {\n\t\t\t\t\tsetopacity(this, this.pagesX[this.currPageX]);//this is iScroll\n\t\t\t\t}\n\t\t\t}, options || {}));\n\t\t\tthis.gotoPage(1);\n\t\t}\n\t}, 'scroll.apps-iscroll');\n}\nelse {\n\tappbuilder.app.debug('scroll', 'iscroll', 'no');\n\tvar drag = new Class({\n\t\tExtends : Drag,\n\t\tstart : function(e) {\n\t\t\tif (e.target.nodeName != 'SELECT' && e.target.nodeName != 'INPUT' && e.target.nodeName != 'TEXTAREA') {\n\t\t\t\tthis.parent(e);\n\t\t\t}\n\t\t}\n\t});\n\n\tappbuilder.app.scroll.iphone = new Class({\n\t\telement : null,\n\t\tdrag : null,\n\t\tdragging : false,\n\t\tmodifiers: {\n\t\t\tx: null,\n\t\t\ty: 'top'\n\t\t},\n\t\tenabled: true,\n\t\t\n\t\tinitialize : function(element) {\n\t\t\tthis.element = element;\n\t\t\tthis.inner = element.getFirst();\n\t\t\tvar elementSize = this.element.getSize();\n\t\t\tvar innerSize = this.inner.getSize();\n\t\t\tvar pos = this.inner.getStyle('position');\n\t\t\tif(pos != 'absolute' && pos != 'fixed' && pos != 'relative') {\n\t\t\t\tthis.inner.setStyle('position', 'relative');\n\t\t\t}\n\t\t\tthis.drag = new drag(this.inner, {\n\t\t\t\thandle: this.element,\n\t\t\t\tstyle : true,\n\t\t\t\tmodifiers: this.modifiers,\n\t\t\t\tinvert : false,\n\t\t\t\tpreventDefault : false,\n\t\t\t\tlimit: {\n\t\t\t\t\ty: [-innerSize.y + elementSize.y, 0],\n\t\t\t\t\tx: [-innerSize.x + elementSize.x, 0]\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tthis.drag.addEvent('start', (function() {\n\t\t\t\tthis.dragging = true;\n\t\t\t}).bind(this));\n\n\t\t\tthis.drag.addEvent('complete', (function() {\n\t\t\t\t(function() {\n\t\t\t\t\tthis.dragging = false;\n\t\t\t\t}).delay(100, this);\n\t\t\t}).bind(this));\n\n\t\t\tthis.element.addEvent('mousewheel', (function(e) {\n\t\t\t\te.stop();\n\t\t\t\tthis.scrollWheel(e.wheel);\n\t\t\t\tthis.dragging = true;\n\t\t\t\tif(this.mouseTimeout > 0) {\n\t\t\t\t\tclearTimeout(this.mouseTimeout);\n\t\t\t\t}\n\t\t\t\tthis.mouseTimeout = (function() {\n\t\t\t\t\tthis.drag.fireEvent('complete')\n\t\t\t\t}).delay(100, this);\n\t\t\t}).bind(this));\n\t\t\tthis.makeScrollBar();\n\t\t},\n\t\t\n\t\tscrollWheel : function(wheel) {\n\t\t\tif(this.enabled) {\n\t\t\t\tvar top = this.inner.getStyle('top').toInt() || 0;\n\t\t\t\tif(wheel > 0) {\n\t\t\t\t\ttop -= 20;\n\t\t\t\t\tif(top < this.drag.options.limit.y[0]) {\n\t\t\t\t\t\ttop = this.drag.options.limit.y[0]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(wheel < 0) {\n\t\t\t\t\ttop += 20;\n\t\t\t\t\tif(top > this.drag.options.limit.y[1]) {\n\t\t\t\t\t\ttop = this.drag.options.limit.y[1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.inner.setStyles({top: top});\n\t\t\t}\n\t\t},\n\t\t\n\t\tmakeScrollBar : function() {\n\t\t\tthis.scrollBar = new Element('div', {\n\t\t\t\t'class':'scroll-bar'\n\t\t\t}).inject(this.element);\n\t\t\tthis.scrollBar.fade('hide');\n\t\t\tthis.scrollKnob = new Element('div', {\n\t\t\t\t'class':'scroll-knob'\n\t\t\t}).inject(this.element);\n\t\t\tthis.scrollKnob.fade('hide');\n\t\t\tvar that = this;\n\t\t\tthis.drag.addEvent('start', function() {\n\t\t\t\tthat.scrollBar.fade('in');\n\t\t\t\tthat.scrollKnob.fade('in');\n\t\t\t});\n\t\t\tthis.drag.addEvent('drag', function() {\n\t\t\t\tvar height = that.element.getStyle('height').toInt();\n\t\t\t\tvar scroll = that.element.getScroll();\n\t\t\t\tvar sT = scroll.y + (0.05 * height);\n\t\t\t\tvar sH = height * 0.9;\n\t\t\t\tthat.scrollBar.setStyle('top', sT);\n\t\t\t\tthat.scrollKnob.setStyle('top', sT + (sH * (scroll.y / height)));\n\t\t\t\tthat.scrollBar.setStyle('right', 2 - scroll.x);\n\t\t\t\tthat.scrollKnob.setStyle('right', 2 - scroll.x);\n\t\t\t});\n\t\t\tthis.drag.addEvent('complete', function() {\n\t\t\t\tthat.scrollBar.fade('out');\n\t\t\t\tthat.scrollKnob.fade('out');\n\t\t\t});\n\t\t},\n\t\t\n\t\tscrollToElement: function(e, t) {\n\t\t\tthis.inner.setStyle('top', Math.max(-e.getPosition(this.inner).y, this.drag.options.limit.y[0]));\n\t\t},\n\t\t\n\t\trefresh : function() {\n\t\t\tvar elementSize = this.element.getSize();\n\t\t\tvar innerSize = this.inner.getSize();\n\t\t\tthis.drag.setOptions({\n\t\t\t\tlimit: {\n\t\t\t\t\ty: [-innerSize.y + elementSize.y, 0],\n\t\t\t\t\tx: [-innerSize.x + elementSize.x, 0]\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\t\n\t\tscrollToTop: function() {\n\t\t\tthis.inner.setStyle('top', 0);\n\t\t},\n\t\t\n\t\tisScrolling : function() {\n\t\t\treturn this.dragging;\n\t\t},\n\t\t\n\t\tsetEnabled: function(enabled) {\n\t\t\tthis.enabled = enabled;\n\t\t\tif(enabled) {\n\t\t\t\tthis.drag.attach();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.drag.detach();\n\t\t\t}\n\t\t}\n\t}, 'scroll.iphone');\n\t\n\tappbuilder.app.scroll.gallery = new Class({\n\t\tExtends: appbuilder.app.scroll.iphone,\n\t\tmodifiers: {\n\t\t\tx: 'left',\n\t\t\ty: null\n\t\t},\n\t\tinitialize : function(element) {\n\t\t\tthis.parent(element);\n\t\t\tthis.drag.addEvent('complete', (function() {\n\t\t\t\tvar left = - this.inner.getStyle('left').toInt();\n\t\t\t\tvar width = this.element.getSize().x;\n\n\t\t\t\tvar x = Math.floor(left / width) * width;\n\n\t\t\t\tif((left % width) > (width / 2)) {\n\t\t\t\t\tx += width;\n\t\t\t\t}\n\n\t\t\t\tthis.inner.setStyles({left: - x});\n\t\t\t}).bind(this));\n\t\t},\n\t\t\n\t\tscrollWheel : function(wheel) {\n\t\t\tif(this.enabled) {\n\t\t\t\tvar left = this.inner.getStyle('left').toInt() || 0;\n\t\t\t\tif(wheel > 0) {\n\t\t\t\t\tleft -= 20;\n\t\t\t\t\tif(left < this.drag.options.limit.x[0]) {\n\t\t\t\t\t\tleft = this.drag.options.limit.x[0]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(wheel < 0) {\n\t\t\t\t\tleft += 20;\n\t\t\t\t\tif(left > this.drag.options.limit.x[1]) {\n\t\t\t\t\t\tleft = this.drag.options.limit.x[1]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.inner.setStyles({left: left});\n\t\t\t}\n\t\t},\n\t\t\n\t\tscrollToTop: function() {\n\t\t\tthis.inner.setStyle('left', 0);\n\t\t},\n\t\t\n\t\tgotoPage : function(number) {\n\t\t\tthis.inner.setStyles({left: -number * this.element.getSize().x});\n\t\t},\n\n\t\tgetPage : function() {\n\t\t\tvar x = -this.inner.getStyle('left').toInt();\n\t\t\treturn Math.floor(x / this.element.getSize().x);\n\t\t},\n\n\t\tmakeScrollBar : function() {\n\n\t\t}\n\t}, 'scroll.gallery');\n\t\n\tappbuilder.app.scroll.appsscreen = new Class({\n\t\tExtends: appbuilder.app.scroll.gallery,\n\t\tinitialize : function(element, options) {\n\t\t\tthis.parent(element, options);\n\t\t\tvar dots = element.getElements('.home-dots .dot');\n\t\t\tvar currentPage = 1;\n\t\t\tvar homeUnderlay = element.getElement('.home-underlay');\n\t\t\tvar setopacity = function() {\n\t\t\t\tif(currentPage == 1 || currentPage == 0) {\n\t\t\t\t\tvar width = this.element.getSize().x;\n\t\t\t\t\tvar x = -this.inner.getStyle('left').toInt();\n\t\t\t\t\tx = Math.min(x, width);\n\t\t\t\t\tx = Math.max(x, 0);\n\t\t\t\t\tvar opacity = (1 - (x / width)) * 0.6;\n\t\t\t\t\thomeUnderlay.setStyle('opacity', opacity);\n\t\t\t\t}\n\t\t\t}.bind(this);\n\t\t\tthis.drag.addEvent('complete', (function() {\n\t\t\t\tdots.removeClass('curr');\n\t\t\t\tcurrentPage = this.getPage();\n\t\t\t\tdots[currentPage].addClass('curr');\n\t\t\t\tsetopacity();\n\t\t\t}).bind(this));\n\t\t\t\n\t\t\tthis.drag.addEvent('drag', function() {\n\t\t\t\tsetopacity();\n\t\t\t});\n\t\t\tthis.gotoPage(1);\n\t\t}\n\t}, 'scroll.apps');\n}\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\n\n(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();\n})(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\nappbuilder.app.Analytics = {\n\t\n\tevents: true,\n\tpages: true,\n\t\n\tattach: function(phone) {\n\t\tappbuilder.app.debug('analytics', 'attach');\n\t\tphone.addEvent('app', function(id, app) {\n\t\t\tif(id != 1) {\n\t\t\t\tthis.currentAppName = app.get('data-name') || 'App #' + id;\n\t\t\t\tthis.currentAppId = id;\n\n\t\t\t\tthis.pushVar(1, id);\n\t\t\t\tthis.pushVar(2, 0);\n\t\t\t\tthis.pushEvent('appbuilder', 'app', this.currentAppName, id);\n\t\t\t\tthis.pushPageview('app/' + this.currentAppName + '-' + id);\n\t\t\t}\n\t\t}.bind(this));\n\t\t\n\t\tphone.addEvent('screen', function(id, screen) {\n\t\t\tif(id != 1) {\n\t\t\t\tvar t = screen.getElement('.header .title');\n\t\t\t\tvar screenName = t ? t.get('text') : 'Screen #' + id;\n\n\t\t\t\tthis.pushVar(2, id);\n\t\t\t\tthis.pushEvent('appbuilder', 'screen', this.currentAppName + ' - ' + screenName, id);\n\t\t\t\tthis.pushPageview('app/' + this.currentAppName + '-'+ this.currentAppId + '/' + screenName + '-' + id);\n\t\t\t}\n\t\t}.bind(this));\n\t\t\n\t\tthis.load();\n\t},\n\t\n\tsetAccount: function(a) {\n\t\tappbuilder.app.debug('analytics', 'setAccount', a);\n\t\tthis.account = true;\n\t\tthis.accountHandle = a;\n\t\tif(!appbuilder.app.hasGAPlugin) {\n ga('create', a, 'auto', {'name': 'custom'});\n\t\t}\n\t},\n\t\n\tpushEvent: function(cat, action, label, value) {\n\t\tappbuilder.app.debug('analytics', 'pushEvent', cat, action, label, value);\n\t\tif(this.events) {\n\t\t\tif(appbuilder.app.hasGAPlugin) {\n\t\t\t\tif(this.pluginReady) {\n\t\t\t\t\twindow.plugins.gaPlugin.trackEvent(function(){}, function(){}, cat, action, label, value);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n if(this.account) {\n\t\t\t\t\tga('custom.send', 'event', {\n 'eventCategory': cat,\n 'eventAction': action,\n 'eventLabel': label,\n 'eventValue': value\n });\n\t\t\t\t}\n\t\t\t\tga('send', 'event', {\n 'eventCategory': cat,\n 'eventAction': action,\n 'eventLabel': label,\n 'eventValue': value\n });\n\t\t\t}\n\t\t}\n\t},\n\t\n\t//mainonly is used by popup to push pageviews\n\tpushPageview: function(path, mainonly) {\n\t\tappbuilder.app.debug('analytics', 'pushPageview', path);\n\t\tif(this.pages) {\n\t\t\tif(appbuilder.app.hasGAPlugin) {\n\t\t\t\tif(this.pluginReady) {\n\t\t\t\t\twindow.plugins.gaPlugin.trackPage(function(){}, function(){}, \"phonegap.appshed.com\" + path);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(this.account && !mainonly) {\n ga('custom.send', 'pageview', path);\n\t\t\t\t}\n\t\t\t\tga('send', 'pageview', path);\n\t\t\t}\n\t\t}\n\t},\n\t\n\tpushVar: function(index, value) {\n\t\tappbuilder.app.debug('analytics', 'pushVar', index, value);\n\t\tif(appbuilder.app.hasGAPlugin) {\n\t\t\tif(this.pluginReady) {\n\t\t\t\twindow.plugins.gaPlugin.setVariable(function(){}, function(){}, index, value);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif(this.account) {\n\t\t\t\tga('custom.set', 'dimension'+index, value);\n\t\t\t}\n\t\t\tga('set', 'dimension'+index, value);\n\t\t}\n\t},\n\t\n\tloaded: false,\n\t\n\tload: function() {\n\t\tif(!this.loaded) {\n\t\t\tif(appbuilder.app.hasGAPlugin) {\n\t\t\t\tappbuilder.app.debug('analytics', 'load', 'plugin');\n\t\t\t\tvar loaded = function(){\n\t\t\t\t\tthis.pluginReady = true;\n\t\t\t\t\tthis.pushVar(3, 1);\n\t\t\t\t}.bind(this);\n\t\t\t\tif(this.account) {\n\t\t\t\t\twindow.plugins.gaPlugin.init(loaded, function(){}, this.accountHandle, 10);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\twindow.plugins.gaPlugin.init(loaded, function(){}, 'UA-19920027-1', 10);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tappbuilder.app.debug('analytics', 'load', 'ga.js');\n ga('create', 'UA-19920027-1', 'auto');\n\t\t\t\tthis.pushVar(3, appbuilder.app.isPhoneGap ? 1 : 0);\n\t\t\t\t//When the phone is embeded in the editor ga.js could get loaded twice\n\t\t\t\tfunction injectScript() {\n\t\t\t\t\t(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n\t\t\t\t\twindow.removeEventListener && window.removeEventListener('online', injectScript);\n\t\t\t\t}\n\t\t\t\tif(appbuilder.app.online()) {\n\t\t\t\t\tinjectScript();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t window.addEventListener && window.addEventListener('online', injectScript);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.loaded = true;\n\t\t}\n\t}\n};\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\n\nappbuilder.app.BBM = {\n\tbbmSetup: false,\n\taccess: 'unknown',\n\tcbs: [],\n\t//Default dev uuid, apps create there own which is setup by the app object\n\tuuid: \"c2b3c8fc-54c5-4de4-a211-8b70eaa519d6\",\n\t\n\tcanBBM: Browser.Platform.BB10 || Browser.Platform.smartphone,\n\terrorMsg: 'This action is only avaible on BlackBerry devices',\n\t\n\tsetup: function() {\n\t\tif(!this.bbmSetup) {\n\t\t\tappbuilder.app.loadScript('local:///chrome/webworks.js', function() {\n\t\t\t\tif(blackberry.event) {\n\t\t\t\t\tdocument.addEventListener(\"webworksready\", function() {\n\t\t\t\t\t\tthis.bbmSetup = true;\n\t\t\t\t\t\tblackberry.event.addEventListener('onaccesschanged', this.accessChanged.bind(this));\n\t\t\t\t\t\tthis.postSetup();\n\t\t\t\t\t}.bind(this));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.bbmSetup = true;\n\t\t\t\t\tblackberry.bbm.platform.onaccesschanged = this.accessChanged.bind(this);\n\t\t\t\t\tthis.postSetup();\n\t\t\t\t}\n\t\t\t}.bind(this), function() {\n\t\t\t\tthis.bbmSetup = true;\n\t\t\t\tthis.canBBM = false;\n\t\t\t\tthis.processCbs();\n\t\t\t}.bind(this));\n\t\t}\n\t\telse {\n\t\t\tthis.postSetup();\n\t\t}\n\t},\n\t\n\tpostSetup: function() {\n\t\tif (this.access == \"allowed\") {\n\t\t\tthis.processCbs();\n\t\t}\n\t\telse {\n\t\t\tthis.register();\n\t\t}\n\t},\n\t\n\tregister: function() {\n\t\tappbuilder.app.debug('bbm', 'register');\n\t\ttry {\n\t\t\tblackberry.bbm.platform.register({\n\t\t\t\tuuid: this.uuid\n\t\t\t});\n\t\t}\n\t\tcatch(e) {\n\t\t\tappbuilder.app.alert('uuid error');\n\t\t}\n\t},\n\t\n\taccessChanged: function(accessible, status) {\n\t\tappbuilder.app.debug('bbm', 'access', status);\n\t\tthis.access = status;\n\t\tif (status == \"unregistered\") {\n\t\t\t//this.register();\n\t\t}\n\t\telse if (status == \"allowed\") {\n\t\t\tthis.processCbs();\n\t\t}\n\t\t// Listen for other status...\n\t},\n\t\n\tprocessCbs: function() {\n\t\tvar cbs = this.cbs;\n\t\tthis.cbs = [];\n\t\tcbs.each(function(cb) {\n\t\t\tcb(this.canBBM);\n\t\t}, this);\n\t},\n\t\n\t/**\n\t * Use this to make calls to BBM, via a callback.\n\t * It could be called immeditaly, or it might not be called until the user\n\t * has registed the app with BBM\n\t * The callback takes an argument `canBBM`, only if its true should the cb procced\n\t */\n\tcall: function(cb) {\n\t\tthis.cbs.push(cb);\n\t\tif(this.canBBM) {\n\t\t\tthis.setup();\n\t\t}\n\t\telse {\n\t\t\tthis.processCbs();\n\t\t}\n\t},\n\t\n\t/**\n\t * Share the app\n\t */\n\tshareApp: function(cb, context) {\n\t\tappbuilder.app.debug('bbm', 'share');\n\t\tthis.call(function(canBBM) {\n\t\t\tif(canBBM) {\n\t\t\t\tblackberry.bbm.platform.users.inviteToDownload();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tappbuilder.app.alert(this.errorMsg, context);\n\t\t\t}\n\t\t\tcb();\n\t\t});\n\t}\n};\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\nappbuilder.app.Phone = new Class({\n\tImplements: [Options, Events],\n\n\toptions: {\n\t\trequest: {\n\t\t\turl: 'index.php',\n\t\t\tdata: {\n\t\t\t\toption: 'com_appbuilder',\n\t\t\t\tcontroller: 'appserver'\n\t\t\t},\n\t\t\tmethod: 'get',\n\t\t\tconcurrent : 10,\n\t\t\ttimeout: 15000,\n\t\t\ttimeoutUpdate: 5000\n\t\t},\n\t\tfullscreen: false,\n\t\tbackground: true,\n\t\tstatusbar: true,\n\t\tstorage: false,\n\t\tfiles: false,\n\t\tupdate: false,\n\t\tupdateSingle: false,\n\t\tbrowserHistory: false,\n\t\tsplash: false,\n\t\tstyle: 'auto',\n\t\thomeButton: false,\n\t\thorizontal: false,\n\t\tfixed: false,\n masking: (function() {\n var prefixes = ['maskRepeat', 'webkitMaskRepeat', 'mozMaskRepeat', 'oMaskRepeat', 'msMaskRepeat'],\n d = document.createElement('div');\n for (var i = 0; i < prefixes.length; i++) {\n if (d.style[prefixes[i]] !== undefined) {\n return prefixes[i];\n }\n }\n return false;\n })(),\n currentIOS7: true\n\t},\n\n\tinitialize: function(options) {\n\t\tappbuilder.app.debug('phone', 'init');\n\t\tthis.setOptions(options);\n\t\t\n\t\tthis.temporaryStorage = appbuilder.app.Storage;\n\t\tthis.temporaryStorage.phone = this;\n\t\tif(this.options.storage) {\n\t\t\t//if(appbuilder.app.PhoneGapStorage) {\n\t\t\t//\tthis.storage = appbuilder.app.PhoneGapStorage;\n\t\t\t//}\n\t\t\tif(appbuilder.app.LocalStorage) {\n\t\t\t\tthis.storage = appbuilder.app.LocalStorage;\n\t\t\t\tthis.storage.phone = this;\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.history = new appbuilder.app.History(this);\n\t\tthis.loader = new appbuilder.app.Loader(this);\n\t\tthis.navigator = new appbuilder.app.Navigator(this);\n\t\t\n\t\tappbuilder.app.Analytics.attach(this);\n\t\t\n\t\tif(!appbuilder.app.current) {\n\t\t\tappbuilder.app.current = this;\n\t\t}\n\n this.addEvent('app', function() {\n if (this.options.currentMasking && document.id(this).hasClass('ios7style')) {\n this.navigator.applyTabMask();\n }\n }.bind(this));\n\t},\n\n\ttoElement: function() {\n\t\tif(!this.element) {\n\t\t\tthis.element = appbuilder.app.makeElement('phone');\n\t\t\t\n\t\t\t//Platform specific classes\n\t\t\tif(appbuilder.app.isPhoneGap) {\n\t\t\t\tthis.element.addClass('phonegap');\n\t\t\t}\n\t\t\tif(Browser.Platform.ios) {\n\t\t\t\tthis.element.addClass('ios');\n if (Browser.Platform.version >= 7) {\n this.element.addClass('ios7');\n }\n //Fix for ios7 ipad landscape height bug\n if (Browser.Platform.ipadIos7 && this.options.fullscreen && !window.navigator.standalone) {\n document.id(document.body).addClass('ios7-ipad-fix');\n }\n\t\t\t}\n\t\t\t\t\n\t\t\tif(Browser.Platform.android) {\n\t\t\t\tthis.element.addClass('android-os');\n\t\t\t}\n\n\t\t\tif(Browser.Platform.blackberry) {\n\t\t\t\tthis.element.addClass('blackberry-os');\n\t\t\t\tif(Browser.Platform.playBook) {\n\t\t\t\t\tthis.element.addClass('blackberry-os-playbook');\n\t\t\t\t}\n\t\t\t\telse if(Browser.Platform.smartphone) {\n\t\t\t\t\tthis.element.addClass('blackberry-os-smartphone');\n\t\t\t\t}\n\t\t\t\telse if(Browser.Platform.BB10) {\n\t\t\t\t\tthis.element.addClass('blackberry-os-bb10');\n\t\t\t\t}\n\t\t\t\t//Always used fixed position on bb= 7) {\n\t\t\t\t\t\t\t\tif(window.innerHeight > window.innerWidth){\n\t\t\t\t\t\t\t\t\tthis.element.setStyle('height', window.getSize().y);\n\t\t\t\t\t\t\t\t\tthis.element.removeClass('auto-height');\n\t\t\t\t\t\t\t\t}\n else {\n\t\t\t\t\t\t\t\t\tthis.element.removeProperty('height');\n\t\t\t\t\t\t\t\t\tthis.element.addClass('auto-height');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n else {\n this.element.setStyle('height', window.getSize().y + 60);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this);\n\t\t\t\t\t\tthis.addEvent('resize', resize);\n\t\t\t\t\t\tresize();\n\t\t\t\t\t}\n\n\t\t\t\t\t//Stops the app from scrolling with touches\n\t\t\t\t\tvar resetPos = (function() {\n //Allow scrolling ios7 landscape\n if(!((Browser.Platform.ipodIos7 || Browser.Platform.iphoneIos7) && window.innerHeight < window.innerWidth && !window.navigator.standalone)) {\n window.scrollTo(0, 1);\n }\n });\n resetPos.delay(100);\n this.element.addEvent('touchstart', resetPos);\n\n this.element.addEvent('touchmove', function (e) {\n //Allow scrolling ios7 landscape\n if(!((Browser.Platform.ipodIos7 || Browser.Platform.iphoneIos7) && window.innerHeight < window.innerWidth && !window.navigator.standalone)) {\n e.preventDefault();\n }\n });\n\t\t\t\t}\n\t\t\t\t//relay to internal resize event\n\t\t\t\twindow.addEvent('resize', function(e) {\n\t\t\t\t\tthis.fireEvent('resize', [e]);\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif(this.options.background == 'half') {\n\t\t\t\t\tthis.element.addClass('background half');\n\t\t\t\t}\n\t\t\t\telse if(this.options.background === true || this.options.background == 'full') {\n\t\t\t\t\tthis.element.addClass('background full');\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tthis.setStyle(this.options.style, true);\n\t\t\tthis.setHorizontal(this.options.horizontal, true);\n\t\t\tthis.setRealSize(this.options.realSize, true);\n\t\t\t\n\t\t\tvar inner = appbuilder.app.makeElement('phone-inner').inject(this.element);\n\t\t\t\n\t\t\tthis.status = appbuilder.app.makeElement('status-bar', {\n\t\t\t\t'html':new Date().format('%H:%M')\n\t\t\t}).inject(inner);\n\t\t\t\n\t\t\t(function() {\n\t\t\t\tthis.status.set('html', new Date().format('%H:%M'));\n\t\t\t}).periodical(60000, this);\n\t\t\t\n\t\t\tif(this.options.statusbar) {\n\t\t\t\tthis.element.addClass('status');\n\t\t\t}\n\t\t\t\n\t\t\tdocument.id(this.loader).inject(inner);\n\t\t\t\n\t\t\tdocument.id(this.navigator).inject(inner);\n\t\t\t\n\t\t\tif(this.options.homeButton) {\n\t\t\t\tappbuilder.app.makeElement('home-button', {\n\t\t\t\t\t'data-linktype': 'app',\n\t\t\t\t\t'data-href': 1,\n\t\t\t\t\t'data-no-glow': 'no-glow'\n\t\t\t\t}).inject(this.element);\n\t\t\t}\n\t\t\t\n\t\t\t//Start the app\n\t\t\tif(!this.history.checkHistory() && this.options.app != undefined) {\n\t\t\t\tthis.navigator.linktypes.app.apply(this.navigator, [this.options.app, true, this.options.screen ? function() {\n\t\t\t\t\tthis.navigator.linktypes.screen.apply(this.navigator, [this.options.screen, false]);\n\t\t\t\t}.bind(this) : null]);\n\t\t\t}\n\t\t}\n\t\treturn this.element;\n\t},\n\t\n\tsetStyle: function(style, noresize) {\n\t\tappbuilder.app.debug('phone', 'style', style);\n\t\tvar styles = ['iphone', 'iphone5', 'iphone5s', 'ipad', 'ipadair', 'android', 'androidsm', 'blackberry', 'blackberry10', 'playbook', 'nexus7', 'auto', 'ios7style'],\n\t\t\tm, v;\n\t\tif(styles.indexOf(style) != -1) {\n\t\t\tthis.options.style = style;\n\t\t\tif(style == 'auto') {\n\t\t\t\tif(Browser.Platform.android) {\n\t\t\t\t\tif(Browser.version < 4) {\n\t\t\t\t\t\tstyle = 'androidsm';\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tstyle = 'android';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse if(Browser.Platform.blackberry) {\n\t\t\t\t\tif(Browser.Platform.playBook || Browser.Platform.BB10 || Browser.version >= 10) {\n\t\t\t\t\t\tstyle = 'blackberry10';\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tstyle = 'blackberry';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t//Default style on unknown platform\n if(Browser.version < 7) {\n style = 'iphone';\n }\n else {\n style = 'iphone5s'\n }\n\t\t\t\t}\n\t\t\t}\n if (!this.options.currentIOS7) {\n if (style == 'iphone5s') {\n style = 'iphone5';\n }\n if (style == 'ipadair') {\n style = 'ipad';\n }\n if (style == 'ios7style') {\n style = 'iphone';\n }\n }\n\t\t\tif(this.element) {\n\t\t\t\tstyles.each(function(style) {\n\t\t\t\t\tthis.element.removeClass(style);\n\t\t\t\t}, this);\n\t\t\t\tthis.element.addClass(style);\n\t\t\t\tif(style == 'nexus7') {\n\t\t\t\t\t//nexus7 style is based on android\n\t\t\t\t\tthis.element.addClass('android');\n\t\t\t\t}\n\t\t\t\telse if(style == 'playbook') {\n\t\t\t\t\t//playbook style is based on bb10\n\t\t\t\t\tthis.element.addClass('blackberry10');\n\t\t\t\t}\n else if(style == 'iphone5s') {\n //5s style is based on 5\n this.element.addClass('ios7style iphone5');\n }\n else if(style == 'ipadair') {\n //ipadair style is based on ipad\n this.element.addClass('ios7style ipad');\n }\n\t\t\t\tif(this.options.background) {\n\t\t\t\t\tif(this.options.background === 'half') {\n\t\t\t\t\t\tthis.element.addClass('half');\n\t\t\t\t\t}\n\t\t\t\t\tthis.element.addClass('background');\n\t\t\t\t}\n\n if (this.options.currentMasking && (style == 'ios7style' || style == 'iphone5s' || style == 'ipadair')) {\n this.navigator.applyTabMask();\n }\n else {\n this.navigator.removeTabMask();\n }\n\t\t\t\t!noresize && this.fireEvent('resize');\n\t\t\t}\n\t\t}\n\t},\n\t\n\tsetHorizontal: function(hor, noresize) {\n\t\tthis.options.horizontal = hor;\n\t\tif(this.element) {\n\t\t\tif(hor) {\n\t\t\t\tthis.element.addClass('horizontal');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.element.removeClass('horizontal');\n\t\t\t}\n\t\t\t!noresize && this.fireEvent('resize');\n\t\t}\n\t},\n\t\n\tsetRealSize: function(realSize, noresize) {\n\t\tthis.options.realSize = realSize;\n\t\tif(this.element) {\n\t\t\tif(realSize) {\n\t\t\t\tthis.element.addClass('realsize');\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.element.removeClass('realsize');\n\t\t\t}\n\t\t\t!noresize && this.fireEvent('resize');\n\t\t}\n\t},\n\t\n\tupdateApp: function(id, cb, appUrl) {\n\t\tif(this.options.update && this.storage && appbuilder.app.online()) {\n\t\t\tappbuilder.app.debug('phone', 'update', 'starting');\n\t\t\tthis.loader.showLoading();\n\t\t\tthis.temporaryStorage.clear();\n\t\t\tthis.getLastUpdate(id, function(update) {\n\t\t\t\tvar loaded = function(data) {\n\t\t\t\t\tif(data) {\n\t\t\t\t\t\tappbuilder.app.debug('phone', 'update', 'updating');\n\t\t\t\t\t\tObject.each(data, function(data, type) {\n\t\t\t\t\t\t\tif(type == 'time') {\n\t\t\t\t\t\t\t\tthis.setLastUpdate(id, data);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\tObject.each(data, function(obj, fetchId) {\n\t\t\t\t\t\t\t\t\tthis.loaded(obj);\n\t\t\t\t\t\t\t\t}, this);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, this);\n\t\t\t\t\t\tthis.storage.flush();\n\t\t\t\t\t\tthis.loader.hideLoading();\n\t\t\t\t\t\tcb(true);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tappbuilder.app.debug('phone', 'update', 'nothing');\n\t\t\t\t\t\tthis.loader.hideLoading();\n\t\t\t\t\t\tcb(false);\n\t\t\t\t\t}\n\t\t\t\t}.bind(this),\n\t\t\t\terror = function(msg) {\n\t\t\t\t\tappbuilder.app.debug('phone', 'update', 'error', msg);\n\t\t\t\t\tthis.loader.hideLoading();\n\t\t\t\t\tcb(false);\n\t\t\t\t}.bind(this);\n\t\t\t\tthis.loader.request('update', id, update, loaded, error, null, this.options.request.timeoutUpdate);\n\t\t\t}.bind(this));\n\t\t}\n\t\telse {\n\t\t\tappbuilder.app.debug('phone', 'update', 'disabled');\n\t\t\tcb(false);\n\t\t}\n\t},\n\t\n\tgetLastUpdate: function(id, cb) {\n\t\tif(this.storage) {\n\t\t\tthis.storage.fetch('update', id, function(update) {\n\t\t\t\tif(!update) {\n\t\t\t\t\tthis.storage.store('update', id, {\n\t\t\t\t\t\tupdate: this.options.published\n\t\t\t\t\t});\n\t\t\t\t\tcb(this.options.published);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcb(update.update);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t}\n\t\telse {\n\t\t\tcb(this.options.published);\n\t\t}\n\t},\n\t\n\tsetLastUpdate: function(id, time) {\n\t\tif(this.storage) {\n\t\t\tthis.storage.store('update', id, {\n\t\t\t\tupdate: time\n\t\t\t});\n\t\t}\n\t},\n\t\n\tgetUniqueId: function() {\n\t\tif(this.uniqueId) {\n\t\t\treturn this.uniqueId;\n\t\t}\n\t\tif(appbuilder.app.isPhoneGap) {\n\t\t\treturn device.uuid;\n\t\t}\n\t\tif(this.storage) {\n\t\t\tthis.uniqueId = this.storage.fetch('device', 'unique');\n\t\t\tif(this.uniqueId) {\n\t\t\t\treturn this.uniqueId;\n\t\t\t}\n\t\t}\n\t\tvar d = new Date();\n\t\tthis.uniqueId = (d++).toString(36) + (new Date().getMilliseconds().toString(36));\n\t\tif(this.storage) {\n\t\t\tthis.storage.store('device', 'unique', this.uniqueId);\n\t\t}\n\t\treturn this.uniqueId;\n\t},\n\t\n\tfetch: function(type, id, cb, fetchId, fetchUrl, direct) {\n\t\tcb = this.loadingcb(cb);\n\t\t\n\t\tvar obj = this.temporaryStorage.fetch(type, id);\n\t\tif(obj) {\n\t\t\tcb(obj);\n\t\t\treturn;\n\t\t}\n\t\tif(this.storage) {\n\t\t\tobj = this.storage.fetch(type, id);\n\t\t\tif(obj) {\n\t\t\t\tthis.updateSingle(type, id, obj, cb, fetchId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif(this.options.files && !fetchUrl) {\n\t\t\tappbuilder.app.FileLoader.fetch(type, id, function(obj) {\n\t\t\t\tif(obj) {\n\t\t\t\t\tthis.updateSingle(type, id, obj, cb, fetchId);\n\t\t\t\t}\n\t\t\t\telse if(appbuilder.app.online()) {\n\t\t\t\t\tthis.loader.fetch(type, id, cb, null, fetchId);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcb(false);\n\t\t\t\t}\n\t\t\t}.bind(this), fetchId, this);\n\t\t}\n\t\telse if(fetchUrl && appbuilder.app.online()) {\n\t\t\tthis.fetchLive(direct ? 'direct' : 'remote', fetchUrl, function(obj, fetchedObj) {\n\t\t\t\tif(fetchedObj && fetchedObj[type]) {\n\t\t\t\t\tcb(fetchedObj[type][id]);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcb(false);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t}\n\t\telse if(appbuilder.app.online()) {\n\t\t\tthis.loader.fetch(type, id, cb, null, fetchId);\n\t\t}\n\t\telse {\n\t\t\tcb(false);\n\t\t}\n\t},\n\t\n\tfetchLive: function(type, id, cb, postVars, alwaysLive) {\n\t\tif(!alwaysLive) {\n\t\t\tvar obj = this.temporaryStorage.fetch(type == 'direct' ? 'remote' : type, id);\n\t\t\tif(obj) {\n\t\t\t\tcb(obj);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(this.storage) {\n\t\t\t\tobj = this.storage.fetch(type == 'direct' ? 'remote' : type, id);\n\t\t\t\tif(obj) {\n\t\t\t\t\tcb(obj);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(appbuilder.app.online()) {\n\t\t\tthis.loader.fetch(type, id, function(obj, fetchedObj) {\n\t\t\t\tif(obj) {\n\t\t\t\t\tcb(obj, fetchedObj);\n\t\t\t\t}\n\t\t\t\telse if(!alwaysLive && this.options.files) {\n\t\t\t\t\tappbuilder.app.FileLoader.fetch(type == 'direct' ? 'remote' : type, id, cb, null, this);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tcb(false);\n\t\t\t\t}\n\t\t\t}.bind(this), false, false, postVars);\n\t\t\treturn;\n\t\t}\n\t\telse if(!alwaysLive && this.options.files) {\n\t\t\tappbuilder.app.FileLoader.fetch(type == 'direct' ? 'remote' : type, id, cb, null, this);\n\t\t}\n\t\telse {\n\t\t\tcb(false);\n\t\t}\n\t},\n\t\n\tloadingcb: function(cb) {\n\t\tthis.loader.showLoading();\n\t\treturn function() {\n\t\t\tthis.loader.hideLoading();\n\t\t\tcb.apply(this, arguments);\n\t\t}.bind(this);\n\t},\n\t\n\tupdateSingle: function(type, id, obj, cb, fetchId) {\n\t\tif(appbuilder.app.online() && obj.updated && this.options.updateSingle) {\n\t\t\tappbuilder.app.debug('phone', 'updateSingle', 'starting');\n\t\t\tthis.loader.fetch(type, id, function(updatedObj) {\n\t\t\t\tif(!updatedObj) {\n\t\t\t\t\tappbuilder.app.debug('phone', 'updateSingle', 'nothing');\n\t\t\t\t\tthis.temporaryStorage.store(type, id, obj);\n\t\t\t\t\tcb(obj);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tappbuilder.app.debug('phone', 'updateSingle', 'updated');\n\t\t\t\t\tcb(updatedObj);\n\t\t\t\t}\n\t\t\t}.bind(this), obj.updated, fetchId);\n\t\t}\n\t\telse {\n\t\t\tappbuilder.app.debug('phone', 'updateSingle', 'disabled');\n\t\t\tthis.temporaryStorage.store(type, id, obj);\n\t\t\tcb(obj);\n\t\t}\n\t},\n\t\n\t/**\n\t * @param {refreshes} bool If true then refresh the current app/screen\n\t * @param {bool} files If true then never store in long term storage\n\t */\n\tloaded: function(obj, refreshes, files) {\n\t\tthis.temporaryStorage.storeObj(obj);\n\t\tif(this.storage && !files) {\n\t\t\tthis.storage.storeObj(obj);\n\t\t}\n\t\tif(refreshes) {\n\t\t\tthis.flushStorage();\n\t\t\tif(obj.app && obj.app[this.history.currentApp]) {\n\t\t\t\tthis.history.refresh();\n\t\t\t}\n\t\t\telse if(obj.screen && obj.screen[this.history.currentScreen()]) {\n\t\t\t\tthis.history.refreshScreen();\n\t\t\t}\n\t\t}\n\t},\n\t\n\tflushStorage: function() {\n\t\tappbuilder.app.debug('phone', 'flush');\n\t\tthis.temporaryStorage.flush();\n\t\tif(this.storage) {\n\t\t\tthis.storage.flush();\n\t\t}\n\t},\n\t\n\tclearStorage: function() {\n\t\tappbuilder.app.debug('phone', 'clear');\n\t\tthis.temporaryStorage.clear();\n\t\tif(this.storage) {\n\t\t\tthis.storage.clear();\n\t\t}\n\t}\n}, 'Phone');\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\nappbuilder.app.Navigator = new Class({\n initialize: function(phone) {\n appbuilder.app.debug('navigator', 'initialize');\n this.phone = phone;\n this.afterSearch = false;\n this.appObj = false;\n this.searchword = null;\n this.jsAPI = new appbuilder.app.JSAPI(phone);\n },\n toElement: function() {\n if (!this.element) {\n this.element = appbuilder.app.makeElement('phone-navigator');\n SpinningWheel.container = this.element;\n appbuilder.app.link = function(type, id) {\n if (type === 'app') {\n this.linktypes.app.call(this, id, true, null, null, true);\n }\n else {\n this.linktypes[type].call(this, id);\n }\n }.bind(this);\n this.bind(this.phone.element);\n }\n return this.element;\n },\n bind: function(el) {\n appbuilder.app.debug('navigator', 'bind');\n el.addEvent((window.location.host === '' ? 'ontouchend' in document ? 'touchend' : 'click' : 'click') + ':relay([data-linktype])', this.click.bind(this));\n el.addEvent('click:relay(a[href])', this.linkCatcher.bind(this));\n },\n enabled: true,\n linkCatcher: function(e, t) {\n if (this.enabled !== true && Date.now() - this.enabled < 5000) {\n return;\n }\n t = document.id(t);\n if (!t.get('data-ignore')) {\n e.stop();\n appbuilder.app.debug('navigator', 'linkCatcher');\n this.linktypes.web.apply(this, [t.get('href'), true]);\n }\n },\n click: function(e, t) {\n if (this.enabled !== true && Date.now() - this.enabled < 5000) {\n return;\n }\n if (e) {\n e.stop();\n }\n\n this.enabled = Date.now();\n var linktype = t.get('data-linktype');\n var animate = true;\n\n if (t.hasClass('tab')) {\n this.element.getElements('.tab.selected').removeClass('selected');\n t.addClass('selected');\n if (this.tabBar) {\n this.tabBar.removeClass('bbShow');\n }\n\n animate = false;\n this.phone.history.clearHistory();\n this.phone.fireEvent('tab', [t.get('id').substr(3), t]);\n }\n else if (t.hasClass('back')) {\n if (this.tabBar) {\n this.tabBar.removeClass('bbShow');\n }\n t.addClass('glow-back');\n }\n else {\n var items = t.getParent('.items');\n if (items) {\n var scroll = items.retrieve('scroll');\n if (scroll) {\n if (scroll.isScrolling()) {\n return;\n }\n }\n }\n if (linktype == 'refresh') {\n t.addClass('glow-refresh');\n }\n else if (!t.get('data-no-glow')) {\n appbuilder.app.makeElement('glow').inject(t);\n }\n }\n var highlight = t.get('data-highlight');\n if (highlight) {\n this.afterSearch = true;\n this.searchword = highlight;\n }\n //Delay so the glow becomes visable\n if (this.linktypes[linktype]) {\n appbuilder.app.debug('navigator', 'click', 'delay', '#' + t.get('id') + ' ' + t.get('class'));\n\n var callEventHandler = function() {\n appbuilder.app.debug('navigator', 'click', linktype);\n this.linktypes[linktype].apply(this, [t, animate]);\n }.bind(this);\n\n if (linktype === 'web' || linktype === 'sound') {\n callEventHandler();\n } else {\n callEventHandler.delay(1);\n }\n }\n else {\n appbuilder.app.debug('navigator', 'click', 'unknown', linktype, '#' + t.get('id') + ' ' + t.get('class'));\n }\n },\n postLink: function() {\n appbuilder.app.debug('navigator', 'postLink');\n this.element.getElements('.glow').destroy();\n this.element.getElements('.glow-back').removeClass('glow-back');\n this.element.getElements('.glow-refresh').removeClass('glow-refresh');\n this.enabled = true;\n this.phone.flushStorage();\n },\n linktypes: {\n app: function(t, animate, after, appUrl, force) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'app', href);\n if (href == '1') {\n // when editinng where is disabled home button\n if (!force && document.id('disable-home-button')) {\n return;\n }\n }\n appbuilder.app.sound.stopAll();\n this.phone.history.currentApp = href;\n this.phone.history.currentAppUrl = appUrl;\n this.phone.history.clearHistory(true);\n this.phone.updateApp(href, function() {\n this.phone.fetch('app', href, function(html) {\n this.showApp(html, animate, after, href, false);\n }.bind(this), null, appUrl);\n }.bind(this), appUrl);\n },\n tab: function(t) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'tab', href);\n var tab = this.app.getElement('#tab' + href);\n if (tab) {\n this.enabled = true;\n this.click(null, tab);\n }\n else {\n this.postLink();\n }\n this.phone.history.currentTabId = href;\n\n },\n login: function(t, animate, back, historyChange, fetchId, fetchUrl) {\n var href, element;\n if (typeOf(t) == 'element') {\n href = t.get('data-href');\n element = t;\n }\n else {\n href = t;\n }\n appbuilder.app.debug('navigator', 'link', 'login', href);\n this.checkVariables(href, function(href) {\n var next = window.localStorage['loginto'];\n var error = function(msg) {\n this.enabled = true;\n this.postLink();\n appbuilder.app.makeConfirm(msg, null, null, null, false).inject(document.id(this));\n }.bind(this);\n new Request.JSON({\n url: href,\n data: {\n appid: this.phone.history.currentApp,\n screenid: next\n },\n method: this.phone.options.request.method,\n noCache: true,\n timeout: this.phone.options.request.timeout,\n onSuccess: function(data) {\n if (data.ok) {\n window.localStorage['login-' + next] = (new Date().getTime() / 1000) + data.session_time;\n this.phone.fetch('screen', next, function(html) {\n this.showScreen(html, next, animate, back, historyChange, null, element);\n }.bind(this));\n }\n else {\n error(data.error);\n }\n this.postLink();\n }.bind(this),\n onFailure: function() {\n error('Connection Failure');\n },\n onTimeout: function() {\n error('Timeout');\n }\n }).send();\n }.bind(this), true);\n },\n register: function() {\n this.linktypes.login.apply(this, arguments);\n },\n screen: function(t, animate, back, historyChange, fetchId, fetchUrl, direct) {\n animate = animate || animate == undefined || false;\n var href, element;\n if (typeOf(t) == 'element') {\n href = t.get('data-href');\n element = t.get('data-element');\n if (!fetchUrl) {\n var screen = t.getParent('.screen');\n if (screen) {\n fetchUrl = screen.get('data-fetch-url');\n }\n }\n }\n else {\n href = t;\n }\n appbuilder.app.debug('navigator', 'link', 'screen', href);\n this.phone.fetch('screen', href, function(html) {\n this.showScreen(html, href, animate, back, historyChange, null, element);\n }.bind(this), fetchId, fetchUrl, direct);\n this.phone.history.currentScreenId = href;\n\n },\n back: function(t) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'back', href);\n this.phone.history.popHistory(null, href);\n },\n web: function(t, typeX) {\n var type = typeOf(t) == 'element' ? t.get('data-weblinktype') : typeX;\n if (this.weblinks.blackberry.apply(this, arguments)) {\n //ok\n }\n else if (type == 'external') {\n if (window.navigator.standalone && !(typeOf(t) == 'element' ? t.get('data-href') : t).test(/^mailto/)) {\n this.weblinks.confirm.apply(this, arguments);\n }\n else {\n this.weblinks.external.apply(this, arguments);\n }\n }\n else if (type == 'iframe') {\n this.weblinks.iframe.apply(this, arguments);\n }\n else if (type == 'confirm') {\n this.weblinks.confirm.apply(this, arguments);\n }\n else {\n if (appbuilder.app.isPhoneGap) {\n this.weblinks.inappbrowser.apply(this, arguments)\n }\n else if (window.navigator.standalone) {\n this.weblinks.confirm.apply(this, arguments);\n }\n else if (this.phone.options.fullscreen) {\n this.weblinks.external.apply(this, arguments);\n }\n else {\n this.weblinks.iframe.apply(this, arguments);\n }\n }\n },\n file: function(t, animate, back, historyChange) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'file', href);\n var slash = href.lastIndexOf('/');\n if (slash >= 0)\n slash++;\n else\n slash = 0;\n var dot = href.lastIndexOf('.'),\n filename = typeOf(t) == 'element' ? t.get('data-filename') : href.substring(slash, dot),\n type = dot >= 0 ? href.substr(dot + 1).toUpperCase() : '';\n\n if (href.indexOf('http') !== 0) {\n var strPath = String(window.location);\n var path = strPath.substr(0, strPath.lastIndexOf(\"/\"));\n href = path + '/' + href;\n }\n if (type == 'PDF' && appbuilder.app.isPhoneGap) {\n this.weblinks.inappbrowser.apply(this, [href]);\n }\n else if (type == 'PDF' && (window.navigator.standalone || appbuilder.app.isPhoneGap)) {\n this.weblinks.confirm.apply(this, [href])\n }\n else {\n this.showScreen(appbuilder.app.createScreen('screen' + href, 'file', filename, '', true, false, null, null, 'file', true), href, animate, back, historyChange, function(screen) {\n var items = screen.getElement('.items .items-inner');\n if (type == 'PDF' && (this.pdfobject = new PDFObject({\n url: href,\n pdfOpenParams: {\n toolbar: 0,\n statusbar: 0,\n messages: 0,\n navpanes: 0,\n view: \"FitV\"\n }\n }).embed(items))) {\n }\n else if (type == 'PDF') {\n this.phone.history.popHistory();\n if (!window.open(href, '_blank')) {\n window.location = href;\n }\n }\n else {\n items.set('html', '
    ' + filename + '
    ' +\n 'Download'\n );\n }\n\n if (type == 'MP4' || type == 'MOV' || type == 'AVI' || type == 'M4V') {\n items.set('html', items.get('html') + '');\n } else if (type == 'MP3') {\n items.set('html', items.get('html') + '');\n }\n }.bind(this));\n }\n },\n sound: function(t) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'sound', href);\n var dot = href.lastIndexOf('.'),\n type = dot >= 0 ? href.substr(dot + 1).toUpperCase() : '';\n if (appbuilder.app.sound.support && appbuilder.app.sound.support[type.toLowerCase()]) {\n appbuilder.app.sound.play(href);\n this.postLink();\n }\n },\n youtube: function(t, animate, back, historyChange) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'youtube', href);\n\n if (this.weblinks.blackberry.apply(this, arguments)) {\n //if this is blackberry device\n } else if (Browser.Platform.android) {\n appbuilder.app.makeConfirm('Video will open as external link', href, null, 'OK').inject(document.id(this));\n this.postLink();\n }\n else {\n var m = href.match(/^(?:https?:\\/\\/(?:www\\.)?youtu\\.be\\/|https?:\\/\\/(?:www\\.)?youtube\\.com\\/watch\\?.*?v=|https?:\\/\\/(?:www\\.)?youtube\\.com\\/v\\/)(.+?)(?:&|\\?|$)/i);\n if (m && m[1]) {\n this.weblinks.iframe.apply(this, ['http://youtube.com/embed/' + m[1], animate, back, historyChange, 'youtube', href, this.findTitle(t, 'Youtube')]);\n //var content = '';\n //this.showScreen(appbuilder.app.createScreen('screenyoutube' + m[1], 'youtube', this.findTitle(t, 'Youtube'), content, true, false), 'youtube' + m[1], false, back, historyChange);\n }\n }\n },\n vimeo: function(t, animate, back, historyChange) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'vimeo', href);\n var m = href.match(/^https?:\\/\\/(?:www\\.)?vimeo\\.com\\/(?:couchmode\\/)?(?:channels\\/.+?(?:\\/|#))?(?:.+?\\/)?(.+?)(?:&|\\?|$)/i);\n\n if (m && m[1]) {\n\n var url = 'http://player.vimeo.com/video/' + m[1] + '?title=0&byline=0&portrait=0';\n if (this.weblinks.blackberry.apply(this, arguments)) {\n //ok\n } else {\n this.weblinks.iframe.apply(this, [url, animate, back, historyChange, 'vimeo', href, this.findTitle(t, 'Vimeo')]);\n }\n }\n },\n twitter: function(t, animate, back, historyChange) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t,\n screenname = href.replace('@', '');\n appbuilder.app.debug('navigator', 'link', 'twitter', href);\n appbuilder.app.loadScript('http://platform.twitter.com/widgets.js', function() {\n this.showScreen(appbuilder.app.createScreen('screen' + href, 'twitter', /*'@' + href*/' ', '', true, false, null, null, 'list twitter'), href, animate, back, historyChange, function(screen) {\n var items = screen.getElement('.items'),\n size = screen.getElement('.items').getSize();\n twttr.widgets.createTimeline('344845112704135168', items, function() {\n }, {\n width: size.x,\n height: size.y,\n screenName: screenname\n });\n });\n }.bind(this), function() {\n appbuilder.app.alert('Twitter is currently unavailable', this);\n this.postLink();\n }.bind(this));\n },\n facebook: function(t, animate, back, historyChange) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'facebook', href);\n\n var face = 'http://www.facebook.com/plugins/likebox.php?href=' + encodeURIComponent(href) + '&width=100%&height=100%&colorscheme=light&show_faces=true&border_color=black&stream=true&header=false';//&appId=156047001092869';\n if (this.weblinks.blackberry.apply(face)) {\n //ok\n } else {\n this.showScreen(appbuilder.app.createScreen('screen' + href, 'facebook', /*href.substring(href.lastIndexOf('/') + 1)*/' ', '', true, false, null, null, 'list facebook'), href, animate, back, historyChange, function(screen) {\n var i = screen.getElement('.items'), size = i.getSize(), width = size.x, height = size.y;\n var face = 'http://www.facebook.com/plugins/likebox.php?href=' + encodeURIComponent(href) + '&width=' + width + '&height=' + height + '&colorscheme=light&show_faces=true&border_color=black&stream=true&header=false';//&appId=156047001092869';\n //var content = '';\n var content = '';\n i.set('html', content);\n });\n }\n },\n remote: function(t, animate, back, historyChange) {\n var href, direct;\n if (typeOf(t) == 'element') {\n href = t.get('data-href');\n direct = !!t.get('data-direct');\n }\n else {\n href = t;\n }\n appbuilder.app.debug('navigator', 'link', 'remote', href);\n this.phone.loader.showLoading();\n this.checkVariables(href, function(href, postVars) {\n this.phone.fetchLive(direct ? 'direct' : 'remote', href, function(screenId, fetchObj) {\n this.phone.loader.hideLoading();\n if (screenId && fetchObj) {\n if (fetchObj.settings.maintype == 'app') {\n this.phone.history.clearHistory();\n this.phone.history.currentApp = screenId;\n this.phone.history.currentAppUrl = href;\n this.showApp(fetchObj.app[screenId], animate, null, screenId, true);\n }\n else {\n this.showScreen(fetchObj.screen[screenId], screenId, animate, back, historyChange);\n }\n }\n else if (screenId) {\n this.phone.fetch('screen', screenId, function(obj) {\n if (obj) {\n this.showScreen(obj, screenId, animate, back, historyChange);\n }\n else {\n appbuilder.app.alert('This screen is currently unavailable', this);\n this.postLink();\n }\n }.bind(this), screenId);\n }\n else {\n this.postLink();\n }\n }.bind(this), postVars);\n }.bind(this), true);\n },\n refresh: function(t) {\n var screen;\n if (typeOf(t) == 'element' && (screen = t.getParent('.screen'))) {\n var fetchUrl = screen.get('data-fetch-url'),\n id = screen.get('id').replace('screen', '');\n this.phone.loader.showLoading();\n this.phone.fetchLive('remote', fetchUrl, function(mainScreenId, fetchObj) {\n this.phone.loader.hideLoading();\n if (fetchObj && fetchObj.screen[id]) {\n this.showScreen(fetchObj.screen[id], id, false, false, true);\n }\n else {\n appbuilder.app.makeConfirm('This screen is currently unavailable', null, null, null, false).inject(document.id(this));\n this.postLink();\n }\n }.bind(this), null, true);\n return;\n }\n this.postLink();\n },\n jscode: function(t) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'link', 'jscode', href);\n if (this.screenObj && this.screenObj.javascripts[href]) {\n var code = this.screenObj.javascripts[href];\n if (code) {\n try {\n new Function('app', code).call(t, this.jsAPI);\n }\n catch (e) {\n appbuilder.app.debug('navigator', 'Error with custom js action', e);\n }\n }\n }\n this.postLink();\n },\n bbm: function() {\n appbuilder.app.debug('navigator', 'link', 'bbm');\n appbuilder.app.BBM.shareApp(this.postLink.bind(this), this);\n }\n },\n weblinks: {\n iframe: function(t, animate, back, historyChange, type, typeurl, title) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'web', 'iframe', href);\n this.checkVariables(href, function(href) {\n var content = '';\n this.showScreen(appbuilder.app.createScreen('screen' + (typeurl || href), type || 'web', title || this.findTitle(t, 'Website'), content, true, false), typeurl || href, animate, back, historyChange);\n }.bind(this));\n },\n blackberry: function(t) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n\n if (window.blackberry && window.blackberry.invoke && Browser.Platform.blackberry && (Browser.version < 7.2)) {\n this.checkVariables(href, function(href) {\n blackberry.invoke.invoke(\n blackberry.invoke.APP_BROWSER,\n new blackberry.invoke.BrowserArguments(href)\n );\n this.postLink();\n }.bind(this));\n return true;\n }\n else {\n return false;\n }\n\n\n },\n external: function(t) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'web', 'external', href);\n this.checkVariables(href, function(href) {\n this.postLink();\n if (href.test(/^mailto/)) {\n href = href.replace(/\\+/g, '%20');\n }\n if (appbuilder.app.isPhoneGap) {\n window.open(href, '_system');\n }\n else {\n if (href.test(/^mailto/)) {\n window.location = href;\n }\n else {\n\n var a = document.createElement('a');\n a.setAttribute(\"href\", href);\n a.setAttribute(\"target\", \"_blank\");\n\n var dispatch = document.createEvent(\"HTMLEvents\");\n dispatch.initEvent(\"click\", true, true);\n a.dispatchEvent(dispatch);\n\n ///window.open(href, '_blank');\n }\n }\n }.bind(this));\n },\n inappbrowser: function(t) {\n var href = typeOf(t) == 'element' ? t.get('data-href') : t;\n appbuilder.app.debug('navigator', 'web', 'inappbrowser', href);\n if (Browser.Platform.android) {\n if (window.AndroidPdfPlugin) {\n if (href.lastIndexOf('.pdf') > 0) {\n if (href.indexOf('http://') === 0 || href.indexOf('https://') === 0) {\n AndroidPdfPlugin.openOnlinePDF(href);\n } else {\n AndroidPdfPlugin.openPDF(href);\n }\n return;\n }\n } else {\n console.log('need install AndroidPdfPlugin to show pdf files on android platform');\n }\n }\n\n this.checkVariables(href, function(href) {\n this.postLink();\n window.open(href, '_blank');\n }.bind(this));\n },\n confirm: function(t) {\n var href, mess, okbtn;\n appbuilder.app.debug('navigator', 'web', 'confirm');\n if (typeOf(t) == 'element') {\n href = t.get('data-href');\n mess = t.get('data-confirm-message') || 'This link will open in ' + (Browser.Platform.ios ? 'Safari' : 'your Browser');\n okbtn = t.get('data-okbtn') || 'OK';\n }\n else if (typeOf(t) == 'object') {\n href = t.href;\n mess = t.message || 'This link will open in ' + (Browser.Platform.ios ? 'Safari' : 'your Browser');\n okbtn = t.okbtn || 'OK';\n }\n else {\n href = t;\n mess = 'This link will open in ' + (Browser.Platform.ios ? 'Safari' : 'your Browser');\n }\n this.checkVariables(href, function(href) {\n appbuilder.app.makeConfirm(mess, href, null, okbtn).inject(document.id(this));\n this.postLink();\n }.bind(this));\n }\n },\n getTitle: function(el, defaultTitle) {\n var title;\n if (typeOf(el) == 'element') {\n var tEl = el.getElement('.title');\n if (tEl) {\n title = tEl.get('text');\n }\n else {\n title = el.get('text');\n }\n }\n return title || defaultTitle || 'Website';\n },\n showApp: function(html, animate, after, id, remote) {\n if (html) {\n appbuilder.app.debug('navigator', 'showApp', html);\n if (html.html) {\n this.appObj = html;\n }\n\n var thisEl = document.id(this);\n var s = thisEl.getElement('.screen');\n if (s) {\n s.fireEvent('destroy');\n }\n if (this.app) {\n this.app.fireEvent('destroy');\n }\n var t = this;\n var showapphtml = function() {\n thisEl.set('html', t.fixIEStyles((html.html || html), 'app'));\n this.app = document.id(this).getElement('.app');\n if (this.app) {\n if (this.app.get('data-disable-masking')) {\n document.id(this.phone).removeClass('masking');\n this.phone.options.currentMasking = false;\n }\n else if (this.phone.options.masking) {\n document.id(this.phone).addClass('masking');\n this.phone.options.currentMasking = true;\n }\n\n //Auto upgrade/downgrade\n this.phone.options.currentIOS7 = !this.app.get('data-disable-ios7');\n if (this.phone.options.currentIOS7) {\n if (this.phone.options.style == 'iphone5') {\n this.phone.setStyle('iphone5s');\n } else if (this.phone.options.style == 'ipad') {\n this.phone.setStyle('ipadair');\n }\n }\n else {\n if (this.phone.options.style == 'iphone5s') {\n this.phone.setStyle('iphone5');\n } else if (this.phone.options.style == 'ipadair') {\n this.phone.setStyle('ipad');\n }\n }\n\n this.phone.history.currentAppUrl = this.app.get('data-fetch-url');\n if (this.phone.options.app != 1 && id != this.phone.options.app) {\n appbuilder.app.makeElement('close-btn', {\n 'data-linktype': 'app',\n 'data-href': this.phone.options.app\n }).inject(this.app);\n }\n var appNavigatorInner = this.app.getElement('.app-navigator-inner'),\n sides = appNavigatorInner.getElements('.app-navigator-inner-sides'),\n innerA = sides[0],\n innerB = sides[1],\n back = false,\n running = false,\n chain = [],\n swapAB = function() {\n innerB.addClass('a');\n innerB.removeClass('b');\n\n innerA.addClass('b');\n innerA.removeClass('a');\n\n var tmp = innerB;\n innerB = innerA;\n innerA = tmp;\n }.bind(this),\n morpher = new Fx.Morph(appNavigatorInner, {\n unit: '%',\n onComplete: function() {\n if (!back) {\n swapAB();\n appNavigatorInner.setStyle('left', 0);\n }\n var s = innerB.getElement('.screen');\n if (s) {\n s.fireEvent('destroy');\n }\n innerB.set('html', '');\n appNavigatorInner.removeClass('ani');\n running = false;\n this.postLink();\n var n = chain.shift();\n if (n) {\n n();\n }\n }.bind(this)\n }),\n changeScreens = function() {\n if (back) {\n appNavigatorInner.setStyle('left', '-100%');\n swapAB();\n morpher.start({\n left: ['-100', 0]\n });\n }\n else {\n morpher.start({\n left: [0, '-100']\n });\n }\n };\n this.showScreenHTML = function(html, animate, backParam, setup) {\n if (running !== false && Date.now() - running < 5000) {\n chain.push(function() {\n this.showScreenHTML(html, backParam, animate, backParam, setup);\n }.bind(this));\n return;\n }\n running = Date.now();\n\n if (animate) {\n appNavigatorInner.addClass('ani');\n innerB.set('html', t.fixIEStyles((html.html || html), 'b'));\n if (setup) {\n setup(innerB);\n }\n back = backParam;\n changeScreens();\n }\n else {\n var s = innerA.getElement('.screen');\n if (s) {\n s.fireEvent('destroy');\n }\n innerA.set('html', t.fixIEStyles((html.html || html), 'a'));\n if (setup) {\n setup(innerA);\n }\n running = false;\n this.postLink();\n }\n };\n\n innerA.addClass('a');\n innerB.addClass('b');\n\n if (after) {\n after();\n this.postLink();\n }\n else {\n this.enabled = true;\n this.click(null, this.app.getElement('.tab'));\n this.postLink();\n }\n\n this.checkAds.delay(500, this);\n\n this.tabBar = this.app.getElement('.tab-bar');\n if (this.tabBar) {\n this.app.addEvent('click:relay(.screen .header)', function(e) {\n this.tabBar.toggleClass('bbShow');\n }.bind(this));\n }\n\n if (html.javascript) {\n try {\n new Function('app', html.javascript).call(this.app, this.jsAPI);\n }\n catch (e) {\n appbuilder.app.debug('navigator', 'Error with custom app js', e);\n }\n }\n this.phone.fireEvent('app', [id, this.app, remote]);\n }\n else {\n this.app = false;\n }\n }.bind(this)\n\n if (animate && this.phone.options.splash && html.splashhtml) {\n thisEl.set('html', this.fixIEStyles(html.splashhtml, 'app'));\n thisEl.getElement('.splash').addEvent('click', function() {\n clearTimeout(delay);\n showapphtml();\n });\n var delay = showapphtml.delay(3000);\n }\n else {\n showapphtml();\n }\n }\n else {\n appbuilder.app.debug('navigator', 'showApp', 'no');\n appbuilder.app.alert('This app is currently unavailable', this);\n this.postLink();\n }\n },\n showScreen: function(html, id, animate, back, historyChange, inserted, element) {\n if (html.secured && this.appObj && (id != this.appObj.secure.login && id != this.appObj.secure.register)) {\n if (window.localStorage['login-' + id]) {\n var timeDiff = parseInt(window.localStorage['login-' + id]) - parseInt(new Date().getTime() / 1000);\n if (timeDiff < 0) {\n this.phone.fetch('screen', this.appObj.secure.login, function(html) {\n window.localStorage['loginto'] = id;\n this.showScreen(html, this.appObj.secure.login, animate, back, historyChange, null, element);\n }.bind(this));\n return;\n }\n }\n else {\n if (this.appObj.secure.login) {\n this.phone.fetch('screen', this.appObj.secure.login, function(html) {\n window.localStorage['loginto'] = id;\n this.showScreen(html, this.appObj.secure.login, animate, back, historyChange, null, element);\n }.bind(this));\n return;\n }\n }\n }\n else {\n this.appObj.loginLink = false;\n }\n\n if (html && this.app) {\n appbuilder.app.debug('navigator', 'showScreen', html);\n this.showScreenHTML(html, animate, back, function(el) {\n if (html.html) {\n this.screenObj = html;\n }\n if (this.afterSearch) {\n this.highlightSearchWords(el);\n }\n var screen = this.screen = el.getElement('.screen');\n if (screen) {\n var showTabs = screen.get('data-tabs');\n this.app.removeClass('hide-tabs');\n this.app.removeClass('float-tabs');\n if (showTabs == 'hide') {\n this.app.addClass('hide-tabs');\n }\n else if (showTabs == 'float') {\n this.app.addClass('float-tabs');\n }\n\n var statusType = screen.get('data-status');\n var phoneEl = document.id(this.phone);\n if (statusType == 'float') {\n phoneEl.addClass('float-status');\n phoneEl.removeClass('status-black');\n }\n else {\n phoneEl.removeClass('float-status');\n if (statusType == 'black') {\n phoneEl.addClass('status-black');\n }\n else {\n phoneEl.removeClass('status-black');\n }\n }\n\n var selectedTab = screen.get('data-tab');\n if (selectedTab) {\n var newTab = this.app.getElement('#tab' + selectedTab);\n if (newTab) {\n this.app.getElements('.tab.selected').removeClass('selected');\n newTab.addClass('selected');\n this.phone.fireEvent('tab', [selectedTab, newTab]);\n }\n }\n\n var headerEl = screen.getElement('.header');\n var backEl = screen.getElement('.back[data-linktype=back]');\n var titleEl = screen.getElement('.header .title');\n var titleSpan = screen.getElement('.header .title span');\n var titleText = titleSpan ? titleSpan.get('text') : '';\n var backWidth = 0;\n if (backEl) {\n var href = backEl.get('data-href');\n if (href && !historyChange) {\n this.phone.history.amendHistory({\n screen: href,\n app: this.phone.history.currentApp\n });\n }\n\n if (!this.phone.history.hasHistory(historyChange) && !href) {\n backEl.destroy();\n backEl = false;\n }\n else {\n headerEl.addClass('has-back');\n\n var t = backEl.get('text');\n backEl.set('text', '');\n appbuilder.app.makeElement('back-left', {\n 'html': ''\n + ''\n + ''\n + ''\n }).inject(backEl);\n\n var backCenter = appbuilder.app.makeElement('back-center', {\n text: t\n }).inject(backEl);\n\n var backRight = appbuilder.app.makeElement('back-right').inject(backEl);\n if (Browser.Platform.android) {\n backCenter.addClass('android');\n backRight.addClass('android');\n }\n else {\n backEl.addClass('iphone');\n }\n backWidth = backEl.getSize().x;\n }\n }\n\n if (titleSpan) {\n var resizeTitle = function() {\n var titleWidth = titleSpan.getDimensions().x;\n var headerWidth = headerEl.getDimensions().x;\n if (titleWidth + (backWidth * 2) <= headerWidth) {\n titleEl.removeClass('left');\n }\n else {\n titleEl.addClass('left');\n }\n }\n resizeTitle();\n this.phone.addEvent('resize', resizeTitle);\n screen.addEvent('destroy', function() {\n this.phone.removeEvent('resize', resizeTitle);\n }.bind(this));\n }\n\n if (!historyChange) {\n var type = screen.get('data-type');\n if (type) {\n this.phone.history.pushHistory({\n screen: id,\n linktype: type,\n app: this.phone.history.currentApp,\n appUrl: this.phone.history.currentAppUrl,\n title: titleText,\n fetchId: screen.get('data-fetch-id'),\n fetchUrl: screen.get('data-fetch-url'),\n direct: !!screen.get('data-fetch-direct')\n });\n }\n else {\n this.phone.history.pushHistory({\n screen: id,\n app: this.phone.history.currentApp,\n appUrl: this.phone.history.currentAppUrl,\n title: titleText,\n fetchId: screen.get('data-fetch-id'),\n fetchUrl: screen.get('data-fetch-url'),\n direct: !!screen.get('data-fetch-direct')\n });\n }\n }\n\n //Run screen setup function, setups for individual types\n Object.each(appbuilder.app.Navigator.screenSetups, function(func, name) {\n if (screen.hasClass(name)) {\n func.apply(this, [screen, html]);\n }\n }, this);\n\n //setup scrolling\n if (!this.phone.options.fixed) {\n var items = screen.getElement('.items');\n if (items && items.hasClass('scrolling')) {\n var scroll = items.retrieve('scroll');\n if (!scroll) {\n if (screen.hasClass('gallery')) {\n scroll = new appbuilder.app.scroll.gallery(items);\n }\n else if (screen.hasClass('appsscreen')) {\n scroll = new appbuilder.app.scroll.appsscreen(items);\n }\n else {\n scroll = new appbuilder.app.scroll.iphone(items);\n }\n items.store('scroll', scroll);\n }\n\n //wait until we are definitely in the screen\n (function() {\n scroll.refresh();\n }).delay(0);\n\n if (element) {\n var e = screen.getElement(element);\n if (e) {\n scroll.scrollToElement(e, 0);\n }\n }\n\n screen.getElements('img').addEvent('load', function() {\n scroll.refresh();\n });\n\n var resizeE = function() {\n scroll.refresh();\n };\n this.phone.addEvent('resize', resizeE);\n screen.addEvent('destroy', function() {\n this.phone.removeEvent('resize', resizeE);\n }.bind(this));\n\n if ((Browser.Platform.ipodIos7 || Browser.Platform.iphoneIos7) && !window.navigator.standalone) {\n var screenorientationchange = function() {\n if (window.orientation == 0) {\n scroll.enable()\n scroll.refresh();\n } else {\n scroll.disable();\n }\n }\n window.addEventListener(\"orientationchange\", screenorientationchange, false);\n screenorientationchange();\n screen.addEvent('destroy', function() {\n window.removeEvent('resize', screenorientationchange);\n }.bind(this));\n }\n\n }\n }\n\n if (inserted) {\n inserted(screen);\n }\n\n this.phone.fireEvent('screen', [id, screen, !!screen.get('data-fetch-url')]);\n }\n }.bind(this));\n }\n else {\n appbuilder.app.debug('navigator', 'showScreen', 'no');\n appbuilder.app.alert('This screen is currently unavailable', this);\n this.postLink();\n }\n },\n /**\n * Finds a title from an element\n * Used to make titles for youtube/vimeo/web pages\n **/\n findTitle: function(el, defaultTitle) {\n var title;\n if (typeOf(el) == 'element') {\n var tEl = el.getElement('.title');\n if (tEl) {\n title = tEl.get('text');\n }\n else {\n title = el.get('text');\n }\n }\n return title || defaultTitle || 'Website';\n },\n loadVar: function(varName) {\n var obj = this.phone.temporaryStorage.fetch('inputs', varName);\n if (!obj && this.phone.storage) {\n obj = this.phone.storage.fetch('inputs', varName);\n }\n appbuilder.app.debug('navigator', 'loadVar', varName, obj);\n return obj;\n },\n saveVar: function(varName, value, method) {\n var obj = {\n name: varName,\n value: value,\n method: method || 'get'\n };\n appbuilder.app.debug('navigator', 'saveVar', varName, obj);\n this.phone.temporaryStorage.store('inputs', varName, obj);\n if (this.phone.storage) {\n this.phone.storage.store('inputs', varName, obj);\n }\n this.phone.fireEvent('varChange', [varName, value]);\n },\n checkVariables: function(href, cb, post) {\n appbuilder.app.decoy();\n var match, pattern = /\\{([\\w\\._]+?)\\}/g,\n count = 1,\n postVars = [],\n after = function() {\n if (--count == 0) {\n cb(href2, postVars);\n }\n },\n href2 = href;\n while ((match = pattern.exec(href)) != null) {\n count++;\n (function(match) {\n if (match[1] == 'device.longitude') {\n match[1] = 'device.location.longitude';\n }\n\n if (match[1] == 'device.latitude') {\n match[1] = 'device.location.latitude';\n }\n\n if (match[1] == 'device.accuracy') {\n match[1] = 'device.location.accuracy';\n }\n\n if (match[1] == 'device.udid') {\n href2 = href2.replace(match[0], encodeURIComponent(this.phone.getUniqueId()));\n after();\n }\n else if (match[1].indexOf('device.location') === 0) {\n var key = match[1].replace('device.location.', '');\n appbuilder.map.getPosition(function(p) {\n if (p && p.coords[key]) {\n href2 = href2.replace(match[0], encodeURIComponent(p.coords[key]));\n }\n else {\n href2 = href2.replace(match[0], '');\n }\n after();\n });\n }\n else {\n var inp = this.loadVar(match[1]);\n if (inp) {\n if (inp.method == 'post') {\n if (post) {\n postVars.push(inp);\n }\n href2 = href2.replace(match[0], '');\n }\n else {\n href2 = href2.replace(match[0], encodeURIComponent(inp.value));\n }\n }\n else {\n href2 = href2.replace(match[0], '');\n }\n after();\n }\n }).call(this, match);\n }\n after();\n },\n checkAds: function() {\n this.app.getElements('.ad-holder').each(function(holder) {\n var gads = document.id('gads'),\n gad = gads && gads.getElement('ins'),\n timeout,\n showAd = gads ? function(obj) {\n if (obj.gads) {\n gad.inject(holder);\n (window.adsbygoogle = window.adsbygoogle || []).push({});\n }\n else {\n gad.inject(gads);\n holder.set('html', obj.ad);\n timeout = setTimeout(getAd, 60000);\n }\n } : function(obj) {\n holder.set('html', obj.ad);\n timeout = setTimeout(getAd, 60000);\n },\n getAd = function() {\n new (appbuilder.app.hasCORS ? Request.JSON : Request.JSONP)({\n url: 'https://ads2.appshed.com/',\n data: {\n device: this.phone.getUniqueId(),\n app: this.phone.history.currentApp,\n editor: this.phone.options.request.data.editor\n },\n noCache: true,\n onSuccess: showAd,\n onFailure: function(xhr) {\n appbuilder.app.debug('navigator', 'ads', 'fail', xhr);\n },\n method: 'get'\n }).send();\n }.bind(this);\n getAd();\n this.app.addEvent('destroy', function() {\n clearTimeout(timeout);\n });\n }, this);\n },\n highlightSearchWords: function(screenEl) {\n this.afterSearch = false;\n var bodyText = screenEl.innerHTML;\n var highlightStartTag = \"\";\n var highlightEndTag = \"\";\n\n var newText = \"\";\n var i = -1;\n var lcBodyText = bodyText.toLowerCase();\n\n while (bodyText.length > 0) {\n i = lcBodyText.indexOf(this.searchword, i + 1);\n if (i < 0) {\n newText += bodyText;\n bodyText = \"\";\n } else {\n if (bodyText.lastIndexOf(\">\", i) >= bodyText.lastIndexOf(\"<\", i)) {\n if (lcBodyText.lastIndexOf(\"/script>\", i) >= lcBodyText.lastIndexOf(\")([\\s\\S]*)/i);\n if (pageData) {\n var style = pageData[1].match(/([\\s\\S]*?)<\\/style>/i);\n if (style[1]) {\n var styleElement = document.getElementById('ie-style-' + type);\n if (styleElement) {\n document.id(styleElement).destroy();\n }\n styleElement = document.createElement('style');\n styleElement.setAttribute('type', 'text/css');\n styleElement.setAttribute('id', 'ie-style-' + type);\n styleElement.styleSheet.cssText = style[1];\n headerElement.appendChild(styleElement);\n }\n return pageData[2];\n }\n return html;\n } : function(html) {\n return html;\n },\n applyTabMask: function() {\n if (this.tabBar) {\n this.tabBar.getElements('.tab .icon').each(function(img) {\n if (!img.get('data-src')) {\n var src = img.get('src'),\n mask = 'url(\\'' + src + '\\') top left / contain no-repeat';\n img.setStyles({\n 'mask': mask,\n '-webkit-mask': mask,\n '-o-mask': mask,\n '-ms-mask': mask\n });\n img.set('data-src', src);\n //ios doesnt remove the image if i just remove the src attribute - this is 1 transparent pixel\n img.set('src', 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7');\n }\n });\n }\n },\n removeTabMask: function() {\n if (this.tabBar) {\n this.tabBar.getElements('.tab .icon').each(function(img) {\n if (img.get('data-src')) {\n img.setStyles({\n '-webkit-mask': null,\n '-o-mask': null,\n '-ms-mask': null,\n 'mask': null\n });\n img.set('src', img.get('data-src'));\n img.removeProperty('data-src');\n }\n });\n }\n }\n}, 'Navigator');\n","appbuilder.app.Navigator.screenSetups = appbuilder.app.Navigator.screenSetups || {};\nappbuilder.app.Navigator.screenSetups.appsscreen = function(screen, html) {\n\tvar resize = screen.retrieve('resize');\n\tif(!resize) {\n\t\tvar\titems = screen.getElements('.apps'),\n\t\tinner = screen.getElement('.items-inner');\n\t\tresize = function() {\n\t\t\tappbuilder.app.debug('apps', 'resize');\n\t\t\tvar s = screen.getSize();\n\t\t\titems.setStyles({\n\t\t\t\twidth: s.x\n\t\t\t});\n\t\t\tinner.setStyles({\n\t\t\t\twidth: s.x * items.length\n\t\t\t});\n var scroll = screen.getElement('.items').retrieve('scroll');\n if (scroll) {\n setTimeout(function() {\n scroll.gotoPage(scroll.getPage());\n }, 0)\n }\n\t\t};\n\t\tthis.phone.addEvent('resize', resize);\n\t\tscreen.store('resize', resize);\n\t\t\n\t\titems.each(function(apps) {\n\t\t\tvar title = apps.getElement('.apps-title');\n\t\t\tif(title) {\n\t\t\t\tvar otext = title.get('text'),\n\t\t\t\t\ttimeout;\n\t\t\t\tapps.addEvent('mouseover:relay(.item.icon)', function(e) {\n\t\t\t\t\ttitle.set('text', this.getElement('.title').get('text'));\n\t\t\t\t\tclearTimeout(timeout);\n\t\t\t\t\ttimeout = setTimeout(function() {\n\t\t\t\t\t\ttitle.set('text', otext);\n\t\t\t\t\t}, 1000);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t\n\t\tvar apps = screen.getElements('.item.icon');\n\t\t\n\t\tvar searchBox = screen.getElement('.search-box');\n\t\tvar searchResults = screen.getElement('.search-results');\n\t\tfunction change() {\n\t\t\tvar val = searchBox.get('value');\n\t\t\tsearchResults.empty();\n\t\t\tif(val) {\n\t\t\t\tval = val.toLowerCase();\n\t\t\t\tvar count = 0;\n\t\t\t\tapps.every(function(app) {\n\t\t\t\t\tif(app.getElement('.title').get('text').toLowerCase().contains(val)) {\n\t\t\t\t\t\tapp.clone().inject(searchResults);\n\t\t\t\t\t}\n\t\t\t\t\treturn count++ < 5;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tsearchBox.addEvent('keyup', change);\n\t\tsearchBox.onwebkitspeechchange = change;\n\t\t\n\t\tdocument.id(this.phone).addClass('apps-screen');\n\t\t\n\t\tscreen.addEvent('destroy', function() {\n\t\t\tappbuilder.app.debug('apps', 'destroy');\n\t\t\tthis.phone.removeEvent('resize', resize);\n\t\t\tscreen.store('resize', false);\n\t\t\t\n\t\t\tdocument.id(this.phone).removeClass('apps-screen');\n\t\t}.bind(this));\n\t}\n\tresize();\n};\n","appbuilder.app.Navigator.screenSetups = appbuilder.app.Navigator.screenSetups || {};\nappbuilder.app.Navigator.screenSetups.gallery = function(screen) {\n\tvar resize = screen.retrieve('resize');\n\tif(!resize) {\n\t\tvar itemsEl = screen.getElement('.items'),\n\t\titems = screen.getElements('.item.gallery'),\n\t\tinner = itemsEl.getElement('.items-inner');\n\t\tresize = function() {\n\t\t\tappbuilder.app.debug('gallery', 'resize');\n\t\t\tvar s = itemsEl.getSize();\n\t\t\titems.setStyles({\n\t\t\t\twidth: s.x + 'px',\n\t\t\t\theight: s.y + 'px'\n\t\t\t});\n\t\t\tinner.setStyles({\n\t\t\t\twidth: (s.x * items.length) + 'px',\n\t\t\t\theight: s.y + 'px'\n\t\t\t});\n\t\t}\n\t\tthis.phone.addEvent('resize', resize);\n\t\tscreen.addEvent('destroy', function() {\n\t\t\tappbuilder.app.debug('gallery', 'destroy');\n\t\t\tthis.phone.removeEvent('resize', resize);\n\t\t}.bind(this));\n\t}\n\tresize();\n};\n","appbuilder.app.Navigator.screenSetups = appbuilder.app.Navigator.screenSetups || {};\nappbuilder.app.Navigator.screenSetups.list = function(screen, html) {\n\tif(!appbuilder.app.isIE){\n\tscreen.getElements('select').each(function(selectEl) {\n\t\tappbuilder.app.debug('list', 'select');\n\t\tvar options = [], val = selectEl.get('value') , name = selectEl.get('name');\n\t\tselectEl.getElements('option').each(function(opEl) {\n\t\t\tvar v = opEl.get('value');\n\t\t\toptions.push({\n\t\t\t\t'value': v, \n\t\t\t\t'title': opEl.get('text'), \n\t\t\t\t'selected':val == v\n\t\t\t});\n\t\t});\n\t\tvar p = selectEl.getParent();\n\t\tselectEl.destroy();\n\t\tselectEl = appbuilder.app.makeElement('selected', {}, 'span').inject(p);\n\n\t\tif(typeOf(options) == 'array' && options.length > 0) {\n\t\t\tvar done, cancel, oset = selectEl.set, oget = selectEl.get, i;\n\t\t\tvar spinnerOptions = {};\n\t\t\toptions.each(function(op) {\n\t\t\t\tspinnerOptions[op.value] = op.title;\n\t\t\t});\n\n\t\t\tselectEl.set = function(what, value) {\n\t\t\t\tif(what == 'value') {\n\t\t\t\t\tthis.set('data-value', value.value || value);\n\t\t\t\t\tthis.set('data-variable', name );\n\t\t\t\t\tthis.set('text', value.title || spinnerOptions[value] || value);\n\t\t\t\t\tselectEl.fireEvent('change');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toset.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\t\t\tselectEl.get = function(what) {\n\t\t\t\tif(what == 'value') {\n\t\t\t\t\treturn this.get('data-value');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn oget.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif(!options.some(function(option) {\n\t\t\t\tif(option.selected) {\n\t\t\t\t\tselectEl.set('value', option);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t})) {\n\n\t\t\t\tselectEl.set('value', options[0]);\n\t\t\t}\n\n\t\t\tselectEl.addEvent('click', function(e) {\n\t\t\t\tif(!SpinningWheel.swWrapper) {\n\t\t\t\t\te.stop();\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tappbuilder.app.decoy();\n\t\t\t\t\tSpinningWheel.addSlot(spinnerOptions, '', selectEl.get('value'));\n\t\t\t\t\tSpinningWheel.setCancelAction(cancel);\n\t\t\t\t\tSpinningWheel.setDoneAction(done);\n\n\t\t\t\t\tSpinningWheel.open();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdone = function() {\n\t\t\t\tvar results = SpinningWheel.getSelectedValues();\n\t\t\t\tselectEl.set('value', results.keys[0]);\n\t\t\t};\n\n\t\t\tcancel = function() {};\n\t\t}\n\t});\n\t}\n\tscreen.getElements('[data-picker-type]').each(function(pickerEl) {\n\t\tappbuilder.app.debug('list', 'picker');\n\t\tvar type = pickerEl.get('data-picker-type');\n\t\t//if(appbuilder.app.isMobile) {\n\t\tvar now = new Date(), done, cancel, oset = pickerEl.set, oget = pickerEl.get, i;\n\t\tif(type == 'date') {\n\t\t\tvar months = {\n\t\t\t\t\"0\":\"January\",\n\t\t\t\t\"1\":\"Feburary\",\n\t\t\t\t\"2\":\"March\",\n\t\t\t\t\"3\":\"April\",\n\t\t\t\t\"4\":\"May\",\n\t\t\t\t\"5\":\"June\",\n\t\t\t\t\"6\":\"July\",\n\t\t\t\t\"7\":\"August\",\n\t\t\t\t\"8\":\"September\",\n\t\t\t\t\"9\":\"October\",\n\t\t\t\t\"10\":\"November\",\n\t\t\t\t\"11\":\"December\"\n\t\t\t};\n\t\t\tvar days = {\n\t\t\t\t\"1\":\"1\",\n\t\t\t\t\"2\":\"2\",\n\t\t\t\t\"3\":\"3\",\n\t\t\t\t\"4\":\"4\",\n\t\t\t\t\"5\":\"5\",\n\t\t\t\t\"6\":\"6\",\n\t\t\t\t\"7\":\"7\",\n\t\t\t\t\"8\":\"8\",\n\t\t\t\t\"9\":\"9\",\n\t\t\t\t\"10\":\"10\",\n\t\t\t\t\"11\":\"11\",\n\t\t\t\t\"12\":\"12\",\n\t\t\t\t\"13\":\"13\",\n\t\t\t\t\"14\":\"14\",\n\t\t\t\t\"15\":\"15\",\n\t\t\t\t\"16\":\"16\",\n\t\t\t\t\"17\":\"17\",\n\t\t\t\t\"18\":\"18\",\n\t\t\t\t\"19\":\"19\",\n\t\t\t\t\"20\":\"20\",\n\t\t\t\t\"21\":\"21\",\n\t\t\t\t\"22\":\"22\",\n\t\t\t\t\"23\":\"23\",\n\t\t\t\t\"24\":\"24\",\n\t\t\t\t\"25\":\"25\",\n\t\t\t\t\"26\":\"26\",\n\t\t\t\t\"27\":\"27\",\n\t\t\t\t\"28\":\"28\",\n\t\t\t\t\"29\":\"29\",\n\t\t\t\t\"30\":\"30\",\n\t\t\t\t\"31\":\"31\"\n\t\t\t};\n\t\t\tvar years = {};\n\t\t\tvar thisYear = now.getFullYear();\n\t\t\tvar yearRange = parseInt(pickerEl.get('data-year-range') || 200);\n\t\t\tfor(i = thisYear - yearRange;i < thisYear + yearRange;i++) {\n\t\t\t\tyears[i] = '' + i;\n\t\t\t}\n\n\t\t\tpickerEl.set = function(what, value) {\n\t\t\t\tif(what == 'value') {\n\t\t\t\t\tif(typeOf(value) != 'date') {\n\t\t\t\t\t\tvalue = new Date(parseInt(value));\n\t\t\t\t\t}\n\t\t\t\t\tif(isNaN(value)) {\n\t\t\t\t\t\tvalue = new Date();\n\t\t\t\t\t}\n\t\t\t\t\tthis.set('data-value', value.getTime());\n\t\t\t\t\tthis.set('text', value.toLocaleDateString());\n\t\t\t\t\tpickerEl.fireEvent('change');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toset.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\t\t\tpickerEl.get = function(what) {\n\t\t\t\tif(what == 'value') {\n\t\t\t\t\treturn parseInt(this.get('data-value') || new Date().getTime());\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn oget.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tpickerEl.set('value', pickerEl.get('data-value') || new Date());\n\n\t\t\tpickerEl.addEvent('click', function(e) {\n\t\t\t\tif(appbuilder.app.isIE) {\n\t\t\t\t\t// disable ie <= 8\n\t\t\t\t\tappbuild.app.alert('This feature is not supported on the browser you are using (Internet Explorer 8). Please try again using IE9, Firefox or Chrome.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(!SpinningWheel.swWrapper) {\n\t\t\t\t\te.stop();\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tappbuilder.app.decoy();\n\n\t\t\t\t\tvar val = new Date(pickerEl.get('value'));\n\n\t\t\t\t\tSpinningWheel.addSlot(days, 'right', val.getDate());\n\t\t\t\t\tSpinningWheel.addSlot(months, '', val.getMonth());\n\t\t\t\t\tSpinningWheel.addSlot(years, '', val.getFullYear());\n\n\t\t\t\t\tSpinningWheel.setCancelAction(cancel);\n\t\t\t\t\tSpinningWheel.setDoneAction(done);\n\n\t\t\t\t\tSpinningWheel.open();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdone = function() {\n\t\t\t\tvar results = SpinningWheel.getSelectedValues();\n\t\t\t\tvar val = new Date(results.keys[2], results.keys[1], results.keys[0]);\n\t\t\t\tpickerEl.set('value', val.getTime());\n\t\t\t};\n\n\t\t\tcancel = function() {};\n\t\t}\n\t\telse if(type == 'time') {\n\t\t\tvar hours = {\n\t\t\t\t\"1\":\"1\",\n\t\t\t\t\"2\":\"2\",\n\t\t\t\t\"3\":\"3\",\n\t\t\t\t\"4\":\"4\",\n\t\t\t\t\"5\":\"5\",\n\t\t\t\t\"6\":\"6\",\n\t\t\t\t\"7\":\"7\",\n\t\t\t\t\"8\":\"8\",\n\t\t\t\t\"9\":\"9\",\n\t\t\t\t\"10\":\"10\",\n\t\t\t\t\"11\":\"11\",\n\t\t\t\t\"12\":\"12\"\n\t\t\t};\n\t\t\tvar mins = {\n\t\t\t\t\"0\":\"00\",\n\t\t\t\t\"5\":\"05\",\n\t\t\t\t\"10\":\"10\",\n\t\t\t\t\"15\":\"15\",\n\t\t\t\t\"20\":\"20\",\n\t\t\t\t\"25\":\"25\",\n\t\t\t\t\"30\":\"30\",\n\t\t\t\t\"35\":\"35\",\n\t\t\t\t\"40\":\"40\",\n\t\t\t\t\"45\":\"45\",\n\t\t\t\t\"50\":\"50\",\n\t\t\t\t\"55\":\"55\"\n\t\t\t};\n\t\t\tvar ampm = {\n\t\t\t\t\"am\":\"am\", \n\t\t\t\t\"pm\":\"pm\"\n\t\t\t};\n\n\t\t\tpickerEl.set = function(what, value) {\n\t\t\t\tif(what == 'value') {\n\t\t\t\t\tthis.set('data-value', value);\n\n\t\t\t\t\tvar val = pickerEl.get('value').split(':');\n\t\t\t\t\tif(val.length == 1) {\n\t\t\t\t\t\tvar d = new Date(pickerEl.get('value'));\n\t\t\t\t\t\tif(isNaN(d)) {\n\t\t\t\t\t\t\td = new Date();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval = [d.getHours(), d.getMinutes()];\n\t\t\t\t\t}\n\n\t\t\t\t\tvar am = 'am';\n\t\t\t\t\tvar h = parseInt(val[0]);\n\n\t\t\t\t\tif(h == 0) {\n\t\t\t\t\t\th = 12;\n\t\t\t\t\t}\n\t\t\t\t\telse if(h > 12) {\n\t\t\t\t\t\th -= 12;\n\t\t\t\t\t\tam = 'pm';\n\t\t\t\t\t}\n\t\t\t\t\telse if(h == 12) {\n\t\t\t\t\t\tam = 'pm';\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.set('text', h + ':' + ('' + val[1]).pad(2, '0', 'l') + ' ' + am);\n\t\t\t\t\tpickerEl.fireEvent('change');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\toset.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\t\t\tpickerEl.get = function(what) {\n\t\t\t\tif(what == 'value') {\n\t\t\t\t\treturn this.get('data-value') || new Date().format('%H:%M');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn oget.apply(this, arguments);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tpickerEl.set('value', pickerEl.get('data-value') || new Date().format('%H:%M'));\n\n\t\t\tpickerEl.addEvent('click', function(e) {\n\t\t\t\tif(appbuilder.app.isIE) {\n\t\t\t\t\t// disable ie <= 8\n\t\t\t\t\tappbuild.app.alert('This feature is not supported on the browser you are using (Internet Explorer 8). Please try again using IE9, Firefox or Chrome.');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(!SpinningWheel.swWrapper) {\n\t\t\t\t\te.stop();\n\t\t\t\t\te.preventDefault();\n\n\t\t\t\t\tappbuilder.app.decoy();\n\n\t\t\t\t\tvar val = pickerEl.get('value').split(':');\n\n\t\t\t\t\tvar am = 'am';\n\t\t\t\t\tvar h = val[0];\n\n\t\t\t\t\tif(h == 0) {\n\t\t\t\t\t\th = 12;\n\t\t\t\t\t}\n\t\t\t\t\telse if(h > 12) {\n\t\t\t\t\t\th -= 12;\n\t\t\t\t\t\tam = 'pm';\n\t\t\t\t\t}\n\t\t\t\t\telse if(h == 12) {\n\t\t\t\t\t\tam = 'pm';\n\t\t\t\t\t}\n\n\t\t\t\t\tSpinningWheel.addSlot(hours, 'right', h);\n\t\t\t\t\tSpinningWheel.addSlot(mins, '', val[1]);\n\t\t\t\t\tSpinningWheel.addSlot(ampm, '', am);\n\n\t\t\t\t\tSpinningWheel.setCancelAction(cancel);\n\t\t\t\t\tSpinningWheel.setDoneAction(done);\n\n\t\t\t\t\tSpinningWheel.open();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdone = function() {\n\t\t\t\tvar results = SpinningWheel.getSelectedValues();\n\t\t\t\tvar h = parseInt(results.keys[0]);\n\t\t\t\tif(h == 12) {\n\t\t\t\t\th = 0;\n\t\t\t\t}\n\t\t\t\tif(results.keys[2] == 'pm') {\n\t\t\t\t\th += 12;\n\t\t\t\t}\n\n\t\t\t\tpickerEl.set('value', h + ':' + results.keys[1]);\n\t\t\t};\n\n\t\t\tcancel = function() {};\n\t\t}\n\t});\n\n\tscreen.getElements('input[type=text][data-autocomplete-url]:not([data-autocomplete-url=\"\"])').each(function(autocompleteEl) {\n\t\tappbuilder.app.debug('list', 'autocomplete');\n\t\tvar url = autocompleteEl.get('data-autocomplete-url');\n\t\tvar varName = autocompleteEl.get('data-autocomplete-variable') || autocompleteEl.get('data-variable') || autocompleteEl.get('name');\n\t\tvar minLength = parseInt(autocompleteEl.get('data-autocomplete-min-length')) || 1;\n\t\tvar completionsEl = appbuilder.app.makeElement('autocomplete').inject(autocompleteEl, 'after');\n\t\tvar completionsInner = appbuilder.app.makeElement('autocomplete-inner').inject(completionsEl);\n\t\tvar scroller = new appbuilder.app.scroll.iphone(completionsEl, {\n\t\t\tonBeforeScrollStart: function (e) {\n\t\t\t\tif(e.target.tagName != 'INPUT'\n\t\t\t\t\t&& e.target.tagName != 'SELECT'\n\t\t\t\t\t&& e.target.tagName != 'TEXTAREA') {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\te.stopPropagation();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tvar showCompletions = function(options) {\n\t\t\tcompletionsInner.empty();\n\t\t\tif(typeOf(options) == 'array' && options.length > 0) {\n\t\t\t\toptions.each(function(op) {\n\t\t\t\t\tvar e = appbuilder.app.makeElement('completion', {\n\t\t\t\t\t\t'html':op\n\t\t\t\t\t}).inject(completionsInner);\n\t\t\t\t\te.addEvent('click', function() {\n\t\t\t\t\t\tautocompleteEl.set('value', op);\n\t\t\t\t\t\tautocompleteEl.fireEvent('change');\n\t\t\t\t\t\tcompletionsEl.setStyle('display', 'none');\n\t\t\t\t\t\tappbuilder.app.decoy();\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\tcompletionsEl.setStyle('height', options.length < 5 ? options.length * 25 : 125);\n\t\t\t\tcompletionsEl.setStyle('display', 'block');\n\t\t\t\tscroller.refresh();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcompletionsEl.setStyle('display', 'none');\n\t\t\t}\n\t\t}.bind(this);\n\n\t\tvar getCompletions = function(val) {\n\t\t\tthis.checkVariables(url, function(url) {\n\t\t\t\turl = url.toURI().setData(varName, val).toString();\n\t\t\t\tthis.phone.loader.request('autocomplete', url, null, showCompletions);\n\t\t\t}.bind(this));\n\t\t}.bind(this);\n\n\t\tautocompleteEl.addEvent('keyup', function() {\n\t\t\tvar val = autocompleteEl.get('value');\n\t\t\tif(val.length >= minLength) {\n\t\t\t\tgetCompletions(val);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcompletionsEl.setStyle('display', 'none');\n\t\t\t}\n\t\t}.bind(this));\n\n\t\t//formEl.addEvent('blur', function() {\n\t\t//\tcompletionsEl.setStyle('display', 'none');\n\t\t//});\n\n\t\tautocompleteEl.set('autocorrect', 'off');\n\t\tautocompleteEl.set('autocomplete', 'off');\n\t\tautocompleteEl.set('autocapitalize', 'off');\n\t}, this);\n\n\tvar localSearchBoxes = screen.getElements('input.textbox.localsearch');\n\tif(localSearchBoxes.length > 0) {\n\t\tthis.phone.fetch('searchdata', this.phone.history.currentApp, function(searchData) {\n\t\t\tvar screenId = screen.get('id').replace('screen' , '');\n\t\t\tlocalSearchBoxes.each(function(localSearchBox) {\n\t\t\t\tvar results = new Element('div');\n\t\t\t\tresults.inject(localSearchBox.getParent('.item.textbox'), 'after');\n\t\t\t\tlocalSearchBox.addEvent('keyup',function() {\n\t\t\t\t\tresults.set('html', '');\n\t\t\t\t\tvar resultsArray = [],\n\t\t\t\t\t\tmatchesCount = 0,\n\t\t\t\t\t\tsearchTerm = localSearchBox.get('value').toLowerCase();\n\t\t\t\t\tif(searchTerm.length > 1) {\n\t\t\t\t\t\tObject.each(searchData.words, function(screenIds, key) {\n\t\t\t\t\t\t\tif(key.indexOf(searchTerm) === 0) {\n\t\t\t\t\t\t\t\tscreenIds.each(function(id) {\n\t\t\t\t\t\t\t\t\tmatchesCount++;\n\t\t\t\t\t\t\t\t\tvar resultElement = new Element('div', {\n\t\t\t\t\t\t\t\t\t\t'class': 'item plain link',\n\t\t\t\t\t\t\t\t\t\t'data-linktype': 'screen',\n\t\t\t\t\t\t\t\t\t\t'data-href': id,\n\t\t\t\t\t\t\t\t\t\t'data-highlight': searchTerm,\n\t\t\t\t\t\t\t\t\t\thtml: '
    ' + searchData.screens[id].substr(searchData.screens[id].toLowerCase().indexOf(searchTerm),35).replace(/(^\\s+)|(\\s+$)/g, \"\").replace(searchTerm , ''+searchTerm+'')+'...
    '\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\tif(matchesCount < 4) {\n\t\t\t\t\t\t\t\t\t\tresultElement.inject(results);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tresultsArray.push(resultElement);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif(matchesCount > 3) {\n\t\t\t\t\t\t\tvar more = new Element('div', {\n\t\t\t\t\t\t\t\t'class': 'item plain link',\n\t\t\t\t\t\t\t\thtml: '
    See all ' + resultsArray.length + ' results...
    '\n\t\t\t\t\t\t\t}).inject(results);\n\t\t\t\t\t\t\tmore.addEvent('click', function(e) {\n\t\t\t\t\t\t\t\te.stop();\n\t\t\t\t\t\t\t\tvar container = new Element('div');\n\t\t\t\t\t\t\t\tresultsArray.each(function(i) {\n\t\t\t\t\t\t\t\t\ti.inject(container);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tthis.showScreen(\n\t\t\t\t\t\t\t\t\tappbuilder.app.createScreen('screensearch' + searchTerm, 'screen', 'Results for '+searchTerm, container.get('html'), true, true, screenId, false, 'list'),\n\t\t\t\t\t\t\t\t\t'search' + searchTerm, true, false, false\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}.bind(this));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}.bind(this));\n\t\t\t}, this);\n\t\t}.bind(this));\n\t}\n\t// get screen variables\n\tscreen.getElements('[data-variable]').each(function(formEl) {\n\t\tappbuilder.app.debug('list', 'variable');\n\t\tvar id = formEl.get('id'), varName = formEl.get('data-variable') , varTagName = formEl.get('tag') ;\n\t\tif(formEl.get('data-save-value') != 'no') {\n\t\t\tvar obj = this.loadVar(varName);\n\t\t\tif(obj) {\n\t\t\t\tif(formEl.get('type') == 'checkbox') {\n\t\t\t\t\tformEl.set('checked', formEl.get('value') == obj.value);\n\t\t\t\t}\n else if (formEl.get('type') == 'radio') {\n if (formEl.get('value') == obj.value) {\n formEl.set('checked', true);\n }\n }\n\t\t\t\telse {\n\t\t\t\t\tformEl.set('value', obj.value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n var change = function() {\n if(formEl.get('type') == 'checkbox') {\n this.saveVar(varName, formEl.get('checked') ? formEl.get('value') : '');\n }\n else if (formEl.get('type') == 'radio') {\n if (formEl.get('checked')) {\n this.saveVar(varName, formEl.get('value'));\n }\n }\n else {\n this.saveVar(varName, formEl.get('value'));\n }\n }.bind(this);\n\n\t\tif(!appbuilder.app.isMobile) {\n switch(varTagName) {\n\t\t\t\tcase 'input':\n\t\t\t\tcase 'textarea':\n\t\t\t\t\tformEl.addEvent('keyup', change);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tformEl.addEvent('change', change);\n change();\n\t}, this);\n\n\tscreen.getElements('.item.capture').each(function(captureEl) {\n\t\tvar type = captureEl.get('data-capturetype');\n\t\tvar on = captureEl.getElement('.on');\n\t\tvar off = captureEl.getElement('.off');\n\t\tvar varName = captureEl.get('data-name');\n\n\t\tvar canCapture = appbuilder.app.info.canCapture && appbuilder.app.info.canCapture.contains(type);\n\t\tvar canChoose = appbuilder.app.info.canChoose && appbuilder.app.info.canChoose.contains(type);\n\n\t\tif(canCapture || canChoose) {\n\t\t\toff.destroy();\n\t\t\tvar capturebtn = captureEl.getElement('.capture');\n\t\t\tvar choosebtn = captureEl.getElement('.choose');\n\t\t\tvar icon = captureEl.getElement('.image');\n\n\t\t\tvar captured = function(mediaFiles) {\n\t\t\t\tsetURL('file://' + mediaFiles[0].fullPath);\n\t\t\t};\n\n\t\t\tvar scrollRefresh = function() {\n\t\t\t\tvar items = screen.getElement('.items.scrolling');\n\t\t\t\tif(items) {\n\t\t\t\t\tvar s = items.retrieve('scroll');\n\t\t\t\t\tif(s) {\n\t\t\t\t\t\ts.refresh();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tvar setURL = function(url) {\n\t\t\t\tthis.phone.history.disableRefresh = false;\n\t\t\t\tvar newicon;\n\t\t\t\tthis.saveVar(varName, url, 'post');\n\t\t\t\tif(type == 'audio') {\n\t\t\t\t\tnewicon = new Element('div', {\n\t\t\t\t\t\t'class':'image'\n\t\t\t\t\t});\n\t\t\t\t\tvar audio = new Element('audio', {\n\t\t\t\t\t\t'src':url\n\t\t\t\t\t});\n\t\t\t\t\tvar playing = false;\n\t\t\t\t\tnewicon.addClass('play');\n\t\t\t\t\tnewicon.addEvent('click', function() {\n\t\t\t\t\t\tif(playing) {\n\t\t\t\t\t\t\taudio.pause();\n\t\t\t\t\t\t\tnewicon.addClass('play');\n\t\t\t\t\t\t\tnewicon.removeClass('pause');\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\taudio.play();\n\t\t\t\t\t\t\tnewicon.removeClass('play');\n\t\t\t\t\t\t\tnewicon.addClass('pause');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tplaying = !playing;\n\t\t\t\t\t});\n\t\t\t\t\tnewicon.replaces(icon);\n\t\t\t\t\ticon = newicon;\n\t\t\t\t}\n\t\t\t\telse if(type == 'video') {\n\t\t\t\t\tnewicon = new Element('video', {\n\t\t\t\t\t\t'class':'image', \n\t\t\t\t\t\t'src':url,\n\t\t\t\t\t\t'onLoad': scrollRefresh\n\t\t\t\t\t});\n\t\t\t\t\tnewicon.replaces(icon);\n\t\t\t\t\ticon = newicon;\n\t\t\t\t}\n\t\t\t\telse if(type == 'photo') {\n\t\t\t\t\tnewicon = new Element('img', {\n\t\t\t\t\t\t'class':'image', \n\t\t\t\t\t\t'src':url,\n\t\t\t\t\t\t'onLoad': scrollRefresh\n\t\t\t\t\t});\n\t\t\t\t\tnewicon.replaces(icon);\n\t\t\t\t\ticon = newicon;\n\t\t\t\t}\n\t\t\t}.bind(this);\n\n\t\t\tvar failed = function() {\n\t\t\t\tthis.phone.history.disableRefresh = false;\n\t\t\t\tappbuilder.app.debug('navigator.screen.list', arguments);\n\t\t\t}.bind(this);\n\n\t\t\tif(!canCapture) {\n\t\t\t\tcapturebtn.destroy();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcapturebtn.addEvent('click', function() {\n\t\t\t\t\tappbuilder.app.decoy();\n\n\t\t\t\t\tif(type == 'photo') {\n\t\t\t\t\t\tthis.phone.history.disableRefresh = true;\n\t\t\t\t\t\tnavigator.device.capture.captureImage(captured, failed, {\n\t\t\t\t\t\t\tlimit: 1\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse if(type == 'video') {\n\t\t\t\t\t\tthis.phone.history.disableRefresh = true;\n\t\t\t\t\t\tnavigator.device.capture.captureVideo(captured, failed, {\n\t\t\t\t\t\t\tlimit: 1\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse if(type == 'audio') {\n\t\t\t\t\t\tthis.phone.history.disableRefresh = true;\n\t\t\t\t\t\tnavigator.device.capture.captureAudio(captured, failed, {\n\t\t\t\t\t\t\tlimit: 1\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t\tif(!canChoose) {\n\t\t\t\tchoosebtn.destroy();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tchoosebtn.addEvent('click', function() {\n\t\t\t\t\tappbuilder.app.decoy();\n\n\t\t\t\t\tif(type == 'photo') {\n\t\t\t\t\t\tthis.phone.history.disableRefresh = true;\n\t\t\t\t\t\tnavigator.camera.getPicture(setURL, failed, {\n\t\t\t\t\t\t\tquality: 50,\n\t\t\t\t\t\t\tdestinationType: navigator.camera.DestinationType.FILE_URI,\n\t\t\t\t\t\t\tsourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY,\n mediaType: navigator.camera.MediaType.PICTURE,\n\t\t\t\t\t\t\tallowEdit: false\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse if(type == 'video') {\n\t\t\t\t\t\tthis.phone.history.disableRefresh = true;\n\t\t\t\t\t\tnavigator.camera.getPicture(setURL, failed, {\n\t\t\t\t\t\t\tquality: 50,\n\t\t\t\t\t\t\tdestinationType: navigator.camera.DestinationType.FILE_URI,\n\t\t\t\t\t\t\tsourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY,\n mediaType: navigator.camera.MediaType.VIDEO,\n\t\t\t\t\t\t\tallowEdit: true\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse if(type == 'audio') {\n\t\t\t\t\t\tthis.phone.history.disableRefresh = true;\n\t\t\t\t\t\tnavigator.camera.getPicture(setURL, failed, {\n\t\t\t\t\t\t\tquality: 50,\n\t\t\t\t\t\t\tdestinationType: navigator.camera.DestinationType.FILE_URI,\n\t\t\t\t\t\t\tsourceType: navigator.camera.PictureSourceType.PHOTOLIBRARY,\n mediaType: navigator.camera.MediaType.ALLMEDIA,\n\t\t\t\t\t\t\tallowEdit: true\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}.bind(this));\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\ton.destroy();\n\t\t}\n\n\t}, this);\n\t\n\tscreen.getElements('.item.marker').each(function(markerEl) {\n\t\tappbuilder.app.debug('list', 'marker');\n\t\tvar lon = markerEl.get('data-longitude');\n\t\tvar lat = markerEl.get('data-latitude');\n\t\tvar width = (markerEl.getSize().x - 20);\n\t\tvar height = 100;\n\t\tnew Element('img', {\n\t\t\tsrc: 'http://maps.googleapis.com/maps/api/staticmap?sensor=false&zoom=13¢er=' + lat + ',' + lon + '&size=' + width + 'x' + height + '&markers=' + lat + ',' + lon,\n\t\t\twidth: width,\n\t\t\theight: height\n\t\t}).inject(markerEl);\n\t}, this);\n};\n","appbuilder.app.Navigator.screenSetups = appbuilder.app.Navigator.screenSetups || {};\nappbuilder.app.Navigator.screenSetups.map = function(screen, html) {\n\tvar items = screen.getElement('.items'),\n\tmapHolder = appbuilder.app.makeElement('map-holder').inject(items),\n\tmapsLoading = new appbuilder.app.Loader(null, 'Loading Google Maps'),\n\thiddenItems = new Element('div', {\n\t\t'class':'hidden'\n\t}).inject(screen);\n\n\tdocument.id(mapsLoading).inject(items);\n\tmapsLoading.showLoading();\n\tvar data = JSON.decode(screen.getElement('script').get('html'), true);\n\t//The elements are put into a hidden element in the screen so that they get\n\t//picked up and made editable, they are not in the items element as it gets\n\t//cleared by 'new google.maps.Map' before they are made editable\n\tdata.each(function(point) {\n\t\tvar element = new Element('div').inject(hiddenItems);\n\t\telement.set('html', point.html);\n\t\telement.set('html', element.get('text'));\n\t\tpoint.element = element;\n\t});\n\tvar phone = this.phone;\n\tappbuilder.map.include(function(loaded) {\n\t\tif(loaded) {\n\t\t\tappbuilder.app.debug('maps', 'load', 'loaded');\n\t\t\tmapsLoading.hideLoading();\n\t\t\tdocument.id(mapsLoading).destroy();\n\t\t\tvar mapOptions = {\n\t\t\t\t'mapTypeId' : google.maps.MapTypeId.ROADMAP\n\t\t\t};\n\n\t\t\tvar map = new google.maps.Map(mapHolder, mapOptions),\n\t\t\tbounds = new google.maps.LatLngBounds(),\n\t\t\tp;\n\t\t\tdata.each(function(point) {\n\t\t\t\tappbuilder.app.debug('maps', 'makePoint', point);\n\t\t\t\tp = new google.maps.LatLng(point.latitude, point.longitude);\n\t\t\t\tvar icon = new google.maps.MarkerImage(appbuilder.app.mapMarker, new google.maps.Size(31, 40), new google.maps.Point(0, 0), new google.maps.Point(8, 35)),\n\t\t\t\tmarkerOptions = {\n\t\t\t\t\tclickable : true,\n\t\t\t\t\ttitle : point.title,\n\t\t\t\t\tposition : p,\n\t\t\t\t\tmap: map,\n\t\t\t\t\ticon: icon\n\t\t\t\t},\n\t\t\t\tmarker = new google.maps.Marker(markerOptions),\n\t\t\t\tinfoBox;\n\t\t\t\tgoogle.maps.event.addListener(marker, 'click', (function() {\n\t\t\t\t\tif(!infoBox) {\n\t\t\t\t\t\tinfoBox = new InfoBox({\n\t\t\t\t\t\t\tlatlng: marker.getPosition(),\n\t\t\t\t\t\t\telement: point.element,\n\t\t\t\t\t\t\tmap: map\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tinfoBox.setMap(map);\n\t\t\t\t\t}\n\t\t\t\t}).bind(this));\n\n\t\t\t\tbounds.extend(marker.position);\n\t\t\t});\n\n\t\t\tif(data.length == 0) {\n\t\t\t\tappbuilder.app.debug('maps', 'make', 'noPoints');\n\t\t\t\tmap.setCenter(new google.maps.LatLng(0, 0));\n\t\t\t\tmap.setZoom(0);\n\t\t\t}\n\t\t\telse if(data.length == 1) {\n\t\t\t\tappbuilder.app.debug('maps', 'make', 'onePoint');\n\t\t\t\tmap.setCenter(p);\n\t\t\t\tmap.setZoom(parseInt(screen.get('data-zoom')) || 12);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmap.fitBounds(bounds);\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tappbuilder.app.debug('maps', 'load', 'failed');\n\t\t\tmapsLoading.setMessage('Failed to load Google Maps');\n\t\t\tmapsLoading.hideLoadingAni();\n\t\t}\n\t});\n};\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\nappbuilder.app.JSAPI = new Class({\n\tinitialize: function(phone) {\n\t\tthis.phone = phone;\n appbuilder.app.api = this;\n\t},\n\t\n\tisPhoneGap: appbuilder.app.isPhoneGap,\n\tisMobile: appbuilder.app.isMobile,\n\t\n\tshowApp: function(id) {\n\t\tappbuilder.app.debug('api', 'showApp', id);\n\t\tthis.phone.navigator.linktypes['app'].call(this.phone.navigator, \"\"+id);\n\t},\n\t\n\tshowTab: function(id) {\n\t\tappbuilder.app.debug('api', 'showTab', id);\n\t\tthis.phone.navigator.linktypes['tab'].call(this.phone.navigator, \"\"+id);\n\t},\n\t\n\tshowScreen: function(id,animate) {\n\t\tappbuilder.app.debug('api', 'showScreen', id);\n\t\tthis.phone.navigator.linktypes['screen'].call(this.phone.navigator, \"\"+id,animate);\n\t},\n\t\n\tshowRemoteScreen: function(url) {\n\t\tappbuilder.app.debug('api', 'showRemoteScreen', url);\n\t\tthis.phone.navigator.linktypes['remote'].call(this.phone.navigator, url);\n\t},\n\t\t\t\n\tshowWeb: function(url, type) {\n\t\tappbuilder.app.debug('api', 'showWeb', url);\n\t\tthis.phone.navigator.linktypes['web'].call(this.phone.navigator, url, type);\n\t},\n\t\n\tshowFile: function(url) {\n\t\tappbuilder.app.debug('api', 'showFile', url);\n\t\tthis.phone.navigator.linktypes['file'].call(this.phone.navigator, url);\n\t},\n\t\t\t\n\tshowYoutube: function(url) {\n\t\tappbuilder.app.debug('api', 'showYoutube', url);\n\t\tthis.phone.navigator.linktypes['youtube'].call(this.phone.navigator, url);\n\t},\n\t\t\t\n\tshowVimeo: function(url) {\n\t\tappbuilder.app.debug('api', 'showVimeo', url);\n\t\tthis.phone.navigator.linktypes['vimeo'].call(this.phone.navigator, url);\n\t},\n\t\t\t\n\tshowTwitter: function(username) {\n\t\tappbuilder.app.debug('api', 'showTwitter', username);\n\t\tthis.phone.navigator.linktypes['twitter'].call(this.phone.navigator, username);\n\t},\n\t\t\t\n\tshowFacebook: function(url) {\n\t\tappbuilder.app.debug('api', 'showFacebook', url);\n\t\tthis.phone.navigator.linktypes['facebook'].call(this.phone.navigator, url);\n\t},\n\t\t\t\n\tshowBBM: function() {\n\t\tappbuilder.app.debug('api', 'showBBM', url);\n\t\tthis.phone.navigator.linktypes['bbm'].call(this.phone.navigator);\n\t},\n\t\t\t\n\tplaySound: function(url) {\n\t\treturn appbuilder.app.sound.play(url);\n\t},\n\t\t\t\n\tstopSound: function(a) {\n\t\tappbuilder.app.sound.stop(a);\n\t},\n\t\t\t\n\tback: function() {\n\t\tappbuilder.app.debug('api', 'back', url);\n\t\tthis.phone.navigator.linktypes['back'].call(this.phone.navigator);\n\t},\n\t\n\tgetVariable: function(name) {\n\t\tappbuilder.app.debug('api', 'getVariable', name);\n\t\tvar formField = this.phone.navigator.loadVar(name);\n\t\tif(formField) {\n\t\t\treturn formField.value;\n\t\t}\n\t\treturn null;\n\t},\n\n\tsetVariable: function(name, value) {\n\t\tappbuilder.app.debug('api', 'setVariable', name, value);\n\t\tthis.phone.navigator.saveVar(name, value);\n\t\tvar item = document.getElement('[data-variable='+name+']');\n\t\tif(item) {\n\t\t\titem.set('value', value);\n\t\t}\n\t},\n\t\n\taddTabEvent: function(id, func) {\n\t\tvar f = function(eid, tab) {\n\t\t\tif(id == eid) {\n\t\t\t\tappbuilder.app.debug('api', 'tabEvent', id);\n\t\t\t\ttry {\n\t\t\t\t\tfunc.call(tab, this);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tappbuilder.app.debug('api', 'Error with custom js on tab event', e);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this);\n\t\tthis.phone.addEvent('tab', f);\n\t\treturn f;\n\t},\n\t\n\tremoveTabEvent: function(identifier) {\n\t\tthis.phone.removeEvent('tab', identifier);\n\t},\n\t\n\taddScreenEvent: function(id, func) {\n\t\tvar f = function(eid, screen) {\n\t\t\tif(id == eid) {\n\t\t\t\tappbuilder.app.debug('api', 'screenEvent', id);\n\t\t\t\ttry {\n\t\t\t\t\tfunc.call(screen, this);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tappbuilder.app.debug('api', 'Error with custom js on screen event', e);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this);\n\t\tthis.phone.addEvent('screen', f);\n\t},\n\t\n\tremoveScreenEvent: function(identifier) {\n\t\tthis.phone.removeEvent('screen', identifier);\n\t},\n\t\n\taddVariableEvent: function(name, func) {\n\t\tvar f = function(ename, value) {\n\t\t\tif(name == ename) {\n\t\t\t\tappbuilder.app.debug('api', 'variableEvent', name);\n\t\t\t\ttry {\n\t\t\t\t\tfunc.call(window, value, this);\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\tappbuilder.app.debug('api', 'Error with custom js on variable event', e);\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this);\n\t\tthis.phone.addEvent('varChange', f);\n\t\treturn f;\n\t},\n\t\n\tremoveVariableEvent: function(identifier) {\n\t\tthis.phone.removeEvent('varChange', identifier);\n\t},\n\t\t\t\n\trunOnce: function(id, func) {\n\t\tif(typeof id === 'function') {\n\t\t\tfunc = id;\n\t\t\tid = this.phone.history.currentApp;\n\t\t}\n\t\tif(!appbuilder.app.JSAPI.runonce[id]) {\n\t\t\tappbuilder.app.JSAPI.runonce[id] = true;\n\t\t\ttry {\n\t\t\t\tfunc.call(window, this);\n\t\t\t}\n\t\t\tcatch(e) {\n\t\t\t\tappbuilder.app.debug('api', 'Error with custom js on variable event', e);\n\t\t\t}\n\t\t}\n\t},\n\n getAppId: function(id) {\n return id;\n },\n\n getTabId: function(id) {\n return id;\n },\n\n getScreenId: function(id) {\n return id;\n },\n\n getItemId: function(id) {\n return id;\n },\n \n getCurrentAppId: function() {\n return appbuilder.app.current.history.currentApp;\n },\n\n getCurrentTabId: function() {\n return appbuilder.app.current.history.currentTabId;\n },\n\n getCurrentScreenId: function() {\n return appbuilder.app.current.history.currentScreenId;\n },\n \n closeConfirm:function(){\n var confirms = appbuilder.app.current.element.getElements('.confirm');\n if(confirms){\n confirms.destroy();\n }\n }\n \n \n});\n\nappbuilder.app.JSAPI.runonce = [];","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\n\nappbuilder.app.History = new Class({\n\thistory: [],\n\tdisableRefresh: false,\n\t\n\tinitialize: function(phone) {\n\t\tthis.phone = phone;\n\t\tif(this.phone.options.browserHistory) {\n\t\t\tthis.browserHistory = appbuilder.app.BrowserHistory;\n\t\t}\n\t\tif(this.browserHistory) {\n\t\t\tthis.browserHistory.register(this);\n\t\t}\n\t\tif(appbuilder.app.isPhoneGap && Browser.Platform.android) {\n\t\t\tdocument.addEventListener('backbutton', this.popHistory.bind(this), false);\n\t\t}\n\t\tif(phone.storage) {\n\t\t\tphone.storage.fetch('history', 0, function(history) {\n\t\t\t\tif(history) {\n\t\t\t\t\tthis.history = history;\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t}\n\t\tif(appbuilder.app.isPhoneGap) {\n\t\t\tvar resumeListener = function() {\n\t\t\t\t//used on android to disable when entering and coming back from camera\n\t\t\t\tif(!this.disableRefresh) {\n\t\t\t\t\t(function() {\n\t\t\t\t\t\t//no need to call update here as the navigator does it within linktype.app\n\t\t\t\t\t\t//this.phone.updateApp(id, function() {\n\t\t\t\t\t\t\tthis.refresh();\n\t\t\t\t\t\t//}.bind(this));\n\t\t\t\t\t}).delay(0, this);\n\t\t\t\t}\n\t\t\t\tthis.disableRefresh = false;\n\t\t\t}.bind(this);\n\t\t\t//mootools event for testing\n\t\t\t//document.addEvent('resume', resumeListener);\n\t\t\t//real phone gap event\n\t\t\tdocument.addEventListener('resume', resumeListener, false);\n\t\t}\n\t},\n\t\n\tpushHistory: function(state) {\n\t\tappbuilder.app.debug('history', 'push', state);\n\t\tthis.history.push(state);\n\t\tif(this.phone.storage) {\n\t\t\tthis.phone.storage.store('history', 0, this.history);\n\t\t}\n\t\tif(this.browserHistory) {\n\t\t\tthis.browserHistory.pushHistory(this, state);\n\t\t}\n\t},\n\t\n\tamendHistory: function(state) {\n\t\tappbuilder.app.debug('history', 'amend', state);\n\t\tif(this.history.length > 0) {\n\t\t\tObject.merge(this.history[this.history.length - 1], state);\n\t\t}\n\t\telse {\n\t\t\tthis.history.push(state);\n\t\t}\n\t\tif(this.phone.storage) {\n\t\t\tthis.phone.storage.store('history', 0, this.history);\n\t\t}\n\t\tif(this.browserHistory) {\n\t\t\tthis.browserHistory.amendHistory(this, state);\n\t\t}\n\t},\n\t\n\t/**\n\t * e is so that the event is ignored\n\t * href is from the screen element if it has a back-href specified\n\t */\n\tpopHistory: function(e, href) {\n\t\tappbuilder.app.debug('history', 'pop');\n\t\tif(this.hasHistory()) {\n\t\t\tif(this.browserHistory) {\n\t\t\t\tthis.browserHistory.popHistory(this, true);\n\t\t\t}\n\t\t\tthis.history.pop();\n\t\t\tif(this.phone.storage) {\n\t\t\t\tthis.phone.storage.store('history', 0, this.history);\n\t\t\t}\n\t\t\tthis.handleHistory(this.history[this.history.length - 1]);\n\t\t}\n\t\telse if(href) {\n\t\t\tthis.handleHistory({screen: href, app: this.currentApp});\n\t\t}\n\t},\n\t\n\tcheckHistory: function() {\n\t\tif(this.browserHistory) {\n\t\t\treturn this.browserHistory.checkHistory(this);\n\t\t}\n\t\treturn false;\n\t},\n\t\n\thandleHistory: function(state, disableAnimation) {\n\t\tappbuilder.app.debug('history', 'handle', state);\n\t\tif(state && state.screen) {\n\t\t\tif(state.app != this.currentApp || state.appUrl != this.currentAppUrl) {\n\t\t\t\tthis.phone.navigator.linktypes.app.apply(this.phone.navigator, [state.app, !disableAnimation, function() {\n\t\t\t\t\tthis.phone.navigator.linktypes[state.linktype || 'screen'].apply(this.phone.navigator, [state.screen, false, false, this.hasHistory(), state.fetchId, state.fetchUrl, state.direct]);\n\t\t\t\t}.bind(this)], state.appUrl);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.phone.navigator.linktypes[state.linktype || 'screen'].apply(this.phone.navigator, [state.screen, !disableAnimation, true, true, state.fetchId, state.fetchUrl, state.direct]);\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},\n\t\n\tclearHistory: function(appChange) {\n\t\tappbuilder.app.debug('history', 'clear');\n\t\tif(!appChange || !this.hasHistory() || this.history[this.history.length - 1].app != this.currentApp) {\n\t\t\tthis.history = [];\n\t\t\tif(this.phone.storage) {\n\t\t\t\tthis.phone.storage.store('history', 0, this.history);\n\t\t\t}\n\t\t}\n\t},\n\t\n\thasHistory: function(historyChange) {\n\t\treturn this.history.length > (historyChange ? 1 : 0);\n\t},\n\t\n\trefresh: function() {\n\t\tappbuilder.app.debug('history', 'refresh');\n\t\tif(this.hasHistory()) {\n\t\t\tthis.currentApp = null;\n\t\t\tthis.handleHistory(this.history[this.history.length - 1], true);\n\t\t}\n\t},\n\t\n\trefreshScreen: function() {\n\t\tif(this.hasHistory()) {\n\t\t\tthis.handleHistory(this.history[this.history.length - 1], true);\n\t\t}\n\t},\n\t\n\tcurrentScreen: function() {\n\t\tif(this.hasHistory()) {\n\t\t\treturn this.history[this.history.length - 1].screen;\n\t\t}\n\t\treturn null;\n\t}\n});\n\nappbuilder.app.BrowserHistory = {\n\tregistered: false,\n\thistoryIgnore: false,\n\thandler: null,\n\n\tregister: function(h) {\n\t\tif(!this.registered && !this.handler) {\n\t\t\tappbuilder.app.debug('history', 'register');\n\t\t\twindow.addEvent('hashchange', this.handlePopHistory.bind(this));\n\t\t\tthis.registered = true;\n\t\t\tthis.handler = h;\n\t\t}\n\t},\n\n\tpushHistory: function(handler, state) {\n\t\tif(this.registered && this.handler == handler) {\n\t\t\tthis.historyIgnore = true;\n\t\t\twindow.location.hash = this.encodeHistoryHash(state);\n\t\t}\n\t},\n\n\tamendHistory: function(handler, state) {\n\t\tthis.pushHistory(handler, state);\n\t},\n\n\tpopHistory: function(handler, ignore) {\n\t\tif(this.registered && this.handler == handler) {\n\t\t\tthis.historyIgnore = ignore;\n\t\t\twindow.history.back();\n\t\t}\n\t},\n\n\tcheckHistory: function(handler) {\n\t\tif(this.registered && this.handler == handler) {\n\t\t\tvar state = this.decodeHistoryHash(window.location.hash);\n\t\t\tif(state.app) {\n\t\t\t\treturn this.handler.handleHistory(state, true);\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t},\n\n\tclearHistory: function(handler) {\n\t\tif(this.registered && this.handler == handler) {\n\t\t\tthis.historyIgnore = true;\n\t\t\twindow.location.hash = '';\n\t\t}\n\t},\n\n\tencodeHistoryHash: function(state) {\n\t\tvar hash = '#' + encodeURIComponent(state.app)\n\t\t\t\t + '/' + encodeURIComponent(state.screen);\n\t\tif(state.linktype || state.fetchId || state.fetchUrl || state.appUrl) {\n\t\t\thash += '/' + encodeURIComponent(state.linktype || 'screen')\n\t\t\t\t + '/' + encodeURIComponent(state.fetchId || '')\n\t\t\t\t + '/' + encodeURIComponent(state.fetchUrl || '')\n\t\t\t\t + '/' + encodeURIComponent(state.direct ? 'direct' : 'remote')\n\t\t\t\t + '/' + encodeURIComponent(state.appUrl || '')\n\t\t}\n\t\treturn hash;\n\t},\n\n\tdecodeHistoryHash: function(hash) {\n\t\tvar state = {};\n\t\tvar parts = window.location.hash.split('/');\n\t\tif(parts.length > 1 && parts[0].length > 1) {\n\t\t\tstate.app = decodeURIComponent(parts[0].substr(1));//remove #\n\t\t\tstate.screen = decodeURIComponent(parts[1]);\n\t\t\tif(parts.length > 5) {\n\t\t\t\tstate.linktype = decodeURIComponent(parts[2]);\n\t\t\t\tstate.fetchId = decodeURIComponent(parts[3]);\n\t\t\t\tstate.fetchUrl = decodeURIComponent(parts[4]);\n\t\t\t\tstate.direct = decodeURIComponent(parts[5]) == 'direct';\n\t\t\t\tstate.appUrl = decodeURIComponent(parts[6]);\n\t\t\t}\n\t\t}\n\t\treturn state;\n\t},\n\n\thandlePopHistory: function() {\n\t\tappbuilder.app.debug('history', 'change');\n\t\tif(!this.historyIgnore && this.handler) {\n\t\t\tvar state = this.decodeHistoryHash(window.location.hash);\n\t\t\tif(state.app) {\n\t\t\t\tthis.handler.handleHistory(state);\n\t\t\t}\n\t\t}\n\t\tthis.historyIgnore = false;\n\t}\n};\n\n/*\n---\ndescription: Added the onhashchange event\n\nlicense: MIT-style\n\nauthors: \n- sdf1981cgn\n- Greggory Hernandez\n\nrequires: \n- core/1.2.4: '*'\n\nprovides: [Element.Events.hashchange]\n\n...\n*/\nElement.Events.hashchange = {\n onAdd: function () {\n var hash = location.hash;\n\n var hashchange = function () {\n if (hash == location.hash) return;\n else hash = location.hash;\n\n var value = (hash.indexOf('#') == 0 ? hash.substr(1) : hash);\n window.fireEvent('hashchange', value);\n document.fireEvent('hashchange', value);\n };\n\n if ((\"onhashchange\" in window) && ((document.documentMode != 5) && (document.documentMode != 7))) {\n window.onhashchange = hashchange;\n }\n else {\n hashchange.periodical(50);\n }\n }\n};\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\nappbuilder.app.Loader = new Class({\n\t\n\tinitialize: function(phone, message) {\n\t\tthis.phone = phone;\n\t\tthis.message = message || 'Loading...';\n\t},\n\t\n\ttoElement: function() {\n\t\tif(!this.element) {\n\t\t\tthis.element = appbuilder.app.makeElement('loader');\n\t\t\tvar inner = appbuilder.app.makeElement('inner').inject(this.element);\n\t\t\tthis.messageEl = appbuilder.app.makeElement('text', {text: this.message}).inject(inner);\n\t\t\t//this.loadingAni = appbuilder.app.makeElement('loading-ani').inject(inner);\n\t\t\tthis.loadingAni = appbuilder.app.spinner().inject(inner);\n\t\t\tthis.hideLoading();\n\t\t}\n\t\treturn this.element;\n\t},\n\t\n\tsetMessage: function(message) {\n\t\tthis.message = message;\n\t\tif(this.messageEl) {\n\t\t\tthis.messageEl.set('text', message);\n\t\t}\n\t},\n\t\n\tshowTimeout: false,\n\t\n\tshowLoading: function() {\n\t\tthis.showTimeout = (function() {\n\t\t\tdocument.id(this);\n\t\t\tthis.element.setStyle('display', 'block');\n\t\t\tthis.showTimeout = false;\n\t\t}).delay(100, this);\n\t},\n\t\n\thideLoading: function() {\n\t\tif(this.showTimeout) {\n\t\t\tclearTimeout(this.showTimeout);\n\t\t\tthis.showTimeout = false;\n\t\t}\n\t\tdocument.id(this);\n\t\tthis.element.setStyle('display', 'none');\n\t},\n\t\n\tshowLoadingAni: function() {\n\t\tthis.loadingAni.setStyle('display', 'block');\n\t},\n\t\n\thideLoadingAni: function() {\n\t\tthis.loadingAni.setStyle('display', 'none');\n\t},\n\t\n\tfetch: function(type, id, cb, update, fetchId, postVars) {\n\t\tvar fetchedType = type == 'direct' ? 'remote' : type,\n\t\t\tloaded = function(obj) {\n\t\t\t\tif(obj[fetchedType] && obj[fetchedType][id]) {\n\t\t\t\t\tappbuilder.app.debug('loader', 'fetched', 'loaded');\n\t\t\t\t\tthis.phone.loaded(obj);\n\t\t\t\t\tcb(obj[fetchedType][id], obj);\n\t\t\t\t}\n\t\t\t\telse if(!update) {\n\t\t\t\t\tappbuilder.app.error('loader', 'fetched', 'incorrect');\n\t\t\t\t\terror('Incorrect data fetched');\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tappbuilder.app.debug('loader', 'fetched', 'nothing');\n\t\t\t\t\tcb(false);\n\t\t\t\t}\n\t\t\t}.bind(this),\n\t\t\terror = function(msg) {\n\t\t\t\tappbuilder.app.error('loader', 'Fetch Error: ' + msg + ' type:' + type + ' id:' + id);\n\t\t\t\tcb(false);\n\t\t\t\tcb = function() {};//prevent second call, eg timeout then error\n\t\t\t};\n\t\tappbuilder.app.debug('loader', 'fetch', type, id);\n\t\tthis.request(type, fetchId || id, update, loaded, error, postVars);\n\t},\n\t\n\trequest: function(type, id, update, loaded, error, postVars, timeout) {\n\t\tvar first = true, requestKey, request, r;\n\t\terror = error || function() {};\n\t\tif(appbuilder.app.isPhoneGap && postVars && postVars.length > 0) {\n\t\t\tpostVars.each(function(inp) {\n\t\t\t\tvar uri, data, options = new FileUploadOptions();\n\t\t\t\toptions.fileKey = inp.name;\n\t\t\t\toptions.fileName = inp.value.substr(inp.value.lastIndexOf('/')+1);\n\t\t\t\toptions.mimeType = inp.mimeType;\n\t\t\t\toptions.param = {};\n\n\t\t\t\tif(type == 'direct') {\n\t\t\t\t\turi = new URI(id);\n\t\t\t\t\tdata = uri.getData();\n\t\t\t\t\tObject.merge({\n\t\t\t\t\t\tfetchURL: id\n\t\t\t\t\t}, data, appbuilder.app.info);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\turi = new URI(this.phone.options.request.url);\n\t\t\t\t\tdata = uri.getData();\n\t\t\t\t\tObject.merge(data, appbuilder.app.info, this.phone.options.request.data, {\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tid: id,\n\t\t\t\t\t\tlastupdate: update\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\turi.setData(data);\n\n\t\t\t\tvar ft = new FileTransfer();\n\t\t\t\tft.upload(inp.value, uri.toString(), function(res) {\n\t\t\t\t\tif(first) {\n\t\t\t\t\t\tfirst = false;\n\t\t\t\t\t\tif(res && res.response) {\n\t\t\t\t\t\t\tloaded(JSON.decode.attempt(decodeURIComponent(response), true));\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\terror('file transfer error');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}, function() {\n\t\t\t\t\tif(first) {\n\t\t\t\t\t\tfirst = false;\n\t\t\t\t\t\terror('file transfer error');\n\t\t\t\t\t}\n\t\t\t\t}, options);\n\t\t\t}, this);\n\t\t}\n\t\telse {\n\t\t\trequestKey = type.toString() + id.toString(),\n\t\t\tr = this.getRequestQueue().requests[requestKey];\n\n\t\t\tif (r && r.running) {\n\t\t\t\tr.addEvent('onSuccess', loaded);\n\t\t\t\tr.addEvent('onFailure', function() {error('Connection Failure');});\n\t\t\t\tr.addEvent('onTimeout', function() {error('Timeout');});\n\t\t\t}\n\t\t\telse {//Otherwise make a new one\n\t\t\t\trequest = new (appbuilder.app.hasCORS ? Request.JSON : Request.JSONP)(Object.merge(type == 'direct' ? {\n\t\t\t\t\turl: id,\n\t\t\t\t\tdata: Object.merge({\n\t\t\t\t\t\tfetchURL: id\n\t\t\t\t\t}, appbuilder.app.info)\n\t\t\t\t} : {\n\t\t\t\t\turl: this.phone.options.request.url,\n\t\t\t\t\tdata: Object.merge({}, appbuilder.app.info, this.phone.options.request.data, {\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\tid: id,\n\t\t\t\t\t\tlastupdate: update\n\t\t\t\t\t}, (appbuilder.app.hasCORS ? {} : {\n rand: (new Date()).getTime()\n }))\n\t\t\t\t}, {\n\t\t\t\t\tmethod: this.phone.options.request.method,\n\t\t\t\t\tnoCache : true,\n\t\t\t\t\ttimeout: timeout || this.phone.options.request.timeout,\n\t\t\t\t\tonSuccess: loaded,\n\t\t\t\t\tonFailure: function() {error('Connection Failure');},\n\t\t\t\t\tonTimeout: function() {error('Timeout');}\n\t\t\t\t}));\n\t\t\t\tthis.getRequestQueue().addRequest(requestKey, request);\n\t\t\t\trequest.send();\n\t\t\t}\n\t\t}\n\t},\n\t\n\tgetRequestQueue : function() {\n\t\tif(!this.requestQueue) {\n\t\t\tthis.requestQueue = new Request.Queue({\n\t\t\t\tconcurrent : this.phone.options.request.concurrent,\n\t\t\t\tstopOnFailure : false\n\t\t\t});\n\t\t}\n\t\treturn this.requestQueue;\n\t}\n}, 'Loader');\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\n\nappbuilder.app.FileLoader = {\n\tdelay: false,\n\tcb: false,\n\t\n\tfetch: function(type, id, cb, fetchId, phone) {\n\t\tappbuilder.app.debug('fileLoader', 'fetch', type, id);\n\t\tthis.cb = cb;\n\t\tthis.type = type;\n\t\tthis.id = id;\n\t\tthis.phone = phone;\n\t\tif(type == 'remote') {\n\t\t\tid = SHA1(id);\n\t\t}\n\t\tthis.scriptEl = new Element('script', {\n\t\t\tsrc: (fetchId || id) + '.' + type + '.js',\n\t\t\ttype: 'text/javascript',\n\t\t\tasync: true,\n\t\t\tonError: this.failed.bind(this)\n\t\t});\n\t\tthis.scriptEl.inject(document.id(document.body));\n\t\tthis.delay = this.failed.delay(500, this);\n\t},\n\t\n\tfetched: function(obj) {\n\t\tappbuilder.app.debug('fileLoader', 'fetched');\n\t\tif(this.delay) {\n\t\t\tclearTimeout(this.delay);\n\t\t}\n\t\tthis.delay = false;\n\t\tthis.scriptEl.destroy();\n\t\t\n\t\tif(obj && obj[this.type] && obj[this.type][this.id]) {\n\t\t\tif(this.phone) {\n\t\t\t\tthis.phone.loaded(obj, false, true);\n\t\t\t}\n\t\t\tthis.cb(obj[this.type][this.id], obj);\n\t\t}\n\t\telse {\n\t\t\tappbuilder.app.debug('fileloader', 'wrong data', obj);\n\t\t\tthis.cb(false);\n\t\t}\n\t},\n\t\n\tfailed: function() {\n\t\tappbuilder.app.debug('fileLoader', 'failed');\n\t\tif(this.delay) {\n\t\t\tclearTimeout(this.delay);\n\t\t}\n\t\tthis.delay = false;\n\t\tthis.scriptEl.destroy();\n\t\tthis.cb(false);\n\t}\n};\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\n\nappbuilder.app.Storage = {\n\tdb: {},\n\tremotedbs: {},\n\t\n\tkeyStacks: {},\n\tkeyStackLimits: {\n\t\tapp: 5,\n\t\tscreen: 20,\n\t\timage: 100,\n\t\tremote: 5,\n inputs: 100\n\t},\n\t\n\tpushKey: function(type, key) {\n\t\tvar keyStack = this.keyStacks[type] || (this.keyStacks[type] = []);\n\n if (!keyStack.indexOf(key)) {\n keyStack.push(key);\n if (keyStack.length > (this.keyStackLimits[type] || 5)) {\n delete this.db[keyStack.shift()];\n }\n }\n\t},\n\t\n\tstore: function(type, id, value) {\n\t\tthis.internalStore(type, id, value);\n\t},\n\t\n\tinternalStore: function(type, id, value, db) {\n\t\tvar key = this.getKey(type, id);\n\t\tif(!db) {\n\t\t\tthis.pushKey(type, key);\n\t\t\tthis.db[key] = value;\n\t\t}\n\t\telse {\n\t\t\tdb[key] = value;\n\t\t}\n\t},\n\n\tfetch: function(type, id) {\n\t\tvar key = this.getKey(type, id);\n\t\tvar db = this.db;\n\t\tvar value = db[key];\n\t\tif(!value) {\n\t\t\tObject.some(this.remotedbs, function(rdb) {\n\t\t\t\tif(type == 'remote' && db.limit > 0 && new Date().getTime() > rdb.limit) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\treturn Object.some(rdb, function(v, k) {\n\t\t\t\t\tif(k == key) {\n\t\t\t\t\t\tdb = rdb;\n\t\t\t\t\t\tvalue = v;\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t\treturn false;\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t\n\t\treturn value;\n\t},\n\t\n\tinternalFetch: function(type, id, db) {\n\t\tvar key = this.getKey(type, id);\n\t\treturn (db || this.db)[key];\n\t},\n\t\n\tclear: function() {\n\t\tthis.db = {};\n\t},\n\t\n\tstoreQueue: [],\n\t\n\tflush: function() {\n\t\tthis.storeQueue.each(function(f) {\n\t\t\tf();\n\t\t});\n\t\tthis.storeQueue = [];\n\t},\n\t\n\tstoreObj: function(obj, work) {\n\t\tif(!work) {\n\t\t\tthis.storeQueue.push(function() {this.storeObj(obj, true)}.bind(this));\n\t\t\treturn;\n\t\t}\n\t\tif(obj.remote) {\n\t\t\tvar key = obj.remote.url;\n\t\t\tvar keyStack = this.keyStacks.remote || (this.keyStacks.remote = []);\n\t\t\tkeyStack.push(key);\n\t\t\tif(keyStack.length > appbuilder.app.Storage.keyStackLimits.remote) {\n\t\t\t\tdelete this.remotedbs[keyStack.shift()];\n\t\t\t}\n\t\t\tthis.remotedbs[key] = {};\n\t\t\tif(obj.remote.refreshAfter > 0) {\n\t\t\t\tthis.remotedbs[key].limit = new Date().getTime() + (obj.remote.refreshAfter * 1000);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.remotedbs[key].limit = 0;\n\t\t\t}\n\t\t\tObject.each(obj, function(v, type) {\n\t\t\t\tif(type == 'app' || type == 'screen') {\n\t\t\t\t\tObject.each(v, function(value, id) {\n\t\t\t\t\t\tthis.internalStore(type, id, value, this.remotedbs[key]);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t\telse if(type == 'remote' && (v.refreshAfter > 0 || v.refreshAfter == 'cache')) {\n\t\t\t\t\tObject.each(v, function(value, id) {\n\t\t\t\t\t\tthis.internalStore(type, id, value, this.remotedbs[key]);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t\telse {\n\t\t\tObject.each(obj, function(v, k) {\n\t\t\t\tif(k == 'app' || k == 'screen') {\n\t\t\t\t\tObject.each(v, function(value, id) {\n\t\t\t\t\t\tthis.internalStore(k, id, value);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t\tif(k == 'searchdata') {\n\t\t\t\t\tObject.each(v, function(value, id) {\n\t\t\t\t\t\tthis.internalStore('searchdata', id,value);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t}, this);\n\t\t}\n\t},\n\t\n\tgetKey: function(type, id) {\n\t\treturn type + '_' + id;\n\t}\n};\n\n\n\nif(window.localStorage) {\n\tappbuilder.app.LocalStorage = {\n\t\tstore: function(type, id, value, cb) {\n\t\t\tvar ret;\n\t\t\tif(type == 'app' || type == 'screen') {\n\t\t\t\tret = this.storeAppScreen(type, id, value);\n\t\t\t}\n\t\t\telse {\n\t\t\t\tret = this.internalStore(type, id, value);\n\t\t\t}\n\t\t\tcb && cb(ret);\n\t\t\treturn ret;\n\t\t},\n\t\t\n\t\tinternalStore: function(type, id, value, time) {\n\t\t\tlscache.set(this.getKey(type, id), value, time || -1);\n\t\t\treturn true;\n\t\t},\n\t\t\n\t\tfetch: function(type, id, cb) {\n\t\t\tvar value = this.internalFetch(type, id);\n\t\t\tif(value && (type == 'app' || type == 'screen')) {\n\t\t\t\tvalue = this.fetchAppScreen(value);\n\t\t\t}\n\t\t\tif(cb) {\n\t\t\t\tcb(value);\n\t\t\t}\n\t\t\treturn value;\n\t\t},\n\t\t\n\t\tclear: function() {\n\t\t\tlocalStorage.clear();\n\t\t},\n\n\t\t\n\t\tinternalFetch: function(type, id) {\n\t\t\tvar value = lscache.get(this.getKey(type, id));\n\t\t\treturn value;\n\t\t},\n\t\t\n\t\tstoreQueue: [],\n\t\n\t\tflush: function() {\n\t\t\tthis.storeQueue.each(function(f) {\n\t\t\t\tf();\n\t\t\t});\n\t\t\tthis.storeQueue = [];\n\t\t},\n\n\t\tstoreObj: function(obj, work) {\n\t\t\tif(!work) {\n\t\t\t\tthis.storeQueue.push(function() {this.storeObj(obj, true)}.bind(this));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tObject.each(obj, function(v, k) {\n\t\t\t\tif(k == 'app' || k == 'screen') {\n\t\t\t\t\tObject.each(v, function(value, id) {\n\t\t\t\t\t\tthis.storeAppScreen(k, id, value);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t\telse if(k == 'remote' && v.refreshAfter > 0) {\n\t\t\t\t\tObject.each(v, function(value, id) {\n\t\t\t\t\t\tthis.internalStore(k, id, value, v.refreshAfter);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t\telse if(k == 'searchdata') {\n\t\t\t\t\tObject.each(v, function(value, id) {\n\t\t\t\t\t\tthis.internalStore('searchdata', id,value);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t}, this);\n\t\t},\n\t\t\n\t\tstoreAppScreen: function(type, id, obj, db) {\n\t\t\tvar objCopy = {};\n\t\t\tObject.each(obj, function(v, k) {\n\t\t\t\tobjCopy[k] = v;\n\t\t\t});\n\n\t\t\tvar pattern = /img([^>]+?)src=(\"|')(http.+?)\\2/g, pattern2 = /url\\((\"|'|)(http.+?)\\1\\)/g;\n\t\t\tvar handleUrl = function(url) {\n\t\t\t\tif(this.fetch('image', url)) {\n\t\t\t\t\treturn url;\n\t\t\t\t}\n\t\t\t\telse if(appbuilder.app.canGetImageData) {\n\t\t\t\t\tvar uri = new URI(url),\n\t\t\t\t\t\tname = uri.get('file');\n\t\t\t\t\tvar storeImg = function() {\n\t\t\t\t\t\tappbuilder.app.getImageDataURL(url, function(data) {\n\t\t\t\t\t\t\tif(data) {\n\t\t\t\t\t\t\t\tthis.internalStore('image', url, data, db);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this));\n\t\t\t\t\t}.bind(this);\n\t\t\t\t\t//Phonegap export first checks to see if the image is locally available\n\t\t\t\t\tif((this.phone && this.phone.options.files) || appbuilder.app.isPhoneGap) {\n\t\t\t\t\t\tvar im = new Image();\n\t\t\t\t\t\tim.onload = function() {\n\t\t\t\t\t\t\tthis.internalStore('image', url, name, db);\n\t\t\t\t\t\t}.bind(this);\n\t\t\t\t\t\tim.onerror = im.onabort = function() {\n\t\t\t\t\t\t\tstoreImg();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tim.src = name;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tstoreImg();\n\t\t\t\t\t}\n\t\t\t\t\treturn 'appbuilder:' + url;\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}.bind(this);\n\n\t\t\tobjCopy.html = obj.html.replace(pattern, function(match, extra, quote, url) {\n\t\t\t\tvar rep = handleUrl(url);\n\t\t\t\tif(rep) {\n\t\t\t\t\treturn 'img' + extra + 'src=' + quote + rep + quote;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t}).replace(pattern2, function(match, quote, url) {\n\t\t\t\tvar rep = handleUrl(url);\n\t\t\t\tif(rep) {\n\t\t\t\t\treturn 'url(' + quote + rep + quote + ')';\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\tthis.internalStore(type, id, objCopy, db);\n\t\t},\n\n\t\tfetchAppScreen: function(obj, db) {\n\t\t\tvar objCopy = {};\n\t\t\tObject.each(obj, function(v, k) {\n\t\t\t\tobjCopy[k] = v;\n\t\t\t});\n\n\t\t\tvar pattern = /img([^>]+?)src=(\"|')appbuilder:(.+?)\\2/g, pattern2 = /url\\((\"|'|)appbuilder:(.+?)\\1\\)/g;\n\t\t\tobjCopy.html = objCopy.html.replace(pattern, function(match, extra, quote, name) {\n\t\t\t\tvar data = this.internalFetch('image', name, db);\n\t\t\t\treturn 'img' + extra + 'src=' + quote + (data || name) + quote;\n\t\t\t}.bind(this)).replace(pattern2, function(match, quote, name) {\n\t\t\t\tvar data = this.internalFetch('image', name, db);\n\t\t\t\treturn 'url(' + quote + (data || name) + quote + ')';\n\t\t\t}.bind(this));\n\n\t\t\treturn objCopy;\n\t\t}\n\t};\n\t\n\tappbuilder.app.LocalStorage.getKey = appbuilder.app.Storage.getKey;\n}\n","appbuilder = window.appbuilder || {};\nappbuilder.app = appbuilder.app || {};\nappbuilder.app.sound = (function() {\n\t/* Dection code thanks to Modernizr 2.6.2 (Custom Build) | MIT & BSD\n\t* Build: http://modernizr.com/download/#-audio\n\t*/\n\tvar support = function() {\n var elem = document.createElement('audio'),\n bool = false;\n\n try {\n if ( bool = !!elem.canPlayType ) {\n bool = new Boolean(bool);\n bool.ogg = elem.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/,'');\n bool.mp3 = elem.canPlayType('audio/mpeg;') .replace(/^no$/,'');\n\n bool.wav = elem.canPlayType('audio/wav; codecs=\"1\"') .replace(/^no$/,'');\n bool.m4a = ( elem.canPlayType('audio/x-m4a;') ||\n elem.canPlayType('audio/aac;')) .replace(/^no$/,'');\n }\n } catch(e) { }\n\n return bool;\n }();\n\tif(support) {\n\t\tvar audios = [];\n\t\treturn {\n\t\t\tsupport: support,\n\t\t\tplay: function(url) {\n\t\t\t\tvar a = new Audio(url);\n\t\t\t\taudios.push(a);\n\t\t\t\ta.addEventListener('ended', function() {\n\t\t\t\t\taudios.erase(a);\n\t\t\t\t});\n\t\t\t\ta.play();\n\t\t\t\treturn a;\n\t\t\t},\n\t\t\tstop: function(a) {\n\t\t\t\ta.pause();\n\t\t\t\ta.src = '';\n\t\t\t\taudios.erase(a);\n\t\t\t},\n\t\t\tstopAll: function() {\n\t\t\t\taudios.each(function(a) {\n\t\t\t\t\ta.pause();\n\t\t\t\t\ta.src = '';\n\t\t\t\t});\n\t\t\t\taudios = [];\n\t\t\t}\n\t\t};\n\t}\n\telse {\n\t\treturn {\n\t\t\tsupport: false,\n\t\t\tplay: function() {\n\t\t\t\treturn false;\n\t\t\t},\n\t\t\tstop: function() {},\n\t\t\tstopAll: function() {}\n\t\t};\n\t}\n})();\n","/*!\n * Add to Homescreen v2.0.11 ~ Copyright (c) 2013 Matteo Spinelli, http://cubiq.org\n * Released under MIT license, http://cubiq.org/license\n */\nvar addToHome = (function (w) {\n\tvar nav = w.navigator,\n\t\tisIDevice = 'platform' in nav && (/iphone|ipod|ipad/gi).test(nav.platform),\n\t\tisIPad,\n\t\tisRetina,\n\t\tisSafari,\n\t\tisStandalone,\n\t\tOSVersion,\n\t\tstartX = 0,\n\t\tstartY = 0,\n\t\tlastVisit = 0,\n\t\tisExpired,\n\t\tisSessionActive,\n\t\tisReturningVisitor,\n\t\tballoon,\n\t\toverrideChecks,\n\n\t\tpositionInterval,\n\t\tcloseTimeout,\n\n\t\toptions = {\n\t\t\tautostart: true,\t\t\t// Automatically open the balloon\n\t\t\treturningVisitor: true,\t// Show the balloon to returning visitors only (setting this to true is highly recommended)\n\t\t\tanimationIn: 'drop',\t\t// drop || bubble || fade\n\t\t\tanimationOut: 'fade',\t\t// drop || bubble || fade\n\t\t\tstartDelay: 2000,\t\t\t// 2 seconds from page load before the balloon appears\n\t\t\tlifespan: 15000,\t\t\t// 15 seconds before it is automatically destroyed\n\t\t\tbottomOffset: 14,\t\t\t// Distance of the balloon from bottom\n\t\t\texpire: 10080,\t\t\t\t\t// Minutes to wait before showing the popup again (0 = always displayed)\n\t\t\tmessage: '',\t\t\t\t// Customize your message or force a language ('' = automatic)\n\t\t\ttouchIcon: true,\t\t\t// Display the touch icon\n\t\t\tarrow: true,\t\t\t\t// Display the balloon arrow\n\t\t\thookOnLoad: true,\t\t\t// Should we hook to onload event? (really advanced usage)\n\t\t\tcloseButton: true,\t\t\t// Let the user close the balloon\n\t\t\titerations: 100\t\t\t\t// Internal/debug use\n\t\t},\n\n\t\tintl = {\n\t\t\tar: 'قم بتثبيت هذا التطبيق على %device:انقر%icon ،ثم اضفه الى الشاشة الرئيسية.',\n\t\t\tca_es: 'Per instal·lar aquesta aplicació al vostre %device premeu %icon i llavors Afegir a pantalla d\\'inici.',\n\t\t\tcs_cz: 'Pro instalaci aplikace na Váš %device, stiskněte %icon a v nabídce Přidat na plochu.',\n\t\t\tda_dk: 'Tilføj denne side til din %device: tryk på %icon og derefter Føj til hjemmeskærm.',\n\t\t\tde_de: 'Installieren Sie diese App auf Ihrem %device: %icon antippen und dann Zum Home-Bildschirm.',\n\t\t\tel_gr: 'Εγκαταστήσετε αυτήν την Εφαρμογή στήν συσκευή σας %device: %icon μετά πατάτε Προσθήκη σε Αφετηρία.',\n\t\t\ten_us: 'Install this web app on your %device: tap %icon and then Add to Home Screen.',\n\t\t\tes_es: 'Para instalar esta app en su %device, pulse %icon y seleccione Añadir a pantalla de inicio.',\n\t\t\tfi_fi: 'Asenna tämä web-sovellus laitteeseesi %device: paina %icon ja sen jälkeen valitse Lisää Koti-valikkoon.',\n\t\t\tfr_fr: 'Ajoutez cette application sur votre %device en cliquant sur %icon, puis Sur l\\'écran d\\'accueil.',\n\t\t\the_il: 'התקן אפליקציה זו על ה-%device שלך: הקש %icon ואז הוסף למסך הבית.',\n\t\t\thr_hr: 'Instaliraj ovu aplikaciju na svoj %device: klikni na %icon i odaberi Dodaj u početni zaslon.',\n\t\t\thu_hu: 'Telepítse ezt a web-alkalmazást az Ön %device-jára: nyomjon a %icon-ra majd a Főképernyőhöz adás gombra.',\n\t\t\tit_it: 'Installa questa applicazione sul tuo %device: premi su %icon e poi Aggiungi a Home.',\n\t\t\tja_jp: 'このウェブアプリをあなたの%deviceにインストールするには%iconをタップしてホーム画面に追加を選んでください。',\n\t\t\tko_kr: '%device에 웹앱을 설치하려면 %icon을 터치 후 \"홈화면에 추가\"를 선택하세요',\n\t\t\tnb_no: 'Installer denne appen på din %device: trykk på %icon og deretter Legg til på Hjem-skjerm',\n\t\t\tnl_nl: 'Installeer deze webapp op uw %device: tik %icon en dan Voeg toe aan beginscherm.',\n\t\t\tpl_pl: 'Aby zainstalować tę aplikacje na %device: naciśnij %icon a następnie Dodaj jako ikonę.',\n\t\t\tpt_br: 'Instale este aplicativo em seu %device: aperte %icon e selecione Adicionar à Tela Inicio.',\n\t\t\tpt_pt: 'Para instalar esta aplicação no seu %device, prima o %icon e depois em Adicionar ao ecrã principal.',\n\t\t\tru_ru: 'Установите это веб-приложение на ваш %device: нажмите %icon, затем Добавить в «Домой».',\n\t\t\tsv_se: 'Lägg till denna webbapplikation på din %device: tryck på %icon och därefter Lägg till på hemskärmen.',\n\t\t\tth_th: 'ติดตั้งเว็บแอพฯ นี้บน %device ของคุณ: แตะ %icon และ เพิ่มที่หน้าจอโฮม',\n\t\t\ttr_tr: 'Bu uygulamayı %device\\'a eklemek için %icon simgesine sonrasında Ana Ekrana Ekle düğmesine basın.',\n\t\t\tuk_ua: 'Встановіть цей веб сайт на Ваш %device: натисніть %icon, а потім На початковий екран.',\n\t\t\tzh_cn: '您可以将此应用安装到您的 %device 上。请按 %icon 然后选择添加至主屏幕。',\n\t\t\tzh_tw: '您可以將此應用程式安裝到您的 %device 上。請按 %icon 然後點選加入主畫面螢幕。'\n\t\t};\n\n\tfunction init () {\n\t\t// Preliminary check, all further checks are performed on iDevices only\n\t\tif ( !isIDevice ) return;\n\n\t\tvar now = Date.now(),\n\t\t\ti;\n\n\t\t// Merge local with global options\n\t\tif ( w.addToHomeConfig ) {\n\t\t\tfor ( i in w.addToHomeConfig ) {\n\t\t\t\toptions[i] = w.addToHomeConfig[i];\n\t\t\t}\n\t\t}\n\t\tif ( !options.autostart ) options.hookOnLoad = false;\n\n\t\tisIPad = (/ipad/gi).test(nav.platform);\n\t\tisRetina = w.devicePixelRatio && w.devicePixelRatio > 1;\n\t\tisSafari = (/Safari/i).test(nav.appVersion) && !(/CriOS/i).test(nav.appVersion);\n\t\tisStandalone = nav.standalone;\n\t\tOSVersion = nav.appVersion.match(/OS (\\d+_\\d+)/i);\n\t\tOSVersion = OSVersion && OSVersion[1] ? +OSVersion[1].replace('_', '.') : 0;\n\n\t\tlastVisit = +w.localStorage.getItem('addToHome');\n\n\t\tisSessionActive = w.sessionStorage.getItem('addToHomeSession');\n\t\tisReturningVisitor = options.returningVisitor ? lastVisit && lastVisit + 28*24*60*60*1000 > now : true;\n\n\t\tif ( !lastVisit ) lastVisit = now;\n\n\t\t// If it is expired we need to reissue a new balloon\n\t\tisExpired = isReturningVisitor && lastVisit <= now;\n\n\t\tif ( options.hookOnLoad ) w.addEventListener('load', loaded, false);\n\t\telse if ( !options.hookOnLoad && options.autostart ) loaded();\n\t}\n\n\tfunction loaded () {\n\t\tw.removeEventListener('load', loaded, false);\n\n\t\tif ( !isReturningVisitor ) w.localStorage.setItem('addToHome', Date.now());\n\t\telse if ( options.expire && isExpired ) w.localStorage.setItem('addToHome', Date.now() + options.expire * 60000);\n\n\t\tif ( !overrideChecks && ( !isSafari || !isExpired || isSessionActive || isStandalone || !isReturningVisitor ) ) return;\n\n\t\tvar touchIcon = '',\n\t\t\tplatform = nav.platform.split(' ')[0],\n\t\t\tlanguage = nav.language.replace('-', '_');\n\n\t\tballoon = document.createElement('div');\n\t\tballoon.id = 'addToHomeScreen';\n\t\tballoon.style.cssText += 'left:-9999px;-webkit-transition-property:-webkit-transform,opacity;-webkit-transition-duration:0;-webkit-transform:translate3d(0,0,0);position:' + (OSVersion < 5 ? 'absolute' : 'fixed');\n\n\t\t// Localize message\n\t\tif ( options.message in intl ) {\t\t// You may force a language despite the user's locale\n\t\t\tlanguage = options.message;\n\t\t\toptions.message = '';\n\t\t}\n\t\tif ( options.message === '' ) {\t\t\t// We look for a suitable language (defaulted to en_us)\n\t\t\toptions.message = language in intl ? intl[language] : intl['en_us'];\n\t\t}\n\n\t\tif ( options.touchIcon ) {\n\t\t\ttouchIcon = isRetina ?\n\t\t\t\tdocument.querySelector('head link[rel^=apple-touch-icon][sizes=\"114x114\"],head link[rel^=apple-touch-icon][sizes=\"144x144\"],head link[rel^=apple-touch-icon]') :\n\t\t\t\tdocument.querySelector('head link[rel^=apple-touch-icon][sizes=\"57x57\"],head link[rel^=apple-touch-icon]');\n\n\t\t\tif ( touchIcon ) {\n\t\t\t\ttouchIcon = '';\n\t\t\t}\n\t\t}\n\n\t\tballoon.className = (OSVersion >=7 ? 'addToHomeIOS7 ' : '') + (isIPad ? 'addToHomeIpad' : 'addToHomeIphone') + (touchIcon ? ' addToHomeWide' : '');\n\t\tballoon.innerHTML = touchIcon +\n\t\t\toptions.message.replace('%device', platform).replace('%icon', OSVersion >= 4.2 ? '' : '+') +\n\t\t\t(options.arrow ? '= 7 && isIPad && touchIcon ? ' style=\"margin-left:-32px\"' : '') + '>' : '') +\n\t\t\t(options.closeButton ? '\\u00D7' : '');\n\n\t\tdocument.body.appendChild(balloon);\n\n\t\t// Add the close action\n\t\tif ( options.closeButton ) balloon.addEventListener('click', clicked, false);\n\n\t\tif ( !isIPad && OSVersion >= 6 ) window.addEventListener('orientationchange', orientationCheck, false);\n\n\t\tsetTimeout(show, options.startDelay);\n\t}\n\n\tfunction show () {\n\t\tvar duration,\n\t\t\tiPadXShift = 208;\n\n\t\t// Set the initial position\n\t\tif ( isIPad ) {\n\t\t\tif ( OSVersion < 5 ) {\n\t\t\t\tstartY = w.scrollY;\n\t\t\t\tstartX = w.scrollX;\n\t\t\t} else if ( OSVersion < 6 ) {\n\t\t\t\tiPadXShift = 160;\n\t\t\t} else if ( OSVersion >= 7 ) {\n\t\t\t\tiPadXShift = 143;\n\t\t\t}\n\n\t\t\tballoon.style.top = startY + options.bottomOffset + 'px';\n\t\t\tballoon.style.left = Math.max(startX + iPadXShift - Math.round(balloon.offsetWidth / 2), 9) + 'px';\n\n\t\t\tswitch ( options.animationIn ) {\n\t\t\t\tcase 'drop':\n\t\t\t\t\tduration = '0.6s';\n\t\t\t\t\tballoon.style.webkitTransform = 'translate3d(0,' + -(w.scrollY + options.bottomOffset + balloon.offsetHeight) + 'px,0)';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'bubble':\n\t\t\t\t\tduration = '0.6s';\n\t\t\t\t\tballoon.style.opacity = '0';\n\t\t\t\t\tballoon.style.webkitTransform = 'translate3d(0,' + (startY + 50) + 'px,0)';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tduration = '1s';\n\t\t\t\t\tballoon.style.opacity = '0';\n\t\t\t}\n\t\t} else {\n\t\t\tstartY = w.innerHeight + w.scrollY;\n\n\t\t\tif ( OSVersion < 5 ) {\n\t\t\t\tstartX = Math.round((w.innerWidth - balloon.offsetWidth) / 2) + w.scrollX;\n\t\t\t\tballoon.style.left = startX + 'px';\n\t\t\t\tballoon.style.top = startY - balloon.offsetHeight - options.bottomOffset + 'px';\n\t\t\t} else {\n\t\t\t\tballoon.style.left = '50%';\n\t\t\t\tballoon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 && OSVersion < 7 ? 40 : 0 ) + 'px';\n\t\t\t\tballoon.style.bottom = options.bottomOffset + 'px';\n\t\t\t}\n\n\t\t\tswitch (options.animationIn) {\n\t\t\t\tcase 'drop':\n\t\t\t\t\tduration = '1s';\n\t\t\t\t\tballoon.style.webkitTransform = 'translate3d(0,' + -(startY + options.bottomOffset) + 'px,0)';\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'bubble':\n\t\t\t\t\tduration = '0.6s';\n\t\t\t\t\tballoon.style.webkitTransform = 'translate3d(0,' + (balloon.offsetHeight + options.bottomOffset + 50) + 'px,0)';\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tduration = '1s';\n\t\t\t\t\tballoon.style.opacity = '0';\n\t\t\t}\n\t\t}\n\n\t\tballoon.offsetHeight;\t// repaint trick\n\t\tballoon.style.webkitTransitionDuration = duration;\n\t\tballoon.style.opacity = '1';\n\t\tballoon.style.webkitTransform = 'translate3d(0,0,0)';\n\t\tballoon.addEventListener('webkitTransitionEnd', transitionEnd, false);\n\n\t\tcloseTimeout = setTimeout(close, options.lifespan);\n\t}\n\n\tfunction manualShow (override) {\n\t\tif ( !isIDevice || balloon ) return;\n\n\t\toverrideChecks = override;\n\t\tloaded();\n\t}\n\n\tfunction close () {\n\t\tclearInterval( positionInterval );\n\t\tclearTimeout( closeTimeout );\n\t\tcloseTimeout = null;\n\n\t\t// check if the popup is displayed and prevent errors\n\t\tif ( !balloon ) return;\n\n\t\tvar posY = 0,\n\t\t\tposX = 0,\n\t\t\topacity = '1',\n\t\t\tduration = '0';\n\n\t\tif ( options.closeButton ) balloon.removeEventListener('click', clicked, false);\n\t\tif ( !isIPad && OSVersion >= 6 ) window.removeEventListener('orientationchange', orientationCheck, false);\n\n\t\tif ( OSVersion < 5 ) {\n\t\t\tposY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY;\n\t\t\tposX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth)/2) - startX;\n\t\t}\n\n\t\tballoon.style.webkitTransitionProperty = '-webkit-transform,opacity';\n\n\t\tswitch ( options.animationOut ) {\n\t\t\tcase 'drop':\n\t\t\t\tif ( isIPad ) {\n\t\t\t\t\tduration = '0.4s';\n\t\t\t\t\topacity = '0';\n\t\t\t\t\tposY += 50;\n\t\t\t\t} else {\n\t\t\t\t\tduration = '0.6s';\n\t\t\t\t\tposY += balloon.offsetHeight + options.bottomOffset + 50;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'bubble':\n\t\t\t\tif ( isIPad ) {\n\t\t\t\t\tduration = '0.8s';\n\t\t\t\t\tposY -= balloon.offsetHeight + options.bottomOffset + 50;\n\t\t\t\t} else {\n\t\t\t\t\tduration = '0.4s';\n\t\t\t\t\topacity = '0';\n\t\t\t\t\tposY -= 50;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tduration = '0.8s';\n\t\t\t\topacity = '0';\n\t\t}\n\n\t\tballoon.addEventListener('webkitTransitionEnd', transitionEnd, false);\n\t\tballoon.style.opacity = opacity;\n\t\tballoon.style.webkitTransitionDuration = duration;\n\t\tballoon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)';\n\t}\n\n\n\tfunction clicked () {\n\t\tw.sessionStorage.setItem('addToHomeSession', '1');\n\t\tisSessionActive = true;\n\t\tclose();\n\t}\n\n\tfunction transitionEnd () {\n\t\tballoon.removeEventListener('webkitTransitionEnd', transitionEnd, false);\n\n\t\tballoon.style.webkitTransitionProperty = '-webkit-transform';\n\t\tballoon.style.webkitTransitionDuration = '0.2s';\n\n\t\t// We reached the end!\n\t\tif ( !closeTimeout ) {\n\t\t\tballoon.parentNode.removeChild(balloon);\n\t\t\tballoon = null;\n\t\t\treturn;\n\t\t}\n\n\t\t// On iOS 4 we start checking the element position\n\t\tif ( OSVersion < 5 && closeTimeout ) positionInterval = setInterval(setPosition, options.iterations);\n\t}\n\n\tfunction setPosition () {\n\t\tvar matrix = new WebKitCSSMatrix(w.getComputedStyle(balloon, null).webkitTransform),\n\t\t\tposY = isIPad ? w.scrollY - startY : w.scrollY + w.innerHeight - startY,\n\t\t\tposX = isIPad ? w.scrollX - startX : w.scrollX + Math.round((w.innerWidth - balloon.offsetWidth) / 2) - startX;\n\n\t\t// Screen didn't move\n\t\tif ( posY == matrix.m42 && posX == matrix.m41 ) return;\n\n\t\tballoon.style.webkitTransform = 'translate3d(' + posX + 'px,' + posY + 'px,0)';\n\t}\n\n\t// Clear local and session storages (this is useful primarily in development)\n\tfunction reset () {\n\t\tw.localStorage.removeItem('addToHome');\n\t\tw.sessionStorage.removeItem('addToHomeSession');\n\t}\n\n\tfunction orientationCheck () {\n\t\tballoon.style.marginLeft = -Math.round(balloon.offsetWidth / 2) - ( w.orientation%180 && OSVersion >= 6 && OSVersion < 7 ? 40 : 0 ) + 'px';\n\t}\n\n\t// Bootstrap!\n\tinit();\n\n\treturn {\n\t\tshow: manualShow,\n\t\tclose: close,\n\t\treset: reset\n\t};\n})(window);\n","if (window.applicationCache) {\n window.addEvent('domready', function() {\n var updateEl = new Element('div', {'id': 'phone-cache-progress'}), startUpdate, diff;\n \n\t\twindow.applicationCache.addEventListener('updateready', function(e) {\n\t\t\tappbuilder.app.debug('cache', 'update', e);\n\t\t\tif (window.applicationCache.status == window.applicationCache.UPDATEREADY) {\n\t\t\t\t// Browser downloaded a new app cache.\n\t\t\t\t// Swap it in and reload the page to get the new hotness.\n\t\t\t\ttry {\n\t\t\t\t\twindow.applicationCache.swapCache();\n\t\t\t\t}\n\t\t\t\tcatch(err) {\n\t\t\t\t\tappbuilder.app.debug('cache', 'swap', err);\n\t\t\t\t}\n setTimeout(function() {\n appbuilder.app.confirm('New version of the app is available. Update the app?', function(c) {\n if(c) {\n window.location.reload();\n }\n });\n }, (diff = new Date() - (startUpdate || new Date())) > 15000 ? 0 : 15000 - diff);\n\t\t\t} else {\n\t\t\t// Manifest didn't changed. Nothing new to server.\n\t\t\t}\n\t\t}, false);\n\t\twindow.applicationCache.addEventListener('downloading', function() {\n updateEl.inject(document.body);\n\t\t\tappbuilder.app.debug('cache', 'downloading');\n\t\t\tappbuilder.app.alert('Downloading updates to app');\n startUpdate = new Date();\n\t\t}, false);\n\t\twindow.applicationCache.addEventListener('noupdate', function() {\n\t\t\tappbuilder.app.debug('cache', 'noupdate');\n\t\t}, false);\n\t\twindow.applicationCache.addEventListener('progress', function(e) {\n var progress = (e.loaded / e.total) * 100;\n updateEl.setStyles({width: progress + '%'});\n\t\t\tappbuilder.app.debug('cache', 'progress', progress, e);\n\t\t}, false);\n\t\twindow.applicationCache.addEventListener('cached', function() {\n\t\t\tupdateEl.remove();\n appbuilder.app.debug('cache', 'cached');\n\t\t\tappbuilder.app.alert('App is now available offline');\n\t\t}, false);\n\t\twindow.applicationCache.addEventListener('error', function(e) {\n updateEl.remove();\n\t\t\tappbuilder.app.debug('cache', 'error', e);\n\t\t}, false);\n\t});\n}"]}