2008-06-06 15:37:22 +00:00
var Prototype = { Version : '1.6.0.1' , Browser : { IE : ! ! ( window . attachEvent && ! window . opera ) , Opera : ! ! window . opera , WebKit : navigator . userAgent . indexOf ( 'AppleWebKit/' ) > - 1 , Gecko : navigator . userAgent . indexOf ( 'Gecko' ) > - 1 && navigator . userAgent . indexOf ( 'KHTML' ) == - 1 , MobileSafari : ! ! navigator . userAgent . match ( /Apple.*Mobile.*Safari/ ) } , BrowserFeatures : { XPath : ! ! document . evaluate , ElementExtensions : ! ! window . HTMLElement , SpecificElementExtensions : document . createElement ( 'div' ) . _ _proto _ _ && document . createElement ( 'div' ) . _ _proto _ _ !== document . createElement ( 'form' ) . _ _proto _ _ } , ScriptFragment : '<script[^>]*>([\\S\\s]*?)<\/script>' , JSONFilter : /^\/\*-secure-([\s\S]*)\*\/\s*$/ , emptyFunction : function ( ) { } , K : function ( x ) { return x } } ; if ( Prototype . Browser . MobileSafari )
Prototype . BrowserFeatures . SpecificElementExtensions = false ; var Class = { create : function ( ) { var parent = null , properties = $A ( arguments ) ; if ( Object . isFunction ( properties [ 0 ] ) )
parent = properties . shift ( ) ; function klass ( ) { this . initialize . apply ( this , arguments ) ; }
Object . extend ( klass , Class . Methods ) ; klass . superclass = parent ; klass . subclasses = [ ] ; if ( parent ) { var subclass = function ( ) { } ; subclass . prototype = parent . prototype ; klass . prototype = new subclass ; parent . subclasses . push ( klass ) ; }
for ( var i = 0 ; i < properties . length ; i ++ )
klass . addMethods ( properties [ i ] ) ; if ( ! klass . prototype . initialize )
klass . prototype . initialize = Prototype . emptyFunction ; klass . prototype . constructor = klass ; return klass ; } } ; Class . Methods = { addMethods : function ( source ) { var ancestor = this . superclass && this . superclass . prototype ; var properties = Object . keys ( source ) ; if ( ! Object . keys ( { toString : true } ) . length )
properties . push ( "toString" , "valueOf" ) ; for ( var i = 0 , length = properties . length ; i < length ; i ++ ) { var property = properties [ i ] , value = source [ property ] ; if ( ancestor && Object . isFunction ( value ) && value . argumentNames ( ) . first ( ) == "$super" ) { var method = value , value = Object . extend ( ( function ( m ) { return function ( ) { return ancestor [ m ] . apply ( this , arguments ) } ; } ) ( property ) . wrap ( method ) , { valueOf : function ( ) { return method } , toString : function ( ) { return method . toString ( ) } } ) ; }
this . prototype [ property ] = value ; }
return this ; } } ; var Abstract = { } ; Object . extend = function ( destination , source ) { for ( var property in source )
destination [ property ] = source [ property ] ; return destination ; } ; Object . extend ( Object , { inspect : function ( object ) { try { if ( Object . isUndefined ( object ) ) return 'undefined' ; if ( object === null ) return 'null' ; return object . inspect ? object . inspect ( ) : object . toString ( ) ; } catch ( e ) { if ( e instanceof RangeError ) return '...' ; throw e ; } } , toJSON : function ( object ) { var type = typeof object ; switch ( type ) { case 'undefined' : case 'function' : case 'unknown' : return ; case 'boolean' : return object . toString ( ) ; }
if ( object === null ) return 'null' ; if ( object . toJSON ) return object . toJSON ( ) ; if ( Object . isElement ( object ) ) return ; var results = [ ] ; for ( var property in object ) { var value = Object . toJSON ( object [ property ] ) ; if ( ! Object . isUndefined ( value ) )
results . push ( property . toJSON ( ) + ': ' + value ) ; }
return '{' + results . join ( ', ' ) + '}' ; } , toQueryString : function ( object ) { return $H ( object ) . toQueryString ( ) ; } , toHTML : function ( object ) { return object && object . toHTML ? object . toHTML ( ) : String . interpret ( object ) ; } , keys : function ( object ) { var keys = [ ] ; for ( var property in object )
keys . push ( property ) ; return keys ; } , values : function ( object ) { var values = [ ] ; for ( var property in object )
values . push ( object [ property ] ) ; return values ; } , clone : function ( object ) { return Object . extend ( { } , object ) ; } , isElement : function ( object ) { return object && object . nodeType == 1 ; } , isArray : function ( object ) { return object && object . constructor === Array ; } , isHash : function ( object ) { return object instanceof Hash ; } , isFunction : function ( object ) { return typeof object == "function" ; } , isString : function ( object ) { return typeof object == "string" ; } , isNumber : function ( object ) { return typeof object == "number" ; } , isUndefined : function ( object ) { return typeof object == "undefined" ; } } ) ; Object . extend ( Function . prototype , { argumentNames : function ( ) { var names = this . toString ( ) . match ( /^[\s\(]*function[^(]*\((.*?)\)/ ) [ 1 ] . split ( "," ) . invoke ( "strip" ) ; return names . length == 1 && ! names [ 0 ] ? [ ] : names ; } , bind : function ( ) { if ( arguments . length < 2 && Object . isUndefined ( arguments [ 0 ] ) ) return this ; var _ _method = this , args = $A ( arguments ) , object = args . shift ( ) ; return function ( ) { return _ _method . apply ( object , args . concat ( $A ( arguments ) ) ) ; } } , bindAsEventListener : function ( ) { var _ _method = this , args = $A ( arguments ) , object = args . shift ( ) ; return function ( event ) { return _ _method . apply ( object , [ event || window . event ] . concat ( args ) ) ; } } , curry : function ( ) { if ( ! arguments . length ) return this ; var _ _method = this , args = $A ( arguments ) ; return function ( ) { return _ _method . apply ( this , args . concat ( $A ( arguments ) ) ) ; } } , delay : function ( ) { var _ _method = this , args = $A ( arguments ) , timeout = args . shift ( ) * 1000 ; return window . setTimeout ( function ( ) { return _ _method . apply ( _ _method , args ) ; } , timeout ) ; } , wrap : function ( wrapper ) { var _ _method = this ; return function ( ) { return wrapper . apply ( this , [ _ _method . bind ( this ) ] . concat ( $A ( arguments ) ) ) ; } } , methodize : function ( ) { if ( this . _methodized ) return this . _methodized ; var _ _method = this ; return this . _methodized = function ( ) { return _ _method . apply ( null , [ this ] . concat ( $A ( arguments ) ) ) ; } ; } } ) ; Function . prototype . defer = Function . prototype . delay . curry ( 0.01 ) ; Date . prototype . toJSON = function ( ) { return '"' + this . getUTCFullYear ( ) + '-' +
( this . getUTCMonth ( ) + 1 ) . toPaddedString ( 2 ) + '-' +
this . getUTCDate ( ) . toPaddedString ( 2 ) + 'T' +
this . getUTCHours ( ) . toPaddedString ( 2 ) + ':' +
this . getUTCMinutes ( ) . toPaddedString ( 2 ) + ':' +
this . getUTCSeconds ( ) . toPaddedString ( 2 ) + 'Z"' ; } ; var Try = { these : function ( ) { var returnValue ; for ( var i = 0 , length = arguments . length ; i < length ; i ++ ) { var lambda = arguments [ i ] ; try { returnValue = lambda ( ) ; break ; } catch ( e ) { } }
return returnValue ; } } ; RegExp . prototype . match = RegExp . prototype . test ; RegExp . escape = function ( str ) { return String ( str ) . replace ( /([.*+?^=!:${}()|[\]\/\\])/g , '\\$1' ) ; } ; var PeriodicalExecuter = Class . create ( { initialize : function ( callback , frequency ) { this . callback = callback ; this . frequency = frequency ; this . currentlyExecuting = false ; this . registerCallback ( ) ; } , registerCallback : function ( ) { this . timer = setInterval ( this . onTimerEvent . bind ( this ) , this . frequency * 1000 ) ; } , execute : function ( ) { this . callback ( this ) ; } , stop : function ( ) { if ( ! this . timer ) return ; clearInterval ( this . timer ) ; this . timer = null ; } , onTimerEvent : function ( ) { if ( ! this . currentlyExecuting ) { try { this . currentlyExecuting = true ; this . execute ( ) ; } finally { this . currentlyExecuting = false ; } } } } ) ; Object . extend ( String , { interpret : function ( value ) { return value == null ? '' : String ( value ) ; } , specialChar : { '\b' : '\\b' , '\t' : '\\t' , '\n' : '\\n' , '\f' : '\\f' , '\r' : '\\r' , '\\' : '\\\\' } } ) ; Object . extend ( String . prototype , { gsub : function ( pattern , replacement ) { var result = '' , source = this , match ; replacement = arguments . callee . prepareReplacement ( replacement ) ; while ( source . length > 0 ) { if ( match = source . match ( pattern ) ) { result += source . slice ( 0 , match . index ) ; result += String . interpret ( replacement ( match ) ) ; source = source . slice ( match . index + match [ 0 ] . length ) ; } else { result += source , source = '' ; } }
return result ; } , sub : function ( pattern , replacement , count ) { replacement = this . gsub . prepareReplacement ( replacement ) ; count = Object . isUndefined ( count ) ? 1 : count ; return this . gsub ( pattern , function ( match ) { if ( -- count < 0 ) return match [ 0 ] ; return replacement ( match ) ; } ) ; } , scan : function ( pattern , iterator ) { this . gsub ( pattern , iterator ) ; return String ( this ) ; } , truncate : function ( length , truncation ) { length = length || 30 ; truncation = Object . isUndefined ( truncation ) ? '...' : truncation ; return this . length > length ? this . slice ( 0 , length - truncation . length ) + truncation : String ( this ) ; } , strip : function ( ) { return this . replace ( /^\s+/ , '' ) . replace ( /\s+$/ , '' ) ; } , stripTags : function ( ) { return this . replace ( /<\/?[^>]+>/gi , '' ) ; } , stripScripts : function ( ) { return this . replace ( new RegExp ( Prototype . ScriptFragment , 'img' ) , '' ) ; } , extractScripts : function ( ) { var matchAll = new RegExp ( Prototype . ScriptFragment , 'img' ) ; var matchOne = new RegExp ( Prototype . ScriptFragment , 'im' ) ; return ( this . match ( matchAll ) || [ ] ) . map ( function ( scriptTag ) { return ( scriptTag . match ( matchOne ) || [ '' , '' ] ) [ 1 ] ; } ) ; } , evalScripts : function ( ) { return this . extractScripts ( ) . map ( function ( script ) { return eval ( script ) } ) ; } , escapeHTML : function ( ) { var self = arguments . callee ; self . text . data = this ; return self . div . innerHTML ; } , unescapeHTML : function ( ) { var div = new Element ( 'div' ) ; div . innerHTML = this . stripTags ( ) ; return div . childNodes [ 0 ] ? ( div . childNodes . length > 1 ? $A ( div . childNodes ) . inject ( '' , function ( memo , node ) { return memo + node . nodeValue } ) : div . childNodes [ 0 ] . nodeValue ) : '' ; } , toQueryParams : function ( separator ) { var match = this . strip ( ) . match ( /([^?#]*)(#.*)?$/ ) ; if ( ! match ) return { } ; return match [ 1 ] . split ( separator || '&' ) . inject ( { } , function ( hash , pair ) { if ( ( pair = pair . split ( '=' ) ) [ 0 ] ) { var key = decodeURIComponent ( pair . shift ( ) ) ; var value = pair . length > 1 ? pair . join ( '=' ) : pair [ 0 ] ; if ( value != undefined ) value = decodeURIComponent ( value ) ; if ( key in hash ) { if ( ! Object . isArray ( hash [ key ] ) ) hash [ key ] = [ hash [ key ] ] ; hash [ key ] . push ( value ) ; }
else hash [ key ] = value ; }
return hash ; } ) ; } , toArray : function ( ) { return this . split ( '' ) ; } , succ : function ( ) { return this . slice ( 0 , this . length - 1 ) +
String . fromCharCode ( this . charCodeAt ( this . length - 1 ) + 1 ) ; } , times : function ( count ) { return count < 1 ? '' : new Array ( count + 1 ) . join ( this ) ; } , camelize : function ( ) { var parts = this . split ( '-' ) , len = parts . length ; if ( len == 1 ) return parts [ 0 ] ; var camelized = this . charAt ( 0 ) == '-' ? parts [ 0 ] . charAt ( 0 ) . toUpperCase ( ) + parts [ 0 ] . substring ( 1 ) : parts [ 0 ] ; for ( var i = 1 ; i < len ; i ++ )
camelized += parts [ i ] . charAt ( 0 ) . toUpperCase ( ) + parts [ i ] . substring ( 1 ) ; return camelized ; } , capitalize : function ( ) { return this . charAt ( 0 ) . toUpperCase ( ) + this . substring ( 1 ) . toLowerCase ( ) ; } , underscore : function ( ) { return this . gsub ( /::/ , '/' ) . gsub ( /([A-Z]+)([A-Z][a-z])/ , '#{1}_#{2}' ) . gsub ( /([a-z\d])([A-Z])/ , '#{1}_#{2}' ) . gsub ( /-/ , '_' ) . toLowerCase ( ) ; } , dasherize : function ( ) { return this . gsub ( /_/ , '-' ) ; } , inspect : function ( useDoubleQuotes ) { var escapedString = this . gsub ( /[\x00-\x1f\\]/ , function ( match ) { var character = String . specialChar [ match [ 0 ] ] ; return character ? character : '\\u00' + match [ 0 ] . charCodeAt ( ) . toPaddedString ( 2 , 16 ) ; } ) ; if ( useDoubleQuotes ) return '"' + escapedString . replace ( /"/g , '\\"' ) + '"' ; return "'" + escapedString . replace ( /'/g , '\\\'' ) + "'" ; } , toJSON : function ( ) { return this . inspect ( true ) ; } , unfilterJSON : function ( filter ) { return this . sub ( filter || Prototype . JSONFilter , '#{1}' ) ; } , isJSON : function ( ) { var str = this ; if ( str . blank ( ) ) return false ; str = this . replace ( /\\./g , '@' ) . replace ( /"[^"\\\n\r]*"/g , '' ) ; return ( /^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/ ) . test ( str ) ; } , evalJSON : function ( sanitize ) { var json = this . unfilterJSON ( ) ; try { if ( ! sanitize || json . isJSON ( ) ) return eval ( '(' + json + ')' ) ; } catch ( e ) { }
throw new SyntaxError ( 'Badly formed JSON string: ' + this . inspect ( ) ) ; } , include : function ( pattern ) { return this . indexOf ( pattern ) > - 1 ; } , startsWith : function ( pattern ) { return this . indexOf ( pattern ) === 0 ; } , endsWith : function ( pattern ) { var d = this . length - pattern . length ; return d >= 0 && this . lastIndexOf ( pattern ) === d ; } , empty : function ( ) { return this == '' ; } , blank : function ( ) { return /^\s*$/ . test ( this ) ; } , interpolate : function ( object , pattern ) { return new Template ( this , pattern ) . evaluate ( object ) ; } } ) ; if ( Prototype . Browser . WebKit || Prototype . Browser . IE ) Object . extend ( String . prototype , { escapeHTML : function ( ) { return this . replace ( /&/g , '&' ) . replace ( /</g , '<' ) . replace ( />/g , '>' ) ; } , unescapeHTML : function ( ) { return this . replace ( /&/g , '&' ) . replace ( /</g , '<' ) . replace ( />/g , '>' ) ; } } ) ; String . prototype . gsub . prepareReplacement = function ( replacement ) { if ( Object . isFunction ( replacement ) ) return replacement ; var template = new Template ( replacement ) ; return function ( match ) { return template . evaluate ( match ) } ; } ; String . prototype . parseQuery = String . prototype . toQueryParams ; Object . extend ( String . prototype . escapeHTML , { div : document . createElement ( 'div' ) , text : document . createTextNode ( '' ) } ) ; with ( String . prototype . escapeHTML ) div . appendChild ( text ) ; var Template = Class . create ( { initialize : function ( template , pattern ) { this . template = template . toString ( ) ; this . pattern = pattern || Template . Pattern ; } , evaluate : function ( object ) { if ( Object . isFunction ( object . toTemplateReplacements ) )
object = object . toTemplateReplacements ( ) ; return this . template . gsub ( this . pattern , function ( match ) { if ( object == null ) return '' ; var before = match [ 1 ] || '' ; if ( before == '\\' ) return match [ 2 ] ; var ctx = object , expr = match [ 3 ] ; var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/ ; match = pattern . exec ( expr ) ; if ( match == null ) return before ; while ( match != null ) { var comp = match [ 1 ] . startsWith ( '[' ) ? match [ 2 ] . gsub ( '\\\\]' , ']' ) : match [ 1 ] ; ctx = ctx [ comp ] ; if ( null == ctx || '' == match [ 3 ] ) break ; expr = expr . substring ( '[' == match [ 3 ] ? match [ 1 ] . length : match [ 0 ] . length ) ; match = pattern . exec ( expr ) ; }
return before + String . interpret ( ctx ) ; } . bind ( this ) ) ; } } ) ; Template . Pattern = /(^|.|\r|\n)(#\{(.*?)\})/ ; var $break = { } ; var Enumerable = { each : function ( iterator , context ) { var index = 0 ; iterator = iterator . bind ( context ) ; try { this . _each ( function ( value ) { iterator ( value , index ++ ) ; } ) ; } catch ( e ) { if ( e != $break ) throw e ; }
return this ; } , eachSlice : function ( number , iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var index = - number , slices = [ ] , array = this . toArray ( ) ; while ( ( index += number ) < array . length )
slices . push ( array . slice ( index , index + number ) ) ; return slices . collect ( iterator , context ) ; } , all : function ( iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var result = true ; this . each ( function ( value , index ) { result = result && ! ! iterator ( value , index ) ; if ( ! result ) throw $break ; } ) ; return result ; } , any : function ( iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var result = false ; this . each ( function ( value , index ) { if ( result = ! ! iterator ( value , index ) )
throw $break ; } ) ; return result ; } , collect : function ( iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var results = [ ] ; this . each ( function ( value , index ) { results . push ( iterator ( value , index ) ) ; } ) ; return results ; } , detect : function ( iterator , context ) { iterator = iterator . bind ( context ) ; var result ; this . each ( function ( value , index ) { if ( iterator ( value , index ) ) { result = value ; throw $break ; } } ) ; return result ; } , findAll : function ( iterator , context ) { iterator = iterator . bind ( context ) ; var results = [ ] ; this . each ( function ( value , index ) { if ( iterator ( value , index ) )
results . push ( value ) ; } ) ; return results ; } , grep : function ( filter , iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var results = [ ] ; if ( Object . isString ( filter ) )
filter = new RegExp ( filter ) ; this . each ( function ( value , index ) { if ( filter . match ( value ) )
results . push ( iterator ( value , index ) ) ; } ) ; return results ; } , include : function ( object ) { if ( Object . isFunction ( this . indexOf ) )
if ( this . indexOf ( object ) != - 1 ) return true ; var found = false ; this . each ( function ( value ) { if ( value == object ) { found = true ; throw $break ; } } ) ; return found ; } , inGroupsOf : function ( number , fillWith ) { fillWith = Object . isUndefined ( fillWith ) ? null : fillWith ; return this . eachSlice ( number , function ( slice ) { while ( slice . length < number ) slice . push ( fillWith ) ; return slice ; } ) ; } , inject : function ( memo , iterator , context ) { iterator = iterator . bind ( context ) ; this . each ( function ( value , index ) { memo = iterator ( memo , value , index ) ; } ) ; return memo ; } , invoke : function ( method ) { var args = $A ( arguments ) . slice ( 1 ) ; return this . map ( function ( value ) { return value [ method ] . apply ( value , args ) ; } ) ; } , max : function ( iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var result ; this . each ( function ( value , index ) { value = iterator ( value , index ) ; if ( result == null || value >= result )
result = value ; } ) ; return result ; } , min : function ( iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var result ; this . each ( function ( value , index ) { value = iterator ( value , index ) ; if ( result == null || value < result )
result = value ; } ) ; return result ; } , partition : function ( iterator , context ) { iterator = iterator ? iterator . bind ( context ) : Prototype . K ; var trues = [ ] , falses = [ ] ; this . each ( function ( value , index ) { ( iterator ( value , index ) ? trues : falses ) . push ( value ) ; } ) ; return [ trues , falses ] ; } , pluck : function ( property ) { var results = [ ] ; this . each ( function ( value ) { results . push ( value [ property ] ) ; } ) ; return results ; } , reject : function ( iterator , context ) { iterator = iterator . bind ( context ) ; var results = [ ] ; this . each ( function ( value , index ) { if ( ! iterator ( value , index ) )
results . push ( value ) ; } ) ; return results ; } , sortBy : function ( iterator , context ) { iterator = iterator . bind ( context ) ; return this . map ( function ( value , index ) { return { value : value , criteria : iterator ( value , index ) } ; } ) . sort ( function ( left , right ) { var a = left . criteria , b = right . criteria ; return a < b ? - 1 : a > b ? 1 : 0 ; } ) . pluck ( 'value' ) ; } , toArray : function ( ) { return this . map ( ) ; } , zip : function ( ) { var iterator = Prototype . K , args = $A ( arguments ) ; if ( Object . isFunction ( args . last ( ) ) )
iterator = args . pop ( ) ; var collections = [ this ] . concat ( args ) . map ( $A ) ; return this . map ( function ( value , index ) { return iterator ( collections . pluck ( index ) ) ; } ) ; } , size : function ( ) { return this . toArray ( ) . length ; } , inspect : function ( ) { return '#<Enumerable:' + this . toArray ( ) . inspect ( ) + '>' ; } } ; Object . extend ( Enumerable , { map : Enumerable . collect , find : Enumerable . detect , select : Enumerable . findAll , filter : Enumerable . findAll , member : Enumerable . include , entries : Enumerable . toArray , every : Enumerable . all , some : Enumerable . any } ) ; function $A ( iterable ) { if ( ! iterable ) return [ ] ; if ( iterable . toArray ) return iterable . toArray ( ) ; var length = iterable . length , results = new Array ( length ) ; while ( length -- ) results [ length ] = iterable [ length ] ; return results ; }
if ( Prototype . Browser . WebKit ) { function $A ( iterable ) { if ( ! iterable ) return [ ] ; if ( ! ( Object . isFunction ( iterable ) && iterable == '[object NodeList]' ) && iterable . toArray ) return iterable . toArray ( ) ; var length = iterable . length , results = new Array ( length ) ; while ( length -- ) results [ length ] = iterable [ length ] ; return results ; } }
Array . from = $A ; Object . extend ( Array . prototype , Enumerable ) ; if ( ! Array . prototype . _reverse ) Array . prototype . _reverse = Array . prototype . reverse ; Object . extend ( Array . prototype , { _each : function ( iterator ) { for ( var i = 0 , length = this . length ; i < length ; i ++ )
iterator ( this [ i ] ) ; } , clear : function ( ) { this . length = 0 ; return this ; } , first : function ( ) { return this [ 0 ] ; } , last : function ( ) { return this [ this . length - 1 ] ; } , compact : function ( ) { return this . select ( function ( value ) { return value != null ; } ) ; } , flatten : function ( ) { return this . inject ( [ ] , function ( array , value ) { return array . concat ( Object . isArray ( value ) ? value . flatten ( ) : [ value ] ) ; } ) ; } , without : function ( ) { var values = $A ( arguments ) ; return this . select ( function ( value ) { return ! values . include ( value ) ; } ) ; } , reverse : function ( inline ) { return ( inline !== false ? this : this . toArray ( ) ) . _reverse ( ) ; } , reduce : function ( ) { return this . length > 1 ? this : this [ 0 ] ; } , uniq : function ( sorted ) { return this . inject ( [ ] , function ( array , value , index ) { if ( 0 == index || ( sorted ? array . last ( ) != value : ! array . include ( value ) ) )
array . push ( value ) ; return array ; } ) ; } , intersect : function ( array ) { return this . uniq ( ) . findAll ( function ( item ) { return array . detect ( function ( value ) { return item === value } ) ; } ) ; } , clone : function ( ) { return [ ] . concat ( this ) ; } , size : function ( ) { return this . length ; } , inspect : function ( ) { return '[' + this . map ( Object . inspect ) . join ( ', ' ) + ']' ; } , toJSON : function ( ) { var results = [ ] ; this . each ( function ( object ) { var value = Object . toJSON ( object ) ; if ( ! Object . isUndefined ( value ) ) results . push ( value ) ; } ) ; return '[' + results . join ( ', ' ) + ']' ; } } ) ; if ( Object . isFunction ( Array . prototype . forEach ) )
Array . prototype . _each = Array . prototype . forEach ; if ( ! Array . prototype . indexOf ) Array . prototype . indexOf = function ( item , i ) { i || ( i = 0 ) ; var length = this . length ; if ( i < 0 ) i = length + i ; for ( ; i < length ; i ++ )
if ( this [ i ] === item ) return i ; return - 1 ; } ; if ( ! Array . prototype . lastIndexOf ) Array . prototype . lastIndexOf = function ( item , i ) { i = isNaN ( i ) ? this . length : ( i < 0 ? this . length + i : i ) + 1 ; var n = this . slice ( 0 , i ) . reverse ( ) . indexOf ( item ) ; return ( n < 0 ) ? n : i - n - 1 ; } ; Array . prototype . toArray = Array . prototype . clone ; function $w ( string ) { if ( ! Object . isString ( string ) ) return [ ] ; string = string . strip ( ) ; return string ? string . split ( /\s+/ ) : [ ] ; }
if ( Prototype . Browser . Opera ) { Array . prototype . concat = function ( ) { var array = [ ] ; for ( var i = 0 , length = this . length ; i < length ; i ++ ) array . push ( this [ i ] ) ; for ( var i = 0 , length = arguments . length ; i < length ; i ++ ) { if ( Object . isArray ( arguments [ i ] ) ) { for ( var j = 0 , arrayLength = arguments [ i ] . length ; j < arrayLength ; j ++ )
array . push ( arguments [ i ] [ j ] ) ; } else { array . push ( arguments [ i ] ) ; } }
return array ; } ; }
Object . extend ( Number . prototype , { toColorPart : function ( ) { return this . toPaddedString ( 2 , 16 ) ; } , succ : function ( ) { return this + 1 ; } , times : function ( iterator ) { $R ( 0 , this , true ) . each ( iterator ) ; return this ; } , toPaddedString : function ( length , radix ) { var string = this . toString ( radix || 10 ) ; return '0' . times ( length - string . length ) + string ; } , toJSON : function ( ) { return isFinite ( this ) ? this . toString ( ) : 'null' ; } } ) ; $w ( 'abs round ceil floor' ) . each ( function ( method ) { Number . prototype [ method ] = Math [ method ] . methodize ( ) ; } ) ; function $H ( object ) { return new Hash ( object ) ; } ; var Hash = Class . create ( Enumerable , ( function ( ) { function toQueryPair ( key , value ) { if ( Object . isUndefined ( value ) ) return key ; return key + '=' + encodeURIComponent ( String . interpret ( value ) ) ; }
return { initialize : function ( object ) { this . _object = Object . isHash ( object ) ? object . toObject ( ) : Object . clone ( object ) ; } , _each : function ( iterator ) { for ( var key in this . _object ) { var value = this . _object [ key ] , pair = [ key , value ] ; pair . key = key ; pair . value = value ; iterator ( pair ) ; } } , set : function ( key , value ) { return this . _object [ key ] = value ; } , get : function ( key ) { return this . _object [ key ] ; } , unset : function ( key ) { var value = this . _object [ key ] ; delete this . _object [ key ] ; return value ; } , toObject : function ( ) { return Object . clone ( this . _object ) ; } , keys : function ( ) { return this . pluck ( 'key' ) ; } , values : function ( ) { return this . pluck ( 'value' ) ; } , index : function ( value ) { var match = this . detect ( function ( pair ) { return pair . value === value ; } ) ; return match && match . key ; } , merge : function ( object ) { return this . clone ( ) . update ( object ) ; } , update : function ( object ) { return new Hash ( object ) . inject ( this , function ( result , pair ) { result . set ( pair . key , pair . value ) ; return result ; } ) ; } , toQueryString : function ( ) { return this . map ( function ( pair ) { var key = encodeURIComponent ( pair . key ) , values = pair . value ; if ( values && typeof values == 'object' ) { if ( Object . isArray ( values ) )
return values . map ( toQueryPair . curry ( key ) ) . join ( '&' ) ; }
return toQueryPair ( key , values ) ; } ) . join ( '&' ) ; } , inspect : function ( ) { return '#<Hash:{' + this . map ( function ( pair ) { return pair . map ( Object . inspect ) . join ( ': ' ) ; } ) . join ( ', ' ) + '}>' ; } , toJSON : function ( ) { return Object . toJSON ( this . toObject ( ) ) ; } , clone : function ( ) { return new Hash ( this ) ; } } } ) ( ) ) ; Hash . prototype . toTemplateReplacements = Hash . prototype . toObject ; Hash . from = $H ; var ObjectRange = Class . create ( Enumerable , { initialize : function ( start , end , exclusive ) { this . start = start ; this . end = end ; this . exclusive = exclusive ; } , _each : function ( iterator ) { var value = this . start ; while ( this . include ( value ) ) { iterator ( value ) ; value = value . succ ( ) ; } } , include : function ( value ) { if ( value < this . start )
return false ; if ( this . exclusive )
return value < this . end ; return value <= this . end ; } } ) ; var $R = function ( start , end , exclusive ) { return new ObjectRange ( start , end , exclusive ) ; } ; var Ajax = { getTransport : function ( ) { return Try . these ( function ( ) { return new XMLHttpRequest ( ) } , function ( ) { return new ActiveXObject ( 'Msxml2.XMLHTTP' ) } , function ( ) { return new ActiveXObject ( 'Microsoft.XMLHTTP' ) } ) || false ; } , activeRequestCount : 0 } ; Ajax . Responders = { responders : [ ] , _each : function ( iterator ) { this . responders . _each ( iterator ) ; } , register : function ( responder ) { if ( ! this . include ( responder ) )
this . responders . push ( responder ) ; } , unregister : function ( responder ) { this . responders = this . responders . without ( responder ) ; } , dispatch : function ( callback , request , transport , json ) { this . each ( function ( responder ) { if ( Object . isFunction ( responder [ callback ] ) ) { try { responder [ callback ] . apply ( responder , [ request , transport , json ] ) ; } catch ( e ) { } } } ) ; } } ; Object . extend ( Ajax . Responders , Enumerable ) ; Ajax . Responders . register ( { onCreate : function ( ) { Ajax . activeRequestCount ++ } , onComplete : function ( ) { Ajax . activeRequestCount -- } } ) ; Ajax . Base = Class . create ( { initialize : function ( options ) { this . options = { method : 'post' , asynchronous : true , contentType : 'application/x-www-form-urlencoded' , encoding : 'UTF-8' , parameters : '' , evalJSON : true , evalJS : true } ; Object . extend ( this . options , options || { } ) ; this . options . method = this . options . method . toLowerCase ( ) ; if ( Object . isString ( this . options . parameters ) )
this . options . parameters = this . options . parameters . toQueryParams ( ) ; else if ( Object . isHash ( this . options . parameters ) )
this . options . parameters = this . options . parameters . toObject ( ) ; } } ) ; Ajax . Request = Class . create ( Ajax . Base , { _complete : false , initialize : function ( $super , url , options ) { $super ( options ) ; this . transport = Ajax . getTransport ( ) ; this . request ( url ) ; } , request : function ( url ) { this . url = url ; this . method = this . options . method ; var params = Object . clone ( this . options . parameters ) ; if ( ! [ 'get' , 'post' ] . include ( this . method ) ) { params [ '_method' ] = this . method ; this . method = 'post' ; }
this . parameters = params ; if ( params = Object . toQueryString ( params ) ) { if ( this . method == 'get' )
this . url += ( this . url . include ( '?' ) ? '&' : '?' ) + params ; else if ( /Konqueror|Safari|KHTML/ . test ( navigator . userAgent ) )
params += '&_=' ; }
try { var response = new Ajax . Response ( this ) ; if ( this . options . onCreate ) this . options . onCreate ( response ) ; Ajax . Responders . dispatch ( 'onCreate' , this , response ) ; this . transport . open ( this . method . toUpperCase ( ) , this . url , this . options . asynchronous ) ; if ( this . options . asynchronous ) this . respondToReadyState . bind ( this ) . defer ( 1 ) ; this . transport . onreadystatechange = this . onStateChange . bind ( this ) ; this . setRequestHeaders ( ) ; this . body = this . method == 'post' ? ( this . options . postBody || params ) : null ; this . transport . send ( this . body ) ; if ( ! this . options . asynchronous && this . transport . overrideMimeType )
this . onStateChange ( ) ; }
catch ( e ) { this . dispatchException ( e ) ; } } , onStateChange : function ( ) { var readyState = this . transport . readyState ; if ( readyState > 1 && ! ( ( readyState == 4 ) && this . _complete ) )
this . respondToReadyState ( this . transport . readyState ) ; } , setRequestHeaders : function ( ) { var headers = { 'X-Requested-With' : 'XMLHttpRequest' , 'X-Prototype-Version' : Prototype . Version , 'Accept' : 'text/javascript, text/html, application/xml, text/xml, */*' } ; if ( this . method == 'post' ) { headers [ 'Content-type' ] = this . options . contentType +
( this . options . encoding ? '; charset=' + this . options . encoding : '' ) ; if ( this . transport . overrideMimeType && ( navigator . userAgent . match ( /Gecko\/(\d{4})/ ) || [ 0 , 2005 ] ) [ 1 ] < 2005 )
headers [ 'Connection' ] = 'close' ; }
if ( typeof this . options . requestHeaders == 'object' ) { var extras = this . options . requestHeaders ; if ( Object . isFunction ( extras . push ) )
for ( var i = 0 , length = extras . length ; i < length ; i += 2 )
headers [ extras [ i ] ] = extras [ i + 1 ] ; else
$H ( extras ) . each ( function ( pair ) { headers [ pair . key ] = pair . value } ) ; }
for ( var name in headers )
this . transport . setRequestHeader ( name , headers [ name ] ) ; } , success : function ( ) { var status = this . getStatus ( ) ; return ! status || ( status >= 200 && status < 300 ) ; } , getStatus : function ( ) { try { return this . transport . status || 0 ; } catch ( e ) { return 0 } } , respondToReadyState : function ( readyState ) { var state = Ajax . Request . Events [ readyState ] , response = new Ajax . Response ( this ) ; if ( state == 'Complete' ) { try { this . _complete = true ; ( this . options [ 'on' + response . status ] || this . options [ 'on' + ( this . success ( ) ? 'Success' : 'Failure' ) ] || Prototype . emptyFunction ) ( response , response . headerJSON ) ; } catch ( e ) { this . dispatchException ( e ) ; }
var contentType = response . getHeader ( 'Content-type' ) ; if ( this . options . evalJS == 'force' || ( this . options . evalJS && contentType && contentType . match ( /^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i ) ) )
this . evalResponse ( ) ; }
try { ( this . options [ 'on' + state ] || Prototype . emptyFunction ) ( response , response . headerJSON ) ; Ajax . Responders . dispatch ( 'on' + state , this , response , response . headerJSON ) ; } catch ( e ) { this . dispatchException ( e ) ; }
if ( state == 'Complete' ) { this . transport . onreadystatechange = Prototype . emptyFunction ; } } , getHeader : function ( name ) { try { return this . transport . getResponseHeader ( name ) ; } catch ( e ) { return null } } , evalResponse : function ( ) { try { return eval ( ( this . transport . responseText || '' ) . unfilterJSON ( ) ) ; } catch ( e ) { this . dispatchException ( e ) ; } } , dispatchException : function ( exception ) { ( this . options . onException || Prototype . emptyFunction ) ( this , exception ) ; Ajax . Responders . dispatch ( 'onException' , this , exception ) ; } } ) ; Ajax . Request . Events = [ 'Uninitialized' , 'Loading' , 'Loaded' , 'Interactive' , 'Complete' ] ; Ajax . Response = Class . create ( { initialize : function ( request ) { this . request = request ; var transport = this . transport = request . transport , readyState = this . readyState = transport . readyState ; if ( ( readyState > 2 && ! Prototype . Browser . IE ) || readyState == 4 ) { this . status = this . getStatus ( ) ; this . statusText = this . getStatusText ( ) ; this . responseText = String . interpret ( transport . responseText ) ; this . headerJSON = this . _getHeaderJSON ( ) ; }
if ( readyState == 4 ) { var xml = transport . responseXML ; this . responseXML = Object . isUndefined ( xml ) ? null : xml ; this . responseJSON = this . _getResponseJSON ( ) ; } } , status : 0 , statusText : '' , getStatus : Ajax . Request . prototype . getStatus , getStatusText : function ( ) { try { return this . transport . statusText || '' ; } catch ( e ) { return '' } } , getHeader : Ajax . Request . prototype . getHeader , getAllHeaders : function ( ) { try { return this . getAllResponseHeaders ( ) ; } catch ( e ) { return null } } , getResponseHeader : function ( name ) { return this . transport . getResponseHeader ( name ) ; } , getAllResponseHeaders : function ( ) { return this . transport . getAllResponseHeaders ( ) ; } , _getHeaderJSON : function ( ) { var json = this . getHeader ( 'X-JSON' ) ; if ( ! json ) return null ; json = decodeURIComponent ( escape ( json ) ) ; try { return json . evalJSON ( this . request . options . sanitizeJSON ) ; } catch ( e ) { this . request . dispatchException ( e ) ; } } , _getResponseJSON : function ( ) { var options = this . request . options ; if ( ! options . evalJSON || ( options . evalJSON != 'force' && ! ( this . getHeader ( 'Content-type' ) || '' ) . include ( 'application/json' ) ) || this . responseText . blank ( ) )
return null ; try { return this . responseText . evalJSON ( options . sanitizeJSON ) ; } catch ( e ) { this . request . dispatchException ( e ) ; } } } ) ; Ajax . Updater = Class . create ( Ajax . Request , { initialize : function ( $super , container , url , options ) { this . container = { success : ( container . success || container ) , failure : ( container . failure || ( container . success ? null : container ) ) } ; options = Object . clone ( options ) ; var onComplete = options . onComplete ; options . onComplete = ( function ( response , json ) { this . updateContent ( response . responseText ) ; if ( Object . isFunction ( onComplete ) ) onComplete ( response , json ) ; } ) . bind ( this ) ; $super ( url , options ) ; } , updateContent : function ( responseText ) { var receiver = this . container [ this . success ( ) ? 'success' : 'failure' ] , options = this . options ; if ( ! options . evalScripts ) responseText = responseText . stripScripts ( ) ; if ( receiver = $ ( receiver ) ) { if ( options . insertion ) { if ( Object . isString ( options . insertion ) ) { var insertion = { } ; insertion [ options . insertion ] = responseText ; receiver . insert ( insertion ) ; }
else options . insertion ( receiver , responseText ) ; }
else receiver . update ( responseText ) ; } } } ) ; Ajax . PeriodicalUpdater = Class . create ( Ajax . Base , { initialize : function ( $super , container , url , options ) { $super ( options ) ; this . onComplete = this . options . onComplete ; this . frequency = ( this . options . frequency || 2 ) ; this . decay = ( this . options . decay || 1 ) ; this . updater = { } ; this . container = container ; this . url = url ; this . start ( ) ; } , start : function ( ) { this . options . onComplete = this . updateComplete . bind ( this ) ; this . onTimerEvent ( ) ; } , stop : function ( ) { this . updater . options . onComplete = undefined ; clearTimeout ( this . timer ) ; ( this . onComplete || Prototype . emptyFunction ) . apply ( this , arguments ) ; } , updateComplete : function ( response ) { if ( this . options . decay ) { this . decay = ( response . responseText == this . lastText ? this . decay * this . options . decay : 1 ) ; this . lastText = response . responseText ; }
this . timer = this . onTimerEvent . bind ( this ) . delay ( this . decay * this . frequency ) ; } , onTimerEvent : function ( ) { this . updater = new Ajax . Updater ( this . container , this . url , this . options ) ; } } ) ; function $ ( element ) { if ( arguments . length > 1 ) { for ( var i = 0 , elements = [ ] , length = arguments . length ; i < length ; i ++ )
elements . push ( $ ( arguments [ i ] ) ) ; return elements ; }
if ( Object . isString ( element ) )
element = document . getElementById ( element ) ; return Element . extend ( element ) ; }
if ( Prototype . BrowserFeatures . XPath ) { document . _getElementsByXPath = function ( expression , parentElement ) { var results = [ ] ; var query = document . evaluate ( expression , $ ( parentElement ) || document , null , XPathResult . ORDERED _NODE _SNAPSHOT _TYPE , null ) ; for ( var i = 0 , length = query . snapshotLength ; i < length ; i ++ )
results . push ( Element . extend ( query . snapshotItem ( i ) ) ) ; return results ; } ; }
if ( ! window . Node ) var Node = { } ; if ( ! Node . ELEMENT _NODE ) { Object . extend ( Node , { ELEMENT _NODE : 1 , ATTRIBUTE _NODE : 2 , TEXT _NODE : 3 , CDATA _SECTION _NODE : 4 , ENTITY _REFERENCE _NODE : 5 , ENTITY _NODE : 6 , PROCESSING _INSTRUCTION _NODE : 7 , COMMENT _NODE : 8 , DOCUMENT _NODE : 9 , DOCUMENT _TYPE _NODE : 10 , DOCUMENT _FRAGMENT _NODE : 11 , NOTATION _NODE : 12 } ) ; }
( function ( ) { var element = this . Element ; this . Element = function ( tagName , attributes ) { attributes = attributes || { } ; tagName = tagName . toLowerCase ( ) ; var cache = Element . cache ; if ( Prototype . Browser . IE && attributes . name ) { tagName = '<' + tagName + ' name="' + attributes . name + '">' ; delete attributes . name ; return Element . writeAttribute ( document . createElement ( tagName ) , attributes ) ; }
if ( ! cache [ tagName ] ) cache [ tagName ] = Element . extend ( document . createElement ( tagName ) ) ; return Element . writeAttribute ( cache [ tagName ] . cloneNode ( false ) , attributes ) ; } ; Object . extend ( this . Element , element || { } ) ; } ) . call ( window ) ; Element . cache = { } ; Element . Methods = { visible : function ( element ) { return $ ( element ) . style . display != 'none' ; } , toggle : function ( element ) { element = $ ( element ) ; Element [ Element . visible ( element ) ? 'hide' : 'show' ] ( element ) ; return element ; } , hide : function ( element ) { $ ( element ) . style . display = 'none' ; return element ; } , show : function ( element ) { $ ( element ) . style . display = '' ; return element ; } , remove : function ( element ) { element = $ ( element ) ; element . parentNode . removeChild ( element ) ; return element ; } , update : function ( element , content ) { element = $ ( element ) ; if ( content && content . toElement ) content = content . toElement ( ) ; if ( Object . isElement ( content ) ) return element . update ( ) . insert ( content ) ; content = Object . toHTML ( content ) ; element . innerHTML = content . stripScripts ( ) ; content . evalScripts . bind ( content ) . defer ( ) ; return element ; } , replace : function ( element , content ) { element = $ ( element ) ; if ( content && content . toElement ) content = content . toElement ( ) ; else if ( ! Object . isElement ( content ) ) { content = Object . toHTML ( content ) ; var range = element . ownerDocument . createRange ( ) ; range . selectNode ( element ) ; content . evalScripts . bind ( content ) . defer ( ) ; content = range . createContextualFragment ( content . stripScripts ( ) ) ; }
element . parentNode . replaceChild ( content , element ) ; return element ; } , insert : function ( element , insertions ) { element = $ ( element ) ; if ( Object . isString ( insertions ) || Object . isNumber ( insertions ) || Object . isElement ( insertions ) || ( insertions && ( insertions . toElement || insertions . toHTML ) ) )
insertions = { bottom : insertions } ; var content , t , range ; for ( position in insertions ) { content = insertions [ position ] ; position = position . toLowerCase ( ) ; t = Element . _insertionTranslations [ position ] ; if ( content && content . toElement ) content = content . toElement ( ) ; if ( Object . isElement ( content ) ) { t . insert ( element , content ) ; continue ; }
content = Object . toHTML ( content ) ; range = element . ownerDocument . createRange ( ) ; t . initializeRange ( element , range ) ; t . insert ( element , range . createContextualFragment ( content . stripScripts ( ) ) ) ; content . evalScripts . bind ( content ) . defer ( ) ; }
return element ; } , wrap : function ( element , wrapper , attributes ) { element = $ ( element ) ; if ( Object . isElement ( wrapper ) )
$ ( wrapper ) . writeAttribute ( attributes || { } ) ; else if ( Object . isString ( wrapper ) ) wrapper = new Element ( wrapper , attributes ) ; else wrapper = new Element ( 'div' , wrapper ) ; if ( element . parentNode )
element . parentNode . replaceChild ( wrapper , element ) ; wrapper . appendChild ( element ) ; return wrapper ; } , inspect : function ( element ) { element = $ ( element ) ; var result = '<' + element . tagName . toLowerCase ( ) ; $H ( { 'id' : 'id' , 'className' : 'class' } ) . each ( function ( pair ) { var property = pair . first ( ) , attribute = pair . last ( ) ; var value = ( element [ property ] || '' ) . toString ( ) ; if ( value ) result += ' ' + attribute + '=' + value . inspect ( true ) ; } ) ; return result + '>' ; } , recursivelyCollect : function ( element , property ) { element = $ ( element ) ; var elements = [ ] ; while ( element = element [ property ] )
if ( element . nodeType == 1 )
elements . push ( Element . extend ( element ) ) ; return elements ; } , ancestors : function ( element ) { return $ ( element ) . recursivelyCollect ( 'parentNode' ) ; } , descendants : function ( element ) { return $ ( element ) . getElementsBySelector ( "*" ) ; } , firstDescendant : function ( element ) { element = $ ( element ) . firstChild ; while ( element && element . nodeType != 1 ) element = element . nextSibling ; return $ ( element ) ; } , immediateDescendants : function ( element ) { if ( ! ( element = $ ( element ) . firstChild ) ) return [ ] ; while ( element && element . nodeType != 1 ) element = element . nextSibling ; if ( element ) return [ element ] . concat ( $ ( element ) . nextSiblings ( ) ) ; return [ ] ; } , previousSiblings : function ( element ) { return $ ( element ) . recursivelyCollect ( 'previousSibling' ) ; } , nextSiblings : function ( element ) { return $ ( element ) . recursivelyCollect ( 'nextSibling' ) ; } , siblings : function ( element ) { element = $ ( element ) ; return element . previousSiblings ( ) . reverse ( ) . concat ( element . nextSiblings ( ) ) ; } , match : function ( element , selector ) { if ( Object . isString ( selector ) )
selector = new Selector ( selector ) ; return selector . match ( $ ( element ) ) ; } , up : function ( element , expression , index ) { element = $ ( element ) ; if ( arguments . length == 1 ) return $ ( element . parentNode ) ; var ancestors = element . ancestors ( ) ; return expression ? Selector . findElement ( ancestors , expression , index ) : ancestors [ index || 0 ] ; } , down : function ( element , expression , index ) { element = $ ( element ) ; if ( arguments . length == 1 ) return element . firstDescendant ( ) ; var descendants = element . descendants ( ) ; return expression ? Selector . findElement ( descendants , expression , index ) : descendants [ index || 0 ] ; } , previous : function ( element , expression , index ) { element = $ ( element ) ; if ( arguments . length == 1 ) return $ ( Selector . handlers . previousElementSibling ( element ) ) ; var previousSiblings = element . previousSiblings ( ) ; return expression ? Selector . findElement ( previousSiblings , expression , index ) : previousSiblings [ index || 0 ] ; } , next : function ( element , expression , index ) { element = $ ( element ) ; if ( arguments . length == 1 ) return $ ( Selector . handlers . nextElementSibling ( element ) ) ; var nextSiblings = element . nextSiblings ( ) ; return expression ? Selector . findElement ( nextSiblings , expression , index ) : nextSiblings [ index || 0 ] ; } , select : function ( ) { var args = $A ( arguments ) , element = $ ( args . shift ( ) ) ; return Selector . findChildElements ( element , args ) ; } , adjacent : function ( ) { var args = $A ( arguments ) , element = $ ( args . shift ( ) ) ; return Selector . findChildElements ( element . parentNode , args ) . without ( element ) ; } , identify : function ( element ) { element = $ ( element ) ; var id = element . readAttribute ( 'id' ) , self = arguments . callee ; if ( id ) return id ; do { id = 'anonymous_element_' + self . counter ++ } while ( $ ( id ) ) ; element . writeAttribute ( 'id' , id ) ; return id ; } , readAttribute : function ( element , name ) { element = $ ( element ) ; if ( Prototype . Browser . IE ) { var t = Element . _attributeTranslations . read ; if ( t . values [ name ] ) return t . values [ name ] ( element , name ) ; if ( t . names [ name ] ) name = t . names [ name ] ; if ( name . include ( ':' ) ) { return ( ! element . attributes || ! element . attributes [ name ] ) ? null : element . attributes [ name ] . value ; } }
return element . getAttribute ( name ) ; } , writeAttribute : function ( element , name , value ) { element = $ ( element ) ; var attributes = { } , t = Element . _attributeTranslations . write ; if ( typeof name == 'object' ) attributes = name ; else attributes [ name ] = Object . isUndefined ( value ) ? true : value ; for ( var attr in attributes ) { name = t . names [ attr ] || attr ; value = attributes [ attr ] ; if ( t . values [ attr ] ) name = t . values [ attr ] ( element , value ) ; if ( value === false || value === null )
element . removeAttribute ( name ) ; else if ( value === true )
element . setAttribute ( name , name ) ; else element . setAttribute ( name , value ) ; }
return element ; } , getHeight : function ( element ) { return $ ( element ) . getDimensions ( ) . height ; } , getWidth : function ( element ) { return $ ( element ) . getDimensions ( ) . width ; } , classNames : function ( element ) { return new Element . ClassNames ( element ) ; } , hasClassName : function ( element , className ) { if ( ! ( element = $ ( element ) ) ) return ; var elementClassName = element . className ; return ( elementClassName . length > 0 && ( elementClassName == className || new RegExp ( "(^|\\s)" + className + "(\\s|$)" ) . test ( elementClassName ) ) ) ; } , addClassName : function ( element , className ) { if ( ! ( element = $ ( element ) ) ) return ; if ( ! element . hasClassName ( className ) )
element . className += ( element . className ? ' ' : '' ) + className ; return element ; } , removeClassName : function ( element , className ) { if ( ! ( element = $ ( element ) ) ) return ; element . className = element . className . replace ( new RegExp ( "(^|\\s+)" + className + "(\\s+|$)" ) , ' ' ) . strip ( ) ; return element ; } , toggleClassName : function ( element , className ) { if ( ! ( element = $ ( element ) ) ) return ; return element [ element . hasClassName ( className ) ? 'removeClassName' : 'addClassName' ] ( className ) ; } , cleanWhitespace : function ( element ) { element = $ ( element ) ; var node = element . firstChild ; while ( node ) { var nextNode = node . nextSibling ; if ( node . nodeType == 3 && ! /\S/ . test ( node . nodeValue ) )
element . removeChild ( node ) ; node = nextNode ; }
return element ; } , empty : function ( element ) { return $ ( element ) . innerHTML . blank ( ) ; } , descendantOf : function ( element , ancestor ) { element = $ ( element ) , ancestor = $ ( ancestor ) ; var originalAncestor = ancestor ; if ( element . compareDocumentPosition )
return ( element . compareDocumentPosition ( ancestor ) & 8 ) === 8 ; if ( element . sourceIndex && ! Prototype . Browser . Opera ) { var e = element . sourceIndex , a = ancestor . sourceIndex , nextAncestor = ancestor . nextSibling ; if ( ! nextAncestor ) { do { ancestor = ancestor . parentNode ; }
while ( ! ( nextAncestor = ancestor . nextSibling ) && ancestor . parentNode ) ; }
if ( nextAncestor ) return ( e > a && e < nextAncestor . sourceIndex ) ; }
while ( element = element . parentNode )
if ( element == originalAncestor ) return true ; return false ; } , scrollTo : function ( element ) { element = $ ( element ) ; var pos = element . cumulativeOffset ( ) ; window . scrollTo ( pos [ 0 ] , pos [ 1 ] ) ; return element ; } , getStyle : function ( element , style ) { element = $ ( element ) ; style = style == 'float' ? 'cssFloat' : style . camelize ( ) ; var value = element . style [ style ] ; if ( ! value ) { var css = document . defaultView . getComputedStyle ( element , null ) ; value = css ? css [ style ] : null ; }
if ( style == 'opacity' ) return value ? parseFloat ( value ) : 1.0 ; return value == 'auto' ? null : value ; } , getOpacity : function ( element ) { return $ ( element ) . getStyle ( 'opacity' ) ; } , setStyle : function ( element , styles ) { element = $ ( element ) ; var elementStyle = element . style , match ; if ( Object . isString ( styles ) ) { element . style . cssText += ';' + styles ; return styles . include ( 'opacity' ) ? element . setOpacity ( styles . match ( /opacity:\s*(\d?\.?\d*)/ ) [ 1 ] ) : element ; }
for ( var property in styles )
if ( property == 'opacity' ) element . setOpacity ( styles [ property ] ) ; else
elementStyle [ ( property == 'float' || property == 'cssFloat' ) ? ( Object . isUndefined ( elementStyle . styleFloat ) ? 'cssFloat' : 'styleFloat' ) : property ] = styles [ property ] ; return element ; } , setOpacity : function ( element , value ) { element = $ ( element ) ; element . style . opacity = ( value == 1 || value === '' ) ? '' : ( value < 0.00001 ) ? 0 : value ; return element ; } , getDimensions : function ( element ) { element = $ ( element ) ; var display = $ ( element ) . getStyle ( 'display' ) ; if ( display != 'none' && display != null )
return { width : element . offsetWidth , height : element . offsetHeight } ; var els = element . style ; var originalVisibility = els . visibility ; var originalPosition = els . position ; var originalDisplay = els . display ; els . visibility = 'hidden' ; els . position = 'absolute' ; els . display = 'block' ; var originalWidth = element . clientWidth ; var originalHeight = element . clientHeight ; els . display = originalDisplay ; els . position = originalPosition ; els . visibility = originalVisibility ; return { width : originalWidth , height : originalHeight } ; } , makePositioned : function ( element ) { element = $ ( element ) ; var pos = Element . getStyle ( element , 'position' ) ; if ( pos == 'static' || ! pos ) { element . _madePositioned = true ; element . style . position = 'relative' ; if ( window . opera ) { element . style . top = 0 ; element . style . left = 0 ; } }
return element ; } , undoPositioned : function ( element ) { element = $ ( element ) ; if ( element . _madePositioned ) { element . _madePositioned = undefined ; element . style . position = element . style . top = element . style . left = element . style . bottom = element . style . right = '' ; }
return element ; } , makeClipping : function ( element ) { element = $ ( element ) ; if ( element . _overflow ) return element ; element . _overflow = Element . getStyle ( element , 'overflow' ) || 'auto' ; if ( element . _overflow !== 'hidden' )
element . style . overflow = 'hidden' ; return element ; } , undoClipping : function ( element ) { element = $ ( element ) ; if ( ! element . _overflow ) return element ; element . style . overflow = element . _overflow == 'auto' ? '' : element . _overflow ; element . _overflow = null ; return element ; } , cumulativeOffset : function ( element ) { var valueT = 0 , valueL = 0 ; do { valueT += element . offsetTop || 0 ; valueL += element . offsetLeft || 0 ; element = element . offsetParent ; } while ( element ) ; return Element . _returnOffset ( valueL , valueT ) ; } , positionedOffset : function ( element ) { var valueT = 0 , valueL = 0 ; do { valueT += element . offsetTop || 0 ; valueL += element . offsetLeft || 0 ; element = element . offsetParent ; if ( element ) { if ( element . tagName == 'BODY' ) break ; var p = Element . getStyle ( element , 'position' ) ; if ( p == 'relative' || p == 'absolute' ) break ; } } while ( element ) ; return Element . _returnOffset ( valueL , valueT ) ; } , absolutize : function ( element ) { element = $ ( element ) ; if ( element . getStyle ( 'position' ) == 'absolute' ) return ; var offsets = element . positionedOffset ( ) ; var top = offsets [ 1 ] ; var left = offsets [ 0 ] ; var width = element . clientWidth ; var height = element . clientHeight ; element . _originalLeft = left - parseFloat ( element . style . left || 0 ) ; element . _originalTop = top - parseFloat ( element . style . top || 0 ) ; element . _originalWidth = element . style . width ; element . _originalHeight = element . style . height ; element . style . position = 'absolute' ; element . style . top = top + 'px' ; element . style . left = left + 'px' ; element . style . width = width + 'px' ; element . style . height = height + 'px' ; return element ; } , relativize : function ( element ) { element = $ ( element ) ; if ( element . getStyle ( 'position' ) == 'relative' ) return ; element . style . position = 'relative' ; var top = parseFloat ( element . style . top || 0 ) - ( element . _originalTop || 0 ) ; var left = parseFloat ( element . style . left || 0 ) - ( element . _originalLeft || 0 ) ; element . style . top = top + 'px' ; element . style . left = left + 'px' ; element . style . height = element . _originalHeight ; element . style . width = element . _originalWidth ; return element ; } , cumulativeScrollOffset : function ( element ) { var valueT = 0 , valueL = 0 ; do { valueT += element . scrollTop || 0 ; valueL += element . scrollLeft || 0 ; element = element . parentNode ; } while ( element ) ; return Element . _returnOffset ( valueL , valueT ) ; } , getOffsetParent : function ( element ) { if ( element . offsetParent ) return $ ( element . offsetParent ) ; if ( element == document . body ) return $ ( element ) ; while ( ( element = element . parentNode ) && element != document . body )
if ( Element . getStyle ( element , 'position' ) != 'static' )
return $ ( element ) ; return $ ( document . body ) ; } , viewportOffset : function ( forElement ) { var valueT = 0 , valueL = 0 ; var element = forElement ; do { valueT += element . offsetTop || 0 ; valueL += element . offsetLeft || 0 ; if ( element . offsetParent == document . body && Element . getStyle ( element , 'position' ) == 'absolute' ) break ; } while ( element = element . offsetParent ) ; element = forElement ; do { if ( ! Prototype . Browser . Opera || element . tagName == 'BODY' ) { valueT -= element . scrollTop || 0 ; valueL -= element . scrollLeft || 0 ; } } while ( element = element . parentNode ) ; return Element . _returnOffset ( valueL , valueT ) ; } , clonePosition : function ( element , source ) { var options = Object . extend ( { setLeft : true , setTop : true , setWidth : true , setHeight : true , offsetTop : 0 , offsetLeft : 0 } , arguments [ 2 ] || { } ) ; source = $ ( source ) ; var p = source . viewportOffset ( ) ; element = $ ( element ) ; var delta = [ 0 , 0 ] ; var parent = null ; if ( Element . getStyle ( element , 'position' ) == 'absolute' ) { parent = element . getOffsetParent ( ) ; delta = parent . viewportOffset ( ) ; }
if ( parent == document . body ) { delta [ 0 ] -= document . body . offsetLeft ; delta [ 1 ] -= document . body . offsetTop ; }
if ( options . setLeft ) element . style . left = ( p [ 0 ] - delta [ 0 ] + options . offsetLeft ) + 'px' ; if ( options . setTop ) element . style . top = ( p [ 1 ] - delta [ 1 ] + options . offsetTop ) + 'px' ; if ( options . setWidth ) element . style . width = source . offsetWidth + 'px' ; if ( options . setHeight ) element . style . height = source . offsetHeight + 'px' ; return element ; } } ; Element . Methods . identify . counter = 1 ; Object . extend ( Element . Methods , { getElementsBySelector : Element . Methods . select , childElements : Element . Methods . immediateDescendants } ) ; Element . _attributeTranslations = { write : { names : { className : 'class' , htmlFor : 'for' } , values : { } } } ; if ( ! document . createRange || Prototype . Browser . Opera ) { Element . Methods . insert = function ( element , insertions ) { element = $ ( element ) ; if ( Object . isString ( insertions ) || Object . isNumber ( insertions ) || Object . isElement ( insertions ) || ( insertions && ( insertions . toElement || insertions . toHTML ) ) )
insertions = { bottom : insertions } ; var t = Element . _insertionTranslations , content , position , pos , tagName ; for ( position in insertions ) { content = insertions [ position ] ; position = position . toLowerCase ( ) ; pos = t [ position ] ; if ( content && content . toElement ) content = content . toElement ( ) ; if ( Object . isElement ( content ) ) { pos . insert ( element , content ) ; continue ; }
content = Object . toHTML ( content ) ; tagName = ( ( position == 'before' || position == 'after' ) ? element . parentNode : element ) . tagName . toUpperCase ( ) ; if ( t . tags [ tagName ] ) { var fragments = Element . _getContentFromAnonymousElement ( tagName , content . stripScripts ( ) ) ; if ( position == 'top' || position == 'after' ) fragments . reverse ( ) ; fragments . each ( pos . insert . curry ( element ) ) ; }
else element . insertAdjacentHTML ( pos . adjacency , content . stripScripts ( ) ) ; content . evalScripts . bind ( content ) . defer ( ) ; }
return element ; } ; }
if ( Prototype . Browser . Opera ) { Element . Methods . getStyle = Element . Methods . getStyle . wrap ( function ( proceed , element , style ) { switch ( style ) { case 'left' : case 'top' : case 'right' : case 'bottom' : if ( proceed ( element , 'position' ) === 'static' ) return null ; case 'height' : case 'width' : if ( ! Element . visible ( element ) ) return null ; var dim = parseInt ( proceed ( element , style ) , 10 ) ; if ( dim !== element [ 'offset' + style . capitalize ( ) ] )
return dim + 'px' ; var properties ; if ( style === 'height' ) { properties = [ 'border-top-width' , 'padding-top' , 'padding-bottom' , 'border-bottom-width' ] ; }
else { properties = [ 'border-left-width' , 'padding-left' , 'padding-right' , 'border-right-width' ] ; }
return properties . inject ( dim , function ( memo , property ) { var val = proceed ( element , property ) ; return val === null ? memo : memo - parseInt ( val , 10 ) ; } ) + 'px' ; default : return proceed ( element , style ) ; } } ) ; Element . Methods . readAttribute = Element . Methods . readAttribute . wrap ( function ( proceed , element , attribute ) { if ( attribute === 'title' ) return element . title ; return proceed ( element , attribute ) ; } ) ; }
else if ( Prototype . Browser . IE ) { $w ( 'positionedOffset getOffsetParent viewportOffset' ) . each ( function ( method ) { Element . Methods [ method ] = Element . Methods [ method ] . wrap ( function ( proceed , element ) { element = $ ( element ) ; var position = element . getStyle ( 'position' ) ; if ( position != 'static' ) return proceed ( element ) ; element . setStyle ( { position : 'relative' } ) ; var value = proceed ( element ) ; element . setStyle ( { position : position } ) ; return value ; } ) ; } ) ; Element . Methods . getStyle = function ( element , style ) { element = $ ( element ) ; style = ( style == 'float' || style == 'cssFloat' ) ? 'styleFloat' : style . camelize ( ) ; var value = element . style [ style ] ; if ( ! value && element . currentStyle ) value = element . currentStyle [ style ] ; if ( style == 'opacity' ) { if ( value = ( element . getStyle ( 'filter' ) || '' ) . match ( /alpha\(opacity=(.*)\)/ ) )
if ( value [ 1 ] ) return parseFloat ( value [ 1 ] ) / 100 ; return 1.0 ; }
if ( value == 'auto' ) { if ( ( style == 'width' || style == 'height' ) && ( element . getStyle ( 'display' ) != 'none' ) )
return element [ 'offset' + style . capitalize ( ) ] + 'px' ; return null ; }
return value ; } ; Element . Methods . setOpacity = function ( element , value ) { function stripAlpha ( filter ) { return filter . replace ( /alpha\([^\)]*\)/gi , '' ) ; }
element = $ ( element ) ; var currentStyle = element . currentStyle ; if ( ( currentStyle && ! currentStyle . hasLayout ) || ( ! currentStyle && element . style . zoom == 'normal' ) )
element . style . zoom = 1 ; var filter = element . getStyle ( 'filter' ) , style = element . style ; if ( value == 1 || value === '' ) { ( filter = stripAlpha ( filter ) ) ? style . filter = filter : style . removeAttribute ( 'filter' ) ; return element ; } else if ( value < 0.00001 ) value = 0 ; style . filter = stripAlpha ( filter ) + 'alpha(opacity=' + ( value * 100 ) + ')' ; return element ; } ; Element . _attributeTranslations = { read : { names : { 'class' : 'className' , 'for' : 'htmlFor' } , values : { _getAttr : function ( element , attribute ) { return element . getAttribute ( attribute , 2 ) ; } , _getAttrNode : function ( element , attribute ) { var node = element . getAttributeNode ( attribute ) ; return node ? node . value : "" ; } , _getEv : function ( element , attribute ) { attribute = element . getAttribute ( attribute ) ; return attribute ? attribute . toString ( ) . slice ( 23 , - 2 ) : null ; } , _flag : function ( element , attribute ) { return $ ( element ) . hasAttribute ( attribute ) ? attribute : null ; } , style : function ( element ) { return element . style . cssText . toLowerCase ( ) ; } , title : function ( element ) { return element . title ; } } } } ; Element . _attributeTranslations . write = { names : Object . clone ( Element . _attributeTranslations . read . names ) , values : { checked : function ( element , value ) { element . checked = ! ! value ; } , style : function ( element , value ) { element . style . cssText = value ? value : '' ; } } } ; Element . _attributeTranslations . has = { } ; $w ( 'colSpan rowSpan vAlign dateTime accessKey tabIndex ' + 'encType maxLength readOnly longDesc' ) . each ( function ( attr ) { Element . _attributeTranslations . write . names [ attr . toLowerCase ( ) ] = attr ; Element . _attributeTranslations . has [ attr . toLowerCase ( ) ] = attr ; } ) ; ( function ( v ) { Object . extend ( v , { href : v . _getAttr , src : v . _getAttr , type : v . _getAttr , action : v . _getAttrNode , disabled : v . _flag , checked : v . _flag , readonly : v . _flag , multiple : v . _flag , onload : v . _getEv , onunload : v . _getEv , onclick : v . _getEv , ondblclick : v . _getEv , onmousedown : v . _getEv , onmouseup : v . _getEv , onmouseover : v . _getEv , onmousemove : v . _getEv , onmouseout : v . _getEv , onfocus : v . _getEv , onblur : v . _getEv , onkeypress : v . _getEv , onkeydown : v . _getEv , onkeyup : v . _getEv , onsubmit : v . _getEv , onreset : v . _getEv , onselect : v . _getEv , onchange : v . _getEv } ) ; } ) ( Element . _attributeTranslations . read . values ) ; }
else if ( Prototype . Browser . Gecko && /rv:1\.8\.0/ . test ( navigator . userAgent ) ) { Element . Methods . setOpacity = function ( element , value ) { element = $ ( element ) ; element . style . opacity = ( value == 1 ) ? 0.999999 : ( value === '' ) ? '' : ( value < 0.00001 ) ? 0 : value ; return element ; } ; }
else if ( Prototype . Browser . WebKit ) { Element . Methods . setOpacity = function ( element , value ) { element = $ ( element ) ; element . style . opacity = ( value == 1 || value === '' ) ? '' : ( value < 0.00001 ) ? 0 : value ; if ( value == 1 )
if ( element . tagName == 'IMG' && element . width ) { element . width ++ ; element . width -- ; } else try { var n = document . createTextNode ( ' ' ) ; element . appendChild ( n ) ; element . removeChild ( n ) ; } catch ( e ) { }
return element ; } ; Element . Methods . cumulativeOffset = function ( element ) { var valueT = 0 , valueL = 0 ; do { valueT += element . offsetTop || 0 ; valueL += element . offsetLeft || 0 ; if ( element . offsetParent == document . body )
if ( Element . getStyle ( element , 'position' ) == 'absolute' ) break ; element = element . offsetParent ; } while ( element ) ; return Element . _returnOffset ( valueL , valueT ) ; } ; }
if ( Prototype . Browser . IE || Prototype . Browser . Opera ) { Element . Methods . update = function ( element , content ) { element = $ ( element ) ; if ( content && content . toElement ) content = content . toElement ( ) ; if ( Object . isElement ( content ) ) return element . update ( ) . insert ( content ) ; content = Object . toHTML ( content ) ; var tagName = element . tagName . toUpperCase ( ) ; if ( tagName in Element . _insertionTranslations . tags ) { $A ( element . childNodes ) . each ( function ( node ) { element . removeChild ( node ) } ) ; Element . _getContentFromAnonymousElement ( tagName , content . stripScripts ( ) ) . each ( function ( node ) { element . appendChild ( node ) } ) ; }
else element . innerHTML = content . stripScripts ( ) ; content . evalScripts . bind ( content ) . defer ( ) ; return element ; } ; }
if ( document . createElement ( 'div' ) . outerHTML ) { Element . Methods . replace = function ( element , content ) { element = $ ( element ) ; if ( content && content . toElement ) content = content . toElement ( ) ; if ( Object . isElement ( content ) ) { element . parentNode . replaceChild ( content , element ) ; return element ; }
content = Object . toHTML ( content ) ; var parent = element . parentNode , tagName = parent . tagName . toUpperCase ( ) ; if ( Element . _insertionTranslations . tags [ tagName ] ) { var nextSibling = element . next ( ) ; var fragments = Element . _getContentFromAnonymousElement ( tagName , content . stripScripts ( ) ) ; parent . removeChild ( element ) ; if ( nextSibling )
fragments . each ( function ( node ) { parent . insertBefore ( node , nextSibling ) } ) ; else
fragments . each ( function ( node ) { parent . appendChild ( node ) } ) ; }
else element . outerHTML = content . stripScripts ( ) ; content . evalScripts . bind ( content ) . defer ( ) ; return element ; } ; }
Element . _returnOffset = function ( l , t ) { var result = [ l , t ] ; result . left = l ; result . top = t ; return result ; } ; Element . _getContentFromAnonymousElement = function ( tagName , html ) { var div = new Element ( 'div' ) , t = Element . _insertionTranslations . tags [ tagName ] ; div . innerHTML = t [ 0 ] + html + t [ 1 ] ; t [ 2 ] . times ( function ( ) { div = div . firstChild } ) ; return $A ( div . childNodes ) ; } ; Element . _insertionTranslations = { before : { adjacency : 'beforeBegin' , insert : function ( element , node ) { element . parentNode . insertBefore ( node , element ) ; } , initializeRange : function ( element , range ) { range . setStartBefore ( element ) ; } } , top : { adjacency : 'afterBegin' , insert : function ( element , node ) { element . insertBefore ( node , element . firstChild ) ; } , initializeRange : function ( element , range ) { range . selectNodeContents ( element ) ; range . collapse ( true ) ; } } , bottom : { adjacency : 'beforeEnd' , insert : function ( element , node ) { element . appendChild ( node ) ; } } , after : { adjacency : 'afterEnd' , insert : function ( element , node ) { element . parentNode . insertBefore ( node , element . nextSibling ) ; } , initializeRange : function ( element , range ) { range . setStartAfter ( element ) ; } } , tags : { TABLE : [ '<table>' , '</table>' , 1 ] , TBODY : [ '<table><tbody>' , '</tbody></table>' , 2 ] , TR : [ '<table><tbody><tr>' , '</tr></tbody></table>' , 3 ] , TD : [ '<table><tbody><tr><td>' , '</td></tr></tbody></table>' , 4 ] , SELECT : [ '<select>' , '</select>' , 1 ] } } ; ( function ( ) { this . bottom . initializeRange = this . top . initializeRange ; Object . extend ( this . tags , { THEAD : this . tags . TBODY , TFOOT : this . tags . TBODY , TH : this . tags . TD } ) ; } ) . call ( Element . _insertionTranslations ) ; Element . Methods . Simulated = { hasAttribute : function ( element , attribute ) { attribute = Element . _attributeTranslations . has [ attribute ] || attribute ; var node = $ ( element ) . getAttributeNode ( attribute ) ; return node && node . specified ; } } ; Element . Methods . ByTag = { } ; Object . extend ( Element , Element . Methods ) ; if ( ! Prototype . BrowserFeatures . ElementExtensions && document . createElement ( 'div' ) . _ _proto _ _ ) { window . HTMLElement = { } ; window . HTMLElement . prototype = document . createElement ( 'div' ) . _ _proto _ _ ; Prototype . BrowserFeatures . ElementExtensions = true ; }
Element . extend = ( function ( ) { if ( Prototype . BrowserFeatures . SpecificElementExtensions )
return Prototype . K ; var Methods = { } , ByTag = Element . Methods . ByTag ; var extend = Object . extend ( function ( element ) { if ( ! element || element . _extendedByPrototype || element . nodeType != 1 || element == window ) return element ; var methods = Object . clone ( Methods ) , tagName = element . tagName , property , value ; if ( ByTag [ tagName ] ) Object . extend ( methods , ByTag [ tagName ] ) ; for ( property in methods ) { value = methods [ property ] ; if ( Object . isFunction ( value ) && ! ( property in element ) )
element [ property ] = value . methodize ( ) ; }
element . _extendedByPrototype = Prototype . emptyFunction ; return element ; } , { refresh : function ( ) { if ( ! Prototype . BrowserFeatures . ElementExtensions ) { Object . extend ( Methods , Element . Methods ) ; Object . extend ( Methods , Element . Methods . Simulated ) ; } } } ) ; extend . refresh ( ) ; return extend ; } ) ( ) ; Element . hasAttribute = function ( element , attribute ) { if ( element . hasAttribute ) return element . hasAttribute ( attribute ) ; return Element . Methods . Simulated . hasAttribute ( element , attribute ) ; } ; Element . addMethods = function ( methods ) { var F = Prototype . BrowserFeatures , T = Element . Methods . ByTag ; if ( ! methods ) { Object . extend ( Form , Form . Methods ) ; Object . extend ( Form . Element , Form . Element . Methods ) ; Object . extend ( Element . Methods . ByTag , { "FORM" : Object . clone ( Form . Methods ) , "INPUT" : Object . clone ( Form . Element . Methods ) , "SELECT" : Object . clone ( Form . Element . Methods ) , "TEXTAREA" : Object . clone ( Form . Element . Methods ) } ) ; }
if ( arguments . length == 2 ) { var tagName = methods ; methods = arguments [ 1 ] ; }
if ( ! tagName ) Object . extend ( Element . Methods , methods || { } ) ; else { if ( Object . isArray ( tagName ) ) tagName . each ( extend ) ; else extend ( tagName ) ; }
function extend ( tagName ) { tagName = tagName . toUpperCase ( ) ; if ( ! Element . Methods . ByTag [ tagName ] )
Element . Methods . ByTag [ tagName ] = { } ; Object . extend ( Element . Methods . ByTag [ tagName ] , methods ) ; }
function copy ( methods , destination , onlyIfAbsent ) { onlyIfAbsent = onlyIfAbsent || false ; for ( var property in methods ) { var value = methods [ property ] ; if ( ! Object . isFunction ( value ) ) continue ; if ( ! onlyIfAbsent || ! ( property in destination ) )
destination [ property ] = value . methodize ( ) ; } }
function findDOMClass ( tagName ) { var klass ; var trans = { "OPTGROUP" : "OptGroup" , "TEXTAREA" : "TextArea" , "P" : "Paragraph" , "FIELDSET" : "FieldSet" , "UL" : "UList" , "OL" : "OList" , "DL" : "DList" , "DIR" : "Directory" , "H1" : "Heading" , "H2" : "Heading" , "H3" : "Heading" , "H4" : "Heading" , "H5" : "Heading" , "H6" : "Heading" , "Q" : "Quote" , "INS" : "Mod" , "DEL" : "Mod" , "A" : "Anchor" , "IMG" : "Image" , "CAPTION" : "TableCaption" , "COL" : "TableCol" , "COLGROUP" : "TableCol" , "THEAD" : "TableSection" , "TFOOT" : "TableSection" , "TBODY" : "TableSection" , "TR" : "TableRow" , "TH" : "TableCell" , "TD" : "TableCell" , "FRAMESET" : "FrameSet" , "IFRAME" : "IFrame" } ; if ( trans [ tagName ] ) klass = 'HTML' + trans [ tagName ] + 'Element' ; if ( window [ klass ] ) return window [ klass ] ; klass = 'HTML' + tagName + 'Element' ; if ( window [ klass ] ) return window [ klass ] ; klass = 'HTML' + tagName . capitalize ( ) + 'Element' ; if ( window [ klass ] ) return window [ klass ] ; window [ klass ] = { } ; window [ klass ] . prototype = document . createElement ( tagName ) . _ _proto _ _ ; return window [ klass ] ; }
if ( F . ElementExtensions ) { copy ( Element . Methods , HTMLElement . prototype ) ; copy ( Element . Methods . Simulated , HTMLElement . prototype , true ) ; }
if ( F . SpecificElementExtensions ) { for ( var tag in Element . Methods . ByTag ) { var klass = findDOMClass ( tag ) ; if ( Object . isUndefined ( klass ) ) continue ; copy ( T [ tag ] , klass . prototype ) ; } }
Object . extend ( Element , Element . Methods ) ; delete Element . ByTag ; if ( Element . extend . refresh ) Element . extend . refresh ( ) ; Element . cache = { } ; } ; document . viewport = { getDimensions : function ( ) { var dimensions = { } ; var B = Prototype . Browser ; $w ( 'width height' ) . each ( function ( d ) { var D = d . capitalize ( ) ; dimensions [ d ] = ( B . WebKit && ! document . evaluate ) ? self [ 'inner' + D ] : ( B . Opera ) ? document . body [ 'client' + D ] : document . documentElement [ 'client' + D ] ; } ) ; return dimensions ; } , getWidth : function ( ) { return this . getDimensions ( ) . width ; } , getHeight : function ( ) { return this . getDimensions ( ) . height ; } , getScrollOffsets : function ( ) { return Element . _returnOffset ( window . pageXOffset || document . documentElement . scrollLeft || document . body . scrollLeft , window . pageYOffset || document . documentElement . scrollTop || document . body . scrollTop ) ; } } ; var Selector = Class . create ( { initialize : function ( expression ) { this . expression = expression . strip ( ) ; this . compileMatcher ( ) ; } , shouldUseXPath : function ( ) { if ( ! Prototype . BrowserFeatures . XPath ) return false ; var e = this . expression ; if ( Prototype . Browser . WebKit && ( e . include ( "-of-type" ) || e . include ( ":empty" ) ) )
return false ; if ( ( /(\[[\w-]*?:|:checked)/ ) . test ( this . expression ) )
return false ; return true ; } , compileMatcher : function ( ) { if ( this . shouldUseXPath ( ) )
return this . compileXPathMatcher ( ) ; var e = this . expression , ps = Selector . patterns , h = Selector . handlers , c = Selector . criteria , le , p , m ; if ( Selector . _cache [ e ] ) { this . matcher = Selector . _cache [ e ] ; return ; }
this . matcher = [ "this.matcher = function(root) {" , "var r = root, h = Selector.handlers, c = false, n;" ] ; while ( e && le != e && ( /\S/ ) . test ( e ) ) { le = e ; for ( var i in ps ) { p = ps [ i ] ; if ( m = e . match ( p ) ) { this . matcher . push ( Object . isFunction ( c [ i ] ) ? c [ i ] ( m ) : new Template ( c [ i ] ) . evaluate ( m ) ) ; e = e . replace ( m [ 0 ] , '' ) ; break ; } } }
this . matcher . push ( "return h.unique(n);\n}" ) ; eval ( this . matcher . join ( '\n' ) ) ; Selector . _cache [ this . expression ] = this . matcher ; } , compileXPathMatcher : function ( ) { var e = this . expression , ps = Selector . patterns , x = Selector . xpath , le , m ; if ( Selector . _cache [ e ] ) { this . xpath = Selector . _cache [ e ] ; return ; }
this . matcher = [ './/*' ] ; while ( e && le != e && ( /\S/ ) . test ( e ) ) { le = e ; for ( var i in ps ) { if ( m = e . match ( ps [ i ] ) ) { this . matcher . push ( Object . isFunction ( x [ i ] ) ? x [ i ] ( m ) : new Template ( x [ i ] ) . evaluate ( m ) ) ; e = e . replace ( m [ 0 ] , '' ) ; break ; } } }
this . xpath = this . matcher . join ( '' ) ; Selector . _cache [ this . expression ] = this . xpath ; } , findElements : function ( root ) { root = root || document ; if ( this . xpath ) return document . _getElementsByXPath ( this . xpath , root ) ; return this . matcher ( root ) ; } , match : function ( element ) { this . tokens = [ ] ; var e = this . expression , ps = Selector . patterns , as = Selector . assertions ; var le , p , m ; while ( e && le !== e && ( /\S/ ) . test ( e ) ) { le = e ; for ( var i in ps ) { p = ps [ i ] ; if ( m = e . match ( p ) ) { if ( as [ i ] ) { this . tokens . push ( [ i , Object . clone ( m ) ] ) ; e = e . replace ( m [ 0 ] , '' ) ; } else { return this . findElements ( document ) . include ( element ) ; } } } }
var match = true , name , matches ; for ( var i = 0 , token ; token = this . tokens [ i ] ; i ++ ) { name = token [ 0 ] , matches = token [ 1 ] ; if ( ! Selector . assertions [ name ] ( element , matches ) ) { match = false ; break ; } }
return match ; } , toString : function ( ) { return this . expression ; } , inspect : function ( ) { return "#<Selector:" + this . expression . inspect ( ) + ">" ; } } ) ; Object . extend ( Selector , { _cache : { } , xpath : { descendant : "//*" , child : "/*" , adjacent : "/following-sibling::*[1]" , laterSibling : '/following-sibling::*' , tagName : function ( m ) { if ( m [ 1 ] == '*' ) return '' ; return "[local-name()='" + m [ 1 ] . toLowerCase ( ) + "' or local-name()='" + m [ 1 ] . toUpperCase ( ) + "']" ; } , className : "[contains(concat(' ', @class, ' '), ' #{1} ')]" , id : "[@id='#{1}']" , attrPresence : function ( m ) { m [ 1 ] = m [ 1 ] . toLowerCase ( ) ; return new Template ( "[@#{1}]" ) . evaluate ( m ) ; } , attr : function ( m ) { m [ 1 ] = m [ 1 ] . toLowerCase ( ) ; m [ 3 ] = m [ 5 ] || m [ 6 ] ; return new Template ( Selector . xpath . operators [ m [ 2 ] ] ) . evaluate ( m ) ; } , pseudo : function ( m ) { var h = Selector . xpath . pseudos [ m [ 1 ] ] ; if ( ! h ) return '' ; if ( Object . isFunction ( h ) ) return h ( m ) ; return new Template ( Selector . xpath . pseudos [ m [ 1 ] ] ) . evaluate ( m ) ; } , operators : { '=' : "[@#{1}='#{3}']" , '!=' : "[@#{1}!='#{3}']" , '^=' : "[starts-with(@#{1}, '#{3}')]" , '$=' : "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']" , '*=' : "[contains(@#{1}, '#{3}')]" , '~=' : "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]" , '|=' : "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" } , pseudos : { 'first-child' : '[not(preceding-sibling::*)]' , 'last-child' : '[not(following-sibling::*)]' , 'only-child' : '[not(preceding-sibling::* or following-sibling::*)]' , 'empty' : "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]" , 'checked' : "[@checked]" , 'disabled' : "[@disabled]" , 'enabled' : "[not(@disabled)]" , 'not' : function ( m ) { var e = m [ 6 ] , p = Selector . patterns , x = Selector . xpath , le , v ; var exclusion = [ ] ; while ( e && le != e && ( /\S/ ) . test ( e ) ) { le = e ; for ( var i in p ) { if ( m = e . match ( p [ i ] ) ) { v = Object . isFunction ( x [ i ] ) ? x [ i ] ( m ) : new Template ( x [ i ] ) . evaluate ( m ) ; exclusion . push ( "(" + v . substring ( 1 , v . length - 1 ) + ")" ) ; e = e . replace ( m [ 0 ] , '' ) ; break ; } } }
return "[not(" + exclusion . join ( " and " ) + ")]" ; } , 'nth-child' : function ( m ) { return Selector . xpath . pseudos . nth ( "(count(./preceding-sibling::*) + 1) " , m ) ; } , 'nth-last-child' : function ( m ) { return Selector . xpath . pseudos . nth ( "(count(./following-sibling::*) + 1) " , m ) ; } , 'nth-of-type' : function ( m ) { return Selector . xpath . pseudos . nth ( "position() " , m ) ; } , 'nth-last-of-type' : function ( m ) { return Selector . xpath . pseudos . nth ( "(last() + 1 - position()) " , m ) ; } , 'first-of-type' : function ( m ) { m [ 6 ] = "1" ; return Selector . xpath . pseudos [ 'nth-of-type' ] ( m ) ; } , 'last-of-type' : function ( m ) { m [ 6 ] = "1" ; return Selector . xpath . pseudos [ 'nth-last-of-type' ] ( m ) ; } , 'only-of-type' : function ( m ) { var p = Selector . xpath . pseudos ; return p [ 'first-of-type' ] ( m ) + p [ 'last-of-type' ] ( m ) ; } , nth : function ( fragment , m ) { var mm , formula = m [ 6 ] , predicate ; if ( formula == 'even' ) formula = '2n+0' ; if ( formula == 'odd' ) formula = '2n+1' ; if ( mm = formula . match ( /^(\d+)$/ ) )
return '[' + fragment + "= " + mm [ 1 ] + ']' ; if ( mm = formula . match ( /^(-?\d*)?n(([+-])(\d+))?/ ) ) { if ( mm [ 1 ] == "-" ) mm [ 1 ] = - 1 ; var a = mm [ 1 ] ? Number ( mm [ 1 ] ) : 1 ; var b = mm [ 2 ] ? Number ( mm [ 2 ] ) : 0 ; predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + "((#{fragment} - #{b}) div #{a} >= 0)]" ; return new Template ( predicate ) . evaluate ( { fragment : fragment , a : a , b : b } ) ; } } } } , criteria : { tagName : 'n = h.tagName(n, r, "#{1}", c); c = false;' , className : 'n = h.className(n, r, "#{1}", c); c = false;' , id : 'n = h.id(n, r, "#{1}", c); c = false;' , attrPresence : 'n = h.attrPresence(n, r, "#{1}"); c = false;' , attr : function ( m ) { m [ 3 ] = ( m [ 5 ] || m [ 6 ] ) ; return new Template ( 'n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false;' ) . evaluate ( m ) ; } , pseudo : function ( m ) { if ( m [ 6 ] ) m [ 6 ] = m [ 6 ] . replace ( /"/g , '\\"' ) ; return new Template ( 'n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;' ) . evaluate ( m ) ; } , descendant : 'c = "descendant";' , child : 'c = "child";' , adjacent : 'c = "adjacent";' , laterSibling : 'c = "laterSibling";' } , patterns : { laterSibling : /^\s*~\s*/ , child : /^\s*>\s*/ , adjacent : /^\s*\+\s*/ , descendant : /^\s/ , tagName : /^\s*(\*|[\w\-]+)(\b|$)?/ , id : /^#([\w\-\*]+)(\b|$)/ , className : /^\.([\w\-\*]+)(\b|$)/ , pseudo : /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s)|(?=:))/ , attrPresence : /^\[([\w]+)\]/ , attr : /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ } , assertions : { tagName : function ( element , matches ) { return matches [ 1 ] . toUpperCase ( ) == element . tagName . toUpperCase ( ) ; } , className : function ( element , matches ) { return Element . hasClassName ( element , matches [ 1 ] ) ; } , id : function ( element , matches ) { return element . id === matches [ 1 ] ; } , attrPresence : function ( element , matches ) { return Element . hasAttribute ( element , matches [ 1 ] ) ; } , attr : function ( element , matches ) { var nodeValue = Element . readAttribute ( element , matches [ 1 ] ) ; return Selector . operators [ matches [ 2 ] ] ( nodeValue , matches [ 3 ] ) ; } } , handlers : { concat : function ( a , b ) { for ( var i = 0 , node ; node = b [ i ] ; i ++ )
a . push ( node ) ; return a ; } , mark : function ( nodes ) { for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
node . _counted = true ; return nodes ; } , unmark : function ( nodes ) { for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
node . _counted = undefined ; return nodes ; } , index : function ( parentNode , reverse , ofType ) { parentNode . _counted = true ; if ( reverse ) { for ( var nodes = parentNode . childNodes , i = nodes . length - 1 , j = 1 ; i >= 0 ; i -- ) { var node = nodes [ i ] ; if ( node . nodeType == 1 && ( ! ofType || node . _counted ) ) node . nodeIndex = j ++ ; } } else { for ( var i = 0 , j = 1 , nodes = parentNode . childNodes ; node = nodes [ i ] ; i ++ )
if ( node . nodeType == 1 && ( ! ofType || node . _counted ) ) node . nodeIndex = j ++ ; } } , unique : function ( nodes ) { if ( nodes . length == 0 ) return nodes ; var results = [ ] , n ; for ( var i = 0 , l = nodes . length ; i < l ; i ++ )
if ( ! ( n = nodes [ i ] ) . _counted ) { n . _counted = true ; results . push ( Element . extend ( n ) ) ; }
return Selector . handlers . unmark ( results ) ; } , descendant : function ( nodes ) { var h = Selector . handlers ; for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ )
h . concat ( results , node . getElementsByTagName ( '*' ) ) ; return results ; } , child : function ( nodes ) { var h = Selector . handlers ; for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ ) { for ( var j = 0 , child ; child = node . childNodes [ j ] ; j ++ )
if ( child . nodeType == 1 && child . tagName != '!' ) results . push ( child ) ; }
return results ; } , adjacent : function ( nodes ) { for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ ) { var next = this . nextElementSibling ( node ) ; if ( next ) results . push ( next ) ; }
return results ; } , laterSibling : function ( nodes ) { var h = Selector . handlers ; for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ )
h . concat ( results , Element . nextSiblings ( node ) ) ; return results ; } , nextElementSibling : function ( node ) { while ( node = node . nextSibling )
if ( node . nodeType == 1 ) return node ; return null ; } , previousElementSibling : function ( node ) { while ( node = node . previousSibling )
if ( node . nodeType == 1 ) return node ; return null ; } , tagName : function ( nodes , root , tagName , combinator ) { tagName = tagName . toUpperCase ( ) ; var results = [ ] , h = Selector . handlers ; if ( nodes ) { if ( combinator ) { if ( combinator == "descendant" ) { for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
h . concat ( results , node . getElementsByTagName ( tagName ) ) ; return results ; } else nodes = this [ combinator ] ( nodes ) ; if ( tagName == "*" ) return nodes ; }
for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
if ( node . tagName . toUpperCase ( ) == tagName ) results . push ( node ) ; return results ; } else return root . getElementsByTagName ( tagName ) ; } , id : function ( nodes , root , id , combinator ) { var targetNode = $ ( id ) , h = Selector . handlers ; if ( ! targetNode ) return [ ] ; if ( ! nodes && root == document ) return [ targetNode ] ; if ( nodes ) { if ( combinator ) { if ( combinator == 'child' ) { for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
if ( targetNode . parentNode == node ) return [ targetNode ] ; } else if ( combinator == 'descendant' ) { for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
if ( Element . descendantOf ( targetNode , node ) ) return [ targetNode ] ; } else if ( combinator == 'adjacent' ) { for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
if ( Selector . handlers . previousElementSibling ( targetNode ) == node )
return [ targetNode ] ; } else nodes = h [ combinator ] ( nodes ) ; }
for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
if ( node == targetNode ) return [ targetNode ] ; return [ ] ; }
return ( targetNode && Element . descendantOf ( targetNode , root ) ) ? [ targetNode ] : [ ] ; } , className : function ( nodes , root , className , combinator ) { if ( nodes && combinator ) nodes = this [ combinator ] ( nodes ) ; return Selector . handlers . byClassName ( nodes , root , className ) ; } , byClassName : function ( nodes , root , className ) { if ( ! nodes ) nodes = Selector . handlers . descendant ( [ root ] ) ; var needle = ' ' + className + ' ' ; for ( var i = 0 , results = [ ] , node , nodeClassName ; node = nodes [ i ] ; i ++ ) { nodeClassName = node . className ; if ( nodeClassName . length == 0 ) continue ; if ( nodeClassName == className || ( ' ' + nodeClassName + ' ' ) . include ( needle ) )
results . push ( node ) ; }
return results ; } , attrPresence : function ( nodes , root , attr ) { if ( ! nodes ) nodes = root . getElementsByTagName ( "*" ) ; var results = [ ] ; for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
if ( Element . hasAttribute ( node , attr ) ) results . push ( node ) ; return results ; } , attr : function ( nodes , root , attr , value , operator ) { if ( ! nodes ) nodes = root . getElementsByTagName ( "*" ) ; var handler = Selector . operators [ operator ] , results = [ ] ; for ( var i = 0 , node ; node = nodes [ i ] ; i ++ ) { var nodeValue = Element . readAttribute ( node , attr ) ; if ( nodeValue === null ) continue ; if ( handler ( nodeValue , value ) ) results . push ( node ) ; }
return results ; } , pseudo : function ( nodes , name , value , root , combinator ) { if ( nodes && combinator ) nodes = this [ combinator ] ( nodes ) ; if ( ! nodes ) nodes = root . getElementsByTagName ( "*" ) ; return Selector . pseudos [ name ] ( nodes , value , root ) ; } } , pseudos : { 'first-child' : function ( nodes , value , root ) { for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ ) { if ( Selector . handlers . previousElementSibling ( node ) ) continue ; results . push ( node ) ; }
return results ; } , 'last-child' : function ( nodes , value , root ) { for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ ) { if ( Selector . handlers . nextElementSibling ( node ) ) continue ; results . push ( node ) ; }
return results ; } , 'only-child' : function ( nodes , value , root ) { var h = Selector . handlers ; for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ )
if ( ! h . previousElementSibling ( node ) && ! h . nextElementSibling ( node ) )
results . push ( node ) ; return results ; } , 'nth-child' : function ( nodes , formula , root ) { return Selector . pseudos . nth ( nodes , formula , root ) ; } , 'nth-last-child' : function ( nodes , formula , root ) { return Selector . pseudos . nth ( nodes , formula , root , true ) ; } , 'nth-of-type' : function ( nodes , formula , root ) { return Selector . pseudos . nth ( nodes , formula , root , false , true ) ; } , 'nth-last-of-type' : function ( nodes , formula , root ) { return Selector . pseudos . nth ( nodes , formula , root , true , true ) ; } , 'first-of-type' : function ( nodes , formula , root ) { return Selector . pseudos . nth ( nodes , "1" , root , false , true ) ; } , 'last-of-type' : function ( nodes , formula , root ) { return Selector . pseudos . nth ( nodes , "1" , root , true , true ) ; } , 'only-of-type' : function ( nodes , formula , root ) { var p = Selector . pseudos ; return p [ 'last-of-type' ] ( p [ 'first-of-type' ] ( nodes , formula , root ) , formula , root ) ; } , getIndices : function ( a , b , total ) { if ( a == 0 ) return b > 0 ? [ b ] : [ ] ; return $R ( 1 , total ) . inject ( [ ] , function ( memo , i ) { if ( 0 == ( i - b ) % a && ( i - b ) / a >= 0 ) memo . push ( i ) ; return memo ; } ) ; } , nth : function ( nodes , formula , root , reverse , ofType ) { if ( nodes . length == 0 ) return [ ] ; if ( formula == 'even' ) formula = '2n+0' ; if ( formula == 'odd' ) formula = '2n+1' ; var h = Selector . handlers , results = [ ] , indexed = [ ] , m ; h . mark ( nodes ) ; for ( var i = 0 , node ; node = nodes [ i ] ; i ++ ) { if ( ! node . parentNode . _counted ) { h . index ( node . parentNode , reverse , ofType ) ; indexed . push ( node . parentNode ) ; } }
if ( formula . match ( /^\d+$/ ) ) { formula = Number ( formula ) ; for ( var i = 0 , node ; node = nodes [ i ] ; i ++ )
if ( node . nodeIndex == formula ) results . push ( node ) ; } else if ( m = formula . match ( /^(-?\d*)?n(([+-])(\d+))?/ ) ) { if ( m [ 1 ] == "-" ) m [ 1 ] = - 1 ; var a = m [ 1 ] ? Number ( m [ 1 ] ) : 1 ; var b = m [ 2 ] ? Number ( m [ 2 ] ) : 0 ; var indices = Selector . pseudos . getIndices ( a , b , nodes . length ) ; for ( var i = 0 , node , l = indices . length ; node = nodes [ i ] ; i ++ ) { for ( var j = 0 ; j < l ; j ++ )
if ( node . nodeIndex == indices [ j ] ) results . push ( node ) ; } }
h . unmark ( nodes ) ; h . unmark ( indexed ) ; return results ; } , 'empty' : function ( nodes , value , root ) { for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ ) { if ( node . tagName == '!' || ( node . firstChild && ! node . innerHTML . match ( /^\s*$/ ) ) ) continue ; results . push ( node ) ; }
return results ; } , 'not' : function ( nodes , selector , root ) { var h = Selector . handlers , selectorType , m ; var exclusions = new Selector ( selector ) . findElements ( root ) ; h . mark ( exclusions ) ; for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ )
if ( ! node . _counted ) results . push ( node ) ; h . unmark ( exclusions ) ; return results ; } , 'enabled' : function ( nodes , value , root ) { for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ )
if ( ! node . disabled ) results . push ( node ) ; return results ; } , 'disabled' : function ( nodes , value , root ) { for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ )
if ( node . disabled ) results . push ( node ) ; return results ; } , 'checked' : function ( nodes , value , root ) { for ( var i = 0 , results = [ ] , node ; node = nodes [ i ] ; i ++ )
if ( node . checked ) results . push ( node ) ; return results ; } } , operators : { '=' : function ( nv , v ) { return nv == v ; } , '!=' : function ( nv , v ) { return nv != v ; } , '^=' : function ( nv , v ) { return nv . startsWith ( v ) ; } , '$=' : function ( nv , v ) { return nv . endsWith ( v ) ; } , '*=' : function ( nv , v ) { return nv . include ( v ) ; } , '~=' : function ( nv , v ) { return ( ' ' + nv + ' ' ) . include ( ' ' + v + ' ' ) ; } , '|=' : function ( nv , v ) { return ( '-' + nv . toUpperCase ( ) + '-' ) . include ( '-' + v . toUpperCase ( ) + '-' ) ; } } , matchElements : function ( elements , expression ) { var matches = new Selector ( expression ) . findElements ( ) , h = Selector . handlers ; h . mark ( matches ) ; for ( var i = 0 , results = [ ] , element ; element = elements [ i ] ; i ++ )
if ( element . _counted ) results . push ( element ) ; h . unmark ( matches ) ; return results ; } , findElement : function ( elements , expression , index ) { if ( Object . isNumber ( expression ) ) { index = expression ; expression = false ; }
return Selector . matchElements ( elements , expression || '*' ) [ index || 0 ] ; } , findChildElements : function ( element , expressions ) { var exprs = expressions . join ( ',' ) ; expressions = [ ] ; exprs . scan ( /(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/ , function ( m ) { expressions . push ( m [ 1 ] . strip ( ) ) ; } ) ; var results = [ ] , h = Selector . handlers ; for ( var i = 0 , l = expressions . length , selector ; i < l ; i ++ ) { selector = new Selector ( expressions [ i ] . strip ( ) ) ; h . concat ( results , selector . findElements ( element ) ) ; }
return ( l > 1 ) ? h . unique ( results ) : results ; } } ) ; if ( Prototype . Browser . IE ) { Selector . handlers . concat = function ( a , b ) { for ( var i = 0 , node ; node = b [ i ] ; i ++ )
if ( node . tagName !== "!" ) a . push ( node ) ; return a ; } ; }
function $$ ( ) { return Selector . findChildElements ( document , $A ( arguments ) ) ; }
var Form = { reset : function ( form ) { $ ( form ) . reset ( ) ; return form ; } , serializeElements : function ( elements , options ) { if ( typeof options != 'object' ) options = { hash : ! ! options } ; else if ( Object . isUndefined ( options . hash ) ) options . hash = true ; var key , value , submitted = false , submit = options . submit ; var data = elements . inject ( { } , function ( result , element ) { if ( ! element . disabled && element . name ) { key = element . name ; value = $ ( element ) . getValue ( ) ; if ( value != null && ( element . type != 'submit' || ( ! submitted && submit !== false && ( ! submit || key == submit ) && ( submitted = true ) ) ) ) { if ( key in result ) { if ( ! Object . isArray ( result [ key ] ) ) result [ key ] = [ result [ key ] ] ; result [ key ] . push ( value ) ; }
else result [ key ] = value ; } }
return result ; } ) ; return options . hash ? data : Object . toQueryString ( data ) ; } } ; Form . Methods = { serialize : function ( form , options ) { return Form . serializeElements ( Form . getElements ( form ) , options ) ; } , getElements : function ( form ) { return $A ( $ ( form ) . getElementsByTagName ( '*' ) ) . inject ( [ ] , function ( elements , child ) { if ( Form . Element . Serializers [ child . tagName . toLowerCase ( ) ] )
elements . push ( Element . extend ( child ) ) ; return elements ; } ) ; } , getInputs : function ( form , typeName , name ) { form = $ ( form ) ; var inputs = form . getElementsByTagName ( 'input' ) ; if ( ! typeName && ! name ) return $A ( inputs ) . map ( Element . extend ) ; for ( var i = 0 , matchingInputs = [ ] , length = inputs . length ; i < length ; i ++ ) { var input = inputs [ i ] ; if ( ( typeName && input . type != typeName ) || ( name && input . name != name ) )
continue ; matchingInputs . push ( Element . extend ( input ) ) ; }
return matchingInputs ; } , disable : function ( form ) { form = $ ( form ) ; Form . getElements ( form ) . invoke ( 'disable' ) ; return form ; } , enable : function ( form ) { form = $ ( form ) ; Form . getElements ( form ) . invoke ( 'enable' ) ; return form ; } , findFirstElement : function ( form ) { var elements = $ ( form ) . getElements ( ) . findAll ( function ( element ) { return 'hidden' != element . type && ! element . disabled ; } ) ; var firstByIndex = elements . findAll ( function ( element ) { return element . hasAttribute ( 'tabIndex' ) && element . tabIndex >= 0 ; } ) . sortBy ( function ( element ) { return element . tabIndex } ) . first ( ) ; return firstByIndex ? firstByIndex : elements . find ( function ( element ) { return [ 'input' , 'select' , 'textarea' ] . include ( element . tagName . toLowerCase ( ) ) ; } ) ; } , focusFirstElement : function ( form ) { form = $ ( form ) ; form . findFirstElement ( ) . activate ( ) ; return form ; } , request : function ( form , options ) { form = $ ( form ) , options = Object . clone ( options || { } ) ; var params = options . parameters , action = form . readAttribute ( 'action' ) || '' ; if ( action . blank ( ) ) action = window . location . href ; options . parameters = form . serialize ( true ) ; if ( params ) { if ( Object . isString ( params ) ) params = params . toQueryParams ( ) ; Object . extend ( options . parameters , params ) ; }
if ( form . hasAttribute ( 'method' ) && ! options . method )
options . method = form . method ; return new Ajax . Request ( action , options ) ; } } ; Form . Element = { focus : function ( element ) { $ ( element ) . focus ( ) ; return element ; } , select : function ( element ) { $ ( element ) . select ( ) ; return element ; } } ; Form . Element . Methods = { serialize : function ( element ) { element = $ ( element ) ; if ( ! element . disabled && element . name ) { var value = element . getValue ( ) ; if ( value != undefined ) { var pair = { } ; pair [ element . name ] = value ; return Object . toQueryString ( pair ) ; } }
return '' ; } , getValue : function ( element ) { element = $ ( element ) ; var method = element . tagName . toLowerCase ( ) ; return Form . Element . Serializers [ method ] ( element ) ; } , setValue : function ( element , value ) { element = $ ( element ) ; var method = element . tagName . toLowerCase ( ) ; Form . Element . Serializers [ method ] ( element , value ) ; return element ; } , clear : function ( element ) { $ ( element ) . value = '' ; return element ; } , present : function ( element ) { return $ ( element ) . value != '' ; } , activate : function ( element ) { element = $ ( element ) ; try { element . focus ( ) ; if ( element . select && ( element . tagName . toLowerCase ( ) != 'input' || ! [ 'button' , 'reset' , 'submit' ] . include ( element . type ) ) )
element . select ( ) ; } catch ( e ) { }
return element ; } , disable : function ( element ) { element = $ ( element ) ; element . blur ( ) ; element . disabled = true ; return element ; } , enable : function ( element ) { element = $ ( element ) ; element . disabled = false ; return element ; } } ; var Field = Form . Element ; var $F = Form . Element . Methods . getValue ; Form . Element . Serializers = { input : function ( element , value ) { switch ( element . type . toLowerCase ( ) ) { case 'checkbox' : case 'radio' : return Form . Element . Serializers . inputSelector ( element , value ) ; default : return Form . Element . Serializers . textarea ( element , value ) ; } } , inputSelector : function ( element , value ) { if ( Object . isUndefined ( value ) ) return element . checked ? element . value : null ; else element . checked = ! ! value ; } , textarea : function ( element , value ) { if ( Object . isUndefined ( value ) ) return element . value ; else element . value = value ; } , select : function ( element , index ) { if ( Object . isUndefined ( index ) )
return this [ element . type == 'select-one' ? 'selectOne' : 'selectMany' ] ( element ) ; else { var opt , value , single = ! Object . isArray ( index ) ; for ( var i = 0 , length = element . length ; i < length ; i ++ ) { opt = element . options [ i ] ; value = this . optionValue ( opt ) ; if ( single ) { if ( value == index ) { opt . selected = true ; return ; } }
else opt . selected = index . include ( value ) ; } } } , selectOne : function ( element ) { var index = element . selectedIndex ; return index >= 0 ? this . optionValue ( element . options [ index ] ) : null ; } , selectMany : function ( element ) { var values , length = element . length ; if ( ! length ) return null ; for ( var i = 0 , values = [ ] ; i < length ; i ++ ) { var opt = element . options [ i ] ; if ( opt . selected ) values . push ( this . optionValue ( opt ) ) ; }
return values ; } , optionValue : function ( opt ) { return Element . extend ( opt ) . hasAttribute ( 'value' ) ? opt . value : opt . text ; } } ; Abstract . TimedObserver = Class . create ( PeriodicalExecuter , { initialize : function ( $super , element , frequency , callback ) { $super ( callback , frequency ) ; this . element = $ ( element ) ; this . lastValue = this . getValue ( ) ; } , execute : function ( ) { var value = this . getValue ( ) ; if ( Object . isString ( this . lastValue ) && Object . isString ( value ) ? this . lastValue != value : String ( this . lastValue ) != String ( value ) ) { this . callback ( this . element , value ) ; this . lastValue = value ; } } } ) ; Form . Element . Observer = Class . create ( Abstract . TimedObserver , { getValue : function ( ) { return Form . Element . getValue ( this . element ) ; } } ) ; Form . Observer = Class . create ( Abstract . TimedObserver , { getValue : function ( ) { return Form . serialize ( this . element ) ; } } ) ; Abstract . EventObserver = Class . create ( { initialize : function ( element , callback ) { this . element = $ ( element ) ; this . callback = callback ; this . lastValue = this . getValue ( ) ; if ( this . element . tagName . toLowerCase ( ) == 'form' )
this . registerFormCallbacks ( ) ; else
this . registerCallback ( this . element ) ; } , onElementEvent : function ( ) { var value = this . getValue ( ) ; if ( this . lastValue != value ) { this . callback ( this . element , value ) ; this . lastValue = value ; } } , registerFormCallbacks : function ( ) { Form . getElements ( this . element ) . each ( this . registerCallback , this ) ; } , registerCallback : function ( element ) { if ( element . type ) { switch ( element . type . toLowerCase ( ) ) { case 'checkbox' : case 'radio' : Event . observe ( element , 'click' , this . onElementEvent . bind ( this ) ) ; break ; default : Event . observe ( element , 'change' , this . onElementEvent . bind ( this ) ) ; break ; } } } } ) ; Form . Element . EventObserver = Class . create ( Abstract . EventObserver , { getValue : function ( ) { return Form . Element . getValue ( this . element ) ; } } ) ; Form . EventObserver = Class . create ( Abstract . EventObserver , { getValue : function ( ) { return Form . serialize ( this . element ) ; } } ) ; if ( ! window . Event ) var Event = { } ; Object . extend ( Event , { KEY _BACKSPACE : 8 , KEY _TAB : 9 , KEY _RETURN : 13 , KEY _ESC : 27 , KEY _LEFT : 37 , KEY _UP : 38 , KEY _RIGHT : 39 , KEY _DOWN : 40 , KEY _DELETE : 46 , KEY _HOME : 36 , KEY _END : 35 , KEY _PAGEUP : 33 , KEY _PAGEDOWN : 34 , KEY _INSERT : 45 , cache : { } , relatedTarget : function ( event ) { var element ; switch ( event . type ) { case 'mouseover' : element = event . fromElement ; break ; case 'mouseout' : element = event . toElement ; break ; default : return null ; }
return Element . extend ( element ) ; } } ) ; Event . Methods = ( function ( ) { var isButton ; if ( Prototype . Browser . IE ) { var buttonMap = { 0 : 1 , 1 : 4 , 2 : 2 } ; isButton = function ( event , code ) { return event . button == buttonMap [ code ] ; } ; } else if ( Prototype . Browser . WebKit ) { isButton = function ( event , code ) { switch ( code ) { case 0 : return event . which == 1 && ! event . metaKey ; case 1 : return event . which == 1 && event . metaKey ; default : return false ; } } ; } else { isButton = function ( event , code ) { return event . which ? ( event . which === code + 1 ) : ( event . button === code ) ; } ; }
return { isLeftClick : function ( event ) { return isButton ( event , 0 ) } , isMiddleClick : function ( event ) { return isButton ( event , 1 ) } , isRightClick : function ( event ) { return isButton ( event , 2 ) } , element : function ( event ) { var node = Event . extend ( event ) . target ; return Element . extend ( node . nodeType == Node . TEXT _NODE ? node . parentNode : node ) ; } , findElement : function ( event , expression ) { var element = Event . element ( event ) ; if ( ! expression ) return element ; var elements = [ element ] . concat ( element . ancestors ( ) ) ; return Selector . findElement ( elements , expression , 0 ) ; } , pointer : function ( event ) { return { x : event . pageX || ( event . clientX +
( document . documentElement . scrollLeft || document . body . scrollLeft ) ) , y : event . pageY || ( event . clientY +
( document . documentElement . scrollTop || document . body . scrollTop ) ) } ; } , pointerX : function ( event ) { return Event . pointer ( event ) . x } , pointerY : function ( event ) { return Event . pointer ( event ) . y } , stop : function ( event ) { Event . extend ( event ) ; event . preventDefault ( ) ; event . stopPropagation ( ) ; event . stopped = true ; } } ; } ) ( ) ; Event . extend = ( function ( ) { var methods = Object . keys ( Event . Methods ) . inject ( { } , function ( m , name ) { m [ name ] = Event . Methods [ name ] . methodize ( ) ; return m ; } ) ; if ( Prototype . Browser . IE ) { Object . extend ( methods , { stopPropagation : function ( ) { this . cancelBubble = true } , preventDefault : function ( ) { this . returnValue = false } , inspect : function ( ) { return "[object Event]" } } ) ; return function ( event ) { if ( ! event ) return false ; if ( event . _extendedByPrototype ) return event ; event . _extendedByPrototype = Prototype . emptyFunction ; var pointer = Event . pointer ( event ) ; Object . extend ( event , { target : event . srcElement , relatedTarget : Event . relatedTarget ( event ) , pageX : pointer . x , pageY : pointer . y } ) ; return Object . extend ( event , methods ) ; } ; } else { Event . prototype = Event . prototype || document . createEvent ( "HTMLEvents" ) . _ _proto _ _ ; Object . extend ( Event . prototype , methods ) ; return Prototype . K ; } } ) ( ) ; Object . extend ( Event , ( function ( ) { var cache = Event . cache ; function getEventID ( element ) { if ( element . _eventID ) return element . _eventID ; arguments . callee . id = arguments . callee . id || 1 ; return element . _eventID = ++ arguments . callee . id ; }
function getDOMEventName ( eventName ) { if ( eventName && eventName . include ( ':' ) ) return "dataavailable" ; return eventName ; }
function getCacheForID ( id ) { return cache [ id ] = cache [ id ] || { } ; }
function getWrappersForEventName ( id , eventName ) { var c = getCacheForID ( id ) ; return c [ eventName ] = c [ eventName ] || [ ] ; }
function createWrapper ( element , eventName , handler ) { var id = getEventID ( element ) ; var c = getWrappersForEventName ( id , eventName ) ; if ( c . pluck ( "handler" ) . include ( handler ) ) return false ; var wrapper = function ( event ) { if ( ! Event || ! Event . extend || ( event . eventName && event . eventName != eventName ) )
return false ; Event . extend ( event ) ; handler . call ( element , event ) } ; wrapper . handler = handler ; c . push ( wrapper ) ; return wrapper ; }
function findWrapper ( id , eventName , handler ) { var c = getWrappersForEventName ( id , eventName ) ; return c . find ( function ( wrapper ) { return wrapper . handler == handler } ) ; }
function destroyWrapper ( id , eventName , handler ) { var c = getCacheForID ( id ) ; if ( ! c [ eventName ] ) return false ; c [ eventName ] = c [ eventName ] . without ( findWrapper ( id , eventName , handler ) ) ; }
function destroyCache ( ) { for ( var id in cache )
for ( var eventName in cache [ id ] )
cache [ id ] [ eventName ] = null ; }
if ( window . attachEvent ) { window . attachEvent ( "onunload" , destroyCache ) ; }
return { observe : function ( element , eventName , handler ) { element = $ ( element ) ; var name = getDOMEventName ( eventName ) ; var wrapper = createWrapper ( element , eventName , handler ) ; if ( ! wrapper ) return element ; if ( element . addEventListener ) { element . addEventListener ( name , wrapper , false ) ; } else { element . attachEvent ( "on" + name , wrapper ) ; }
return element ; } , stopObserving : function ( element , eventName , handler ) { element = $ ( element ) ; var id = getEventID ( element ) , name = getDOMEventName ( eventName ) ; if ( ! handler && eventName ) { getWrappersForEventName ( id , eventName ) . each ( function ( wrapper ) { element . stopObserving ( eventName , wrapper . handler ) ; } ) ; return element ; } else if ( ! eventName ) { Object . keys ( getCacheForID ( id ) ) . each ( function ( eventName ) { element . stopObserving ( eventName ) ; } ) ; return element ; }
var wrapper = findWrapper ( id , eventName , handler ) ; if ( ! wrapper ) return element ; if ( element . removeEventListener ) { element . removeEventListener ( name , wrapper , false ) ; } else { element . detachEvent ( "on" + name , wrapper ) ; }
destroyWrapper ( id , eventName , handler ) ; return element ; } , fire : function ( element , eventName , memo ) { element = $ ( element ) ; if ( element == document && document . createEvent && ! element . dispatchEvent )
element = document . documentElement ; if ( document . createEvent ) { var event = document . createEvent ( "HTMLEvents" ) ; event . initEvent ( "dataavailable" , true , true ) ; } else { var event = document . createEventObject ( ) ; event . eventType = "ondataavailable" ; }
event . eventName = eventName ; event . memo = memo || { } ; if ( document . createEvent ) { element . dispatchEvent ( event ) ; } else { element . fireEvent ( event . eventType , event ) ; }
return Event . extend ( event ) ; } } ; } ) ( ) ) ; Object . extend ( Event , Event . Methods ) ; Element . addMethods ( { fire : Event . fire , observe : Event . observe , stopObserving : Event . stopObserving } ) ; Object . extend ( document , { fire : Element . Methods . fire . methodize ( ) , observe : Element . Methods . observe . methodize ( ) , stopObserving : Element . Methods . stopObserving . methodize ( ) } ) ; ( function ( ) { var timer , fired = false ; function fireContentLoadedEvent ( ) { if ( fired ) return ; if ( timer ) window . clearInterval ( timer ) ; document . fire ( "dom:loaded" ) ; fired = true ; }
if ( document . addEventListener ) { if ( Prototype . Browser . WebKit ) { timer = window . setInterval ( function ( ) { if ( /loaded|complete/ . test ( document . readyState ) )
fireContentLoadedEvent ( ) ; } , 0 ) ; Event . observe ( window , "load" , fireContentLoadedEvent ) ; } else { document . addEventListener ( "DOMContentLoaded" , fireContentLoadedEvent , false ) ; } } else { document . write ( "<script id=__onDOMContentLoaded defer src=//:><\/script>" ) ; $ ( "__onDOMContentLoaded" ) . onreadystatechange = function ( ) { if ( this . readyState == "complete" ) { this . onreadystatechange = null ; fireContentLoadedEvent ( ) ; } } ; } } ) ( ) ; Hash . toQueryString = Object . toQueryString ; var Toggle = { display : Element . toggle } ; Element . Methods . childOf = Element . Methods . descendantOf ; var Insertion = { Before : function ( element , content ) { return Element . insert ( element , { before : content } ) ; } , Top : function ( element , content ) { return Element . insert ( element , { top : content } ) ; } , Bottom : function ( element , content ) { return Element . insert ( element , { bottom : content } ) ; } , After : function ( element , content ) { return Element . insert ( element , { after : content } ) ; } } ; var $continue = new Error ( '"throw $continue" is deprecated, use "return" instead' ) ; var Position = { includeScrollOffsets : false , prepare : function ( ) { this . deltaX = window . pageXOffset || document . documentElement . scrollLeft || document . body . scrollLeft || 0 ; this . deltaY = window . pageYOffset || document . documentElement . scrollTop || document . body . scrollTop || 0 ; } , within : function ( element , x , y ) { if ( this . includeScrollOffsets )
return this . withinIncludingScrolloffsets ( element , x , y ) ; this . xcomp = x ; this . ycomp = y ; this . offset = Element . cumulativeOffset ( element ) ; return ( y >= this . offset [ 1 ] && y < this . offset [ 1 ] + element . offsetHeight && x >= this . offset [ 0 ] && x < this . offset [ 0 ] + element . offsetWidth ) ; } , withinIncludingScrolloffsets : function ( element , x , y ) { var offsetcache = Element . cumulativeScrollOffset ( element ) ; this . xcomp = x + offsetcache [ 0 ] - this . deltaX ; this . ycomp = y + offsetcache [ 1 ] - this . deltaY ; this . offset = Element . cumulativeOffset ( element ) ; return ( this . ycomp >= this . offset [ 1 ] && this . ycomp < this . offset [ 1 ] + element . offsetHeight && this . xcomp >= this . offset [ 0 ] && this . xcomp < this . offset [ 0 ] + element . offsetWidth ) ; } , overlap : function ( mode , element ) { if ( ! mode ) return 0 ; if ( mode == 'vertical' )
return ( ( this . offset [ 1 ] + element . offsetHeight ) - this . ycomp ) / element . offsetHeight ; if ( mode == 'horizontal' )
return ( ( this . offset [ 0 ] + element . offsetWidth ) - this . xcomp ) / element . offsetWidth ; } , cumulativeOffset : Element . Methods . cumulativeOffset , positionedOffset : Element . Methods . positionedOffset , absolutize : function ( element ) { Position . prepare ( ) ; return Element . absolutize ( element ) ; } , relativize : function ( element ) { Position . prepare ( ) ; return Element . relativize ( element ) ; } , realOffset : Element . Methods . cumulativeScrollOffset , offsetParent : Element . Methods . getOffsetParent , page : Element . Methods . viewportOffset , clone : function ( source , target , options ) { options = options || { } ; return Element . clonePosition ( target , source , options ) ; } } ; if ( ! document . getElementsByClassName ) document . getElementsByClassName = function ( instanceMethods ) { function iter ( name ) { return name . blank ( ) ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]" ; }
instanceMethods . getElementsByClassName = Prototype . BrowserFeatures . XPath ? function ( element , className ) { className = className . toString ( ) . strip ( ) ; var cond = /\s/ . test ( className ) ? $w ( className ) . map ( iter ) . join ( '' ) : iter ( className ) ; return cond ? document . _getElementsByXPath ( './/*' + cond , element ) : [ ] ; } : function ( element , className ) { className = className . toString ( ) . strip ( ) ; var elements = [ ] , classNames = ( /\s/ . test ( className ) ? $w ( className ) : null ) ; if ( ! classNames && ! className ) return elements ; var nodes = $ ( element ) . getElementsByTagName ( '*' ) ; className = ' ' + className + ' ' ; for ( var i = 0 , child , cn ; child = nodes [ i ] ; i ++ ) { if ( child . className && ( cn = ' ' + child . className + ' ' ) && ( cn . include ( className ) || ( classNames && classNames . all ( function ( name ) { return ! name . toString ( ) . blank ( ) && cn . include ( ' ' + name + ' ' ) ; } ) ) ) )
elements . push ( Element . extend ( child ) ) ; }
return elements ; } ; return function ( className , parentElement ) { return $ ( parentElement || document . body ) . getElementsByClassName ( className ) ; } ; } ( Element . Methods ) ; Element . ClassNames = Class . create ( ) ; Element . ClassNames . prototype = { initialize : function ( element ) { this . element = $ ( element ) ; } , _each : function ( iterator ) { this . element . className . split ( /\s+/ ) . select ( function ( name ) { return name . length > 0 ; } ) . _each ( iterator ) ; } , set : function ( className ) { this . element . className = className ; } , add : function ( classNameToAdd ) { if ( this . include ( classNameToAdd ) ) return ; this . set ( $A ( this ) . concat ( classNameToAdd ) . join ( ' ' ) ) ; } , remove : function ( classNameToRemove ) { if ( ! this . include ( classNameToRemove ) ) return ; this . set ( $A ( this ) . without ( classNameToRemove ) . join ( ' ' ) ) ; } , toString : function ( ) { return $A ( this ) . join ( ' ' ) ; } } ; Object . extend ( Element . ClassNames . prototype , Enumerable ) ; Element . addMethods ( ) ; String . prototype . parseColor = function ( ) { var color = '#' ; if ( this . slice ( 0 , 4 ) == 'rgb(' ) { var cols = this . slice ( 4 , this . length - 1 ) . split ( ',' ) ; var i = 0 ; do { color += parseInt ( cols [ i ] ) . toColorPart ( ) } while ( ++ i < 3 ) ; } else { if ( this . slice ( 0 , 1 ) == '#' ) { if ( this . length == 4 ) for ( var i = 1 ; i < 4 ; i ++ ) color += ( this . charAt ( i ) + this . charAt ( i ) ) . toLowerCase ( ) ; if ( this . length == 7 ) color = this . toLowerCase ( ) ; } }
return ( color . length == 7 ? color : ( arguments [ 0 ] || this ) ) ; } ; Element . collectTextNodes = function ( element ) { return $A ( $ ( element ) . childNodes ) . collect ( function ( node ) { return ( node . nodeType == 3 ? node . nodeValue : ( node . hasChildNodes ( ) ? Element . collectTextNodes ( node ) : '' ) ) ; } ) . flatten ( ) . join ( '' ) ; } ; Element . collectTextNodesIgnoreClass = function ( element , className ) { return $A ( $ ( element ) . childNodes ) . collect ( function ( node ) { return ( node . nodeType == 3 ? node . nodeValue : ( ( node . hasChildNodes ( ) && ! Element . hasClassName ( node , className ) ) ? Element . collectTextNodesIgnoreClass ( node , className ) : '' ) ) ; } ) . flatten ( ) . join ( '' ) ; } ; Element . setContentZoom = function ( element , percent ) { element = $ ( element ) ; element . setStyle ( { fontSize : ( percent / 100 ) + 'em' } ) ; if ( Prototype . Browser . WebKit ) window . scrollBy ( 0 , 0 ) ; return element ; } ; Element . getInlineOpacity = function ( element ) { return $ ( element ) . style . opacity || '' ; } ; Element . forceRerendering = function ( element ) { try { element = $ ( element ) ; var n = document . createTextNode ( ' ' ) ; element . appendChild ( n ) ; element . removeChild ( n ) ; } catch ( e ) { } } ; var Effect = { _elementDoesNotExistError : { name : 'ElementDoesNotExistError' , message : 'The specified DOM element does not exist, but is required for this effect to operate' } , Transitions : { linear : Prototype . K , sinoidal : function ( pos ) { return ( - Math . cos ( pos * Math . PI ) / 2 ) + 0.5 ; } , reverse : function ( pos ) { return 1 - pos ; } , flicker : function ( pos ) { var pos = ( ( - Math . cos ( pos * Math . PI ) / 4 ) + 0.75 ) + Math . random ( ) / 4 ; return pos > 1 ? 1 : pos ; } , wobble : function ( pos ) { return ( - Math . cos ( pos * Math . PI * ( 9 * pos ) ) / 2 ) + 0.5 ; } , pulse : function ( pos , pulses ) { pulses = pulses || 5 ; return ( ( ( pos % ( 1 / pulses ) ) * pulses ) . round ( ) == 0 ? ( ( pos * pulses * 2 ) - ( pos * pulses * 2 ) . floor ( ) ) : 1 - ( ( pos * pulses * 2 ) - ( pos * pulses * 2 ) . floor ( ) ) ) ; } , spring : function ( pos ) { return 1 - ( Math . cos ( pos * 4.5 * Math . PI ) * Math . exp ( - pos * 6 ) ) ; } , none : function ( pos ) { return 0 ; } , full : function ( pos ) { return 1 ; } } , DefaultOptions : { duration : 1.0 , fps : 100 , sync : false , from : 0.0 , to : 1.0 , delay : 0.0 , queue : 'parallel' } , tagifyText : function ( element ) { var tagifyStyle = 'position:relative' ; if ( Prototype . Browser . IE ) tagifyStyle += ';zoom:1' ; element = $ ( element ) ; $A ( element . childNodes ) . each ( function ( child ) { if ( child . nodeType == 3 ) { child . nodeValue . toArray ( ) . each ( function ( character ) { element . insertBefore ( new Element ( 'span' , { style : tagifyStyle } ) . update ( character == ' ' ? String . fromCharCode ( 160 ) : character ) , child ) ; } ) ; Element . remove ( child ) ; } } ) ; } , multiple : function ( element , effect ) { var elements ; if ( ( ( typeof element == 'object' ) || Object . isFunction ( element ) ) && ( element . length ) )
elements = element ; else
elements = $ ( element ) . childNodes ; var options = Object . extend ( { speed : 0.1 , delay : 0.0 } , arguments [ 2 ] || { } ) ; var masterDelay = options . delay ; $A ( elements ) . each ( function ( element , index ) { new effect ( element , Object . extend ( options , { delay : index * options . speed + masterDelay } ) ) ; } ) ; } , PAIRS : { 'slide' : [ 'SlideDown' , 'SlideUp' ] , 'blind' : [ 'BlindDown' , 'BlindUp' ] , 'appear' : [ 'Appear' , 'Fade' ] } , toggle : function ( element , effect ) { element = $ ( element ) ; effect = ( effect || 'appear' ) . toLowerCase ( ) ; var options = Object . extend ( { queue : { position : 'end' , scope : ( element . id || 'global' ) , limit : 1 } } , arguments [ 2 ] || { } ) ; Effect [ element . visible ( ) ? Effect . PAIRS [ effect ] [ 1 ] : Effect . PAIRS [ effect ] [ 0 ] ] ( element , options ) ; } } ; Effect . DefaultOptions . transition = Effect . Transitions . sinoidal ; Effect . ScopedQueue = Class . create ( Enumerable , { initialize : function ( ) { this . effects = [ ] ; this . interval = null ; } , _each : function ( iterator ) { this . effects . _each ( iterator ) ; } , add : function ( effect ) { var timestamp = new Date ( ) . getTime ( ) ; var position = Object . isString ( effect . options . queue ) ? effect . options . queue : effect . options . queue . position ; switch ( position ) { case 'front' : this . effects . findAll ( function ( e ) { return e . state == 'idle' } ) . each ( function ( e ) { e . startOn += effect . finishOn ; e . finishOn += effect . finishOn ; } ) ; break ; case 'with-last' : timestamp = this . effects . pluck ( 'startOn' ) . max ( ) || timestamp ; break ; case 'end' : timestamp = this . effects . pluck ( 'finishOn' ) . max ( ) || timestamp ; break ; }
effect . startOn += timestamp ; effect . finishOn += timestamp ; if ( ! effect . options . queue . limit || ( this . effects . length < effect . options . queue . limit ) )
this . effects . push ( effect ) ; if ( ! this . interval )
this . interval = setInterval ( this . loop . bind ( this ) , 15 ) ; } , remove : function ( effect ) { this . effects = this . effects . reject ( function ( e ) { return e == effect } ) ; if ( this . effects . length == 0 ) { clearInterval ( this . interval ) ; this . interval = null ; } } , loop : function ( ) { var timePos = new Date ( ) . getTime ( ) ; for ( var i = 0 , len = this . effects . length ; i < len ; i ++ )
this . effects [ i ] && this . effects [ i ] . loop ( timePos ) ; } } ) ; Effect . Queues = { instances : $H ( ) , get : function ( queueName ) { if ( ! Object . isString ( queueName ) ) return queueName ; return this . instances . get ( queueName ) || this . instances . set ( queueName , new Effect . ScopedQueue ( ) ) ; } } ; Effect . Queue = Effect . Queues . get ( 'global' ) ; Effect . Base = Class . create ( { position : null , start : function ( options ) { function codeForEvent ( options , eventName ) { return ( ( options [ eventName + 'Internal' ] ? 'this.options.' + eventName + 'Internal(this);' : '' ) +
( options [ eventName ] ? 'this.options.' + eventName + '(this);' : '' ) ) ; }
if ( options && options . transition === false ) options . transition = Effect . Transitions . linear ; this . options = Object . extend ( Object . extend ( { } , Effect . DefaultOptions ) , options || { } ) ; this . currentFrame = 0 ; this . state = 'idle' ; this . startOn = this . options . delay * 1000 ; this . finishOn = this . startOn + ( this . options . duration * 1000 ) ; this . fromToDelta = this . options . to - this . options . from ; this . totalTime = this . finishOn - this . startOn ; this . totalFrames = this . options . fps * this . options . duration ; eval ( 'this.render = function(pos){ ' + 'if (this.state=="idle"){this.state="running";' +
codeForEvent ( this . options , 'beforeSetup' ) +
( this . setup ? 'this.setup();' : '' ) +
codeForEvent ( this . options , 'afterSetup' ) + '};if (this.state=="running"){' + 'pos=this.options.transition(pos)*' + this . fromToDelta + '+' + this . options . from + ';' + 'this.position=pos;' +
codeForEvent ( this . options , 'beforeUpdate' ) +
( this . update ? 'this.update(pos);' : '' ) +
codeForEvent ( this . options , 'afterUpdate' ) + '}}' ) ; this . event ( 'beforeStart' ) ; if ( ! this . options . sync )
Effect . Queues . get ( Object . isString ( this . options . queue ) ? 'global' : this . options . queue . scope ) . add ( this ) ; } , loop : function ( timePos ) { if ( timePos >= this . startOn ) { if ( timePos >= this . finishOn ) { this . render ( 1.0 ) ; this . cancel ( ) ; this . event ( 'beforeFinish' ) ; if ( this . finish ) this . finish ( ) ; this . event ( 'afterFinish' ) ; return ; }
var pos = ( timePos - this . startOn ) / this . totalTime , frame = ( pos * this . totalFrames ) . round ( ) ; if ( frame > this . currentFrame ) { this . render ( pos ) ; this . currentFrame = frame ; } } } , cancel : function ( ) { if ( ! this . options . sync )
Effect . Queues . get ( Object . isString ( this . options . queue ) ? 'global' : this . options . queue . scope ) . remove ( this ) ; this . state = 'finished' ; } , event : function ( eventName ) { if ( this . options [ eventName + 'Internal' ] ) this . options [ eventName + 'Internal' ] ( this ) ; if ( this . options [ eventName ] ) this . options [ eventName ] ( this ) ; } , inspect : function ( ) { var data = $H ( ) ; for ( property in this )
if ( ! Object . isFunction ( this [ property ] ) ) data . set ( property , this [ property ] ) ; return '#<Effect:' + data . inspect ( ) + ',options:' + $H ( this . options ) . inspect ( ) + '>' ; } } ) ; Effect . Parallel = Class . create ( Effect . Base , { initialize : function ( effects ) { this . effects = effects || [ ] ; this . start ( arguments [ 1 ] ) ; } , update : function ( position ) { this . effects . invoke ( 'render' , position ) ; } , finish : function ( position ) { this . effects . each ( function ( effect ) { effect . render ( 1.0 ) ; effect . cancel ( ) ; effect . event ( 'beforeFinish' ) ; if ( effect . finish ) effect . finish ( position ) ; effect . event ( 'afterFinish' ) ; } ) ; } } ) ; Effect . Tween = Class . create ( Effect . Base , { initialize : function ( object , from , to ) { object = Object . isString ( object ) ? $ ( object ) : object ; var args = $A ( arguments ) , method = args . last ( ) , options = args . length == 5 ? args [ 3 ] : null ; this . method = Object . isFunction ( method ) ? method . bind ( object ) : Object . isFunction ( object [ method ] ) ? object [ method ] . bind ( object ) : function ( value ) { object [ method ] = value } ; this . start ( Object . extend ( { from : from , to : to } , options || { } ) ) ; } , update : function ( position ) { this . method ( position ) ; } } ) ; Effect . Event = Class . create ( Effect . Base , { initialize : function ( ) { this . start ( Object . extend ( { duration : 0 } , arguments [ 0 ] || { } ) ) ; } , update : Prototype . emptyFunction } ) ; Effect . Opacity = Class . create ( Effect . Base , { initialize : function ( element ) { this . element = $ ( element ) ; if ( ! this . element ) throw ( Effect . _elementDoesNotExistError ) ; if ( Prototype . Browser . IE && ( ! this . element . currentStyle . hasLayout ) )
this . element . setStyle ( { zoom : 1 } ) ; var options = Object . extend ( { from : this . element . getOpacity ( ) || 0.0 , to : 1.0 } , arguments [ 1 ] || { } ) ; this . start ( options ) ; } , update : function ( position ) { this . element . setOpacity ( position ) ; } } ) ; Effect . Move = Class . create ( Effect . Base , { initialize : function ( element ) { this . element = $ ( element ) ; if ( ! this . element ) throw ( Effect . _elementDoesNotExistError ) ; var options = Object . extend ( { x : 0 , y : 0 , mode : 'relative' } , arguments [ 1 ] || { } ) ; this . start ( options ) ; } , setup : function ( ) { this . element . makePositioned ( ) ; this . originalLeft = parseFloat ( this . element . getStyle ( 'left' ) || '0' ) ; this . originalTop = parseFloat ( this . element . getStyle ( 'top' ) || '0' ) ; if ( this . options . mode == 'absolute' ) { this . options . x = this . options . x - this . originalLeft ; this . options . y = this . options . y - this . originalTop ; } } , update : function ( position ) { this . element . setStyle ( { left : ( this . options . x * position + this . originalLeft ) . round ( ) + 'px' , top : ( this . options . y * position + this . originalTop ) . round ( ) + 'px' } ) ; } } ) ; Effect . MoveBy = function ( element , toTop , toLeft ) { return new Effect . Move ( element , Object . extend ( { x : toLeft , y : toTop } , arguments [ 3 ] || { } ) ) ; } ; Effect . Scale = Class . create ( Effect . Base , { initialize : function ( element , percent ) { this . element = $ ( element ) ; if ( ! this . element ) throw ( Effect . _elementDoesNotExistError ) ; var options = Object . extend ( { scaleX : true , scaleY : true , scaleContent : true , scaleFromCenter : false , scaleMode : 'box' , scaleFrom : 100.0 , scaleTo : percent } , arguments [ 2 ] || { } ) ; this . start ( options ) ; } , setup : function ( ) { this . restoreAfterFinish = this . options . restoreAfterFinish || false ; this . elementPositioning = this . element . getStyle ( 'position' ) ; this . originalStyle = { } ; [ 'top' , 'left' , 'width' , 'height' , 'fontSize' ] . each ( function ( k ) { this . originalStyle [ k ] = this . element . style [ k ] ; } . bind ( this ) ) ; this . originalTop = this . element . offsetTop ; this . originalLeft = this . element . offsetLeft ; var fontSize = this . element . getStyle ( 'font-size' ) || '100%' ; [ 'em' , 'px' , '%' , 'pt' ] . each ( function ( fontSizeType ) { if ( fontSize . indexOf ( fontSizeType ) > 0 ) { this . fontSize = parseFloat ( fontSize ) ; this . fontSizeType = fontSizeType ; } } . bind ( this ) ) ; this . factor = ( this . options . scaleTo - this . options . scaleFrom ) / 100 ; this . dims = null ; if ( this . options . scaleMode == 'box' )
this . dims = [ this . element . offsetHeight , this . element . offsetWidth ] ; if ( /^content/ . test ( this . options . scaleMode ) )
this . dims = [ this . element . scrollHeight , this . element . scrollWidth ] ; if ( ! this . dims )
this . dims = [ this . options . scaleMode . originalHeight , this . options . scaleMode . originalWidth ] ; } , update : function ( position ) { var currentScale = ( this . options . scaleFrom / 100.0 ) + ( this . factor * position ) ; if ( this . options . scaleContent && this . fontSize )
this . element . setStyle ( { fontSize : this . fontSize * currentScale + this . fontSizeType } ) ; this . setDimensions ( this . dims [ 0 ] * currentScale , this . dims [ 1 ] * currentScale ) ; } , finish : function ( position ) { if ( this . restoreAfterFinish ) this . element . setStyle ( this . originalStyle ) ; } , setDimensions : function ( height , width ) { var d = { } ; if ( this . options . scaleX ) d . width = width . round ( ) + 'px' ; if ( this . options . scaleY ) d . height = height . round ( ) + 'px' ; if ( this . options . scaleFromCenter ) { var topd = ( height - this . dims [ 0 ] ) / 2 ; var leftd = ( width - this . dims [ 1 ] ) / 2 ; if ( this . elementPositioning == 'absolute' ) { if ( this . options . scaleY ) d . top = this . originalTop - topd + 'px' ; if ( this . options . scaleX ) d . left = this . originalLeft - leftd + 'px' ; } else { if ( this . options . scaleY ) d . top = - topd + 'px' ; if ( this . options . scaleX ) d . left = - leftd + 'px' ; } }
this . element . setStyle ( d ) ; } } ) ; Effect . Highlight = Class . create ( Effect . Base , { initialize : function ( element ) { this . element = $ ( element ) ; if ( ! this . element ) throw ( Effect . _elementDoesNotExistError ) ; var options = Object . extend ( { startcolor : '#ffff99' } , arguments [ 1 ] || { } ) ; this . start ( options ) ; } , setup : function ( ) { if ( this . element . getStyle ( 'display' ) == 'none' ) { this . cancel ( ) ; return ; }
this . oldStyle = { } ; if ( ! this . options . keepBackgroundImage ) { this . oldStyle . backgroundImage = this . element . getStyle ( 'background-image' ) ; this . element . setStyle ( { backgroundImage : 'none' } ) ; }
if ( ! this . options . endcolor )
this . options . endcolor = this . element . getStyle ( 'background-color' ) . parseColor ( '#ffffff' ) ; if ( ! this . options . restorecolor )
this . options . restorecolor = this . element . getStyle ( 'background-color' ) ; this . _base = $R ( 0 , 2 ) . map ( function ( i ) { return parseInt ( this . options . startcolor . slice ( i * 2 + 1 , i * 2 + 3 ) , 16 ) } . bind ( this ) ) ; this . _delta = $R ( 0 , 2 ) . map ( function ( i ) { return parseInt ( this . options . endcolor . slice ( i * 2 + 1 , i * 2 + 3 ) , 16 ) - this . _base [ i ] } . bind ( this ) ) ; } , update : function ( position ) { this . element . setStyle ( { backgroundColor : $R ( 0 , 2 ) . inject ( '#' , function ( m , v , i ) { return m + ( ( this . _base [ i ] + ( this . _delta [ i ] * position ) ) . round ( ) . toColorPart ( ) ) ; } . bind ( this ) ) } ) ; } , finish : function ( ) { this . element . setStyle ( Object . extend ( this . oldStyle , { backgroundColor : this . options . restorecolor } ) ) ; } } ) ; Effect . ScrollTo = function ( element ) { var options = arguments [ 1 ] || { } , scrollOffsets = document . viewport . getScrollOffsets ( ) , elementOffsets = $ ( element ) . cumulativeOffset ( ) , max = ( window . height || document . body . scrollHeight ) - document . viewport . getHeight ( ) ; if ( options . offset ) elementOffsets [ 1 ] += options . offset ; return new Effect . Tween ( null , scrollOffsets . top , elementOffsets [ 1 ] > max ? max : elementOffsets [ 1 ] , options , function ( p ) { scrollTo ( scrollOffsets . left , p . round ( ) ) } ) ; } ; Effect . Fade = function ( element ) { element = $ ( element ) ; var oldOpacity = element . getInlineOpacity ( ) ; var options = Object . extend ( { from : element . getOpacity ( ) || 1.0 , to : 0.0 , afterFinishInternal : function ( effect ) { if ( effect . options . to != 0 ) return ; effect . element . hide ( ) . setStyle ( { opacity : oldOpacity } ) ; } } , arguments [ 1 ] || { } ) ; return new Effect . Opacity ( element , options ) ; } ; Effect . Appear = function ( element ) { element = $ ( element ) ; var options = Object . extend ( { from : ( element . getStyle ( 'display' ) == 'none' ? 0.0 : element . getOpacity ( ) || 0.0 ) , to : 1.0 , afterFinishInternal : function ( effect ) { effect . element . forceRerendering ( ) ; } , beforeSetup : function ( effect ) { effect . element . setOpacity ( effect . options . from ) . show ( ) ; } } , arguments [ 1 ] || { } ) ; return new Effect . Opacity ( element , options ) ; } ; Effect . Puff = function ( element ) { element = $ ( element ) ; var oldStyle = { opacity : element . getInlineOpacity ( ) , position : element . getStyle ( 'position' ) , top : element . style . top , left : element . style . left , width : element . style . width , height : element . style . height } ; return new Effect . Parallel ( [ new Effect . Scale ( element , 200 , { sync : true , scaleFromCenter : true , scaleContent : true , restoreAfterFinish : true } ) , new Effect . Opacity ( element , { sync : true , to : 0.0 } ) ] , Object . extend ( { duration : 1.0 , beforeSetupInternal : function ( effect ) { Position . absolutize ( effect . effects [ 0 ] . element ) } , afterFinishInternal : function ( effect ) { effect . effects [ 0 ] . element . hide ( ) . setStyle ( oldStyle ) ; } } , arguments [ 1 ] || { } ) ) ; } ; Effect . BlindUp = function ( element ) { element = $ ( element ) ; element . makeClipping ( ) ; return new Effect . Scale ( element , 0 , Object . extend ( { scaleContent : false , scaleX : false , restoreAfterFinish : true , afterFinishInternal : function ( effect ) { effect . element . hide ( ) . undoClipping ( ) ; } } , arguments [ 1 ] || { } ) ) ; } ; Effect . BlindDown = function ( element ) { element = $ ( element ) ; var elementDimensions = element . getDimensions ( ) ; return new Effect . Scale ( element , 100 , Object . extend ( { scaleContent : false , scaleX : false , scaleFrom : 0 , scaleMode : { originalHeight : elementDimensions . height , originalWidth : elementDimensions . width } , restoreAfterFinish : true , afterSetup : function ( effect ) { effect . element . makeClipping ( ) . setStyle ( { height : '0px' } ) . show ( ) ; } , afterFinishInternal : function ( effect ) { effect . element . undoClipping ( ) ; } } , arguments [ 1 ] || { } ) ) ; } ; Effect . SwitchOff = function ( element ) { element = $ ( element ) ; var oldOpacity = element . getInlineOpacity ( ) ; return new Effect . Appear ( element , Object . extend ( { duration : 0.4 , from : 0 , transition : Effect . Transitions . flicker , afterFinishInternal : function ( effect ) { new Effect . Scale ( effect . element , 1 , { duration : 0.3 , scaleFromCenter : true , scaleX : false , scaleContent : false , restoreAfterFinish : true , beforeSetup : function ( effect ) { effect . element . makePositioned ( ) . makeClipping ( ) ; } , afterFinishInternal : function ( effect ) { effect . element . hide ( ) . undoClipping ( ) . undoPositioned ( ) . setStyle ( { opacity : oldOpacity } ) ; } } ) } } , arguments [ 1 ] || { } ) ) ; } ; Effect . DropOut = function ( element ) { element = $ ( element ) ; var oldStyle = { top : element . getStyle ( 'top' ) , left : element . getStyle ( 'left' ) , opacity : element . getInlineOpacity ( ) } ; return new Effect . Parallel ( [ new Effect . Move ( element , { x : 0 , y : 100 , sync : true } ) , new Effect . Opacity ( element , { sync : true , to : 0.0 } ) ] , Object . extend ( { duration : 0
return new Effect . Move ( element , { x : initialMoveX , y : initialMoveY , duration : 0.01 , beforeSetup : function ( effect ) { effect . element . hide ( ) . makeClipping ( ) . makePositioned ( ) ; } , afterFinishInternal : function ( effect ) { new Effect . Parallel ( [ new Effect . Opacity ( effect . element , { sync : true , to : 1.0 , from : 0.0 , transition : options . opacityTransition } ) , new Effect . Move ( effect . element , { x : moveX , y : moveY , sync : true , transition : options . moveTransition } ) , new Effect . Scale ( effect . element , 100 , { scaleMode : { originalHeight : dims . height , originalWidth : dims . width } , sync : true , scaleFrom : window . opera ? 1 : 0 , transition : options . scaleTransition , restoreAfterFinish : true } ) ] , Object . extend ( { beforeSetup : function ( effect ) { effect . effects [ 0 ] . element . setStyle ( { height : '0px' } ) . show ( ) ; } , afterFinishInternal : function ( effect ) { effect . effects [ 0 ] . element . undoClipping ( ) . undoPositioned ( ) . setStyle ( oldStyle ) ; } } , options ) ) } } ) ; } ; Effect . Shrink = function ( element ) { element = $ ( element ) ; var options = Object . extend ( { direction : 'center' , moveTransition : Effect . Transitions . sinoidal , scaleTransition : Effect . Transitions . sinoidal , opacityTransition : Effect . Transitions . none } , arguments [ 1 ] || { } ) ; var oldStyle = { top : element . style . top , left : element . style . left , height : element . style . height , width : element . style . width , opacity : element . getInlineOpacity ( ) } ; var dims = element . getDimensions ( ) ; var moveX , moveY ; switch ( options . direction ) { case 'top-left' : moveX = moveY = 0 ; break ; case 'top-right' : moveX = dims . width ; moveY = 0 ; break ; case 'bottom-left' : moveX = 0 ; moveY = dims . height ; break ; case 'bottom-right' : moveX = dims . width ; moveY = dims . height ; break ; case 'center' : moveX = dims . width / 2 ; moveY = dims . height / 2 ; break ; }
return new Effect . Parallel ( [ new Effect . Opacity ( element , { sync : true , to : 0.0 , from : 1.0 , transition : options . opacityTransition } ) , new Effect . Scale ( element , window . opera ? 1 : 0 , { sync : true , transition : options . scaleTransition , restoreAfterFinish : true } ) , new Effect . Move ( element , { x : moveX , y : moveY , sync : true , transition : options . moveTransition } ) ] , Object . extend ( { beforeStartInternal : function ( effect ) { effect . effects [ 0 ] . element . makePositioned ( ) . makeClipping ( ) ; } , afterFinishInternal : function ( effect ) { effect . effects [ 0 ] . element . hide ( ) . undoClipping ( ) . undoPositioned ( ) . setStyle ( oldStyle ) ; } } , options ) ) ; } ; Effect . Pulsate = function ( element ) { element = $ ( element ) ; var options = arguments [ 1 ] || { } ; var oldOpacity = element . getInlineOpacity ( ) ; var transition = options . transition || Effect . Transitions . sinoidal ; var reverser = function ( pos ) { return transition ( 1 - Effect . Transitions . pulse ( pos , options . pulses ) ) } ; reverser . bind ( transition ) ; return new Effect . Opacity ( element , Object . extend ( Object . extend ( { duration : 2.0 , from : 0 , afterFinishInternal : function ( effect ) { effect . element . setStyle ( { opacity : oldOpacity } ) ; } } , options ) , { transition : reverser } ) ) ; } ; Effect . Fold = function ( element ) { element = $ ( element ) ; var oldStyle = { top : element . style . top , left : element . style . left , width : element . style . width , height : element . style . height } ; element . makeClipping ( ) ; return new Effect . Scale ( element , 5 , Object . extend ( { scaleContent : false , scaleX : false , afterFinishInternal : function ( effect ) { new Effect . Scale ( element , 1 , { scaleContent : false , scaleY : false , afterFinishInternal : function ( effect ) { effect . element . hide ( ) . undoClipping ( ) . setStyle ( oldStyle ) ; } } ) ; } } , arguments [ 1 ] || { } ) ) ; } ; Effect . Morph = Class . create ( Effect . Base , { initialize : function ( element ) { this . element = $ ( element ) ; if ( ! this . element ) throw ( Effect . _elementDoesNotExistError ) ; var options = Object . extend ( { style : { } } , arguments [ 1 ] || { } ) ; if ( ! Object . isString ( options . style ) ) this . style = $H ( options . style ) ; else { if ( options . style . include ( ':' ) )
this . style = options . style . parseStyle ( ) ; else { this . element . addClassName ( options . style ) ; this . style = $H ( this . element . getStyles ( ) ) ; this . element . removeClassName ( options . style ) ; var css = this . element . getStyles ( ) ; this . style = this . style . reject ( function ( style ) { return style . value == css [ style . key ] ; } ) ; options . afterFinishInternal = function ( effect ) { effect . element . addClassName ( effect . options . style ) ; effect . transforms . each ( function ( transform ) { effect . element . style [ transform . style ] = '' ; } ) ; } } }
this . start ( options ) ; } , setup : function ( ) { function parseColor ( color ) { if ( ! color || [ 'rgba(0, 0, 0, 0)' , 'transparent' ] . include ( color ) ) color = '#ffffff' ; color = color . parseColor ( ) ; return $R ( 0 , 2 ) . map ( function ( i ) { return parseInt ( color . slice ( i * 2 + 1 , i * 2 + 3 ) , 16 ) } ) ; }
this . transforms = this . style . map ( function ( pair ) { var property = pair [ 0 ] , value = pair [ 1 ] , unit = null ; if ( value . parseColor ( '#zzzzzz' ) != '#zzzzzz' ) { value = value . parseColor ( ) ; unit = 'color' ; } else if ( property == 'opacity' ) { value = parseFloat ( value ) ; if ( Prototype . Browser . IE && ( ! this . element . currentStyle . hasLayout ) )
this . element . setStyle ( { zoom : 1 } ) ; } else if ( Element . CSS _LENGTH . test ( value ) ) { var components = value . match ( /^([\+\-]?[0-9\.]+)(.*)$/ ) ; value = parseFloat ( components [ 1 ] ) ; unit = ( components . length == 3 ) ? components [ 2 ] : null ; }
var originalValue = this . element . getStyle ( property ) ; return { style : property . camelize ( ) , originalValue : unit == 'color' ? parseColor ( originalValue ) : parseFloat ( originalValue || 0 ) , targetValue : unit == 'color' ? parseColor ( value ) : value , unit : unit } ; } . bind ( this ) ) . reject ( function ( transform ) { return ( ( transform . originalValue == transform . targetValue ) || ( transform . unit != 'color' && ( isNaN ( transform . originalValue ) || isNaN ( transform . targetValue ) ) ) ) } ) ; } , update : function ( position ) { var style = { } , transform , i = this . transforms . length ; while ( i -- )
style [ ( transform = this . transforms [ i ] ) . style ] = transform . unit == 'color' ? '#' +
( Math . round ( transform . originalValue [ 0 ] +
( transform . targetValue [ 0 ] - transform . originalValue [ 0 ] ) * position ) ) . toColorPart ( ) +
( Math . round ( transform . originalValue [ 1 ] +
( transform . targetValue [ 1 ] - transform . originalValue [ 1 ] ) * position ) ) . toColorPart ( ) +
( Math . round ( transform . originalValue [ 2 ] +
( transform . targetValue [ 2 ] - transform . originalValue [ 2 ] ) * position ) ) . toColorPart ( ) : ( transform . originalValue +
( transform . targetValue - transform . originalValue ) * position ) . toFixed ( 3 ) +
( transform . unit === null ? '' : transform . unit ) ; this . element . setStyle ( style , true ) ; } } ) ; Effect . Transform = Class . create ( { initialize : function ( tracks ) { this . tracks = [ ] ; this . options = arguments [ 1 ] || { } ; this . addTracks ( tracks ) ; } , addTracks : function ( tracks ) { tracks . each ( function ( track ) { track = $H ( track ) ; var data = track . values ( ) . first ( ) ; this . tracks . push ( $H ( { ids : track . keys ( ) . first ( ) , effect : Effect . Morph , options : { style : data } } ) ) ; } . bind ( this ) ) ; return this ; } , play : function ( ) { return new Effect . Parallel ( this . tracks . map ( function ( track ) { var ids = track . get ( 'ids' ) , effect = track . get ( 'effect' ) , options = track . get ( 'options' ) ; var elements = [ $ ( ids ) || $$ ( ids ) ] . flatten ( ) ; return elements . map ( function ( e ) { return new effect ( e , Object . extend ( { sync : true } , options ) ) } ) ; } ) . flatten ( ) , this . options ) ; } } ) ; Element . CSS _PROPERTIES = $w ( 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' + 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' + 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' + 'fontSize fontWeight height left letterSpacing lineHeight ' + 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight ' + 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' + 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' + 'right textIndent top width wordSpacing zIndex' ) ; Element . CSS _LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/ ; String . _ _parseStyleElement = document . createElement ( 'div' ) ; String . prototype . parseStyle = function ( ) { var style , styleRules = $H ( ) ; if ( Prototype . Browser . WebKit )
style = new Element ( 'div' , { style : this } ) . style ; else { String . _ _parseStyleElement . innerHTML = '<div style="' + this + '"></div>' ; style = String . _ _parseStyleElement . childNodes [ 0 ] . style ; }
Element . CSS _PROPERTIES . each ( function ( property ) { if ( style [ property ] ) styleRules . set ( property , style [ property ] ) ; } ) ; if ( Prototype . Browser . IE && this . include ( 'opacity' ) )
styleRules . set ( 'opacity' , this . match ( /opacity:\s*((?:0|1)?(?:\.\d*)?)/ ) [ 1 ] ) ; return styleRules ; } ; if ( document . defaultView && document . defaultView . getComputedStyle ) { Element . getStyles = function ( element ) { var css = document . defaultView . getComputedStyle ( $ ( element ) , null ) ; return Element . CSS _PROPERTIES . inject ( { } , function ( styles , property ) { styles [ property ] = css [ property ] ; return styles ; } ) ; } ; } else { Element . getStyles = function ( element ) { element = $ ( element ) ; var css = element . currentStyle , styles ; styles = Element . CSS _PROPERTIES . inject ( { } , function ( hash , property ) { hash . set ( property , css [ property ] ) ; return hash ; } ) ; if ( ! styles . opacity ) styles . set ( 'opacity' , element . getOpacity ( ) ) ; return styles ; } ; } ; Effect . Methods = { morph : function ( element , style ) { element = $ ( element ) ; new Effect . Morph ( element , Object . extend ( { style : style } , arguments [ 2 ] || { } ) ) ; return element ; } , visualEffect : function ( element , effect , options ) { element = $ ( element )
var s = effect . dasherize ( ) . camelize ( ) , klass = s . charAt ( 0 ) . toUpperCase ( ) + s . substring ( 1 ) ; new Effect [ klass ] ( element , options ) ; return element ; } , highlight : function ( element , options ) { element = $ ( element ) ; new Effect . Highlight ( element , options ) ; return element ; } } ; $w ( 'fade appear grow shrink fold blindUp blindDown slideUp slideDown ' + 'pulsate shake puff squish switchOff dropOut' ) . each ( function ( effect ) { Effect . Methods [ effect ] = function ( element , options ) { element = $ ( element ) ; Effect [ effect . charAt ( 0 ) . toUpperCase ( ) + effect . substring ( 1 ) ] ( element , options ) ; return element ; } } ) ; $w ( 'getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles' ) . each ( function ( f ) { Effect . Methods [ f ] = Element [ f ] ; } ) ; Element . addMethods ( Effect . Methods ) ; if ( Object . isUndefined ( Effect ) )
throw ( "dragdrop.js requires including script.aculo.us' effects.js library" ) ; var Droppables = { drops : [ ] , remove : function ( element ) { this . drops = this . drops . reject ( function ( d ) { return d . element == $ ( element ) } ) ; } , add : function ( element ) { element = $ ( element ) ; var options = Object . extend ( { greedy : true , hoverclass : null , tree : false } , arguments [ 1 ] || { } ) ; if ( options . containment ) { options . _containers = [ ] ; var containment = options . containment ; if ( Object . isArray ( containment ) ) { containment . each ( function ( c ) { options . _containers . push ( $ ( c ) ) } ) ; } else { options . _containers . push ( $ ( containment ) ) ; } }
if ( options . accept ) options . accept = [ options . accept ] . flatten ( ) ; Element . makePositioned ( element ) ; options . element = element ; this . drops . push ( options ) ; } , findDeepestChild : function ( drops ) { deepest = drops [ 0 ] ; for ( i = 1 ; i < drops . length ; ++ i )
if ( Element . isParent ( drops [ i ] . element , deepest . element ) )
deepest = drops [ i ] ; return deepest ; } , isContained : function ( element , drop ) { var containmentNode ; if ( drop . tree ) { containmentNode = element . treeNode ; } else { containmentNode = element . parentNode ; }
return drop . _containers . detect ( function ( c ) { return containmentNode == c } ) ; } , isAffected : function ( point , element , drop ) { return ( ( drop . element != element ) && ( ( ! drop . _containers ) || this . isContained ( element , drop ) ) && ( ( ! drop . accept ) || ( Element . classNames ( element ) . detect ( function ( v ) { return drop . accept . include ( v ) } ) ) ) && Position . within ( drop . element , point [ 0 ] , point [ 1 ] ) ) ; } , deactivate : function ( drop ) { if ( drop . hoverclass )
Element . removeClassName ( drop . element , drop . hoverclass ) ; this . last _active = null ; } , activate : function ( drop ) { if ( drop . hoverclass )
Element . addClassName ( drop . element , drop . hoverclass ) ; this . last _active = drop ; } , show : function ( point , element ) { if ( ! this . drops . length ) return ; var drop , affected = [ ] ; this . drops . each ( function ( drop ) { if ( Droppables . isAffected ( point , element , drop ) )
affected . push ( drop ) ; } ) ; if ( affected . length > 0 )
drop = Droppables . findDeepestChild ( affected ) ; if ( this . last _active && this . last _active != drop ) this . deactivate ( this . last _active ) ; if ( drop ) { Position . within ( drop . element , point [ 0 ] , point [ 1 ] ) ; if ( drop . onHover )
drop . onHover ( element , drop . element , Position . overlap ( drop . overlap , drop . element ) ) ; if ( drop != this . last _active ) Droppables . activate ( drop ) ; } } , fire : function ( event , element ) { if ( ! this . last _active ) return ; Position . prepare ( ) ; if ( this . isAffected ( [ Event . pointerX ( event ) , Event . pointerY ( event ) ] , element , this . last _active ) )
if ( this . last _active . onDrop ) { this . last _active . onDrop ( element , this . last _active . element , event ) ; return true ; } } , reset : function ( ) { if ( this . last _active )
this . deactivate ( this . last _active ) ; } }
var Draggables = { drags : [ ] , observers : [ ] , register : function ( draggable ) { if ( this . drags . length == 0 ) { this . eventMouseUp = this . endDrag . bindAsEventListener ( this ) ; this . eventMouseMove = this . updateDrag . bindAsEventListener ( this ) ; this . eventKeypress = this . keyPress . bindAsEventListener ( this ) ; Event . observe ( document , "mouseup" , this . eventMouseUp ) ; Event . observe ( document , "mousemove" , this . eventMouseMove ) ; Event . observe ( document , "keypress" , this . eventKeypress ) ; }
this . drags . push ( draggable ) ; } , unregister : function ( draggable ) { this . drags = this . drags . reject ( function ( d ) { return d == draggable } ) ; if ( this . drags . length == 0 ) { Event . stopObserving ( document , "mouseup" , this . eventMouseUp ) ; Event . stopObserving ( document , "mousemove" , this . eventMouseMove ) ; Event . stopObserving ( document , "keypress" , this . eventKeypress ) ; } } , activate : function ( draggable ) { if ( draggable . options . delay ) { this . _timeout = setTimeout ( function ( ) { Draggables . _timeout = null ; window . focus ( ) ; Draggables . activeDraggable = draggable ; } . bind ( this ) , draggable . options . delay ) ; } else { window . focus ( ) ; this . activeDraggable = draggable ; } } , deactivate : function ( ) { this . activeDraggable = null ; } , updateDrag : function ( event ) { if ( ! this . activeDraggable ) return ; var pointer = [ Event . pointerX ( event ) , Event . pointerY ( event ) ] ; if ( this . _lastPointer && ( this . _lastPointer . inspect ( ) == pointer . inspect ( ) ) ) return ; this . _lastPointer = pointer ; this . activeDraggable . updateDrag ( event , pointer ) ; } , endDrag : function ( event ) { if ( this . _timeout ) { clearTimeout ( this . _timeout ) ; this . _timeout = null ; }
if ( ! this . activeDraggable ) return ; this . _lastPointer = null ; this . activeDraggable . endDrag ( event ) ; this . activeDraggable = null ; } , keyPress : function ( event ) { if ( this . activeDraggable )
this . activeDraggable . keyPress ( event ) ; } , addObserver : function ( observer ) { this . observers . push ( observer ) ; this . _cacheObserverCallbacks ( ) ; } , removeObserver : function ( element ) { this . observers = this . observers . reject ( function ( o ) { return o . element == element } ) ; this . _cacheObserverCallbacks ( ) ; } , notify : function ( eventName , draggable , event ) { if ( this [ eventName + 'Count' ] > 0 )
this . observers . each ( function ( o ) { if ( o [ eventName ] ) o [ eventName ] ( eventName , draggable , event ) ; } ) ; if ( draggable . options [ eventName ] ) draggable . options [ eventName ] ( draggable , event ) ; } , _cacheObserverCallbacks : function ( ) { [ 'onStart' , 'onEnd' , 'onDrag' ] . each ( function ( eventName ) { Draggables [ eventName + 'Count' ] = Draggables . observers . select ( function ( o ) { return o [ eventName ] ; } ) . length ; } ) ; } }
var Draggable = Class . create ( { initialize : function ( element ) { var defaults = { handle : false , reverteffect : function ( element , top _offset , left _offset ) { var dur = Math . sqrt ( Math . abs ( top _offset ^ 2 ) + Math . abs ( left _offset ^ 2 ) ) * 0.02 ; new Effect . Move ( element , { x : - left _offset , y : - top _offset , duration : dur , queue : { scope : '_draggable' , position : 'end' } } ) ; } , endeffect : function ( element ) { var toOpacity = Object . isNumber ( element . _opacity ) ? element . _opacity : 1.0 ; new Effect . Opacity ( element , { duration : 0.2 , from : 0.7 , to : toOpacity , queue : { scope : '_draggable' , position : 'end' } , afterFinish : function ( ) { Draggable . _dragging [ element ] = false } } ) ; } , zindex : 1000 , revert : false , quiet : false , scroll : false , scrollSensitivity : 20 , scrollSpeed : 15 , snap : false , delay : 0 } ; if ( ! arguments [ 1 ] || Object . isUndefined ( arguments [ 1 ] . endeffect ) )
Object . extend ( defaults , { starteffect : function ( element ) { element . _opacity = Element . getOpacity ( element ) ; Draggable . _dragging [ element ] = true ; new Effect . Opacity ( element , { duration : 0.2 , from : element . _opacity , to : 0.7 } ) ; } } ) ; var options = Object . extend ( defaults , arguments [ 1 ] || { } ) ; this . element = $ ( element ) ; if ( options . handle && Object . isString ( options . handle ) )
this . handle = this . element . down ( '.' + options . handle , 0 ) ; if ( ! this . handle ) this . handle = $ ( options . handle ) ; if ( ! this . handle ) this . handle = this . element ; if ( options . scroll && ! options . scroll . scrollTo && ! options . scroll . outerHTML ) { options . scroll = $ ( options . scroll ) ; this . _isScrollChild = Element . childOf ( this . element , options . scroll ) ; }
Element . makePositioned ( this . element ) ; this . options = options ; this . dragging = false ; this . eventMouseDown = this . initDrag . bindAsEventListener ( this ) ; Event . observe ( this . handle , "mousedown" , this . eventMouseDown ) ; Draggables . register ( this ) ; } , destroy : function ( ) { Event . stopObserving ( this . handle , "mousedown" , this . eventMouseDown ) ; Draggables . unregister ( this ) ; } , currentDelta : function ( ) { return ( [ parseInt ( Element . getStyle ( this . element , 'left' ) || '0' ) , parseInt ( Element . getStyle ( this . element , 'top' ) || '0' ) ] ) ; } , initDrag : function ( event ) { if ( ! Object . isUndefined ( Draggable . _dragging [ this . element ] ) && Draggable . _dragging [ this . element ] ) return ; if ( Event . isLeftClick ( event ) ) { var src = Event . element ( event ) ; if ( ( tag _name = src . tagName . toUpperCase ( ) ) && ( tag _name == 'INPUT' || tag _name == 'SELECT' || tag _name == 'OPTION' || tag _name == 'BUTTON' || tag _name == 'TEXTAREA' ) ) return ; var pointer = [ Event . pointerX ( event ) , Event . pointerY ( event ) ] ; var pos = Position . cumulativeOffset ( this . element ) ; this . offset = [ 0 , 1 ] . map ( function ( i ) { return ( pointer [ i ] - pos [ i ] ) } ) ; Draggables . activate ( this ) ; Event . stop ( event ) ; } } , startDrag : function ( event ) { this . dragging = true ; if ( ! this . delta )
this . delta = this . currentDelta ( ) ; if ( this . options . zindex ) { this . originalZ = parseInt ( Element . getStyle ( this . element , 'z-index' ) || 0 ) ; this . element . style . zIndex = this . options . zindex ; }
if ( this . options . ghosting ) { this . _clone = this . element . cloneNode ( true ) ; this . element . _originallyAbsolute = ( this . element . getStyle ( 'position' ) == 'absolute' ) ; if ( ! this . element . _originallyAbsolute )
Position . absolutize ( this . element ) ; this . element . parentNode . insertBefore ( this . _clone , this . element ) ; }
if ( this . options . scroll ) { if ( this . options . scroll == window ) { var where = this . _getWindowScroll ( this . options . scroll ) ; this . originalScrollLeft = where . left ; this . originalScrollTop = where . top ; } else { this . originalScrollLeft = this . options . scroll . scrollLeft ; this . originalScrollTop = this . options . scroll . scrollTop ; } }
Draggables . notify ( 'onStart' , this , event ) ; if ( this . options . starteffect ) this . options . starteffect ( this . element ) ; } , updateDrag : function ( event , pointer ) { if ( ! this . dragging ) this . startDrag ( event ) ; if ( ! this . options . quiet ) { Position . prepare ( ) ; Droppables . show ( pointer , this . element ) ; }
Draggables . notify ( 'onDrag' , this , event ) ; this . draw ( pointer ) ; if ( this . options . change ) this . options . change ( this ) ; if ( this . options . scroll ) { this . stopScrolling ( ) ; var p ; if ( this . options . scroll == window ) { with ( this . _getWindowScroll ( this . options . scroll ) ) { p = [ left , top , left + width , top + height ] ; } } else { p = Position . page ( this . options . scroll ) ; p [ 0 ] += this . options . scroll . scrollLeft + Position . deltaX ; p [ 1 ] += this . options . scroll . scrollTop + Position . deltaY ; p . push ( p [ 0 ] + this . options . scroll . offsetWidth ) ; p . push ( p [ 1 ] + this . options . scroll . offsetHeight ) ; }
var speed = [ 0 , 0 ] ; if ( pointer [ 0 ] < ( p [ 0 ] + this . options . scrollSensitivity ) ) speed [ 0 ] = pointer [ 0 ] - ( p [ 0 ] + this . options . scrollSensitivity ) ; if ( pointer [ 1 ] < ( p [ 1 ] + this . options . scrollSensitivity ) ) speed [ 1 ] = pointer [ 1 ] - ( p [ 1 ] + this . options . scrollSensitivity ) ; if ( pointer [ 0 ] > ( p [ 2 ] - this . options . scrollSensitivity ) ) speed [ 0 ] = pointer [ 0 ] - ( p [ 2 ] - this . options . scrollSensitivity ) ; if ( pointer [ 1 ] > ( p [ 3 ] - this . options . scrollSensitivity ) ) speed [ 1 ] = pointer [ 1 ] - ( p [ 3 ] - this . options . scrollSensitivity ) ; this . startScrolling ( speed ) ; }
if ( Prototype . Browser . WebKit ) window . scrollBy ( 0 , 0 ) ; Event . stop ( event ) ; } , finishDrag : function ( event , success ) { this . dragging = false ; if ( this . options . quiet ) { Position . prepare ( ) ; var pointer = [ Event . pointerX ( event ) , Event . pointerY ( event ) ] ; Droppables . show ( pointer , this . element ) ; }
if ( this . options . ghosting ) { if ( ! this . element . _originallyAbsolute )
Position . relativize ( this . element ) ; delete this . element . _originallyAbsolute ; Element . remove ( this . _clone ) ; this . _clone = null ; }
var dropped = false ; if ( success ) { dropped = Droppables . fire ( event , this . element ) ; if ( ! dropped ) dropped = false ; }
if ( dropped && this . options . onDropped ) this . options . onDropped ( this . element ) ; Draggables . notify ( 'onEnd' , this , event ) ; var revert = this . options . revert ; if ( revert && Object . isFunction ( revert ) ) revert = revert ( this . element ) ; var d = this . currentDelta ( ) ; if ( revert && this . options . reverteffect ) { if ( dropped == 0 || revert != 'failure' )
this . options . reverteffect ( this . element , d [ 1 ] - this . delta [ 1 ] , d [ 0 ] - this . delta [ 0 ] ) ; } else { this . delta = d ; }
if ( this . options . zindex )
this . element . style . zIndex = this . originalZ ; if ( this . options . endeffect )
this . options . endeffect ( this . element ) ; Draggables . deactivate ( this ) ; Droppables . reset ( ) ; } , keyPress : function ( event ) { if ( event . keyCode != Event . KEY _ESC ) return ; this . finishDrag ( event , false ) ; Event . stop ( event ) ; } , endDrag : function ( event ) { if ( ! this . dragging ) return ; this . stopScrolling ( ) ; this . finishDrag ( event , true ) ; Event . stop ( event ) ; } , draw : function ( point ) { var pos = Position . cumulativeOffset ( this . element ) ; if ( this . options . ghosting ) { var r = Position . realOffset ( this . element ) ; pos [ 0 ] += r [ 0 ] - Position . deltaX ; pos [ 1 ] += r [ 1 ] - Position . deltaY ; }
var d = this . currentDelta ( ) ; pos [ 0 ] -= d [ 0 ] ; pos [ 1 ] -= d [ 1 ] ; if ( this . options . scroll && ( this . options . scroll != window && this . _isScrollChild ) ) { pos [ 0 ] -= this . options . scroll . scrollLeft - this . originalScrollLeft ; pos [ 1 ] -= this . options . scroll . scrollTop - this . originalScrollTop ; }
var p = [ 0 , 1 ] . map ( function ( i ) { return ( point [ i ] - pos [ i ] - this . offset [ i ] ) } . bind ( this ) ) ; if ( this . options . snap ) { if ( Object . isFunction ( this . options . snap ) ) { p = this . options . snap ( p [ 0 ] , p [ 1 ] , this ) ; } else { if ( Object . isArray ( this . options . snap ) ) { p = p . map ( function ( v , i ) { return ( v / this . options . snap [ i ] ) . round ( ) * this . options . snap [ i ] } . bind ( this ) ) } else { p = p . map ( function ( v ) { return ( v / this . options . snap ) . round ( ) * this . options . snap } . bind ( this ) ) } } }
var style = this . element . style ; if ( ( ! this . options . constraint ) || ( this . options . constraint == 'horizontal' ) )
style . left = p [ 0 ] + "px" ; if ( ( ! this . options . constraint ) || ( this . options . constraint == 'vertical' ) )
style . top = p [ 1 ] + "px" ; if ( style . visibility == "hidden" ) style . visibility = "" ; } , stopScrolling : function ( ) { if ( this . scrollInterval ) { clearInterval ( this . scrollInterval ) ; this . scrollInterval = null ; Draggables . _lastScrollPointer = null ; } } , startScrolling : function ( speed ) { if ( ! ( speed [ 0 ] || speed [ 1 ] ) ) return ; this . scrollSpeed = [ speed [ 0 ] * this . options . scrollSpeed , speed [ 1 ] * this . options . scrollSpeed ] ; this . lastScrolled = new Date ( ) ; this . scrollInterval = setInterval ( this . scroll . bind ( this ) , 10 ) ; } , scroll : function ( ) { var current = new Date ( ) ; var delta = current - this . lastScrolled ; this . lastScrolled = current ; if ( this . options . scroll == window ) { with ( this . _getWindowScroll ( this . options . scroll ) ) { if ( this . scrollSpeed [ 0 ] || this . scrollSpeed [ 1 ] ) { var d = delta / 1000 ; this . options . scroll . scrollTo ( left + d * this . scrollSpeed [ 0 ] , top + d * this . scrollSpeed [ 1 ] ) ; } } } else { this . options . scroll . scrollLeft += this . scrollSpeed [ 0 ] * delta / 1000 ; this . options . scroll . scrollTop += this . scrollSpeed [ 1 ] * delta / 1000 ; }
Position . prepare ( ) ; Droppables . show ( Draggables . _lastPointer , this . element ) ; Draggables . notify ( 'onDrag' , this ) ; if ( this . _isScrollChild ) { Draggables . _lastScrollPointer = Draggables . _lastScrollPointer || $A ( Draggables . _lastPointer ) ; Draggables . _lastScrollPointer [ 0 ] += this . scrollSpeed [ 0 ] * delta / 1000 ; Draggables . _lastScrollPointer [ 1 ] += this . scrollSpeed [ 1 ] * delta / 1000 ; if ( Draggables . _lastScrollPointer [ 0 ] < 0 )
Draggables . _lastScrollPointer [ 0 ] = 0 ; if ( Draggables . _lastScrollPointer [ 1 ] < 0 )
Draggables . _lastScrollPointer [ 1 ] = 0 ; this . draw ( Draggables . _lastScrollPointer ) ; }
if ( this . options . change ) this . options . change ( this ) ; } , _getWindowScroll : function ( w ) { var T , L , W , H ; with ( w . document ) { if ( w . document . documentElement && documentElement . scrollTop ) { T = documentElement . scrollTop ; L = documentElement . scrollLeft ; } else if ( w . document . body ) { T = body . scrollTop ; L = body . scrollLeft ; }
if ( w . innerWidth ) { W = w . innerWidth ; H = w . innerHeight ; } else if ( w . document . documentElement && documentElement . clientWidth ) { W = documentElement . clientWidth ; H = documentElement . clientHeight ; } else { W = body . offsetWidth ; H = body . offsetHeight } }
return { top : T , left : L , width : W , height : H } ; } } ) ; Draggable . _dragging = { } ; var SortableObserver = Class . create ( { initialize : function ( element , observer ) { this . element = $ ( element ) ; this . observer = observer ; this . lastValue = Sortable . serialize ( this . element ) ; } , onStart : function ( ) { this . lastValue = Sortable . serialize ( this . element ) ; } , onEnd : function ( ) { Sortable . unmark ( ) ; if ( this . lastValue != Sortable . serialize ( this . element ) )
this . observer ( this . element ) } } ) ; var Sortable = { SERIALIZE _RULE : /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/ , sortables : { } , _findRootElement : function ( element ) { while ( element . tagName . toUpperCase ( ) != "BODY" ) { if ( element . id && Sortable . sortables [ element . id ] ) return element ; element = element . parentNode ; } } , options : function ( element ) { element = Sortable . _findRootElement ( $ ( element ) ) ; if ( ! element ) return ; return Sortable . sortables [ element . id ] ; } , destroy : function ( element ) { var s = Sortable . options ( element ) ; if ( s ) { Draggables . removeObserver ( s . element ) ; s . droppables . each ( function ( d ) { Droppables . remove ( d ) } ) ; s . draggables . invoke ( 'destroy' ) ; delete Sortable . sortables [ s . element . id ] ; } } , create : function ( element ) { element = $ ( element ) ; var options = Object . extend ( { element : element , tag : 'li' , dropOnEmpty : false , tree : false , treeTag : 'ul' , overlap : 'vertical' , constraint : 'vertical' , containment : element , handle : false , only : false , delay : 0 , hoverclass : null , ghosting : false , quiet : false , scroll : false , scrollSensitivity : 20 , scrollSpeed : 15 , format : this . SERIALIZE _RULE , elements : false , handles : false , onChange : Prototype . emptyFunction , onUpdate : Prototype . emptyFunction } , arguments [ 1 ] || { } ) ; this . destroy ( element ) ; var options _for _draggable = { revert : true , quiet : options . quiet , scroll : options . scroll , scrollSpeed : options . scrollSpeed , scrollSensitivity : options . scrollSensitivity , delay : options . delay , ghosting : options . ghosting , constraint : options . constraint , handle : options . handle } ; if ( options . starteffect )
options _for _draggable . starteffect = options . starteffect ; if ( options . reverteffect )
options _for _draggable . reverteffect = options . reverteffect ; else
if ( options . ghosting ) options _for _draggable . reverteffect = function ( element ) { element . style . top = 0 ; element . style . left = 0 ; } ; if ( options . endeffect )
options _for _draggable . endeffect = options . endeffect ; if ( options . zindex )
options _for _draggable . zindex = options . zindex ; var options _for _droppable = { overlap : options . overlap , containment : options . containment , tree : options . tree , hoverclass : options . hoverclass , onHover : Sortable . onHover }
var options _for _tree = { onHover : Sortable . onEmptyHover , overlap : options . overlap , containment : options . containment , hoverclass : options . hoverclass }
Element . cleanWhitespace ( element ) ; options . draggables = [ ] ; options . droppables = [ ] ; if ( options . dropOnEmpty || options . tree ) { Droppables . add ( element , options _for _tree ) ; options . droppables . push ( element ) ; }
( options . elements || this . findElements ( element , options ) || [ ] ) . each ( function ( e , i ) { var handle = options . handles ? $ ( options . handles [ i ] ) : ( options . handle ? $ ( e ) . select ( '.' + options . handle ) [ 0 ] : e ) ; options . draggables . push ( new Draggable ( e , Object . extend ( options _for _draggable , { handle : handle } ) ) ) ; Droppables . add ( e , options _for _droppable ) ; if ( options . tree ) e . treeNode = element ; options . droppables . push ( e ) ; } ) ; if ( options . tree ) { ( Sortable . findTreeElements ( element , options ) || [ ] ) . each ( function ( e ) { Droppables . add ( e , options _for _tree ) ; e . treeNode = element ; options . droppables . push ( e ) ; } ) ; }
this . sortables [ element . id ] = options ; Draggables . addObserver ( new SortableObserver ( element , options . onUpdate ) ) ; } , findElements : function ( element , options ) { return Element . findChildren ( element , options . only , options . tree ? true : false , options . tag ) ; } , findTreeElements : function ( element , options ) { return Element . findChildren ( element , options . only , options . tree ? true : false , options . treeTag ) ; } , onHover : function ( element , dropon , overlap ) { if ( Element . isParent ( dropon , element ) ) return ; if ( overlap > . 33 && overlap < . 66 && Sortable . options ( dropon ) . tree ) { return ; } else if ( overlap > 0.5 ) { Sortable . mark ( dropon , 'before' ) ; if ( dropon . previousSibling != element ) { var oldParentNode = element . parentNode ; element . style . visibility = "hidden" ; dropon . parentNode . insertBefore ( element , dropon ) ; if ( dropon . parentNode != oldParentNode )
Sortable . options ( oldParentNode ) . onChange ( element ) ; Sortable . options ( dropon . parentNode ) . onChange ( element ) ; } } else { Sortable . mark ( dropon , 'after' ) ; var nextElement = dropon . nextSibling || null ; if ( nextElement != element ) { var oldParentNode = element . parentNode ; element . style . visibility = "hidden" ; dropon . parentNode . insertBefore ( element , nextElement ) ; if ( dropon . parentNode != oldParentNode )
Sortable . options ( oldParentNode ) . onChange ( element ) ; Sortable . options ( dropon . parentNode ) . onChange ( element ) ; } } } , onEmptyHover : function ( element , dropon , overlap ) { var oldParentNode = element . parentNode ; var droponOptions = Sortable . options ( dropon ) ; if ( ! Element . isParent ( dropon , element ) ) { var index ; var children = Sortable . findElements ( dropon , { tag : droponOptions . tag , only : droponOptions . only } ) ; var child = null ; if ( children ) { var offset = Element . offsetSize ( dropon , droponOptions . overlap ) * ( 1.0 - overlap ) ; for ( index = 0 ; index < children . length ; index += 1 ) { if ( offset - Element . offsetSize ( children [ index ] , droponOptions . overlap ) >= 0 ) { offset -= Element . offsetSize ( children [ index ] , droponOptions . overlap ) ; } else if ( offset - ( Element . offsetSize ( children [ index ] , droponOptions . overlap ) / 2 ) >= 0 ) { child = index + 1 < children . length ? children [ index + 1 ] : null ; break ; } else { child = children [ index ] ; break ; } } }
dropon . insertBefore ( element , child ) ; Sortable . options ( oldParentNode ) . onChange ( element ) ; droponOptions . onChange ( element ) ; } } , unmark : function ( ) { if ( Sortable . _marker ) Sortable . _marker . hide ( ) ; } , mark : function ( dropon , position ) { var sortable = Sortable . options ( dropon . parentNode ) ; if ( sortable && ! sortable . ghosting ) return ; if ( ! Sortable . _marker ) { Sortable . _marker = ( $ ( 'dropmarker' ) || Element . extend ( document . createElement ( 'DIV' ) ) ) . hide ( ) . addClassName ( 'dropmarker' ) . setStyle ( { position : 'absolute' } ) ; document . getElementsByTagName ( "body" ) . item ( 0 ) . appendChild ( Sortable . _marker ) ; }
var offsets = Position . cumulativeOffset ( dropon ) ; Sortable . _marker . setStyle ( { left : offsets [ 0 ] + 'px' , top : offsets [ 1 ] + 'px' } ) ; if ( position == 'after' )
if ( sortable . overlap == 'horizontal' )
Sortable . _marker . setStyle ( { left : ( offsets [ 0 ] + dropon . clientWidth ) + 'px' } ) ; else
Sortable . _marker . setStyle ( { top : ( offsets [ 1 ] + dropon . clientHeight ) + 'px' } ) ; Sortable . _marker . show ( ) ; } , _tree : function ( element , options , parent ) { var children = Sortable . findElements ( element , options ) || [ ] ; for ( var i = 0 ; i < children . length ; ++ i ) { var match = children [ i ] . id . match ( options . format ) ; if ( ! match ) continue ; var child = { id : encodeURIComponent ( match ? match [ 1 ] : null ) , element : element , parent : parent , children : [ ] , position : parent . children . length , container : $ ( children [ i ] ) . down ( options . treeTag ) }
if ( child . container )
this . _tree ( child . container , options , child )
parent . children . push ( child ) ; }
return parent ; } , tree : function ( element ) { element = $ ( element ) ; var sortableOptions = this . options ( element ) ; var options = Object . extend ( { tag : sortableOptions . tag , treeTag : sortableOptions . treeTag , only : sortableOptions . only , name : element . id , format : sortableOptions . format } , arguments [ 1 ] || { } ) ; var root = { id : null , parent : null , children : [ ] , container : element , position : 0 }
return Sortable . _tree ( element , options , root ) ; } , _constructIndex : function ( node ) { var index = '' ; do { if ( node . id ) index = '[' + node . position + ']' + index ; } while ( ( node = node . parent ) != null ) ; return index ; } , sequence : function ( element ) { element = $ ( element ) ; var options = Object . extend ( this . options ( element ) , arguments [ 1 ] || { } ) ; return $ ( this . findElements ( element , options ) || [ ] ) . map ( function ( item ) { return item . id . match ( options . format ) ? item . id . match ( options . format ) [ 1 ] : '' ; } ) ; } , setSequence : function ( element , new _sequence ) { element = $ ( element ) ; var options = Object . extend ( this . options ( element ) , arguments [ 2 ] || { } ) ; var nodeMap = { } ; this . findElements ( element , options ) . each ( function ( n ) { if ( n . id . match ( options . format ) )
nodeMap [ n . id . match ( options . format ) [ 1 ] ] = [ n , n . parentNode ] ; n . parentNode . removeChild ( n ) ; } ) ; new _sequence . each ( function ( ident ) { var n = nodeMap [ ident ] ; if ( n ) { n [ 1 ] . appendChild ( n [ 0 ] ) ; delete nodeMap [ ident ] ; } } ) ; } , serialize : function ( element ) { element = $ ( element ) ; var options = Object . extend ( Sortable . options ( element ) , arguments [ 1 ] || { } ) ; var name = encodeURIComponent ( ( arguments [ 1 ] && arguments [ 1 ] . name ) ? arguments [ 1 ] . name : element . id ) ; if ( options . tree ) { return Sortable . tree ( element , arguments [ 1 ] ) . children . map ( function ( item ) { return [ name + Sortable . _constructIndex ( item ) + "[id]=" +
encodeURIComponent ( item . id ) ] . concat ( item . children . map ( arguments . callee ) ) ; } ) . flatten ( ) . join ( '&' ) ; } else { return Sortable . sequence ( element , arguments [ 1 ] ) . map ( function ( item ) { return name + "[]=" + encodeURIComponent ( item ) ; } ) . join ( '&' ) ; } } }
Element . isParent = function ( child , element ) { if ( ! child . parentNode || child == element ) return false ; if ( child . parentNode == element ) return true ; return Element . isParent ( child . parentNode , element ) ; }
Element . findChildren = function ( element , only , recursive , tagName ) { if ( ! element . hasChildNodes ( ) ) return null ; tagName = tagName . toUpperCase ( ) ; if ( only ) only = [ only ] . flatten ( ) ; var elements = [ ] ; $A ( element . childNodes ) . each ( function ( e ) { if ( e . tagName && e . tagName . toUpperCase ( ) == tagName && ( ! only || ( Element . classNames ( e ) . detect ( function ( v ) { return only . include ( v ) } ) ) ) )
elements . push ( e ) ; if ( recursive ) { var grandchildren = Element . findChildren ( e , only , recursive , tagName ) ; if ( grandchildren ) elements . push ( grandchildren ) ; } } ) ; return ( elements . length > 0 ? elements . flatten ( ) : [ ] ) ; }
Element . offsetSize = function ( element , type ) { return element [ 'offset' + ( ( type == 'vertical' || type == 'height' ) ? 'Height' : 'Width' ) ] ; }
if ( typeof Effect == 'undefined' )
throw ( "controls.js requires including script.aculo.us' effects.js library" ) ; var Autocompleter = { }
Autocompleter . Base = Class . create ( { baseInitialize : function ( element , update , options ) { element = $ ( element )
this . element = element ; this . update = $ ( update ) ; this . hasFocus = false ; this . changed = false ; this . active = false ; this . index = 0 ; this . entryCount = 0 ; this . oldElementValue = this . element . value ; if ( this . setOptions )
this . setOptions ( options ) ; else
this . options = options || { } ; this . options . paramName = this . options . paramName || this . element . name ; this . options . tokens = this . options . tokens || [ ] ; this . options . frequency = this . options . frequency || 0.4 ; this . options . minChars = this . options . minChars || 1 ; this . options . onShow = this . options . onShow || function ( element , update ) { if ( ! update . style . position || update . style . position == 'absolute' ) { update . style . position = 'absolute' ; Position . clone ( element , update , { setHeight : false , offsetTop : element . offsetHeight } ) ; }
Effect . Appear ( update , { duration : 0.15 } ) ; } ; this . options . onHide = this . options . onHide || function ( element , update ) { new Effect . Fade ( update , { duration : 0.15 } ) } ; if ( typeof ( this . options . tokens ) == 'string' )
this . options . tokens = new Array ( this . options . tokens ) ; if ( ! this . options . tokens . include ( '\n' ) )
this . options . tokens . push ( '\n' ) ; this . observer = null ; this . element . setAttribute ( 'autocomplete' , 'off' ) ; Element . hide ( this . update ) ; Event . observe ( this . element , 'blur' , this . onBlur . bindAsEventListener ( this ) ) ; Event . observe ( this . element , 'keydown' , this . onKeyPress . bindAsEventListener ( this ) ) ; } , show : function ( ) { if ( Element . getStyle ( this . update , 'display' ) == 'none' ) this . options . onShow ( this . element , this . update ) ; if ( ! this . iefix && ( Prototype . Browser . IE ) && ( Element . getStyle ( this . update , 'position' ) == 'absolute' ) ) { new Insertion . After ( this . update , '<iframe id="' + this . update . id + '_iefix" ' + 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>' ) ; this . iefix = $ ( this . update . id + '_iefix' ) ; }
if ( this . iefix ) setTimeout ( this . fixIEOverlapping . bind ( this ) , 50 ) ; } , fixIEOverlapping : function ( ) { Position . clone ( this . update , this . iefix , { setTop : ( ! this . update . style . height ) } ) ; this . iefix . style . zIndex = 1 ; this . update . style . zIndex = 2 ; Element . show ( this . iefix ) ; } , hide : function ( ) { this . stopIndicator ( ) ; if ( Element . getStyle ( this . update , 'display' ) != 'none' ) this . options . onHide ( this . element , this . update ) ; if ( this . iefix ) Element . hide ( this . iefix ) ; } , startIndicator : function ( ) { if ( this . options . indicator ) Element . show ( this . options . indicator ) ; } , stopIndicator : function ( ) { if ( this . options . indicator ) Element . hide ( this . options . indicator ) ; } , onKeyPress : function ( event ) { if ( this . active )
switch ( event . keyCode ) { case Event . KEY _TAB : case Event . KEY _RETURN : this . selectEntry ( ) ; Event . stop ( event ) ; case Event . KEY _ESC : this . hide ( ) ; this . active = false ; Event . stop ( event ) ; return ; case Event . KEY _LEFT : case Event . KEY _RIGHT : return ; case Event . KEY _UP : this . markPrevious ( ) ; this . render ( ) ; Event . stop ( event ) ; return ; case Event . KEY _DOWN : this . markNext ( ) ; this . render ( ) ; Event . stop ( event ) ; return ; }
else
if ( event . keyCode == Event . KEY _TAB || event . keyCode == Event . KEY _RETURN || ( Prototype . Browser . WebKit > 0 && event . keyCode == 0 ) ) return ; this . changed = true ; this . hasFocus = true ; if ( this . observer ) clearTimeout ( this . observer ) ; this . observer = setTimeout ( this . onObserverEvent . bind ( this ) , this . options . frequency * 1000 ) ; } , activate : function ( ) { this . changed = false ; this . hasFocus = true ; this . getUpdatedChoices ( ) ; } , onHover : function ( event ) { var element = Event . findElement ( event , 'LI' ) ; if ( this . index != element . autocompleteIndex )
{ this . index = element . autocompleteIndex ; this . render ( ) ; }
Event . stop ( event ) ; } , onClick : function ( event ) { var element = Event . findElement ( event , 'LI' ) ; this . index = element . autocompleteIndex ; this . selectEntry ( ) ; this . hide ( ) ; } , onBlur : function ( event ) { setTimeout ( this . hide . bind ( this ) , 250 ) ; this . hasFocus = false ; this . active = false ; } , render : function ( ) { if ( this . entryCount > 0 ) { for ( var i = 0 ; i < this . entryCount ; i ++ )
this . index == i ? Element . addClassName ( this . getEntry ( i ) , "selected" ) : Element . removeClassName ( this . getEntry ( i ) , "selected" ) ; if ( this . hasFocus ) { this . show ( ) ; this . active = true ; } } else { this . active = false ; this . hide ( ) ; } } , markPrevious : function ( ) { if ( this . index > 0 ) this . index --
else this . index = this . entryCount - 1 ; this . getEntry ( this . index ) . scrollIntoView ( true ) ; } , markNext : function ( ) { if ( this . index < this . entryCount - 1 ) this . index ++
else this . index = 0 ; this . getEntry ( this . index ) . scrollIntoView ( false ) ; } , getEntry : function ( index ) { return this . update . firstChild . childNodes [ index ] ; } , getCurrentEntry : function ( ) { return this . getEntry ( this . index ) ; } , selectEntry : function ( ) { this . active = false ; this . updateElement ( this . getCurrentEntry ( ) ) ; } , updateElement : function ( selectedElement ) { if ( this . options . updateElement ) { this . options . updateElement ( selectedElement ) ; return ; }
var value = '' ; if ( this . options . select ) { var nodes = $ ( selectedElement ) . select ( '.' + this . options . select ) || [ ] ; if ( nodes . length > 0 ) value = Element . collectTextNodes ( nodes [ 0 ] , this . options . select ) ; } else
value = Element . collectTextNodesIgnoreClass ( selectedElement , 'informal' ) ; var bounds = this . getTokenBounds ( ) ; if ( bounds [ 0 ] != - 1 ) { var newValue = this . element . value . substr ( 0 , bounds [ 0 ] ) ; var whitespace = this . element . value . substr ( bounds [ 0 ] ) . match ( /^\s+/ ) ; if ( whitespace )
newValue += whitespace [ 0 ] ; this . element . value = newValue + value + this . element . value . substr ( bounds [ 1 ] ) ; } else { this . element . value = value ; }
this . oldElementValue = this . element . value ; this . element . focus ( ) ; if ( this . options . afterUpdateElement )
this . options . afterUpdateElement ( this . element , selectedElement ) ; } , updateChoices : function ( choices ) { if ( ! this . changed && this . hasFocus ) { this . update . innerHTML = choices ; Element . cleanWhitespace ( this . update ) ; Element . cleanWhitespace ( this . update . down ( ) ) ; if ( this . update . firstChild && this . update . down ( ) . childNodes ) { this . entryCount = this . update . down ( ) . childNodes . length ; for ( var i = 0 ; i < this . entryCount ; i ++ ) { var entry = this . getEntry ( i ) ; entry . autocompleteIndex = i ; this . addObservers ( entry ) ; } } else { this . entryCount = 0 ; }
this . stopIndicator ( ) ; this . index = 0 ; if ( this . entryCount == 1 && this . options . autoSelect ) { this . selectEntry ( ) ; this . hide ( ) ; } else { this . render ( ) ; } } } , addObservers : function ( element ) { Event . observe ( element , "mouseover" , this . onHover . bindAsEventListener ( this ) ) ; Event . observe ( element , "click" , this . onClick . bindAsEventListener ( this ) ) ; } , onObserverEvent : function ( ) { this . changed = false ; this . tokenBounds = null ; if ( this . getToken ( ) . length >= this . options . minChars ) { this . getUpdatedChoices ( ) ; } else { this . active = false ; this . hide ( ) ; }
this . oldElementValue = this . element . value ; } , getToken : function ( ) { var bounds = this . getTokenBounds ( ) ; return this . element . value . substring ( bounds [ 0 ] , bounds [ 1 ] ) . strip ( ) ; } , getTokenBounds : function ( ) { if ( null != this . tokenBounds ) return this . tokenBounds ; var value = this . element . value ; if ( value . strip ( ) . empty ( ) ) return [ - 1 , 0 ] ; var diff = arguments . callee . getFirstDifferencePos ( value , this . oldElementValue ) ; var offset = ( diff == this . oldElementValue . length ? 1 : 0 ) ; var prevTokenPos = - 1 , nextTokenPos = value . length ; var tp ; for ( var index = 0 , l = this . options . tokens . length ; index < l ; ++ index ) { tp = value . lastIndexOf ( this . options . tokens [ index ] , diff + offset - 1 ) ; if ( tp > prevTokenPos ) prevTokenPos = tp ; tp = value . indexOf ( this . options . tokens [ index ] , diff + offset ) ; if ( - 1 != tp && tp < nextTokenPos ) nextTokenPos = tp ; }
return ( this . tokenBounds = [ prevTokenPos + 1 , nextTokenPos ] ) ; } } ) ; Autocompleter . Base . prototype . getTokenBounds . getFirstDifferencePos = function ( newS , oldS ) { var boundary = Math . min ( newS . length , oldS . length ) ; for ( var index = 0 ; index < boundary ; ++ index )
if ( newS [ index ] != oldS [ index ] )
return index ; return boundary ; } ; Ajax . Autocompleter = Class . create ( Autocompleter . Base , { initialize : function ( element , update , url , options ) { this . baseInitialize ( element , update , options ) ; this . options . asynchronous = true ; this . options . onComplete = this . onComplete . bind ( this ) ; this . options . defaultParams = this . options . parameters || null ; this . url = url ; } , getUpdatedChoices : function ( ) { this . startIndicator ( ) ; var entry = encodeURIComponent ( this . options . paramName ) + '=' +
encodeURIComponent ( this . getToken ( ) ) ; this . options . parameters = this . options . callback ? this . options . callback ( this . element , entry ) : entry ; if ( this . options . defaultParams )
this . options . parameters += '&' + this . options . defaultParams ; new Ajax . Request ( this . url , this . options ) ; } , onComplete : function ( request ) { this . updateChoices ( request . responseText ) ; } } ) ; Autocompleter . Local = Class . create ( Autocompleter . Base , { initialize : function ( element , update , array , options ) { this . baseInitialize ( element , update , options ) ; this . options . array = array ; } , getUpdatedChoices : function ( ) { this . updateChoices ( this . options . selector ( this ) ) ; } , setOptions : function ( options ) { this . options = Object . extend ( { choices : 10 , partialSearch : true , partialChars : 2 , ignoreCase : true , fullSearch : false , selector : function ( instance ) { var ret = [ ] ; var partial = [ ] ; var entry = instance . getToken ( ) ; var count = 0 ; for ( var i = 0 ; i < instance . options . array . length && ret . length < instance . options . choices ; i ++ ) { var elem = instance . options . array [ i ] ; var foundPos = instance . options . ignoreCase ? elem . toLowerCase ( ) . indexOf ( entry . toLowerCase ( ) ) : elem . indexOf ( entry ) ; while ( foundPos != - 1 ) { if ( foundPos == 0 && elem . length != entry . length ) { ret . push ( "<li><strong>" + elem . substr ( 0 , entry . length ) + "</strong>" +
elem . substr ( entry . length ) + "</li>" ) ; break ; } else if ( entry . length >= instance . options . partialChars && instance . options . partialSearch && foundPos != - 1 ) { if ( instance . options . fullSearch || /\s/ . test ( elem . substr ( foundPos - 1 , 1 ) ) ) { partial . push ( "<li>" + elem . substr ( 0 , foundPos ) + "<strong>" +
elem . substr ( foundPos , entry . length ) + "</strong>" + elem . substr ( foundPos + entry . length ) + "</li>" ) ; break ; } }
foundPos = instance . options . ignoreCase ? elem . toLowerCase ( ) . indexOf ( entry . toLowerCase ( ) , foundPos + 1 ) : elem . indexOf ( entry , foundPos + 1 ) ; } }
if ( partial . length )
ret = ret . concat ( partial . slice ( 0 , instance . options . choices - ret . length ) )
return "<ul>" + ret . join ( '' ) + "</ul>" ; } } , options || { } ) ; } } ) ; Field . scrollFreeActivate = function ( field ) { setTimeout ( function ( ) { Field . activate ( field ) ; } , 1 ) ; }
Ajax . InPlaceEditor = Class . create ( { initialize : function ( element , url , options ) { this . url = url ; this . element = element = $ ( element ) ; this . prepareOptions ( ) ; this . _controls = { } ; arguments . callee . dealWithDeprecatedOptions ( options ) ; Object . extend ( this . options , options || { } ) ; if ( ! this . options . formId && this . element . id ) { this . options . formId = this . element . id + '-inplaceeditor' ; if ( $ ( this . options . formId ) )
this . options . formId = '' ; }
if ( this . options . externalControl )
this . options . externalControl = $ ( this . options . externalControl ) ; if ( ! this . options . externalControl )
this . options . externalControlOnly = false ; this . _originalBackground = this . element . getStyle ( 'background-color' ) || 'transparent' ; this . element . title = this . options . clickToEditText ; this . _boundCancelHandler = this . handleFormCancellation . bind ( this ) ; this . _boundComplete = ( this . options . onComplete || Prototype . emptyFunction ) . bind ( this ) ; this . _boundFailureHandler = this . handleAJAXFailure . bind ( this ) ; this . _boundSubmitHandler = this . handleFormSubmission . bind ( this ) ; this . _boundWrapperHandler = this . wrapUp . bind ( this ) ; this . registerListeners ( ) ; } , checkForEscapeOrReturn : function ( e ) { if ( ! this . _editing || e . ctrlKey || e . altKey || e . shiftKey ) return ; if ( Event . KEY _ESC == e . keyCode )
this . handleFormCancellation ( e ) ; else if ( Event . KEY _RETURN == e . keyCode )
this . handleFormSubmission ( e ) ; } , createControl : function ( mode , handler , extraClasses ) { var control = this . options [ mode + 'Control' ] ; var text = this . options [ mode + 'Text' ] ; if ( 'button' == control ) { var btn = document . createElement ( 'input' ) ; btn . type = 'submit' ; btn . value = text ; btn . className = 'editor_' + mode + '_button' ; if ( 'cancel' == mode )
btn . onclick = this . _boundCancelHandler ; this . _form . appendChild ( btn ) ; this . _controls [ mode ] = btn ; } else if ( 'link' == control ) { var link = document . createElement ( 'a' ) ; link . href = '#' ; link . appendChild ( document . createTextNode ( text ) ) ; link . onclick = 'cancel' == mode ? this . _boundCancelHandler : this . _boundSubmitHandler ; link . className = 'editor_' + mode + '_link' ; if ( extraClasses )
link . className += ' ' + extraClasses ; this . _form . appendChild ( link ) ; this . _controls [ mode ] = link ; } } , createEditField : function ( ) { var text = ( this . options . loadTextURL ? this . options . loadingText : this . getText ( ) ) ; var fld ; if ( 1 >= this . options . rows && ! /\r|\n/ . test ( this . getText ( ) ) ) { fld = document . createElement ( 'input' ) ; fld . type = 'text' ; var size = this . options . size || this . options . cols || 0 ; if ( 0 < size ) fld . size = size ; } else { fld = document . createElement ( 'textarea' ) ; fld . rows = ( 1 >= this . options . rows ? this . options . autoRows : this . options . rows ) ; fld . cols = this . options . cols || 40 ; }
fld . name = this . options . paramName ; fld . value = text ; fld . className = 'editor_field' ; if ( this . options . submitOnBlur )
fld . onblur = this . _boundSubmitHandler ; this . _controls . editor = fld ; if ( this . options . loadTextURL )
this . loadExternalText ( ) ; this . _form . appendChild ( this . _controls . editor ) ; } , createForm : function ( ) { var ipe = this ; function addText ( mode , condition ) { var text = ipe . options [ 'text' + mode + 'Controls' ] ; if ( ! text || condition === false ) return ; ipe . _form . appendChild ( document . createTextNode ( text ) ) ; } ; this . _form = $ ( document . createElement ( 'form' ) ) ; this . _form . id = this . options . formId ; this . _form . addClassName ( this . options . formClassName ) ; this . _form . onsubmit = this . _boundSubmitHandler ; this . createEditField ( ) ; if ( 'textarea' == this . _controls . editor . tagName . toLowerCase ( ) )
this . _form . appendChild ( document . createElement ( 'br' ) ) ; if ( this . options . onFormCustomization )
this . options . onFormCustomization ( this , this . _form ) ; addText ( 'Before' , this . options . okControl || this . options . cancelControl ) ; this . createControl ( 'ok' , this . _boundSubmitHandler ) ; addText ( 'Between' , this . options . okControl && this . options . cancelControl ) ; this . createControl ( 'cancel' , this . _boundCancelHandler , 'editor_cancel' ) ; addText ( 'After' , this . options . okControl || this . options . cancelControl ) ; } , destroy : function ( ) { if ( this . _oldInnerHTML )
this . element . innerHTML = this . _oldInnerHTML ; this . leaveEditMode ( ) ; this . unregisterListeners ( ) ; } , enterEditMode : function ( e ) { if ( this . _saving || this . _editing ) return ; this . _editing = true ; this . triggerCallback ( 'onEnterEditMode' ) ; if ( this . options . externalControl )
this . options . externalControl . hide ( ) ; this . element . hide ( ) ; this . createForm ( ) ; this . element . parentNode . insertBefore ( this . _form , this . element ) ; if ( ! this . options . loadTextURL )
this . postProcessEditField ( ) ; if ( e ) Event . stop ( e ) ; } , enterHover : function ( e ) { if ( this . options . hoverClassName )
this . element . addClassName ( this . options . hoverClassName ) ; if ( this . _saving ) return ; this . triggerCallback ( 'onEnterHover' ) ; } , getText : function ( ) { return this . element . innerHTML ; } , handleAJAXFailure : function ( transport ) { this . triggerCallback ( 'onFailure' , transport ) ; if ( this . _oldInnerHTML ) { this . element . innerHTML = this . _oldInnerHTML ; this . _oldInnerHTML = null ; } } , handleFormCancellation : function ( e ) { this . wrapUp ( ) ; if ( e ) Event . stop ( e ) ; } , handleFormSubmission : function ( e ) { var form = this . _form ; var value = $F ( this . _controls . editor ) ; this . prepareSubmission ( ) ; var params = this . options . callback ( form , value ) || '' ; if ( Object . isString ( params ) )
params = params . toQueryParams ( ) ; params . editorId = this . element . id ; if ( this . options . htmlResponse ) { var options = Object . extend ( { evalScripts : true } , this . options . ajaxOptions ) ; Object . extend ( options , { parameters : params , onComplete : this . _boundWrapperHandler , onFailure : this . _boundFailureHandler } ) ; new Ajax . Updater ( { success : this . element } , this . url , options ) ; } else { var options = Object . extend ( { method : 'get' } , this . options . ajaxOptions ) ; Object . extend ( options , { parameters : params , onComplete : this . _boundWrapperHandler , onFailure : this . _boundFailureHandler } ) ; new Ajax . Request ( this . url , options ) ; }
if ( e ) Event . stop ( e ) ; } , leaveEditMode : function ( ) { this . element . removeClassName ( this . options . savingClassName ) ; this . removeForm ( ) ; this . leaveHover ( ) ; this . element . style . backgroundColor = this . _originalBackground ; this . element . show ( ) ; if ( this . options . externalControl )
this . options . externalControl . show ( ) ; this . _saving = false ; this . _editing = false ; this . _oldInnerHTML = null ; this . triggerCallback ( 'onLeaveEditMode' ) ; } , leaveHover : function ( e ) { if ( this . options . hoverClassName )
this . element . removeClassName ( this . options . hoverClassName ) ; if ( this . _saving ) return ; this . triggerCallback ( 'onLeaveHover' ) ; } , loadExternalText : function ( ) { this . _form . addClassName ( this . options . loadingClassName ) ; this . _controls . editor . disabled = true ; var options = Object . extend ( { method : 'get' } , this . options . ajaxOptions ) ; Object . extend ( options , { parameters : 'editorId=' + encodeURIComponent ( this . element . id ) , onComplete : Prototype . emptyFunction , onSuccess : function ( transport ) { this . _form . removeClassName ( this . options . loadingClassName ) ; var text = transport . responseText ; if ( this . options . stripLoadedTextTags )
text = text . stripTags ( ) ; this . _controls . editor . value = text ; this . _controls . editor . disabled = false ; this . postProcessEditField ( ) ; } . bind ( this ) , onFailure : this . _boundFailureHandler } ) ; new Ajax . Request ( this . options . loadTextURL , options ) ; } , postProcessEditField : function ( ) { var fpc = this . options . fieldPostCreation ; if ( fpc )
$ ( this . _controls . editor ) [ 'focus' == fpc ? 'focus' : 'activate' ] ( ) ; } , prepareOptions : function ( ) { this . options = Object . clone ( Ajax . InPlaceEditor . DefaultOptions ) ; Object . extend ( this . options , Ajax . InPlaceEditor . DefaultCallbacks ) ; [ this . _extraDefaultOptions ] . flatten ( ) . compact ( ) . each ( function ( defs ) { Object . extend ( this . options , defs ) ; } . bind ( this ) ) ; } , prepareSubmission : function ( ) { this . _saving = true ; this . removeForm ( ) ; this . leaveHover ( ) ; this . showSaving ( ) ; } , registerListeners : function ( ) { this . _listeners = { } ; var listener ; $H ( Ajax . InPlaceEditor . Listeners ) . each ( function ( pair ) { listener = this [ pair . value ] . bind ( this ) ; this . _listeners [ pair . key ] = listener ; if ( ! this . options . externalControlOnly )
this . element . observe ( pair . key , listener ) ; if ( this . options . externalControl )
this . options . externalControl . observe ( pair . key , listener ) ; } . bind ( this ) ) ; } , removeForm : function ( ) { if ( ! this . _form ) return ; this . _form . remove ( ) ; this . _form = null ; this . _controls = { } ; } , showSaving : function ( ) { this . _oldInnerHTML = this . element . innerHTML ; this . element . innerHTML = this . options . savingText ; this . element . addClassName ( this . options . savingClassName ) ; this . element . style . backgroundColor = this . _originalBackground ; this . element . show ( ) ; } , triggerCallback : function ( cbName , arg ) { if ( 'function' == typeof this . options [ cbName ] ) { this . options [ cbName ] ( this , arg ) ; } } , unregisterListeners : function ( ) { $H ( this . _listeners ) . each ( function ( pair ) { if ( ! this . options . externalControlOnly )
this . element . stopObserving ( pair . key , pair . value ) ; if ( this . options . externalControl )
this . options . externalControl . stopObserving ( pair . key , pair . value ) ; } . bind ( this ) ) ; } , wrapUp : function ( transport ) { this . leaveEditMode ( ) ; this . _boundComplete ( transport , this . element ) ; } } ) ; Object . extend ( Ajax . InPlaceEditor . prototype , { dispose : Ajax . InPlaceEditor . prototype . destroy } ) ; Ajax . InPlaceCollectionEditor = Class . create ( Ajax . InPlaceEditor , { initialize : function ( $super , element , url , options ) { this . _extraDefaultOptions = Ajax . InPlaceCollectionEditor . DefaultOptions ; $super ( element , url , options ) ; } , createEditField : function ( ) { var list = document . createElement ( 'select' ) ; list . name = this . options . paramName ; list . size = 1 ; this . _controls . editor = list ; this . _collection = this . options . collection || [ ] ; if ( this . options . loadCollectionURL )
this . loadCollection ( ) ; else
this . checkForExternalText ( ) ; this . _form . appendChild ( this . _controls . editor ) ; } , loadCollection : function ( ) { this . _form . addClassName ( this . options . loadingClassName ) ; this . showLoadingText ( this . options . loadingCollectionText ) ; var options = Object . extend ( { method : 'get' } , this . options . ajaxOptions ) ; Object . extend ( options , { parameters : 'editorId=' + encodeURIComponent ( this . element . id ) , onComplete : Prototype . emptyFunction , onSuccess : function ( transport ) { var js = transport . responseText . strip ( ) ; if ( ! /^\[.*\]$/ . test ( js ) )
throw 'Server returned an invalid collection representation.' ; this . _collection = eval ( js ) ; this . checkForExternalText ( ) ; } . bind ( this ) , onFailure : this . onFailure } ) ; new Ajax . Request ( this . options . loadCollectionURL , options ) ; } , showLoadingText : function ( text ) { this . _controls . editor . disabled = true ; var tempOption = this . _controls . editor . firstChild ; if ( ! tempOption ) { tempOption = document . createElement ( 'option' ) ; tempOption . value = '' ; this . _controls . editor . appendChild ( tempOption ) ; tempOption . selected = true ; }
tempOption . update ( ( text || '' ) . stripScripts ( ) . stripTags ( ) ) ; } , checkForExternalText : function ( ) { this . _text = this . getText ( ) ; if ( this . options . loadTextURL )
this . loadExternalText ( ) ; else
this . buildOptionList ( ) ; } , loadExternalText : function ( ) { this . showLoadingText ( this . options . loadingText ) ; var options = Object . extend ( { method : 'get' } , this . options . ajaxOptions ) ; Object . extend ( options , { parameters : 'editorId=' + encodeURIComponent ( this . element . id ) , onComplete : Prototype . emptyFunction , onSuccess : function ( transport ) { this . _text = transport . responseText . strip ( ) ; this . buildOptionList ( ) ; } . bind ( this ) , onFailure : this . onFailure } ) ; new Ajax . Request ( this . options . loadTextURL , options ) ; } , buildOptionList : function ( ) { this . _form . removeClassName ( this . options . loadingClassName ) ; this . _collection = this . _collection . map ( function ( entry ) { return 2 === entry . length ? entry : [ entry , entry ] . flatten ( ) ; } ) ; var marker = ( 'value' in this . options ) ? this . options . value : this . _text ; var textFound = this . _collection . any ( function ( entry ) { return entry [ 0 ] == marker ; } . bind ( this ) ) ; this . _controls . editor . update ( '' ) ; var option ; this . _collection . each ( function ( entry , index ) { option = document . createElement ( 'option' ) ; option . value = entry [ 0 ] ; option . selected = textFound ? entry [ 0 ] == marker : 0 == index ; option . appendChild ( document . createTextNode ( entry [ 1 ] ) ) ; this . _controls . editor . appendChild ( option ) ; } . bind ( this ) ) ; this . _controls . editor . disabled = false ; Field . scrollFreeActivate ( this . _controls . editor ) ; } } ) ; Ajax . InPlaceEditor . prototype . initialize . dealWithDeprecatedOptions = function ( options ) { if ( ! options ) return ; function fallback ( name , expr ) { if ( name in options || expr === undefined ) return ; options [ name ] = expr ; } ; fallback ( 'cancelControl' , ( options . cancelLink ? 'link' : ( options . cancelButton ? 'button' : options . cancelLink == options . cancelButton == false ? false : undefined ) ) ) ; fallback ( 'okControl' , ( options . okLink ? 'link' : ( options . okButton ? 'button' : options . okLink == options . okButton == false ? false : undefined ) ) ) ; fallback ( 'highlightColor' , options . highlightcolor ) ; fallback ( 'highlightEndColor' , options . highlightendcolor ) ; } ; Object . extend ( Ajax . InPlaceEditor , { DefaultOptions : { ajaxOptions : { } , autoRows : 3 , cancelControl : 'link' , cancelText : 'cancel' , clickToEditText : 'Click to edit' , externalControl : null , externalControlOnly : false , fieldPostCreation : 'activate' , formClassName : 'inplaceeditor-form' , formId : null , highlightColor : '#ffff99' , highlightEndColor : '#ffffff' , hoverClassName : '' , htmlResponse : true , loadingClassName : 'inplaceeditor-loading' , loadingText : 'Loading...' , okControl : 'button' , okText : 'ok' , paramName : 'value' , rows : 1 , savingClassName : 'inplaceeditor-saving' , savingText : 'Saving...' , size : 0 , stripLoadedTextTags : false , submitOnBlur : false , textAfterControls : '' , textBeforeControls : '' , textBetweenControls : '' } , DefaultCallbacks : { callback : function ( form ) { return Form . serialize ( form ) ; } , onComplete : function ( transport , element ) { new Effect . Highlight ( element , { startcolor : this . options . highlightColor , keepBackgroundImage : true } ) ; } , onEnterEditMode : null , onEnterHover : function ( ipe ) { ipe . element . style . backgroundColor = ipe . options . highlightColor ; if ( ipe . _effect )
ipe . _effect . cancel ( ) ; } , onFailure : function ( transport , ipe ) { alert ( 'Error communication with the server: ' + transport . responseText . stripTags ( ) ) ; } , onFormCustomization : null , onLeaveEditMode : null , onLeaveHover : function ( ipe ) { ipe . _effect = new Effect . Highlight ( ipe . element , { startcolor : ipe . options . highlightColor , endcolor : ipe . options . highlightEndColor , restorecolor : ipe . _originalBackground , keepBackgroundImage : true } ) ; } } , Listeners : { click : 'enterEditMode' , keydown : 'checkForEscapeOrReturn' , mouseover : 'enterHover' , mouseout : 'leaveHover' } } ) ; Ajax . InPlaceCollectionEditor . DefaultOptions = { loadingCollectionText : 'Loading options...' } ; Form . Element . DelayedObserver = Class . create ( { initialize : function ( element , delay , callback ) { this . delay = delay || 0.5 ; this . element = $ ( element ) ; this . callback = callback ; this . timer = null ; this . lastValue = $F ( this . element ) ; Event . observe ( this . element , 'keyup' , this . delayedListener . bindAsEventListener ( this ) ) ; } , delayedListener : function ( event ) { if ( this . lastValue == $F ( this . element ) ) return ; if ( this . timer ) clearTimeout ( this . timer ) ; this . timer = setTimeout ( this . onTimerEvent . bind ( this ) , this . delay * 1000 ) ; this . lastValue = $F ( this . element ) ; } , onTimerEvent : function ( ) { this . timer = null ; this . callback ( this . element , $F ( this . element ) ) ; } } ) ; var Login = { showOpenid : function ( ) { if ( $ ( 'database_auth_form' ) ) $ ( 'database_auth_form' ) . hide ( ) ; if ( $ ( 'openid_auth_form' ) ) $ ( 'openid_auth_form' ) . show ( ) ; if ( $ ( 'alternate_auth_openid' ) ) $ ( 'alternate_auth_openid' ) . hide ( ) ; if ( $ ( 'alternate_auth_database' ) ) $ ( 'alternate_auth_database' ) . show ( ) ; if ( $ ( 'openid_url' ) ) $ ( 'openid_url' ) . focus ( ) ; if ( $ ( 'openid_url' ) ) $ ( 'openid_url' ) . select ( ) ; new CookieManager ( ) . setCookie ( 'preferred_auth' , 'openid' ) ; } , showDatabase : function ( container ) { if ( $ ( 'openid_auth_form' ) ) $ ( 'openid_auth_form' ) . hide ( ) ; if ( $ ( 'database_auth_form' ) ) $ ( 'database_auth_form' ) . show ( ) ; if ( $ ( 'alternate_auth_database' ) ) $ ( 'alternate_auth_database' ) . hide ( ) ; if ( $ ( 'alternate_auth_openid' ) ) $ ( 'alternate_auth_openid' ) . show ( ) ; if ( $ ( 'user_login' ) ) $ ( 'user_login' ) . focus ( ) ; if ( $ ( 'user_login' ) ) $ ( 'user_login' ) . select ( ) ; new CookieManager ( ) . setCookie ( 'preferred_auth' , 'database' ) ; } }
var TracksForm = { toggle : function ( toggleDivId , formContainerId , formId , hideLinkText , hideLinkTitle , showLinkText , showLinkTitle ) { $ ( formContainerId ) . toggle ( ) ; toggleDiv = $ ( toggleDivId ) ; toggleLink = toggleDiv . down ( 'a' ) ; if ( toggleDiv . hasClassName ( 'hide_form' ) ) { toggleLink . update ( showLinkText ) . setAttribute ( 'title' , showLinkTitle ) ; }
else { toggleLink . update ( hideLinkText ) . setAttribute ( 'title' , hideLinkTitle ) ; Form . focusFirstElement ( formId ) ; }
toggleDiv . toggleClassName ( 'hide_form' ) ; } }
Event . observe ( window , 'load' , function ( ) { $A ( document . getElementsByClassName ( 'alert' ) ) . each ( function ( o ) { o . opacity = 100.0
Effect . Fade ( o , { duration : 8.0 } ) } ) ; } ) ; CookieManager = Class . create ( ) ; CookieManager . prototype = { BROWSER _IS _IE : ( document . all && window . ActiveXObject && navigator . userAgent . toLowerCase ( ) . indexOf ( "msie" ) > - 1 && navigator . userAgent . toLowerCase ( ) . indexOf ( "opera" ) == - 1 ) , BROWSER _IS _OPERA : ( navigator . userAgent . toLowerCase ( ) . indexOf ( "opera" ) != - 1 ) , initialize : function ( options )
{ this . options = Object . extend ( { shelfLife : 365 , userData : false } , options || { } ) ; this . cookieShelfLife = this . options . shelfLife ; this . userDataForIE = this . options . userData ; if ( this . BROWSER _IS _IE && this . userDataForIE )
{ this . IE _CACHE _NAME = "storage" ; if ( $ ( this . IE _CACHE _NAME ) == null )
{ var div = document . createElement ( "DIV" ) ; div . id = this . IE _CACHE _NAME ; document . body . appendChild ( div ) ; }
this . store = $ ( this . IE _CACHE _NAME ) ; this . store . style . behavior = "url('#default#userData')" ; } } , getCookie : function ( aCookieName )
{ var result = null ; if ( this . BROWSER _IS _IE && this . userDataForIE )
{ this . store . load ( this . IE _CACHE _NAME ) ; result = this . store . getAttribute ( aCookieName ) ; }
else
{ for ( var i = 0 ; i < document . cookie . split ( '; ' ) . length ; i ++ )
{ var crumb = document . cookie . split ( '; ' ) [ i ] . split ( '=' ) ; if ( crumb [ 0 ] == aCookieName && crumb [ 1 ] != null )
{ result = crumb [ 1 ] ; break ; } } }
if ( this . BROWSER _IS _OPERA && result != null )
{ result = result . replace ( /%22/g , '"' ) ; }
return result ; } , setCookie : function ( aCookieName , aCookieValue )
{ if ( this . BROWSER _IS _IE && this . userDataForIE )
{ this . store . setAttribute ( aCookieName , aCookieValue ) ; this . store . save ( this . IE _CACHE _NAME ) ; }
else
{ if ( this . BROWSER _IS _OPERA )
{ aCookieValue = aCookieValue . replace ( /"/g , "%22" ) ; }
var date = new Date ( ) ; date . setTime ( date . getTime ( ) + ( this . cookieShelfLife * 24 * 60 * 60 * 1000 ) ) ; var expires = '; expires=' + date . toGMTString ( ) ; document . cookie = aCookieName + '=' + aCookieValue + expires + '; path=/' ; } } , clearCookie : function ( aCookieName )
{ if ( this . BROWSER _IS _IE && this . userDataForIE )
{ this . store . load ( this . IE _CACHE _NAME ) ; this . store . removeAttribute ( aCookieName ) ; this . store . save ( this . IE _CACHE _NAME ) ; }
else
{ document . cookie = aCookieName + '=;expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/' ; } } }
var SelectorLiteAddon = Class . create ( ) ; SelectorLiteAddon . prototype = { initialize : function ( stack ) { this . r = [ ] ; this . s = [ ] ; this . i = 0 ; for ( var i = stack . length - 1 ; i >= 0 ; i -- ) { var s = [ "*" , "" , [ ] ] ; var t = stack [ i ] ; var cursor = t . length - 1 ; do { var d = t . lastIndexOf ( "#" ) ; var p = t . lastIndexOf ( "." ) ; cursor = Math . max ( d , p ) ; if ( cursor == - 1 ) { s [ 0 ] = t . toUpperCase ( ) ; } else if ( d == - 1 || p == cursor ) { s [ 2 ] . push ( t . substring ( p + 1 ) ) ; } else if ( ! s [ 1 ] ) { s [ 1 ] = t . substring ( d + 1 ) ; }
t = t . substring ( 0 , cursor ) ; } while ( cursor > 0 ) ; this . s [ i ] = s ; } } , get : function ( root ) { this . explore ( root || document , this . i == ( this . s . length - 1 ) ) ; return this . r ; } , explore : function ( elt , leaf ) { var s = this . s [ this . i ] ; var r = [ ] ; if ( s [ 1 ] ) { e = $ ( s [ 1 ] ) ; if ( e && ( s [ 0 ] == "*" || e . tagName == s [ 0 ] ) && e . childOf ( elt ) ) { r = [ e ] ; } } else { r = $A ( elt . getElementsByTagName ( s [ 0 ] ) ) ; }
if ( s [ 2 ] . length == 1 ) { r = r . findAll ( function ( o ) { if ( o . className . indexOf ( " " ) == - 1 ) { return o . className == s [ 2 ] [ 0 ] ; } else { return o . className . split ( /\s+/ ) . include ( s [ 2 ] [ 0 ] ) ; } } ) ; } else if ( s [ 2 ] . length > 0 ) { r = r . findAll ( function ( o ) { if ( o . className . indexOf ( " " ) == - 1 ) { return false ; } else { var q = o . className . split ( /\s+/ ) ; return s [ 2 ] . all ( function ( c ) { return q . include ( c ) ; } ) ; } } ) ; }
if ( leaf ) { this . r = this . r . concat ( r ) ; } else { ++ this . i ; r . each ( function ( o ) { this . explore ( o , this . i == ( this . s . length - 1 ) ) ; } . bind ( this ) ) ; } } }
var $$old = $$ ; var $$ = function ( a , b ) { if ( b || a . indexOf ( "[" ) >= 0 ) return $$old . apply ( this , arguments ) ; return new SelectorLiteAddon ( a . split ( /\s+/ ) ) . get ( ) ; }
Calendar = function ( firstDayOfWeek , dateStr , onSelected , onClose ) { this . activeDiv = null ; this . currentDateEl = null ; this . getDateStatus = null ; this . getDateToolTip = null ; this . getDateText = null ; this . timeout = null ; this . onSelected = onSelected || null ; this . onClose = onClose || null ; this . dragging = false ; this . hidden = false ; this . minYear = 1970 ; this . maxYear = 2050 ; this . dateFormat = Calendar . _TT [ "DEF_DATE_FORMAT" ] ; this . ttDateFormat = Calendar . _TT [ "TT_DATE_FORMAT" ] ; this . isPopup = true ; this . weekNumbers = true ; this . firstDayOfWeek = typeof firstDayOfWeek == "number" ? firstDayOfWeek : Calendar . _FD ; this . showsOtherMonths = false ; this . dateStr = dateStr ; this . ar _days = null ; this . showsTime = false ; this . time24 = true ; this . yearStep = 2 ; this . hiliteToday = true ; this . multiple = null ; this . table = null ; this . element = null ; this . tbody = null ; this . firstdayname = null ; this . monthsCombo = null ; this . yearsCombo = null ; this . hilitedMonth = null ; this . activeMonth = null ; this . hilitedYear = null ; this . activeYear = null ; this . dateClicked = false ; if ( typeof Calendar . _SDN == "undefined" ) { if ( typeof Calendar . _SDN _len == "undefined" )
Calendar . _SDN _len = 3 ; var ar = new Array ( ) ; for ( var i = 8 ; i > 0 ; ) { ar [ -- i ] = Calendar . _DN [ i ] . substr ( 0 , Calendar . _SDN _len ) ; }
Calendar . _SDN = ar ; if ( typeof Calendar . _SMN _len == "undefined" )
Calendar . _SMN _len = 3 ; ar = new Array ( ) ; for ( var i = 12 ; i > 0 ; ) { ar [ -- i ] = Calendar . _MN [ i ] . substr ( 0 , Calendar . _SMN _len ) ; }
Calendar . _SMN = ar ; } } ; Calendar . _C = null ; Calendar . is _ie = ( /msie/i . test ( navigator . userAgent ) && ! /opera/i . test ( navigator . userAgent ) ) ; Calendar . is _ie5 = ( Calendar . is _ie && /msie 5\.0/i . test ( navigator . userAgent ) ) ; Calendar . is _opera = /opera/i . test ( navigator . userAgent ) ; Calendar . is _khtml = /Konqueror|Safari|KHTML/i . test ( navigator . userAgent ) ; Calendar . getAbsolutePos = function ( el ) { var SL = 0 , ST = 0 ; var is _div = /^div$/i . test ( el . tagName ) ; if ( is _div && el . scrollLeft )
SL = el . scrollLeft ; if ( is _div && el . scrollTop )
ST = el . scrollTop ; var r = { x : el . offsetLeft - SL , y : el . offsetTop - ST } ; if ( el . offsetParent ) { var tmp = this . getAbsolutePos ( el . offsetParent ) ; r . x += tmp . x ; r . y += tmp . y ; }
return r ; } ; Calendar . isRelated = function ( el , evt ) { var related = evt . relatedTarget ; if ( ! related ) { var type = evt . type ; if ( type == "mouseover" ) { related = evt . fromElement ; } else if ( type == "mouseout" ) { related = evt . toElement ; } }
while ( related ) { if ( related == el ) { return true ; }
related = related . parentNode ; }
return false ; } ; Calendar . removeClass = function ( el , className ) { if ( ! ( el && el . className ) ) { return ; }
var cls = el . className . split ( " " ) ; var ar = new Array ( ) ; for ( var i = cls . length ; i > 0 ; ) { if ( cls [ -- i ] != className ) { ar [ ar . length ] = cls [ i ] ; } }
el . className = ar . join ( " " ) ; } ; Calendar . addClass = function ( el , className ) { Calendar . removeClass ( el , className ) ; el . className += " " + className ; } ; Calendar . getElement = function ( ev ) { var f = Calendar . is _ie ? window . event . srcElement : ev . currentTarget ; while ( f . nodeType != 1 || /^div$/i . test ( f . tagName ) )
f = f . parentNode ; return f ; } ; Calendar . getTargetElement = function ( ev ) { var f = Calendar . is _ie ? window . event . srcElement : ev . target ; while ( f . nodeType != 1 )
f = f . parentNode ; return f ; } ; Calendar . stopEvent = function ( ev ) { ev || ( ev = window . event ) ; if ( Calendar . is _ie ) { ev . cancelBubble = true ; ev . returnValue = false ; } else { ev . preventDefault ( ) ; ev . stopPropagation ( ) ; }
return false ; } ; Calendar . addEvent = function ( el , evname , func ) { if ( el . attachEvent ) { el . attachEvent ( "on" + evname , func ) ; } else if ( el . addEventListener ) { el . addEventListener ( evname , func , true ) ; } else { el [ "on" + evname ] = func ; } } ; Calendar . removeEvent = function ( el , evname , func ) { if ( el . detachEvent ) { el . detachEvent ( "on" + evname , func ) ; } else if ( el . removeEventListener ) { el . removeEventListener ( evname , func , true ) ; } else { el [ "on" + evname ] = null ; } } ; Calendar . createElement = function ( type , parent ) { var el = null ; if ( document . createElementNS ) { el = document . createElementNS ( "http://www.w3.org/1999/xhtml" , type ) ; } else { el = document . createElement ( type ) ; }
if ( typeof parent != "undefined" ) { parent . appendChild ( el ) ; }
return el ; } ; Calendar . _add _evs = function ( el ) { with ( Calendar ) { addEvent ( el , "mouseover" , dayMouseOver ) ; addEvent ( el , "mousedown" , dayMouseDown ) ; addEvent ( el , "mouseout" , dayMouseOut ) ; if ( is _ie ) { addEvent ( el , "dblclick" , dayMouseDblClick ) ; el . setAttribute ( "unselectable" , true ) ; } } } ; Calendar . findMonth = function ( el ) { if ( typeof el . month != "undefined" ) { return el ; } else if ( typeof el . parentNode . month != "undefined" ) { return el . parentNode ; }
return null ; } ; Calendar . findYear = function ( el ) { if ( typeof el . year != "undefined" ) { return el ; } else if ( typeof el . parentNode . year != "undefined" ) { return el . parentNode ; }
return null ; } ; Calendar . showMonthsCombo = function ( ) { var cal = Calendar . _C ; if ( ! cal ) { return false ; }
var cal = cal ; var cd = cal . activeDiv ; var mc = cal . monthsCombo ; if ( cal . hilitedMonth ) { Calendar . removeClass ( cal . hilitedMonth , "hilite" ) ; }
if ( cal . activeMonth ) { Calendar . removeClass ( cal . activeMonth , "active" ) ; }
var mon = cal . monthsCombo . getElementsByTagName ( "div" ) [ cal . date . getMonth ( ) ] ; Calendar . addClass ( mon , "active" ) ; cal . activeMonth = mon ; var s = mc . style ; s . display = "block" ; if ( cd . navtype < 0 )
s . left = cd . offsetLeft + "px" ; else { var mcw = mc . offsetWidth ; if ( typeof mcw == "undefined" )
mcw = 50 ; s . left = ( cd . offsetLeft + cd . offsetWidth - mcw ) + "px" ; }
s . top = ( cd . offsetTop + cd . offsetHeight ) + "px" ; } ; Calendar . showYearsCombo = function ( fwd ) { var cal = Calendar . _C ; if ( ! cal ) { return false ; }
var cal = cal ; var cd = cal . activeDiv ; var yc = cal . yearsCombo ; if ( cal . hilitedYear ) { Calendar . removeClass ( cal . hilitedYear , "hilite" ) ; }
if ( cal . activeYear ) { Calendar . removeClass ( cal . activeYear , "active" ) ; }
cal . activeYear = null ; var Y = cal . date . getFullYear ( ) + ( fwd ? 1 : - 1 ) ; var yr = yc . firstChild ; var show = false ; for ( var i = 12 ; i > 0 ; -- i ) { if ( Y >= cal . minYear && Y <= cal . maxYear ) { yr . innerHTML = Y ; yr . year = Y ; yr . style . display = "block" ; show = true ; } else { yr . style . display = "none" ; }
yr = yr . nextSibling ; Y += fwd ? cal . yearStep : - cal . yearStep ; }
if ( show ) { var s = yc . style ; s . display = "block" ; if ( cd . navtype < 0 )
s . left = cd . offsetLeft + "px" ; else { var ycw = yc . offsetWidth ; if ( typeof ycw == "undefined" )
ycw = 50 ; s . left = ( cd . offsetLeft + cd . offsetWidth - ycw ) + "px" ; }
s . top = ( cd . offsetTop + cd . offsetHeight ) + "px" ; } } ; Calendar . tableMouseUp = function ( ev ) { var cal = Calendar . _C ; if ( ! cal ) { return false ; }
if ( cal . timeout ) { clearTimeout ( cal . timeout ) ; }
var el = cal . activeDiv ; if ( ! el ) { return false ; }
var target = Calendar . getTargetElement ( ev ) ; ev || ( ev = window . event ) ; Calendar . removeClass ( el , "active" ) ; if ( target == el || target . parentNode == el ) { Calendar . cellClick ( el , ev ) ; }
var mon = Calendar . findMonth ( target ) ; var date = null ; if ( mon ) { date = new Date ( cal . date ) ; if ( mon . month != date . getMonth ( ) ) { date . setMonth ( mon . month ) ; cal . setDate ( date ) ; cal . dateClicked = false ; cal . callHandler ( ) ; } } else { var year = Calendar . findYear ( target ) ; if ( year ) { date = new Date ( cal . date ) ; if ( year . year != date . getFullYear ( ) ) { date . setFullYear ( year . year ) ; cal . setDate ( date ) ; cal . dateClicked = false ; cal . callHandler ( ) ; } } }
with ( Calendar ) { removeEvent ( document , "mouseup" , tableMouseUp ) ; removeEvent ( document , "mouseover" , tableMouseOver ) ; removeEvent ( document , "mousemove" , tableMouseOver ) ; cal . _hideCombos ( ) ; _C = null ; return stopEvent ( ev ) ; } } ; Calendar . tableMouseOver = function ( ev ) { var cal = Calendar . _C ; if ( ! cal ) { return ; }
var el = cal . activeDiv ; var target = Calendar . getTargetElement ( ev ) ; if ( target == el || target . parentNode == el ) { Calendar . addClass ( el , "hilite active" ) ; Calendar . addClass ( el . parentNode , "rowhilite" ) ; } else { if ( typeof el . navtype == "undefined" || ( el . navtype != 50 && ( el . navtype == 0 || Math . abs ( el . navtype ) > 2 ) ) )
Calendar . removeClass ( el , "active" ) ; Calendar . removeClass ( el , "hilite" ) ; Calendar . removeClass ( el . parentNode , "rowhilite" ) ; }
ev || ( ev = window . event ) ; if ( el . navtype == 50 && target != el ) { var pos = Calendar . getAbsolutePos ( el ) ; var w = el . offsetWidth ; var x = ev . clientX ; var dx ; var decrease = true ; if ( x > pos . x + w ) { dx = x - pos . x - w ; decrease = false ; } else
dx = pos . x - x ; if ( dx < 0 ) dx = 0 ; var range = el . _range ; var current = el . _current ; var count = Math . floor ( dx / 10 ) % range . length ; for ( var i = range . length ; -- i >= 0 ; )
if ( range [ i ] == current )
break ; while ( count -- > 0 )
if ( decrease ) { if ( -- i < 0 )
i = range . length - 1 ; } else if ( ++ i >= range . length )
i = 0 ; var newval = range [ i ] ; el . innerHTML = newval ; cal . onUpdateTime ( ) ; }
var mon = Calendar . findMonth ( target ) ; if ( mon ) { if ( mon . month != cal . date . getMonth ( ) ) { if ( cal . hilitedMonth ) { Calendar . removeClass ( cal . hilitedMonth , "hilite" ) ; }
Calendar . addClass ( mon , "hilite" ) ; cal . hilitedMonth = mon ; } else if ( cal . hilitedMonth ) { Calendar . removeClass ( cal . hilitedMonth , "hilite" ) ; } } else { if ( cal . hilitedMonth ) { Calendar . removeClass ( cal . hilitedMonth , "hilite" ) ; }
var year = Calendar . findYear ( target ) ; if ( year ) { if ( year . year != cal . date . getFullYear ( ) ) { if ( cal . hilitedYear ) { Calendar . removeClass ( cal . hilitedYear , "hilite" ) ; }
Calendar . addClass ( year , "hilite" ) ; cal . hilitedYear = year ; } else if ( cal . hilitedYear ) { Calendar . removeClass ( cal . hilitedYear , "hilite" ) ; } } else if ( cal . hilitedYear ) { Calendar . removeClass ( cal . hilitedYear , "hilite" ) ; } }
return Calendar . stopEvent ( ev ) ; } ; Calendar . tableMouseDown = function ( ev ) { if ( Calendar . getTargetElement ( ev ) == Calendar . getElement ( ev ) ) { return Calendar . stopEvent ( ev ) ; } } ; Calendar . calDragIt = function ( ev ) { var cal = Calendar . _C ; if ( ! ( cal && cal . dragging ) ) { return false ; }
var posX ; var posY ; if ( Calendar . is _ie ) { posY = window . event . clientY + document . body . scrollTop ; posX = window . event . clientX + document . body . scrollLeft ; } else { posX = ev . pageX ; posY = ev . pageY ; }
cal . hideShowCovered ( ) ; var st = cal . element . style ; st . left = ( posX - cal . xOffs ) + "px" ; st . top = ( posY - cal . yOffs ) + "px" ; return Calendar . stopEvent ( ev ) ; } ; Calendar . calDragEnd = function ( ev ) { var cal = Calendar . _C ; if ( ! cal ) { return false ; }
cal . dragging = false ; with ( Calendar ) { removeEvent ( document , "mousemove" , calDragIt ) ; removeEvent ( document , "mouseup" , calDragEnd ) ; tableMouseUp ( ev ) ; }
cal . hideShowCovered ( ) ; } ; Calendar . dayMouseDown = function ( ev ) { var el = Calendar . getElement ( ev ) ; if ( el . disabled ) { return false ; }
var cal = el . calendar ; cal . activeDiv = el ; Calendar . _C = cal ; if ( el . navtype != 300 ) with ( Calendar ) { if ( el . navtype == 50 ) { el . _current = el . innerHTML ; addEvent ( document , "mousemove" , tableMouseOver ) ; } else
addEvent ( document , Calendar . is _ie5 ? "mousemove" : "mouseover" , tableMouseOver ) ; addClass ( el , "hilite active" ) ; addEvent ( document , "mouseup" , tableMouseUp ) ; } else if ( cal . isPopup ) { cal . _dragStart ( ev ) ; }
if ( el . navtype == - 1 || el . navtype == 1 ) { if ( cal . timeout ) clearTimeout ( cal . timeout ) ; cal . timeout = setTimeout ( "Calendar.showMonthsCombo()" , 250 ) ; } else if ( el . navtype == - 2 || el . navtype == 2 ) { if ( cal . timeout ) clearTimeout ( cal . timeout ) ; cal . timeout = setTimeout ( ( el . navtype > 0 ) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)" , 250 ) ; } else { cal . timeout = null ; }
return Calendar . stopEvent ( ev ) ; } ; Calendar . dayMouseDblClick = function ( ev ) { Calendar . cellClick ( Calendar . getElement ( ev ) , ev || window . event ) ; if ( Calendar . is _ie ) { document . selection . empty ( ) ; } } ; Calendar . dayMouseOver = function ( ev ) { var el = Calendar . getElement ( ev ) ; if ( Calendar . isRelated ( el , ev ) || Calendar . _C || el . disabled ) { return false ; }
if ( el . ttip ) { if ( el . ttip . substr ( 0 , 1 ) == "_" ) { el . ttip = el . caldate . print ( el . calendar . ttDateFormat ) + el . ttip . substr ( 1 ) ; }
el . calendar . tooltips . innerHTML = el . ttip ; }
if ( el . navtype != 300 ) { Calendar . addClass ( el , "hilite" ) ; if ( el . caldate ) { Calendar . addClass ( el . parentNode , "rowhilite" ) ; } }
return Calendar . stopEvent ( ev ) ; } ; Calendar . dayMouseOut = function ( ev ) { with ( Calendar ) { var el = getElement ( ev ) ; if ( isRelated ( el , ev ) || _C || el . disabled )
return false ; removeClass ( el , "hilite" ) ; if ( el . caldate )
removeClass ( el . parentNode , "rowhilite" ) ; if ( el . calendar )
el . calendar . tooltips . innerHTML = _TT [ "SEL_DATE" ] ; return stopEvent ( ev ) ; } } ; Calendar . cellClick = function ( el , ev ) { var cal = el . calendar ; var closing = false ; var newdate = false ; var date = null ; if ( typeof el . navtype == "undefined" ) { if ( cal . currentDateEl ) { Calendar . removeClass ( cal . currentDateEl , "selected" ) ; Calendar . addClass ( el , "selected" ) ; closing = ( cal . currentDateEl == el ) ; if ( ! closing ) { cal . currentDateEl = el ; } }
cal . date . setDateOnly ( el . caldate ) ; date = cal . date ; var other _month = ! ( cal . dateClicked = ! el . otherMonth ) ; if ( ! other _month && ! cal . currentDateEl )
cal . _toggleMultipleDate ( new Date ( date ) ) ; else
newdate = ! el . disabled ; if ( other _month )
cal . _init ( cal . firstDayOfWeek , date ) ; } else { if ( el . navtype == 200 ) { Calendar . removeClass ( el , "hilite" ) ; cal . callCloseHandler ( ) ; return ; }
date = new Date ( cal . date ) ; if ( el . navtype == 0 )
date . setDateOnly ( new Date ( ) ) ; cal . dateClicked = false ; var year = date . getFullYear ( ) ; var mon = date . getMonth ( ) ; function setMonth ( m ) { var day = date . getDate ( ) ; var max = date . getMonthDays ( m ) ; if ( day > max ) { date . setDate ( max ) ; }
date . setMonth ( m ) ; } ; switch ( el . navtype ) { case 400 : Calendar . removeClass ( el , "hilite" ) ; var text = Calendar . _TT [ "ABOUT" ] ; if ( typeof text != "undefined" ) { text += cal . showsTime ? Calendar . _TT [ "ABOUT_TIME" ] : "" ; } else { text = "Help and about box text is not translated into this language.\n" + "If you know this language and you feel generous please update\n" + "the corresponding file in \"lang\" subdir to match calendar-en.js\n" + "and send it back to <mihai_bazon@yahoo.com> to get it into the distribution ;-)\n\n" + "Thank you!\n" + "http://dynarch.com/mishoo/calendar.epl\n" ; }
alert ( text ) ; return ; case - 2 : if ( year > cal . minYear ) { date . setFullYear ( year - 1 ) ; }
break ; case - 1 : if ( mon > 0 ) { setMonth ( mon - 1 ) ; } else if ( year -- > cal . minYear ) { date . setFullYear ( year ) ; setMonth ( 11 ) ; }
break ; case 1 : if ( mon < 11 ) { setMonth ( mon + 1 ) ; } else if ( year < cal . maxYear ) { date . setFullYear ( year + 1 ) ; setMonth ( 0 ) ; }
break ; case 2 : if ( year < cal . maxYear ) { date . setFullYear ( year + 1 ) ; }
break ; case 100 : cal . setFirstDayOfWeek ( el . fdow ) ; return ; case 50 : var range = el . _range ; var current = el . innerHTML ; for ( var i = range . length ; -- i >= 0 ; )
if ( range [ i ] == current )
break ; if ( ev && ev . shiftKey ) { if ( -- i < 0 )
i = range . length - 1 ; } else if ( ++ i >= range . length )
i = 0 ; var newval = range [ i ] ; el . innerHTML = newval ; cal . onUpdateTime ( ) ; return ; case 0 : if ( ( typeof cal . getDateStatus == "function" ) && cal . getDateStatus ( date , date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) ) ) { return false ; }
break ; }
if ( ! date . equalsTo ( cal . date ) ) { cal . setDate ( date ) ; newdate = true ; } else if ( el . navtype == 0 )
newdate = closing = true ; }
if ( newdate ) { ev && cal . callHandler ( ) ; }
if ( closing ) { Calendar . removeClass ( el , "hilite" ) ; ev && cal . callCloseHandler ( ) ; } } ; Calendar . prototype . create = function ( _par ) { var parent = null ; if ( ! _par ) { parent = document . getElementsByTagName ( "body" ) [ 0 ] ; this . isPopup = true ; } else { parent = _par ; this . isPopup = false ; }
this . date = this . dateStr ? new Date ( this . dateStr ) : new Date ( ) ; var table = Calendar . createElement ( "table" ) ; this . table = table ; table . cellSpacing = 0 ; table . cellPadding = 0 ; table . calendar = this ; Calendar . addEvent ( table , "mousedown" , Calendar . tableMouseDown ) ; var div = Calendar . createElement ( "div" ) ; this . element = div ; div . className = "calendar" ; if ( this . isPopup ) { div . style . position = "absolute" ; div . style . display = "none" ; }
div . appendChild ( table ) ; var thead = Calendar . createElement ( "thead" , table ) ; var cell = null ; var row = null ; var cal = this ; var hh = function ( text , cs , navtype ) { cell = Calendar . createElement ( "td" , row ) ; cell . colSpan = cs ; cell . className = "button" ; if ( navtype != 0 && Math . abs ( navtype ) <= 2 )
cell . className += " nav" ; Calendar . _add _evs ( cell ) ; cell . calendar = cal ; cell . navtype = navtype ; cell . innerHTML = "<div unselectable='on'>" + text + "</div>" ; return cell ; } ; row = Calendar . createElement ( "tr" , thead ) ; var title _length = 6 ; ( this . isPopup ) && -- title _length ; ( this . weekNumbers ) && ++ title _length ; hh ( "?" , 1 , 400 ) . ttip = Calendar . _TT [ "INFO" ] ; this . title = hh ( "" , title _length , 300 ) ; this . title . className = "title" ; if ( this . isPopup ) { this . title . ttip = Calendar . _TT [ "DRAG_TO_MOVE" ] ; this . title . style . cursor = "move" ; hh ( "×" , 1 , 200 ) . ttip = Calendar . _TT [ "CLOSE" ] ; }
row = Calendar . createElement ( "tr" , thead ) ; row . className = "headrow" ; this . _nav _py = hh ( "«" , 1 , - 2 ) ; this . _nav _py . ttip = Calendar . _TT [ "PREV_YEAR" ] ; this . _nav _pm = hh ( "‹" , 1 , - 1 ) ; this . _nav _pm . ttip = Calendar . _TT [ "PREV_MONTH" ] ; this . _nav _now = hh ( Calendar . _TT [ "TODAY" ] , this . weekNumbers ? 4 : 3 , 0 ) ; this . _nav _now . ttip = Calendar . _TT [ "GO_TODAY" ] ; this . _nav _nm = hh ( "›" , 1 , 1 ) ; this . _nav _nm . ttip = Calendar . _TT [ "NEXT_MONTH" ] ; this . _nav _ny = hh ( "»" , 1 , 2 ) ; this . _nav _ny . ttip = Calendar . _TT [ "NEXT_YEAR" ] ; row = Calendar . createElement ( "tr" , thead ) ; row . className = "daynames" ; if ( this . weekNumbers ) { cell = Calendar . createElement ( "td" , row ) ; cell . className = "name wn" ; cell . innerHTML = Calendar . _TT [ "WK" ] ; }
for ( var i = 7 ; i > 0 ; -- i ) { cell = Calendar . createElement ( "td" , row ) ; if ( ! i ) { cell . navtype = 100 ; cell . calendar = this ; Calendar . _add _evs ( cell ) ; } }
this . firstdayname = ( this . weekNumbers ) ? row . firstChild . nextSibling : row . firstChild ; this . _displayWeekdays ( ) ; var tbody = Calendar . createElement ( "tbody" , table ) ; this . tbody = tbody ; for ( i = 6 ; i > 0 ; -- i ) { row = Calendar . createElement ( "tr" , tbody ) ; if ( this . weekNumbers ) { cell = Calendar . createElement ( "td" , row ) ; }
for ( var j = 7 ; j > 0 ; -- j ) { cell = Calendar . createElement ( "td" , row ) ; cell . calendar = this ; Calendar . _add _evs ( cell ) ; } }
if ( this . showsTime ) { row = Calendar . createElement ( "tr" , tbody ) ; row . className = "time" ; cell = Calendar . createElement ( "td" , row ) ; cell . className = "time" ; cell . colSpan = 2 ; cell . innerHTML = Calendar . _TT [ "TIME" ] || " " ; cell = Calendar . createElement ( "td" , row ) ; cell . className = "time" ; cell . colSpan = this . weekNumbers ? 4 : 3 ; ( function ( ) { function makeTimePart ( className , init , range _start , range _end ) { var part = Calendar . createElement ( "span" , cell ) ; part . className = className ; part . innerHTML = init ; part . calendar = cal ; part . ttip = Calendar . _TT [ "TIME_PART" ] ; part . navtype = 50 ; part . _range = [ ] ; if ( typeof range _start != "number" )
part . _range = range _start ; else { for ( var i = range _start ; i <= range _end ; ++ i ) { var txt ; if ( i < 10 && range _end >= 10 ) txt = '0' + i ; else txt = '' + i ; part . _range [ part . _range . length ] = txt ; } }
Calendar . _add _evs ( part ) ; return part ; } ; var hrs = cal . date . getHours ( ) ; var mins = cal . date . getMinutes ( ) ; var t12 = ! cal . time24 ; var pm = ( hrs > 12 ) ; if ( t12 && pm ) hrs -= 12 ; var H = makeTimePart ( "hour" , hrs , t12 ? 1 : 0 , t12 ? 12 : 23 ) ; var span = Calendar . createElement ( "span" , cell ) ; span . innerHTML = ":" ; span . className = "colon" ; var M = makeTimePart ( "minute" , mins , 0 , 59 ) ; var AP = null ; cell = Calendar . createElement ( "td" , row ) ; cell . className = "time" ; cell . colSpan = 2 ; if ( t12 )
AP = makeTimePart ( "ampm" , pm ? "pm" : "am" , [ "am" , "pm" ] ) ; else
cell . innerHTML = " " ; cal . onSetTime = function ( ) { var pm , hrs = this . date . getHours ( ) , mins = this . date . getMinutes ( ) ; if ( t12 ) { pm = ( hrs >= 12 ) ; if ( pm ) hrs -= 12 ; if ( hrs == 0 ) hrs = 12 ; AP . innerHTML = pm ? "pm" : "am" ; }
H . innerHTML = ( hrs < 10 ) ? ( "0" + hrs ) : hrs ; M . innerHTML = ( mins < 10 ) ? ( "0" + mins ) : mins ; } ; cal . onUpdateTime = function ( ) { var date = this . date ; var h = parseInt ( H . innerHTML , 10 ) ; if ( t12 ) { if ( /pm/i . test ( AP . innerHTML ) && h < 12 )
h += 12 ; else if ( /am/i . test ( AP . innerHTML ) && h == 12 )
h = 0 ; }
var d = date . getDate ( ) ; var m = date . getMonth ( ) ; var y = date . getFullYear ( ) ; date . setHours ( h ) ; date . setMinutes ( parseInt ( M . innerHTML , 10 ) ) ; date . setFullYear ( y ) ; date . setMonth ( m ) ; date . setDate ( d ) ; this . dateClicked = false ; this . callHandler ( ) ; } ; } ) ( ) ; } else { this . onSetTime = this . onUpdateTime = function ( ) { } ; }
var tfoot = Calendar . createElement ( "tfoot" , table ) ; row = Calendar . createElement ( "tr" , tfoot ) ; row . className = "footrow" ; cell = hh ( Calendar . _TT [ "SEL_DATE" ] , this . weekNumbers ? 8 : 7 , 300 ) ; cell . className = "ttip" ; if ( this . isPopup ) { cell . ttip = Calendar . _TT [ "DRAG_TO_MOVE" ] ; cell . style . cursor = "move" ; }
this . tooltips = cell ; div = Calendar . createElement ( "div" , this . element ) ; this . monthsCombo = div ; div . className = "combo" ; for ( i = 0 ; i < Calendar . _MN . length ; ++ i ) { var mn = Calendar . createElement ( "div" ) ; mn . className = Calendar . is _ie ? "label-IEfix" : "label" ; mn . month = i ; mn . innerHTML = Calendar . _SMN [ i ] ; div . appendChild ( mn ) ; }
div = Calendar . createElement ( "div" , this . element ) ; this . yearsCombo = div ; div . className = "combo" ; for ( i = 12 ; i > 0 ; -- i ) { var yr = Calendar . createElement ( "div" ) ; yr . className = Calendar . is _ie ? "label-IEfix" : "label" ; div . appendChild ( yr ) ; }
this . _init ( this . firstDayOfWeek , this . date ) ; parent . appendChild ( this . element ) ; } ; Calendar . _keyEvent = function ( ev ) { var cal = window . _dynarch _popupCalendar ; if ( ! cal || cal . multiple )
return false ; ( Calendar . is _ie ) && ( ev = window . event ) ; var act = ( Calendar . is _ie || ev . type == "keypress" ) , K = ev . keyCode ; if ( ev . ctrlKey ) { switch ( K ) { case 37 : act && Calendar . cellClick ( cal . _nav _pm ) ; break ; case 38 : act && Calendar . cellClick ( cal . _nav _py ) ; break ; case 39 : act && Calendar . cellClick ( cal . _nav _nm ) ; break ; case 40 : act && Calendar . cellClick ( cal . _nav _ny ) ; break ; default : return false ; } } else switch ( K ) { case 32 : Calendar . cellClick ( cal . _nav _now ) ; break ; case 27 : act && cal . callCloseHandler ( ) ; break ; case 37 : case 38 : case 39 : case 40 : if ( act ) { var prev , x , y , ne , el , step ; prev = K == 37 || K == 38 ; step = ( K == 37 || K == 39 ) ? 1 : 7 ; function setVars ( ) { el = cal . currentDateEl ; var p = el . pos ; x = p & 15 ; y = p >> 4 ; ne = cal . ar _days [ y ] [ x ] ; } ; setVars ( ) ; function prevMonth ( ) { var date = new Date ( cal . date ) ; date . setDate ( date . getDate ( ) - step ) ; cal . setDate ( date ) ; } ; function nextMonth ( ) { var date = new Date ( cal . date ) ; date . setDate ( date . getDate ( ) + step ) ; cal . setDate ( date ) ; } ; while ( 1 ) { switch ( K ) { case 37 : if ( -- x >= 0 )
ne = cal . ar _days [ y ] [ x ] ; else { x = 6 ; K = 38 ; continue ; }
break ; case 38 : if ( -- y >= 0 )
ne = cal . ar _days [ y ] [ x ] ; else { prevMonth ( ) ; setVars ( ) ; }
break ; case 39 : if ( ++ x < 7 )
ne = cal . ar _days [ y ] [ x ] ; else { x = 0 ; K = 40 ; continue ; }
break ; case 40 : if ( ++ y < cal . ar _days . length )
ne = cal . ar _days [ y ] [ x ] ; else { nextMonth ( ) ; setVars ( ) ; }
break ; }
break ; }
if ( ne ) { if ( ! ne . disabled )
Calendar . cellClick ( ne ) ; else if ( prev )
prevMonth ( ) ; else
nextMonth ( ) ; } }
break ; case 13 : if ( act )
Calendar . cellClick ( cal . currentDateEl , ev ) ; break ; default : return false ; }
return Calendar . stopEvent ( ev ) ; } ; Calendar . prototype . _init = function ( firstDayOfWeek , date ) { var today = new Date ( ) , TY = today . getFullYear ( ) , TM = today . getMonth ( ) , TD = today . getDate ( ) ; this . table . style . visibility = "hidden" ; var year = date . getFullYear ( ) ; if ( year < this . minYear ) { year = this . minYear ; date . setFullYear ( year ) ; } else if ( year > this . maxYear ) { year = this . maxYear ; date . setFullYear ( year ) ; }
this . firstDayOfWeek = firstDayOfWeek ; this . date = new Date ( date ) ; var month = date . getMonth ( ) ; var mday = date . getDate ( ) ; var no _days = date . getMonthDays ( ) ; date . setDate ( 1 ) ; var day1 = ( date . getDay ( ) - this . firstDayOfWeek ) % 7 ; if ( day1 < 0 )
day1 += 7 ; date . setDate ( - day1 ) ; date . setDate ( date . getDate ( ) + 1 ) ; var row = this . tbody . firstChild ; var MN = Calendar . _SMN [ month ] ; var ar _days = this . ar _days = new Array ( ) ; var weekend = Calendar . _TT [ "WEEKEND" ] ; var dates = this . multiple ? ( this . datesCells = { } ) : null ; for ( var i = 0 ; i < 6 ; ++ i , row = row . nextSibling ) { var cell = row . firstChild ; if ( this . weekNumbers ) { cell . className = "day wn" ; cell . innerHTML = date . getWeekNumber ( ) ; cell = cell . nextSibling ; }
row . className = "daysrow" ; var hasdays = false , iday , dpos = ar _days [ i ] = [ ] ; for ( var j = 0 ; j < 7 ; ++ j , cell = cell . nextSibling , date . setDate ( iday + 1 ) ) { iday = date . getDate ( ) ; var wday = date . getDay ( ) ; cell . className = "day" ; cell . pos = i << 4 | j ; dpos [ j ] = cell ; var current _month = ( date . getMonth ( ) == month ) ; if ( ! current _month ) { if ( this . showsOtherMonths ) { cell . className += " othermonth" ; cell . otherMonth = true ; } else { cell . className = "emptycell" ; cell . innerHTML = " " ; cell . disabled = true ; continue ; } } else { cell . otherMonth = false ; hasdays = true ; }
cell . disabled = false ; cell . innerHTML = this . getDateText ? this . getDateText ( date , iday ) : iday ; if ( dates )
dates [ date . print ( "%Y%m%d" ) ] = cell ; if ( this . getDateStatus ) { var status = this . getDateStatus ( date , year , month , iday ) ; if ( this . getDateToolTip ) { var toolTip = this . getDateToolTip ( date , year , month , iday ) ; if ( toolTip )
cell . title = toolTip ; }
if ( status === true ) { cell . className += " disabled" ; cell . disabled = true ; } else { if ( /disabled/i . test ( status ) )
cell . disabled = true ; cell . className += " " + status ; } }
if ( ! cell . disabled ) { cell . caldate = new Date ( date ) ; cell . ttip = "_" ; if ( ! this . multiple && current _month && iday == mday && this . hiliteToday ) { cell . className += " selected" ; this . currentDateEl = cell ; }
if ( date . getFullYear ( ) == TY && date . getMonth ( ) == TM && iday == TD ) { cell . className += " today" ; cell . ttip += Calendar . _TT [ "PART_TODAY" ] ; }
if ( weekend . indexOf ( wday . toString ( ) ) != - 1 )
cell . className += cell . otherMonth ? " oweekend" : " weekend" ; } }
if ( ! ( hasdays || this . showsOtherMonths ) )
row . className = "emptyrow" ; }
this . title . innerHTML = Calendar . _MN [ month ] + ", " + year ; this . onSetTime ( ) ; this . table . style . visibility = "visible" ; this . _initMultipleDates ( ) ; } ; Calendar . prototype . _initMultipleDates = function ( ) { if ( this . multiple ) { for ( var i in this . multiple ) { var cell = this . datesCells [ i ] ; var d = this . multiple [ i ] ; if ( ! d )
continue ; if ( cell )
cell . className += " selected" ; } } } ; Calendar . prototype . _toggleMultipleDate = function ( date ) { if ( this . multiple ) { var ds = date . print ( "%Y%m%d" ) ; var cell = this . datesCells [ ds ] ; if ( cell ) { var d = this . multiple [ ds ] ; if ( ! d ) { Calendar . addClass ( cell , "selected" ) ; this . multiple [ ds ] = date ; } else { Calendar . removeClass ( cell , "selected" ) ; delete this . multiple [ ds ] ; } } } } ; Calendar . prototype . setDateToolTipHandler = function ( unaryFunction ) { this . getDateToolTip = unaryFunction ; } ; Calendar . prototype . setDate = function ( date ) { if ( ! date . equalsTo ( this . date ) ) { this . _init ( this . firstDayOfWeek , date ) ; } } ; Calendar . prototype . refresh = function ( ) { this . _init ( this . firstDayOfWeek , this . date ) ; } ; Calendar . prototype . setFirstDayOfWeek = function ( firstDayOfWeek ) { this . _init ( firstDayOfWeek , this . date ) ; this . _displayWeekdays ( ) ; } ; Calendar . prototype . setDateStatusHandler = Calendar . prototype . setDisabledHandler = function ( unaryFunction ) { this . getDateStatus = unaryFunction ; } ; Calendar . prototype . setRange = function ( a , z ) { this . minYear = a ; this . maxYear = z ; } ; Calendar . prototype . callHandler = function ( ) { if ( this . onSelected ) { this . onSelected ( this , this . date . print ( this . dateFormat ) ) ; } } ; Calendar . prototype . callCloseHandler = function ( ) { if ( this . onClose ) { this . onClose ( this ) ; }
this . hideShowCovered ( ) ; } ; Calendar . prototype . destroy = function ( ) { var el = this . element . parentNode ; el . removeChild ( this . element ) ; Calendar . _C = null ; window . _dynarch _popupCalendar = null ; } ; Calendar . prototype . reparent = function ( new _parent ) { var el = this . element ; el . parentNode . removeChild ( el ) ; new _parent . appendChild ( el ) ; } ; Calendar . _checkCalendar = function ( ev ) { var calendar = window . _dynarch _popupCalendar ; if ( ! calendar ) { return false ; }
var el = Calendar . is _ie ? Calendar . getElement ( ev ) : Calendar . getTargetElement ( ev ) ; for ( ; el != null && el != calendar . element ; el = el . parentNode ) ; if ( el == null ) { window . _dynarch _popupCalendar . callCloseHandler ( ) ; return Calendar . stopEvent ( ev ) ; } } ; Calendar . prototype . show = function ( ) { var rows = this . table . getElementsByTagName ( "tr" ) ; for ( var i = rows . length ; i > 0 ; ) { var row = rows [ -- i ] ; Calendar . removeClass ( row , "rowhilite" ) ; var cells = row . getElementsByTagName ( "td" ) ; for ( var j = cells . length ; j > 0 ; ) { var cell = cells [ -- j ] ; Calendar . removeClass ( cell , "hilite" ) ; Calendar . removeClass ( cell , "active" ) ; } }
this . element . style . display = "block" ; this . hidden = false ; if ( this . isPopup ) { window . _dynarch _popupCalendar = this ; Calendar . addEvent ( document , "keydown" , Calendar . _keyEvent ) ; Calendar . addEvent ( document , "keypress" , Calendar . _keyEvent ) ; Calendar . addEvent ( document , "mousedown" , Calendar . _checkCalendar ) ; }
this . hideShowCovered ( ) ; } ; Calendar . prototype . hide = function ( ) { if ( this . isPopup ) { Calendar . removeEvent ( document , "keydown" , Calendar . _keyEvent ) ; Calendar . removeEvent ( document , "keypress" , Calendar . _keyEvent ) ; Calendar . removeEvent ( document , "mousedown" , Calendar . _checkCalendar ) ; }
this . element . style . display = "none" ; this . hidden = true ; this . hideShowCovered ( ) ; } ; Calendar . prototype . showAt = function ( x , y ) { var s = this . element . style ; s . left = x + "px" ; s . top = y + "px" ; this . show ( ) ; } ; Calendar . prototype . showAtElement = function ( el , opts ) { var self = this ; var p = Calendar . getAbsolutePos ( el ) ; if ( ! opts || typeof opts != "string" ) { this . showAt ( p . x , p . y + el . offsetHeight ) ; return true ; }
function fixPosition ( box ) { if ( box . x < 0 )
box . x = 0 ; if ( box . y < 0 )
box . y = 0 ; var cp = document . createElement ( "div" ) ; var s = cp . style ; s . position = "absolute" ; s . right = s . bottom = s . width = s . height = "0px" ; document . body . appendChild ( cp ) ; var br = Calendar . getAbsolutePos ( cp ) ; document . body . removeChild ( cp ) ; if ( Calendar . is _ie ) { br . y += document . body . scrollTop ; br . x += document . body . scrollLeft ; } else { br . y += window . scrollY ; br . x += window . scrollX ; }
var tmp = box . x + box . width - br . x ; if ( tmp > 0 ) box . x -= tmp ; tmp = box . y + box . height - br . y ; if ( tmp > 0 ) box . y -= tmp ; } ; this . element . style . display = "block" ; Calendar . continuation _for _the _fucking _khtml _browser = function ( ) { var w = self . element . offsetWidth ; var h = self . element . offsetHeight ; self . element . style . display = "none" ; var valign = opts . substr ( 0 , 1 ) ; var halign = "l" ; if ( opts . length > 1 ) { halign = opts . substr ( 1 , 1 ) ; }
switch ( valign ) { case "T" : p . y -= h ; break ; case "B" : p . y += el . offsetHeight ; break ; case "C" : p . y += ( el . offsetHeight - h ) / 2 ; break ; case "t" : p . y += el . offsetHeight - h ; break ; case "b" : break ; }
switch ( halign ) { case "L" : p . x -= w ; break ; case "R" : p . x += el . offsetWidth ; break ; case "C" : p . x += ( el . offsetWidth - w ) / 2 ; break ; case "l" : p . x += el . offsetWidth - w ; break ; case "r" : break ; }
p . width = w ; p . height = h + 40 ; self . monthsCombo . style . display = "none" ; fixPosition ( p ) ; self . showAt ( p . x , p . y ) ; } ; if ( Calendar . is _khtml )
setTimeout ( "Calendar.continuation_for_the_fucking_khtml_browser()" , 10 ) ; else
Calendar . continuation _for _the _fucking _khtml _browser ( ) ; } ; Calendar . prototype . setDateFormat = function ( str ) { this . dateFormat = str ; } ; Calendar . prototype . setTtDateFormat = function ( str ) { this . ttDateFormat = str ; } ; Calendar . prototype . parseDate = function ( str , fmt ) { if ( ! fmt )
fmt = this . dateFormat ; this . setDate ( Date . parseDate ( str , fmt ) ) ; } ; Calendar . prototype . hideShowCovered = function ( ) { if ( ! Calendar . is _ie && ! Calendar . is _opera )
return ; function getVisib ( obj ) { var value = obj . style . visibility ; if ( ! value ) { if ( document . defaultView && typeof ( document . defaultView . getComputedStyle ) == "function" ) { if ( ! Calendar . is _khtml )
value = document . defaultView . getComputedStyle ( obj , "" ) . getPropertyValue ( "visibility" ) ; else
value = '' ; } else if ( obj . currentStyle ) { value = obj . currentStyle . visibility ; } else
value = '' ; }
return value ; } ; var tags = new Array ( "applet" , "iframe" , "select" ) ; var el = this . element ; var p = Calendar . getAbsolutePos ( el ) ; var EX1 = p . x ; var EX2 = el . offsetWidth + EX1 ; var EY1 = p . y ; var EY2 = el . offsetHeight + EY1 ; for ( var k = tags . length ; k > 0 ; ) { var ar = document . getElementsByTagName ( tags [ -- k ] ) ; var cc = null ; for ( var i = ar . length ; i > 0 ; ) { cc = ar [ -- i ] ; p = Calendar . getAbsolutePos ( cc ) ; var CX1 = p . x ; var CX2 = cc . offsetWidth + CX1 ; var CY1 = p . y ; var CY2 = cc . offsetHeight + CY1 ; if ( this . hidden || ( CX1 > EX2 ) || ( CX2 < EX1 ) || ( CY1 > EY2 ) || ( CY2 < EY1 ) ) { if ( ! cc . _ _msh _save _visibility ) { cc . _ _msh _save _visibility = getVisib ( cc ) ; }
cc . style . visibility = cc . _ _msh _save _visibility ; } else { if ( ! cc . _ _msh _save _visibility ) { cc . _ _msh _save _visibility = getVisib ( cc ) ; }
cc . style . visibility = "hidden" ; } } } } ; Calendar . prototype . _displayWeekdays = function ( ) { var fdow = this . firstDayOfWeek ; var cell = this . firstdayname ; var weekend = Calendar . _TT [ "WEEKEND" ] ; for ( var i = 0 ; i < 7 ; ++ i ) { cell . className = "day name" ; var realday = ( i + fdow ) % 7 ; if ( i ) { cell . ttip = Calendar . _TT [ "DAY_FIRST" ] . replace ( "%s" , Calendar . _DN [ realday ] ) ; cell . navtype = 100 ; cell . calendar = this ; cell . fdow = realday ; Calendar . _add _evs ( cell ) ; }
if ( weekend . indexOf ( realday . toString ( ) ) != - 1 ) { Calendar . addClass ( cell , "weekend" ) ; }
cell . innerHTML = Calendar . _SDN [ ( i + fdow ) % 7 ] ; cell = cell . nextSibling ; } } ; Calendar . prototype . _hideCombos = function ( ) { this . monthsCombo . style . display = "none" ; this . yearsCombo . style . display = "none" ; } ; Calendar . prototype . _dragStart = function ( ev ) { if ( this . dragging ) { return ; }
this . dragging = true ; var posX ; var posY ; if ( Calendar . is _ie ) { posY = window . event . clientY + document . body . scrollTop ; posX = window . event . clientX + document . body . scrollLeft ; } else { posY = ev . clientY + window . scrollY ; posX = ev . clientX + window . scrollX ; }
var st = this . element . style ; this . xOffs = posX - parseInt ( st . left ) ; this . yOffs = posY - parseInt ( st . top ) ; with ( Calendar ) { addEvent ( document , "mousemove" , calDragIt ) ; addEvent ( document , "mouseup" , calDragEnd ) ; } } ; Date . _MD = new Array ( 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 ) ; Date . SECOND = 1000 ; Date . MINUTE = 60 * Date . SECOND ; Date . HOUR = 60 * Date . MINUTE ; Date . DAY = 24 * Date . HOUR ; Date . WEEK = 7 * Date . DAY ; Date . parseDate = function ( str , fmt ) { var today = new Date ( ) ; var y = 0 ; var m = - 1 ; var d = 0 ; var a = str . split ( /\W+/ ) ; var b = fmt . match ( /%./g ) ; var i = 0 , j = 0 ; var hr = 0 ; var min = 0 ; for ( i = 0 ; i < a . length ; ++ i ) { if ( ! a [ i ] )
continue ; switch ( b [ i ] ) { case "%d" : case "%e" : d = parseInt ( a [ i ] , 10 ) ; break ; case "%m" : m = parseInt ( a [ i ] , 10 ) - 1 ; break ; case "%Y" : case "%y" : y = parseInt ( a [ i ] , 10 ) ; ( y < 100 ) && ( y += ( y > 29 ) ? 1900 : 2000 ) ; break ; case "%b" : case "%B" : for ( j = 0 ; j < 12 ; ++ j ) { if ( Calendar . _MN [ j ] . substr ( 0 , a [ i ] . length ) . toLowerCase ( ) == a [ i ] . toLowerCase ( ) ) { m = j ; break ; } }
break ; case "%H" : case "%I" : case "%k" : case "%l" : hr = parseInt ( a [ i ] , 10 ) ; break ; case "%P" : case "%p" : if ( /pm/i . test ( a [ i ] ) && hr < 12 )
hr += 12 ; else if ( /am/i . test ( a [ i ] ) && hr >= 12 )
hr -= 12 ; break ; case "%M" : min = parseInt ( a [ i ] , 10 ) ; break ; } }
if ( isNaN ( y ) ) y = today . getFullYear ( ) ; if ( isNaN ( m ) ) m = today . getMonth ( ) ; if ( isNaN ( d ) ) d = today . getDate ( ) ; if ( isNaN ( hr ) ) hr = today . getHours ( ) ; if ( isNaN ( min ) ) min = today . getMinutes ( ) ; if ( y != 0 && m != - 1 && d != 0 )
return new Date ( y , m , d , hr , min , 0 ) ; y = 0 ; m = - 1 ; d = 0 ; for ( i = 0 ; i < a . length ; ++ i ) { if ( a [ i ] . search ( /[a-zA-Z]+/ ) != - 1 ) { var t = - 1 ; for ( j = 0 ; j < 12 ; ++ j ) { if ( Calendar . _MN [ j ] . substr ( 0 , a [ i ] . length ) . toLowerCase ( ) == a [ i ] . toLowerCase ( ) ) { t = j ; break ; } }
if ( t != - 1 ) { if ( m != - 1 ) { d = m + 1 ; }
m = t ; } } else if ( parseInt ( a [ i ] , 10 ) <= 12 && m == - 1 ) { m = a [ i ] - 1 ; } else if ( parseInt ( a [ i ] , 10 ) > 31 && y == 0 ) { y = parseInt ( a [ i ] , 10 ) ; ( y < 100 ) && ( y += ( y > 29 ) ? 1900 : 2000 ) ; } else if ( d == 0 ) { d = a [ i ] ; } }
if ( y == 0 )
y = today . getFullYear ( ) ; if ( m != - 1 && d != 0 )
return new Date ( y , m , d , hr , min , 0 ) ; return today ; } ; Date . prototype . getMonthDays = function ( month ) { var year = this . getFullYear ( ) ; if ( typeof month == "undefined" ) { month = this . getMonth ( ) ; }
if ( ( ( 0 == ( year % 4 ) ) && ( ( 0 != ( year % 100 ) ) || ( 0 == ( year % 400 ) ) ) ) && month == 1 ) { return 29 ; } else { return Date . _MD [ month ] ; } } ; Date . prototype . getDayOfYear = function ( ) { var now = new Date ( this . getFullYear ( ) , this . getMonth ( ) , this . getDate ( ) , 0 , 0 , 0 ) ; var then = new Date ( this . getFullYear ( ) , 0 , 0 , 0 , 0 , 0 ) ; var time = now - then ; return Math . floor ( time / Date . DAY ) ; } ; Date . prototype . getWeekNumber = function ( ) { var d = new Date ( this . getFullYear ( ) , this . getMonth ( ) , this . getDate ( ) , 0 , 0 , 0 ) ; var DoW = d . getDay ( ) ; d . setDate ( d . getDate ( ) - ( DoW + 6 ) % 7 + 3 ) ; var ms = d . valueOf ( ) ; d . setMonth ( 0 ) ; d . setDate ( 4 ) ; return Math . round ( ( ms - d . valueOf ( ) ) / ( 7 * 864e5 ) ) + 1 ; } ; Date . prototype . equalsTo = function ( date ) { return ( ( this . getFullYear ( ) == date . getFullYear ( ) ) && ( this . getMonth ( ) == date . getMonth ( ) ) && ( this . getDate ( ) == date . getDate ( ) ) && ( this . getHours ( ) == date . getHours ( ) ) && ( this . getMinutes ( ) == date . getMinutes ( ) ) ) ; } ; Date . prototype . setDateOnly = function ( date ) { var tmp = new Date ( date ) ; this . setDate ( 1 ) ; this . setFullYear ( tmp . getFullYear ( ) ) ; this . setMonth ( tmp . getMonth ( ) ) ; this . setDate ( tmp . getDate ( ) ) ; } ; Date . prototype . print = function ( str ) { var m = this . getMonth ( ) ; var d = this . getDate ( ) ; var y = this . getFullYear ( ) ; var wn = this . getWeekNumber ( ) ; var w = this . getDay ( ) ; var s = { } ; var hr = this . getHours ( ) ; var pm = ( hr >= 12 ) ; var ir = ( pm ) ? ( hr - 12 ) : hr ; var dy = this . getDayOfYear ( ) ; if ( ir == 0 )
ir = 12 ; var min = this . getMinutes ( ) ; var sec = this . getSeconds ( ) ; s [ "%a" ] = Calendar . _SDN [ w ] ; s [ "%A" ] = Calendar . _DN [ w ] ; s [ "%b" ] = Calendar . _SMN [ m ] ; s [ "%B" ] = Calendar . _MN [ m ] ; s [ "%C" ] = 1 + Math . floor ( y / 100 ) ; s [ "%d" ] = ( d < 10 ) ? ( "0" + d ) : d ; s [ "%e" ] = d ; s [ "%H" ] = ( hr < 10 ) ? ( "0" + hr ) : hr ; s [ "%I" ] = ( ir < 10 ) ? ( "0" + ir ) : ir ; s [ "%j" ] = ( dy < 100 ) ? ( ( dy < 10 ) ? ( "00" + dy ) : ( "0" + dy ) ) : dy ; s [ "%k" ] = hr ; s [ "%l" ] = ir ; s [ "%m" ] = ( m < 9 ) ? ( "0" + ( 1 + m ) ) : ( 1 + m ) ; s [ "%M" ] = ( min < 10 ) ? ( "0" + min ) : min ; s [ "%n" ] = "\n" ; s [ "%p" ] = pm ? "PM" : "AM" ; s [ "%P" ] = pm ? "pm" : "am" ; s [ "%s" ] = Math . floor ( this . getTime ( ) / 1000 ) ; s [ "%S" ] = ( sec < 10 ) ? ( "0" + sec ) : sec ; s [ "%t" ] = "\t" ; s [ "%U" ] = s [ "%W" ] = s [ "%V" ] = ( wn < 10 ) ? ( "0" + wn ) : wn ; s [ "%u" ] = w + 1 ; s [ "%w" ] = w ; s [ "%y" ] = ( '' + y ) . substr ( 2 , 2 ) ; s [ "%Y" ] = y ; s [ "%%" ] = "%" ; var re = /%./g ; if ( ! Calendar . is _ie5 && ! Calendar . is _khtml )
return str . replace ( re , function ( par ) { return s [ par ] || par ; } ) ; var a = str . match ( re ) ; for ( var i = 0 ; i < a . length ; i ++ ) { var tmp = s [ a [ i ] ] ; if ( tmp ) { re = new RegExp ( a [ i ] , 'g' ) ; str = str . replace ( re , tmp ) ; } }
return str ; } ; Date . prototype . _ _msh _oldSetFullYear = Date . prototype . setFullYear ; Date . prototype . setFullYear = function ( y ) { var d = new Date ( this ) ; d . _ _msh _oldSetFullYear ( y ) ; if ( d . getMonth ( ) != this . getMonth ( ) )
this . setDate ( 28 ) ; this . _ _msh _oldSetFullYear ( y ) ; } ; window . _dynarch _popupCalendar = null ; Calendar . _DN = new Array
( "Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" , "Sunday" ) ; Calendar . _SDN = new Array
( "Sun" , "Mon" , "Tue" , "Wed" , "Thu" , "Fri" , "Sat" , "Sun" ) ; Calendar . _FD = 0 ; Calendar . _MN = new Array
( "January" , "February" , "March" , "April" , "May" , "June" , "July" , "August" , "September" , "October" , "November" , "December" ) ; Calendar . _SMN = new Array
( "Jan" , "Feb" , "Mar" , "Apr" , "May" , "Jun" , "Jul" , "Aug" , "Sep" , "Oct" , "Nov" , "Dec" ) ; Calendar . _TT = { } ; Calendar . _TT [ "INFO" ] = "About the calendar" ; Calendar . _TT [ "ABOUT" ] = "DHTML Date/Time Selector\n" + "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + "For latest version visit: http://www.dynarch.com/projects/calendar/\n" + "Distributed under GNU LGPL. See http://gnu.org/licenses/lgpl.html for details." + "\n\n" + "Date selection:\n" + "- Use the \xab, \xbb buttons to select year\n" + "- Use the " + String . fromCharCode ( 0x2039 ) + ", " + String . fromCharCode ( 0x203a ) + " buttons to select month\n" + "- Hold mouse button on any of the above buttons for faster selection." ; Calendar . _TT [ "ABOUT_TIME" ] = "\n\n" + "Time selection:\n" + "- Click on any of the time parts to increase it\n" + "- or Shift-click to decrease it\n" + "- or click and drag for faster selection." ; Calendar . _TT [ "PREV_YEAR" ] = "Prev. year (hold for menu)" ; Calendar . _TT [ "PREV_MONTH" ] = "Prev. month (hold for menu)" ; Calendar . _TT [ "GO_TODAY" ] = "Go Today" ; Calendar . _TT [ "NEXT_MONTH" ] = "Next month (hold for menu)" ; Calendar . _TT [ "NEXT_YEAR" ] = "Next year (hold for menu)" ; Calendar . _TT [ "SEL_DATE" ] = "Select date" ; Calendar . _TT [ "DRAG_TO_MOVE" ] = "Drag to move" ; Calendar . _TT [ "PART_TODAY" ] = " (today)" ; Calendar . _TT [ "DAY_FIRST" ] = "Display %s first" ; Calendar . _TT [ "WEEKEND" ] = "0,6" ; Calendar . _TT [ "CLOSE" ] = "Close" ; Calendar . _TT [ "TODAY" ] = "Today" ; Calendar . _TT [ "TIME_PART" ] = "(Shift-)Click or drag to change value" ; Calendar . _TT [ "DEF_DATE_FORMAT" ] = "%Y-%m-%d" ; Calendar . _TT [ "TT_DATE_FORMAT" ] = "%a, %b %e" ; Calendar . _TT [ "WK" ] = "wk" ; Calendar . _TT [ "TIME" ] = "Time:" ; Calendar . setup = function ( params ) { function param _default ( pname , def ) { if ( typeof params [ pname ] == "undefined" ) { params [ pname ] = def ; } } ; param _default ( "inputField" , null ) ; param _default ( "displayArea" , null ) ; param _default ( "button" , null ) ; param _default ( "eventName" , "click" ) ; param _default ( "ifFormat" , "%Y/%m/%d" ) ; param _default ( "daFormat" , "%Y/%m/%d" ) ; param _default ( "singleClick" , true ) ; param _default ( "disableFunc" , null ) ; param _default ( "dateStatusFunc" , params [ "disableFunc" ] ) ; param _default ( "dateText" , null ) ; param _default ( "firstDay" , null ) ; param _default ( "align" , "Br" ) ; param _default ( "range" , [ 1900 , 2999 ] ) ; param _default ( "weekNumbers" , true ) ; param _default ( "flat" , null ) ; param _default ( "flatCallback" , null ) ; param _default ( "onSelect" , null ) ; param _default ( "onClose" , null ) ; param _default ( "onUpdate" , null ) ; param _default ( "date" , null ) ; param _default ( "showsTime" , false ) ; param _default ( "timeFormat" , "24" ) ; param _default ( "electric" , true ) ; param _default ( "step" , 2 ) ; param _default ( "position" , null ) ; param _default ( "cache" , false ) ; param _default ( "showOthers" , false ) ; param _default ( "multiple" , null ) ; var tmp = [ "inputField" , "displayArea" , "button" ] ; for ( var i in tmp ) { if ( typeof params [ tmp [ i ] ] == "string" ) { params [ tmp [ i ] ] = document . getElementById ( params [ tmp [ i ] ] ) ; } }
if ( ! ( params . flat || params . multiple || params . inputField || params . displayArea || params . button ) ) { alert ( "Calendar.setup:\n Nothing to setup (no fields found). Please check your code" ) ; return false ; }
function onSelect ( cal ) { var p = cal . params ; var update = ( cal . dateClicked || p . electric ) ; if ( update && p . inputField ) { p . inputField . value = cal . date . print ( p . ifFormat ) ; if ( typeof p . inputField . onchange == "function" )
p . inputField . onchange ( ) ; }
if ( update && p . displayArea )
p . displayArea . innerHTML = cal . date . print ( p . daFormat ) ; if ( update && typeof p . onUpdate == "function" )
p . onUpdate ( cal ) ; if ( update && p . flat ) { if ( typeof p . flatCallback == "function" )
p . flatCallback ( cal ) ; }
if ( update && p . singleClick && cal . dateClicked )
cal . callCloseHandler ( ) ; } ; if ( params . flat != null ) { if ( typeof params . flat == "string" )
params . flat = document . getElementById ( params . flat ) ; if ( ! params . flat ) { alert ( "Calendar.setup:\n Flat specified but can't find parent." ) ; return false ; }
var cal = new Calendar ( params . firstDay , params . date , params . onSelect || onSelect ) ; cal . showsOtherMonths = params . showOthers ; cal . showsTime = params . showsTime ; cal . time24 = ( params . timeFormat == "24" ) ; cal . params = params ; cal . weekNumbers = params . weekNumbers ; cal . setRange ( params . range [ 0 ] , params . range [ 1 ] ) ; cal . setDateStatusHandler ( params . dateStatusFunc ) ; cal . getDateText = params . dateText ; if ( params . ifFormat ) { cal . setDateFormat ( params . ifFormat ) ; }
if ( params . inputField && typeof params . inputField . value == "string" ) { cal . parseDate ( params . inputField . value ) ; }
cal . create ( params . flat ) ; cal . show ( ) ; return false ; }
var triggerEl = params . button || params . displayArea || params . inputField ; triggerEl [ "on" + params . eventName ] = function ( ) { var dateEl = params . inputField || params . displayArea ; var dateFmt = params . inputField ? params . ifFormat : params . daFormat ; var mustCreate = false ; var cal = window . calendar ; if ( dateEl )
params . date = Date . parseDate ( dateEl . value || dateEl . innerHTML , dateFmt ) ; if ( ! ( cal && params . cache ) ) { window . calendar = cal = new Calendar ( params . firstDay , params . date , params . onSelect || onSelect , params . onClose || function ( cal ) { cal . hide ( ) ; } ) ; cal . showsTime = params . showsTime ; cal . time24 = ( params . timeFormat == "24" ) ; cal . weekNumbers = params . weekNumbers ; mustCreate = true ; } else { if ( params . date )
cal . setDate ( params . date ) ; cal . hide ( ) ; }
if ( params . multiple ) { cal . multiple = { } ; for ( var i = params . multiple . length ; -- i >= 0 ; ) { var d = params . multiple [ i ] ; var ds = d . print ( "%Y%m%d" ) ; cal . multiple [ ds ] = d ; } }
cal . showsOtherMonths = params . showOthers ; cal . yearStep = params . step ; cal . setRange ( params . range [ 0 ] , params . range [ 1 ] ) ; cal . params = params ; cal . setDateStatusHandler ( params . dateStatusFunc ) ; cal . getDateText = params . dateText ; cal . setDateFormat ( dateFmt ) ; if ( mustCreate )
cal . create ( ) ; cal . refresh ( ) ; if ( ! params . position )
cal . showAtElement ( params . button || params . displayArea || params . inputField , params . align ) ; else
cal . showAt ( params . position [ 0 ] , params . position [ 1 ] ) ; return false ; } ; if ( params . inputField ) { new DateDueKeyboardShortcutSupport ( params . inputField , params . ifFormat , cal ) ; }
return cal ; } ; DateDueKeyboardShortcutSupport = Class . create ( ) ; DateDueKeyboardShortcutSupport . prototype = { initialize : function ( element , dateFormat ) { this . element = $ ( element ) ; this . dateFormat = dateFormat || "%Y/%m/%d" ; Event . observe ( this . element , 'keypress' , this . onkeypress . bindAsEventListener ( this ) ) ; title = this . element . getAttributeNode ( "title" ) ; tooltip = 'Shortcuts: (t) today; (-) or (<) previous day; (+) or (>) next day; ([) previous week; (]) next week; ({) previous month; (}) next month; Click to show calendar' ; if ( title && title . value )
{ this . element . setAttribute ( "title" , title . value + ' (' + tooltip + ')' ) ; }
else
{ this . element . setAttribute ( "title" , tooltip ) ; } } , onkeypress : function ( event ) { handled = true ; switch ( this . getCharFromKeyPressEvent ( event ) ) { case "t" : this . setTextBoxToTodaysDate ( ) ; break ; case "+" : case ">" : case "=" : this . setTextBoxToNextDay ( ) ; break ; case "-" : case "<" : this . setTextBoxToPreviousDay ( ) ; break ; case "[" : this . setTextBoxToPreviousWeek ( ) ; break ; case "]" : this . setTextBoxToNextWeek ( ) ; break ; case "{" : this . setTextBoxToPreviousMonth ( ) ; break ; case "}" : this . setTextBoxToNextMonth ( ) ; break ; default : handled = false ; break ; }
if ( handled ) { this . cancel ( event ) ; } } , setTextBoxToChronicDate : function ( ) { today = new Date ( ) ; this . setDate ( today ) ; } , setTextBoxToTodaysDate : function ( ) { today = new Date ( ) ; this . setDate ( today ) ; } , setTextBoxToNextDay : function ( ) { this . addDaysToTextBoxDate ( 1 ) ; } , setTextBoxToPreviousDay : function ( ) { this . addDaysToTextBoxDate ( - 1 ) ; } , setTextBoxToNextWeek : function ( ) { this . addDaysToTextBoxDate ( 7 ) ; } , setTextBoxToPreviousWeek : function ( ) { this . addDaysToTextBoxDate ( - 7 ) ; } , addDaysToTextBoxDate : function ( numDays ) { date = Date . parseDate ( this . element . value , this . dateFormat ) ; date . setDate ( date . getDate ( ) + numDays ) ; this . setDate ( date ) ; } , setTextBoxToNextMonth : function ( ) { date = Date . parseDate ( this . element . value , this . dateFormat ) ; date . setMonth ( date . getMonth ( ) + 1 ) ; this . setDate ( date ) ; } , setTextBoxToPreviousMonth : function ( ) { date = Date . parseDate ( this . element . value , this . dateFormat ) ; date . setMonth ( date . getMonth ( ) - 1 ) ; this . setDate ( date ) ; } , setDate : function ( date ) { this . element . value = date . print ( this . dateFormat ) ; if ( window . calendar ) { window . calendar . setDate ( date ) ; } } , cancel : function ( event ) { if ( event . preventDefault ) { event . preventDefault ( ) ; }
event . returnValue = false ; } , getCharFromKeyPressEvent : function ( event ) { var charCode = ( event . charCode ) ? event . charCode : ( ( event . keyCode ) ? event . keyCode : ( ( event . which ) ? event . which : 0 ) ) ; return String . fromCharCode ( charCode ) ; } } ; var accessKeyHintsAdder = { run : function ( ) { var elemTypes = new Array ( 'a' , 'area' , 'button' , 'input' , 'label' , 'legend' , 'textarea' ) ; for ( var i = 0 ; i < elemTypes . length ; i ++ )
{ this . addHint ( document . getElementsByTagName ( elemTypes [ i ] ) ) ; } } , addHint : function ( elems ) { var elem ; var i = 0 ; processElements : while ( elem = elems . item ( i ++ ) )
{ var accessKey = elem . getAttributeNode ( "accesskey" ) ; if ( ! accessKey || ! accessKey . value )
continue processElements ; var title = elem . getAttributeNode ( "title" ) ; if ( title && title . value )
{ var overrides = new Array ( 'accesskey' , 'alt+' , 'ctrl+' ) ; for ( var j = 0 ; j < overrides . length ; j ++ )
{ if ( title . value . toLowerCase ( ) . indexOf ( overrides [ j ] ) != - 1 )
continue processElements ; }
elem . setAttribute ( "title" , title . value + ' (' + this . getHintText ( accessKey . value ) + ')' ) ; }
else
{ elem . setAttribute ( "title" , this . getHintText ( accessKey . value ) ) ; } } } , getHintText : function ( accessKey ) { return this . getModifier ( ) + '+' + accessKey . toUpperCase ( ) ; } , getModifier : function ( ) { var ua = navigator . userAgent . toLowerCase ( ) ; if ( ua . indexOf ( 'mac' ) == - 1 )
return 'Alt' ; else
return 'Ctrl' ; } }
Event . observe ( window , "load" , accessKeyHintsAdder . run . bindAsEventListener ( accessKeyHintsAdder ) ) ; ToDoItems = Class . create ( ) ; ToDoItems . prototype = { initialize : function ( )
{ this . lastEffect = null ; this . initialized = true ; this . contextCollapseCookieManager = new CookieManager ( ) ; this . toggleItemsMap = { } ; this . toggleContainerMap = { } ; this . containerItemsMap = { } ; } , addNextActionListingToggles : function ( )
{ this . containerToggles = $$ ( '.container_toggle' ) ; containerTogglesClick = this . toggleNextActionListing . bindAsEventListener ( this ) ; for ( i = 0 ; i < this . containerToggles . length ; i ++ )
{ toggleElem = this . containerToggles [ i ] ; containerElem = toggleElem . parentNode . parentNode
2008-06-06 19:37:07 +00:00
itemsElem = $ ( containerElem . id ) . select ( "div#" + containerElem . id + "items" ) [ 0 ] ; this . toggleContainerMap [ toggleElem . id ] = containerElem ; this . toggleItemsMap [ toggleElem . id ] = itemsElem ; this . containerItemsMap [ containerElem . id ] = itemsElem ; }
2008-06-06 15:37:22 +00:00
this . setNextActionListingTogglesToCookiedState ( ) ; } , setNextActionListingTogglesToCookiedState : function ( )
{ for ( i = 0 ; i < this . containerToggles . length ; i ++ )
{ toggleElem = this . containerToggles [ i ] ; containerElem = this . toggleContainerMap [ toggleElem . id ] ; collapsedCookie = this . contextCollapseCookieManager . getCookie ( this . buildCookieName ( containerElem ) ) ; itemsElem = this . toggleItemsMap [ toggleElem . id ] ; isExpanded = Element . visible ( itemsElem ) ; if ( collapsedCookie && isExpanded )
{ this . collapseNextActionListing ( toggleElem , itemsElem ) ; }
else if ( ! collapsedCookie && ! isExpanded )
{ this . expandNextActionListing ( toggleElem , itemsElem ) ; } } } , collapseAllNextActionListing : function ( except )
{ for ( i = 0 ; i < this . containerToggles . length ; i ++ )
{ toggleElem = this . containerToggles [ i ] ; if ( toggleElem != except )
{ itemsElem = this . toggleItemsMap [ toggleElem . id ] ; isExpanded = Element . visible ( itemsElem ) ; if ( isExpanded )
{ this . collapseNextActionListing ( toggleElem , itemsElem ) ; } } } } , ensureVisibleWithEffectAppear : function ( elemId )
{ if ( $ ( elemId ) . style . display == 'none' )
{ new Effect . Appear ( elemId , { duration : 0.4 } ) ; } } , fadeAndRemoveItem : function ( itemContainerElemId )
{ var fadingElemId = itemContainerElemId + '-fading' ; $ ( itemContainerElemId ) . setAttribute ( 'id' , fadingElemId ) ; Element . removeClassName ( $ ( fadingElemId ) , 'item-container' ) ; new Effect . Fade ( fadingElemId , { afterFinish : function ( effect ) { Element . remove ( fadingElemId ) ; } , duration : 0.4 } ) ; } , toggleNextActionListing : function ( event )
{ Event . stop ( event ) ; toggleElem = Event . element ( event ) . parentNode ; itemsElem = this . toggleItemsMap [ toggleElem . id ] ; containerElem = this . toggleContainerMap [ toggleElem . id ] ; if ( Element . visible ( itemsElem ) )
{ this . collapseNextActionListing ( toggleElem , itemsElem ) ; this . contextCollapseCookieManager . setCookie ( this . buildCookieName ( containerElem ) , true ) }
else
{ this . expandNextActionListing ( toggleElem , itemsElem ) ; this . contextCollapseCookieManager . clearCookie ( this . buildCookieName ( containerElem ) ) } } , findToggleElemForContext : function ( contextElem )
{ childElems = $A ( $ ( contextElem ) . getElementsByTagName ( 'a' ) ) ; return childElems . detect ( function ( childElem ) { return childElem . className == 'container_toggle' } ) ; } , expandNextActionListing : function ( toggleElem , itemsElem , skipAnimation )
{ itemsElem = $ ( itemsElem )
if ( skipAnimation == true ) { itemsElem . style . display = 'block' ; }
else
{ this . lastEffect = Effect . BlindDown ( itemsElem , { duration : 0.4 } ) ; }
toggleElem . setAttribute ( 'title' , 'Collapse' ) ; imgElem = this . findToggleImgElem ( toggleElem ) ; imgElem . src = imgElem . src . replace ( 'expand' , 'collapse' ) ; imgElem . setAttribute ( 'title' , 'Collapse' ) ; } , ensureContainerHeight : function ( itemsElem )
{ itemsElem = $ ( itemsElem ) ; Element . setStyle ( itemsElem , { height : '' } ) ; Element . setStyle ( itemsElem , { overflow : '' } ) ; } , expandNextActionListingByContext : function ( itemsElem , skipAnimation )
{ contextElem = this . findNearestParentByClassName ( $ ( itemsElem ) , "context" ) ; toggleElem = this . findToggleElemForContext ( contextElem ) ; this . expandNextActionListing ( toggleElem , itemsElem , skipAnimation ) ; } , collapseNextActionListing : function ( toggleElem , itemsElem )
{ this . lastEffect = Effect . BlindUp ( itemsElem , { duration : 0.4 } ) ; toggleElem . setAttribute ( 'title' , 'Expand' ) ; imgElem = this . findToggleImgElem ( toggleElem ) ; imgElem . src = imgElem . src . replace ( 'collapse' , 'expand' ) ; imgElem . setAttribute ( 'title' , 'Expand' ) ; } , findToggleImgElem : function ( toggleElem )
{ childImgElems = $A ( toggleElem . getElementsByTagName ( 'img' ) ) ; return childImgElems [ 0 ] ; } , buildCookieName : function ( containerElem )
{ tracks _login = this . contextCollapseCookieManager . getCookie ( 'tracks_login' ) ; return 'tracks_' + tracks _login + '_context_' + containerElem . id + '_collapsed' ; } , findNearestParentByClassName : function ( elem , parentClassName )
{ var parentElem = elem . parentNode ; while ( parentElem )
{ if ( Element . hasClassName ( parentElem , parentClassName ) )
{ return parentElem ; }
parentElem = parentElem . parentNode ; }
return null ; } }
todoItems = new ToDoItems ( ) ; Event . observe ( window , "load" , todoItems . addNextActionListingToggles . bindAsEventListener ( todoItems ) ) ; var niftyOk = ( document . getElementById && document . createElement && Array . prototype . push ) ; String . prototype . find = function ( what ) { return ( this . indexOf ( what ) >= 0 ? true : false ) ; }
var oldonload = window . onload ; if ( typeof ( NiftyLoad ) != 'function' ) NiftyLoad = function ( ) { } ; if ( typeof ( oldonload ) == 'function' )
window . onload = function ( ) { oldonload ( ) ; NiftyLoad ( ) } ; else window . onload = function ( ) { NiftyLoad ( ) } ; function Nifty ( selector , options ) { if ( niftyOk == false ) return ; var i , v = selector . split ( "," ) , h = 0 ; if ( options == null ) options = "" ; if ( options . find ( "fixed-height" ) )
h = getElementsBySelector ( v [ 0 ] ) [ 0 ] . offsetHeight ; for ( i = 0 ; i < v . length ; i ++ )
Rounded ( v [ i ] , options ) ; if ( options . find ( "height" ) ) SameHeight ( selector , h ) ; }
function Rounded ( selector , options ) { var i , top = "" , bottom = "" , v = new Array ( ) ; if ( options != "" ) { options = options . replace ( "left" , "tl bl" ) ; options = options . replace ( "right" , "tr br" ) ; options = options . replace ( "top" , "tr tl" ) ; options = options . replace ( "bottom" , "br bl" ) ; options = options . replace ( "transparent" , "alias" ) ; if ( options . find ( "tl" ) ) { top = "both" ; if ( ! options . find ( "tr" ) ) top = "left" ; }
else if ( options . find ( "tr" ) ) top = "right" ; if ( options . find ( "bl" ) ) { bottom = "both" ; if ( ! options . find ( "br" ) ) bottom = "left" ; }
else if ( options . find ( "br" ) ) bottom = "right" ; }
if ( top == "" && bottom == "" && ! options . find ( "none" ) ) { top = "both" ; bottom = "both" ; }
v = getElementsBySelector ( selector ) ; for ( i = 0 ; i < v . length ; i ++ ) { FixIE ( v [ i ] ) ; if ( top != "" ) AddTop ( v [ i ] , top , options ) ; if ( bottom != "" ) AddBottom ( v [ i ] , bottom , options ) ; } }
function AddTop ( el , side , options ) { var d = CreateEl ( "b" ) , lim = 4 , border = "" , p , i , btype = "r" , bk , color ; d . style . marginLeft = "-" + getPadding ( el , "Left" ) + "px" ; d . style . marginRight = "-" + getPadding ( el , "Right" ) + "px" ; if ( options . find ( "alias" ) || ( color = getBk ( el ) ) == "transparent" ) { color = "transparent" ; bk = "transparent" ; border = getParentBk ( el ) ; btype = "t" ; }
else { bk = getParentBk ( el ) ; border = Mix ( color , bk ) ; }
d . style . background = bk ; d . className = "niftycorners" ; p = getPadding ( el , "Top" ) ; if ( options . find ( "small" ) ) { d . style . marginBottom = ( p - 2 ) + "px" ; btype += "s" ; lim = 2 ; }
else if ( options . find ( "big" ) ) { d . style . marginBottom = ( p - 10 ) + "px" ; btype += "b" ; lim = 8 ; }
else d . style . marginBottom = ( p - 5 ) + "px" ; for ( i = 1 ; i <= lim ; i ++ )
d . appendChild ( CreateStrip ( i , side , color , border , btype ) ) ; el . style . paddingTop = "0" ; el . insertBefore ( d , el . firstChild ) ; }
function AddBottom ( el , side , options ) { var d = CreateEl ( "b" ) , lim = 4 , border = "" , p , i , btype = "r" , bk , color ; d . style . marginLeft = "-" + getPadding ( el , "Left" ) + "px" ; d . style . marginRight = "-" + getPadding ( el , "Right" ) + "px" ; if ( options . find ( "alias" ) || ( color = getBk ( el ) ) == "transparent" ) { color = "transparent" ; bk = "transparent" ; border = getParentBk ( el ) ; btype = "t" ; }
else { bk = getParentBk ( el ) ; border = Mix ( color , bk ) ; }
d . style . background = bk ; d . className = "niftycorners" ; p = getPadding ( el , "Bottom" ) ; if ( options . find ( "small" ) ) { d . style . marginTop = ( p - 2 ) + "px" ; btype += "s" ; lim = 2 ; }
else if ( options . find ( "big" ) ) { d . style . marginTop = ( p - 10 ) + "px" ; btype += "b" ; lim = 8 ; }
else d . style . marginTop = ( p - 5 ) + "px" ; for ( i = lim ; i > 0 ; i -- )
d . appendChild ( CreateStrip ( i , side , color , border , btype ) ) ; el . style . paddingBottom = 0 ; el . appendChild ( d ) ; }
function CreateStrip ( index , side , color , border , btype ) { var x = CreateEl ( "b" ) ; x . className = btype + index ; x . style . backgroundColor = color ; x . style . borderColor = border ; if ( side == "left" ) { x . style . borderRightWidth = "0" ; x . style . marginRight = "0" ; }
else if ( side == "right" ) { x . style . borderLeftWidth = "0" ; x . style . marginLeft = "0" ; }
return ( x ) ; }
function CreateEl ( x ) { return ( document . createElement ( x ) ) ; }
function FixIE ( el ) { if ( el . currentStyle != null && el . currentStyle . hasLayout != null && el . currentStyle . hasLayout == false )
el . style . display = "inline-block" ; }
function SameHeight ( selector , maxh ) { var i , v = selector . split ( "," ) , t , j , els = [ ] , gap ; for ( i = 0 ; i < v . length ; i ++ ) { t = getElementsBySelector ( v [ i ] ) ; els = els . concat ( t ) ; }
for ( i = 0 ; i < els . length ; i ++ ) { if ( els [ i ] . offsetHeight > maxh ) maxh = els [ i ] . offsetHeight ; els [ i ] . style . height = "auto" ; }
for ( i = 0 ; i < els . length ; i ++ ) { gap = maxh - els [ i ] . offsetHeight ; if ( gap > 0 ) { t = CreateEl ( "b" ) ; t . className = "niftyfill" ; t . style . height = gap + "px" ; nc = els [ i ] . lastChild ; if ( nc . className == "niftycorners" )
els [ i ] . insertBefore ( t , nc ) ; else els [ i ] . appendChild ( t ) ; } } }
function getElementsBySelector ( selector ) { var i , j , selid = "" , selclass = "" , tag = selector , tag2 = "" , v2 , k , f , a , s = [ ] , objlist = [ ] , c ; if ( selector . find ( "#" ) ) { if ( selector . find ( " " ) ) { s = selector . split ( " " ) ; var fs = s [ 0 ] . split ( "#" ) ; if ( fs . length == 1 ) return ( objlist ) ; f = document . getElementById ( fs [ 1 ] ) ; if ( f ) { v = f . getElementsByTagName ( s [ 1 ] ) ; for ( i = 0 ; i < v . length ; i ++ ) objlist . push ( v [ i ] ) ; }
return ( objlist ) ; }
else { s = selector . split ( "#" ) ; tag = s [ 0 ] ; selid = s [ 1 ] ; if ( selid != "" ) { f = document . getElementById ( selid ) ; if ( f ) objlist . push ( f ) ; return ( objlist ) ; } } }
if ( selector . find ( "." ) ) { s = selector . split ( "." ) ; tag = s [ 0 ] ; selclass = s [ 1 ] ; if ( selclass . find ( " " ) ) { s = selclass . split ( " " ) ; selclass = s [ 0 ] ; tag2 = s [ 1 ] ; } }
var v = document . getElementsByTagName ( tag ) ; if ( selclass == "" ) { for ( i = 0 ; i < v . length ; i ++ ) objlist . push ( v [ i ] ) ; return ( objlist ) ; }
for ( i = 0 ; i < v . length ; i ++ ) { c = v [ i ] . className . split ( " " ) ; for ( j = 0 ; j < c . length ; j ++ ) { if ( c [ j ] == selclass ) { if ( tag2 == "" ) objlist . push ( v [ i ] ) ; else { v2 = v [ i ] . getElementsByTagName ( tag2 ) ; for ( k = 0 ; k < v2 . length ; k ++ ) objlist . push ( v2 [ k ] ) ; } } } }
return ( objlist ) ; }
function getParentBk ( x ) { var el = x . parentNode , c ; while ( el . tagName . toUpperCase ( ) != "HTML" && ( c = getBk ( el ) ) == "transparent" )
el = el . parentNode ; if ( c == "transparent" ) c = "#FFFFFF" ; return ( c ) ; }
function getBk ( x ) { var c = getStyleProp ( x , "backgroundColor" ) ; if ( c == null || c == "transparent" || c . find ( "rgba(0, 0, 0, 0)" ) )
return ( "transparent" ) ; if ( c . find ( "rgb" ) ) c = rgb2hex ( c ) ; return ( c ) ; }
function getPadding ( x , side ) { var p = getStyleProp ( x , "padding" + side ) ; if ( p == null || ! p . find ( "px" ) ) return ( 0 ) ; return ( parseInt ( p ) ) ; }
function getStyleProp ( x , prop ) { if ( x . currentStyle )
return ( x . currentStyle [ prop ] ) ; if ( document . defaultView . getComputedStyle )
return ( document . defaultView . getComputedStyle ( x , '' ) [ prop ] ) ; return ( null ) ; }
function rgb2hex ( value ) { var hex = "" , v , h , i ; var regexp = /([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/ ; var h = regexp . exec ( value ) ; for ( i = 1 ; i < 4 ; i ++ ) { v = parseInt ( h [ i ] ) . toString ( 16 ) ; if ( v . length == 1 ) hex += "0" + v ; else hex += v ; }
return ( "#" + hex ) ; }
function Mix ( c1 , c2 ) { var i , step1 , step2 , x , y , r = new Array ( 3 ) ; if ( c1 . length == 4 ) step1 = 1 ; else step1 = 2 ; if ( c2 . length == 4 ) step2 = 1 ; else step2 = 2 ; for ( i = 0 ; i < 3 ; i ++ ) { x = parseInt ( c1 . substr ( 1 + step1 * i , step1 ) , 16 ) ; if ( step1 == 1 ) x = 16 * x + x ; y = parseInt ( c2 . substr ( 1 + step2 * i , step2 ) , 16 ) ; if ( step2 == 1 ) y = 16 * y + y ; r [ i ] = Math . floor ( ( x * 50 + y * 50 ) / 100 ) ; r [ i ] = r [ i ] . toString ( 16 ) ; if ( r [ i ] . length == 1 ) r [ i ] = "0" + r [ i ] ; }
return ( "#" + r [ 0 ] + r [ 1 ] + r [ 2 ] ) ; }
Protoload = { timeUntilShow : 250 , opacity : 0.8 , startWaiting : function ( element , className , timeUntilShow ) { if ( typeof element == 'string' )
element = document . getElementById ( element ) ; if ( className == undefined )
className = 'tracks__waiting' ; if ( timeUntilShow == undefined )
timeUntilShow = Protoload . timeUntilShow ; element . _waiting = true ; if ( ! element . _loading ) { var e = document . createElement ( 'div' ) ; ( element . offsetParent || document . body ) . appendChild ( element . _loading = e ) ; e . style . position = 'absolute' ; try { e . style . opacity = Protoload . opacity ; } catch ( e ) { }
try { e . style . MozOpacity = Protoload . opacity ; } catch ( e ) { }
try { e . style . filter = 'alpha(opacity=' + Math . round ( Protoload . opacity * 100 ) + ')' ; } catch ( e ) { }
try { e . style . KhtmlOpacity = Protoload . opacity ; } catch ( e ) { } }
element . _loading . className = className ; window . setTimeout ( ( function ( ) { if ( this . _waiting ) { var left = this . offsetLeft , top = this . offsetTop , width = this . offsetWidth , height = this . offsetHeight , l = this . _loading ; l . style . left = left + 'px' ; l . style . top = top + 'px' ; l . style . width = width + 'px' ; l . style . height = height + 'px' ; l . style . display = 'inline' ; } } ) . bind ( element ) , timeUntilShow ) ; } , isWaiting : function ( element ) { return element . _waiting == true ; } , stopWaiting : function ( element ) { if ( element . _waiting ) { element . _waiting = false ; element . _loading . parentNode . removeChild ( element . _loading ) ; element . _loading = null ; } } } ; if ( Prototype ) { Element . addMethods ( Protoload ) ; Object . extend ( Element , Protoload ) ; }
LowPro = { } ; LowPro . Version = '0.1' ; Object . extend ( Event , { _domReady : function ( ) { if ( arguments . callee . done ) return ; arguments . callee . done = true ; if ( Event . _timer ) clearInterval ( Event . _timer ) ; Event . _readyCallbacks . each ( function ( f ) { f ( ) } ) ; Event . _readyCallbacks = null ; } , onReady : function ( f ) { if ( ! this . _readyCallbacks ) { var domReady = this . _domReady ; if ( domReady . done ) return f ( ) ; if ( document . addEventListener )
document . addEventListener ( "DOMContentLoaded" , domReady , false ) ; if ( /WebKit/i . test ( navigator . userAgent ) ) { this . _timer = setInterval ( function ( ) { if ( /loaded|complete/ . test ( document . readyState ) ) domReady ( ) ; } , 10 ) ; }
Event . observe ( window , 'load' , domReady ) ; Event . _readyCallbacks = [ ] ; }
Event . _readyCallbacks . push ( f ) ; } } ) ; if ( ! Element . addMethods )
Element . addMethods = function ( o ) { Object . extend ( Element . Methods , o ) } ; Element . addMethods ( { observe : function ( el , event , callback ) { Event . observe ( el , event , callback ) ; } , stopObserving : function ( el , event , callback ) { Event . stopObserving ( el , event , callback ) ; } } ) ; Object . extend ( Event , { observe : function ( el , type , func ) { el = $ ( el ) ; if ( ! func . $$guid ) func . $$guid = Event . _guid ++ ; if ( ! el . events ) el . events = { } ; var handlers = el . events [ type ] ; if ( ! handlers ) { handlers = el . events [ type ] = { } ; if ( el [ "on" + type ] ) { handlers [ 0 ] = el [ "on" + type ] ; } }
handlers [ func . $$guid ] = func ; el [ "on" + type ] = Event . _handleEvent ; if ( ! Event . observers ) Event . observers = [ ] ; Event . observers . push ( [ el , name , func , false ] ) ; } , stopObserving : function ( el , type , func ) { if ( el . events && el . events [ type ] ) delete el . events [ type ] [ func . $$guid ] ; } , _handleEvent : function ( e ) { var returnValue = true ; e = e || Event . _fixEvent ( window . event ) ; var handlers = this . events [ e . type ] , el = $ ( this ) ; for ( var i in handlers ) { el . $$handleEvent = handlers [ i ] ; if ( el . $$handleEvent ( e ) === false ) returnValue = false ; }
return returnValue ; } , _fixEvent : function ( e ) { e . preventDefault = Event . _preventDefault ; e . stopPropagation = Event . _stopPropagation ; return e ; } , _preventDefault : function ( ) { this . returnValue = false } , _stopPropagation : function ( ) { this . cancelBubble = true } , _guid : 1 } ) ; Object . extend ( Event , { trigger : function ( element , event , fakeEvent ) { element = $ ( element ) ; fakeEvent = fakeEvent || { type : event } ; this . observers . each ( function ( cache ) { if ( cache [ 0 ] == element && cache [ 1 ] == event )
cache [ 2 ] . call ( element , fakeEvent ) ; } ) ; } } ) ; Event . addBehavior = function ( rules ) { var ab = this . addBehavior ; Object . extend ( ab . rules , rules ) ; if ( ab . autoTrigger ) { this . onReady ( ab . load . bind ( ab ) ) ; }
Ajax . Responders . register ( { onComplete : function ( ) { if ( Event . addBehavior . reassignAfterAjax )
setTimeout ( function ( ) { ab . load ( ) } , 10 ) ; } } ) ; } ; Object . extend ( Event . addBehavior , { rules : { } , cache : [ ] , reassignAfterAjax : true , autoTrigger : true , load : function ( ) { this . unload ( ) ; for ( var selector in this . rules ) { var observer = this . rules [ selector ] ; var sels = selector . split ( ',' ) ; sels . each ( function ( sel ) { var parts = sel . split ( /:(?=[a-z]+$)/ ) , css = parts [ 0 ] , event = parts [ 1 ] ; $$ ( css ) . each ( function ( element ) { if ( event ) { $ ( element ) . observe ( event , observer ) ; Event . addBehavior . cache . push ( [ element , event , observer ] ) ; } else { if ( ! element . $$assigned || ! element . $$assigned . include ( observer ) ) { if ( observer . attach ) observer . attach ( element ) ; else observer . call ( $ ( element ) ) ; element . $$assigned = element . $$assigned || [ ] ; element . $$assigned . push ( observer ) ; } } } ) ; } ) ; } } , unload : function ( ) { this . cache . each ( function ( c ) { Event . stopObserving . apply ( Event , c ) ; } ) ; } } ) ; Event . observe ( window , 'unload' , Event . addBehavior . unload . bind ( Event . addBehavior ) ) ; Behavior = { create : function ( members ) { var behavior = Class . create ( ) ; behavior . prototype . initialize = Prototype . K ; Object . extend ( behavior . prototype , members ) ; Object . extend ( behavior , Behavior . ClassMethods ) ; return behavior ; } , ClassMethods : { attach : function ( element ) { var bound = new this ; bound . element = $ ( element ) ; this . _bindEvents ( bound ) ; return bound ; } , _bindEvents : function ( bound ) { for ( var member in bound )
if ( member . match ( /^on(.+)/ ) && typeof bound [ member ] == 'function' )
bound . element . observe ( RegExp . $1 , bound [ member ] . bindAsEventListener ( bound ) ) ; } } } ; LowPro . SelectorLite = Class . create ( ) ; LowPro . SelectorLite . prototype = { initialize : function ( selectors ) { this . results = [ ] ; this . selectors = [ ] ; this . index = 0 ; for ( var i = selectors . length - 1 ; i >= 0 ; i -- ) { var params = { tag : '*' , id : null , classes : [ ] } ; var selector = selectors [ i ] ; var needle = selector . length - 1 ; do { var id = selector . lastIndexOf ( "#" ) ; var klass = selector . lastIndexOf ( "." ) ; var cursor = Math . max ( id , klass ) ; if ( cursor == - 1 ) params . tag = selector . toUpperCase ( ) ; else if ( id == - 1 || klass == cursor ) params . classes . push ( selector . substring ( klass + 1 ) )
else if ( ! params . id ) params . id = selector . substring ( id + 1 ) ; selector = selector . substring ( 0 , cursor ) ; } while ( cursor > 0 ) ; this . selectors [ i ] = params ; } } , get : function ( root ) { this . findElements ( root || document , this . index == ( this . selectors . length - 1 ) ) ; return this . results ; } , findElements : function ( parent , descendant ) { var selector = this . selectors [ this . index ] , results = [ ] , element ; if ( selector . id ) { element = $ ( selector . id ) ; if ( element && ( selector . tag == '*' || element . tagName == selector . tag ) && ( element . childOf ( parent ) ) ) { results = [ element ] ; } } else { results = $A ( parent . getElementsByTagName ( selector . tag ) ) ; }
if ( selector . classes . length == 1 ) { results = results . select ( function ( target ) { return $ ( target ) . hasClassName ( selector . classes [ 0 ] ) ; } ) ; } else if ( selector . classes . length > 1 ) { results = results . select ( function ( target ) { var klasses = $ ( target ) . classNames ( ) ; return selector . classes . all ( function ( klass ) { return klasses . include ( klass ) ; } ) ; } ) ; }
if ( descendant ) { this . results = this . results . concat ( results ) ; } else { ++ this . index ; results . each ( function ( target ) { this . findElements ( target , this . index == ( this . selectors . length - 1 ) ) ; } . bind ( this ) ) ; } } }
LowPro . $$old = $$ ; LowPro . optimize$$ = true ; function $$ ( a , b ) { if ( LowPro . optimize$$ == false || b || a . indexOf ( "[" ) >= 0 )
return LowPro . $$old . apply ( this , arguments ) ; return new LowPro . SelectorLite ( a . split ( /\s+/ ) ) . get ( ) ; }
if ( typeof deconcept == "undefined" ) { var deconcept = new Object ( ) ; } if ( typeof deconcept . util == "undefined" ) { deconcept . util = new Object ( ) ; } if ( typeof deconcept . SWFObjectUtil == "undefined" ) { deconcept . SWFObjectUtil = new Object ( ) ; } deconcept . SWFObject = function ( _1 , id , w , h , _5 , c , _7 , _8 , _9 , _a ) { if ( ! document . getElementById ) { return ; } this . DETECT _KEY = _a ? _a : "detectflash" ; this . skipDetect = deconcept . util . getRequestParameter ( this . DETECT _KEY ) ; this . params = new Object ( ) ; this . variables = new Object ( ) ; this . attributes = new Array ( ) ; if ( _1 ) { this . setAttribute ( "swf" , _1 ) ; } if ( id ) { this . setAttribute ( "id" , id ) ; } if ( w ) { this . setAttribute ( "width" , w ) ; } if ( h ) { this . setAttribute ( "height" , h ) ; } if ( _5 ) { this . setAttribute ( "version" , new deconcept . PlayerVersion ( _5 . toString ( ) . split ( "." ) ) ) ; } this . installedVer = deconcept . SWFObjectUtil . getPlayerVersion ( ) ; if ( ! window . opera && document . all && this . installedVer . major > 7 ) { deconcept . SWFObject . doPrepUnload = true ; } if ( c ) { this . addParam ( "bgcolor" , c ) ; } var q = _7 ? _7 : "high" ; this . addParam ( "quality" , q ) ; this . setAttribute ( "useExpressInstall" , false ) ; this . setAttribute ( "doExpressInstall" , false ) ; var _c = ( _8 ) ? _8 : window . location ; this . setAttribute ( "xiRedirectUrl" , _c ) ; this . setAttribute ( "redirectUrl" , "" ) ; if ( _9 ) { this . setAttribute ( "redirectUrl" , _9 ) ; } } ; deconcept . SWFObject . prototype = { useExpressInstall : function ( _d ) { this . xiSWFPath = ! _d ? "expressinstall.swf" : _d ; this . setAttribute ( "useExpressInstall" , true ) ; } , setAttribute : function ( _e , _f ) { this . attributes [ _e ] = _f ; } , getAttribute : function ( _10 ) { return this . attributes [ _10 ] ; } , addParam : function ( _11 , _12 ) { this . params [ _11 ] = _12 ; } , getParams : function ( ) { return this . params ; } , addVariable : function ( _13 , _14 ) { this . variables [ _13 ] = _14 ; } , getVariable : function ( _15 ) { return this . variables [ _15 ] ; } , getVariables : function ( ) { return this . variables ; } , getVariablePairs : function ( ) { var _16 = new Array ( ) ; var key ; var _18 = this . getVariables ( ) ; for ( key in _18 ) { _16 [ _16 . length ] = key + "=" + _18 [ key ] ; } return _16 ; } , getSWFHTML : function ( ) { var _19 = "" ; if ( navigator . plugins && navigator . mimeTypes && navigator . mimeTypes . length ) { if ( this . getAttribute ( "doExpressInstall" ) ) { this . addVariable ( "MMplayerType" , "PlugIn" ) ; this . setAttribute ( "swf" , this . xiSWFPath ) ; } _19 = "<embed type=\"application/x-shockwave-flash\" src=\"" + this . getAttribute ( "swf" ) + "\" width=\"" + this . getAttribute ( "width" ) + "\" height=\"" + this . getAttribute ( "height" ) + "\" style=\"" + this . getAttribute ( "style" ) + "\"" ; _19 += " id=\"" + this . getAttribute ( "id" ) + "\" name=\"" + this . getAttribute ( "id" ) + "\" " ; var _1a = this . getParams ( ) ; for ( var key in _1a ) { _19 += [ key ] + "=\"" + _1a [ key ] + "\" " ; } var _1c = this . getVariablePairs ( ) . join ( "&" ) ; if ( _1c . length > 0 ) { _19 += "flashvars=\"" + _1c + "\"" ; } _19 += "/>" ; } else { if ( this . getAttribute ( "doExpressInstall" ) ) { this . addVariable ( "MMplayerType" , "ActiveX" ) ; this . setAttribute ( "swf" , this . xiSWFPath ) ; } _19 = "<object id=\"" + this . getAttribute ( "id" ) + "\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"" + this . getAttribute ( "width" ) + "\" height=\"" + this . getAttribute ( "height" ) + "\" style=\"" + this . getAttribute ( "style" ) + "\">" ; _19 += "<param name=\"movie\" value=\"" + this . getAttribute ( "swf" ) + "\" />" ; var _1d = this . getParams ( ) ; for ( var key in _1d ) { _19 += "<param name=\"" + key + "\" value=\"" + _1d [ key ] + "\" />" ; } var _1f = this . getVariablePairs ( ) . join ( "&" ) ; if ( _1f . length > 0 ) { _19 += "<param name=\"flashvars\" value=\"" + _1f + "\" />" ; } _19 += "</object>" ; } return _19 ; } , write : function ( _20 ) { if ( this . getAttribute ( "useExpressInstall" ) ) { var _21 = new deconcept . PlayerVersion ( [ 6 , 0 , 65 ] ) ; if ( this . installedVer . versionIsValid ( _21 ) && ! this . installedVer . versionIsValid ( this . getAttribute ( "version" ) ) ) { this . setAttribute ( "doExpressInstall" , true ) ; this . addVariable ( "MMredirectURL" , escape ( this . getAttribute ( "xiRedirectUrl" ) ) ) ; document . title = document . title . slice ( 0 , 47 ) + " - Flash Player Installation" ; this . addVariable ( "MMdoctitle" , document . title ) ; } } if ( this . skipDetect || this . getAttribute ( "doExpressInstall" ) || this . installedVer . versionIsValid ( this . getAttribute ( "version" ) ) ) { var n = ( typeof _20 == "string" ) ? document . getElementById ( _20 ) : _20 ; n . innerHTML = this . getSWFHTML ( ) ; return true ; } else { if ( this . getAttribute ( "redirectUrl" ) != "" ) { document . location . replace ( this . getAttribute ( "redirectUrl" ) ) ; } } return false ; } } ; deconcept . SWFObjectUtil . getPlayerVe