Changeset 226 for ether_megapoli/trunk/web/resources/js
- Timestamp:
- 10/18/11 18:35:27 (13 years ago)
- Location:
- ether_megapoli/trunk/web/resources/js
- Files:
-
- 7 added
- 4 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
ether_megapoli/trunk/web/resources/js/DomHelper.js
r184 r226 1 1 /// 2 // Requires prototype2 // use jQuery 3 3 4 4 var Dom = Dom || {}; … … 286 286 287 287 }); 288 289 function disableContainer( containerId ) 290 { 291 var container = Dom.getContainer( containerId ); 292 container.addClassName( "disable" ); 293 } 294 295 function enableContainer( containerId ) 296 { 297 var container = Dom.getContainer( containerId ); 298 container.removeClassName( "disable" ); 299 } 300 -
ether_megapoli/trunk/web/resources/js/classesForJQuery/ComplexButton.js
r220 r226 3 3 // Display a button 4 4 // 5 // use jQuery 5 6 // str value: Value to display in the button 6 7 // dom parent: in which dom element to draw the button … … 12 13 13 14 var ComplexButton = Class.create( { 15 14 16 initialize: function( param ) 15 17 { … … 26 28 // Create button elements 27 29 this.divContainer = $( document.createElement( "div" ) ); 28 this.divContainer. className = "complexButton";30 this.divContainer.addClass( "complexButton" ); 29 31 this.divContainer.atMe = this; 30 32 this.divContainer.id = this.id; 31 this.divContainer.addClass Name( this.specificClass );33 this.divContainer.addClass( this.specificClass ); 32 34 if( this.parent ) 33 35 { 34 this.parent.append Child( this.divContainer );36 this.parent.append( this.divContainer ); 35 37 } 36 38 37 39 this.divLeft = $( document.createElement( "div" ) ); 38 40 if( param.classNameToAdd ) 39 this.divLeft. className = "complexButton_left_" + param.classNameToAdd;41 this.divLeft.addClass( "complexButton_left_" + param.classNameToAdd ); 40 42 else 41 this.divLeft. className = "complexButton_left";42 this.divContainer.append Child( this.divLeft );43 this.divLeft.addClass( "complexButton_left" ); 44 this.divContainer.append( this.divLeft ); 43 45 44 46 this.divMiddle = $( document.createElement( "div" ) ); 45 47 if( param.classNameToAdd ) 46 this.divMiddle. className = "complexButton_middle_" + param.classNameToAdd;48 this.divMiddle.addClass( "complexButton_middle_" + param.classNameToAdd ); 47 49 else 48 this.divMiddle. className = "complexButton_middle";49 this.divContainer.append Child( this.divMiddle );50 this.divMiddle.addClass( "complexButton_middle" ); 51 this.divContainer.append( this.divMiddle ); 50 52 51 53 this.divText = $( document.createElement( "div" ) ); 52 this.divText. className = "complexButton_text";53 this.divText. innerHTML = this.value;54 this.divMiddle.append Child( this.divText );54 this.divText.addClass( "complexButton_text" ); 55 this.divText.html( this.value ); 56 this.divMiddle.append( this.divText ); 55 57 56 58 this.divRight = $( document.createElement( "div" ) ); 57 59 if( param.classNameToAdd ) 58 this.divRight. className = "complexButton_right_" + param.classNameToAdd;60 this.divRight.addClass( "complexButton_right_" + param.classNameToAdd ); 59 61 else 60 this.divRight. className = "complexButton_right";61 this.divContainer.append Child( this.divRight );62 this.divRight.addClass( "complexButton_right" ); 63 this.divContainer.append( this.divRight ); 62 64 63 65 // Define button events 64 Event.observe( this.divContainer, 'click', this.onClick.bindAsEventListener( this ) ); 65 Event.observe( this.divContainer, 'mouseover', this.onHover.bindAsEventListener( this ) ); 66 this.divContainer.bind( 'click', this, this.onClick ); 67 // Event.observe( this.divContainer, 'click', this.onClick.bindAsEventListener( this ) ); 68 // Event.observe( this.divContainer, 'mouseover', this.onHover.bindAsEventListener( this ) ); 66 69 }, 67 70 68 71 // Actions ******************************************************** 69 72 70 appendChild : 73 appendChild :function( parent ) 71 74 { 72 75 this.parent = parent; 73 this.parent.append Child( this.divContainer );76 this.parent.append( this.divContainer ); 74 77 }, 78 75 79 setDisabled:function( value ) 76 80 { … … 84 88 } 85 89 }, 90 86 91 disable : function() 87 92 { … … 89 94 this.divContainer.addClassName( "disable" ); 90 95 }, 96 91 97 enable : function() 92 98 { … … 94 100 this.divContainer.removeClassName( "disable" ); 95 101 }, 102 96 103 setSelected : function( value ) 97 104 { … … 106 113 } 107 114 }, 115 108 116 show : function() 109 117 { … … 111 119 this.divContainer.style.display = ""; 112 120 }, 121 113 122 hide : function() 114 123 { … … 123 132 return this.divContainer; 124 133 }, 134 125 135 getDisable : function() 126 136 { 127 137 return this.boolDisabled; 128 138 }, 139 129 140 getSelect: function() 130 141 { 131 142 return this.boolSelected; 132 143 }, 144 133 145 setValue : function( value ) 134 146 { 135 147 this.value = value; 136 this.divText. innerHTML = this.value;148 this.divText.html( this.value ); 137 149 }, 150 138 151 setCallbackOnClick : function( value ) 139 152 { … … 145 158 onClick : function( event ) 146 159 { 147 if( !this.getDisable() && (undefined == event.detail || 1 == event.detail) && this.callbackOnClick ) 148 this.callbackOnClick(); 149 Event.stop( event ); 150 }, 151 152 onHover : function( event ) 153 { 154 Event.stop( event ); 160 if( !event.data.getDisable() && (undefined == event.detail || 1 == event.detail) && event.data.callbackOnClick ) 161 event.data.callbackOnClick(); 155 162 } 156 163 } ); -
ether_megapoli/trunk/web/resources/js/etherHelper.js
r194 r226 1 1 /// 2 // Requires prototype and DomHelper.js 3 4 function disableContainer( containerId ) 5 { 6 var container = Dom.getContainer( containerId ); 7 container.addClassName( "disable" ); 8 } 9 10 function enableContainer( containerId ) 11 { 12 var container = Dom.getContainer( containerId ); 13 container.removeClassName( "disable" ); 14 } 2 // Uses jquery 15 3 16 4 /** … … 33 21 } 34 22 23 /* ************************************************** */ 24 /* Based on Alex Arnell's inheritance implementation. */ 25 /* ************************************************** */ 26 //var Class = { 27 // create: function() 28 // { 29 // var parent = null, properties = $A( arguments ); 30 // if( Object.isFunction( properties[0] ) ) 31 // parent = properties.shift(); 32 // 33 // function klass() 34 // { 35 // this.initialize.apply( this, arguments ); 36 // } 37 // 38 // Object.extend( klass, Class.Methods ); 39 // klass.superclass = parent; 40 // klass.subclasses = []; 41 // 42 // if( parent ) 43 // { 44 // var subclass = function() 45 // { 46 // }; 47 // subclass.prototype = parent.prototype; 48 // klass.prototype = new subclass; 49 // parent.subclasses.push( klass ); 50 // } 51 // 52 // for( var i = 0; i < properties.length; i++ ) 53 // klass.addMethods( properties[i] ); 54 // 55 // if( !klass.prototype.initialize ) 56 // klass.prototype.initialize = Prototype.emptyFunction; 57 // 58 // klass.prototype.constructor = klass; 59 // 60 // return klass; 61 // } 62 //}; 63 // 64 //Class.Methods = { 65 // addMethods: function( source ) 66 // { 67 // var ancestor = this.superclass && this.superclass.prototype; 68 // var properties = Object.keys( source ); 69 // 70 // if( !Object.keys( { toString: true } ).length ) 71 // properties.push( "toString", "valueOf" ); 72 // 73 // for( var i = 0, length = properties.length; i < length; i++ ) 74 // { 75 // var property = properties[i], value = source[property]; 76 // if( ancestor && Object.isFunction( value ) && 77 // value.argumentNames().first() == "$super" ) 78 // { 79 // var method = value; 80 // value = (function( m ) 81 // { 82 // return function() 83 // { 84 // return ancestor[m].apply( this, arguments ) 85 // }; 86 // })( property ).wrap( method ); 87 // 88 // value.valueOf = method.valueOf.bind( method ); 89 // value.toString = method.toString.bind( method ); 90 // } 91 // this.prototype[property] = value; 92 // } 93 // 94 // return this; 95 // } 96 //}; 97 98 //var Abstract = { }; 99 // 100 //Object.extend = function( destination, source ) 101 //{ 102 // for( var property in source ) 103 // destination[property] = source[property]; 104 // return destination; 105 //}; 106 // 107 //Object.extend( Object, { 108 // inspect: function( object ) 109 // { 110 // try 111 // { 112 // if( Object.isUndefined( object ) ) return 'undefined'; 113 // if( object === null ) return 'null'; 114 // return object.inspect ? object.inspect() : String( object ); 115 // } 116 // catch ( e ) 117 // { 118 // if( e instanceof RangeError ) return '...'; 119 // throw e; 120 // } 121 // }, 122 // 123 // toJSON: function( object ) 124 // { 125 // var type = typeof object; 126 // switch( type ) 127 // { 128 // case 'undefined': 129 // case 'function': 130 // case 'unknown': return; 131 // case 'boolean': return object.toString(); 132 // } 133 // 134 // if( object === null ) return 'null'; 135 // if( object.toJSON ) return object.toJSON(); 136 // if( Object.isElement( object ) ) return; 137 // 138 // var results = []; 139 // for( var property in object ) 140 // { 141 // var value = Object.toJSON( object[property] ); 142 // if( !Object.isUndefined( value ) ) 143 // results.push( property.toJSON() + ': ' + value ); 144 // } 145 // 146 // return '{' + results.join( ', ' ) + '}'; 147 // }, 148 // 149 // toQueryString: function( object ) 150 // { 151 // return $H( object ).toQueryString(); 152 // }, 153 // 154 // toHTML: function( object ) 155 // { 156 // return object && object.toHTML ? object.toHTML() : String.interpret( object ); 157 // }, 158 // 159 // keys: function( object ) 160 // { 161 // var keys = []; 162 // for( var property in object ) 163 // keys.push( property ); 164 // return keys; 165 // }, 166 // 167 // values: function( object ) 168 // { 169 // var values = []; 170 // for( var property in object ) 171 // values.push( object[property] ); 172 // return values; 173 // }, 174 // 175 // clone: function( object ) 176 // { 177 // return Object.extend( { }, object ); 178 // }, 179 // 180 // isElement: function( object ) 181 // { 182 // return !!(object && object.nodeType == 1); 183 // }, 184 // 185 // isArray: function( object ) 186 // { 187 // return object != null && typeof object == "object" && 188 // 'splice' in object && 'join' in object; 189 // }, 190 // 191 // isHash: function( object ) 192 // { 193 // return object instanceof Hash; 194 // }, 195 // 196 // isFunction: function( object ) 197 // { 198 // return typeof object == "function"; 199 // }, 200 // 201 // isString: function( object ) 202 // { 203 // return typeof object == "string"; 204 // }, 205 // 206 // isNumber: function( object ) 207 // { 208 // return typeof object == "number"; 209 // }, 210 // 211 // isUndefined: function( object ) 212 // { 213 // return typeof object == "undefined"; 214 // } 215 //} ); 216 // 217 //Object.extend( Function.prototype, { 218 // argumentNames: function() 219 // { 220 // var names = this.toString().match( /^[\s\(]*function[^(]*\(([^\)]*)\)/ )[1] 221 // .replace( /\s+/g, '' ).split( ',' ); 222 // return names.length == 1 && !names[0] ? [] : names; 223 // }, 224 // 225 // bind: function() 226 // { 227 // if( arguments.length < 2 && Object.isUndefined( arguments[0] ) ) return this; 228 // var __method = this, args = $A( arguments ), object = args.shift(); 229 // return function() 230 // { 231 // return __method.apply( object, args.concat( $A( arguments ) ) ); 232 // } 233 // }, 234 // 235 // bindAsEventListener: function() 236 // { 237 // var __method = this, args = $A( arguments ), object = args.shift(); 238 // return function( event ) 239 // { 240 // return __method.apply( object, [event || window.event].concat( args ) ); 241 // } 242 // }, 243 // 244 // curry: function() 245 // { 246 // if( !arguments.length ) return this; 247 // var __method = this, args = $A( arguments ); 248 // return function() 249 // { 250 // return __method.apply( this, args.concat( $A( arguments ) ) ); 251 // } 252 // }, 253 // 254 // delay: function() 255 // { 256 // var __method = this, args = $A( arguments ), timeout = args.shift() * 1000; 257 // return window.setTimeout( function() 258 // { 259 // return __method.apply( __method, args ); 260 // }, timeout ); 261 // }, 262 // 263 // defer: function() 264 // { 265 // var args = [0.01].concat( $A( arguments ) ); 266 // return this.delay.apply( this, args ); 267 // }, 268 // 269 // wrap: function( wrapper ) 270 // { 271 // var __method = this; 272 // return function() 273 // { 274 // return wrapper.apply( this, [__method.bind( this )].concat( $A( arguments ) ) ); 275 // } 276 // }, 277 // 278 // methodize: function() 279 // { 280 // if( this._methodized ) return this._methodized; 281 // var __method = this; 282 // return this._methodized = function() 283 // { 284 // return __method.apply( null, [this].concat( $A( arguments ) ) ); 285 // }; 286 // } 287 //} ); -
ether_megapoli/trunk/web/resources/js/library/jquery.js
r220 r226 10 10 * Revision: 6246 11 11 */ 12 (function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}}); 13 /* 14 * Sizzle CSS Selector Engine - v0.9.3 15 * Copyright 2009, The Dojo Foundation 16 * Released under the MIT, BSD, and GPL Licenses. 17 * More information: http://sizzlejs.com/ 18 */ 19 (function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML=' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})(); 12 (function() 13 { 14 var l = this,g,y = l.jQuery,p = l.$,o = l.jQuery = l.$ = function( E, F ) 15 { 16 return new o.fn.init( E, F ) 17 },D = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f = /^.[^:#\[\.,]*$/; 18 o.fn = o.prototype = {init:function( E, H ) 19 { 20 E = E || document; 21 if( E.nodeType ) 22 { 23 this[0] = E; 24 this.length = 1; 25 this.context = E; 26 return this 27 } 28 if( typeof E === "string" ) 29 { 30 var G = D.exec( E ); 31 if( G && (G[1] || !H) ) 32 { 33 if( G[1] ) 34 { 35 E = o.clean( [G[1]], H ) 36 } 37 else 38 { 39 var I = document.getElementById( G[3] ); 40 if( I && I.id != G[3] ) 41 { 42 return o().find( E ) 43 } 44 var F = o( I || [] ); 45 F.context = document; 46 F.selector = E; 47 return F 48 } 49 } 50 else 51 { 52 return o( H ).find( E ) 53 } 54 } 55 else 56 { 57 if( o.isFunction( E ) ) 58 { 59 return o( document ).ready( E ) 60 } 61 } 62 if( E.selector && E.context ) 63 { 64 this.selector = E.selector; 65 this.context = E.context 66 } 67 return this.setArray( o.isArray( E ) ? E : o.makeArray( E ) ) 68 },selector:"",jquery:"1.3.2",size:function() 69 { 70 return this.length 71 },get:function( E ) 72 { 73 return E === g ? Array.prototype.slice.call( this ) : this[E] 74 },pushStack:function( F, H, E ) 75 { 76 var G = o( F ); 77 G.prevObject = this; 78 G.context = this.context; 79 if( H === "find" ) 80 { 81 G.selector = this.selector + (this.selector ? " " : "") + E 82 } 83 else 84 { 85 if( H ) 86 { 87 G.selector = this.selector + "." + H + "(" + E + ")" 88 } 89 } 90 return G 91 },setArray:function( E ) 92 { 93 this.length = 0; 94 Array.prototype.push.apply( this, E ); 95 return this 96 },each:function( F, E ) 97 { 98 return o.each( this, F, E ) 99 },index:function( E ) 100 { 101 return o.inArray( E && E.jquery ? E[0] : E, this ) 102 },attr:function( F, H, G ) 103 { 104 var E = F; 105 if( typeof F === "string" ) 106 { 107 if( H === g ) 108 { 109 return this[0] && o[G || "attr"]( this[0], F ) 110 } 111 else 112 { 113 E = {}; 114 E[F] = H 115 } 116 } 117 return this.each( function( I ) 118 { 119 for( F in E ) 120 { 121 o.attr( G ? this.style : this, F, o.prop( this, E[F], G, I, F ) ) 122 } 123 } ) 124 },css:function( E, F ) 125 { 126 if( (E == "width" || E == "height") && parseFloat( F ) < 0 ) 127 { 128 F = g 129 } 130 return this.attr( E, F, "curCSS" ) 131 },text:function( F ) 132 { 133 if( typeof F !== "object" && F != null ) 134 { 135 return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( F ) ) 136 } 137 var E = ""; 138 o.each( F || this, function() 139 { 140 o.each( this.childNodes, function() 141 { 142 if( this.nodeType != 8 ) 143 { 144 E += this.nodeType != 1 ? this.nodeValue : o.fn.text( [this] ) 145 } 146 } ) 147 } ); 148 return E 149 },wrapAll:function( E ) 150 { 151 if( this[0] ) 152 { 153 var F = o( E, this[0].ownerDocument ).clone(); 154 if( this[0].parentNode ) 155 { 156 F.insertBefore( this[0] ) 157 } 158 F.map( 159 function() 160 { 161 var G = this; 162 while( G.firstChild ) 163 { 164 G = G.firstChild 165 } 166 return G 167 } ).append( this ) 168 } 169 return this 170 },wrapInner:function( E ) 171 { 172 return this.each( function() 173 { 174 o( this ).contents().wrapAll( E ) 175 } ) 176 },wrap:function( E ) 177 { 178 return this.each( function() 179 { 180 o( this ).wrapAll( E ) 181 } ) 182 },append:function() 183 { 184 return this.domManip( arguments, true, function( E ) 185 { 186 if( this.nodeType == 1 ) 187 { 188 this.appendChild( E ) 189 } 190 } ) 191 },prepend:function() 192 { 193 return this.domManip( arguments, true, function( E ) 194 { 195 if( this.nodeType == 1 ) 196 { 197 this.insertBefore( E, this.firstChild ) 198 } 199 } ) 200 },before:function() 201 { 202 return this.domManip( arguments, false, function( E ) 203 { 204 this.parentNode.insertBefore( E, this ) 205 } ) 206 },after:function() 207 { 208 return this.domManip( arguments, false, function( E ) 209 { 210 this.parentNode.insertBefore( E, this.nextSibling ) 211 } ) 212 },end:function() 213 { 214 return this.prevObject || o( [] ) 215 },push:[].push,sort:[].sort,splice:[].splice,find:function( E ) 216 { 217 if( this.length === 1 ) 218 { 219 var F = this.pushStack( [], "find", E ); 220 F.length = 0; 221 o.find( E, this[0], F ); 222 return F 223 } 224 else 225 { 226 return this.pushStack( o.unique( o.map( this, function( G ) 227 { 228 return o.find( E, G ) 229 } ) ), "find", E ) 230 } 231 },clone:function( G ) 232 { 233 var E = this.map( function() 234 { 235 if( !o.support.noCloneEvent && !o.isXMLDoc( this ) ) 236 { 237 var I = this.outerHTML; 238 if( !I ) 239 { 240 var J = this.ownerDocument.createElement( "div" ); 241 J.appendChild( this.cloneNode( true ) ); 242 I = J.innerHTML 243 } 244 return o.clean( [I.replace( / jQuery\d+="(?:\d+|null)"/g, "" ).replace( /^\s*/, "" )] )[0] 245 } 246 else 247 { 248 return this.cloneNode( true ) 249 } 250 } ); 251 if( G === true ) 252 { 253 var H = this.find( "*" ).andSelf(),F = 0; 254 E.find( "*" ).andSelf().each( function() 255 { 256 if( this.nodeName !== H[F].nodeName ) 257 { 258 return 259 } 260 var I = o.data( H[F], "events" ); 261 for( var K in I ) 262 { 263 for( var J in I[K] ) 264 { 265 o.event.add( this, K, I[K][J], I[K][J].data ) 266 } 267 } 268 F++ 269 } ) 270 } 271 return E 272 },filter:function( E ) 273 { 274 return this.pushStack( o.isFunction( E ) && o.grep( this, function( G, F ) 275 { 276 return E.call( G, F ) 277 } ) || o.multiFilter( E, o.grep( this, function( F ) 278 { 279 return F.nodeType === 1 280 } ) ), "filter", E ) 281 },closest:function( E ) 282 { 283 var G = o.expr.match.POS.test( E ) ? o( E ) : null,F = 0; 284 return this.map( function() 285 { 286 var H = this; 287 while( H && H.ownerDocument ) 288 { 289 if( G ? G.index( H ) > -1 : o( H ).is( E ) ) 290 { 291 o.data( H, "closest", F ); 292 return H 293 } 294 H = H.parentNode; 295 F++ 296 } 297 } ) 298 },not:function( E ) 299 { 300 if( typeof E === "string" ) 301 { 302 if( f.test( E ) ) 303 { 304 return this.pushStack( o.multiFilter( E, this, true ), "not", E ) 305 } 306 else 307 { 308 E = o.multiFilter( E, this ) 309 } 310 } 311 var F = E.length && E[E.length - 1] !== g && !E.nodeType; 312 return this.filter( function() 313 { 314 return F ? o.inArray( this, E ) < 0 : this != E 315 } ) 316 },add:function( E ) 317 { 318 return this.pushStack( o.unique( o.merge( this.get(), typeof E === "string" ? o( E ) : o.makeArray( E ) ) ) ) 319 },is:function( E ) 320 { 321 return !!E && o.multiFilter( E, this ).length > 0 322 },hasClass:function( E ) 323 { 324 return !!E && this.is( "." + E ) 325 },val:function( K ) 326 { 327 if( K === g ) 328 { 329 var E = this[0]; 330 if( E ) 331 { 332 if( o.nodeName( E, "option" ) ) 333 { 334 return(E.attributes.value || {}).specified ? E.value : E.text 335 } 336 if( o.nodeName( E, "select" ) ) 337 { 338 var I = E.selectedIndex,L = [],M = E.options,H = E.type == "select-one"; 339 if( I < 0 ) 340 { 341 return null 342 } 343 for( var F = H ? I : 0,J = H ? I + 1 : M.length; F < J; F++ ) 344 { 345 var G = M[F]; 346 if( G.selected ) 347 { 348 K = o( G ).val(); 349 if( H ) 350 { 351 return K 352 } 353 L.push( K ) 354 } 355 } 356 return L 357 } 358 return(E.value || "").replace( /\r/g, "" ) 359 } 360 return g 361 } 362 if( typeof K === "number" ) 363 { 364 K += "" 365 } 366 return this.each( function() 367 { 368 if( this.nodeType != 1 ) 369 { 370 return 371 } 372 if( o.isArray( K ) && /radio|checkbox/.test( this.type ) ) 373 { 374 this.checked = (o.inArray( this.value, K ) >= 0 || o.inArray( this.name, K ) >= 0) 375 } 376 else 377 { 378 if( o.nodeName( this, "select" ) ) 379 { 380 var N = o.makeArray( K ); 381 o( "option", this ).each( function() 382 { 383 this.selected = (o.inArray( this.value, N ) >= 0 || o.inArray( this.text, N ) >= 0) 384 } ); 385 if( !N.length ) 386 { 387 this.selectedIndex = -1 388 } 389 } 390 else 391 { 392 this.value = K 393 } 394 } 395 } ) 396 },html:function( E ) 397 { 398 return E === g ? (this[0] ? this[0].innerHTML.replace( / jQuery\d+="(?:\d+|null)"/g, "" ) : null) : this.empty().append( E ) 399 },replaceWith:function( E ) 400 { 401 return this.after( E ).remove() 402 },eq:function( E ) 403 { 404 return this.slice( E, +E + 1 ) 405 },slice:function() 406 { 407 return this.pushStack( Array.prototype.slice.apply( this, arguments ), "slice", Array.prototype.slice.call( arguments ).join( "," ) ) 408 },map:function( E ) 409 { 410 return this.pushStack( o.map( this, function( G, F ) 411 { 412 return E.call( G, F, G ) 413 } ) ) 414 },andSelf:function() 415 { 416 return this.add( this.prevObject ) 417 },domManip:function( J, M, L ) 418 { 419 if( this[0] ) 420 { 421 var I = (this[0].ownerDocument || this[0]).createDocumentFragment(),F = o.clean( J, (this[0].ownerDocument || this[0]), I ),H = I.firstChild; 422 if( H ) 423 { 424 for( var G = 0,E = this.length; G < E; G++ ) 425 { 426 L.call( K( this[G], H ), this.length > 1 || G > 0 ? I.cloneNode( true ) : I ) 427 } 428 } 429 if( F ) 430 { 431 o.each( F, z ) 432 } 433 } 434 return this; 435 function K( N, O ) 436 { 437 return M && o.nodeName( N, "table" ) && o.nodeName( O, "tr" ) ? (N.getElementsByTagName( "tbody" )[0] || N.appendChild( N.ownerDocument.createElement( "tbody" ) )) : N 438 } 439 }}; 440 o.fn.init.prototype = o.fn; 441 function z( E, F ) 442 { 443 if( F.src ) 444 { 445 o.ajax( {url:F.src,async:false,dataType:"script"} ) 446 } 447 else 448 { 449 o.globalEval( F.text || F.textContent || F.innerHTML || "" ) 450 } 451 if( F.parentNode ) 452 { 453 F.parentNode.removeChild( F ) 454 } 455 } 456 457 function e() 458 { 459 return +new Date 460 } 461 462 o.extend = o.fn.extend = function() 463 { 464 var J = arguments[0] || {},H = 1,I = arguments.length,E = false,G; 465 if( typeof J === "boolean" ) 466 { 467 E = J; 468 J = arguments[1] || {}; 469 H = 2 470 } 471 if( typeof J !== "object" && !o.isFunction( J ) ) 472 { 473 J = {} 474 } 475 if( I == H ) 476 { 477 J = this; 478 --H 479 } 480 for( ; H < I; H++ ) 481 { 482 if( (G = arguments[H]) != null ) 483 { 484 for( var F in G ) 485 { 486 var K = J[F],L = G[F]; 487 if( J === L ) 488 { 489 continue 490 } 491 if( E && L && typeof L === "object" && !L.nodeType ) 492 { 493 J[F] = o.extend( E, K || (L.length != null ? [] : {}), L ) 494 } 495 else 496 { 497 if( L !== g ) 498 { 499 J[F] = L 500 } 501 } 502 } 503 } 504 } 505 return J 506 }; 507 var b = /z-?index|font-?weight|opacity|zoom|line-?height/i,q = document.defaultView || {},s = Object.prototype.toString; 508 o.extend( {noConflict:function( E ) 509 { 510 l.$ = p; 511 if( E ) 512 { 513 l.jQuery = y 514 } 515 return o 516 },isFunction:function( E ) 517 { 518 return s.call( E ) === "[object Function]" 519 },isArray:function( E ) 520 { 521 return s.call( E ) === "[object Array]" 522 },isXMLDoc:function( E ) 523 { 524 return E.nodeType === 9 && E.documentElement.nodeName !== "HTML" || !!E.ownerDocument && o.isXMLDoc( E.ownerDocument ) 525 },globalEval:function( G ) 526 { 527 if( G && /\S/.test( G ) ) 528 { 529 var F = document.getElementsByTagName( "head" )[0] || document.documentElement,E = document.createElement( "script" ); 530 E.type = "text/javascript"; 531 if( o.support.scriptEval ) 532 { 533 E.appendChild( document.createTextNode( G ) ) 534 } 535 else 536 { 537 E.text = G 538 } 539 F.insertBefore( E, F.firstChild ); 540 F.removeChild( E ) 541 } 542 },nodeName:function( F, E ) 543 { 544 return F.nodeName && F.nodeName.toUpperCase() == E.toUpperCase() 545 },each:function( G, K, F ) 546 { 547 var E,H = 0,I = G.length; 548 if( F ) 549 { 550 if( I === g ) 551 { 552 for( E in G ) 553 { 554 if( K.apply( G[E], F ) === false ) 555 { 556 break 557 } 558 } 559 } 560 else 561 { 562 for( ; H < I; ) 563 { 564 if( K.apply( G[H++], F ) === false ) 565 { 566 break 567 } 568 } 569 } 570 } 571 else 572 { 573 if( I === g ) 574 { 575 for( E in G ) 576 { 577 if( K.call( G[E], E, G[E] ) === false ) 578 { 579 break 580 } 581 } 582 } 583 else 584 { 585 for( var J = G[0]; H < I && K.call( J, H, J ) !== false; J = G[++H] ) 586 { 587 } 588 } 589 } 590 return G 591 },prop:function( H, I, G, F, E ) 592 { 593 if( o.isFunction( I ) ) 594 { 595 I = I.call( H, F ) 596 } 597 return typeof I === "number" && G == "curCSS" && !b.test( E ) ? I + "px" : I 598 },className:{add:function( E, F ) 599 { 600 o.each( (F || "").split( /\s+/ ), function( G, H ) 601 { 602 if( E.nodeType == 1 && !o.className.has( E.className, H ) ) 603 { 604 E.className += (E.className ? " " : "") + H 605 } 606 } ) 607 },remove:function( E, F ) 608 { 609 if( E.nodeType == 1 ) 610 { 611 E.className = F !== g ? o.grep( E.className.split( /\s+/ ), 612 function( G ) 613 { 614 return !o.className.has( F, G ) 615 } ).join( " " ) : "" 616 } 617 },has:function( F, E ) 618 { 619 return F && o.inArray( E, (F.className || F).toString().split( /\s+/ ) ) > -1 620 }},swap:function( H, G, I ) 621 { 622 var E = {}; 623 for( var F in G ) 624 { 625 E[F] = H.style[F]; 626 H.style[F] = G[F] 627 } 628 I.call( H ); 629 for( var F in G ) 630 { 631 H.style[F] = E[F] 632 } 633 },css:function( H, F, J, E ) 634 { 635 if( F == "width" || F == "height" ) 636 { 637 var L,G = {position:"absolute",visibility:"hidden",display:"block"},K = F == "width" ? ["Left","Right"] : ["Top","Bottom"]; 638 639 function I() 640 { 641 L = F == "width" ? H.offsetWidth : H.offsetHeight; 642 if( E === "border" ) 643 { 644 return 645 } 646 o.each( K, function() 647 { 648 if( !E ) 649 { 650 L -= parseFloat( o.curCSS( H, "padding" + this, true ) ) || 0 651 } 652 if( E === "margin" ) 653 { 654 L += parseFloat( o.curCSS( H, "margin" + this, true ) ) || 0 655 } 656 else 657 { 658 L -= parseFloat( o.curCSS( H, "border" + this + "Width", true ) ) || 0 659 } 660 } ) 661 } 662 663 if( H.offsetWidth !== 0 ) 664 { 665 I() 666 } 667 else 668 { 669 o.swap( H, G, I ) 670 } 671 return Math.max( 0, Math.round( L ) ) 672 } 673 return o.curCSS( H, F, J ) 674 },curCSS:function( I, F, G ) 675 { 676 var L,E = I.style; 677 if( F == "opacity" && !o.support.opacity ) 678 { 679 L = o.attr( E, "opacity" ); 680 return L == "" ? "1" : L 681 } 682 if( F.match( /float/i ) ) 683 { 684 F = w 685 } 686 if( !G && E && E[F] ) 687 { 688 L = E[F] 689 } 690 else 691 { 692 if( q.getComputedStyle ) 693 { 694 if( F.match( /float/i ) ) 695 { 696 F = "float" 697 } 698 F = F.replace( /([A-Z])/g, "-$1" ).toLowerCase(); 699 var M = q.getComputedStyle( I, null ); 700 if( M ) 701 { 702 L = M.getPropertyValue( F ) 703 } 704 if( F == "opacity" && L == "" ) 705 { 706 L = "1" 707 } 708 } 709 else 710 { 711 if( I.currentStyle ) 712 { 713 var J = F.replace( /\-(\w)/g, function( N, O ) 714 { 715 return O.toUpperCase() 716 } ); 717 L = I.currentStyle[F] || I.currentStyle[J]; 718 if( !/^\d+(px)?$/i.test( L ) && /^\d/.test( L ) ) 719 { 720 var H = E.left,K = I.runtimeStyle.left; 721 I.runtimeStyle.left = I.currentStyle.left; 722 E.left = L || 0; 723 L = E.pixelLeft + "px"; 724 E.left = H; 725 I.runtimeStyle.left = K 726 } 727 } 728 } 729 } 730 return L 731 },clean:function( F, K, I ) 732 { 733 K = K || document; 734 if( typeof K.createElement === "undefined" ) 735 { 736 K = K.ownerDocument || K[0] && K[0].ownerDocument || document 737 } 738 if( !I && F.length === 1 && typeof F[0] === "string" ) 739 { 740 var H = /^<(\w+)\s*\/?>$/.exec( F[0] ); 741 if( H ) 742 { 743 return[K.createElement( H[1] )] 744 } 745 } 746 var G = [],E = [],L = K.createElement( "div" ); 747 o.each( F, function( P, S ) 748 { 749 if( typeof S === "number" ) 750 { 751 S += "" 752 } 753 if( !S ) 754 { 755 return 756 } 757 if( typeof S === "string" ) 758 { 759 S = S.replace( /(<(\w+)[^>]*?)\/>/g, function( U, V, T ) 760 { 761 return T.match( /^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i ) ? U : V + "></" + T + ">" 762 } ); 763 var O = S.replace( /^\s+/, "" ).substring( 0, 10 ).toLowerCase(); 764 var Q = !O.indexOf( "<opt" ) && [1,"<select multiple='multiple'>","</select>"] || !O.indexOf( "<leg" ) && [1,"<fieldset>","</fieldset>"] || O.match( /^<(thead|tbody|tfoot|colg|cap)/ ) && [1,"<table>","</table>"] || !O.indexOf( "<tr" ) && [2,"<table><tbody>","</tbody></table>"] || (!O.indexOf( "<td" ) || !O.indexOf( "<th" )) && [3,"<table><tbody><tr>","</tr></tbody></table>"] || !O.indexOf( "<col" ) && [2,"<table><tbody></tbody><colgroup>","</colgroup></table>"] || !o.support.htmlSerialize && [1,"div<div>","</div>"] || [0,"",""]; 765 L.innerHTML = Q[1] + S + Q[2]; 766 while( Q[0]-- ) 767 { 768 L = L.lastChild 769 } 770 if( !o.support.tbody ) 771 { 772 var R = /<tbody/i.test( S ),N = !O.indexOf( "<table" ) && !R ? L.firstChild && L.firstChild.childNodes : Q[1] == "<table>" && !R ? L.childNodes : []; 773 for( var M = N.length - 1; M >= 0; --M ) 774 { 775 if( o.nodeName( N[M], "tbody" ) && !N[M].childNodes.length ) 776 { 777 N[M].parentNode.removeChild( N[M] ) 778 } 779 } 780 } 781 if( !o.support.leadingWhitespace && /^\s/.test( S ) ) 782 { 783 L.insertBefore( K.createTextNode( S.match( /^\s*/ )[0] ), L.firstChild ) 784 } 785 S = o.makeArray( L.childNodes ) 786 } 787 if( S.nodeType ) 788 { 789 G.push( S ) 790 } 791 else 792 { 793 G = o.merge( G, S ) 794 } 795 } ); 796 if( I ) 797 { 798 for( var J = 0; G[J]; J++ ) 799 { 800 if( o.nodeName( G[J], "script" ) && (!G[J].type || G[J].type.toLowerCase() === "text/javascript") ) 801 { 802 E.push( G[J].parentNode ? G[J].parentNode.removeChild( G[J] ) : G[J] ) 803 } 804 else 805 { 806 if( G[J].nodeType === 1 ) 807 { 808 G.splice.apply( G, [J + 1,0].concat( o.makeArray( G[J].getElementsByTagName( "script" ) ) ) ) 809 } 810 I.appendChild( G[J] ) 811 } 812 } 813 return E 814 } 815 return G 816 },attr:function( J, G, K ) 817 { 818 if( !J || J.nodeType == 3 || J.nodeType == 8 ) 819 { 820 return g 821 } 822 var H = !o.isXMLDoc( J ),L = K !== g; 823 G = H && o.props[G] || G; 824 if( J.tagName ) 825 { 826 var F = /href|src|style/.test( G ); 827 if( G == "selected" && J.parentNode ) 828 { 829 J.parentNode.selectedIndex 830 } 831 if( G in J && H && !F ) 832 { 833 if( L ) 834 { 835 if( G == "type" && o.nodeName( J, "input" ) && J.parentNode ) 836 { 837 throw"type property can't be changed" 838 } 839 J[G] = K 840 } 841 if( o.nodeName( J, "form" ) && J.getAttributeNode( G ) ) 842 { 843 return J.getAttributeNode( G ).nodeValue 844 } 845 if( G == "tabIndex" ) 846 { 847 var I = J.getAttributeNode( "tabIndex" ); 848 return I && I.specified ? I.value : J.nodeName.match( /(button|input|object|select|textarea)/i ) ? 0 : J.nodeName.match( /^(a|area)$/i ) && J.href ? 0 : g 849 } 850 return J[G] 851 } 852 if( !o.support.style && H && G == "style" ) 853 { 854 return o.attr( J.style, "cssText", K ) 855 } 856 if( L ) 857 { 858 J.setAttribute( G, "" + K ) 859 } 860 var E = !o.support.hrefNormalized && H && F ? J.getAttribute( G, 2 ) : J.getAttribute( G ); 861 return E === null ? g : E 862 } 863 if( !o.support.opacity && G == "opacity" ) 864 { 865 if( L ) 866 { 867 J.zoom = 1; 868 J.filter = (J.filter || "").replace( /alpha\([^)]*\)/, "" ) + (parseInt( K ) + "" == "NaN" ? "" : "alpha(opacity=" + K * 100 + ")") 869 } 870 return J.filter && J.filter.indexOf( "opacity=" ) >= 0 ? (parseFloat( J.filter.match( /opacity=([^)]*)/ )[1] ) / 100) + "" : "" 871 } 872 G = G.replace( /-([a-z])/ig, function( M, N ) 873 { 874 return N.toUpperCase() 875 } ); 876 if( L ) 877 { 878 J[G] = K 879 } 880 return J[G] 881 },trim:function( E ) 882 { 883 return(E || "").replace( /^\s+|\s+$/g, "" ) 884 },makeArray:function( G ) 885 { 886 var E = []; 887 if( G != null ) 888 { 889 var F = G.length; 890 if( F == null || typeof G === "string" || o.isFunction( G ) || G.setInterval ) 891 { 892 E[0] = G 893 } 894 else 895 { 896 while( F ) 897 { 898 E[--F] = G[F] 899 } 900 } 901 } 902 return E 903 },inArray:function( G, H ) 904 { 905 for( var E = 0,F = H.length; E < F; E++ ) 906 { 907 if( H[E] === G ) 908 { 909 return E 910 } 911 } 912 return -1 913 },merge:function( H, E ) 914 { 915 var F = 0,G,I = H.length; 916 if( !o.support.getAll ) 917 { 918 while( (G = E[F++]) != null ) 919 { 920 if( G.nodeType != 8 ) 921 { 922 H[I++] = G 923 } 924 } 925 } 926 else 927 { 928 while( (G = E[F++]) != null ) 929 { 930 H[I++] = G 931 } 932 } 933 return H 934 },unique:function( K ) 935 { 936 var F = [],E = {}; 937 try 938 { 939 for( var G = 0,H = K.length; G < H; G++ ) 940 { 941 var J = o.data( K[G] ); 942 if( !E[J] ) 943 { 944 E[J] = true; 945 F.push( K[G] ) 946 } 947 } 948 } 949 catch( I ) 950 { 951 F = K 952 } 953 return F 954 },grep:function( F, J, E ) 955 { 956 var G = []; 957 for( var H = 0,I = F.length; H < I; H++ ) 958 { 959 if( !E != !J( F[H], H ) ) 960 { 961 G.push( F[H] ) 962 } 963 } 964 return G 965 },map:function( E, J ) 966 { 967 var F = []; 968 for( var G = 0,H = E.length; G < H; G++ ) 969 { 970 var I = J( E[G], G ); 971 if( I != null ) 972 { 973 F[F.length] = I 974 } 975 } 976 return F.concat.apply( [], F ) 977 }} ); 978 var C = navigator.userAgent.toLowerCase(); 979 o.browser = {version:(C.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,"0"])[1],safari:/webkit/.test( C ),opera:/opera/.test( C ),msie:/msie/.test( C ) && !/opera/.test( C ),mozilla:/mozilla/.test( C ) && !/(compatible|webkit)/.test( C )}; 980 o.each( {parent:function( E ) 981 { 982 return E.parentNode 983 },parents:function( E ) 984 { 985 return o.dir( E, "parentNode" ) 986 },next:function( E ) 987 { 988 return o.nth( E, 2, "nextSibling" ) 989 },prev:function( E ) 990 { 991 return o.nth( E, 2, "previousSibling" ) 992 },nextAll:function( E ) 993 { 994 return o.dir( E, "nextSibling" ) 995 },prevAll:function( E ) 996 { 997 return o.dir( E, "previousSibling" ) 998 },siblings:function( E ) 999 { 1000 return o.sibling( E.parentNode.firstChild, E ) 1001 },children:function( E ) 1002 { 1003 return o.sibling( E.firstChild ) 1004 },contents:function( E ) 1005 { 1006 return o.nodeName( E, "iframe" ) ? E.contentDocument || E.contentWindow.document : o.makeArray( E.childNodes ) 1007 }}, function( E, F ) 1008 { 1009 o.fn[E] = function( G ) 1010 { 1011 var H = o.map( this, F ); 1012 if( G && typeof G == "string" ) 1013 { 1014 H = o.multiFilter( G, H ) 1015 } 1016 return this.pushStack( o.unique( H ), E, G ) 1017 } 1018 } ); 1019 o.each( {appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"}, function( E, F ) 1020 { 1021 o.fn[E] = function( G ) 1022 { 1023 var J = [],L = o( G ); 1024 for( var K = 0,H = L.length; K < H; K++ ) 1025 { 1026 var I = (K > 0 ? this.clone( true ) : this).get(); 1027 o.fn[F].apply( o( L[K] ), I ); 1028 J = J.concat( I ) 1029 } 1030 return this.pushStack( J, E, G ) 1031 } 1032 } ); 1033 o.each( {removeAttr:function( E ) 1034 { 1035 o.attr( this, E, "" ); 1036 if( this.nodeType == 1 ) 1037 { 1038 this.removeAttribute( E ) 1039 } 1040 },addClass:function( E ) 1041 { 1042 o.className.add( this, E ) 1043 },removeClass:function( E ) 1044 { 1045 o.className.remove( this, E ) 1046 },toggleClass:function( F, E ) 1047 { 1048 if( typeof E !== "boolean" ) 1049 { 1050 E = !o.className.has( this, F ) 1051 } 1052 o.className[E ? "add" : "remove"]( this, F ) 1053 },remove:function( E ) 1054 { 1055 if( !E || o.filter( E, [this] ).length ) 1056 { 1057 o( "*", this ).add( [this] ).each( function() 1058 { 1059 o.event.remove( this ); 1060 o.removeData( this ) 1061 } ); 1062 if( this.parentNode ) 1063 { 1064 this.parentNode.removeChild( this ) 1065 } 1066 } 1067 },empty:function() 1068 { 1069 o( this ).children().remove(); 1070 while( this.firstChild ) 1071 { 1072 this.removeChild( this.firstChild ) 1073 } 1074 }}, function( E, F ) 1075 { 1076 o.fn[E] = function() 1077 { 1078 return this.each( F, arguments ) 1079 } 1080 } ); 1081 function j( E, F ) 1082 { 1083 return E[0] && parseInt( o.curCSS( E[0], F, true ), 10 ) || 0 1084 } 1085 1086 var h = "jQuery" + e(),v = 0,A = {}; 1087 o.extend( {cache:{},data:function( F, E, G ) 1088 { 1089 F = F == l ? A : F; 1090 var H = F[h]; 1091 if( !H ) 1092 { 1093 H = F[h] = ++v 1094 } 1095 if( E && !o.cache[H] ) 1096 { 1097 o.cache[H] = {} 1098 } 1099 if( G !== g ) 1100 { 1101 o.cache[H][E] = G 1102 } 1103 return E ? o.cache[H][E] : H 1104 },removeData:function( F, E ) 1105 { 1106 F = F == l ? A : F; 1107 var H = F[h]; 1108 if( E ) 1109 { 1110 if( o.cache[H] ) 1111 { 1112 delete o.cache[H][E]; 1113 E = ""; 1114 for( E in o.cache[H] ) 1115 { 1116 break 1117 } 1118 if( !E ) 1119 { 1120 o.removeData( F ) 1121 } 1122 } 1123 } 1124 else 1125 { 1126 try 1127 { 1128 delete F[h] 1129 } 1130 catch( G ) 1131 { 1132 if( F.removeAttribute ) 1133 { 1134 F.removeAttribute( h ) 1135 } 1136 } 1137 delete o.cache[H] 1138 } 1139 },queue:function( F, E, H ) 1140 { 1141 if( F ) 1142 { 1143 E = (E || "fx") + "queue"; 1144 var G = o.data( F, E ); 1145 if( !G || o.isArray( H ) ) 1146 { 1147 G = o.data( F, E, o.makeArray( H ) ) 1148 } 1149 else 1150 { 1151 if( H ) 1152 { 1153 G.push( H ) 1154 } 1155 } 1156 } 1157 return G 1158 },dequeue:function( H, G ) 1159 { 1160 var E = o.queue( H, G ),F = E.shift(); 1161 if( !G || G === "fx" ) 1162 { 1163 F = E[0] 1164 } 1165 if( F !== g ) 1166 { 1167 F.call( H ) 1168 } 1169 }} ); 1170 o.fn.extend( {data:function( E, G ) 1171 { 1172 var H = E.split( "." ); 1173 H[1] = H[1] ? "." + H[1] : ""; 1174 if( G === g ) 1175 { 1176 var F = this.triggerHandler( "getData" + H[1] + "!", [H[0]] ); 1177 if( F === g && this.length ) 1178 { 1179 F = o.data( this[0], E ) 1180 } 1181 return F === g && H[1] ? this.data( H[0] ) : F 1182 } 1183 else 1184 { 1185 return this.trigger( "setData" + H[1] + "!", [H[0],G] ).each( function() 1186 { 1187 o.data( this, E, G ) 1188 } ) 1189 } 1190 },removeData:function( E ) 1191 { 1192 return this.each( function() 1193 { 1194 o.removeData( this, E ) 1195 } ) 1196 },queue:function( E, F ) 1197 { 1198 if( typeof E !== "string" ) 1199 { 1200 F = E; 1201 E = "fx" 1202 } 1203 if( F === g ) 1204 { 1205 return o.queue( this[0], E ) 1206 } 1207 return this.each( function() 1208 { 1209 var G = o.queue( this, E, F ); 1210 if( E == "fx" && G.length == 1 ) 1211 { 1212 G[0].call( this ) 1213 } 1214 } ) 1215 },dequeue:function( E ) 1216 { 1217 return this.each( function() 1218 { 1219 o.dequeue( this, E ) 1220 } ) 1221 }} ); 1222 /* 1223 * Sizzle CSS Selector Engine - v0.9.3 1224 * Copyright 2009, The Dojo Foundation 1225 * Released under the MIT, BSD, and GPL Licenses. 1226 * More information: http://sizzlejs.com/ 1227 */ 1228 (function() 1229 { 1230 var R = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L = 0,H = Object.prototype.toString; 1231 var F = function( Y, U, ab, ac ) 1232 { 1233 ab = ab || []; 1234 U = U || document; 1235 if( U.nodeType !== 1 && U.nodeType !== 9 ) 1236 { 1237 return[] 1238 } 1239 if( !Y || typeof Y !== "string" ) 1240 { 1241 return ab 1242 } 1243 var Z = [],W,af,ai,T,ad,V,X = true; 1244 R.lastIndex = 0; 1245 while( (W = R.exec( Y )) !== null ) 1246 { 1247 Z.push( W[1] ); 1248 if( W[2] ) 1249 { 1250 V = RegExp.rightContext; 1251 break 1252 } 1253 } 1254 if( Z.length > 1 && M.exec( Y ) ) 1255 { 1256 if( Z.length === 2 && I.relative[Z[0]] ) 1257 { 1258 af = J( Z[0] + Z[1], U ) 1259 } 1260 else 1261 { 1262 af = I.relative[Z[0]] ? [U] : F( Z.shift(), U ); 1263 while( Z.length ) 1264 { 1265 Y = Z.shift(); 1266 if( I.relative[Y] ) 1267 { 1268 Y += Z.shift() 1269 } 1270 af = J( Y, af ) 1271 } 1272 } 1273 } 1274 else 1275 { 1276 var ae = ac ? {expr:Z.pop(),set:E( ac )} : F.find( Z.pop(), Z.length === 1 && U.parentNode ? U.parentNode : U, Q( U ) ); 1277 af = F.filter( ae.expr, ae.set ); 1278 if( Z.length > 0 ) 1279 { 1280 ai = E( af ) 1281 } 1282 else 1283 { 1284 X = false 1285 } 1286 while( Z.length ) 1287 { 1288 var ah = Z.pop(),ag = ah; 1289 if( !I.relative[ah] ) 1290 { 1291 ah = "" 1292 } 1293 else 1294 { 1295 ag = Z.pop() 1296 } 1297 if( ag == null ) 1298 { 1299 ag = U 1300 } 1301 I.relative[ah]( ai, ag, Q( U ) ) 1302 } 1303 } 1304 if( !ai ) 1305 { 1306 ai = af 1307 } 1308 if( !ai ) 1309 { 1310 throw"Syntax error, unrecognized expression: " + (ah || Y) 1311 } 1312 if( H.call( ai ) === "[object Array]" ) 1313 { 1314 if( !X ) 1315 { 1316 ab.push.apply( ab, ai ) 1317 } 1318 else 1319 { 1320 if( U.nodeType === 1 ) 1321 { 1322 for( var aa = 0; ai[aa] != null; aa++ ) 1323 { 1324 if( ai[aa] && (ai[aa] === true || ai[aa].nodeType === 1 && K( U, ai[aa] )) ) 1325 { 1326 ab.push( af[aa] ) 1327 } 1328 } 1329 } 1330 else 1331 { 1332 for( var aa = 0; ai[aa] != null; aa++ ) 1333 { 1334 if( ai[aa] && ai[aa].nodeType === 1 ) 1335 { 1336 ab.push( af[aa] ) 1337 } 1338 } 1339 } 1340 } 1341 } 1342 else 1343 { 1344 E( ai, ab ) 1345 } 1346 if( V ) 1347 { 1348 F( V, U, ab, ac ); 1349 if( G ) 1350 { 1351 hasDuplicate = false; 1352 ab.sort( G ); 1353 if( hasDuplicate ) 1354 { 1355 for( var aa = 1; aa < ab.length; aa++ ) 1356 { 1357 if( ab[aa] === ab[aa - 1] ) 1358 { 1359 ab.splice( aa--, 1 ) 1360 } 1361 } 1362 } 1363 } 1364 } 1365 return ab 1366 }; 1367 F.matches = function( T, U ) 1368 { 1369 return F( T, null, null, U ) 1370 }; 1371 F.find = function( aa, T, ab ) 1372 { 1373 var Z,X; 1374 if( !aa ) 1375 { 1376 return[] 1377 } 1378 for( var W = 0,V = I.order.length; W < V; W++ ) 1379 { 1380 var Y = I.order[W],X; 1381 if( (X = I.match[Y].exec( aa )) ) 1382 { 1383 var U = RegExp.leftContext; 1384 if( U.substr( U.length - 1 ) !== "\\" ) 1385 { 1386 X[1] = (X[1] || "").replace( /\\/g, "" ); 1387 Z = I.find[Y]( X, T, ab ); 1388 if( Z != null ) 1389 { 1390 aa = aa.replace( I.match[Y], "" ); 1391 break 1392 } 1393 } 1394 } 1395 } 1396 if( !Z ) 1397 { 1398 Z = T.getElementsByTagName( "*" ) 1399 } 1400 return{set:Z,expr:aa} 1401 }; 1402 F.filter = function( ad, ac, ag, W ) 1403 { 1404 var V = ad,ai = [],aa = ac,Y,T,Z = ac && ac[0] && Q( ac[0] ); 1405 while( ad && ac.length ) 1406 { 1407 for( var ab in I.filter ) 1408 { 1409 if( (Y = I.match[ab].exec( ad )) != null ) 1410 { 1411 var U = I.filter[ab],ah,af; 1412 T = false; 1413 if( aa == ai ) 1414 { 1415 ai = [] 1416 } 1417 if( I.preFilter[ab] ) 1418 { 1419 Y = I.preFilter[ab]( Y, aa, ag, ai, W, Z ); 1420 if( !Y ) 1421 { 1422 T = ah = true 1423 } 1424 else 1425 { 1426 if( Y === true ) 1427 { 1428 continue 1429 } 1430 } 1431 } 1432 if( Y ) 1433 { 1434 for( var X = 0; (af = aa[X]) != null; X++ ) 1435 { 1436 if( af ) 1437 { 1438 ah = U( af, Y, X, aa ); 1439 var ae = W ^ !!ah; 1440 if( ag && ah != null ) 1441 { 1442 if( ae ) 1443 { 1444 T = true 1445 } 1446 else 1447 { 1448 aa[X] = false 1449 } 1450 } 1451 else 1452 { 1453 if( ae ) 1454 { 1455 ai.push( af ); 1456 T = true 1457 } 1458 } 1459 } 1460 } 1461 } 1462 if( ah !== g ) 1463 { 1464 if( !ag ) 1465 { 1466 aa = ai 1467 } 1468 ad = ad.replace( I.match[ab], "" ); 1469 if( !T ) 1470 { 1471 return[] 1472 } 1473 break 1474 } 1475 } 1476 } 1477 if( ad == V ) 1478 { 1479 if( T == null ) 1480 { 1481 throw"Syntax error, unrecognized expression: " + ad 1482 } 1483 else 1484 { 1485 break 1486 } 1487 } 1488 V = ad 1489 } 1490 return aa 1491 }; 1492 var I = F.selectors = {order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function( T ) 1493 { 1494 return T.getAttribute( "href" ) 1495 }},relative:{"+":function( aa, T, Z ) 1496 { 1497 var X = typeof T === "string",ab = X && !/\W/.test( T ),Y = X && !ab; 1498 if( ab && !Z ) 1499 { 1500 T = T.toUpperCase() 1501 } 1502 for( var W = 0,V = aa.length,U; W < V; W++ ) 1503 { 1504 if( (U = aa[W]) ) 1505 { 1506 while( (U = U.previousSibling) && U.nodeType !== 1 ) 1507 { 1508 } 1509 aa[W] = Y || U && U.nodeName === T ? U || false : U === T 1510 } 1511 } 1512 if( Y ) 1513 { 1514 F.filter( T, aa, true ) 1515 } 1516 },">":function( Z, U, aa ) 1517 { 1518 var X = typeof U === "string"; 1519 if( X && !/\W/.test( U ) ) 1520 { 1521 U = aa ? U : U.toUpperCase(); 1522 for( var V = 0,T = Z.length; V < T; V++ ) 1523 { 1524 var Y = Z[V]; 1525 if( Y ) 1526 { 1527 var W = Y.parentNode; 1528 Z[V] = W.nodeName === U ? W : false 1529 } 1530 } 1531 } 1532 else 1533 { 1534 for( var V = 0,T = Z.length; V < T; V++ ) 1535 { 1536 var Y = Z[V]; 1537 if( Y ) 1538 { 1539 Z[V] = X ? Y.parentNode : Y.parentNode === U 1540 } 1541 } 1542 if( X ) 1543 { 1544 F.filter( U, Z, true ) 1545 } 1546 } 1547 },"":function( W, U, Y ) 1548 { 1549 var V = L++,T = S; 1550 if( !U.match( /\W/ ) ) 1551 { 1552 var X = U = Y ? U : U.toUpperCase(); 1553 T = P 1554 } 1555 T( "parentNode", U, V, W, X, Y ) 1556 },"~":function( W, U, Y ) 1557 { 1558 var V = L++,T = S; 1559 if( typeof U === "string" && !U.match( /\W/ ) ) 1560 { 1561 var X = U = Y ? U : U.toUpperCase(); 1562 T = P 1563 } 1564 T( "previousSibling", U, V, W, X, Y ) 1565 }},find:{ID:function( U, V, W ) 1566 { 1567 if( typeof V.getElementById !== "undefined" && !W ) 1568 { 1569 var T = V.getElementById( U[1] ); 1570 return T ? [T] : [] 1571 } 1572 },NAME:function( V, Y, Z ) 1573 { 1574 if( typeof Y.getElementsByName !== "undefined" ) 1575 { 1576 var U = [],X = Y.getElementsByName( V[1] ); 1577 for( var W = 0,T = X.length; W < T; W++ ) 1578 { 1579 if( X[W].getAttribute( "name" ) === V[1] ) 1580 { 1581 U.push( X[W] ) 1582 } 1583 } 1584 return U.length === 0 ? null : U 1585 } 1586 },TAG:function( T, U ) 1587 { 1588 return U.getElementsByTagName( T[1] ) 1589 }},preFilter:{CLASS:function( W, U, V, T, Z, aa ) 1590 { 1591 W = " " + W[1].replace( /\\/g, "" ) + " "; 1592 if( aa ) 1593 { 1594 return W 1595 } 1596 for( var X = 0,Y; (Y = U[X]) != null; X++ ) 1597 { 1598 if( Y ) 1599 { 1600 if( Z ^ (Y.className && (" " + Y.className + " ").indexOf( W ) >= 0) ) 1601 { 1602 if( !V ) 1603 { 1604 T.push( Y ) 1605 } 1606 } 1607 else 1608 { 1609 if( V ) 1610 { 1611 U[X] = false 1612 } 1613 } 1614 } 1615 } 1616 return false 1617 },ID:function( T ) 1618 { 1619 return T[1].replace( /\\/g, "" ) 1620 },TAG:function( U, T ) 1621 { 1622 for( var V = 0; T[V] === false; V++ ) 1623 { 1624 } 1625 return T[V] && Q( T[V] ) ? U[1] : U[1].toUpperCase() 1626 },CHILD:function( T ) 1627 { 1628 if( T[1] == "nth" ) 1629 { 1630 var U = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( T[2] == "even" && "2n" || T[2] == "odd" && "2n+1" || !/\D/.test( T[2] ) && "0n+" + T[2] || T[2] ); 1631 T[2] = (U[1] + (U[2] || 1)) - 0; 1632 T[3] = U[3] - 0 1633 } 1634 T[0] = L++; 1635 return T 1636 },ATTR:function( X, U, V, T, Y, Z ) 1637 { 1638 var W = X[1].replace( /\\/g, "" ); 1639 if( !Z && I.attrMap[W] ) 1640 { 1641 X[1] = I.attrMap[W] 1642 } 1643 if( X[2] === "~=" ) 1644 { 1645 X[4] = " " + X[4] + " " 1646 } 1647 return X 1648 },PSEUDO:function( X, U, V, T, Y ) 1649 { 1650 if( X[1] === "not" ) 1651 { 1652 if( X[3].match( R ).length > 1 || /^\w/.test( X[3] ) ) 1653 { 1654 X[3] = F( X[3], null, null, U ) 1655 } 1656 else 1657 { 1658 var W = F.filter( X[3], U, V, true ^ Y ); 1659 if( !V ) 1660 { 1661 T.push.apply( T, W ) 1662 } 1663 return false 1664 } 1665 } 1666 else 1667 { 1668 if( I.match.POS.test( X[0] ) || I.match.CHILD.test( X[0] ) ) 1669 { 1670 return true 1671 } 1672 } 1673 return X 1674 },POS:function( T ) 1675 { 1676 T.unshift( true ); 1677 return T 1678 }},filters:{enabled:function( T ) 1679 { 1680 return T.disabled === false && T.type !== "hidden" 1681 },disabled:function( T ) 1682 { 1683 return T.disabled === true 1684 },checked:function( T ) 1685 { 1686 return T.checked === true 1687 },selected:function( T ) 1688 { 1689 T.parentNode.selectedIndex; 1690 return T.selected === true 1691 },parent:function( T ) 1692 { 1693 return !!T.firstChild 1694 },empty:function( T ) 1695 { 1696 return !T.firstChild 1697 },has:function( V, U, T ) 1698 { 1699 return !!F( T[3], V ).length 1700 },header:function( T ) 1701 { 1702 return/h\d/i.test( T.nodeName ) 1703 },text:function( T ) 1704 { 1705 return"text" === T.type 1706 },radio:function( T ) 1707 { 1708 return"radio" === T.type 1709 },checkbox:function( T ) 1710 { 1711 return"checkbox" === T.type 1712 },file:function( T ) 1713 { 1714 return"file" === T.type 1715 },password:function( T ) 1716 { 1717 return"password" === T.type 1718 },submit:function( T ) 1719 { 1720 return"submit" === T.type 1721 },image:function( T ) 1722 { 1723 return"image" === T.type 1724 },reset:function( T ) 1725 { 1726 return"reset" === T.type 1727 },button:function( T ) 1728 { 1729 return"button" === T.type || T.nodeName.toUpperCase() === "BUTTON" 1730 },input:function( T ) 1731 { 1732 return/input|select|textarea|button/i.test( T.nodeName ) 1733 }},setFilters:{first:function( U, T ) 1734 { 1735 return T === 0 1736 },last:function( V, U, T, W ) 1737 { 1738 return U === W.length - 1 1739 },even:function( U, T ) 1740 { 1741 return T % 2 === 0 1742 },odd:function( U, T ) 1743 { 1744 return T % 2 === 1 1745 },lt:function( V, U, T ) 1746 { 1747 return U < T[3] - 0 1748 },gt:function( V, U, T ) 1749 { 1750 return U > T[3] - 0 1751 },nth:function( V, U, T ) 1752 { 1753 return T[3] - 0 == U 1754 },eq:function( V, U, T ) 1755 { 1756 return T[3] - 0 == U 1757 }},filter:{PSEUDO:function( Z, V, W, aa ) 1758 { 1759 var U = V[1],X = I.filters[U]; 1760 if( X ) 1761 { 1762 return X( Z, W, V, aa ) 1763 } 1764 else 1765 { 1766 if( U === "contains" ) 1767 { 1768 return(Z.textContent || Z.innerText || "").indexOf( V[3] ) >= 0 1769 } 1770 else 1771 { 1772 if( U === "not" ) 1773 { 1774 var Y = V[3]; 1775 for( var W = 0,T = Y.length; W < T; W++ ) 1776 { 1777 if( Y[W] === Z ) 1778 { 1779 return false 1780 } 1781 } 1782 return true 1783 } 1784 } 1785 } 1786 },CHILD:function( T, W ) 1787 { 1788 var Z = W[1],U = T; 1789 switch( Z ) 1790 {case"only":case"first":while( U = U.previousSibling ) 1791 { 1792 if( U.nodeType === 1 ) 1793 { 1794 return false 1795 } 1796 }if( Z == "first" ) 1797 { 1798 return true 1799 }U = T;case"last":while( U = U.nextSibling ) 1800 { 1801 if( U.nodeType === 1 ) 1802 { 1803 return false 1804 } 1805 }return true;case"nth":var V = W[2],ac = W[3];if( V == 1 && ac == 0 ) 1806 { 1807 return true 1808 }var Y = W[0],ab = T.parentNode;if( ab && (ab.sizcache !== Y || !T.nodeIndex) ) 1809 { 1810 var X = 0; 1811 for( U = ab.firstChild; U; U = U.nextSibling ) 1812 { 1813 if( U.nodeType === 1 ) 1814 { 1815 U.nodeIndex = ++X 1816 } 1817 } 1818 ab.sizcache = Y 1819 }var aa = T.nodeIndex - ac;if( V == 0 ) 1820 { 1821 return aa == 0 1822 } 1823 else 1824 { 1825 return(aa % V == 0 && aa / V >= 0) 1826 } 1827 } 1828 },ID:function( U, T ) 1829 { 1830 return U.nodeType === 1 && U.getAttribute( "id" ) === T 1831 },TAG:function( U, T ) 1832 { 1833 return(T === "*" && U.nodeType === 1) || U.nodeName === T 1834 },CLASS:function( U, T ) 1835 { 1836 return(" " + (U.className || U.getAttribute( "class" )) + " ").indexOf( T ) > -1 1837 },ATTR:function( Y, W ) 1838 { 1839 var V = W[1],T = I.attrHandle[V] ? I.attrHandle[V]( Y ) : Y[V] != null ? Y[V] : Y.getAttribute( V ),Z = T + "",X = W[2],U = W[4]; 1840 return T == null ? X === "!=" : X === "=" ? Z === U : X === "*=" ? Z.indexOf( U ) >= 0 : X === "~=" ? (" " + Z + " ").indexOf( U ) >= 0 : !U ? Z && T !== false : X === "!=" ? Z != U : X === "^=" ? Z.indexOf( U ) === 0 : X === "$=" ? Z.substr( Z.length - U.length ) === U : X === "|=" ? Z === U || Z.substr( 0, U.length + 1 ) === U + "-" : false 1841 },POS:function( X, U, V, Y ) 1842 { 1843 var T = U[2],W = I.setFilters[T]; 1844 if( W ) 1845 { 1846 return W( X, V, U, Y ) 1847 } 1848 }}}; 1849 var M = I.match.POS; 1850 for( var O in I.match ) 1851 { 1852 I.match[O] = RegExp( I.match[O].source + /(?![^\[]*\])(?![^\(]*\))/.source ) 1853 } 1854 var E = function( U, T ) 1855 { 1856 U = Array.prototype.slice.call( U ); 1857 if( T ) 1858 { 1859 T.push.apply( T, U ); 1860 return T 1861 } 1862 return U 1863 }; 1864 try 1865 { 1866 Array.prototype.slice.call( document.documentElement.childNodes ) 1867 } 1868 catch( N ) 1869 { 1870 E = function( X, W ) 1871 { 1872 var U = W || []; 1873 if( H.call( X ) === "[object Array]" ) 1874 { 1875 Array.prototype.push.apply( U, X ) 1876 } 1877 else 1878 { 1879 if( typeof X.length === "number" ) 1880 { 1881 for( var V = 0,T = X.length; V < T; V++ ) 1882 { 1883 U.push( X[V] ) 1884 } 1885 } 1886 else 1887 { 1888 for( var V = 0; X[V]; V++ ) 1889 { 1890 U.push( X[V] ) 1891 } 1892 } 1893 } 1894 return U 1895 } 1896 } 1897 var G; 1898 if( document.documentElement.compareDocumentPosition ) 1899 { 1900 G = function( U, T ) 1901 { 1902 var V = U.compareDocumentPosition( T ) & 4 ? -1 : U === T ? 0 : 1; 1903 if( V === 0 ) 1904 { 1905 hasDuplicate = true 1906 } 1907 return V 1908 } 1909 } 1910 else 1911 { 1912 if( "sourceIndex" in document.documentElement ) 1913 { 1914 G = function( U, T ) 1915 { 1916 var V = U.sourceIndex - T.sourceIndex; 1917 if( V === 0 ) 1918 { 1919 hasDuplicate = true 1920 } 1921 return V 1922 } 1923 } 1924 else 1925 { 1926 if( document.createRange ) 1927 { 1928 G = function( W, U ) 1929 { 1930 var V = W.ownerDocument.createRange(),T = U.ownerDocument.createRange(); 1931 V.selectNode( W ); 1932 V.collapse( true ); 1933 T.selectNode( U ); 1934 T.collapse( true ); 1935 var X = V.compareBoundaryPoints( Range.START_TO_END, T ); 1936 if( X === 0 ) 1937 { 1938 hasDuplicate = true 1939 } 1940 return X 1941 } 1942 } 1943 } 1944 } 1945 (function() 1946 { 1947 var U = document.createElement( "form" ),V = "script" + (new Date).getTime(); 1948 U.innerHTML = "<input name='" + V + "'/>"; 1949 var T = document.documentElement; 1950 T.insertBefore( U, T.firstChild ); 1951 if( !!document.getElementById( V ) ) 1952 { 1953 I.find.ID = function( X, Y, Z ) 1954 { 1955 if( typeof Y.getElementById !== "undefined" && !Z ) 1956 { 1957 var W = Y.getElementById( X[1] ); 1958 return W ? W.id === X[1] || typeof W.getAttributeNode !== "undefined" && W.getAttributeNode( "id" ).nodeValue === X[1] ? [W] : g : [] 1959 } 1960 }; 1961 I.filter.ID = function( Y, W ) 1962 { 1963 var X = typeof Y.getAttributeNode !== "undefined" && Y.getAttributeNode( "id" ); 1964 return Y.nodeType === 1 && X && X.nodeValue === W 1965 } 1966 } 1967 T.removeChild( U ) 1968 })(); 1969 (function() 1970 { 1971 var T = document.createElement( "div" ); 1972 T.appendChild( document.createComment( "" ) ); 1973 if( T.getElementsByTagName( "*" ).length > 0 ) 1974 { 1975 I.find.TAG = function( U, Y ) 1976 { 1977 var X = Y.getElementsByTagName( U[1] ); 1978 if( U[1] === "*" ) 1979 { 1980 var W = []; 1981 for( var V = 0; X[V]; V++ ) 1982 { 1983 if( X[V].nodeType === 1 ) 1984 { 1985 W.push( X[V] ) 1986 } 1987 } 1988 X = W 1989 } 1990 return X 1991 } 1992 } 1993 T.innerHTML = "<a href='#'></a>"; 1994 if( T.firstChild && typeof T.firstChild.getAttribute !== "undefined" && T.firstChild.getAttribute( "href" ) !== "#" ) 1995 { 1996 I.attrHandle.href = function( U ) 1997 { 1998 return U.getAttribute( "href", 2 ) 1999 } 2000 } 2001 })(); 2002 if( document.querySelectorAll ) 2003 { 2004 (function() 2005 { 2006 var T = F,U = document.createElement( "div" ); 2007 U.innerHTML = "<p class='TEST'></p>"; 2008 if( U.querySelectorAll && U.querySelectorAll( ".TEST" ).length === 0 ) 2009 { 2010 return 2011 } 2012 F = function( Y, X, V, W ) 2013 { 2014 X = X || document; 2015 if( !W && X.nodeType === 9 && !Q( X ) ) 2016 { 2017 try 2018 { 2019 return E( X.querySelectorAll( Y ), V ) 2020 } 2021 catch( Z ) 2022 { 2023 } 2024 } 2025 return T( Y, X, V, W ) 2026 }; 2027 F.find = T.find; 2028 F.filter = T.filter; 2029 F.selectors = T.selectors; 2030 F.matches = T.matches 2031 })() 2032 } 2033 if( document.getElementsByClassName && document.documentElement.getElementsByClassName ) 2034 { 2035 (function() 2036 { 2037 var T = document.createElement( "div" ); 2038 T.innerHTML = "<div class='test e'></div><div class='test'></div>"; 2039 if( T.getElementsByClassName( "e" ).length === 0 ) 2040 { 2041 return 2042 } 2043 T.lastChild.className = "e"; 2044 if( T.getElementsByClassName( "e" ).length === 1 ) 2045 { 2046 return 2047 } 2048 I.order.splice( 1, 0, "CLASS" ); 2049 I.find.CLASS = function( U, V, W ) 2050 { 2051 if( typeof V.getElementsByClassName !== "undefined" && !W ) 2052 { 2053 return V.getElementsByClassName( U[1] ) 2054 } 2055 } 2056 })() 2057 } 2058 function P( U, Z, Y, ad, aa, ac ) 2059 { 2060 var ab = U == "previousSibling" && !ac; 2061 for( var W = 0,V = ad.length; W < V; W++ ) 2062 { 2063 var T = ad[W]; 2064 if( T ) 2065 { 2066 if( ab && T.nodeType === 1 ) 2067 { 2068 T.sizcache = Y; 2069 T.sizset = W 2070 } 2071 T = T[U]; 2072 var X = false; 2073 while( T ) 2074 { 2075 if( T.sizcache === Y ) 2076 { 2077 X = ad[T.sizset]; 2078 break 2079 } 2080 if( T.nodeType === 1 && !ac ) 2081 { 2082 T.sizcache = Y; 2083 T.sizset = W 2084 } 2085 if( T.nodeName === Z ) 2086 { 2087 X = T; 2088 break 2089 } 2090 T = T[U] 2091 } 2092 ad[W] = X 2093 } 2094 } 2095 } 2096 2097 function S( U, Z, Y, ad, aa, ac ) 2098 { 2099 var ab = U == "previousSibling" && !ac; 2100 for( var W = 0,V = ad.length; W < V; W++ ) 2101 { 2102 var T = ad[W]; 2103 if( T ) 2104 { 2105 if( ab && T.nodeType === 1 ) 2106 { 2107 T.sizcache = Y; 2108 T.sizset = W 2109 } 2110 T = T[U]; 2111 var X = false; 2112 while( T ) 2113 { 2114 if( T.sizcache === Y ) 2115 { 2116 X = ad[T.sizset]; 2117 break 2118 } 2119 if( T.nodeType === 1 ) 2120 { 2121 if( !ac ) 2122 { 2123 T.sizcache = Y; 2124 T.sizset = W 2125 } 2126 if( typeof Z !== "string" ) 2127 { 2128 if( T === Z ) 2129 { 2130 X = true; 2131 break 2132 } 2133 } 2134 else 2135 { 2136 if( F.filter( Z, [T] ).length > 0 ) 2137 { 2138 X = T; 2139 break 2140 } 2141 } 2142 } 2143 T = T[U] 2144 } 2145 ad[W] = X 2146 } 2147 } 2148 } 2149 2150 var K = document.compareDocumentPosition ? function( U, T ) 2151 { 2152 return U.compareDocumentPosition( T ) & 16 2153 } : function( U, T ) 2154 { 2155 return U !== T && (U.contains ? U.contains( T ) : true) 2156 }; 2157 var Q = function( T ) 2158 { 2159 return T.nodeType === 9 && T.documentElement.nodeName !== "HTML" || !!T.ownerDocument && Q( T.ownerDocument ) 2160 }; 2161 var J = function( T, aa ) 2162 { 2163 var W = [],X = "",Y,V = aa.nodeType ? [aa] : aa; 2164 while( (Y = I.match.PSEUDO.exec( T )) ) 2165 { 2166 X += Y[0]; 2167 T = T.replace( I.match.PSEUDO, "" ) 2168 } 2169 T = I.relative[T] ? T + "*" : T; 2170 for( var Z = 0,U = V.length; Z < U; Z++ ) 2171 { 2172 F( T, V[Z], W ) 2173 } 2174 return F.filter( X, W ) 2175 }; 2176 o.find = F; 2177 o.filter = F.filter; 2178 o.expr = F.selectors; 2179 o.expr[":"] = o.expr.filters; 2180 F.selectors.filters.hidden = function( T ) 2181 { 2182 return T.offsetWidth === 0 || T.offsetHeight === 0 2183 }; 2184 F.selectors.filters.visible = function( T ) 2185 { 2186 return T.offsetWidth > 0 || T.offsetHeight > 0 2187 }; 2188 F.selectors.filters.animated = function( T ) 2189 { 2190 return o.grep( o.timers, 2191 function( U ) 2192 { 2193 return T === U.elem 2194 } ).length 2195 }; 2196 o.multiFilter = function( V, T, U ) 2197 { 2198 if( U ) 2199 { 2200 V = ":not(" + V + ")" 2201 } 2202 return F.matches( V, T ) 2203 }; 2204 o.dir = function( V, U ) 2205 { 2206 var T = [],W = V[U]; 2207 while( W && W != document ) 2208 { 2209 if( W.nodeType == 1 ) 2210 { 2211 T.push( W ) 2212 } 2213 W = W[U] 2214 } 2215 return T 2216 }; 2217 o.nth = function( X, T, V, W ) 2218 { 2219 T = T || 1; 2220 var U = 0; 2221 for( ; X; X = X[V] ) 2222 { 2223 if( X.nodeType == 1 && ++U == T ) 2224 { 2225 break 2226 } 2227 } 2228 return X 2229 }; 2230 o.sibling = function( V, U ) 2231 { 2232 var T = []; 2233 for( ; V; V = V.nextSibling ) 2234 { 2235 if( V.nodeType == 1 && V != U ) 2236 { 2237 T.push( V ) 2238 } 2239 } 2240 return T 2241 }; 2242 return; 2243 l.Sizzle = F 2244 })(); 2245 o.event = {add:function( I, F, H, K ) 2246 { 2247 if( I.nodeType == 3 || I.nodeType == 8 ) 2248 { 2249 return 2250 } 2251 if( I.setInterval && I != l ) 2252 { 2253 I = l 2254 } 2255 if( !H.guid ) 2256 { 2257 H.guid = this.guid++ 2258 } 2259 if( K !== g ) 2260 { 2261 var G = H; 2262 H = this.proxy( G ); 2263 H.data = K 2264 } 2265 var E = o.data( I, "events" ) || o.data( I, "events", {} ),J = o.data( I, "handle" ) || o.data( I, "handle", function() 2266 { 2267 return typeof o !== "undefined" && !o.event.triggered ? o.event.handle.apply( arguments.callee.elem, arguments ) : g 2268 } ); 2269 J.elem = I; 2270 o.each( F.split( /\s+/ ), function( M, N ) 2271 { 2272 var O = N.split( "." ); 2273 N = O.shift(); 2274 H.type = O.slice().sort().join( "." ); 2275 var L = E[N]; 2276 if( o.event.specialAll[N] ) 2277 { 2278 o.event.specialAll[N].setup.call( I, K, O ) 2279 } 2280 if( !L ) 2281 { 2282 L = E[N] = {}; 2283 if( !o.event.special[N] || o.event.special[N].setup.call( I, K, O ) === false ) 2284 { 2285 if( I.addEventListener ) 2286 { 2287 I.addEventListener( N, J, false ) 2288 } 2289 else 2290 { 2291 if( I.attachEvent ) 2292 { 2293 I.attachEvent( "on" + N, J ) 2294 } 2295 } 2296 } 2297 } 2298 L[H.guid] = H; 2299 o.event.global[N] = true 2300 } ); 2301 I = null 2302 },guid:1,global:{},remove:function( K, H, J ) 2303 { 2304 if( K.nodeType == 3 || K.nodeType == 8 ) 2305 { 2306 return 2307 } 2308 var G = o.data( K, "events" ),F,E; 2309 if( G ) 2310 { 2311 if( H === g || (typeof H === "string" && H.charAt( 0 ) == ".") ) 2312 { 2313 for( var I in G ) 2314 { 2315 this.remove( K, I + (H || "") ) 2316 } 2317 } 2318 else 2319 { 2320 if( H.type ) 2321 { 2322 J = H.handler; 2323 H = H.type 2324 } 2325 o.each( H.split( /\s+/ ), function( M, O ) 2326 { 2327 var Q = O.split( "." ); 2328 O = Q.shift(); 2329 var N = RegExp( "(^|\\.)" + Q.slice().sort().join( ".*\\." ) + "(\\.|$)" ); 2330 if( G[O] ) 2331 { 2332 if( J ) 2333 { 2334 delete G[O][J.guid] 2335 } 2336 else 2337 { 2338 for( var P in G[O] ) 2339 { 2340 if( N.test( G[O][P].type ) ) 2341 { 2342 delete G[O][P] 2343 } 2344 } 2345 } 2346 if( o.event.specialAll[O] ) 2347 { 2348 o.event.specialAll[O].teardown.call( K, Q ) 2349 } 2350 for( F in G[O] ) 2351 { 2352 break 2353 } 2354 if( !F ) 2355 { 2356 if( !o.event.special[O] || o.event.special[O].teardown.call( K, Q ) === false ) 2357 { 2358 if( K.removeEventListener ) 2359 { 2360 K.removeEventListener( O, o.data( K, "handle" ), false ) 2361 } 2362 else 2363 { 2364 if( K.detachEvent ) 2365 { 2366 K.detachEvent( "on" + O, o.data( K, "handle" ) ) 2367 } 2368 } 2369 } 2370 F = null; 2371 delete G[O] 2372 } 2373 } 2374 } ) 2375 } 2376 for( F in G ) 2377 { 2378 break 2379 } 2380 if( !F ) 2381 { 2382 var L = o.data( K, "handle" ); 2383 if( L ) 2384 { 2385 L.elem = null 2386 } 2387 o.removeData( K, "events" ); 2388 o.removeData( K, "handle" ) 2389 } 2390 } 2391 },trigger:function( I, K, H, E ) 2392 { 2393 var G = I.type || I; 2394 if( !E ) 2395 { 2396 I = typeof I === "object" ? I[h] ? I : o.extend( o.Event( G ), I ) : o.Event( G ); 2397 if( G.indexOf( "!" ) >= 0 ) 2398 { 2399 I.type = G = G.slice( 0, -1 ); 2400 I.exclusive = true 2401 } 2402 if( !H ) 2403 { 2404 I.stopPropagation(); 2405 if( this.global[G] ) 2406 { 2407 o.each( o.cache, function() 2408 { 2409 if( this.events && this.events[G] ) 2410 { 2411 o.event.trigger( I, K, this.handle.elem ) 2412 } 2413 } ) 2414 } 2415 } 2416 if( !H || H.nodeType == 3 || H.nodeType == 8 ) 2417 { 2418 return g 2419 } 2420 I.result = g; 2421 I.target = H; 2422 K = o.makeArray( K ); 2423 K.unshift( I ) 2424 } 2425 I.currentTarget = H; 2426 var J = o.data( H, "handle" ); 2427 if( J ) 2428 { 2429 J.apply( H, K ) 2430 } 2431 if( (!H[G] || (o.nodeName( H, "a" ) && G == "click")) && H["on" + G] && H["on" + G].apply( H, K ) === false ) 2432 { 2433 I.result = false 2434 } 2435 if( !E && H[G] && !I.isDefaultPrevented() && !(o.nodeName( H, "a" ) && G == "click") ) 2436 { 2437 this.triggered = true; 2438 try 2439 { 2440 H[G]() 2441 } 2442 catch( L ) 2443 { 2444 } 2445 } 2446 this.triggered = false; 2447 if( !I.isPropagationStopped() ) 2448 { 2449 var F = H.parentNode || H.ownerDocument; 2450 if( F ) 2451 { 2452 o.event.trigger( I, K, F, true ) 2453 } 2454 } 2455 },handle:function( K ) 2456 { 2457 var J,E; 2458 K = arguments[0] = o.event.fix( K || l.event ); 2459 K.currentTarget = this; 2460 var L = K.type.split( "." ); 2461 K.type = L.shift(); 2462 J = !L.length && !K.exclusive; 2463 var I = RegExp( "(^|\\.)" + L.slice().sort().join( ".*\\." ) + "(\\.|$)" ); 2464 E = (o.data( this, "events" ) || {})[K.type]; 2465 for( var G in E ) 2466 { 2467 var H = E[G]; 2468 if( J || I.test( H.type ) ) 2469 { 2470 K.handler = H; 2471 K.data = H.data; 2472 var F = H.apply( this, arguments ); 2473 if( F !== g ) 2474 { 2475 K.result = F; 2476 if( F === false ) 2477 { 2478 K.preventDefault(); 2479 K.stopPropagation() 2480 } 2481 } 2482 if( K.isImmediatePropagationStopped() ) 2483 { 2484 break 2485 } 2486 } 2487 } 2488 },props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split( " " ),fix:function( H ) 2489 { 2490 if( H[h] ) 2491 { 2492 return H 2493 } 2494 var F = H; 2495 H = o.Event( F ); 2496 for( var G = this.props.length,J; G; ) 2497 { 2498 J = this.props[--G]; 2499 H[J] = F[J] 2500 } 2501 if( !H.target ) 2502 { 2503 H.target = H.srcElement || document 2504 } 2505 if( H.target.nodeType == 3 ) 2506 { 2507 H.target = H.target.parentNode 2508 } 2509 if( !H.relatedTarget && H.fromElement ) 2510 { 2511 H.relatedTarget = H.fromElement == H.target ? H.toElement : H.fromElement 2512 } 2513 if( H.pageX == null && H.clientX != null ) 2514 { 2515 var I = document.documentElement,E = document.body; 2516 H.pageX = H.clientX + (I && I.scrollLeft || E && E.scrollLeft || 0) - (I.clientLeft || 0); 2517 H.pageY = H.clientY + (I && I.scrollTop || E && E.scrollTop || 0) - (I.clientTop || 0) 2518 } 2519 if( !H.which && ((H.charCode || H.charCode === 0) ? H.charCode : H.keyCode) ) 2520 { 2521 H.which = H.charCode || H.keyCode 2522 } 2523 if( !H.metaKey && H.ctrlKey ) 2524 { 2525 H.metaKey = H.ctrlKey 2526 } 2527 if( !H.which && H.button ) 2528 { 2529 H.which = (H.button & 1 ? 1 : (H.button & 2 ? 3 : (H.button & 4 ? 2 : 0))) 2530 } 2531 return H 2532 },proxy:function( F, E ) 2533 { 2534 E = E || function() 2535 { 2536 return F.apply( this, arguments ) 2537 }; 2538 E.guid = F.guid = F.guid || E.guid || this.guid++; 2539 return E 2540 },special:{ready:{setup:B,teardown:function() 2541 { 2542 }}},specialAll:{live:{setup:function( E, F ) 2543 { 2544 o.event.add( this, F[0], c ) 2545 },teardown:function( G ) 2546 { 2547 if( G.length ) 2548 { 2549 var E = 0,F = RegExp( "(^|\\.)" + G[0] + "(\\.|$)" ); 2550 o.each( (o.data( this, "events" ).live || {}), function() 2551 { 2552 if( F.test( this.type ) ) 2553 { 2554 E++ 2555 } 2556 } ); 2557 if( E < 1 ) 2558 { 2559 o.event.remove( this, G[0], c ) 2560 } 2561 } 2562 }}}}; 2563 o.Event = function( E ) 2564 { 2565 if( !this.preventDefault ) 2566 { 2567 return new o.Event( E ) 2568 } 2569 if( E && E.type ) 2570 { 2571 this.originalEvent = E; 2572 this.type = E.type 2573 } 2574 else 2575 { 2576 this.type = E 2577 } 2578 this.timeStamp = e(); 2579 this[h] = true 2580 }; 2581 function k() 2582 { 2583 return false 2584 } 2585 2586 function u() 2587 { 2588 return true 2589 } 2590 2591 o.Event.prototype = {preventDefault:function() 2592 { 2593 this.isDefaultPrevented = u; 2594 var E = this.originalEvent; 2595 if( !E ) 2596 { 2597 return 2598 } 2599 if( E.preventDefault ) 2600 { 2601 E.preventDefault() 2602 } 2603 E.returnValue = false 2604 },stopPropagation:function() 2605 { 2606 this.isPropagationStopped = u; 2607 var E = this.originalEvent; 2608 if( !E ) 2609 { 2610 return 2611 } 2612 if( E.stopPropagation ) 2613 { 2614 E.stopPropagation() 2615 } 2616 E.cancelBubble = true 2617 },stopImmediatePropagation:function() 2618 { 2619 this.isImmediatePropagationStopped = u; 2620 this.stopPropagation() 2621 },isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k}; 2622 var a = function( F ) 2623 { 2624 var E = F.relatedTarget; 2625 while( E && E != this ) 2626 { 2627 try 2628 { 2629 E = E.parentNode 2630 } 2631 catch( G ) 2632 { 2633 E = this 2634 } 2635 } 2636 if( E != this ) 2637 { 2638 F.type = F.data; 2639 o.event.handle.apply( this, arguments ) 2640 } 2641 }; 2642 o.each( {mouseover:"mouseenter",mouseout:"mouseleave"}, function( F, E ) 2643 { 2644 o.event.special[E] = {setup:function() 2645 { 2646 o.event.add( this, F, a, E ) 2647 },teardown:function() 2648 { 2649 o.event.remove( this, F, a ) 2650 }} 2651 } ); 2652 o.fn.extend( {bind:function( F, G, E ) 2653 { 2654 return F == "unload" ? this.one( F, G, E ) : this.each( function() 2655 { 2656 o.event.add( this, F, E || G, E && G ) 2657 } ) 2658 },one:function( G, H, F ) 2659 { 2660 var E = o.event.proxy( F || H, function( I ) 2661 { 2662 o( this ).unbind( I, E ); 2663 return(F || H).apply( this, arguments ) 2664 } ); 2665 return this.each( function() 2666 { 2667 o.event.add( this, G, E, F && H ) 2668 } ) 2669 },unbind:function( F, E ) 2670 { 2671 return this.each( function() 2672 { 2673 o.event.remove( this, F, E ) 2674 } ) 2675 },trigger:function( E, F ) 2676 { 2677 return this.each( function() 2678 { 2679 o.event.trigger( E, F, this ) 2680 } ) 2681 },triggerHandler:function( E, G ) 2682 { 2683 if( this[0] ) 2684 { 2685 var F = o.Event( E ); 2686 F.preventDefault(); 2687 F.stopPropagation(); 2688 o.event.trigger( F, G, this[0] ); 2689 return F.result 2690 } 2691 },toggle:function( G ) 2692 { 2693 var E = arguments,F = 1; 2694 while( F < E.length ) 2695 { 2696 o.event.proxy( G, E[F++] ) 2697 } 2698 return this.click( o.event.proxy( G, function( H ) 2699 { 2700 this.lastToggle = (this.lastToggle || 0) % F; 2701 H.preventDefault(); 2702 return E[this.lastToggle++].apply( this, arguments ) || false 2703 } ) ) 2704 },hover:function( E, F ) 2705 { 2706 return this.mouseenter( E ).mouseleave( F ) 2707 },ready:function( E ) 2708 { 2709 B(); 2710 if( o.isReady ) 2711 { 2712 E.call( document, o ) 2713 } 2714 else 2715 { 2716 o.readyList.push( E ) 2717 } 2718 return this 2719 },live:function( G, F ) 2720 { 2721 var E = o.event.proxy( F ); 2722 E.guid += this.selector + G; 2723 o( document ).bind( i( G, this.selector ), this.selector, E ); 2724 return this 2725 },die:function( F, E ) 2726 { 2727 o( document ).unbind( i( F, this.selector ), E ? {guid:E.guid + this.selector + F} : null ); 2728 return this 2729 }} ); 2730 function c( H ) 2731 { 2732 var E = RegExp( "(^|\\.)" + H.type + "(\\.|$)" ),G = true,F = []; 2733 o.each( o.data( this, "events" ).live || [], function( I, J ) 2734 { 2735 if( E.test( J.type ) ) 2736 { 2737 var K = o( H.target ).closest( J.data )[0]; 2738 if( K ) 2739 { 2740 F.push( {elem:K,fn:J} ) 2741 } 2742 } 2743 } ); 2744 F.sort( function( J, I ) 2745 { 2746 return o.data( J.elem, "closest" ) - o.data( I.elem, "closest" ) 2747 } ); 2748 o.each( F, function() 2749 { 2750 if( this.fn.call( this.elem, H, this.fn.data ) === false ) 2751 { 2752 return(G = false) 2753 } 2754 } ); 2755 return G 2756 } 2757 2758 function i( F, E ) 2759 { 2760 return["live",F,E.replace( /\./g, "`" ).replace( / /g, "|" )].join( "." ) 2761 } 2762 2763 o.extend( {isReady:false,readyList:[],ready:function() 2764 { 2765 if( !o.isReady ) 2766 { 2767 o.isReady = true; 2768 if( o.readyList ) 2769 { 2770 o.each( o.readyList, function() 2771 { 2772 this.call( document, o ) 2773 } ); 2774 o.readyList = null 2775 } 2776 o( document ).triggerHandler( "ready" ) 2777 } 2778 }} ); 2779 var x = false; 2780 2781 function B() 2782 { 2783 if( x ) 2784 { 2785 return 2786 } 2787 x = true; 2788 if( document.addEventListener ) 2789 { 2790 document.addEventListener( "DOMContentLoaded", function() 2791 { 2792 document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); 2793 o.ready() 2794 }, false ) 2795 } 2796 else 2797 { 2798 if( document.attachEvent ) 2799 { 2800 document.attachEvent( "onreadystatechange", function() 2801 { 2802 if( document.readyState === "complete" ) 2803 { 2804 document.detachEvent( "onreadystatechange", arguments.callee ); 2805 o.ready() 2806 } 2807 } ); 2808 if( document.documentElement.doScroll && l == l.top ) 2809 { 2810 (function() 2811 { 2812 if( o.isReady ) 2813 { 2814 return 2815 } 2816 try 2817 { 2818 document.documentElement.doScroll( "left" ) 2819 } 2820 catch( E ) 2821 { 2822 setTimeout( arguments.callee, 0 ); 2823 return 2824 } 2825 o.ready() 2826 })() 2827 } 2828 } 2829 } 2830 o.event.add( l, "load", o.ready ) 2831 } 2832 2833 o.each( ("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split( "," ), function( F, E ) 2834 { 2835 o.fn[E] = function( G ) 2836 { 2837 return G ? this.bind( E, G ) : this.trigger( E ) 2838 } 2839 } ); 2840 o( l ).bind( "unload", function() 2841 { 2842 for( var E in o.cache ) 2843 { 2844 if( E != 1 && o.cache[E].handle ) 2845 { 2846 o.event.remove( o.cache[E].handle.elem ) 2847 } 2848 } 2849 } ); 2850 (function() 2851 { 2852 o.support = {}; 2853 var F = document.documentElement,G = document.createElement( "script" ),K = document.createElement( "div" ),J = "script" + (new Date).getTime(); 2854 K.style.display = "none"; 2855 K.innerHTML = ' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>'; 2856 var H = K.getElementsByTagName( "*" ),E = K.getElementsByTagName( "a" )[0]; 2857 if( !H || !H.length || !E ) 2858 { 2859 return 2860 } 2861 o.support = {leadingWhitespace:K.firstChild.nodeType == 3,tbody:!K.getElementsByTagName( "tbody" ).length,objectAll:!!K.getElementsByTagName( "object" )[0].getElementsByTagName( "*" ).length,htmlSerialize:!!K.getElementsByTagName( "link" ).length,style:/red/.test( E.getAttribute( "style" ) ),hrefNormalized:E.getAttribute( "href" ) === "/a",opacity:E.style.opacity === "0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null}; 2862 G.type = "text/javascript"; 2863 try 2864 { 2865 G.appendChild( document.createTextNode( "window." + J + "=1;" ) ) 2866 } 2867 catch( I ) 2868 { 2869 } 2870 F.insertBefore( G, F.firstChild ); 2871 if( l[J] ) 2872 { 2873 o.support.scriptEval = true; 2874 delete l[J] 2875 } 2876 F.removeChild( G ); 2877 if( K.attachEvent && K.fireEvent ) 2878 { 2879 K.attachEvent( "onclick", function() 2880 { 2881 o.support.noCloneEvent = false; 2882 K.detachEvent( "onclick", arguments.callee ) 2883 } ); 2884 K.cloneNode( true ).fireEvent( "onclick" ) 2885 } 2886 o( function() 2887 { 2888 var L = document.createElement( "div" ); 2889 L.style.width = L.style.paddingLeft = "1px"; 2890 document.body.appendChild( L ); 2891 o.boxModel = o.support.boxModel = L.offsetWidth === 2; 2892 document.body.removeChild( L ).style.display = "none" 2893 } ) 2894 })(); 2895 var w = o.support.cssFloat ? "cssFloat" : "styleFloat"; 2896 o.props = {"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"}; 2897 o.fn.extend( {_load:o.fn.load,load:function( G, J, K ) 2898 { 2899 if( typeof G !== "string" ) 2900 { 2901 return this._load( G ) 2902 } 2903 var I = G.indexOf( " " ); 2904 if( I >= 0 ) 2905 { 2906 var E = G.slice( I, G.length ); 2907 G = G.slice( 0, I ) 2908 } 2909 var H = "GET"; 2910 if( J ) 2911 { 2912 if( o.isFunction( J ) ) 2913 { 2914 K = J; 2915 J = null 2916 } 2917 else 2918 { 2919 if( typeof J === "object" ) 2920 { 2921 J = o.param( J ); 2922 H = "POST" 2923 } 2924 } 2925 } 2926 var F = this; 2927 o.ajax( {url:G,type:H,dataType:"html",data:J,complete:function( M, L ) 2928 { 2929 if( L == "success" || L == "notmodified" ) 2930 { 2931 F.html( E ? o( "<div/>" ).append( M.responseText.replace( /<script(.|\s)*?\/script>/g, "" ) ).find( E ) : M.responseText ) 2932 } 2933 if( K ) 2934 { 2935 F.each( K, [M.responseText,L,M] ) 2936 } 2937 }} ); 2938 return this 2939 },serialize:function() 2940 { 2941 return o.param( this.serializeArray() ) 2942 },serializeArray:function() 2943 { 2944 return this.map( 2945 function() 2946 { 2947 return this.elements ? o.makeArray( this.elements ) : this 2948 } ).filter( 2949 function() 2950 { 2951 return this.name && !this.disabled && (this.checked || /select|textarea/i.test( this.nodeName ) || /text|hidden|password|search/i.test( this.type )) 2952 } ).map( 2953 function( E, F ) 2954 { 2955 var G = o( this ).val(); 2956 return G == null ? null : o.isArray( G ) ? o.map( G, function( I, H ) 2957 { 2958 return{name:F.name,value:I} 2959 } ) : {name:F.name,value:G} 2960 } ).get() 2961 }} ); 2962 o.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split( "," ), function( E, F ) 2963 { 2964 o.fn[F] = function( G ) 2965 { 2966 return this.bind( F, G ) 2967 } 2968 } ); 2969 var r = e(); 2970 o.extend( {get:function( E, G, H, F ) 2971 { 2972 if( o.isFunction( G ) ) 2973 { 2974 H = G; 2975 G = null 2976 } 2977 return o.ajax( {type:"GET",url:E,data:G,success:H,dataType:F} ) 2978 },getScript:function( E, F ) 2979 { 2980 return o.get( E, null, F, "script" ) 2981 },getJSON:function( E, F, G ) 2982 { 2983 return o.get( E, F, G, "json" ) 2984 },post:function( E, G, H, F ) 2985 { 2986 if( o.isFunction( G ) ) 2987 { 2988 H = G; 2989 G = {} 2990 } 2991 return o.ajax( {type:"POST",url:E,data:G,success:H,dataType:F} ) 2992 },ajaxSetup:function( E ) 2993 { 2994 o.extend( o.ajaxSettings, E ) 2995 },ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function() 2996 { 2997 return l.ActiveXObject ? new ActiveXObject( "Microsoft.XMLHTTP" ) : new XMLHttpRequest() 2998 },accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function( M ) 2999 { 3000 M = o.extend( true, M, o.extend( true, {}, o.ajaxSettings, M ) ); 3001 var W,F = /=\?(&|$)/g,R,V,G = M.type.toUpperCase(); 3002 if( M.data && M.processData && typeof M.data !== "string" ) 3003 { 3004 M.data = o.param( M.data ) 3005 } 3006 if( M.dataType == "jsonp" ) 3007 { 3008 if( G == "GET" ) 3009 { 3010 if( !M.url.match( F ) ) 3011 { 3012 M.url += (M.url.match( /\?/ ) ? "&" : "?") + (M.jsonp || "callback") + "=?" 3013 } 3014 } 3015 else 3016 { 3017 if( !M.data || !M.data.match( F ) ) 3018 { 3019 M.data = (M.data ? M.data + "&" : "") + (M.jsonp || "callback") + "=?" 3020 } 3021 } 3022 M.dataType = "json" 3023 } 3024 if( M.dataType == "json" && (M.data && M.data.match( F ) || M.url.match( F )) ) 3025 { 3026 W = "jsonp" + r++; 3027 if( M.data ) 3028 { 3029 M.data = (M.data + "").replace( F, "=" + W + "$1" ) 3030 } 3031 M.url = M.url.replace( F, "=" + W + "$1" ); 3032 M.dataType = "script"; 3033 l[W] = function( X ) 3034 { 3035 V = X; 3036 I(); 3037 L(); 3038 l[W] = g; 3039 try 3040 { 3041 delete l[W] 3042 } 3043 catch( Y ) 3044 { 3045 } 3046 if( H ) 3047 { 3048 H.removeChild( T ) 3049 } 3050 } 3051 } 3052 if( M.dataType == "script" && M.cache == null ) 3053 { 3054 M.cache = false 3055 } 3056 if( M.cache === false && G == "GET" ) 3057 { 3058 var E = e(); 3059 var U = M.url.replace( /(\?|&)_=.*?(&|$)/, "$1_=" + E + "$2" ); 3060 M.url = U + ((U == M.url) ? (M.url.match( /\?/ ) ? "&" : "?") + "_=" + E : "") 3061 } 3062 if( M.data && G == "GET" ) 3063 { 3064 M.url += (M.url.match( /\?/ ) ? "&" : "?") + M.data; 3065 M.data = null 3066 } 3067 if( M.global && !o.active++ ) 3068 { 3069 o.event.trigger( "ajaxStart" ) 3070 } 3071 var Q = /^(\w+:)?\/\/([^\/?#]+)/.exec( M.url ); 3072 if( M.dataType == "script" && G == "GET" && Q && (Q[1] && Q[1] != location.protocol || Q[2] != location.host) ) 3073 { 3074 var H = document.getElementsByTagName( "head" )[0]; 3075 var T = document.createElement( "script" ); 3076 T.src = M.url; 3077 if( M.scriptCharset ) 3078 { 3079 T.charset = M.scriptCharset 3080 } 3081 if( !W ) 3082 { 3083 var O = false; 3084 T.onload = T.onreadystatechange = function() 3085 { 3086 if( !O && (!this.readyState || this.readyState == "loaded" || this.readyState == "complete") ) 3087 { 3088 O = true; 3089 I(); 3090 L(); 3091 T.onload = T.onreadystatechange = null; 3092 H.removeChild( T ) 3093 } 3094 } 3095 } 3096 H.appendChild( T ); 3097 return g 3098 } 3099 var K = false; 3100 var J = M.xhr(); 3101 if( M.username ) 3102 { 3103 J.open( G, M.url, M.async, M.username, M.password ) 3104 } 3105 else 3106 { 3107 J.open( G, M.url, M.async ) 3108 } 3109 try 3110 { 3111 if( M.data ) 3112 { 3113 J.setRequestHeader( "Content-Type", M.contentType ) 3114 } 3115 if( M.ifModified ) 3116 { 3117 J.setRequestHeader( "If-Modified-Since", o.lastModified[M.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ) 3118 } 3119 J.setRequestHeader( "X-Requested-With", "XMLHttpRequest" ); 3120 J.setRequestHeader( "Accept", M.dataType && M.accepts[M.dataType] ? M.accepts[M.dataType] + ", */*" : M.accepts._default ) 3121 } 3122 catch( S ) 3123 { 3124 } 3125 if( M.beforeSend && M.beforeSend( J, M ) === false ) 3126 { 3127 if( M.global && !--o.active ) 3128 { 3129 o.event.trigger( "ajaxStop" ) 3130 } 3131 J.abort(); 3132 return false 3133 } 3134 if( M.global ) 3135 { 3136 o.event.trigger( "ajaxSend", [J,M] ) 3137 } 3138 var N = function( X ) 3139 { 3140 if( J.readyState == 0 ) 3141 { 3142 if( P ) 3143 { 3144 clearInterval( P ); 3145 P = null; 3146 if( M.global && !--o.active ) 3147 { 3148 o.event.trigger( "ajaxStop" ) 3149 } 3150 } 3151 } 3152 else 3153 { 3154 if( !K && J && (J.readyState == 4 || X == "timeout") ) 3155 { 3156 K = true; 3157 if( P ) 3158 { 3159 clearInterval( P ); 3160 P = null 3161 } 3162 R = X == "timeout" ? "timeout" : !o.httpSuccess( J ) ? "error" : M.ifModified && o.httpNotModified( J, M.url ) ? "notmodified" : "success"; 3163 if( R == "success" ) 3164 { 3165 try 3166 { 3167 V = o.httpData( J, M.dataType, M ) 3168 } 3169 catch( Z ) 3170 { 3171 R = "parsererror" 3172 } 3173 } 3174 if( R == "success" ) 3175 { 3176 var Y; 3177 try 3178 { 3179 Y = J.getResponseHeader( "Last-Modified" ) 3180 } 3181 catch( Z ) 3182 { 3183 } 3184 if( M.ifModified && Y ) 3185 { 3186 o.lastModified[M.url] = Y 3187 } 3188 if( !W ) 3189 { 3190 I() 3191 } 3192 } 3193 else 3194 { 3195 o.handleError( M, J, R ) 3196 } 3197 L(); 3198 if( X ) 3199 { 3200 J.abort() 3201 } 3202 if( M.async ) 3203 { 3204 J = null 3205 } 3206 } 3207 } 3208 }; 3209 if( M.async ) 3210 { 3211 var P = setInterval( N, 13 ); 3212 if( M.timeout > 0 ) 3213 { 3214 setTimeout( function() 3215 { 3216 if( J && !K ) 3217 { 3218 N( "timeout" ) 3219 } 3220 }, M.timeout ) 3221 } 3222 } 3223 try 3224 { 3225 J.send( M.data ) 3226 } 3227 catch( S ) 3228 { 3229 o.handleError( M, J, null, S ) 3230 } 3231 if( !M.async ) 3232 { 3233 N() 3234 } 3235 function I() 3236 { 3237 if( M.success ) 3238 { 3239 M.success( V, R ) 3240 } 3241 if( M.global ) 3242 { 3243 o.event.trigger( "ajaxSuccess", [J,M] ) 3244 } 3245 } 3246 3247 function L() 3248 { 3249 if( M.complete ) 3250 { 3251 M.complete( J, R ) 3252 } 3253 if( M.global ) 3254 { 3255 o.event.trigger( "ajaxComplete", [J,M] ) 3256 } 3257 if( M.global && !--o.active ) 3258 { 3259 o.event.trigger( "ajaxStop" ) 3260 } 3261 } 3262 3263 return J 3264 },handleError:function( F, H, E, G ) 3265 { 3266 if( F.error ) 3267 { 3268 F.error( H, E, G ) 3269 } 3270 if( F.global ) 3271 { 3272 o.event.trigger( "ajaxError", [H,F,G] ) 3273 } 3274 },active:0,httpSuccess:function( F ) 3275 { 3276 try 3277 { 3278 return !F.status && location.protocol == "file:" || (F.status >= 200 && F.status < 300) || F.status == 304 || F.status == 1223 3279 } 3280 catch( E ) 3281 { 3282 } 3283 return false 3284 },httpNotModified:function( G, E ) 3285 { 3286 try 3287 { 3288 var H = G.getResponseHeader( "Last-Modified" ); 3289 return G.status == 304 || H == o.lastModified[E] 3290 } 3291 catch( F ) 3292 { 3293 } 3294 return false 3295 },httpData:function( J, H, G ) 3296 { 3297 var F = J.getResponseHeader( "content-type" ),E = H == "xml" || !H && F && F.indexOf( "xml" ) >= 0,I = E ? J.responseXML : J.responseText; 3298 if( E && I.documentElement.tagName == "parsererror" ) 3299 { 3300 throw"parsererror" 3301 } 3302 if( G && G.dataFilter ) 3303 { 3304 I = G.dataFilter( I, H ) 3305 } 3306 if( typeof I === "string" ) 3307 { 3308 if( H == "script" ) 3309 { 3310 o.globalEval( I ) 3311 } 3312 if( H == "json" ) 3313 { 3314 I = l["eval"]( "(" + I + ")" ) 3315 } 3316 } 3317 return I 3318 },param:function( E ) 3319 { 3320 var G = []; 3321 3322 function H( I, J ) 3323 { 3324 G[G.length] = encodeURIComponent( I ) + "=" + encodeURIComponent( J ) 3325 } 3326 3327 if( o.isArray( E ) || E.jquery ) 3328 { 3329 o.each( E, function() 3330 { 3331 H( this.name, this.value ) 3332 } ) 3333 } 3334 else 3335 { 3336 for( var F in E ) 3337 { 3338 if( o.isArray( E[F] ) ) 3339 { 3340 o.each( E[F], function() 3341 { 3342 H( F, this ) 3343 } ) 3344 } 3345 else 3346 { 3347 H( F, o.isFunction( E[F] ) ? E[F]() : E[F] ) 3348 } 3349 } 3350 } 3351 return G.join( "&" ).replace( /%20/g, "+" ) 3352 }} ); 3353 var m = {},n,d = [ 3354 ["height","marginTop","marginBottom","paddingTop","paddingBottom"], 3355 ["width","marginLeft","marginRight","paddingLeft","paddingRight"], 3356 ["opacity"] 3357 ]; 3358 3359 function t( F, E ) 3360 { 3361 var G = {}; 3362 o.each( d.concat.apply( [], d.slice( 0, E ) ), function() 3363 { 3364 G[this] = F 3365 } ); 3366 return G 3367 } 3368 3369 o.fn.extend( {show:function( J, L ) 3370 { 3371 if( J ) 3372 { 3373 return this.animate( t( "show", 3 ), J, L ) 3374 } 3375 else 3376 { 3377 for( var H = 0,F = this.length; H < F; H++ ) 3378 { 3379 var E = o.data( this[H], "olddisplay" ); 3380 this[H].style.display = E || ""; 3381 if( o.css( this[H], "display" ) === "none" ) 3382 { 3383 var G = this[H].tagName,K; 3384 if( m[G] ) 3385 { 3386 K = m[G] 3387 } 3388 else 3389 { 3390 var I = o( "<" + G + " />" ).appendTo( "body" ); 3391 K = I.css( "display" ); 3392 if( K === "none" ) 3393 { 3394 K = "block" 3395 } 3396 I.remove(); 3397 m[G] = K 3398 } 3399 o.data( this[H], "olddisplay", K ) 3400 } 3401 } 3402 for( var H = 0,F = this.length; H < F; H++ ) 3403 { 3404 this[H].style.display = o.data( this[H], "olddisplay" ) || "" 3405 } 3406 return this 3407 } 3408 },hide:function( H, I ) 3409 { 3410 if( H ) 3411 { 3412 return this.animate( t( "hide", 3 ), H, I ) 3413 } 3414 else 3415 { 3416 for( var G = 0,F = this.length; G < F; G++ ) 3417 { 3418 var E = o.data( this[G], "olddisplay" ); 3419 if( !E && E !== "none" ) 3420 { 3421 o.data( this[G], "olddisplay", o.css( this[G], "display" ) ) 3422 } 3423 } 3424 for( var G = 0,F = this.length; G < F; G++ ) 3425 { 3426 this[G].style.display = "none" 3427 } 3428 return this 3429 } 3430 },_toggle:o.fn.toggle,toggle:function( G, F ) 3431 { 3432 var E = typeof G === "boolean"; 3433 return o.isFunction( G ) && o.isFunction( F ) ? this._toggle.apply( this, arguments ) : G == null || E ? this.each( function() 3434 { 3435 var H = E ? G : o( this ).is( ":hidden" ); 3436 o( this )[H ? "show" : "hide"]() 3437 } ) : this.animate( t( "toggle", 3 ), G, F ) 3438 },fadeTo:function( E, G, F ) 3439 { 3440 return this.animate( {opacity:G}, E, F ) 3441 },animate:function( I, F, H, G ) 3442 { 3443 var E = o.speed( F, H, G ); 3444 return this[E.queue === false ? "each" : "queue"]( function() 3445 { 3446 var K = o.extend( {}, E ),M,L = this.nodeType == 1 && o( this ).is( ":hidden" ),J = this; 3447 for( M in I ) 3448 { 3449 if( I[M] == "hide" && L || I[M] == "show" && !L ) 3450 { 3451 return K.complete.call( this ) 3452 } 3453 if( (M == "height" || M == "width") && this.style ) 3454 { 3455 K.display = o.css( this, "display" ); 3456 K.overflow = this.style.overflow 3457 } 3458 } 3459 if( K.overflow != null ) 3460 { 3461 this.style.overflow = "hidden" 3462 } 3463 K.curAnim = o.extend( {}, I ); 3464 o.each( I, function( O, S ) 3465 { 3466 var R = new o.fx( J, K, O ); 3467 if( /toggle|show|hide/.test( S ) ) 3468 { 3469 R[S == "toggle" ? L ? "show" : "hide" : S]( I ) 3470 } 3471 else 3472 { 3473 var Q = S.toString().match( /^([+-]=)?([\d+-.]+)(.*)$/ ),T = R.cur( true ) || 0; 3474 if( Q ) 3475 { 3476 var N = parseFloat( Q[2] ),P = Q[3] || "px"; 3477 if( P != "px" ) 3478 { 3479 J.style[O] = (N || 1) + P; 3480 T = ((N || 1) / R.cur( true )) * T; 3481 J.style[O] = T + P 3482 } 3483 if( Q[1] ) 3484 { 3485 N = ((Q[1] == "-=" ? -1 : 1) * N) + T 3486 } 3487 R.custom( T, N, P ) 3488 } 3489 else 3490 { 3491 R.custom( T, S, "" ) 3492 } 3493 } 3494 } ); 3495 return true 3496 } ) 3497 },stop:function( F, E ) 3498 { 3499 var G = o.timers; 3500 if( F ) 3501 { 3502 this.queue( [] ) 3503 } 3504 this.each( function() 3505 { 3506 for( var H = G.length - 1; H >= 0; H-- ) 3507 { 3508 if( G[H].elem == this ) 3509 { 3510 if( E ) 3511 { 3512 G[H]( true ) 3513 } 3514 G.splice( H, 1 ) 3515 } 3516 } 3517 } ); 3518 if( !E ) 3519 { 3520 this.dequeue() 3521 } 3522 return this 3523 }} ); 3524 o.each( {slideDown:t( "show", 1 ),slideUp:t( "hide", 1 ),slideToggle:t( "toggle", 1 ),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}}, function( E, F ) 3525 { 3526 o.fn[E] = function( G, H ) 3527 { 3528 return this.animate( F, G, H ) 3529 } 3530 } ); 3531 o.extend( {speed:function( G, H, F ) 3532 { 3533 var E = typeof G === "object" ? G : {complete:F || !F && H || o.isFunction( G ) && G,duration:G,easing:F && H || H && !o.isFunction( H ) && H}; 3534 E.duration = o.fx.off ? 0 : typeof E.duration === "number" ? E.duration : o.fx.speeds[E.duration] || o.fx.speeds._default; 3535 E.old = E.complete; 3536 E.complete = function() 3537 { 3538 if( E.queue !== false ) 3539 { 3540 o( this ).dequeue() 3541 } 3542 if( o.isFunction( E.old ) ) 3543 { 3544 E.old.call( this ) 3545 } 3546 }; 3547 return E 3548 },easing:{linear:function( G, H, E, F ) 3549 { 3550 return E + F * G 3551 },swing:function( G, H, E, F ) 3552 { 3553 return((-Math.cos( G * Math.PI ) / 2) + 0.5) * F + E 3554 }},timers:[],fx:function( F, E, G ) 3555 { 3556 this.options = E; 3557 this.elem = F; 3558 this.prop = G; 3559 if( !E.orig ) 3560 { 3561 E.orig = {} 3562 } 3563 }} ); 3564 o.fx.prototype = {update:function() 3565 { 3566 if( this.options.step ) 3567 { 3568 this.options.step.call( this.elem, this.now, this ) 3569 } 3570 (o.fx.step[this.prop] || o.fx.step._default)( this ); 3571 if( (this.prop == "height" || this.prop == "width") && this.elem.style ) 3572 { 3573 this.elem.style.display = "block" 3574 } 3575 },cur:function( F ) 3576 { 3577 if( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) 3578 { 3579 return this.elem[this.prop] 3580 } 3581 var E = parseFloat( o.css( this.elem, this.prop, F ) ); 3582 return E && E > -10000 ? E : parseFloat( o.curCSS( this.elem, this.prop ) ) || 0 3583 },custom:function( I, H, G ) 3584 { 3585 this.startTime = e(); 3586 this.start = I; 3587 this.end = H; 3588 this.unit = G || this.unit || "px"; 3589 this.now = this.start; 3590 this.pos = this.state = 0; 3591 var E = this; 3592 3593 function F( J ) 3594 { 3595 return E.step( J ) 3596 } 3597 3598 F.elem = this.elem; 3599 if( F() && o.timers.push( F ) && !n ) 3600 { 3601 n = setInterval( function() 3602 { 3603 var K = o.timers; 3604 for( var J = 0; J < K.length; J++ ) 3605 { 3606 if( !K[J]() ) 3607 { 3608 K.splice( J--, 1 ) 3609 } 3610 } 3611 if( !K.length ) 3612 { 3613 clearInterval( n ); 3614 n = g 3615 } 3616 }, 13 ) 3617 } 3618 },show:function() 3619 { 3620 this.options.orig[this.prop] = o.attr( this.elem.style, this.prop ); 3621 this.options.show = true; 3622 this.custom( this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur() ); 3623 o( this.elem ).show() 3624 },hide:function() 3625 { 3626 this.options.orig[this.prop] = o.attr( this.elem.style, this.prop ); 3627 this.options.hide = true; 3628 this.custom( this.cur(), 0 ) 3629 },step:function( H ) 3630 { 3631 var G = e(); 3632 if( H || G >= this.options.duration + this.startTime ) 3633 { 3634 this.now = this.end; 3635 this.pos = this.state = 1; 3636 this.update(); 3637 this.options.curAnim[this.prop] = true; 3638 var E = true; 3639 for( var F in this.options.curAnim ) 3640 { 3641 if( this.options.curAnim[F] !== true ) 3642 { 3643 E = false 3644 } 3645 } 3646 if( E ) 3647 { 3648 if( this.options.display != null ) 3649 { 3650 this.elem.style.overflow = this.options.overflow; 3651 this.elem.style.display = this.options.display; 3652 if( o.css( this.elem, "display" ) == "none" ) 3653 { 3654 this.elem.style.display = "block" 3655 } 3656 } 3657 if( this.options.hide ) 3658 { 3659 o( this.elem ).hide() 3660 } 3661 if( this.options.hide || this.options.show ) 3662 { 3663 for( var I in this.options.curAnim ) 3664 { 3665 o.attr( this.elem.style, I, this.options.orig[I] ) 3666 } 3667 } 3668 this.options.complete.call( this.elem ) 3669 } 3670 return false 3671 } 3672 else 3673 { 3674 var J = G - this.startTime; 3675 this.state = J / this.options.duration; 3676 this.pos = o.easing[this.options.easing || (o.easing.swing ? "swing" : "linear")]( this.state, J, 0, 1, this.options.duration ); 3677 this.now = this.start + ((this.end - this.start) * this.pos); 3678 this.update() 3679 } 3680 return true 3681 }}; 3682 o.extend( o.fx, {speeds:{slow:600,fast:200,_default:400},step:{opacity:function( E ) 3683 { 3684 o.attr( E.elem.style, "opacity", E.now ) 3685 },_default:function( E ) 3686 { 3687 if( E.elem.style && E.elem.style[E.prop] != null ) 3688 { 3689 E.elem.style[E.prop] = E.now + E.unit 3690 } 3691 else 3692 { 3693 E.elem[E.prop] = E.now 3694 } 3695 }}} ); 3696 if( document.documentElement.getBoundingClientRect ) 3697 { 3698 o.fn.offset = function() 3699 { 3700 if( !this[0] ) 3701 { 3702 return{top:0,left:0} 3703 } 3704 if( this[0] === this[0].ownerDocument.body ) 3705 { 3706 return o.offset.bodyOffset( this[0] ) 3707 } 3708 var G = this[0].getBoundingClientRect(),J = this[0].ownerDocument,F = J.body,E = J.documentElement,L = E.clientTop || F.clientTop || 0,K = E.clientLeft || F.clientLeft || 0,I = G.top + (self.pageYOffset || o.boxModel && E.scrollTop || F.scrollTop) - L,H = G.left + (self.pageXOffset || o.boxModel && E.scrollLeft || F.scrollLeft) - K; 3709 return{top:I,left:H} 3710 } 3711 } 3712 else 3713 { 3714 o.fn.offset = function() 3715 { 3716 if( !this[0] ) 3717 { 3718 return{top:0,left:0} 3719 } 3720 if( this[0] === this[0].ownerDocument.body ) 3721 { 3722 return o.offset.bodyOffset( this[0] ) 3723 } 3724 o.offset.initialized || o.offset.initialize(); 3725 var J = this[0],G = J.offsetParent,F = J,O = J.ownerDocument,M,H = O.documentElement,K = O.body,L = O.defaultView,E = L.getComputedStyle( J, null ),N = J.offsetTop,I = J.offsetLeft; 3726 while( (J = J.parentNode) && J !== K && J !== H ) 3727 { 3728 M = L.getComputedStyle( J, null ); 3729 N -= J.scrollTop,I -= J.scrollLeft; 3730 if( J === G ) 3731 { 3732 N += J.offsetTop,I += J.offsetLeft; 3733 if( o.offset.doesNotAddBorder && !(o.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test( J.tagName )) ) 3734 { 3735 N += parseInt( M.borderTopWidth, 10 ) || 0,I += parseInt( M.borderLeftWidth, 10 ) || 0 3736 } 3737 F = G,G = J.offsetParent 3738 } 3739 if( o.offset.subtractsBorderForOverflowNotVisible && M.overflow !== "visible" ) 3740 { 3741 N += parseInt( M.borderTopWidth, 10 ) || 0,I += parseInt( M.borderLeftWidth, 10 ) || 0 3742 } 3743 E = M 3744 } 3745 if( E.position === "relative" || E.position === "static" ) 3746 { 3747 N += K.offsetTop,I += K.offsetLeft 3748 } 3749 if( E.position === "fixed" ) 3750 { 3751 N += Math.max( H.scrollTop, K.scrollTop ),I += Math.max( H.scrollLeft, K.scrollLeft ) 3752 } 3753 return{top:N,left:I} 3754 } 3755 } 3756 o.offset = {initialize:function() 3757 { 3758 if( this.initialized ) 3759 { 3760 return 3761 } 3762 var L = document.body,F = document.createElement( "div" ),H,G,N,I,M,E,J = L.style.marginTop,K = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>'; 3763 M = {position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}; 3764 for( E in M ) 3765 { 3766 F.style[E] = M[E] 3767 } 3768 F.innerHTML = K; 3769 L.insertBefore( F, L.firstChild ); 3770 H = F.firstChild,G = H.firstChild,I = H.nextSibling.firstChild.firstChild; 3771 this.doesNotAddBorder = (G.offsetTop !== 5); 3772 this.doesAddBorderForTableAndCells = (I.offsetTop === 5); 3773 H.style.overflow = "hidden",H.style.position = "relative"; 3774 this.subtractsBorderForOverflowNotVisible = (G.offsetTop === -5); 3775 L.style.marginTop = "1px"; 3776 this.doesNotIncludeMarginInBodyOffset = (L.offsetTop === 0); 3777 L.style.marginTop = J; 3778 L.removeChild( F ); 3779 this.initialized = true 3780 },bodyOffset:function( E ) 3781 { 3782 o.offset.initialized || o.offset.initialize(); 3783 var G = E.offsetTop,F = E.offsetLeft; 3784 if( o.offset.doesNotIncludeMarginInBodyOffset ) 3785 { 3786 G += parseInt( o.curCSS( E, "marginTop", true ), 10 ) || 0,F += parseInt( o.curCSS( E, "marginLeft", true ), 10 ) || 0 3787 } 3788 return{top:G,left:F} 3789 }}; 3790 o.fn.extend( {position:function() 3791 { 3792 var I = 0,H = 0,F; 3793 if( this[0] ) 3794 { 3795 var G = this.offsetParent(),J = this.offset(),E = /^body|html$/i.test( G[0].tagName ) ? {top:0,left:0} : G.offset(); 3796 J.top -= j( this, "marginTop" ); 3797 J.left -= j( this, "marginLeft" ); 3798 E.top += j( G, "borderTopWidth" ); 3799 E.left += j( G, "borderLeftWidth" ); 3800 F = {top:J.top - E.top,left:J.left - E.left} 3801 } 3802 return F 3803 },offsetParent:function() 3804 { 3805 var E = this[0].offsetParent || document.body; 3806 while( E && (!/^body|html$/i.test( E.tagName ) && o.css( E, "position" ) == "static") ) 3807 { 3808 E = E.offsetParent 3809 } 3810 return o( E ) 3811 }} ); 3812 o.each( ["Left","Top"], function( F, E ) 3813 { 3814 var G = "scroll" + E; 3815 o.fn[G] = function( H ) 3816 { 3817 if( !this[0] ) 3818 { 3819 return null 3820 } 3821 return H !== g ? this.each( function() 3822 { 3823 this == l || this == document ? l.scrollTo( !F ? H : o( l ).scrollLeft(), F ? H : o( l ).scrollTop() ) : this[G] = H 3824 } ) : this[0] == l || this[0] == document ? self[F ? "pageYOffset" : "pageXOffset"] || o.boxModel && document.documentElement[G] || document.body[G] : this[0][G] 3825 } 3826 } ); 3827 o.each( ["Height","Width"], function( I, G ) 3828 { 3829 var E = I ? "Left" : "Top",H = I ? "Right" : "Bottom",F = G.toLowerCase(); 3830 o.fn["inner" + G] = function() 3831 { 3832 return this[0] ? o.css( this[0], F, false, "padding" ) : null 3833 }; 3834 o.fn["outer" + G] = function( K ) 3835 { 3836 return this[0] ? o.css( this[0], F, false, K ? "margin" : "border" ) : null 3837 }; 3838 var J = G.toLowerCase(); 3839 o.fn[J] = function( K ) 3840 { 3841 return this[0] == l ? document.compatMode == "CSS1Compat" && document.documentElement["client" + G] || document.body["client" + G] : this[0] == document ? Math.max( document.documentElement["client" + G], document.body["scroll" + G], document.documentElement["scroll" + G], document.body["offset" + G], document.documentElement["offset" + G] ) : K === g ? (this.length ? o.css( this[0], J ) : null) : this.css( J, typeof K === "string" ? K : K + "px" ) 3842 } 3843 } ) 3844 })(); -
ether_megapoli/trunk/web/resources/js/library/prototype.js
r131 r226 7 7 *--------------------------------------------------------------------------*/ 8 8 var Prototype = { 9 Version: '1.6.0.3', 10 11 Browser: { 12 IE: !!(window.attachEvent && 13 navigator.userAgent.indexOf('Opera') === -1), 14 Opera: navigator.userAgent.indexOf('Opera') > -1, 15 WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, 16 Gecko: navigator.userAgent.indexOf('Gecko') > -1 && 17 navigator.userAgent.indexOf('KHTML') === -1, 18 MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) 19 }, 20 21 BrowserFeatures: { 22 XPath: !!document.evaluate, 23 SelectorsAPI: !!document.querySelector, 24 ElementExtensions: !!window.HTMLElement, 25 SpecificElementExtensions: 26 document.createElement('div')['__proto__'] && 27 document.createElement('div')['__proto__'] !== 28 document.createElement('form')['__proto__'] 29 }, 30 31 ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', 32 JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, 33 34 emptyFunction: function() { }, 35 K: function(x) { return x } 9 Version: '1.6.0.3', 10 11 Browser: { 12 IE: !!(window.attachEvent && 13 navigator.userAgent.indexOf( 'Opera' ) === -1), 14 Opera: navigator.userAgent.indexOf( 'Opera' ) > -1, 15 WebKit: navigator.userAgent.indexOf( 'AppleWebKit/' ) > -1, 16 Gecko: navigator.userAgent.indexOf( 'Gecko' ) > -1 && 17 navigator.userAgent.indexOf( 'KHTML' ) === -1, 18 MobileSafari: !!navigator.userAgent.match( /Apple.*Mobile.*Safari/ ) 19 }, 20 21 BrowserFeatures: { 22 XPath: !!document.evaluate, 23 SelectorsAPI: !!document.querySelector, 24 ElementExtensions: !!window.HTMLElement, 25 SpecificElementExtensions: 26 document.createElement( 'div' )['__proto__'] && 27 document.createElement( 'div' )['__proto__'] !== 28 document.createElement( 'form' )['__proto__'] 29 }, 30 31 ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', 32 JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, 33 34 emptyFunction: function() 35 { 36 }, 37 K: function( x ) 38 { 39 return x 40 } 36 41 }; 37 42 38 if (Prototype.Browser.MobileSafari)39 Prototype.BrowserFeatures.SpecificElementExtensions = false;43 if( Prototype.Browser.MobileSafari ) 44 Prototype.BrowserFeatures.SpecificElementExtensions = false; 40 45 41 46 42 47 /* Based on Alex Arnell's inheritance implementation. */ 43 48 var Class = { 44 create: function() { 45 var parent = null, properties = $A(arguments); 46 if (Object.isFunction(properties[0])) 47 parent = properties.shift(); 48 49 function klass() { 50 this.initialize.apply(this, arguments); 51 } 52 53 Object.extend(klass, Class.Methods); 54 klass.superclass = parent; 55 klass.subclasses = []; 56 57 if (parent) { 58 var subclass = function() { }; 59 subclass.prototype = parent.prototype; 60 klass.prototype = new subclass; 61 parent.subclasses.push(klass); 62 } 63 64 for (var i = 0; i < properties.length; i++) 65 klass.addMethods(properties[i]); 66 67 if (!klass.prototype.initialize) 68 klass.prototype.initialize = Prototype.emptyFunction; 69 70 klass.prototype.constructor = klass; 71 72 return klass; 73 } 49 create: function() 50 { 51 var parent = null, properties = $A( arguments ); 52 if( Object.isFunction( properties[0] ) ) 53 parent = properties.shift(); 54 55 function klass() 56 { 57 this.initialize.apply( this, arguments ); 58 } 59 60 Object.extend( klass, Class.Methods ); 61 klass.superclass = parent; 62 klass.subclasses = []; 63 64 if( parent ) 65 { 66 var subclass = function() 67 { 68 }; 69 subclass.prototype = parent.prototype; 70 klass.prototype = new subclass; 71 parent.subclasses.push( klass ); 72 } 73 74 for( var i = 0; i < properties.length; i++ ) 75 klass.addMethods( properties[i] ); 76 77 if( !klass.prototype.initialize ) 78 klass.prototype.initialize = Prototype.emptyFunction; 79 80 klass.prototype.constructor = klass; 81 82 return klass; 83 } 74 84 }; 75 85 76 86 Class.Methods = { 77 addMethods: function(source) { 78 var ancestor = this.superclass && this.superclass.prototype; 79 var properties = Object.keys(source); 80 81 if (!Object.keys({ toString: true }).length) 82 properties.push("toString", "valueOf"); 83 84 for (var i = 0, length = properties.length; i < length; i++) { 85 var property = properties[i], value = source[property]; 86 if (ancestor && Object.isFunction(value) && 87 value.argumentNames().first() == "$super") { 88 var method = value; 89 value = (function(m) { 90 return function() { return ancestor[m].apply(this, arguments) }; 91 })(property).wrap(method); 92 93 value.valueOf = method.valueOf.bind(method); 94 value.toString = method.toString.bind(method); 95 } 96 this.prototype[property] = value; 97 } 98 99 return this; 100 } 87 addMethods: function( source ) 88 { 89 var ancestor = this.superclass && this.superclass.prototype; 90 var properties = Object.keys( source ); 91 92 if( !Object.keys( { toString: true } ).length ) 93 properties.push( "toString", "valueOf" ); 94 95 for( var i = 0, length = properties.length; i < length; i++ ) 96 { 97 var property = properties[i], value = source[property]; 98 if( ancestor && Object.isFunction( value ) && 99 value.argumentNames().first() == "$super" ) 100 { 101 var method = value; 102 value = (function( m ) 103 { 104 return function() 105 { 106 return ancestor[m].apply( this, arguments ) 107 }; 108 })( property ).wrap( method ); 109 110 value.valueOf = method.valueOf.bind( method ); 111 value.toString = method.toString.bind( method ); 112 } 113 this.prototype[property] = value; 114 } 115 116 return this; 117 } 101 118 }; 102 119 103 120 var Abstract = { }; 104 121 105 Object.extend = function(destination, source) { 106 for (var property in source) 107 destination[property] = source[property]; 108 return destination; 122 Object.extend = function( destination, source ) 123 { 124 for( var property in source ) 125 destination[property] = source[property]; 126 return destination; 109 127 }; 110 128 111 Object.extend(Object, { 112 inspect: function(object) { 113 try { 114 if (Object.isUndefined(object)) return 'undefined'; 115 if (object === null) return 'null'; 116 return object.inspect ? object.inspect() : String(object); 117 } catch (e) { 118 if (e instanceof RangeError) return '...'; 119 throw e; 120 } 121 }, 122 123 toJSON: function(object) { 124 var type = typeof object; 125 switch (type) { 126 case 'undefined': 127 case 'function': 128 case 'unknown': return; 129 case 'boolean': return object.toString(); 130 } 131 132 if (object === null) return 'null'; 133 if (object.toJSON) return object.toJSON(); 134 if (Object.isElement(object)) return; 135 136 var results = []; 137 for (var property in object) { 138 var value = Object.toJSON(object[property]); 139 if (!Object.isUndefined(value)) 140 results.push(property.toJSON() + ': ' + value); 141 } 142 143 return '{' + results.join(', ') + '}'; 144 }, 145 146 toQueryString: function(object) { 147 return $H(object).toQueryString(); 148 }, 149 150 toHTML: function(object) { 151 return object && object.toHTML ? object.toHTML() : String.interpret(object); 152 }, 153 154 keys: function(object) { 155 var keys = []; 156 for (var property in object) 157 keys.push(property); 158 return keys; 159 }, 160 161 values: function(object) { 162 var values = []; 163 for (var property in object) 164 values.push(object[property]); 165 return values; 166 }, 167 168 clone: function(object) { 169 return Object.extend({ }, object); 170 }, 171 172 isElement: function(object) { 173 return !!(object && object.nodeType == 1); 174 }, 175 176 isArray: function(object) { 177 return object != null && typeof object == "object" && 178 'splice' in object && 'join' in object; 179 }, 180 181 isHash: function(object) { 182 return object instanceof Hash; 183 }, 184 185 isFunction: function(object) { 186 return typeof object == "function"; 187 }, 188 189 isString: function(object) { 190 return typeof object == "string"; 191 }, 192 193 isNumber: function(object) { 194 return typeof object == "number"; 195 }, 196 197 isUndefined: function(object) { 198 return typeof object == "undefined"; 199 } 200 }); 201 202 Object.extend(Function.prototype, { 203 argumentNames: function() { 204 var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1] 205 .replace(/\s+/g, '').split(','); 206 return names.length == 1 && !names[0] ? [] : names; 207 }, 208 209 bind: function() { 210 if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; 211 var __method = this, args = $A(arguments), object = args.shift(); 212 return function() { 213 return __method.apply(object, args.concat($A(arguments))); 214 } 215 }, 216 217 bindAsEventListener: function() { 218 var __method = this, args = $A(arguments), object = args.shift(); 219 return function(event) { 220 return __method.apply(object, [event || window.event].concat(args)); 221 } 222 }, 223 224 curry: function() { 225 if (!arguments.length) return this; 226 var __method = this, args = $A(arguments); 227 return function() { 228 return __method.apply(this, args.concat($A(arguments))); 229 } 230 }, 231 232 delay: function() { 233 var __method = this, args = $A(arguments), timeout = args.shift() * 1000; 234 return window.setTimeout(function() { 235 return __method.apply(__method, args); 236 }, timeout); 237 }, 238 239 defer: function() { 240 var args = [0.01].concat($A(arguments)); 241 return this.delay.apply(this, args); 242 }, 243 244 wrap: function(wrapper) { 245 var __method = this; 246 return function() { 247 return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); 248 } 249 }, 250 251 methodize: function() { 252 if (this._methodized) return this._methodized; 253 var __method = this; 254 return this._methodized = function() { 255 return __method.apply(null, [this].concat($A(arguments))); 129 Object.extend( Object, { 130 inspect: function( object ) 131 { 132 try 133 { 134 if( Object.isUndefined( object ) ) return 'undefined'; 135 if( object === null ) return 'null'; 136 return object.inspect ? object.inspect() : String( object ); 137 } 138 catch ( e ) 139 { 140 if( e instanceof RangeError ) return '...'; 141 throw e; 142 } 143 }, 144 145 toJSON: function( object ) 146 { 147 var type = typeof object; 148 switch( type ) 149 { 150 case 'undefined': 151 case 'function': 152 case 'unknown': return; 153 case 'boolean': return object.toString(); 154 } 155 156 if( object === null ) return 'null'; 157 if( object.toJSON ) return object.toJSON(); 158 if( Object.isElement( object ) ) return; 159 160 var results = []; 161 for( var property in object ) 162 { 163 var value = Object.toJSON( object[property] ); 164 if( !Object.isUndefined( value ) ) 165 results.push( property.toJSON() + ': ' + value ); 166 } 167 168 return '{' + results.join( ', ' ) + '}'; 169 }, 170 171 toQueryString: function( object ) 172 { 173 return $H( object ).toQueryString(); 174 }, 175 176 toHTML: function( object ) 177 { 178 return object && object.toHTML ? object.toHTML() : String.interpret( object ); 179 }, 180 181 keys: function( object ) 182 { 183 var keys = []; 184 for( var property in object ) 185 keys.push( property ); 186 return keys; 187 }, 188 189 values: function( object ) 190 { 191 var values = []; 192 for( var property in object ) 193 values.push( object[property] ); 194 return values; 195 }, 196 197 clone: function( object ) 198 { 199 return Object.extend( { }, object ); 200 }, 201 202 isElement: function( object ) 203 { 204 return !!(object && object.nodeType == 1); 205 }, 206 207 isArray: function( object ) 208 { 209 return object != null && typeof object == "object" && 210 'splice' in object && 'join' in object; 211 }, 212 213 isHash: function( object ) 214 { 215 return object instanceof Hash; 216 }, 217 218 isFunction: function( object ) 219 { 220 return typeof object == "function"; 221 }, 222 223 isString: function( object ) 224 { 225 return typeof object == "string"; 226 }, 227 228 isNumber: function( object ) 229 { 230 return typeof object == "number"; 231 }, 232 233 isUndefined: function( object ) 234 { 235 return typeof object == "undefined"; 236 } 237 } ); 238 239 Object.extend( Function.prototype, { 240 argumentNames: function() 241 { 242 var names = this.toString().match( /^[\s\(]*function[^(]*\(([^\)]*)\)/ )[1] 243 .replace( /\s+/g, '' ).split( ',' ); 244 return names.length == 1 && !names[0] ? [] : names; 245 }, 246 247 bind: function() 248 { 249 if( arguments.length < 2 && Object.isUndefined( arguments[0] ) ) return this; 250 var __method = this, args = $A( arguments ), object = args.shift(); 251 return function() 252 { 253 return __method.apply( object, args.concat( $A( arguments ) ) ); 254 } 255 }, 256 257 bindAsEventListener: function() 258 { 259 var __method = this, args = $A( arguments ), object = args.shift(); 260 return function( event ) 261 { 262 return __method.apply( object, [event || window.event].concat( args ) ); 263 } 264 }, 265 266 curry: function() 267 { 268 if( !arguments.length ) return this; 269 var __method = this, args = $A( arguments ); 270 return function() 271 { 272 return __method.apply( this, args.concat( $A( arguments ) ) ); 273 } 274 }, 275 276 delay: function() 277 { 278 var __method = this, args = $A( arguments ), timeout = args.shift() * 1000; 279 return window.setTimeout( function() 280 { 281 return __method.apply( __method, args ); 282 }, timeout ); 283 }, 284 285 defer: function() 286 { 287 var args = [0.01].concat( $A( arguments ) ); 288 return this.delay.apply( this, args ); 289 return this.delay.apply( this, args ); 290 }, 291 292 wrap: function( wrapper ) 293 { 294 var __method = this; 295 return function() 296 { 297 return wrapper.apply( this, [__method.bind( this )].concat( $A( arguments ) ) ); 298 } 299 }, 300 301 methodize: function() 302 { 303 if( this._methodized ) return this._methodized; 304 var __method = this; 305 return this._methodized = function() 306 { 307 return __method.apply( null, [this].concat( $A( arguments ) ) ); 308 }; 309 } 310 } ); 311 312 Date.prototype.toJSON = function() 313 { 314 return '"' + this.getUTCFullYear() + '-' + 315 (this.getUTCMonth() + 1).toPaddedString( 2 ) + '-' + 316 this.getUTCDate().toPaddedString( 2 ) + 'T' + 317 this.getUTCHours().toPaddedString( 2 ) + ':' + 318 this.getUTCMinutes().toPaddedString( 2 ) + ':' + 319 this.getUTCSeconds().toPaddedString( 2 ) + 'Z"'; 320 }; 321 322 var Try = { 323 these: function() 324 { 325 var returnValue; 326 327 for( var i = 0, length = arguments.length; i < length; i++ ) 328 { 329 var lambda = arguments[i]; 330 try 331 { 332 returnValue = lambda(); 333 break; 334 } 335 catch ( e ) 336 { 337 } 338 } 339 340 return returnValue; 341 } 342 }; 343 344 RegExp.prototype.match = RegExp.prototype.test; 345 346 RegExp.escape = function( str ) 347 { 348 return String( str ).replace( /([.*+?^=!:${}()|[\]\/\\])/g, '\\$1' ); 349 }; 350 351 /*--------------------------------------------------------------------------*/ 352 353 var PeriodicalExecuter = Class.create( { 354 initialize: function( callback, frequency ) 355 { 356 this.callback = callback; 357 this.frequency = frequency; 358 this.currentlyExecuting = false; 359 360 this.registerCallback(); 361 }, 362 363 registerCallback: function() 364 { 365 this.timer = setInterval( this.onTimerEvent.bind( this ), this.frequency * 1000 ); 366 }, 367 368 execute: function() 369 { 370 this.callback( this ); 371 }, 372 373 stop: function() 374 { 375 if( !this.timer ) return; 376 clearInterval( this.timer ); 377 this.timer = null; 378 }, 379 380 onTimerEvent: function() 381 { 382 if( !this.currentlyExecuting ) 383 { 384 try 385 { 386 this.currentlyExecuting = true; 387 this.execute(); 388 } 389 finally 390 { 391 this.currentlyExecuting = false; 392 } 393 } 394 } 395 } ); 396 Object.extend( String, { 397 interpret: function( value ) 398 { 399 return value == null ? '' : String( value ); 400 }, 401 specialChar: { 402 '\b': '\\b', 403 '\t': '\\t', 404 '\n': '\\n', 405 '\f': '\\f', 406 '\r': '\\r', 407 '\\': '\\\\' 408 } 409 } ); 410 411 Object.extend( String.prototype, { 412 gsub: function( pattern, replacement ) 413 { 414 var result = '', source = this, match; 415 replacement = arguments.callee.prepareReplacement( replacement ); 416 417 while( source.length > 0 ) 418 { 419 if( match = source.match( pattern ) ) 420 { 421 result += source.slice( 0, match.index ); 422 result += String.interpret( replacement( match ) ); 423 source = source.slice( match.index + match[0].length ); 424 } 425 else 426 { 427 result += source,source = ''; 428 } 429 } 430 return result; 431 }, 432 433 sub: function( pattern, replacement, count ) 434 { 435 replacement = this.gsub.prepareReplacement( replacement ); 436 count = Object.isUndefined( count ) ? 1 : count; 437 438 return this.gsub( pattern, function( match ) 439 { 440 if( --count < 0 ) return match[0]; 441 return replacement( match ); 442 } ); 443 }, 444 445 scan: function( pattern, iterator ) 446 { 447 this.gsub( pattern, iterator ); 448 return String( this ); 449 }, 450 451 truncate: function( length, truncation ) 452 { 453 length = length || 30; 454 truncation = Object.isUndefined( truncation ) ? '...' : truncation; 455 return this.length > length ? 456 this.slice( 0, length - truncation.length ) + truncation : String( this ); 457 }, 458 459 strip: function() 460 { 461 return this.replace( /^\s+/, '' ).replace( /\s+$/, '' ); 462 }, 463 464 stripTags: function() 465 { 466 return this.replace( /<\/?[^>]+>/gi, '' ); 467 }, 468 469 stripScripts: function() 470 { 471 return this.replace( new RegExp( Prototype.ScriptFragment, 'img' ), '' ); 472 }, 473 474 extractScripts: function() 475 { 476 var matchAll = new RegExp( Prototype.ScriptFragment, 'img' ); 477 var matchOne = new RegExp( Prototype.ScriptFragment, 'im' ); 478 return (this.match( matchAll ) || []).map( function( scriptTag ) 479 { 480 return (scriptTag.match( matchOne ) || ['', ''])[1]; 481 } ); 482 }, 483 484 evalScripts: function() 485 { 486 return this.extractScripts().map( function( script ) 487 { 488 return eval( script ) 489 } ); 490 }, 491 492 escapeHTML: function() 493 { 494 var self = arguments.callee; 495 self.text.data = this; 496 return self.div.innerHTML; 497 }, 498 499 unescapeHTML: function() 500 { 501 var div = new Element( 'div' ); 502 div.innerHTML = this.stripTags(); 503 return div.childNodes[0] ? (div.childNodes.length > 1 ? 504 $A( div.childNodes ).inject( '', function( memo, node ) 505 { 506 return memo + node.nodeValue 507 } ) : 508 div.childNodes[0].nodeValue) : ''; 509 }, 510 511 toQueryParams: function( separator ) 512 { 513 var match = this.strip().match( /([^?#]*)(#.*)?$/ ); 514 if( !match ) return { }; 515 516 return match[1].split( separator || '&' ).inject( { }, function( hash, pair ) 517 { 518 if( (pair = pair.split( '=' ))[0] ) 519 { 520 var key = decodeURIComponent( pair.shift() ); 521 var value = pair.length > 1 ? pair.join( '=' ) : pair[0]; 522 if( value != undefined ) value = decodeURIComponent( value ); 523 524 if( key in hash ) 525 { 526 if( !Object.isArray( hash[key] ) ) hash[key] = [hash[key]]; 527 hash[key].push( value ); 528 } 529 else hash[key] = value; 530 } 531 return hash; 532 } ); 533 }, 534 535 toArray: function() 536 { 537 return this.split( '' ); 538 }, 539 540 succ: function() 541 { 542 return this.slice( 0, this.length - 1 ) + 543 String.fromCharCode( this.charCodeAt( this.length - 1 ) + 1 ); 544 }, 545 546 times: function( count ) 547 { 548 return count < 1 ? '' : new Array( count + 1 ).join( this ); 549 }, 550 551 camelize: function() 552 { 553 var parts = this.split( '-' ), len = parts.length; 554 if( len == 1 ) return parts[0]; 555 556 var camelized = this.charAt( 0 ) == '-' 557 ? parts[0].charAt( 0 ).toUpperCase() + parts[0].substring( 1 ) 558 : parts[0]; 559 560 for( var i = 1; i < len; i++ ) 561 camelized += parts[i].charAt( 0 ).toUpperCase() + parts[i].substring( 1 ); 562 563 return camelized; 564 }, 565 566 capitalize: function() 567 { 568 return this.charAt( 0 ).toUpperCase() + this.substring( 1 ).toLowerCase(); 569 }, 570 571 underscore: function() 572 { 573 return this.gsub( /::/, '/' ).gsub( /([A-Z]+)([A-Z][a-z])/, '#{1}_#{2}' ).gsub( /([a-z\d])([A-Z])/, '#{1}_#{2}' ).gsub( /-/, '_' ).toLowerCase(); 574 }, 575 576 dasherize: function() 577 { 578 return this.gsub( /_/, '-' ); 579 }, 580 581 inspect: function( useDoubleQuotes ) 582 { 583 var escapedString = this.gsub( /[\x00-\x1f\\]/, function( match ) 584 { 585 var character = String.specialChar[match[0]]; 586 return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString( 2, 16 ); 587 } ); 588 if( useDoubleQuotes ) return '"' + escapedString.replace( /"/g, '\\"' ) + '"'; 589 return "'" + escapedString.replace( /'/g, '\\\'' ) + "'"; 590 }, 591 592 toJSON: function() 593 { 594 return this.inspect( true ); 595 }, 596 597 unfilterJSON: function( filter ) 598 { 599 return this.sub( filter || Prototype.JSONFilter, '#{1}' ); 600 }, 601 602 isJSON: function() 603 { 604 var str = this; 605 if( str.blank() ) return false; 606 str = this.replace( /\\./g, '@' ).replace( /"[^"\\\n\r]*"/g, '' ); 607 return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test( str ); 608 }, 609 610 evalJSON: function( sanitize ) 611 { 612 var json = this.unfilterJSON(); 613 try 614 { 615 if( !sanitize || json.isJSON() ) return eval( '(' + json + ')' ); 616 } 617 catch ( e ) 618 { 619 } 620 throw new SyntaxError( 'Badly formed JSON string: ' + this.inspect() ); 621 }, 622 623 include: function( pattern ) 624 { 625 return this.indexOf( pattern ) > -1; 626 }, 627 628 startsWith: function( pattern ) 629 { 630 return this.indexOf( pattern ) === 0; 631 }, 632 633 endsWith: function( pattern ) 634 { 635 var d = this.length - pattern.length; 636 return d >= 0 && this.lastIndexOf( pattern ) === d; 637 }, 638 639 empty: function() 640 { 641 return this == ''; 642 }, 643 644 blank: function() 645 { 646 return /^\s*$/.test( this ); 647 }, 648 649 interpolate: function( object, pattern ) 650 { 651 return new Template( this, pattern ).evaluate( object ); 652 } 653 } ); 654 655 if( Prototype.Browser.WebKit || Prototype.Browser.IE ) Object.extend( String.prototype, { 656 escapeHTML: function() 657 { 658 return this.replace( /&/g, '&' ).replace( /</g, '<' ).replace( />/g, '>' ); 659 }, 660 unescapeHTML: function() 661 { 662 return this.stripTags().replace( /&/g, '&' ).replace( /</g, '<' ).replace( />/g, '>' ); 663 } 664 } ); 665 666 String.prototype.gsub.prepareReplacement = function( replacement ) 667 { 668 if( Object.isFunction( replacement ) ) return replacement; 669 var template = new Template( replacement ); 670 return function( match ) 671 { 672 return template.evaluate( match ) 256 673 }; 257 }258 });259 260 Date.prototype.toJSON = function() {261 return '"' + this.getUTCFullYear() + '-' +262 (this.getUTCMonth() + 1).toPaddedString(2) + '-' +263 this.getUTCDate().toPaddedString(2) + 'T' +264 this.getUTCHours().toPaddedString(2) + ':' +265 this.getUTCMinutes().toPaddedString(2) + ':' +266 this.getUTCSeconds().toPaddedString(2) + 'Z"';267 674 }; 268 675 269 var Try = { 270 these: function() { 271 var returnValue; 272 273 for (var i = 0, length = arguments.length; i < length; i++) { 274 var lambda = arguments[i]; 275 try { 276 returnValue = lambda(); 277 break; 278 } catch (e) { } 279 } 280 281 return returnValue; 282 } 676 String.prototype.parseQuery = String.prototype.toQueryParams; 677 678 Object.extend( String.prototype.escapeHTML, { 679 div: document.createElement( 'div' ), 680 text: document.createTextNode( '' ) 681 } ); 682 683 String.prototype.escapeHTML.div.appendChild( String.prototype.escapeHTML.text ); 684 685 var Template = Class.create( { 686 initialize: function( template, pattern ) 687 { 688 this.template = template.toString(); 689 this.pattern = pattern || Template.Pattern; 690 }, 691 692 evaluate: function( object ) 693 { 694 if( Object.isFunction( object.toTemplateReplacements ) ) 695 object = object.toTemplateReplacements(); 696 697 return this.template.gsub( this.pattern, function( match ) 698 { 699 if( object == null ) return ''; 700 701 var before = match[1] || ''; 702 if( before == '\\' ) return match[2]; 703 704 var ctx = object, expr = match[3]; 705 var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; 706 match = pattern.exec( expr ); 707 if( match == null ) return before; 708 709 while( match != null ) 710 { 711 var comp = match[1].startsWith( '[' ) ? match[2].gsub( '\\\\]', ']' ) : match[1]; 712 ctx = ctx[comp]; 713 if( null == ctx || '' == match[3] ) break; 714 expr = expr.substring( '[' == match[3] ? match[1].length : match[0].length ); 715 match = pattern.exec( expr ); 716 } 717 718 return before + String.interpret( ctx ); 719 } ); 720 } 721 } ); 722 Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; 723 724 var $break = { }; 725 726 var Enumerable = { 727 each: function( iterator, context ) 728 { 729 var index = 0; 730 try 731 { 732 this._each( function( value ) 733 { 734 iterator.call( context, value, index++ ); 735 } ); 736 } 737 catch ( e ) 738 { 739 if( e != $break ) throw e; 740 } 741 return this; 742 }, 743 744 eachSlice: function( number, iterator, context ) 745 { 746 var index = -number, slices = [], array = this.toArray(); 747 if( number < 1 ) return array; 748 while( (index += number) < array.length ) 749 slices.push( array.slice( index, index + number ) ); 750 return slices.collect( iterator, context ); 751 }, 752 753 all: function( iterator, context ) 754 { 755 iterator = iterator || Prototype.K; 756 var result = true; 757 this.each( function( value, index ) 758 { 759 result = result && !!iterator.call( context, value, index ); 760 if( !result ) throw $break; 761 } ); 762 return result; 763 }, 764 765 any: function( iterator, context ) 766 { 767 iterator = iterator || Prototype.K; 768 var result = false; 769 this.each( function( value, index ) 770 { 771 if( result = !!iterator.call( context, value, index ) ) 772 throw $break; 773 } ); 774 return result; 775 }, 776 777 collect: function( iterator, context ) 778 { 779 iterator = iterator || Prototype.K; 780 var results = []; 781 this.each( function( value, index ) 782 { 783 results.push( iterator.call( context, value, index ) ); 784 } ); 785 return results; 786 }, 787 788 detect: function( iterator, context ) 789 { 790 var result; 791 this.each( function( value, index ) 792 { 793 if( iterator.call( context, value, index ) ) 794 { 795 result = value; 796 throw $break; 797 } 798 } ); 799 return result; 800 }, 801 802 findAll: function( iterator, context ) 803 { 804 var results = []; 805 this.each( function( value, index ) 806 { 807 if( iterator.call( context, value, index ) ) 808 results.push( value ); 809 } ); 810 return results; 811 }, 812 813 grep: function( filter, iterator, context ) 814 { 815 iterator = iterator || Prototype.K; 816 var results = []; 817 818 if( Object.isString( filter ) ) 819 filter = new RegExp( filter ); 820 821 this.each( function( value, index ) 822 { 823 if( filter.match( value ) ) 824 results.push( iterator.call( context, value, index ) ); 825 } ); 826 return results; 827 }, 828 829 include: function( object ) 830 { 831 if( Object.isFunction( this.indexOf ) ) 832 if( this.indexOf( object ) != -1 ) return true; 833 834 var found = false; 835 this.each( function( value ) 836 { 837 if( value == object ) 838 { 839 found = true; 840 throw $break; 841 } 842 } ); 843 return found; 844 }, 845 846 inGroupsOf: function( number, fillWith ) 847 { 848 fillWith = Object.isUndefined( fillWith ) ? null : fillWith; 849 return this.eachSlice( number, function( slice ) 850 { 851 while( slice.length < number ) slice.push( fillWith ); 852 return slice; 853 } ); 854 }, 855 856 inject: function( memo, iterator, context ) 857 { 858 this.each( function( value, index ) 859 { 860 memo = iterator.call( context, memo, value, index ); 861 } ); 862 return memo; 863 }, 864 865 invoke: function( method ) 866 { 867 var args = $A( arguments ).slice( 1 ); 868 return this.map( function( value ) 869 { 870 return value[method].apply( value, args ); 871 } ); 872 }, 873 874 max: function( iterator, context ) 875 { 876 iterator = iterator || Prototype.K; 877 var result; 878 this.each( function( value, index ) 879 { 880 value = iterator.call( context, value, index ); 881 if( result == null || value >= result ) 882 result = value; 883 } ); 884 return result; 885 }, 886 887 min: function( iterator, context ) 888 { 889 iterator = iterator || Prototype.K; 890 var result; 891 this.each( function( value, index ) 892 { 893 value = iterator.call( context, value, index ); 894 if( result == null || value < result ) 895 result = value; 896 } ); 897 return result; 898 }, 899 900 partition: function( iterator, context ) 901 { 902 iterator = iterator || Prototype.K; 903 var trues = [], falses = []; 904 this.each( function( value, index ) 905 { 906 (iterator.call( context, value, index ) ? 907 trues : falses).push( value ); 908 } ); 909 return [trues, falses]; 910 }, 911 912 pluck: function( property ) 913 { 914 var results = []; 915 this.each( function( value ) 916 { 917 results.push( value[property] ); 918 } ); 919 return results; 920 }, 921 922 reject: function( iterator, context ) 923 { 924 var results = []; 925 this.each( function( value, index ) 926 { 927 if( !iterator.call( context, value, index ) ) 928 results.push( value ); 929 } ); 930 return results; 931 }, 932 933 sortBy: function( iterator, context ) 934 { 935 return this.map( 936 function( value, index ) 937 { 938 return { 939 value: value, 940 criteria: iterator.call( context, value, index ) 941 }; 942 } ).sort( 943 function( left, right ) 944 { 945 var a = left.criteria, b = right.criteria; 946 return a < b ? -1 : a > b ? 1 : 0; 947 } ).pluck( 'value' ); 948 }, 949 950 toArray: function() 951 { 952 return this.map(); 953 }, 954 955 zip: function() 956 { 957 var iterator = Prototype.K, args = $A( arguments ); 958 if( Object.isFunction( args.last() ) ) 959 iterator = args.pop(); 960 961 var collections = [this].concat( args ).map( $A ); 962 return this.map( function( value, index ) 963 { 964 return iterator( collections.pluck( index ) ); 965 } ); 966 }, 967 968 size: function() 969 { 970 return this.toArray().length; 971 }, 972 973 inspect: function() 974 { 975 return '#<Enumerable:' + this.toArray().inspect() + '>'; 976 } 283 977 }; 284 978 285 RegExp.prototype.match = RegExp.prototype.test; 286 287 RegExp.escape = function(str) { 288 return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); 979 Object.extend( Enumerable, { 980 map: Enumerable.collect, 981 find: Enumerable.detect, 982 select: Enumerable.findAll, 983 filter: Enumerable.findAll, 984 member: Enumerable.include, 985 entries: Enumerable.toArray, 986 every: Enumerable.all, 987 some: Enumerable.any 988 } ); 989 function $A( iterable ) 990 { 991 if( !iterable ) return []; 992 if( iterable.toArray ) return iterable.toArray(); 993 var length = iterable.length || 0, results = new Array( length ); 994 while( length-- ) results[length] = iterable[length]; 995 return results; 996 } 997 998 if( Prototype.Browser.WebKit ) 999 { 1000 $A = function( iterable ) 1001 { 1002 if( !iterable ) return []; 1003 // In Safari, only use the `toArray` method if it's not a NodeList. 1004 // A NodeList is a function, has an function `item` property, and a numeric 1005 // `length` property. Adapted from Google Doctype. 1006 if( !(typeof iterable === 'function' && typeof iterable.length === 1007 'number' && typeof iterable.item === 'function') && iterable.toArray ) 1008 return iterable.toArray(); 1009 var length = iterable.length || 0, results = new Array( length ); 1010 while( length-- ) results[length] = iterable[length]; 1011 return results; 1012 }; 1013 } 1014 1015 Array.from = $A; 1016 1017 Object.extend( Array.prototype, Enumerable ); 1018 1019 if( !Array.prototype._reverse ) Array.prototype._reverse = Array.prototype.reverse; 1020 1021 Object.extend( Array.prototype, { 1022 _each: function( iterator ) 1023 { 1024 for( var i = 0, length = this.length; i < length; i++ ) 1025 iterator( this[i] ); 1026 }, 1027 1028 clear: function() 1029 { 1030 this.length = 0; 1031 return this; 1032 }, 1033 1034 first: function() 1035 { 1036 return this[0]; 1037 }, 1038 1039 last: function() 1040 { 1041 return this[this.length - 1]; 1042 }, 1043 1044 compact: function() 1045 { 1046 return this.select( function( value ) 1047 { 1048 return value != null; 1049 } ); 1050 }, 1051 1052 flatten: function() 1053 { 1054 return this.inject( [], function( array, value ) 1055 { 1056 return array.concat( Object.isArray( value ) ? 1057 value.flatten() : [value] ); 1058 } ); 1059 }, 1060 1061 without: function() 1062 { 1063 var values = $A( arguments ); 1064 return this.select( function( value ) 1065 { 1066 return !values.include( value ); 1067 } ); 1068 }, 1069 1070 reverse: function( inline ) 1071 { 1072 return (inline !== false ? this : this.toArray())._reverse(); 1073 }, 1074 1075 reduce: function() 1076 { 1077 return this.length > 1 ? this : this[0]; 1078 }, 1079 1080 uniq: function( sorted ) 1081 { 1082 return this.inject( [], function( array, value, index ) 1083 { 1084 if( 0 == index || (sorted ? array.last() != value : !array.include( value )) ) 1085 array.push( value ); 1086 return array; 1087 } ); 1088 }, 1089 1090 intersect: function( array ) 1091 { 1092 return this.uniq().findAll( function( item ) 1093 { 1094 return array.detect( function( value ) 1095 { 1096 return item === value 1097 } ); 1098 } ); 1099 }, 1100 1101 clone: function() 1102 { 1103 return [].concat( this ); 1104 }, 1105 1106 size: function() 1107 { 1108 return this.length; 1109 }, 1110 1111 inspect: function() 1112 { 1113 return '[' + this.map( Object.inspect ).join( ', ' ) + ']'; 1114 }, 1115 1116 toJSON: function() 1117 { 1118 var results = []; 1119 this.each( function( object ) 1120 { 1121 var value = Object.toJSON( object ); 1122 if( !Object.isUndefined( value ) ) results.push( value ); 1123 } ); 1124 return '[' + results.join( ', ' ) + ']'; 1125 } 1126 } ); 1127 1128 // use native browser JS 1.6 implementation if available 1129 if( Object.isFunction( Array.prototype.forEach ) ) 1130 Array.prototype._each = Array.prototype.forEach; 1131 1132 if( !Array.prototype.indexOf ) Array.prototype.indexOf = function( item, i ) 1133 { 1134 i || (i = 0); 1135 var length = this.length; 1136 if( i < 0 ) i = length + i; 1137 for( ; i < length; i++ ) 1138 if( this[i] === item ) return i; 1139 return -1; 289 1140 }; 290 1141 291 /*--------------------------------------------------------------------------*/ 292 293 var PeriodicalExecuter = Class.create({ 294 initialize: function(callback, frequency) { 295 this.callback = callback; 296 this.frequency = frequency; 297 this.currentlyExecuting = false; 298 299 this.registerCallback(); 300 }, 301 302 registerCallback: function() { 303 this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); 304 }, 305 306 execute: function() { 307 this.callback(this); 308 }, 309 310 stop: function() { 311 if (!this.timer) return; 312 clearInterval(this.timer); 313 this.timer = null; 314 }, 315 316 onTimerEvent: function() { 317 if (!this.currentlyExecuting) { 318 try { 319 this.currentlyExecuting = true; 320 this.execute(); 321 } finally { 322 this.currentlyExecuting = false; 323 } 324 } 325 } 326 }); 327 Object.extend(String, { 328 interpret: function(value) { 329 return value == null ? '' : String(value); 330 }, 331 specialChar: { 332 '\b': '\\b', 333 '\t': '\\t', 334 '\n': '\\n', 335 '\f': '\\f', 336 '\r': '\\r', 337 '\\': '\\\\' 338 } 339 }); 340 341 Object.extend(String.prototype, { 342 gsub: function(pattern, replacement) { 343 var result = '', source = this, match; 344 replacement = arguments.callee.prepareReplacement(replacement); 345 346 while (source.length > 0) { 347 if (match = source.match(pattern)) { 348 result += source.slice(0, match.index); 349 result += String.interpret(replacement(match)); 350 source = source.slice(match.index + match[0].length); 351 } else { 352 result += source, source = ''; 353 } 354 } 355 return result; 356 }, 357 358 sub: function(pattern, replacement, count) { 359 replacement = this.gsub.prepareReplacement(replacement); 360 count = Object.isUndefined(count) ? 1 : count; 361 362 return this.gsub(pattern, function(match) { 363 if (--count < 0) return match[0]; 364 return replacement(match); 365 }); 366 }, 367 368 scan: function(pattern, iterator) { 369 this.gsub(pattern, iterator); 370 return String(this); 371 }, 372 373 truncate: function(length, truncation) { 374 length = length || 30; 375 truncation = Object.isUndefined(truncation) ? '...' : truncation; 376 return this.length > length ? 377 this.slice(0, length - truncation.length) + truncation : String(this); 378 }, 379 380 strip: function() { 381 return this.replace(/^\s+/, '').replace(/\s+$/, ''); 382 }, 383 384 stripTags: function() { 385 return this.replace(/<\/?[^>]+>/gi, ''); 386 }, 387 388 stripScripts: function() { 389 return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); 390 }, 391 392 extractScripts: function() { 393 var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); 394 var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); 395 return (this.match(matchAll) || []).map(function(scriptTag) { 396 return (scriptTag.match(matchOne) || ['', ''])[1]; 397 }); 398 }, 399 400 evalScripts: function() { 401 return this.extractScripts().map(function(script) { return eval(script) }); 402 }, 403 404 escapeHTML: function() { 405 var self = arguments.callee; 406 self.text.data = this; 407 return self.div.innerHTML; 408 }, 409 410 unescapeHTML: function() { 411 var div = new Element('div'); 412 div.innerHTML = this.stripTags(); 413 return div.childNodes[0] ? (div.childNodes.length > 1 ? 414 $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : 415 div.childNodes[0].nodeValue) : ''; 416 }, 417 418 toQueryParams: function(separator) { 419 var match = this.strip().match(/([^?#]*)(#.*)?$/); 420 if (!match) return { }; 421 422 return match[1].split(separator || '&').inject({ }, function(hash, pair) { 423 if ((pair = pair.split('='))[0]) { 424 var key = decodeURIComponent(pair.shift()); 425 var value = pair.length > 1 ? pair.join('=') : pair[0]; 426 if (value != undefined) value = decodeURIComponent(value); 427 428 if (key in hash) { 429 if (!Object.isArray(hash[key])) hash[key] = [hash[key]]; 430 hash[key].push(value); 431 } 432 else hash[key] = value; 433 } 434 return hash; 435 }); 436 }, 437 438 toArray: function() { 439 return this.split(''); 440 }, 441 442 succ: function() { 443 return this.slice(0, this.length - 1) + 444 String.fromCharCode(this.charCodeAt(this.length - 1) + 1); 445 }, 446 447 times: function(count) { 448 return count < 1 ? '' : new Array(count + 1).join(this); 449 }, 450 451 camelize: function() { 452 var parts = this.split('-'), len = parts.length; 453 if (len == 1) return parts[0]; 454 455 var camelized = this.charAt(0) == '-' 456 ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) 457 : parts[0]; 458 459 for (var i = 1; i < len; i++) 460 camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); 461 462 return camelized; 463 }, 464 465 capitalize: function() { 466 return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); 467 }, 468 469 underscore: function() { 470 return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); 471 }, 472 473 dasherize: function() { 474 return this.gsub(/_/,'-'); 475 }, 476 477 inspect: function(useDoubleQuotes) { 478 var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { 479 var character = String.specialChar[match[0]]; 480 return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); 481 }); 482 if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; 483 return "'" + escapedString.replace(/'/g, '\\\'') + "'"; 484 }, 485 486 toJSON: function() { 487 return this.inspect(true); 488 }, 489 490 unfilterJSON: function(filter) { 491 return this.sub(filter || Prototype.JSONFilter, '#{1}'); 492 }, 493 494 isJSON: function() { 495 var str = this; 496 if (str.blank()) return false; 497 str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, ''); 498 return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str); 499 }, 500 501 evalJSON: function(sanitize) { 502 var json = this.unfilterJSON(); 503 try { 504 if (!sanitize || json.isJSON()) return eval('(' + json + ')'); 505 } catch (e) { } 506 throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); 507 }, 508 509 include: function(pattern) { 510 return this.indexOf(pattern) > -1; 511 }, 512 513 startsWith: function(pattern) { 514 return this.indexOf(pattern) === 0; 515 }, 516 517 endsWith: function(pattern) { 518 var d = this.length - pattern.length; 519 return d >= 0 && this.lastIndexOf(pattern) === d; 520 }, 521 522 empty: function() { 523 return this == ''; 524 }, 525 526 blank: function() { 527 return /^\s*$/.test(this); 528 }, 529 530 interpolate: function(object, pattern) { 531 return new Template(this, pattern).evaluate(object); 532 } 533 }); 534 535 if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { 536 escapeHTML: function() { 537 return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); 538 }, 539 unescapeHTML: function() { 540 return this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); 541 } 542 }); 543 544 String.prototype.gsub.prepareReplacement = function(replacement) { 545 if (Object.isFunction(replacement)) return replacement; 546 var template = new Template(replacement); 547 return function(match) { return template.evaluate(match) }; 1142 if( !Array.prototype.lastIndexOf ) Array.prototype.lastIndexOf = function( item, i ) 1143 { 1144 i = isNaN( i ) ? this.length : (i < 0 ? this.length + i : i) + 1; 1145 var n = this.slice( 0, i ).reverse().indexOf( item ); 1146 return (n < 0) ? n : i - n - 1; 548 1147 }; 549 1148 550 String.prototype.parseQuery = String.prototype.toQueryParams; 551 552 Object.extend(String.prototype.escapeHTML, { 553 div: document.createElement('div'), 554 text: document.createTextNode('') 555 }); 556 557 String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text); 558 559 var Template = Class.create({ 560 initialize: function(template, pattern) { 561 this.template = template.toString(); 562 this.pattern = pattern || Template.Pattern; 563 }, 564 565 evaluate: function(object) { 566 if (Object.isFunction(object.toTemplateReplacements)) 567 object = object.toTemplateReplacements(); 568 569 return this.template.gsub(this.pattern, function(match) { 570 if (object == null) return ''; 571 572 var before = match[1] || ''; 573 if (before == '\\') return match[2]; 574 575 var ctx = object, expr = match[3]; 576 var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; 577 match = pattern.exec(expr); 578 if (match == null) return before; 579 580 while (match != null) { 581 var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; 582 ctx = ctx[comp]; 583 if (null == ctx || '' == match[3]) break; 584 expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); 585 match = pattern.exec(expr); 586 } 587 588 return before + String.interpret(ctx); 589 }); 590 } 591 }); 592 Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; 593 594 var $break = { }; 595 596 var Enumerable = { 597 each: function(iterator, context) { 598 var index = 0; 599 try { 600 this._each(function(value) { 601 iterator.call(context, value, index++); 602 }); 603 } catch (e) { 604 if (e != $break) throw e; 605 } 606 return this; 607 }, 608 609 eachSlice: function(number, iterator, context) { 610 var index = -number, slices = [], array = this.toArray(); 611 if (number < 1) return array; 612 while ((index += number) < array.length) 613 slices.push(array.slice(index, index+number)); 614 return slices.collect(iterator, context); 615 }, 616 617 all: function(iterator, context) { 618 iterator = iterator || Prototype.K; 619 var result = true; 620 this.each(function(value, index) { 621 result = result && !!iterator.call(context, value, index); 622 if (!result) throw $break; 623 }); 624 return result; 625 }, 626 627 any: function(iterator, context) { 628 iterator = iterator || Prototype.K; 629 var result = false; 630 this.each(function(value, index) { 631 if (result = !!iterator.call(context, value, index)) 632 throw $break; 633 }); 634 return result; 635 }, 636 637 collect: function(iterator, context) { 638 iterator = iterator || Prototype.K; 639 var results = []; 640 this.each(function(value, index) { 641 results.push(iterator.call(context, value, index)); 642 }); 643 return results; 644 }, 645 646 detect: function(iterator, context) { 647 var result; 648 this.each(function(value, index) { 649 if (iterator.call(context, value, index)) { 650 result = value; 651 throw $break; 652 } 653 }); 654 return result; 655 }, 656 657 findAll: function(iterator, context) { 658 var results = []; 659 this.each(function(value, index) { 660 if (iterator.call(context, value, index)) 661 results.push(value); 662 }); 663 return results; 664 }, 665 666 grep: function(filter, iterator, context) { 667 iterator = iterator || Prototype.K; 668 var results = []; 669 670 if (Object.isString(filter)) 671 filter = new RegExp(filter); 672 673 this.each(function(value, index) { 674 if (filter.match(value)) 675 results.push(iterator.call(context, value, index)); 676 }); 677 return results; 678 }, 679 680 include: function(object) { 681 if (Object.isFunction(this.indexOf)) 682 if (this.indexOf(object) != -1) return true; 683 684 var found = false; 685 this.each(function(value) { 686 if (value == object) { 687 found = true; 688 throw $break; 689 } 690 }); 691 return found; 692 }, 693 694 inGroupsOf: function(number, fillWith) { 695 fillWith = Object.isUndefined(fillWith) ? null : fillWith; 696 return this.eachSlice(number, function(slice) { 697 while(slice.length < number) slice.push(fillWith); 698 return slice; 699 }); 700 }, 701 702 inject: function(memo, iterator, context) { 703 this.each(function(value, index) { 704 memo = iterator.call(context, memo, value, index); 705 }); 706 return memo; 707 }, 708 709 invoke: function(method) { 710 var args = $A(arguments).slice(1); 711 return this.map(function(value) { 712 return value[method].apply(value, args); 713 }); 714 }, 715 716 max: function(iterator, context) { 717 iterator = iterator || Prototype.K; 718 var result; 719 this.each(function(value, index) { 720 value = iterator.call(context, value, index); 721 if (result == null || value >= result) 722 result = value; 723 }); 724 return result; 725 }, 726 727 min: function(iterator, context) { 728 iterator = iterator || Prototype.K; 729 var result; 730 this.each(function(value, index) { 731 value = iterator.call(context, value, index); 732 if (result == null || value < result) 733 result = value; 734 }); 735 return result; 736 }, 737 738 partition: function(iterator, context) { 739 iterator = iterator || Prototype.K; 740 var trues = [], falses = []; 741 this.each(function(value, index) { 742 (iterator.call(context, value, index) ? 743 trues : falses).push(value); 744 }); 745 return [trues, falses]; 746 }, 747 748 pluck: function(property) { 749 var results = []; 750 this.each(function(value) { 751 results.push(value[property]); 752 }); 753 return results; 754 }, 755 756 reject: function(iterator, context) { 757 var results = []; 758 this.each(function(value, index) { 759 if (!iterator.call(context, value, index)) 760 results.push(value); 761 }); 762 return results; 763 }, 764 765 sortBy: function(iterator, context) { 766 return this.map(function(value, index) { 767 return { 768 value: value, 769 criteria: iterator.call(context, value, index) 770 }; 771 }).sort(function(left, right) { 772 var a = left.criteria, b = right.criteria; 773 return a < b ? -1 : a > b ? 1 : 0; 774 }).pluck('value'); 775 }, 776 777 toArray: function() { 778 return this.map(); 779 }, 780 781 zip: function() { 782 var iterator = Prototype.K, args = $A(arguments); 783 if (Object.isFunction(args.last())) 784 iterator = args.pop(); 785 786 var collections = [this].concat(args).map($A); 787 return this.map(function(value, index) { 788 return iterator(collections.pluck(index)); 789 }); 790 }, 791 792 size: function() { 793 return this.toArray().length; 794 }, 795 796 inspect: function() { 797 return '#<Enumerable:' + this.toArray().inspect() + '>'; 798 } 799 }; 800 801 Object.extend(Enumerable, { 802 map: Enumerable.collect, 803 find: Enumerable.detect, 804 select: Enumerable.findAll, 805 filter: Enumerable.findAll, 806 member: Enumerable.include, 807 entries: Enumerable.toArray, 808 every: Enumerable.all, 809 some: Enumerable.any 810 }); 811 function $A(iterable) { 812 if (!iterable) return []; 813 if (iterable.toArray) return iterable.toArray(); 814 var length = iterable.length || 0, results = new Array(length); 815 while (length--) results[length] = iterable[length]; 816 return results; 1149 Array.prototype.toArray = Array.prototype.clone; 1150 1151 function $w( string ) 1152 { 1153 if( !Object.isString( string ) ) return []; 1154 string = string.strip(); 1155 return string ? string.split( /\s+/ ) : []; 817 1156 } 818 1157 819 if (Prototype.Browser.WebKit) { 820 $A = function(iterable) { 821 if (!iterable) return []; 822 // In Safari, only use the `toArray` method if it's not a NodeList. 823 // A NodeList is a function, has an function `item` property, and a numeric 824 // `length` property. Adapted from Google Doctype. 825 if (!(typeof iterable === 'function' && typeof iterable.length === 826 'number' && typeof iterable.item === 'function') && iterable.toArray) 827 return iterable.toArray(); 828 var length = iterable.length || 0, results = new Array(length); 829 while (length--) results[length] = iterable[length]; 830 return results; 831 }; 1158 if( Prototype.Browser.Opera ) 1159 { 1160 Array.prototype.concat = function() 1161 { 1162 var array = []; 1163 for( var i = 0, length = this.length; i < length; i++ ) array.push( this[i] ); 1164 for( var i = 0, length = arguments.length; i < length; i++ ) 1165 { 1166 if( Object.isArray( arguments[i] ) ) 1167 { 1168 for( var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++ ) 1169 array.push( arguments[i][j] ); 1170 } 1171 else 1172 { 1173 array.push( arguments[i] ); 1174 } 1175 } 1176 return array; 1177 }; 832 1178 } 833 834 Array.from = $A; 835 836 Object.extend(Array.prototype, Enumerable); 837 838 if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; 839 840 Object.extend(Array.prototype, { 841 _each: function(iterator) { 842 for (var i = 0, length = this.length; i < length; i++) 843 iterator(this[i]); 844 }, 845 846 clear: function() { 847 this.length = 0; 848 return this; 849 }, 850 851 first: function() { 852 return this[0]; 853 }, 854 855 last: function() { 856 return this[this.length - 1]; 857 }, 858 859 compact: function() { 860 return this.select(function(value) { 861 return value != null; 862 }); 863 }, 864 865 flatten: function() { 866 return this.inject([], function(array, value) { 867 return array.concat(Object.isArray(value) ? 868 value.flatten() : [value]); 869 }); 870 }, 871 872 without: function() { 873 var values = $A(arguments); 874 return this.select(function(value) { 875 return !values.include(value); 876 }); 877 }, 878 879 reverse: function(inline) { 880 return (inline !== false ? this : this.toArray())._reverse(); 881 }, 882 883 reduce: function() { 884 return this.length > 1 ? this : this[0]; 885 }, 886 887 uniq: function(sorted) { 888 return this.inject([], function(array, value, index) { 889 if (0 == index || (sorted ? array.last() != value : !array.include(value))) 890 array.push(value); 891 return array; 892 }); 893 }, 894 895 intersect: function(array) { 896 return this.uniq().findAll(function(item) { 897 return array.detect(function(value) { return item === value }); 898 }); 899 }, 900 901 clone: function() { 902 return [].concat(this); 903 }, 904 905 size: function() { 906 return this.length; 907 }, 908 909 inspect: function() { 910 return '[' + this.map(Object.inspect).join(', ') + ']'; 911 }, 912 913 toJSON: function() { 914 var results = []; 915 this.each(function(object) { 916 var value = Object.toJSON(object); 917 if (!Object.isUndefined(value)) results.push(value); 918 }); 919 return '[' + results.join(', ') + ']'; 920 } 921 }); 922 923 // use native browser JS 1.6 implementation if available 924 if (Object.isFunction(Array.prototype.forEach)) 925 Array.prototype._each = Array.prototype.forEach; 926 927 if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { 928 i || (i = 0); 929 var length = this.length; 930 if (i < 0) i = length + i; 931 for (; i < length; i++) 932 if (this[i] === item) return i; 933 return -1; 934 }; 935 936 if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { 937 i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; 938 var n = this.slice(0, i).reverse().indexOf(item); 939 return (n < 0) ? n : i - n - 1; 940 }; 941 942 Array.prototype.toArray = Array.prototype.clone; 943 944 function $w(string) { 945 if (!Object.isString(string)) return []; 946 string = string.strip(); 947 return string ? string.split(/\s+/) : []; 1179 Object.extend( Number.prototype, { 1180 toColorPart: function() 1181 { 1182 return this.toPaddedString( 2, 16 ); 1183 }, 1184 1185 succ: function() 1186 { 1187 return this + 1; 1188 }, 1189 1190 times: function( iterator, context ) 1191 { 1192 $R( 0, this, true ).each( iterator, context ); 1193 return this; 1194 }, 1195 1196 toPaddedString: function( length, radix ) 1197 { 1198 var string = this.toString( radix || 10 ); 1199 return '0'.times( length - string.length ) + string; 1200 }, 1201 1202 toJSON: function() 1203 { 1204 return isFinite( this ) ? this.toString() : 'null'; 1205 } 1206 } ); 1207 1208 $w( 'abs round ceil floor' ).each( function( method ) 1209 { 1210 Number.prototype[method] = Math[method].methodize(); 1211 } ); 1212 function $H( object ) 1213 { 1214 return new Hash( object ); 948 1215 } 949 950 if (Prototype.Browser.Opera){ 951 Array.prototype.concat = function() { 952 var array = []; 953 for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); 954 for (var i = 0, length = arguments.length; i < length; i++) { 955 if (Object.isArray(arguments[i])) { 956 for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) 957 array.push(arguments[i][j]); 958 } else { 959 array.push(arguments[i]); 960 } 961 } 962 return array; 963 }; 964 } 965 Object.extend(Number.prototype, { 966 toColorPart: function() { 967 return this.toPaddedString(2, 16); 968 }, 969 970 succ: function() { 971 return this + 1; 972 }, 973 974 times: function(iterator, context) { 975 $R(0, this, true).each(iterator, context); 976 return this; 977 }, 978 979 toPaddedString: function(length, radix) { 980 var string = this.toString(radix || 10); 981 return '0'.times(length - string.length) + string; 982 }, 983 984 toJSON: function() { 985 return isFinite(this) ? this.toString() : 'null'; 986 } 987 }); 988 989 $w('abs round ceil floor').each(function(method){ 990 Number.prototype[method] = Math[method].methodize(); 991 }); 992 function $H(object) { 993 return new Hash(object); 994 }; 995 996 var Hash = Class.create(Enumerable, (function() { 997 998 function toQueryPair(key, value) { 999 if (Object.isUndefined(value)) return key; 1000 return key + '=' + encodeURIComponent(String.interpret(value)); 1001 } 1002 1003 return { 1004 initialize: function(object) { 1005 this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); 1006 }, 1007 1008 _each: function(iterator) { 1009 for (var key in this._object) { 1010 var value = this._object[key], pair = [key, value]; 1011 pair.key = key; 1012 pair.value = value; 1013 iterator(pair); 1014 } 1015 }, 1016 1017 set: function(key, value) { 1018 return this._object[key] = value; 1019 }, 1020 1021 get: function(key) { 1022 // simulating poorly supported hasOwnProperty 1023 if (this._object[key] !== Object.prototype[key]) 1024 return this._object[key]; 1025 }, 1026 1027 unset: function(key) { 1028 var value = this._object[key]; 1029 delete this._object[key]; 1030 return value; 1031 }, 1032 1033 toObject: function() { 1034 return Object.clone(this._object); 1035 }, 1036 1037 keys: function() { 1038 return this.pluck('key'); 1039 }, 1040 1041 values: function() { 1042 return this.pluck('value'); 1043 }, 1044 1045 index: function(value) { 1046 var match = this.detect(function(pair) { 1047 return pair.value === value; 1048 }); 1049 return match && match.key; 1050 }, 1051 1052 merge: function(object) { 1053 return this.clone().update(object); 1054 }, 1055 1056 update: function(object) { 1057 return new Hash(object).inject(this, function(result, pair) { 1058 result.set(pair.key, pair.value); 1059 return result; 1060 }); 1061 }, 1062 1063 toQueryString: function() { 1064 return this.inject([], function(results, pair) { 1065 var key = encodeURIComponent(pair.key), values = pair.value; 1066 1067 if (values && typeof values == 'object') { 1068 if (Object.isArray(values)) 1069 return results.concat(values.map(toQueryPair.curry(key))); 1070 } else results.push(toQueryPair(key, values)); 1071 return results; 1072 }).join('&'); 1073 }, 1074 1075 inspect: function() { 1076 return '#<Hash:{' + this.map(function(pair) { 1077 return pair.map(Object.inspect).join(': '); 1078 }).join(', ') + '}>'; 1079 }, 1080 1081 toJSON: function() { 1082 return Object.toJSON(this.toObject()); 1083 }, 1084 1085 clone: function() { 1086 return new Hash(this); 1087 } 1088 } 1089 })()); 1216 ; 1217 1218 var Hash = Class.create( Enumerable, (function() 1219 { 1220 1221 function toQueryPair( key, value ) 1222 { 1223 if( Object.isUndefined( value ) ) return key; 1224 return key + '=' + encodeURIComponent( String.interpret( value ) ); 1225 } 1226 1227 return { 1228 initialize: function( object ) 1229 { 1230 this._object = Object.isHash( object ) ? object.toObject() : Object.clone( object ); 1231 }, 1232 1233 _each: function( iterator ) 1234 { 1235 for( var key in this._object ) 1236 { 1237 var value = this._object[key], pair = [key, value]; 1238 pair.key = key; 1239 pair.value = value; 1240 iterator( pair ); 1241 } 1242 }, 1243 1244 set: function( key, value ) 1245 { 1246 return this._object[key] = value; 1247 }, 1248 1249 get: function( key ) 1250 { 1251 // simulating poorly supported hasOwnProperty 1252 if( this._object[key] !== Object.prototype[key] ) 1253 return this._object[key]; 1254 }, 1255 1256 unset: function( key ) 1257 { 1258 var value = this._object[key]; 1259 delete this._object[key]; 1260 return value; 1261 }, 1262 1263 toObject: function() 1264 { 1265 return Object.clone( this._object ); 1266 }, 1267 1268 keys: function() 1269 { 1270 return this.pluck( 'key' ); 1271 }, 1272 1273 values: function() 1274 { 1275 return this.pluck( 'value' ); 1276 }, 1277 1278 index: function( value ) 1279 { 1280 var match = this.detect( function( pair ) 1281 { 1282 return pair.value === value; 1283 } ); 1284 return match && match.key; 1285 }, 1286 1287 merge: function( object ) 1288 { 1289 return this.clone().update( object ); 1290 }, 1291 1292 update: function( object ) 1293 { 1294 return new Hash( object ).inject( this, function( result, pair ) 1295 { 1296 result.set( pair.key, pair.value ); 1297 return result; 1298 } ); 1299 }, 1300 1301 toQueryString: function() 1302 { 1303 return this.inject( [], 1304 function( results, pair ) 1305 { 1306 var key = encodeURIComponent( pair.key ), values = pair.value; 1307 1308 if( values && typeof values == 'object' ) 1309 { 1310 if( Object.isArray( values ) ) 1311 return results.concat( values.map( toQueryPair.curry( key ) ) ); 1312 } 1313 else results.push( toQueryPair( key, values ) ); 1314 return results; 1315 } ).join( '&' ); 1316 }, 1317 1318 inspect: function() 1319 { 1320 return '#<Hash:{' + this.map( 1321 function( pair ) 1322 { 1323 return pair.map( Object.inspect ).join( ': ' ); 1324 } ).join( ', ' ) + '}>'; 1325 }, 1326 1327 toJSON: function() 1328 { 1329 return Object.toJSON( this.toObject() ); 1330 }, 1331 1332 clone: function() 1333 { 1334 return new Hash( this ); 1335 } 1336 } 1337 })() ); 1090 1338 1091 1339 Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; 1092 1340 Hash.from = $H; 1093 var ObjectRange = Class.create(Enumerable, { 1094 initialize: function(start, end, exclusive) { 1095 this.start = start; 1096 this.end = end; 1097 this.exclusive = exclusive; 1098 }, 1099 1100 _each: function(iterator) { 1101 var value = this.start; 1102 while (this.include(value)) { 1103 iterator(value); 1104 value = value.succ(); 1105 } 1106 }, 1107 1108 include: function(value) { 1109 if (value < this.start) 1110 return false; 1111 if (this.exclusive) 1112 return value < this.end; 1113 return value <= this.end; 1114 } 1115 }); 1116 1117 var $R = function(start, end, exclusive) { 1118 return new ObjectRange(start, end, exclusive); 1341 var ObjectRange = Class.create( Enumerable, { 1342 initialize: function( start, end, exclusive ) 1343 { 1344 this.start = start; 1345 this.end = end; 1346 this.exclusive = exclusive; 1347 }, 1348 1349 _each: function( iterator ) 1350 { 1351 var value = this.start; 1352 while( this.include( value ) ) 1353 { 1354 iterator( value ); 1355 value = value.succ(); 1356 } 1357 }, 1358 1359 include: function( value ) 1360 { 1361 if( value < this.start ) 1362 return false; 1363 if( this.exclusive ) 1364 return value < this.end; 1365 return value <= this.end; 1366 } 1367 } ); 1368 1369 var $R = function( start, end, exclusive ) 1370 { 1371 return new ObjectRange( start, end, exclusive ); 1119 1372 }; 1120 1373 1121 1374 var Ajax = { 1122 getTransport: function() { 1123 return Try.these( 1124 function() {return new XMLHttpRequest()}, 1125 function() {return new ActiveXObject('Msxml2.XMLHTTP')}, 1126 function() {return new ActiveXObject('Microsoft.XMLHTTP')} 1127 ) || false; 1128 }, 1129 1130 activeRequestCount: 0 1375 getTransport: function() 1376 { 1377 return Try.these( 1378 function() 1379 { 1380 return new XMLHttpRequest() 1381 }, 1382 function() 1383 { 1384 return new ActiveXObject( 'Msxml2.XMLHTTP' ) 1385 }, 1386 function() 1387 { 1388 return new ActiveXObject( 'Microsoft.XMLHTTP' ) 1389 } 1390 ) || false; 1391 }, 1392 1393 activeRequestCount: 0 1131 1394 }; 1132 1395 1133 1396 Ajax.Responders = { 1134 responders: [], 1135 1136 _each: function(iterator) { 1137 this.responders._each(iterator); 1138 }, 1139 1140 register: function(responder) { 1141 if (!this.include(responder)) 1142 this.responders.push(responder); 1143 }, 1144 1145 unregister: function(responder) { 1146 this.responders = this.responders.without(responder); 1147 }, 1148 1149 dispatch: function(callback, request, transport, json) { 1150 this.each(function(responder) { 1151 if (Object.isFunction(responder[callback])) { 1152 try { 1153 responder[callback].apply(responder, [request, transport, json]); 1154 } catch (e) { } 1155 } 1156 }); 1157 } 1397 responders: [], 1398 1399 _each: function( iterator ) 1400 { 1401 this.responders._each( iterator ); 1402 }, 1403 1404 register: function( responder ) 1405 { 1406 if( !this.include( responder ) ) 1407 this.responders.push( responder ); 1408 }, 1409 1410 unregister: function( responder ) 1411 { 1412 this.responders = this.responders.without( responder ); 1413 }, 1414 1415 dispatch: function( callback, request, transport, json ) 1416 { 1417 this.each( function( responder ) 1418 { 1419 if( Object.isFunction( responder[callback] ) ) 1420 { 1421 try 1422 { 1423 responder[callback].apply( responder, [request, transport, json] ); 1424 } 1425 catch ( e ) 1426 { 1427 } 1428 } 1429 } ); 1430 } 1158 1431 }; 1159 1432 1160 Object.extend(Ajax.Responders, Enumerable); 1161 1162 Ajax.Responders.register({ 1163 onCreate: function() { Ajax.activeRequestCount++ }, 1164 onComplete: function() { Ajax.activeRequestCount-- } 1165 }); 1166 1167 Ajax.Base = Class.create({ 1168 initialize: function(options) { 1169 this.options = { 1170 method: 'post', 1171 asynchronous: true, 1172 contentType: 'application/x-www-form-urlencoded', 1173 encoding: 'UTF-8', 1174 parameters: '', 1175 evalJSON: true, 1176 evalJS: true 1433 Object.extend( Ajax.Responders, Enumerable ); 1434 1435 Ajax.Responders.register( { 1436 onCreate: function() 1437 { 1438 Ajax.activeRequestCount++ 1439 }, 1440 onComplete: function() 1441 { 1442 Ajax.activeRequestCount-- 1443 } 1444 } ); 1445 1446 Ajax.Base = Class.create( { 1447 initialize: function( options ) 1448 { 1449 this.options = { 1450 method: 'post', 1451 asynchronous: true, 1452 contentType: 'application/x-www-form-urlencoded', 1453 encoding: 'UTF-8', 1454 parameters: '', 1455 evalJSON: true, 1456 evalJS: true 1457 }; 1458 Object.extend( this.options, options || { } ); 1459 1460 this.options.method = this.options.method.toLowerCase(); 1461 1462 if( Object.isString( this.options.parameters ) ) 1463 this.options.parameters = this.options.parameters.toQueryParams(); 1464 else if( Object.isHash( this.options.parameters ) ) 1465 this.options.parameters = this.options.parameters.toObject(); 1466 } 1467 } ); 1468 1469 Ajax.Request = Class.create( Ajax.Base, { 1470 _complete: false, 1471 1472 initialize: function( $super, url, options ) 1473 { 1474 $super( options ); 1475 this.transport = Ajax.getTransport(); 1476 this.request( url ); 1477 }, 1478 1479 request: function( url ) 1480 { 1481 this.url = url; 1482 this.method = this.options.method; 1483 var params = Object.clone( this.options.parameters ); 1484 1485 if( !['get', 'post'].include( this.method ) ) 1486 { 1487 // simulate other verbs over post 1488 params['_method'] = this.method; 1489 this.method = 'post'; 1490 } 1491 1492 this.parameters = params; 1493 1494 if( params = Object.toQueryString( params ) ) 1495 { 1496 // when GET, append parameters to URL 1497 if( this.method == 'get' ) 1498 this.url += (this.url.include( '?' ) ? '&' : '?') + params; 1499 else if( /Konqueror|Safari|KHTML/.test( navigator.userAgent ) ) 1500 params += '&_='; 1501 } 1502 1503 try 1504 { 1505 var response = new Ajax.Response( this ); 1506 if( this.options.onCreate ) this.options.onCreate( response ); 1507 Ajax.Responders.dispatch( 'onCreate', this, response ); 1508 1509 this.transport.open( this.method.toUpperCase(), this.url, 1510 this.options.asynchronous ); 1511 1512 if( this.options.asynchronous ) this.respondToReadyState.bind( this ).defer( 1 ); 1513 1514 this.transport.onreadystatechange = this.onStateChange.bind( this ); 1515 this.setRequestHeaders(); 1516 1517 this.body = this.method == 'post' ? (this.options.postBody || params) : null; 1518 this.transport.send( this.body ); 1519 1520 /* Force Firefox to handle ready state 4 for synchronous requests */ 1521 if( !this.options.asynchronous && this.transport.overrideMimeType ) 1522 this.onStateChange(); 1523 1524 } 1525 catch ( e ) 1526 { 1527 this.dispatchException( e ); 1528 } 1529 }, 1530 1531 onStateChange: function() 1532 { 1533 var readyState = this.transport.readyState; 1534 if( readyState > 1 && !((readyState == 4) && this._complete) ) 1535 this.respondToReadyState( this.transport.readyState ); 1536 }, 1537 1538 setRequestHeaders: function() 1539 { 1540 var headers = { 1541 'X-Requested-With': 'XMLHttpRequest', 1542 'X-Prototype-Version': Prototype.Version, 1543 'Accept': 'text/javascript, text/html, application/com.medias.xml, text/com.medias.xml, */*' 1544 }; 1545 1546 if( this.method == 'post' ) 1547 { 1548 headers['Content-type'] = this.options.contentType + 1549 (this.options.encoding ? '; charset=' + this.options.encoding : ''); 1550 1551 /* Force "Connection: close" for older Mozilla browsers to work 1552 * around a bug where XMLHttpRequest sends an incorrect 1553 * Content-length header. See Mozilla Bugzilla #246651. 1554 */ 1555 if( this.transport.overrideMimeType && 1556 (navigator.userAgent.match( /Gecko\/(\d{4})/ ) || [0,2005])[1] < 2005 ) 1557 headers['Connection'] = 'close'; 1558 } 1559 1560 // user-defined headers 1561 if( typeof this.options.requestHeaders == 'object' ) 1562 { 1563 var extras = this.options.requestHeaders; 1564 1565 if( Object.isFunction( extras.push ) ) 1566 for( var i = 0, length = extras.length; i < length; i += 2 ) 1567 headers[extras[i]] = extras[i + 1]; 1568 else 1569 $H( extras ).each( function( pair ) 1570 { 1571 headers[pair.key] = pair.value 1572 } ); 1573 } 1574 1575 for( var name in headers ) 1576 this.transport.setRequestHeader( name, headers[name] ); 1577 }, 1578 1579 success: function() 1580 { 1581 var status = this.getStatus(); 1582 return !status || (status >= 200 && status < 300); 1583 }, 1584 1585 getStatus: function() 1586 { 1587 try 1588 { 1589 return this.transport.status || 0; 1590 } 1591 catch ( e ) 1592 { 1593 return 0 1594 } 1595 }, 1596 1597 respondToReadyState: function( readyState ) 1598 { 1599 var state = Ajax.Request.Events[readyState], response = new Ajax.Response( this ); 1600 1601 if( state == 'Complete' ) 1602 { 1603 try 1604 { 1605 this._complete = true; 1606 (this.options['on' + response.status] 1607 || this.options['on' + (this.success() ? 'Success' : 'Failure')] 1608 || Prototype.emptyFunction)( response, response.headerJSON ); 1609 } 1610 catch ( e ) 1611 { 1612 this.dispatchException( e ); 1613 } 1614 1615 var contentType = response.getHeader( 'Content-type' ); 1616 if( this.options.evalJS == 'force' 1617 || (this.options.evalJS && this.isSameOrigin() && contentType 1618 && contentType.match( /^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i )) ) 1619 this.evalResponse(); 1620 } 1621 1622 try 1623 { 1624 (this.options['on' + state] || Prototype.emptyFunction)( response, response.headerJSON ); 1625 Ajax.Responders.dispatch( 'on' + state, this, response, response.headerJSON ); 1626 } 1627 catch ( e ) 1628 { 1629 this.dispatchException( e ); 1630 } 1631 1632 if( state == 'Complete' ) 1633 { 1634 // avoid memory leak in MSIE: clean up 1635 this.transport.onreadystatechange = Prototype.emptyFunction; 1636 } 1637 }, 1638 1639 isSameOrigin: function() 1640 { 1641 var m = this.url.match( /^\s*https?:\/\/[^\/]*/ ); 1642 return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate( { 1643 protocol: location.protocol, 1644 domain: document.domain, 1645 port: location.port ? ':' + location.port : '' 1646 } )); 1647 }, 1648 1649 getHeader: function( name ) 1650 { 1651 try 1652 { 1653 return this.transport.getResponseHeader( name ) || null; 1654 } 1655 catch ( e ) 1656 { 1657 return null 1658 } 1659 }, 1660 1661 evalResponse: function() 1662 { 1663 try 1664 { 1665 return (this.transport.responseText || '').unfilterJSON().evalJSON(); 1666 } 1667 catch ( e ) 1668 { 1669 this.dispatchException( e ); 1670 } 1671 }, 1672 1673 dispatchException: function( exception ) 1674 { 1675 (this.options.onException || Prototype.emptyFunction)( this, exception ); 1676 Ajax.Responders.dispatch( 'onException', this, exception ); 1677 } 1678 } ); 1679 1680 Ajax.Request.Events = 1681 ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; 1682 1683 Ajax.Response = Class.create( { 1684 initialize: function( request ) 1685 { 1686 this.request = request; 1687 var transport = this.transport = request.transport, 1688 readyState = this.readyState = transport.readyState; 1689 1690 if( (readyState > 2 && !Prototype.Browser.IE) || readyState == 4 ) 1691 { 1692 this.status = this.getStatus(); 1693 this.statusText = this.getStatusText(); 1694 this.responseText = String.interpret( transport.responseText ); 1695 this.headerJSON = this._getHeaderJSON(); 1696 } 1697 1698 if( readyState == 4 ) 1699 { 1700 var xml = transport.responseXML; 1701 this.responseXML = Object.isUndefined( xml ) ? null : xml; 1702 this.responseJSON = this._getResponseJSON(); 1703 } 1704 }, 1705 1706 status: 0, 1707 statusText: '', 1708 1709 getStatus: Ajax.Request.prototype.getStatus, 1710 1711 getStatusText: function() 1712 { 1713 try 1714 { 1715 return this.transport.statusText || ''; 1716 } 1717 catch ( e ) 1718 { 1719 return '' 1720 } 1721 }, 1722 1723 getHeader: Ajax.Request.prototype.getHeader, 1724 1725 getAllHeaders: function() 1726 { 1727 try 1728 { 1729 return this.getAllResponseHeaders(); 1730 } 1731 catch ( e ) 1732 { 1733 return null 1734 } 1735 }, 1736 1737 getResponseHeader: function( name ) 1738 { 1739 return this.transport.getResponseHeader( name ); 1740 }, 1741 1742 getAllResponseHeaders: function() 1743 { 1744 return this.transport.getAllResponseHeaders(); 1745 }, 1746 1747 _getHeaderJSON: function() 1748 { 1749 var json = this.getHeader( 'X-JSON' ); 1750 if( !json ) return null; 1751 json = decodeURIComponent( escape( json ) ); 1752 try 1753 { 1754 return json.evalJSON( this.request.options.sanitizeJSON || 1755 !this.request.isSameOrigin() ); 1756 } 1757 catch ( e ) 1758 { 1759 this.request.dispatchException( e ); 1760 } 1761 }, 1762 1763 _getResponseJSON: function() 1764 { 1765 var options = this.request.options; 1766 if( !options.evalJSON || (options.evalJSON != 'force' && 1767 !(this.getHeader( 'Content-type' ) || '').include( 'application/json' )) || 1768 this.responseText.blank() ) 1769 return null; 1770 try 1771 { 1772 return this.responseText.evalJSON( options.sanitizeJSON || 1773 !this.request.isSameOrigin() ); 1774 } 1775 catch ( e ) 1776 { 1777 this.request.dispatchException( e ); 1778 } 1779 } 1780 } ); 1781 1782 Ajax.Updater = Class.create( Ajax.Request, { 1783 initialize: function( $super, container, url, options ) 1784 { 1785 this.container = { 1786 success: (container.success || container), 1787 failure: (container.failure || (container.success ? null : container)) 1788 }; 1789 1790 options = Object.clone( options ); 1791 var onComplete = options.onComplete; 1792 options.onComplete = (function( response, json ) 1793 { 1794 this.updateContent( response.responseText ); 1795 if( Object.isFunction( onComplete ) ) onComplete( response, json ); 1796 }).bind( this ); 1797 1798 $super( url, options ); 1799 }, 1800 1801 updateContent: function( responseText ) 1802 { 1803 var receiver = this.container[this.success() ? 'success' : 'failure'], 1804 options = this.options; 1805 1806 if( !options.evalScripts ) responseText = responseText.stripScripts(); 1807 1808 if( receiver = $( receiver ) ) 1809 { 1810 if( options.insertion ) 1811 { 1812 if( Object.isString( options.insertion ) ) 1813 { 1814 var insertion = { }; 1815 insertion[options.insertion] = responseText; 1816 receiver.insert( insertion ); 1817 } 1818 else options.insertion( receiver, responseText ); 1819 } 1820 else receiver.update( responseText ); 1821 } 1822 } 1823 } ); 1824 1825 Ajax.PeriodicalUpdater = Class.create( Ajax.Base, { 1826 initialize: function( $super, container, url, options ) 1827 { 1828 $super( options ); 1829 this.onComplete = this.options.onComplete; 1830 1831 this.frequency = (this.options.frequency || 2); 1832 this.decay = (this.options.decay || 1); 1833 1834 this.updater = { }; 1835 this.container = container; 1836 this.url = url; 1837 1838 this.start(); 1839 }, 1840 1841 start: function() 1842 { 1843 this.options.onComplete = this.updateComplete.bind( this ); 1844 this.onTimerEvent(); 1845 }, 1846 1847 stop: function() 1848 { 1849 this.updater.options.onComplete = undefined; 1850 clearTimeout( this.timer ); 1851 (this.onComplete || Prototype.emptyFunction).apply( this, arguments ); 1852 }, 1853 1854 updateComplete: function( response ) 1855 { 1856 if( this.options.decay ) 1857 { 1858 this.decay = (response.responseText == this.lastText ? 1859 this.decay * this.options.decay : 1); 1860 1861 this.lastText = response.responseText; 1862 } 1863 this.timer = this.onTimerEvent.bind( this ).delay( this.decay * this.frequency ); 1864 }, 1865 1866 onTimerEvent: function() 1867 { 1868 this.updater = new Ajax.Updater( this.container, this.url, this.options ); 1869 } 1870 } ); 1871 function $( element ) 1872 { 1873 if( arguments.length > 1 ) 1874 { 1875 for( var i = 0, elements = [], length = arguments.length; i < length; i++ ) 1876 elements.push( $( arguments[i] ) ); 1877 return elements; 1878 } 1879 if( Object.isString( element ) ) 1880 element = document.getElementById( element ); 1881 return Element.extend( element ); 1882 } 1883 1884 if( Prototype.BrowserFeatures.XPath ) 1885 { 1886 document._getElementsByXPath = function( expression, parentElement ) 1887 { 1888 var results = []; 1889 var query = document.evaluate( expression, $( parentElement ) || document, 1890 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ); 1891 for( var i = 0, length = query.snapshotLength; i < length; i++ ) 1892 results.push( Element.extend( query.snapshotItem( i ) ) ); 1893 return results; 1177 1894 }; 1178 Object.extend(this.options, options || { }); 1179 1180 this.options.method = this.options.method.toLowerCase(); 1181 1182 if (Object.isString(this.options.parameters)) 1183 this.options.parameters = this.options.parameters.toQueryParams(); 1184 else if (Object.isHash(this.options.parameters)) 1185 this.options.parameters = this.options.parameters.toObject(); 1186 } 1187 }); 1188 1189 Ajax.Request = Class.create(Ajax.Base, { 1190 _complete: false, 1191 1192 initialize: function($super, url, options) { 1193 $super(options); 1194 this.transport = Ajax.getTransport(); 1195 this.request(url); 1196 }, 1197 1198 request: function(url) { 1199 this.url = url; 1200 this.method = this.options.method; 1201 var params = Object.clone(this.options.parameters); 1202 1203 if (!['get', 'post'].include(this.method)) { 1204 // simulate other verbs over post 1205 params['_method'] = this.method; 1206 this.method = 'post'; 1207 } 1208 1209 this.parameters = params; 1210 1211 if (params = Object.toQueryString(params)) { 1212 // when GET, append parameters to URL 1213 if (this.method == 'get') 1214 this.url += (this.url.include('?') ? '&' : '?') + params; 1215 else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) 1216 params += '&_='; 1217 } 1218 1219 try { 1220 var response = new Ajax.Response(this); 1221 if (this.options.onCreate) this.options.onCreate(response); 1222 Ajax.Responders.dispatch('onCreate', this, response); 1223 1224 this.transport.open(this.method.toUpperCase(), this.url, 1225 this.options.asynchronous); 1226 1227 if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1); 1228 1229 this.transport.onreadystatechange = this.onStateChange.bind(this); 1230 this.setRequestHeaders(); 1231 1232 this.body = this.method == 'post' ? (this.options.postBody || params) : null; 1233 this.transport.send(this.body); 1234 1235 /* Force Firefox to handle ready state 4 for synchronous requests */ 1236 if (!this.options.asynchronous && this.transport.overrideMimeType) 1237 this.onStateChange(); 1238 1239 } 1240 catch (e) { 1241 this.dispatchException(e); 1242 } 1243 }, 1244 1245 onStateChange: function() { 1246 var readyState = this.transport.readyState; 1247 if (readyState > 1 && !((readyState == 4) && this._complete)) 1248 this.respondToReadyState(this.transport.readyState); 1249 }, 1250 1251 setRequestHeaders: function() { 1252 var headers = { 1253 'X-Requested-With': 'XMLHttpRequest', 1254 'X-Prototype-Version': Prototype.Version, 1255 'Accept': 'text/javascript, text/html, application/com.medias.xml, text/com.medias.xml, */*' 1895 } 1896 1897 /*--------------------------------------------------------------------------*/ 1898 1899 if( !window.Node ) var Node = { }; 1900 1901 if( !Node.ELEMENT_NODE ) 1902 { 1903 // DOM level 2 ECMAScript Language Binding 1904 Object.extend( Node, { 1905 ELEMENT_NODE: 1, 1906 ATTRIBUTE_NODE: 2, 1907 TEXT_NODE: 3, 1908 CDATA_SECTION_NODE: 4, 1909 ENTITY_REFERENCE_NODE: 5, 1910 ENTITY_NODE: 6, 1911 PROCESSING_INSTRUCTION_NODE: 7, 1912 COMMENT_NODE: 8, 1913 DOCUMENT_NODE: 9, 1914 DOCUMENT_TYPE_NODE: 10, 1915 DOCUMENT_FRAGMENT_NODE: 11, 1916 NOTATION_NODE: 12 1917 } ); 1918 } 1919 1920 (function() 1921 { 1922 var element = this.Element; 1923 this.Element = function( tagName, attributes ) 1924 { 1925 attributes = attributes || { }; 1926 tagName = tagName.toLowerCase(); 1927 var cache = Element.cache; 1928 if( Prototype.Browser.IE && attributes.name ) 1929 { 1930 tagName = '<' + tagName + ' name="' + attributes.name + '">'; 1931 delete attributes.name; 1932 return Element.writeAttribute( document.createElement( tagName ), attributes ); 1933 } 1934 if( !cache[tagName] ) cache[tagName] = Element.extend( document.createElement( tagName ) ); 1935 return Element.writeAttribute( cache[tagName].cloneNode( false ), attributes ); 1256 1936 }; 1257 1258 if (this.method == 'post') { 1259 headers['Content-type'] = this.options.contentType + 1260 (this.options.encoding ? '; charset=' + this.options.encoding : ''); 1261 1262 /* Force "Connection: close" for older Mozilla browsers to work 1263 * around a bug where XMLHttpRequest sends an incorrect 1264 * Content-length header. See Mozilla Bugzilla #246651. 1265 */ 1266 if (this.transport.overrideMimeType && 1267 (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) 1268 headers['Connection'] = 'close'; 1269 } 1270 1271 // user-defined headers 1272 if (typeof this.options.requestHeaders == 'object') { 1273 var extras = this.options.requestHeaders; 1274 1275 if (Object.isFunction(extras.push)) 1276 for (var i = 0, length = extras.length; i < length; i += 2) 1277 headers[extras[i]] = extras[i+1]; 1278 else 1279 $H(extras).each(function(pair) { headers[pair.key] = pair.value }); 1280 } 1281 1282 for (var name in headers) 1283 this.transport.setRequestHeader(name, headers[name]); 1284 }, 1285 1286 success: function() { 1287 var status = this.getStatus(); 1288 return !status || (status >= 200 && status < 300); 1289 }, 1290 1291 getStatus: function() { 1292 try { 1293 return this.transport.status || 0; 1294 } catch (e) { return 0 } 1295 }, 1296 1297 respondToReadyState: function(readyState) { 1298 var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); 1299 1300 if (state == 'Complete') { 1301 try { 1302 this._complete = true; 1303 (this.options['on' + response.status] 1304 || this.options['on' + (this.success() ? 'Success' : 'Failure')] 1305 || Prototype.emptyFunction)(response, response.headerJSON); 1306 } catch (e) { 1307 this.dispatchException(e); 1308 } 1309 1310 var contentType = response.getHeader('Content-type'); 1311 if (this.options.evalJS == 'force' 1312 || (this.options.evalJS && this.isSameOrigin() && contentType 1313 && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) 1314 this.evalResponse(); 1315 } 1316 1317 try { 1318 (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); 1319 Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); 1320 } catch (e) { 1321 this.dispatchException(e); 1322 } 1323 1324 if (state == 'Complete') { 1325 // avoid memory leak in MSIE: clean up 1326 this.transport.onreadystatechange = Prototype.emptyFunction; 1327 } 1328 }, 1329 1330 isSameOrigin: function() { 1331 var m = this.url.match(/^\s*https?:\/\/[^\/]*/); 1332 return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ 1333 protocol: location.protocol, 1334 domain: document.domain, 1335 port: location.port ? ':' + location.port : '' 1336 })); 1337 }, 1338 1339 getHeader: function(name) { 1340 try { 1341 return this.transport.getResponseHeader(name) || null; 1342 } catch (e) { return null } 1343 }, 1344 1345 evalResponse: function() { 1346 try { 1347 return (this.transport.responseText || '').unfilterJSON().evalJSON(); 1348 } catch (e) { 1349 this.dispatchException(e); 1350 } 1351 }, 1352 1353 dispatchException: function(exception) { 1354 (this.options.onException || Prototype.emptyFunction)(this, exception); 1355 Ajax.Responders.dispatch('onException', this, exception); 1356 } 1357 }); 1358 1359 Ajax.Request.Events = 1360 ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; 1361 1362 Ajax.Response = Class.create({ 1363 initialize: function(request){ 1364 this.request = request; 1365 var transport = this.transport = request.transport, 1366 readyState = this.readyState = transport.readyState; 1367 1368 if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { 1369 this.status = this.getStatus(); 1370 this.statusText = this.getStatusText(); 1371 this.responseText = String.interpret(transport.responseText); 1372 this.headerJSON = this._getHeaderJSON(); 1373 } 1374 1375 if(readyState == 4) { 1376 var xml = transport.responseXML; 1377 this.responseXML = Object.isUndefined(xml) ? null : xml; 1378 this.responseJSON = this._getResponseJSON(); 1379 } 1380 }, 1381 1382 status: 0, 1383 statusText: '', 1384 1385 getStatus: Ajax.Request.prototype.getStatus, 1386 1387 getStatusText: function() { 1388 try { 1389 return this.transport.statusText || ''; 1390 } catch (e) { return '' } 1391 }, 1392 1393 getHeader: Ajax.Request.prototype.getHeader, 1394 1395 getAllHeaders: function() { 1396 try { 1397 return this.getAllResponseHeaders(); 1398 } catch (e) { return null } 1399 }, 1400 1401 getResponseHeader: function(name) { 1402 return this.transport.getResponseHeader(name); 1403 }, 1404 1405 getAllResponseHeaders: function() { 1406 return this.transport.getAllResponseHeaders(); 1407 }, 1408 1409 _getHeaderJSON: function() { 1410 var json = this.getHeader('X-JSON'); 1411 if (!json) return null; 1412 json = decodeURIComponent(escape(json)); 1413 try { 1414 return json.evalJSON(this.request.options.sanitizeJSON || 1415 !this.request.isSameOrigin()); 1416 } catch (e) { 1417 this.request.dispatchException(e); 1418 } 1419 }, 1420 1421 _getResponseJSON: function() { 1422 var options = this.request.options; 1423 if (!options.evalJSON || (options.evalJSON != 'force' && 1424 !(this.getHeader('Content-type') || '').include('application/json')) || 1425 this.responseText.blank()) 1426 return null; 1427 try { 1428 return this.responseText.evalJSON(options.sanitizeJSON || 1429 !this.request.isSameOrigin()); 1430 } catch (e) { 1431 this.request.dispatchException(e); 1432 } 1433 } 1434 }); 1435 1436 Ajax.Updater = Class.create(Ajax.Request, { 1437 initialize: function($super, container, url, options) { 1438 this.container = { 1439 success: (container.success || container), 1440 failure: (container.failure || (container.success ? null : container)) 1937 Object.extend( this.Element, element || { } ); 1938 if( element ) this.Element.prototype = element.prototype; 1939 }).call( window ); 1940 1941 Element.cache = { }; 1942 1943 Element.Methods = { 1944 visible: function( element ) 1945 { 1946 return $( element ).style.display != 'none'; 1947 }, 1948 1949 toggle: function( element ) 1950 { 1951 element = $( element ); 1952 Element[Element.visible( element ) ? 'hide' : 'show']( element ); 1953 return element; 1954 }, 1955 1956 hide: function( element ) 1957 { 1958 element = $( element ); 1959 element.style.display = 'none'; 1960 return element; 1961 }, 1962 1963 show: function( element ) 1964 { 1965 element = $( element ); 1966 element.style.display = ''; 1967 return element; 1968 }, 1969 1970 remove: function( element ) 1971 { 1972 element = $( element ); 1973 element.parentNode.removeChild( element ); 1974 return element; 1975 }, 1976 1977 update: function( element, content ) 1978 { 1979 element = $( element ); 1980 if( content && content.toElement ) content = content.toElement(); 1981 if( Object.isElement( content ) ) return element.update().insert( content ); 1982 content = Object.toHTML( content ); 1983 element.innerHTML = content.stripScripts(); 1984 content.evalScripts.bind( content ).defer(); 1985 return element; 1986 }, 1987 1988 replace: function( element, content ) 1989 { 1990 element = $( element ); 1991 if( content && content.toElement ) content = content.toElement(); 1992 else if( !Object.isElement( content ) ) 1993 { 1994 content = Object.toHTML( content ); 1995 var range = element.ownerDocument.createRange(); 1996 range.selectNode( element ); 1997 content.evalScripts.bind( content ).defer(); 1998 content = range.createContextualFragment( content.stripScripts() ); 1999 } 2000 element.parentNode.replaceChild( content, element ); 2001 return element; 2002 }, 2003 2004 insert: function( element, insertions ) 2005 { 2006 element = $( element ); 2007 2008 if( Object.isString( insertions ) || Object.isNumber( insertions ) || 2009 Object.isElement( insertions ) || (insertions && (insertions.toElement || insertions.toHTML)) ) 2010 insertions = {bottom:insertions}; 2011 2012 var content, insert, tagName, childNodes; 2013 2014 for( var position in insertions ) 2015 { 2016 content = insertions[position]; 2017 position = position.toLowerCase(); 2018 insert = Element._insertionTranslations[position]; 2019 2020 if( content && content.toElement ) content = content.toElement(); 2021 if( Object.isElement( content ) ) 2022 { 2023 insert( element, content ); 2024 continue; 2025 } 2026 2027 content = Object.toHTML( content ); 2028 2029 tagName = ((position == 'before' || position == 'after') 2030 ? element.parentNode : element).tagName.toUpperCase(); 2031 2032 childNodes = Element._getContentFromAnonymousElement( tagName, content.stripScripts() ); 2033 2034 if( position == 'top' || position == 'after' ) childNodes.reverse(); 2035 childNodes.each( insert.curry( element ) ); 2036 2037 content.evalScripts.bind( content ).defer(); 2038 } 2039 2040 return element; 2041 }, 2042 2043 wrap: function( element, wrapper, attributes ) 2044 { 2045 element = $( element ); 2046 if( Object.isElement( wrapper ) ) 2047 $( wrapper ).writeAttribute( attributes || { } ); 2048 else if( Object.isString( wrapper ) ) wrapper = new Element( wrapper, attributes ); 2049 else wrapper = new Element( 'div', wrapper ); 2050 if( element.parentNode ) 2051 element.parentNode.replaceChild( wrapper, element ); 2052 wrapper.appendChild( element ); 2053 return wrapper; 2054 }, 2055 2056 inspect: function( element ) 2057 { 2058 element = $( element ); 2059 var result = '<' + element.tagName.toLowerCase(); 2060 $H( {'id': 'id', 'className': 'class'} ).each( function( pair ) 2061 { 2062 var property = pair.first(), attribute = pair.last(); 2063 var value = (element[property] || '').toString(); 2064 if( value ) result += ' ' + attribute + '=' + value.inspect( true ); 2065 } ); 2066 return result + '>'; 2067 }, 2068 2069 recursivelyCollect: function( element, property ) 2070 { 2071 element = $( element ); 2072 var elements = []; 2073 while( element = element[property] ) 2074 if( element.nodeType == 1 ) 2075 elements.push( Element.extend( element ) ); 2076 return elements; 2077 }, 2078 2079 ancestors: function( element ) 2080 { 2081 return $( element ).recursivelyCollect( 'parentNode' ); 2082 }, 2083 2084 descendants: function( element ) 2085 { 2086 return $( element ).select( "*" ); 2087 }, 2088 2089 firstDescendant: function( element ) 2090 { 2091 element = $( element ).firstChild; 2092 while( element && element.nodeType != 1 ) element = element.nextSibling; 2093 return $( element ); 2094 }, 2095 2096 immediateDescendants: function( element ) 2097 { 2098 if( !(element = $( element ).firstChild) ) return []; 2099 while( element && element.nodeType != 1 ) element = element.nextSibling; 2100 if( element ) return [element].concat( $( element ).nextSiblings() ); 2101 return []; 2102 }, 2103 2104 previousSiblings: function( element ) 2105 { 2106 return $( element ).recursivelyCollect( 'previousSibling' ); 2107 }, 2108 2109 nextSiblings: function( element ) 2110 { 2111 return $( element ).recursivelyCollect( 'nextSibling' ); 2112 }, 2113 2114 siblings: function( element ) 2115 { 2116 element = $( element ); 2117 return element.previousSiblings().reverse().concat( element.nextSiblings() ); 2118 }, 2119 2120 match: function( element, selector ) 2121 { 2122 if( Object.isString( selector ) ) 2123 selector = new Selector( selector ); 2124 return selector.match( $( element ) ); 2125 }, 2126 2127 up: function( element, expression, index ) 2128 { 2129 element = $( element ); 2130 if( arguments.length == 1 ) return $( element.parentNode ); 2131 var ancestors = element.ancestors(); 2132 return Object.isNumber( expression ) ? ancestors[expression] : 2133 Selector.findElement( ancestors, expression, index ); 2134 }, 2135 2136 down: function( element, expression, index ) 2137 { 2138 element = $( element ); 2139 if( arguments.length == 1 ) return element.firstDescendant(); 2140 return Object.isNumber( expression ) ? element.descendants()[expression] : 2141 Element.select( element, expression )[index || 0]; 2142 }, 2143 2144 previous: function( element, expression, index ) 2145 { 2146 element = $( element ); 2147 if( arguments.length == 1 ) return $( Selector.handlers.previousElementSibling( element ) ); 2148 var previousSiblings = element.previousSiblings(); 2149 return Object.isNumber( expression ) ? previousSiblings[expression] : 2150 Selector.findElement( previousSiblings, expression, index ); 2151 }, 2152 2153 next: function( element, expression, index ) 2154 { 2155 element = $( element ); 2156 if( arguments.length == 1 ) return $( Selector.handlers.nextElementSibling( element ) ); 2157 var nextSiblings = element.nextSiblings(); 2158 return Object.isNumber( expression ) ? nextSiblings[expression] : 2159 Selector.findElement( nextSiblings, expression, index ); 2160 }, 2161 2162 select: function() 2163 { 2164 var args = $A( arguments ), element = $( args.shift() ); 2165 return Selector.findChildElements( element, args ); 2166 }, 2167 2168 adjacent: function() 2169 { 2170 var args = $A( arguments ), element = $( args.shift() ); 2171 return Selector.findChildElements( element.parentNode, args ).without( element ); 2172 }, 2173 2174 identify: function( element ) 2175 { 2176 element = $( element ); 2177 var id = element.readAttribute( 'id' ), self = arguments.callee; 2178 if( id ) return id; 2179 do { 2180 id = 'anonymous_element_' + self.counter++ 2181 } 2182 while( $( id ) ); 2183 element.writeAttribute( 'id', id ); 2184 return id; 2185 }, 2186 2187 readAttribute: function( element, name ) 2188 { 2189 element = $( element ); 2190 if( Prototype.Browser.IE ) 2191 { 2192 var t = Element._attributeTranslations.read; 2193 if( t.values[name] ) return t.values[name]( element, name ); 2194 if( t.names[name] ) name = t.names[name]; 2195 if( name.include( ':' ) ) 2196 { 2197 return (!element.attributes || !element.attributes[name]) ? null : 2198 element.attributes[name].value; 2199 } 2200 } 2201 return element.getAttribute( name ); 2202 }, 2203 2204 writeAttribute: function( element, name, value ) 2205 { 2206 element = $( element ); 2207 var attributes = { }, t = Element._attributeTranslations.write; 2208 2209 if( typeof name == 'object' ) attributes = name; 2210 else attributes[name] = Object.isUndefined( value ) ? true : value; 2211 2212 for( var attr in attributes ) 2213 { 2214 name = t.names[attr] || attr; 2215 value = attributes[attr]; 2216 if( t.values[attr] ) name = t.values[attr]( element, value ); 2217 if( value === false || value === null ) 2218 element.removeAttribute( name ); 2219 else if( value === true ) 2220 element.setAttribute( name, name ); 2221 else element.setAttribute( name, value ); 2222 } 2223 return element; 2224 }, 2225 2226 getHeight: function( element ) 2227 { 2228 return $( element ).getDimensions().height; 2229 }, 2230 2231 getWidth: function( element ) 2232 { 2233 return $( element ).getDimensions().width; 2234 }, 2235 2236 classNames: function( element ) 2237 { 2238 return new Element.ClassNames( element ); 2239 }, 2240 2241 hasClassName: function( element, className ) 2242 { 2243 if( !(element = $( element )) ) return; 2244 var elementClassName = element.className; 2245 return (elementClassName.length > 0 && (elementClassName == className || 2246 new RegExp( "(^|\\s)" + className + "(\\s|$)" ).test( elementClassName ))); 2247 }, 2248 2249 addClassName: function( element, className ) 2250 { 2251 if( !(element = $( element )) ) return; 2252 if( !element.hasClassName( className ) ) 2253 element.className += (element.className ? ' ' : '') + className; 2254 return element; 2255 }, 2256 2257 removeClassName: function( element, className ) 2258 { 2259 if( !(element = $( element )) ) return; 2260 element.className = element.className.replace( 2261 new RegExp( "(^|\\s+)" + className + "(\\s+|$)" ), ' ' ).strip(); 2262 return element; 2263 }, 2264 2265 toggleClassName: function( element, className ) 2266 { 2267 if( !(element = $( element )) ) return; 2268 return element[element.hasClassName( className ) ? 2269 'removeClassName' : 'addClassName']( className ); 2270 }, 2271 2272 // removes whitespace-only text node children 2273 cleanWhitespace: function( element ) 2274 { 2275 element = $( element ); 2276 var node = element.firstChild; 2277 while( node ) 2278 { 2279 var nextNode = node.nextSibling; 2280 if( node.nodeType == 3 && !/\S/.test( node.nodeValue ) ) 2281 element.removeChild( node ); 2282 node = nextNode; 2283 } 2284 return element; 2285 }, 2286 2287 empty: function( element ) 2288 { 2289 return $( element ).innerHTML.blank(); 2290 }, 2291 2292 descendantOf: function( element, ancestor ) 2293 { 2294 element = $( element ),ancestor = $( ancestor ); 2295 2296 if( element.compareDocumentPosition ) 2297 return (element.compareDocumentPosition( ancestor ) & 8) === 8; 2298 2299 if( ancestor.contains ) 2300 return ancestor.contains( element ) && ancestor !== element; 2301 2302 while( element = element.parentNode ) 2303 if( element == ancestor ) return true; 2304 2305 return false; 2306 }, 2307 2308 scrollTo: function( element ) 2309 { 2310 element = $( element ); 2311 var pos = element.cumulativeOffset(); 2312 window.scrollTo( pos[0], pos[1] ); 2313 return element; 2314 }, 2315 2316 getStyle: function( element, style ) 2317 { 2318 element = $( element ); 2319 style = style == 'float' ? 'cssFloat' : style.camelize(); 2320 var value = element.style[style]; 2321 if( !value || value == 'auto' ) 2322 { 2323 var css = document.defaultView.getComputedStyle( element, null ); 2324 value = css ? css[style] : null; 2325 } 2326 if( style == 'opacity' ) return value ? parseFloat( value ) : 1.0; 2327 return value == 'auto' ? null : value; 2328 }, 2329 2330 getOpacity: function( element ) 2331 { 2332 return $( element ).getStyle( 'opacity' ); 2333 }, 2334 2335 setStyle: function( element, styles ) 2336 { 2337 element = $( element ); 2338 var elementStyle = element.style, match; 2339 if( Object.isString( styles ) ) 2340 { 2341 element.style.cssText += ';' + styles; 2342 return styles.include( 'opacity' ) ? 2343 element.setOpacity( styles.match( /opacity:\s*(\d?\.?\d*)/ )[1] ) : element; 2344 } 2345 for( var property in styles ) 2346 if( property == 'opacity' ) element.setOpacity( styles[property] ); 2347 else 2348 elementStyle[(property == 'float' || property == 'cssFloat') ? 2349 (Object.isUndefined( elementStyle.styleFloat ) ? 'cssFloat' : 'styleFloat') : 2350 property] = styles[property]; 2351 2352 return element; 2353 }, 2354 2355 setOpacity: function( element, value ) 2356 { 2357 element = $( element ); 2358 element.style.opacity = (value == 1 || value === '') ? '' : 2359 (value < 0.00001) ? 0 : value; 2360 return element; 2361 }, 2362 2363 getDimensions: function( element ) 2364 { 2365 element = $( element ); 2366 var display = element.getStyle( 'display' ); 2367 if( display != 'none' && display != null ) // Safari bug 2368 return {width: element.offsetWidth, height: element.offsetHeight}; 2369 2370 // All *Width and *Height properties give 0 on elements with display none, 2371 // so enable the element temporarily 2372 var els = element.style; 2373 var originalVisibility = els.visibility; 2374 var originalPosition = els.position; 2375 var originalDisplay = els.display; 2376 els.visibility = 'hidden'; 2377 els.position = 'absolute'; 2378 els.display = 'block'; 2379 var originalWidth = element.clientWidth; 2380 var originalHeight = element.clientHeight; 2381 els.display = originalDisplay; 2382 els.position = originalPosition; 2383 els.visibility = originalVisibility; 2384 return {width: originalWidth, height: originalHeight}; 2385 }, 2386 2387 makePositioned: function( element ) 2388 { 2389 element = $( element ); 2390 var pos = Element.getStyle( element, 'position' ); 2391 if( pos == 'static' || !pos ) 2392 { 2393 element._madePositioned = true; 2394 element.style.position = 'relative'; 2395 // Opera returns the offset relative to the positioning context, when an 2396 // element is position relative but top and left have not been defined 2397 if( Prototype.Browser.Opera ) 2398 { 2399 element.style.top = 0; 2400 element.style.left = 0; 2401 } 2402 } 2403 return element; 2404 }, 2405 2406 undoPositioned: function( element ) 2407 { 2408 element = $( element ); 2409 if( element._madePositioned ) 2410 { 2411 element._madePositioned = undefined; 2412 element.style.position = 2413 element.style.top = 2414 element.style.left = 2415 element.style.bottom = 2416 element.style.right = ''; 2417 } 2418 return element; 2419 }, 2420 2421 makeClipping: function( element ) 2422 { 2423 element = $( element ); 2424 if( element._overflow ) return element; 2425 element._overflow = Element.getStyle( element, 'overflow' ) || 'auto'; 2426 if( element._overflow !== 'hidden' ) 2427 element.style.overflow = 'hidden'; 2428 return element; 2429 }, 2430 2431 undoClipping: function( element ) 2432 { 2433 element = $( element ); 2434 if( !element._overflow ) return element; 2435 element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; 2436 element._overflow = null; 2437 return element; 2438 }, 2439 2440 cumulativeOffset: function( element ) 2441 { 2442 var valueT = 0, valueL = 0; 2443 do { 2444 valueT += element.offsetTop || 0; 2445 valueL += element.offsetLeft || 0; 2446 element = element.offsetParent; 2447 } 2448 while( element ); 2449 return Element._returnOffset( valueL, valueT ); 2450 }, 2451 2452 positionedOffset: function( element ) 2453 { 2454 var valueT = 0, valueL = 0; 2455 do { 2456 valueT += element.offsetTop || 0; 2457 valueL += element.offsetLeft || 0; 2458 element = element.offsetParent; 2459 if( element ) 2460 { 2461 if( element.tagName.toUpperCase() == 'BODY' ) break; 2462 var p = Element.getStyle( element, 'position' ); 2463 if( p !== 'static' ) break; 2464 } 2465 } 2466 while( element ); 2467 return Element._returnOffset( valueL, valueT ); 2468 }, 2469 2470 absolutize: function( element ) 2471 { 2472 element = $( element ); 2473 if( element.getStyle( 'position' ) == 'absolute' ) return element; 2474 // Position.prepare(); // To be done manually by Scripty when it needs it. 2475 2476 var offsets = element.positionedOffset(); 2477 var top = offsets[1]; 2478 var left = offsets[0]; 2479 var width = element.clientWidth; 2480 var height = element.clientHeight; 2481 2482 element._originalLeft = left - parseFloat( element.style.left || 0 ); 2483 element._originalTop = top - parseFloat( element.style.top || 0 ); 2484 element._originalWidth = element.style.width; 2485 element._originalHeight = element.style.height; 2486 2487 element.style.position = 'absolute'; 2488 element.style.top = top + 'px'; 2489 element.style.left = left + 'px'; 2490 element.style.width = width + 'px'; 2491 element.style.height = height + 'px'; 2492 return element; 2493 }, 2494 2495 relativize: function( element ) 2496 { 2497 element = $( element ); 2498 if( element.getStyle( 'position' ) == 'relative' ) return element; 2499 // Position.prepare(); // To be done manually by Scripty when it needs it. 2500 2501 element.style.position = 'relative'; 2502 var top = parseFloat( element.style.top || 0 ) - (element._originalTop || 0); 2503 var left = parseFloat( element.style.left || 0 ) - (element._originalLeft || 0); 2504 2505 element.style.top = top + 'px'; 2506 element.style.left = left + 'px'; 2507 element.style.height = element._originalHeight; 2508 element.style.width = element._originalWidth; 2509 return element; 2510 }, 2511 2512 cumulativeScrollOffset: function( element ) 2513 { 2514 var valueT = 0, valueL = 0; 2515 do { 2516 valueT += element.scrollTop || 0; 2517 valueL += element.scrollLeft || 0; 2518 element = element.parentNode; 2519 } 2520 while( element ); 2521 return Element._returnOffset( valueL, valueT ); 2522 }, 2523 2524 getOffsetParent: function( element ) 2525 { 2526 if( element.offsetParent ) return $( element.offsetParent ); 2527 if( element == document.body ) return $( element ); 2528 2529 while( (element = element.parentNode) && element != document.body ) 2530 if( Element.getStyle( element, 'position' ) != 'static' ) 2531 return $( element ); 2532 2533 return $( document.body ); 2534 }, 2535 2536 viewportOffset: function( forElement ) 2537 { 2538 var valueT = 0, valueL = 0; 2539 2540 var element = forElement; 2541 do { 2542 valueT += element.offsetTop || 0; 2543 valueL += element.offsetLeft || 0; 2544 2545 // Safari fix 2546 if( element.offsetParent == document.body && 2547 Element.getStyle( element, 'position' ) == 'absolute' ) break; 2548 2549 } 2550 while( element = element.offsetParent ); 2551 2552 element = forElement; 2553 do { 2554 if( !Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY')) ) 2555 { 2556 valueT -= element.scrollTop || 0; 2557 valueL -= element.scrollLeft || 0; 2558 } 2559 } 2560 while( element = element.parentNode ); 2561 2562 return Element._returnOffset( valueL, valueT ); 2563 }, 2564 2565 clonePosition: function( element, source ) 2566 { 2567 var options = Object.extend( { 2568 setLeft: true, 2569 setTop: true, 2570 setWidth: true, 2571 setHeight: true, 2572 offsetTop: 0, 2573 offsetLeft: 0 2574 }, arguments[2] || { } ); 2575 2576 // find page position of source 2577 source = $( source ); 2578 var p = source.viewportOffset(); 2579 2580 // find coordinate system to use 2581 element = $( element ); 2582 var delta = [0, 0]; 2583 var parent = null; 2584 // delta [0,0] will do fine with position: fixed elements, 2585 // position:absolute needs offsetParent deltas 2586 if( Element.getStyle( element, 'position' ) == 'absolute' ) 2587 { 2588 parent = element.getOffsetParent(); 2589 delta = parent.viewportOffset(); 2590 } 2591 2592 // correct by body offsets (fixes Safari) 2593 if( parent == document.body ) 2594 { 2595 delta[0] -= document.body.offsetLeft; 2596 delta[1] -= document.body.offsetTop; 2597 } 2598 2599 // set position 2600 if( options.setLeft ) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; 2601 if( options.setTop ) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; 2602 if( options.setWidth ) element.style.width = source.offsetWidth + 'px'; 2603 if( options.setHeight ) element.style.height = source.offsetHeight + 'px'; 2604 return element; 2605 } 2606 }; 2607 2608 Element.Methods.identify.counter = 1; 2609 2610 Object.extend( Element.Methods, { 2611 getElementsBySelector: Element.Methods.select, 2612 childElements: Element.Methods.immediateDescendants 2613 } ); 2614 2615 Element._attributeTranslations = { 2616 write: { 2617 names: { 2618 className: 'class', 2619 htmlFor: 'for' 2620 }, 2621 values: { } 2622 } 2623 }; 2624 2625 if( Prototype.Browser.Opera ) 2626 { 2627 Element.Methods.getStyle = Element.Methods.getStyle.wrap( 2628 function( proceed, element, style ) 2629 { 2630 switch( style ) 2631 { 2632 case 'left': case 'top': case 'right': case 'bottom': 2633 if( proceed( element, 'position' ) === 'static' ) return null; 2634 case 'height': case 'width': 2635 // returns '0px' for hidden elements; we want it to return null 2636 if( !Element.visible( element ) ) return null; 2637 2638 // returns the border-box dimensions rather than the content-box 2639 // dimensions, so we subtract padding and borders from the value 2640 var dim = parseInt( proceed( element, style ), 10 ); 2641 2642 if( dim !== element['offset' + style.capitalize()] ) 2643 return dim + 'px'; 2644 2645 var properties; 2646 if( style === 'height' ) 2647 { 2648 properties = ['border-top-width', 'padding-top', 2649 'padding-bottom', 'border-bottom-width']; 2650 } 2651 else 2652 { 2653 properties = ['border-left-width', 'padding-left', 2654 'padding-right', 'border-right-width']; 2655 } 2656 return properties.inject( dim, function( memo, property ) 2657 { 2658 var val = proceed( element, property ); 2659 return val === null ? memo : memo - parseInt( val, 10 ); 2660 } ) + 'px'; 2661 default: return proceed( element, style ); 2662 } 2663 } 2664 ); 2665 2666 Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( 2667 function( proceed, element, attribute ) 2668 { 2669 if( attribute === 'title' ) return element.title; 2670 return proceed( element, attribute ); 2671 } 2672 ); 2673 } 2674 2675 else if( Prototype.Browser.IE ) 2676 { 2677 // IE doesn't report offsets correctly for static elements, so we change them 2678 // to "relative" to get the values, then change them back. 2679 Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( 2680 function( proceed, element ) 2681 { 2682 element = $( element ); 2683 // IE throws an error if element is not in document 2684 try 2685 { 2686 element.offsetParent 2687 } 2688 catch( e ) 2689 { 2690 return $( document.body ) 2691 } 2692 var position = element.getStyle( 'position' ); 2693 if( position !== 'static' ) return proceed( element ); 2694 element.setStyle( { position: 'relative' } ); 2695 var value = proceed( element ); 2696 element.setStyle( { position: position } ); 2697 return value; 2698 } 2699 ); 2700 2701 $w( 'positionedOffset viewportOffset' ).each( function( method ) 2702 { 2703 Element.Methods[method] = Element.Methods[method].wrap( 2704 function( proceed, element ) 2705 { 2706 element = $( element ); 2707 try 2708 { 2709 element.offsetParent 2710 } 2711 catch( e ) 2712 { 2713 return Element._returnOffset( 0, 0 ) 2714 } 2715 var position = element.getStyle( 'position' ); 2716 if( position !== 'static' ) return proceed( element ); 2717 // Trigger hasLayout on the offset parent so that IE6 reports 2718 // accurate offsetTop and offsetLeft values for position: fixed. 2719 var offsetParent = element.getOffsetParent(); 2720 if( offsetParent && offsetParent.getStyle( 'position' ) === 'fixed' ) 2721 offsetParent.setStyle( { zoom: 1 } ); 2722 element.setStyle( { position: 'relative' } ); 2723 var value = proceed( element ); 2724 element.setStyle( { position: position } ); 2725 return value; 2726 } 2727 ); 2728 } ); 2729 2730 Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( 2731 function( proceed, element ) 2732 { 2733 try 2734 { 2735 element.offsetParent 2736 } 2737 catch( e ) 2738 { 2739 return Element._returnOffset( 0, 0 ) 2740 } 2741 return proceed( element ); 2742 } 2743 ); 2744 2745 Element.Methods.getStyle = function( element, style ) 2746 { 2747 element = $( element ); 2748 style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); 2749 var value = element.style[style]; 2750 if( !value && element.currentStyle ) value = element.currentStyle[style]; 2751 2752 if( style == 'opacity' ) 2753 { 2754 if( value = (element.getStyle( 'filter' ) || '').match( /alpha\(opacity=(.*)\)/ ) ) 2755 if( value[1] ) return parseFloat( value[1] ) / 100; 2756 return 1.0; 2757 } 2758 2759 if( value == 'auto' ) 2760 { 2761 if( (style == 'width' || style == 'height') && (element.getStyle( 'display' ) != 'none') ) 2762 return element['offset' + style.capitalize()] + 'px'; 2763 return null; 2764 } 2765 return value; 1441 2766 }; 1442 2767 1443 options = Object.clone(options); 1444 var onComplete = options.onComplete; 1445 options.onComplete = (function(response, json) { 1446 this.updateContent(response.responseText); 1447 if (Object.isFunction(onComplete)) onComplete(response, json); 1448 }).bind(this); 1449 1450 $super(url, options); 1451 }, 1452 1453 updateContent: function(responseText) { 1454 var receiver = this.container[this.success() ? 'success' : 'failure'], 1455 options = this.options; 1456 1457 if (!options.evalScripts) responseText = responseText.stripScripts(); 1458 1459 if (receiver = $(receiver)) { 1460 if (options.insertion) { 1461 if (Object.isString(options.insertion)) { 1462 var insertion = { }; insertion[options.insertion] = responseText; 1463 receiver.insert(insertion); 1464 } 1465 else options.insertion(receiver, responseText); 1466 } 1467 else receiver.update(responseText); 1468 } 1469 } 1470 }); 1471 1472 Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { 1473 initialize: function($super, container, url, options) { 1474 $super(options); 1475 this.onComplete = this.options.onComplete; 1476 1477 this.frequency = (this.options.frequency || 2); 1478 this.decay = (this.options.decay || 1); 1479 1480 this.updater = { }; 1481 this.container = container; 1482 this.url = url; 1483 1484 this.start(); 1485 }, 1486 1487 start: function() { 1488 this.options.onComplete = this.updateComplete.bind(this); 1489 this.onTimerEvent(); 1490 }, 1491 1492 stop: function() { 1493 this.updater.options.onComplete = undefined; 1494 clearTimeout(this.timer); 1495 (this.onComplete || Prototype.emptyFunction).apply(this, arguments); 1496 }, 1497 1498 updateComplete: function(response) { 1499 if (this.options.decay) { 1500 this.decay = (response.responseText == this.lastText ? 1501 this.decay * this.options.decay : 1); 1502 1503 this.lastText = response.responseText; 1504 } 1505 this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency); 1506 }, 1507 1508 onTimerEvent: function() { 1509 this.updater = new Ajax.Updater(this.container, this.url, this.options); 1510 } 1511 }); 1512 function $(element) { 1513 if (arguments.length > 1) { 1514 for (var i = 0, elements = [], length = arguments.length; i < length; i++) 1515 elements.push($(arguments[i])); 1516 return elements; 1517 } 1518 if (Object.isString(element)) 1519 element = document.getElementById(element); 1520 return Element.extend(element); 2768 Element.Methods.setOpacity = function( element, value ) 2769 { 2770 function stripAlpha( filter ) 2771 { 2772 return filter.replace( /alpha\([^\)]*\)/gi, '' ); 2773 } 2774 2775 element = $( element ); 2776 var currentStyle = element.currentStyle; 2777 if( (currentStyle && !currentStyle.hasLayout) || 2778 (!currentStyle && element.style.zoom == 'normal') ) 2779 element.style.zoom = 1; 2780 2781 var filter = element.getStyle( 'filter' ), style = element.style; 2782 if( value == 1 || value === '' ) 2783 { 2784 (filter = stripAlpha( filter )) ? 2785 style.filter = filter : style.removeAttribute( 'filter' ); 2786 return element; 2787 } else if( value < 0.00001 ) value = 0; 2788 style.filter = stripAlpha( filter ) + 2789 'alpha(opacity=' + (value * 100) + ')'; 2790 return element; 2791 }; 2792 2793 Element._attributeTranslations = { 2794 read: { 2795 names: { 2796 'class': 'className', 2797 'for': 'htmlFor' 2798 }, 2799 values: { 2800 _getAttr: function( element, attribute ) 2801 { 2802 return element.getAttribute( attribute, 2 ); 2803 }, 2804 _getAttrNode: function( element, attribute ) 2805 { 2806 var node = element.getAttributeNode( attribute ); 2807 return node ? node.value : ""; 2808 }, 2809 _getEv: function( element, attribute ) 2810 { 2811 attribute = element.getAttribute( attribute ); 2812 return attribute ? attribute.toString().slice( 23, -2 ) : null; 2813 }, 2814 _flag: function( element, attribute ) 2815 { 2816 return $( element ).hasAttribute( attribute ) ? attribute : null; 2817 }, 2818 style: function( element ) 2819 { 2820 return element.style.cssText.toLowerCase(); 2821 }, 2822 title: function( element ) 2823 { 2824 return element.title; 2825 } 2826 } 2827 } 2828 }; 2829 2830 Element._attributeTranslations.write = { 2831 names: Object.extend( { 2832 cellpadding: 'cellPadding', 2833 cellspacing: 'cellSpacing' 2834 }, Element._attributeTranslations.read.names ), 2835 values: { 2836 checked: function( element, value ) 2837 { 2838 element.checked = !!value; 2839 }, 2840 2841 style: function( element, value ) 2842 { 2843 element.style.cssText = value ? value : ''; 2844 } 2845 } 2846 }; 2847 2848 Element._attributeTranslations.has = {}; 2849 2850 $w( 'colSpan rowSpan vAlign dateTime accessKey tabIndex ' + 2851 'encType maxLength readOnly longDesc frameBorder' ).each( function( attr ) 2852 { 2853 Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; 2854 Element._attributeTranslations.has[attr.toLowerCase()] = attr; 2855 } ); 2856 2857 (function( v ) 2858 { 2859 Object.extend( v, { 2860 href: v._getAttr, 2861 src: v._getAttr, 2862 type: v._getAttr, 2863 action: v._getAttrNode, 2864 disabled: v._flag, 2865 checked: v._flag, 2866 readonly: v._flag, 2867 multiple: v._flag, 2868 onload: v._getEv, 2869 onunload: v._getEv, 2870 onclick: v._getEv, 2871 ondblclick: v._getEv, 2872 onmousedown: v._getEv, 2873 onmouseup: v._getEv, 2874 onmouseover: v._getEv, 2875 onmousemove: v._getEv, 2876 onmouseout: v._getEv, 2877 onfocus: v._getEv, 2878 onblur: v._getEv, 2879 onkeypress: v._getEv, 2880 onkeydown: v._getEv, 2881 onkeyup: v._getEv, 2882 onsubmit: v._getEv, 2883 onreset: v._getEv, 2884 onselect: v._getEv, 2885 onchange: v._getEv 2886 } ); 2887 })( Element._attributeTranslations.read.values ); 1521 2888 } 1522 2889 1523 if (Prototype.BrowserFeatures.XPath) { 1524 document._getElementsByXPath = function(expression, parentElement){1525 var results = [];1526 var query = document.evaluate(expression, $(parentElement) || document,1527 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);1528 for (var i = 0, length = query.snapshotLength; i < length; i++)1529 results.push(Element.extend(query.snapshotItem(i)));1530 return results;1531 };2890 else if( Prototype.Browser.Gecko && /rv:1\.8\.0/.test( navigator.userAgent ) ) 2891 { 2892 Element.Methods.setOpacity = function( element, value ) 2893 { 2894 element = $( element ); 2895 element.style.opacity = (value == 1) ? 0.999999 : 2896 (value === '') ? '' : (value < 0.00001) ? 0 : value; 2897 return element; 2898 }; 1532 2899 } 1533 2900 1534 /*--------------------------------------------------------------------------*/ 1535 1536 if (!window.Node) var Node = { }; 1537 1538 if (!Node.ELEMENT_NODE) { 1539 // DOM level 2 ECMAScript Language Binding 1540 Object.extend(Node, { 1541 ELEMENT_NODE: 1, 1542 ATTRIBUTE_NODE: 2, 1543 TEXT_NODE: 3, 1544 CDATA_SECTION_NODE: 4, 1545 ENTITY_REFERENCE_NODE: 5, 1546 ENTITY_NODE: 6, 1547 PROCESSING_INSTRUCTION_NODE: 7, 1548 COMMENT_NODE: 8, 1549 DOCUMENT_NODE: 9, 1550 DOCUMENT_TYPE_NODE: 10, 1551 DOCUMENT_FRAGMENT_NODE: 11, 1552 NOTATION_NODE: 12 1553 }); 2901 else if( Prototype.Browser.WebKit ) 2902 { 2903 Element.Methods.setOpacity = function( element, value ) 2904 { 2905 element = $( element ); 2906 element.style.opacity = (value == 1 || value === '') ? '' : 2907 (value < 0.00001) ? 0 : value; 2908 2909 if( value == 1 ) 2910 if( element.tagName.toUpperCase() == 'IMG' && element.width ) 2911 { 2912 element.width++; 2913 element.width--; 2914 } 2915 else try 2916 { 2917 var n = document.createTextNode( ' ' ); 2918 element.appendChild( n ); 2919 element.removeChild( n ); 2920 } 2921 catch ( e ) 2922 { 2923 } 2924 2925 return element; 2926 }; 2927 2928 // Safari returns margins on body which is incorrect if the child is absolutely 2929 // positioned. For performance reasons, redefine Element#cumulativeOffset for 2930 // KHTML/WebKit only. 2931 Element.Methods.cumulativeOffset = function( element ) 2932 { 2933 var valueT = 0, valueL = 0; 2934 do { 2935 valueT += element.offsetTop || 0; 2936 valueL += element.offsetLeft || 0; 2937 if( element.offsetParent == document.body ) 2938 if( Element.getStyle( element, 'position' ) == 'absolute' ) break; 2939 2940 element = element.offsetParent; 2941 } 2942 while( element ); 2943 2944 return Element._returnOffset( valueL, valueT ); 2945 }; 1554 2946 } 1555 2947 1556 (function() { 1557 var element = this.Element; 1558 this.Element = function(tagName, attributes) { 1559 attributes = attributes || { }; 1560 tagName = tagName.toLowerCase(); 1561 var cache = Element.cache; 1562 if (Prototype.Browser.IE && attributes.name) { 1563 tagName = '<' + tagName + ' name="' + attributes.name + '">'; 1564 delete attributes.name; 1565 return Element.writeAttribute(document.createElement(tagName), attributes); 1566 } 1567 if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); 1568 return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); 1569 }; 1570 Object.extend(this.Element, element || { }); 1571 if (element) this.Element.prototype = element.prototype; 1572 }).call(window); 1573 1574 Element.cache = { }; 1575 1576 Element.Methods = { 1577 visible: function(element) { 1578 return $(element).style.display != 'none'; 1579 }, 1580 1581 toggle: function(element) { 1582 element = $(element); 1583 Element[Element.visible(element) ? 'hide' : 'show'](element); 1584 return element; 1585 }, 1586 1587 hide: function(element) { 1588 element = $(element); 1589 element.style.display = 'none'; 1590 return element; 1591 }, 1592 1593 show: function(element) { 1594 element = $(element); 1595 element.style.display = ''; 1596 return element; 1597 }, 1598 1599 remove: function(element) { 1600 element = $(element); 1601 element.parentNode.removeChild(element); 1602 return element; 1603 }, 1604 1605 update: function(element, content) { 1606 element = $(element); 1607 if (content && content.toElement) content = content.toElement(); 1608 if (Object.isElement(content)) return element.update().insert(content); 1609 content = Object.toHTML(content); 1610 element.innerHTML = content.stripScripts(); 1611 content.evalScripts.bind(content).defer(); 1612 return element; 1613 }, 1614 1615 replace: function(element, content) { 1616 element = $(element); 1617 if (content && content.toElement) content = content.toElement(); 1618 else if (!Object.isElement(content)) { 1619 content = Object.toHTML(content); 1620 var range = element.ownerDocument.createRange(); 1621 range.selectNode(element); 1622 content.evalScripts.bind(content).defer(); 1623 content = range.createContextualFragment(content.stripScripts()); 1624 } 1625 element.parentNode.replaceChild(content, element); 1626 return element; 1627 }, 1628 1629 insert: function(element, insertions) { 1630 element = $(element); 1631 1632 if (Object.isString(insertions) || Object.isNumber(insertions) || 1633 Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) 1634 insertions = {bottom:insertions}; 1635 1636 var content, insert, tagName, childNodes; 1637 1638 for (var position in insertions) { 1639 content = insertions[position]; 1640 position = position.toLowerCase(); 1641 insert = Element._insertionTranslations[position]; 1642 1643 if (content && content.toElement) content = content.toElement(); 1644 if (Object.isElement(content)) { 1645 insert(element, content); 1646 continue; 1647 } 1648 1649 content = Object.toHTML(content); 1650 1651 tagName = ((position == 'before' || position == 'after') 1652 ? element.parentNode : element).tagName.toUpperCase(); 1653 1654 childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); 1655 1656 if (position == 'top' || position == 'after') childNodes.reverse(); 1657 childNodes.each(insert.curry(element)); 1658 1659 content.evalScripts.bind(content).defer(); 1660 } 1661 1662 return element; 1663 }, 1664 1665 wrap: function(element, wrapper, attributes) { 1666 element = $(element); 1667 if (Object.isElement(wrapper)) 1668 $(wrapper).writeAttribute(attributes || { }); 1669 else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); 1670 else wrapper = new Element('div', wrapper); 1671 if (element.parentNode) 1672 element.parentNode.replaceChild(wrapper, element); 1673 wrapper.appendChild(element); 1674 return wrapper; 1675 }, 1676 1677 inspect: function(element) { 1678 element = $(element); 1679 var result = '<' + element.tagName.toLowerCase(); 1680 $H({'id': 'id', 'className': 'class'}).each(function(pair) { 1681 var property = pair.first(), attribute = pair.last(); 1682 var value = (element[property] || '').toString(); 1683 if (value) result += ' ' + attribute + '=' + value.inspect(true); 1684 }); 1685 return result + '>'; 1686 }, 1687 1688 recursivelyCollect: function(element, property) { 1689 element = $(element); 1690 var elements = []; 1691 while (element = element[property]) 1692 if (element.nodeType == 1) 1693 elements.push(Element.extend(element)); 1694 return elements; 1695 }, 1696 1697 ancestors: function(element) { 1698 return $(element).recursivelyCollect('parentNode'); 1699 }, 1700 1701 descendants: function(element) { 1702 return $(element).select("*"); 1703 }, 1704 1705 firstDescendant: function(element) { 1706 element = $(element).firstChild; 1707 while (element && element.nodeType != 1) element = element.nextSibling; 1708 return $(element); 1709 }, 1710 1711 immediateDescendants: function(element) { 1712 if (!(element = $(element).firstChild)) return []; 1713 while (element && element.nodeType != 1) element = element.nextSibling; 1714 if (element) return [element].concat($(element).nextSiblings()); 1715 return []; 1716 }, 1717 1718 previousSiblings: function(element) { 1719 return $(element).recursivelyCollect('previousSibling'); 1720 }, 1721 1722 nextSiblings: function(element) { 1723 return $(element).recursivelyCollect('nextSibling'); 1724 }, 1725 1726 siblings: function(element) { 1727 element = $(element); 1728 return element.previousSiblings().reverse().concat(element.nextSiblings()); 1729 }, 1730 1731 match: function(element, selector) { 1732 if (Object.isString(selector)) 1733 selector = new Selector(selector); 1734 return selector.match($(element)); 1735 }, 1736 1737 up: function(element, expression, index) { 1738 element = $(element); 1739 if (arguments.length == 1) return $(element.parentNode); 1740 var ancestors = element.ancestors(); 1741 return Object.isNumber(expression) ? ancestors[expression] : 1742 Selector.findElement(ancestors, expression, index); 1743 }, 1744 1745 down: function(element, expression, index) { 1746 element = $(element); 1747 if (arguments.length == 1) return element.firstDescendant(); 1748 return Object.isNumber(expression) ? element.descendants()[expression] : 1749 Element.select(element, expression)[index || 0]; 1750 }, 1751 1752 previous: function(element, expression, index) { 1753 element = $(element); 1754 if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); 1755 var previousSiblings = element.previousSiblings(); 1756 return Object.isNumber(expression) ? previousSiblings[expression] : 1757 Selector.findElement(previousSiblings, expression, index); 1758 }, 1759 1760 next: function(element, expression, index) { 1761 element = $(element); 1762 if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); 1763 var nextSiblings = element.nextSiblings(); 1764 return Object.isNumber(expression) ? nextSiblings[expression] : 1765 Selector.findElement(nextSiblings, expression, index); 1766 }, 1767 1768 select: function() { 1769 var args = $A(arguments), element = $(args.shift()); 1770 return Selector.findChildElements(element, args); 1771 }, 1772 1773 adjacent: function() { 1774 var args = $A(arguments), element = $(args.shift()); 1775 return Selector.findChildElements(element.parentNode, args).without(element); 1776 }, 1777 1778 identify: function(element) { 1779 element = $(element); 1780 var id = element.readAttribute('id'), self = arguments.callee; 1781 if (id) return id; 1782 do { id = 'anonymous_element_' + self.counter++ } while ($(id)); 1783 element.writeAttribute('id', id); 1784 return id; 1785 }, 1786 1787 readAttribute: function(element, name) { 1788 element = $(element); 1789 if (Prototype.Browser.IE) { 1790 var t = Element._attributeTranslations.read; 1791 if (t.values[name]) return t.values[name](element, name); 1792 if (t.names[name]) name = t.names[name]; 1793 if (name.include(':')) { 1794 return (!element.attributes || !element.attributes[name]) ? null : 1795 element.attributes[name].value; 1796 } 1797 } 1798 return element.getAttribute(name); 1799 }, 1800 1801 writeAttribute: function(element, name, value) { 1802 element = $(element); 1803 var attributes = { }, t = Element._attributeTranslations.write; 1804 1805 if (typeof name == 'object') attributes = name; 1806 else attributes[name] = Object.isUndefined(value) ? true : value; 1807 1808 for (var attr in attributes) { 1809 name = t.names[attr] || attr; 1810 value = attributes[attr]; 1811 if (t.values[attr]) name = t.values[attr](element, value); 1812 if (value === false || value === null) 1813 element.removeAttribute(name); 1814 else if (value === true) 1815 element.setAttribute(name, name); 1816 else element.setAttribute(name, value); 1817 } 1818 return element; 1819 }, 1820 1821 getHeight: function(element) { 1822 return $(element).getDimensions().height; 1823 }, 1824 1825 getWidth: function(element) { 1826 return $(element).getDimensions().width; 1827 }, 1828 1829 classNames: function(element) { 1830 return new Element.ClassNames(element); 1831 }, 1832 1833 hasClassName: function(element, className) { 1834 if (!(element = $(element))) return; 1835 var elementClassName = element.className; 1836 return (elementClassName.length > 0 && (elementClassName == className || 1837 new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); 1838 }, 1839 1840 addClassName: function(element, className) { 1841 if (!(element = $(element))) return; 1842 if (!element.hasClassName(className)) 1843 element.className += (element.className ? ' ' : '') + className; 1844 return element; 1845 }, 1846 1847 removeClassName: function(element, className) { 1848 if (!(element = $(element))) return; 1849 element.className = element.className.replace( 1850 new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); 1851 return element; 1852 }, 1853 1854 toggleClassName: function(element, className) { 1855 if (!(element = $(element))) return; 1856 return element[element.hasClassName(className) ? 1857 'removeClassName' : 'addClassName'](className); 1858 }, 1859 1860 // removes whitespace-only text node children 1861 cleanWhitespace: function(element) { 1862 element = $(element); 1863 var node = element.firstChild; 1864 while (node) { 1865 var nextNode = node.nextSibling; 1866 if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) 1867 element.removeChild(node); 1868 node = nextNode; 1869 } 1870 return element; 1871 }, 1872 1873 empty: function(element) { 1874 return $(element).innerHTML.blank(); 1875 }, 1876 1877 descendantOf: function(element, ancestor) { 1878 element = $(element), ancestor = $(ancestor); 1879 1880 if (element.compareDocumentPosition) 1881 return (element.compareDocumentPosition(ancestor) & 8) === 8; 1882 1883 if (ancestor.contains) 1884 return ancestor.contains(element) && ancestor !== element; 1885 1886 while (element = element.parentNode) 1887 if (element == ancestor) return true; 1888 1889 return false; 1890 }, 1891 1892 scrollTo: function(element) { 1893 element = $(element); 1894 var pos = element.cumulativeOffset(); 1895 window.scrollTo(pos[0], pos[1]); 1896 return element; 1897 }, 1898 1899 getStyle: function(element, style) { 1900 element = $(element); 1901 style = style == 'float' ? 'cssFloat' : style.camelize(); 1902 var value = element.style[style]; 1903 if (!value || value == 'auto') { 1904 var css = document.defaultView.getComputedStyle(element, null); 1905 value = css ? css[style] : null; 1906 } 1907 if (style == 'opacity') return value ? parseFloat(value) : 1.0; 1908 return value == 'auto' ? null : value; 1909 }, 1910 1911 getOpacity: function(element) { 1912 return $(element).getStyle('opacity'); 1913 }, 1914 1915 setStyle: function(element, styles) { 1916 element = $(element); 1917 var elementStyle = element.style, match; 1918 if (Object.isString(styles)) { 1919 element.style.cssText += ';' + styles; 1920 return styles.include('opacity') ? 1921 element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; 1922 } 1923 for (var property in styles) 1924 if (property == 'opacity') element.setOpacity(styles[property]); 1925 else 1926 elementStyle[(property == 'float' || property == 'cssFloat') ? 1927 (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : 1928 property] = styles[property]; 1929 1930 return element; 1931 }, 1932 1933 setOpacity: function(element, value) { 1934 element = $(element); 1935 element.style.opacity = (value == 1 || value === '') ? '' : 1936 (value < 0.00001) ? 0 : value; 1937 return element; 1938 }, 1939 1940 getDimensions: function(element) { 1941 element = $(element); 1942 var display = element.getStyle('display'); 1943 if (display != 'none' && display != null) // Safari bug 1944 return {width: element.offsetWidth, height: element.offsetHeight}; 1945 1946 // All *Width and *Height properties give 0 on elements with display none, 1947 // so enable the element temporarily 1948 var els = element.style; 1949 var originalVisibility = els.visibility; 1950 var originalPosition = els.position; 1951 var originalDisplay = els.display; 1952 els.visibility = 'hidden'; 1953 els.position = 'absolute'; 1954 els.display = 'block'; 1955 var originalWidth = element.clientWidth; 1956 var originalHeight = element.clientHeight; 1957 els.display = originalDisplay; 1958 els.position = originalPosition; 1959 els.visibility = originalVisibility; 1960 return {width: originalWidth, height: originalHeight}; 1961 }, 1962 1963 makePositioned: function(element) { 1964 element = $(element); 1965 var pos = Element.getStyle(element, 'position'); 1966 if (pos == 'static' || !pos) { 1967 element._madePositioned = true; 1968 element.style.position = 'relative'; 1969 // Opera returns the offset relative to the positioning context, when an 1970 // element is position relative but top and left have not been defined 1971 if (Prototype.Browser.Opera) { 1972 element.style.top = 0; 1973 element.style.left = 0; 1974 } 1975 } 1976 return element; 1977 }, 1978 1979 undoPositioned: function(element) { 1980 element = $(element); 1981 if (element._madePositioned) { 1982 element._madePositioned = undefined; 1983 element.style.position = 1984 element.style.top = 1985 element.style.left = 1986 element.style.bottom = 1987 element.style.right = ''; 1988 } 1989 return element; 1990 }, 1991 1992 makeClipping: function(element) { 1993 element = $(element); 1994 if (element._overflow) return element; 1995 element._overflow = Element.getStyle(element, 'overflow') || 'auto'; 1996 if (element._overflow !== 'hidden') 1997 element.style.overflow = 'hidden'; 1998 return element; 1999 }, 2000 2001 undoClipping: function(element) { 2002 element = $(element); 2003 if (!element._overflow) return element; 2004 element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; 2005 element._overflow = null; 2006 return element; 2007 }, 2008 2009 cumulativeOffset: function(element) { 2010 var valueT = 0, valueL = 0; 2011 do { 2012 valueT += element.offsetTop || 0; 2013 valueL += element.offsetLeft || 0; 2014 element = element.offsetParent; 2015 } while (element); 2016 return Element._returnOffset(valueL, valueT); 2017 }, 2018 2019 positionedOffset: function(element) { 2020 var valueT = 0, valueL = 0; 2021 do { 2022 valueT += element.offsetTop || 0; 2023 valueL += element.offsetLeft || 0; 2024 element = element.offsetParent; 2025 if (element) { 2026 if (element.tagName.toUpperCase() == 'BODY') break; 2027 var p = Element.getStyle(element, 'position'); 2028 if (p !== 'static') break; 2029 } 2030 } while (element); 2031 return Element._returnOffset(valueL, valueT); 2032 }, 2033 2034 absolutize: function(element) { 2035 element = $(element); 2036 if (element.getStyle('position') == 'absolute') return element; 2037 // Position.prepare(); // To be done manually by Scripty when it needs it. 2038 2039 var offsets = element.positionedOffset(); 2040 var top = offsets[1]; 2041 var left = offsets[0]; 2042 var width = element.clientWidth; 2043 var height = element.clientHeight; 2044 2045 element._originalLeft = left - parseFloat(element.style.left || 0); 2046 element._originalTop = top - parseFloat(element.style.top || 0); 2047 element._originalWidth = element.style.width; 2048 element._originalHeight = element.style.height; 2049 2050 element.style.position = 'absolute'; 2051 element.style.top = top + 'px'; 2052 element.style.left = left + 'px'; 2053 element.style.width = width + 'px'; 2054 element.style.height = height + 'px'; 2055 return element; 2056 }, 2057 2058 relativize: function(element) { 2059 element = $(element); 2060 if (element.getStyle('position') == 'relative') return element; 2061 // Position.prepare(); // To be done manually by Scripty when it needs it. 2062 2063 element.style.position = 'relative'; 2064 var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); 2065 var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); 2066 2067 element.style.top = top + 'px'; 2068 element.style.left = left + 'px'; 2069 element.style.height = element._originalHeight; 2070 element.style.width = element._originalWidth; 2071 return element; 2072 }, 2073 2074 cumulativeScrollOffset: function(element) { 2075 var valueT = 0, valueL = 0; 2076 do { 2077 valueT += element.scrollTop || 0; 2078 valueL += element.scrollLeft || 0; 2079 element = element.parentNode; 2080 } while (element); 2081 return Element._returnOffset(valueL, valueT); 2082 }, 2083 2084 getOffsetParent: function(element) { 2085 if (element.offsetParent) return $(element.offsetParent); 2086 if (element == document.body) return $(element); 2087 2088 while ((element = element.parentNode) && element != document.body) 2089 if (Element.getStyle(element, 'position') != 'static') 2090 return $(element); 2091 2092 return $(document.body); 2093 }, 2094 2095 viewportOffset: function(forElement) { 2096 var valueT = 0, valueL = 0; 2097 2098 var element = forElement; 2099 do { 2100 valueT += element.offsetTop || 0; 2101 valueL += element.offsetLeft || 0; 2102 2103 // Safari fix 2104 if (element.offsetParent == document.body && 2105 Element.getStyle(element, 'position') == 'absolute') break; 2106 2107 } while (element = element.offsetParent); 2108 2109 element = forElement; 2110 do { 2111 if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { 2112 valueT -= element.scrollTop || 0; 2113 valueL -= element.scrollLeft || 0; 2114 } 2115 } while (element = element.parentNode); 2116 2117 return Element._returnOffset(valueL, valueT); 2118 }, 2119 2120 clonePosition: function(element, source) { 2121 var options = Object.extend({ 2122 setLeft: true, 2123 setTop: true, 2124 setWidth: true, 2125 setHeight: true, 2126 offsetTop: 0, 2127 offsetLeft: 0 2128 }, arguments[2] || { }); 2129 2130 // find page position of source 2131 source = $(source); 2132 var p = source.viewportOffset(); 2133 2134 // find coordinate system to use 2135 element = $(element); 2136 var delta = [0, 0]; 2137 var parent = null; 2138 // delta [0,0] will do fine with position: fixed elements, 2139 // position:absolute needs offsetParent deltas 2140 if (Element.getStyle(element, 'position') == 'absolute') { 2141 parent = element.getOffsetParent(); 2142 delta = parent.viewportOffset(); 2143 } 2144 2145 // correct by body offsets (fixes Safari) 2146 if (parent == document.body) { 2147 delta[0] -= document.body.offsetLeft; 2148 delta[1] -= document.body.offsetTop; 2149 } 2150 2151 // set position 2152 if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; 2153 if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; 2154 if (options.setWidth) element.style.width = source.offsetWidth + 'px'; 2155 if (options.setHeight) element.style.height = source.offsetHeight + 'px'; 2156 return element; 2157 } 2948 if( Prototype.Browser.IE || Prototype.Browser.Opera ) 2949 { 2950 // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements 2951 Element.Methods.update = function( element, content ) 2952 { 2953 element = $( element ); 2954 2955 if( content && content.toElement ) content = content.toElement(); 2956 if( Object.isElement( content ) ) return element.update().insert( content ); 2957 2958 content = Object.toHTML( content ); 2959 var tagName = element.tagName.toUpperCase(); 2960 2961 if( tagName in Element._insertionTranslations.tags ) 2962 { 2963 $A( element.childNodes ).each( function( node ) 2964 { 2965 element.removeChild( node ) 2966 } ); 2967 Element._getContentFromAnonymousElement( tagName, content.stripScripts() ) 2968 .each( function( node ) 2969 { 2970 element.appendChild( node ) 2971 } ); 2972 } 2973 else element.innerHTML = content.stripScripts(); 2974 2975 content.evalScripts.bind( content ).defer(); 2976 return element; 2977 }; 2978 } 2979 2980 if( 'outerHTML' in document.createElement( 'div' ) ) 2981 { 2982 Element.Methods.replace = function( element, content ) 2983 { 2984 element = $( element ); 2985 2986 if( content && content.toElement ) content = content.toElement(); 2987 if( Object.isElement( content ) ) 2988 { 2989 element.parentNode.replaceChild( content, element ); 2990 return element; 2991 } 2992 2993 content = Object.toHTML( content ); 2994 var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); 2995 2996 if( Element._insertionTranslations.tags[tagName] ) 2997 { 2998 var nextSibling = element.next(); 2999 var fragments = Element._getContentFromAnonymousElement( tagName, content.stripScripts() ); 3000 parent.removeChild( element ); 3001 if( nextSibling ) 3002 fragments.each( function( node ) 3003 { 3004 parent.insertBefore( node, nextSibling ) 3005 } ); 3006 else 3007 fragments.each( function( node ) 3008 { 3009 parent.appendChild( node ) 3010 } ); 3011 } 3012 else element.outerHTML = content.stripScripts(); 3013 3014 content.evalScripts.bind( content ).defer(); 3015 return element; 3016 }; 3017 } 3018 3019 Element._returnOffset = function( l, t ) 3020 { 3021 var result = [l, t]; 3022 result.left = l; 3023 result.top = t; 3024 return result; 2158 3025 }; 2159 3026 2160 Element.Methods.identify.counter = 1; 2161 2162 Object.extend(Element.Methods, { 2163 getElementsBySelector: Element.Methods.select, 2164 childElements: Element.Methods.immediateDescendants 2165 }); 2166 2167 Element._attributeTranslations = { 2168 write: { 2169 names: { 2170 className: 'class', 2171 htmlFor: 'for' 2172 }, 2173 values: { } 2174 } 3027 Element._getContentFromAnonymousElement = function( tagName, html ) 3028 { 3029 var div = new Element( 'div' ), t = Element._insertionTranslations.tags[tagName]; 3030 if( t ) 3031 { 3032 div.innerHTML = t[0] + html + t[1]; 3033 t[2].times( function() 3034 { 3035 div = div.firstChild 3036 } ); 3037 } 3038 else div.innerHTML = html; 3039 return $A( div.childNodes ); 2175 3040 }; 2176 3041 2177 if (Prototype.Browser.Opera) { 2178 Element.Methods.getStyle = Element.Methods.getStyle.wrap( 2179 function(proceed, element, style) { 2180 switch (style) { 2181 case 'left': case 'top': case 'right': case 'bottom': 2182 if (proceed(element, 'position') === 'static') return null; 2183 case 'height': case 'width': 2184 // returns '0px' for hidden elements; we want it to return null 2185 if (!Element.visible(element)) return null; 2186 2187 // returns the border-box dimensions rather than the content-box 2188 // dimensions, so we subtract padding and borders from the value 2189 var dim = parseInt(proceed(element, style), 10); 2190 2191 if (dim !== element['offset' + style.capitalize()]) 2192 return dim + 'px'; 2193 2194 var properties; 2195 if (style === 'height') { 2196 properties = ['border-top-width', 'padding-top', 2197 'padding-bottom', 'border-bottom-width']; 2198 } 2199 else { 2200 properties = ['border-left-width', 'padding-left', 2201 'padding-right', 'border-right-width']; 2202 } 2203 return properties.inject(dim, function(memo, property) { 2204 var val = proceed(element, property); 2205 return val === null ? memo : memo - parseInt(val, 10); 2206 }) + 'px'; 2207 default: return proceed(element, style); 2208 } 2209 } 2210 ); 2211 2212 Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( 2213 function(proceed, element, attribute) { 2214 if (attribute === 'title') return element.title; 2215 return proceed(element, attribute); 2216 } 2217 ); 3042 Element._insertionTranslations = { 3043 before: function( element, node ) 3044 { 3045 element.parentNode.insertBefore( node, element ); 3046 }, 3047 top: function( element, node ) 3048 { 3049 element.insertBefore( node, element.firstChild ); 3050 }, 3051 bottom: function( element, node ) 3052 { 3053 element.appendChild( node ); 3054 }, 3055 after: function( element, node ) 3056 { 3057 element.parentNode.insertBefore( node, element.nextSibling ); 3058 }, 3059 tags: { 3060 TABLE: ['<table>', '</table>', 1], 3061 TBODY: ['<table><tbody>', '</tbody></table>', 2], 3062 TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3], 3063 TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4], 3064 SELECT: ['<select>', '</select>', 1] 3065 } 3066 }; 3067 3068 (function() 3069 { 3070 Object.extend( this.tags, { 3071 THEAD: this.tags.TBODY, 3072 TFOOT: this.tags.TBODY, 3073 TH: this.tags.TD 3074 } ); 3075 }).call( Element._insertionTranslations ); 3076 3077 Element.Methods.Simulated = { 3078 hasAttribute: function( element, attribute ) 3079 { 3080 attribute = Element._attributeTranslations.has[attribute] || attribute; 3081 var node = $( element ).getAttributeNode( attribute ); 3082 return !!(node && node.specified); 3083 } 3084 }; 3085 3086 Element.Methods.ByTag = { }; 3087 3088 Object.extend( Element, Element.Methods ); 3089 3090 if( !Prototype.BrowserFeatures.ElementExtensions && 3091 document.createElement( 'div' )['__proto__'] ) 3092 { 3093 window.HTMLElement = { }; 3094 window.HTMLElement.prototype = document.createElement( 'div' )['__proto__']; 3095 Prototype.BrowserFeatures.ElementExtensions = true; 2218 3096 } 2219 3097 2220 else if (Prototype.Browser.IE) { 2221 // IE doesn't report offsets correctly for static elements, so we change them 2222 // to "relative" to get the values, then change them back. 2223 Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( 2224 function(proceed, element) { 2225 element = $(element); 2226 // IE throws an error if element is not in document 2227 try { element.offsetParent } 2228 catch(e) { return $(document.body) } 2229 var position = element.getStyle('position'); 2230 if (position !== 'static') return proceed(element); 2231 element.setStyle({ position: 'relative' }); 2232 var value = proceed(element); 2233 element.setStyle({ position: position }); 2234 return value; 2235 } 2236 ); 2237 2238 $w('positionedOffset viewportOffset').each(function(method) { 2239 Element.Methods[method] = Element.Methods[method].wrap( 2240 function(proceed, element) { 2241 element = $(element); 2242 try { element.offsetParent } 2243 catch(e) { return Element._returnOffset(0,0) } 2244 var position = element.getStyle('position'); 2245 if (position !== 'static') return proceed(element); 2246 // Trigger hasLayout on the offset parent so that IE6 reports 2247 // accurate offsetTop and offsetLeft values for position: fixed. 2248 var offsetParent = element.getOffsetParent(); 2249 if (offsetParent && offsetParent.getStyle('position') === 'fixed') 2250 offsetParent.setStyle({ zoom: 1 }); 2251 element.setStyle({ position: 'relative' }); 2252 var value = proceed(element); 2253 element.setStyle({ position: position }); 2254 return value; 2255 } 2256 ); 2257 }); 2258 2259 Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( 2260 function(proceed, element) { 2261 try { element.offsetParent } 2262 catch(e) { return Element._returnOffset(0,0) } 2263 return proceed(element); 2264 } 2265 ); 2266 2267 Element.Methods.getStyle = function(element, style) { 2268 element = $(element); 2269 style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); 2270 var value = element.style[style]; 2271 if (!value && element.currentStyle) value = element.currentStyle[style]; 2272 2273 if (style == 'opacity') { 2274 if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) 2275 if (value[1]) return parseFloat(value[1]) / 100; 2276 return 1.0; 2277 } 2278 2279 if (value == 'auto') { 2280 if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) 2281 return element['offset' + style.capitalize()] + 'px'; 2282 return null; 2283 } 2284 return value; 2285 }; 2286 2287 Element.Methods.setOpacity = function(element, value) { 2288 function stripAlpha(filter){ 2289 return filter.replace(/alpha\([^\)]*\)/gi,''); 2290 } 2291 element = $(element); 2292 var currentStyle = element.currentStyle; 2293 if ((currentStyle && !currentStyle.hasLayout) || 2294 (!currentStyle && element.style.zoom == 'normal')) 2295 element.style.zoom = 1; 2296 2297 var filter = element.getStyle('filter'), style = element.style; 2298 if (value == 1 || value === '') { 2299 (filter = stripAlpha(filter)) ? 2300 style.filter = filter : style.removeAttribute('filter'); 2301 return element; 2302 } else if (value < 0.00001) value = 0; 2303 style.filter = stripAlpha(filter) + 2304 'alpha(opacity=' + (value * 100) + ')'; 2305 return element; 2306 }; 2307 2308 Element._attributeTranslations = { 2309 read: { 2310 names: { 2311 'class': 'className', 2312 'for': 'htmlFor' 2313 }, 2314 values: { 2315 _getAttr: function(element, attribute) { 2316 return element.getAttribute(attribute, 2); 2317 }, 2318 _getAttrNode: function(element, attribute) { 2319 var node = element.getAttributeNode(attribute); 2320 return node ? node.value : ""; 2321 }, 2322 _getEv: function(element, attribute) { 2323 attribute = element.getAttribute(attribute); 2324 return attribute ? attribute.toString().slice(23, -2) : null; 2325 }, 2326 _flag: function(element, attribute) { 2327 return $(element).hasAttribute(attribute) ? attribute : null; 2328 }, 2329 style: function(element) { 2330 return element.style.cssText.toLowerCase(); 2331 }, 2332 title: function(element) { 2333 return element.title; 2334 } 2335 } 2336 } 2337 }; 2338 2339 Element._attributeTranslations.write = { 2340 names: Object.extend({ 2341 cellpadding: 'cellPadding', 2342 cellspacing: 'cellSpacing' 2343 }, Element._attributeTranslations.read.names), 2344 values: { 2345 checked: function(element, value) { 2346 element.checked = !!value; 2347 }, 2348 2349 style: function(element, value) { 2350 element.style.cssText = value ? value : ''; 2351 } 2352 } 2353 }; 2354 2355 Element._attributeTranslations.has = {}; 2356 2357 $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + 2358 'encType maxLength readOnly longDesc frameBorder').each(function(attr) { 2359 Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; 2360 Element._attributeTranslations.has[attr.toLowerCase()] = attr; 2361 }); 2362 2363 (function(v) { 2364 Object.extend(v, { 2365 href: v._getAttr, 2366 src: v._getAttr, 2367 type: v._getAttr, 2368 action: v._getAttrNode, 2369 disabled: v._flag, 2370 checked: v._flag, 2371 readonly: v._flag, 2372 multiple: v._flag, 2373 onload: v._getEv, 2374 onunload: v._getEv, 2375 onclick: v._getEv, 2376 ondblclick: v._getEv, 2377 onmousedown: v._getEv, 2378 onmouseup: v._getEv, 2379 onmouseover: v._getEv, 2380 onmousemove: v._getEv, 2381 onmouseout: v._getEv, 2382 onfocus: v._getEv, 2383 onblur: v._getEv, 2384 onkeypress: v._getEv, 2385 onkeydown: v._getEv, 2386 onkeyup: v._getEv, 2387 onsubmit: v._getEv, 2388 onreset: v._getEv, 2389 onselect: v._getEv, 2390 onchange: v._getEv 2391 }); 2392 })(Element._attributeTranslations.read.values); 2393 } 2394 2395 else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { 2396 Element.Methods.setOpacity = function(element, value) { 2397 element = $(element); 2398 element.style.opacity = (value == 1) ? 0.999999 : 2399 (value === '') ? '' : (value < 0.00001) ? 0 : value; 2400 return element; 2401 }; 2402 } 2403 2404 else if (Prototype.Browser.WebKit) { 2405 Element.Methods.setOpacity = function(element, value) { 2406 element = $(element); 2407 element.style.opacity = (value == 1 || value === '') ? '' : 2408 (value < 0.00001) ? 0 : value; 2409 2410 if (value == 1) 2411 if(element.tagName.toUpperCase() == 'IMG' && element.width) { 2412 element.width++; element.width--; 2413 } else try { 2414 var n = document.createTextNode(' '); 2415 element.appendChild(n); 2416 element.removeChild(n); 2417 } catch (e) { } 2418 2419 return element; 2420 }; 2421 2422 // Safari returns margins on body which is incorrect if the child is absolutely 2423 // positioned. For performance reasons, redefine Element#cumulativeOffset for 2424 // KHTML/WebKit only. 2425 Element.Methods.cumulativeOffset = function(element) { 2426 var valueT = 0, valueL = 0; 2427 do { 2428 valueT += element.offsetTop || 0; 2429 valueL += element.offsetLeft || 0; 2430 if (element.offsetParent == document.body) 2431 if (Element.getStyle(element, 'position') == 'absolute') break; 2432 2433 element = element.offsetParent; 2434 } while (element); 2435 2436 return Element._returnOffset(valueL, valueT); 2437 }; 2438 } 2439 2440 if (Prototype.Browser.IE || Prototype.Browser.Opera) { 2441 // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements 2442 Element.Methods.update = function(element, content) { 2443 element = $(element); 2444 2445 if (content && content.toElement) content = content.toElement(); 2446 if (Object.isElement(content)) return element.update().insert(content); 2447 2448 content = Object.toHTML(content); 2449 var tagName = element.tagName.toUpperCase(); 2450 2451 if (tagName in Element._insertionTranslations.tags) { 2452 $A(element.childNodes).each(function(node) { element.removeChild(node) }); 2453 Element._getContentFromAnonymousElement(tagName, content.stripScripts()) 2454 .each(function(node) { element.appendChild(node) }); 2455 } 2456 else element.innerHTML = content.stripScripts(); 2457 2458 content.evalScripts.bind(content).defer(); 2459 return element; 2460 }; 2461 } 2462 2463 if ('outerHTML' in document.createElement('div')) { 2464 Element.Methods.replace = function(element, content) { 2465 element = $(element); 2466 2467 if (content && content.toElement) content = content.toElement(); 2468 if (Object.isElement(content)) { 2469 element.parentNode.replaceChild(content, element); 2470 return element; 2471 } 2472 2473 content = Object.toHTML(content); 2474 var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); 2475 2476 if (Element._insertionTranslations.tags[tagName]) { 2477 var nextSibling = element.next(); 2478 var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); 2479 parent.removeChild(element); 2480 if (nextSibling) 2481 fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); 2482 else 2483 fragments.each(function(node) { parent.appendChild(node) }); 2484 } 2485 else element.outerHTML = content.stripScripts(); 2486 2487 content.evalScripts.bind(content).defer(); 2488 return element; 2489 }; 2490 } 2491 2492 Element._returnOffset = function(l, t) { 2493 var result = [l, t]; 2494 result.left = l; 2495 result.top = t; 2496 return result; 3098 Element.extend = (function() 3099 { 3100 if( Prototype.BrowserFeatures.SpecificElementExtensions ) 3101 return Prototype.K; 3102 3103 var Methods = { }, ByTag = Element.Methods.ByTag; 3104 3105 var extend = Object.extend( function( element ) 3106 { 3107 if( !element || element._extendedByPrototype || 3108 element.nodeType != 1 || element == window ) return element; 3109 3110 var methods = Object.clone( Methods ), 3111 tagName = element.tagName.toUpperCase(), property, value; 3112 3113 // extend methods for specific tags 3114 if( ByTag[tagName] ) Object.extend( methods, ByTag[tagName] ); 3115 3116 for( property in methods ) 3117 { 3118 value = methods[property]; 3119 if( Object.isFunction( value ) && !(property in element) ) 3120 element[property] = value.methodize(); 3121 } 3122 3123 element._extendedByPrototype = Prototype.emptyFunction; 3124 return element; 3125 3126 }, { 3127 refresh: function() 3128 { 3129 // extend methods for all tags (Safari doesn't need this) 3130 if( !Prototype.BrowserFeatures.ElementExtensions ) 3131 { 3132 Object.extend( Methods, Element.Methods ); 3133 Object.extend( Methods, Element.Methods.Simulated ); 3134 } 3135 } 3136 } ); 3137 3138 extend.refresh(); 3139 return extend; 3140 })(); 3141 3142 Element.hasAttribute = function( element, attribute ) 3143 { 3144 if( element.hasAttribute ) return element.hasAttribute( attribute ); 3145 return Element.Methods.Simulated.hasAttribute( element, attribute ); 2497 3146 }; 2498 3147 2499 Element._getContentFromAnonymousElement = function(tagName, html) { 2500 var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; 2501 if (t) { 2502 div.innerHTML = t[0] + html + t[1]; 2503 t[2].times(function() { div = div.firstChild }); 2504 } else div.innerHTML = html; 2505 return $A(div.childNodes); 3148 Element.addMethods = function( methods ) 3149 { 3150 var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; 3151 3152 if( !methods ) 3153 { 3154 Object.extend( Form, Form.Methods ); 3155 Object.extend( Form.Element, Form.Element.Methods ); 3156 Object.extend( Element.Methods.ByTag, { 3157 "FORM": Object.clone( Form.Methods ), 3158 "INPUT": Object.clone( Form.Element.Methods ), 3159 "SELECT": Object.clone( Form.Element.Methods ), 3160 "TEXTAREA": Object.clone( Form.Element.Methods ) 3161 } ); 3162 } 3163 3164 if( arguments.length == 2 ) 3165 { 3166 var tagName = methods; 3167 methods = arguments[1]; 3168 } 3169 3170 if( !tagName ) Object.extend( Element.Methods, methods || { } ); 3171 else 3172 { 3173 if( Object.isArray( tagName ) ) tagName.each( extend ); 3174 else extend( tagName ); 3175 } 3176 3177 function extend( tagName ) 3178 { 3179 tagName = tagName.toUpperCase(); 3180 if( !Element.Methods.ByTag[tagName] ) 3181 Element.Methods.ByTag[tagName] = { }; 3182 Object.extend( Element.Methods.ByTag[tagName], methods ); 3183 } 3184 3185 function copy( methods, destination, onlyIfAbsent ) 3186 { 3187 onlyIfAbsent = onlyIfAbsent || false; 3188 for( var property in methods ) 3189 { 3190 var value = methods[property]; 3191 if( !Object.isFunction( value ) ) continue; 3192 if( !onlyIfAbsent || !(property in destination) ) 3193 destination[property] = value.methodize(); 3194 } 3195 } 3196 3197 function findDOMClass( tagName ) 3198 { 3199 var klass; 3200 var trans = { 3201 "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph", 3202 "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList", 3203 "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading", 3204 "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote", 3205 "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION": 3206 "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD": 3207 "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR": 3208 "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET": 3209 "FrameSet", "IFRAME": "IFrame" 3210 }; 3211 if( trans[tagName] ) klass = 'HTML' + trans[tagName] + 'Element'; 3212 if( window[klass] ) return window[klass]; 3213 klass = 'HTML' + tagName + 'Element'; 3214 if( window[klass] ) return window[klass]; 3215 klass = 'HTML' + tagName.capitalize() + 'Element'; 3216 if( window[klass] ) return window[klass]; 3217 3218 window[klass] = { }; 3219 window[klass].prototype = document.createElement( tagName )['__proto__']; 3220 return window[klass]; 3221 } 3222 3223 if( F.ElementExtensions ) 3224 { 3225 copy( Element.Methods, HTMLElement.prototype ); 3226 copy( Element.Methods.Simulated, HTMLElement.prototype, true ); 3227 } 3228 3229 if( F.SpecificElementExtensions ) 3230 { 3231 for( var tag in Element.Methods.ByTag ) 3232 { 3233 var klass = findDOMClass( tag ); 3234 if( Object.isUndefined( klass ) ) continue; 3235 copy( T[tag], klass.prototype ); 3236 } 3237 } 3238 3239 Object.extend( Element, Element.Methods ); 3240 delete Element.ByTag; 3241 3242 if( Element.extend.refresh ) Element.extend.refresh(); 3243 Element.cache = { }; 2506 3244 }; 2507 3245 2508 Element._insertionTranslations = {2509 before: function(element, node) {2510 element.parentNode.insertBefore(node, element);2511 },2512 top: function(element, node) {2513 element.insertBefore(node, element.firstChild);2514 },2515 bottom: function(element, node) {2516 element.appendChild(node);2517 },2518 after: function(element, node) {2519 element.parentNode.insertBefore(node, element.nextSibling);2520 },2521 tags: {2522 TABLE: ['<table>', '</table>', 1],2523 TBODY: ['<table><tbody>', '</tbody></table>', 2],2524 TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],2525 TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],2526 SELECT: ['<select>', '</select>', 1]2527 }2528 };2529 2530 (function() {2531 Object.extend(this.tags, {2532 THEAD: this.tags.TBODY,2533 TFOOT: this.tags.TBODY,2534 TH: this.tags.TD2535 });2536 }).call(Element._insertionTranslations);2537 2538 Element.Methods.Simulated = {2539 hasAttribute: function(element, attribute) {2540 attribute = Element._attributeTranslations.has[attribute] || attribute;2541 var node = $(element).getAttributeNode(attribute);2542 return !!(node && node.specified);2543 }2544 };2545 2546 Element.Methods.ByTag = { };2547 2548 Object.extend(Element, Element.Methods);2549 2550 if (!Prototype.BrowserFeatures.ElementExtensions &&2551 document.createElement('div')['__proto__']) {2552 window.HTMLElement = { };2553 window.HTMLElement.prototype = document.createElement('div')['__proto__'];2554 Prototype.BrowserFeatures.ElementExtensions = true;2555 }2556 2557 Element.extend = (function() {2558 if (Prototype.BrowserFeatures.SpecificElementExtensions)2559 return Prototype.K;2560 2561 var Methods = { }, ByTag = Element.Methods.ByTag;2562 2563 var extend = Object.extend(function(element) {2564 if (!element || element._extendedByPrototype ||2565 element.nodeType != 1 || element == window) return element;2566 2567 var methods = Object.clone(Methods),2568 tagName = element.tagName.toUpperCase(), property, value;2569 2570 // extend methods for specific tags2571 if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);2572 2573 for (property in methods) {2574 value = methods[property];2575 if (Object.isFunction(value) && !(property in element))2576 element[property] = value.methodize();2577 }2578 2579 element._extendedByPrototype = Prototype.emptyFunction;2580 return element;2581 2582 }, {2583 refresh: function() {2584 // extend methods for all tags (Safari doesn't need this)2585 if (!Prototype.BrowserFeatures.ElementExtensions) {2586 Object.extend(Methods, Element.Methods);2587 Object.extend(Methods, Element.Methods.Simulated);2588 }2589 }2590 });2591 2592 extend.refresh();2593 return extend;2594 })();2595 2596 Element.hasAttribute = function(element, attribute) {2597 if (element.hasAttribute) return element.hasAttribute(attribute);2598 return Element.Methods.Simulated.hasAttribute(element, attribute);2599 };2600 2601 Element.addMethods = function(methods) {2602 var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;2603 2604 if (!methods) {2605 Object.extend(Form, Form.Methods);2606 Object.extend(Form.Element, Form.Element.Methods);2607 Object.extend(Element.Methods.ByTag, {2608 "FORM": Object.clone(Form.Methods),2609 "INPUT": Object.clone(Form.Element.Methods),2610 "SELECT": Object.clone(Form.Element.Methods),2611 "TEXTAREA": Object.clone(Form.Element.Methods)2612 });2613 }2614 2615 if (arguments.length == 2) {2616 var tagName = methods;2617 methods = arguments[1];2618 }2619 2620 if (!tagName) Object.extend(Element.Methods, methods || { });2621 else {2622 if (Object.isArray(tagName)) tagName.each(extend);2623 else extend(tagName);2624 }2625 2626 function extend(tagName) {2627 tagName = tagName.toUpperCase();2628 if (!Element.Methods.ByTag[tagName])2629 Element.Methods.ByTag[tagName] = { };2630 Object.extend(Element.Methods.ByTag[tagName], methods);2631 }2632 2633 function copy(methods, destination, onlyIfAbsent) {2634 onlyIfAbsent = onlyIfAbsent || false;2635 for (var property in methods) {2636 var value = methods[property];2637 if (!Object.isFunction(value)) continue;2638 if (!onlyIfAbsent || !(property in destination))2639 destination[property] = value.methodize();2640 }2641 }2642 2643 function findDOMClass(tagName) {2644 var klass;2645 var trans = {2646 "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",2647 "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",2648 "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",2649 "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",2650 "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":2651 "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":2652 "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":2653 "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":2654 "FrameSet", "IFRAME": "IFrame"2655 };2656 if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';2657 if (window[klass]) return window[klass];2658 klass = 'HTML' + tagName + 'Element';2659 if (window[klass]) return window[klass];2660 klass = 'HTML' + tagName.capitalize() + 'Element';2661 if (window[klass]) return window[klass];2662 2663 window[klass] = { };2664 window[klass].prototype = document.createElement(tagName)['__proto__'];2665 return window[klass];2666 }2667 2668 if (F.ElementExtensions) {2669 copy(Element.Methods, HTMLElement.prototype);2670 copy(Element.Methods.Simulated, HTMLElement.prototype, true);2671 }2672 2673 if (F.SpecificElementExtensions) {2674 for (var tag in Element.Methods.ByTag) {2675 var klass = findDOMClass(tag);2676 if (Object.isUndefined(klass)) continue;2677 copy(T[tag], klass.prototype);2678 }2679 }2680 2681 Object.extend(Element, Element.Methods);2682 delete Element.ByTag;2683 2684 if (Element.extend.refresh) Element.extend.refresh();2685 Element.cache = { };2686 };2687 2688 3246 document.viewport = { 2689 getDimensions: function() { 2690 var dimensions = { }, B = Prototype.Browser; 2691 $w('width height').each(function(d) { 2692 var D = d.capitalize(); 2693 if (B.WebKit && !document.evaluate) { 2694 // Safari <3.0 needs self.innerWidth/Height 2695 dimensions[d] = self['inner' + D]; 2696 } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) { 2697 // Opera <9.5 needs document.body.clientWidth/Height 2698 dimensions[d] = document.body['client' + D] 2699 } else { 2700 dimensions[d] = document.documentElement['client' + D]; 2701 } 2702 }); 2703 return dimensions; 2704 }, 2705 2706 getWidth: function() { 2707 return this.getDimensions().width; 2708 }, 2709 2710 getHeight: function() { 2711 return this.getDimensions().height; 2712 }, 2713 2714 getScrollOffsets: function() { 2715 return Element._returnOffset( 2716 window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, 2717 window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); 2718 } 3247 getDimensions: function() 3248 { 3249 var dimensions = { }, B = Prototype.Browser; 3250 $w( 'width height' ).each( function( d ) 3251 { 3252 var D = d.capitalize(); 3253 if( B.WebKit && !document.evaluate ) 3254 { 3255 // Safari <3.0 needs self.innerWidth/Height 3256 dimensions[d] = self['inner' + D]; 3257 } else if( B.Opera && parseFloat( window.opera.version() ) < 9.5 ) 3258 { 3259 // Opera <9.5 needs document.body.clientWidth/Height 3260 dimensions[d] = document.body['client' + D] 3261 } 3262 else 3263 { 3264 dimensions[d] = document.documentElement['client' + D]; 3265 } 3266 } ); 3267 return dimensions; 3268 }, 3269 3270 getWidth: function() 3271 { 3272 return this.getDimensions().width; 3273 }, 3274 3275 getHeight: function() 3276 { 3277 return this.getDimensions().height; 3278 }, 3279 3280 getScrollOffsets: function() 3281 { 3282 return Element._returnOffset( 3283 window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, 3284 window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop ); 3285 } 2719 3286 }; 2720 3287 /* Portions of the Selector class are derived from Jack Slocum's DomQuery, … … 2722 3289 * license. Please see http://www.yui-ext.com/ for more information. */ 2723 3290 2724 var Selector = Class.create({ 2725 initialize: function(expression) { 2726 this.expression = expression.strip(); 2727 2728 if (this.shouldUseSelectorsAPI()) { 2729 this.mode = 'selectorsAPI'; 2730 } else if (this.shouldUseXPath()) { 2731 this.mode = 'xpath'; 2732 this.compileXPathMatcher(); 2733 } else { 2734 this.mode = "normal"; 2735 this.compileMatcher(); 2736 } 2737 2738 }, 2739 2740 shouldUseXPath: function() { 2741 if (!Prototype.BrowserFeatures.XPath) return false; 2742 2743 var e = this.expression; 2744 2745 // Safari 3 chokes on :*-of-type and :empty 2746 if (Prototype.Browser.WebKit && 2747 (e.include("-of-type") || e.include(":empty"))) 2748 return false; 2749 2750 // XPath can't do namespaced attributes, nor can it read 2751 // the "checked" property from DOM nodes 2752 if ((/(\[[\w-]*?:|:checked)/).test(e)) 2753 return false; 2754 2755 return true; 2756 }, 2757 2758 shouldUseSelectorsAPI: function() { 2759 if (!Prototype.BrowserFeatures.SelectorsAPI) return false; 2760 2761 if (!Selector._div) Selector._div = new Element('div'); 2762 2763 // Make sure the browser treats the selector as valid. Test on an 2764 // isolated element to minimize cost of this check. 2765 try { 2766 Selector._div.querySelector(this.expression); 2767 } catch(e) { 2768 return false; 2769 } 2770 2771 return true; 2772 }, 2773 2774 compileMatcher: function() { 2775 var e = this.expression, ps = Selector.patterns, h = Selector.handlers, 2776 c = Selector.criteria, le, p, m; 2777 2778 if (Selector._cache[e]) { 2779 this.matcher = Selector._cache[e]; 2780 return; 2781 } 2782 2783 this.matcher = ["this.matcher = function(root) {", 2784 "var r = root, h = Selector.handlers, c = false, n;"]; 2785 2786 while (e && le != e && (/\S/).test(e)) { 2787 le = e; 2788 for (var i in ps) { 2789 p = ps[i]; 2790 if (m = e.match(p)) { 2791 this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : 2792 new Template(c[i]).evaluate(m)); 2793 e = e.replace(m[0], ''); 2794 break; 2795 } 2796 } 2797 } 2798 2799 this.matcher.push("return h.unique(n);\n}"); 2800 eval(this.matcher.join('\n')); 2801 Selector._cache[this.expression] = this.matcher; 2802 }, 2803 2804 compileXPathMatcher: function() { 2805 var e = this.expression, ps = Selector.patterns, 2806 x = Selector.xpath, le, m; 2807 2808 if (Selector._cache[e]) { 2809 this.xpath = Selector._cache[e]; return; 2810 } 2811 2812 this.matcher = ['.//*']; 2813 while (e && le != e && (/\S/).test(e)) { 2814 le = e; 2815 for (var i in ps) { 2816 if (m = e.match(ps[i])) { 2817 this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : 2818 new Template(x[i]).evaluate(m)); 2819 e = e.replace(m[0], ''); 2820 break; 2821 } 2822 } 2823 } 2824 2825 this.xpath = this.matcher.join(''); 2826 Selector._cache[this.expression] = this.xpath; 2827 }, 2828 2829 findElements: function(root) { 2830 root = root || document; 2831 var e = this.expression, results; 2832 2833 switch (this.mode) { 2834 case 'selectorsAPI': 2835 // querySelectorAll queries document-wide, then filters to descendants 2836 // of the context element. That's not what we want. 2837 // Add an explicit context to the selector if necessary. 2838 if (root !== document) { 2839 var oldId = root.id, id = $(root).identify(); 2840 e = "#" + id + " " + e; 2841 } 2842 2843 results = $A(root.querySelectorAll(e)).map(Element.extend); 2844 root.id = oldId; 2845 3291 var Selector = Class.create( { 3292 initialize: function( expression ) 3293 { 3294 this.expression = expression.strip(); 3295 3296 if( this.shouldUseSelectorsAPI() ) 3297 { 3298 this.mode = 'selectorsAPI'; 3299 } else if( this.shouldUseXPath() ) 3300 { 3301 this.mode = 'xpath'; 3302 this.compileXPathMatcher(); 3303 } 3304 else 3305 { 3306 this.mode = "normal"; 3307 this.compileMatcher(); 3308 } 3309 3310 }, 3311 3312 shouldUseXPath: function() 3313 { 3314 if( !Prototype.BrowserFeatures.XPath ) return false; 3315 3316 var e = this.expression; 3317 3318 // Safari 3 chokes on :*-of-type and :empty 3319 if( Prototype.Browser.WebKit && 3320 (e.include( "-of-type" ) || e.include( ":empty" )) ) 3321 return false; 3322 3323 // XPath can't do namespaced attributes, nor can it read 3324 // the "checked" property from DOM nodes 3325 if( (/(\[[\w-]*?:|:checked)/).test( e ) ) 3326 return false; 3327 3328 return true; 3329 }, 3330 3331 shouldUseSelectorsAPI: function() 3332 { 3333 if( !Prototype.BrowserFeatures.SelectorsAPI ) return false; 3334 3335 if( !Selector._div ) Selector._div = new Element( 'div' ); 3336 3337 // Make sure the browser treats the selector as valid. Test on an 3338 // isolated element to minimize cost of this check. 3339 try 3340 { 3341 Selector._div.querySelector( this.expression ); 3342 } 3343 catch( e ) 3344 { 3345 return false; 3346 } 3347 3348 return true; 3349 }, 3350 3351 compileMatcher: function() 3352 { 3353 var e = this.expression, ps = Selector.patterns, h = Selector.handlers, 3354 c = Selector.criteria, le, p, m; 3355 3356 if( Selector._cache[e] ) 3357 { 3358 this.matcher = Selector._cache[e]; 3359 return; 3360 } 3361 3362 this.matcher = ["this.matcher = function(root) {", 3363 "var r = root, h = Selector.handlers, c = false, n;"]; 3364 3365 while( e && le != e && (/\S/).test( e ) ) 3366 { 3367 le = e; 3368 for( var i in ps ) 3369 { 3370 p = ps[i]; 3371 if( m = e.match( p ) ) 3372 { 3373 this.matcher.push( Object.isFunction( c[i] ) ? c[i]( m ) : 3374 new Template( c[i] ).evaluate( m ) ); 3375 e = e.replace( m[0], '' ); 3376 break; 3377 } 3378 } 3379 } 3380 3381 this.matcher.push( "return h.unique(n);\n}" ); 3382 eval( this.matcher.join( '\n' ) ); 3383 Selector._cache[this.expression] = this.matcher; 3384 }, 3385 3386 compileXPathMatcher: function() 3387 { 3388 var e = this.expression, ps = Selector.patterns, 3389 x = Selector.xpath, le, m; 3390 3391 if( Selector._cache[e] ) 3392 { 3393 this.xpath = Selector._cache[e]; 3394 return; 3395 } 3396 3397 this.matcher = ['.//*']; 3398 while( e && le != e && (/\S/).test( e ) ) 3399 { 3400 le = e; 3401 for( var i in ps ) 3402 { 3403 if( m = e.match( ps[i] ) ) 3404 { 3405 this.matcher.push( Object.isFunction( x[i] ) ? x[i]( m ) : 3406 new Template( x[i] ).evaluate( m ) ); 3407 e = e.replace( m[0], '' ); 3408 break; 3409 } 3410 } 3411 } 3412 3413 this.xpath = this.matcher.join( '' ); 3414 Selector._cache[this.expression] = this.xpath; 3415 }, 3416 3417 findElements: function( root ) 3418 { 3419 root = root || document; 3420 var e = this.expression, results; 3421 3422 switch( this.mode ) 3423 { 3424 case 'selectorsAPI': 3425 // querySelectorAll queries document-wide, then filters to descendants 3426 // of the context element. That's not what we want. 3427 // Add an explicit context to the selector if necessary. 3428 if( root !== document ) 3429 { 3430 var oldId = root.id, id = $( root ).identify(); 3431 e = "#" + id + " " + e; 3432 } 3433 3434 results = $A( root.querySelectorAll( e ) ).map( Element.extend ); 3435 root.id = oldId; 3436 3437 return results; 3438 case 'xpath': 3439 return document._getElementsByXPath( this.xpath, root ); 3440 default: 3441 return this.matcher( root ); 3442 } 3443 }, 3444 3445 match: function( element ) 3446 { 3447 this.tokens = []; 3448 3449 var e = this.expression, ps = Selector.patterns, as = Selector.assertions; 3450 var le, p, m; 3451 3452 while( e && le !== e && (/\S/).test( e ) ) 3453 { 3454 le = e; 3455 for( var i in ps ) 3456 { 3457 p = ps[i]; 3458 if( m = e.match( p ) ) 3459 { 3460 // use the Selector.assertions methods unless the selector 3461 // is too complex. 3462 if( as[i] ) 3463 { 3464 this.tokens.push( [i, Object.clone( m )] ); 3465 e = e.replace( m[0], '' ); 3466 } 3467 else 3468 { 3469 // reluctantly do a document-wide search 3470 // and look for a match in the array 3471 return this.findElements( document ).include( element ); 3472 } 3473 } 3474 } 3475 } 3476 3477 var match = true, name, matches; 3478 for( var i = 0, token; token = this.tokens[i]; i++ ) 3479 { 3480 name = token[0],matches = token[1]; 3481 if( !Selector.assertions[name]( element, matches ) ) 3482 { 3483 match = false; 3484 break; 3485 } 3486 } 3487 3488 return match; 3489 }, 3490 3491 toString: function() 3492 { 3493 return this.expression; 3494 }, 3495 3496 inspect: function() 3497 { 3498 return "#<Selector:" + this.expression.inspect() + ">"; 3499 } 3500 } ); 3501 3502 Object.extend( Selector, { 3503 _cache: { }, 3504 3505 xpath: { 3506 descendant: "//*", 3507 child: "/*", 3508 adjacent: "/following-sibling::*[1]", 3509 laterSibling: '/following-sibling::*', 3510 tagName: function( m ) 3511 { 3512 if( m[1] == '*' ) return ''; 3513 return "[local-name()='" + m[1].toLowerCase() + 3514 "' or local-name()='" + m[1].toUpperCase() + "']"; 3515 }, 3516 className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", 3517 id: "[@id='#{1}']", 3518 attrPresence: function( m ) 3519 { 3520 m[1] = m[1].toLowerCase(); 3521 return new Template( "[@#{1}]" ).evaluate( m ); 3522 }, 3523 attr: function( m ) 3524 { 3525 m[1] = m[1].toLowerCase(); 3526 m[3] = m[5] || m[6]; 3527 return new Template( Selector.xpath.operators[m[2]] ).evaluate( m ); 3528 }, 3529 pseudo: function( m ) 3530 { 3531 var h = Selector.xpath.pseudos[m[1]]; 3532 if( !h ) return ''; 3533 if( Object.isFunction( h ) ) return h( m ); 3534 return new Template( Selector.xpath.pseudos[m[1]] ).evaluate( m ); 3535 }, 3536 operators: { 3537 '=': "[@#{1}='#{3}']", 3538 '!=': "[@#{1}!='#{3}']", 3539 '^=': "[starts-with(@#{1}, '#{3}')]", 3540 '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", 3541 '*=': "[contains(@#{1}, '#{3}')]", 3542 '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", 3543 '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" 3544 }, 3545 pseudos: { 3546 'first-child': '[not(preceding-sibling::*)]', 3547 'last-child': '[not(following-sibling::*)]', 3548 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', 3549 'empty': "[count(*) = 0 and (count(text()) = 0)]", 3550 'checked': "[@checked]", 3551 'disabled': "[(@disabled) and (@type!='hidden')]", 3552 'enabled': "[not(@disabled) and (@type!='hidden')]", 3553 'not': function( m ) 3554 { 3555 var e = m[6], p = Selector.patterns, 3556 x = Selector.xpath, le, v; 3557 3558 var exclusion = []; 3559 while( e && le != e && (/\S/).test( e ) ) 3560 { 3561 le = e; 3562 for( var i in p ) 3563 { 3564 if( m = e.match( p[i] ) ) 3565 { 3566 v = Object.isFunction( x[i] ) ? x[i]( m ) : new Template( x[i] ).evaluate( m ); 3567 exclusion.push( "(" + v.substring( 1, v.length - 1 ) + ")" ); 3568 e = e.replace( m[0], '' ); 3569 break; 3570 } 3571 } 3572 } 3573 return "[not(" + exclusion.join( " and " ) + ")]"; 3574 }, 3575 'nth-child': function( m ) 3576 { 3577 return Selector.xpath.pseudos.nth( "(count(./preceding-sibling::*) + 1) ", m ); 3578 }, 3579 'nth-last-child': function( m ) 3580 { 3581 return Selector.xpath.pseudos.nth( "(count(./following-sibling::*) + 1) ", m ); 3582 }, 3583 'nth-of-type': function( m ) 3584 { 3585 return Selector.xpath.pseudos.nth( "position() ", m ); 3586 }, 3587 'nth-last-of-type': function( m ) 3588 { 3589 return Selector.xpath.pseudos.nth( "(last() + 1 - position()) ", m ); 3590 }, 3591 'first-of-type': function( m ) 3592 { 3593 m[6] = "1"; 3594 return Selector.xpath.pseudos['nth-of-type']( m ); 3595 }, 3596 'last-of-type': function( m ) 3597 { 3598 m[6] = "1"; 3599 return Selector.xpath.pseudos['nth-last-of-type']( m ); 3600 }, 3601 'only-of-type': function( m ) 3602 { 3603 var p = Selector.xpath.pseudos; 3604 return p['first-of-type']( m ) + p['last-of-type']( m ); 3605 }, 3606 nth: function( fragment, m ) 3607 { 3608 var mm, formula = m[6], predicate; 3609 if( formula == 'even' ) formula = '2n+0'; 3610 if( formula == 'odd' ) formula = '2n+1'; 3611 if( mm = formula.match( /^(\d+)$/ ) ) // digit only 3612 return '[' + fragment + "= " + mm[1] + ']'; 3613 if( mm = formula.match( /^(-?\d*)?n(([+-])(\d+))?/ ) ) 3614 { // an+b 3615 if( mm[1] == "-" ) mm[1] = -1; 3616 var a = mm[1] ? Number( mm[1] ) : 1; 3617 var b = mm[2] ? Number( mm[2] ) : 0; 3618 predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + 3619 "((#{fragment} - #{b}) div #{a} >= 0)]"; 3620 return new Template( predicate ).evaluate( { 3621 fragment: fragment, a: a, b: b } ); 3622 } 3623 } 3624 } 3625 }, 3626 3627 criteria: { 3628 tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', 3629 className: 'n = h.className(n, r, "#{1}", c); c = false;', 3630 id: 'n = h.id(n, r, "#{1}", c); c = false;', 3631 attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', 3632 attr: function( m ) 3633 { 3634 m[3] = (m[5] || m[6]); 3635 return new Template( 'n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;' ).evaluate( m ); 3636 }, 3637 pseudo: function( m ) 3638 { 3639 if( m[6] ) m[6] = m[6].replace( /"/g, '\\"' ); 3640 return new Template( 'n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;' ).evaluate( m ); 3641 }, 3642 descendant: 'c = "descendant";', 3643 child: 'c = "child";', 3644 adjacent: 'c = "adjacent";', 3645 laterSibling: 'c = "laterSibling";' 3646 }, 3647 3648 patterns: { 3649 // combinators must be listed first 3650 // (and descendant needs to be last combinator) 3651 laterSibling: /^\s*~\s*/, 3652 child: /^\s*>\s*/, 3653 adjacent: /^\s*\+\s*/, 3654 descendant: /^\s/, 3655 3656 // selectors follow 3657 tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, 3658 id: /^#([\w\-\*]+)(\b|$)/, 3659 className: /^\.([\w\-\*]+)(\b|$)/, 3660 pseudo: 3661 /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, 3662 attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/, 3663 attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ 3664 }, 3665 3666 // for Selector.match and Element#match 3667 assertions: { 3668 tagName: function( element, matches ) 3669 { 3670 return matches[1].toUpperCase() == element.tagName.toUpperCase(); 3671 }, 3672 3673 className: function( element, matches ) 3674 { 3675 return Element.hasClassName( element, matches[1] ); 3676 }, 3677 3678 id: function( element, matches ) 3679 { 3680 return element.id === matches[1]; 3681 }, 3682 3683 attrPresence: function( element, matches ) 3684 { 3685 return Element.hasAttribute( element, matches[1] ); 3686 }, 3687 3688 attr: function( element, matches ) 3689 { 3690 var nodeValue = Element.readAttribute( element, matches[1] ); 3691 return nodeValue && Selector.operators[matches[2]]( nodeValue, matches[5] || matches[6] ); 3692 } 3693 }, 3694 3695 handlers: { 3696 // UTILITY FUNCTIONS 3697 // joins two collections 3698 concat: function( a, b ) 3699 { 3700 for( var i = 0, node; node = b[i]; i++ ) 3701 a.push( node ); 3702 return a; 3703 }, 3704 3705 // marks an array of nodes for counting 3706 mark: function( nodes ) 3707 { 3708 var _true = Prototype.emptyFunction; 3709 for( var i = 0, node; node = nodes[i]; i++ ) 3710 node._countedByPrototype = _true; 3711 return nodes; 3712 }, 3713 3714 unmark: function( nodes ) 3715 { 3716 for( var i = 0, node; node = nodes[i]; i++ ) 3717 node._countedByPrototype = undefined; 3718 return nodes; 3719 }, 3720 3721 // mark each child node with its position (for nth calls) 3722 // "ofType" flag indicates whether we're indexing for nth-of-type 3723 // rather than nth-child 3724 index: function( parentNode, reverse, ofType ) 3725 { 3726 parentNode._countedByPrototype = Prototype.emptyFunction; 3727 if( reverse ) 3728 { 3729 for( var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i-- ) 3730 { 3731 var node = nodes[i]; 3732 if( node.nodeType == 1 && (!ofType || node._countedByPrototype) ) node.nodeIndex = j++; 3733 } 3734 } 3735 else 3736 { 3737 for( var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++ ) 3738 if( node.nodeType == 1 && (!ofType || node._countedByPrototype) ) node.nodeIndex = j++; 3739 } 3740 }, 3741 3742 // filters out duplicates and extends all nodes 3743 unique: function( nodes ) 3744 { 3745 if( nodes.length == 0 ) return nodes; 3746 var results = [], n; 3747 for( var i = 0, l = nodes.length; i < l; i++ ) 3748 if( !(n = nodes[i])._countedByPrototype ) 3749 { 3750 n._countedByPrototype = Prototype.emptyFunction; 3751 results.push( Element.extend( n ) ); 3752 } 3753 return Selector.handlers.unmark( results ); 3754 }, 3755 3756 // COMBINATOR FUNCTIONS 3757 descendant: function( nodes ) 3758 { 3759 var h = Selector.handlers; 3760 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 3761 h.concat( results, node.getElementsByTagName( '*' ) ); 3762 return results; 3763 }, 3764 3765 child: function( nodes ) 3766 { 3767 var h = Selector.handlers; 3768 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 3769 { 3770 for( var j = 0, child; child = node.childNodes[j]; j++ ) 3771 if( child.nodeType == 1 && child.tagName != '!' ) results.push( child ); 3772 } 3773 return results; 3774 }, 3775 3776 adjacent: function( nodes ) 3777 { 3778 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 3779 { 3780 var next = this.nextElementSibling( node ); 3781 if( next ) results.push( next ); 3782 } 3783 return results; 3784 }, 3785 3786 laterSibling: function( nodes ) 3787 { 3788 var h = Selector.handlers; 3789 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 3790 h.concat( results, Element.nextSiblings( node ) ); 3791 return results; 3792 }, 3793 3794 nextElementSibling: function( node ) 3795 { 3796 while( node = node.nextSibling ) 3797 if( node.nodeType == 1 ) return node; 3798 return null; 3799 }, 3800 3801 previousElementSibling: function( node ) 3802 { 3803 while( node = node.previousSibling ) 3804 if( node.nodeType == 1 ) return node; 3805 return null; 3806 }, 3807 3808 // TOKEN FUNCTIONS 3809 tagName: function( nodes, root, tagName, combinator ) 3810 { 3811 var uTagName = tagName.toUpperCase(); 3812 var results = [], h = Selector.handlers; 3813 if( nodes ) 3814 { 3815 if( combinator ) 3816 { 3817 // fastlane for ordinary descendant combinators 3818 if( combinator == "descendant" ) 3819 { 3820 for( var i = 0, node; node = nodes[i]; i++ ) 3821 h.concat( results, node.getElementsByTagName( tagName ) ); 3822 return results; 3823 } 3824 else nodes = this[combinator]( nodes ); 3825 if( tagName == "*" ) return nodes; 3826 } 3827 for( var i = 0, node; node = nodes[i]; i++ ) 3828 if( node.tagName.toUpperCase() === uTagName ) results.push( node ); 3829 return results; 3830 } 3831 else return root.getElementsByTagName( tagName ); 3832 }, 3833 3834 id: function( nodes, root, id, combinator ) 3835 { 3836 var targetNode = $( id ), h = Selector.handlers; 3837 if( !targetNode ) return []; 3838 if( !nodes && root == document ) return [targetNode]; 3839 if( nodes ) 3840 { 3841 if( combinator ) 3842 { 3843 if( combinator == 'child' ) 3844 { 3845 for( var i = 0, node; node = nodes[i]; i++ ) 3846 if( targetNode.parentNode == node ) return [targetNode]; 3847 } else if( combinator == 'descendant' ) 3848 { 3849 for( var i = 0, node; node = nodes[i]; i++ ) 3850 if( Element.descendantOf( targetNode, node ) ) return [targetNode]; 3851 } else if( combinator == 'adjacent' ) 3852 { 3853 for( var i = 0, node; node = nodes[i]; i++ ) 3854 if( Selector.handlers.previousElementSibling( targetNode ) == node ) 3855 return [targetNode]; 3856 } 3857 else nodes = h[combinator]( nodes ); 3858 } 3859 for( var i = 0, node; node = nodes[i]; i++ ) 3860 if( node == targetNode ) return [targetNode]; 3861 return []; 3862 } 3863 return (targetNode && Element.descendantOf( targetNode, root )) ? [targetNode] : []; 3864 }, 3865 3866 className: function( nodes, root, className, combinator ) 3867 { 3868 if( nodes && combinator ) nodes = this[combinator]( nodes ); 3869 return Selector.handlers.byClassName( nodes, root, className ); 3870 }, 3871 3872 byClassName: function( nodes, root, className ) 3873 { 3874 if( !nodes ) nodes = Selector.handlers.descendant( [root] ); 3875 var needle = ' ' + className + ' '; 3876 for( var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++ ) 3877 { 3878 nodeClassName = node.className; 3879 if( nodeClassName.length == 0 ) continue; 3880 if( nodeClassName == className || (' ' + nodeClassName + ' ').include( needle ) ) 3881 results.push( node ); 3882 } 3883 return results; 3884 }, 3885 3886 attrPresence: function( nodes, root, attr, combinator ) 3887 { 3888 if( !nodes ) nodes = root.getElementsByTagName( "*" ); 3889 if( nodes && combinator ) nodes = this[combinator]( nodes ); 3890 var results = []; 3891 for( var i = 0, node; node = nodes[i]; i++ ) 3892 if( Element.hasAttribute( node, attr ) ) results.push( node ); 3893 return results; 3894 }, 3895 3896 attr: function( nodes, root, attr, value, operator, combinator ) 3897 { 3898 if( !nodes ) nodes = root.getElementsByTagName( "*" ); 3899 if( nodes && combinator ) nodes = this[combinator]( nodes ); 3900 var handler = Selector.operators[operator], results = []; 3901 for( var i = 0, node; node = nodes[i]; i++ ) 3902 { 3903 var nodeValue = Element.readAttribute( node, attr ); 3904 if( nodeValue === null ) continue; 3905 if( handler( nodeValue, value ) ) results.push( node ); 3906 } 3907 return results; 3908 }, 3909 3910 pseudo: function( nodes, name, value, root, combinator ) 3911 { 3912 if( nodes && combinator ) nodes = this[combinator]( nodes ); 3913 if( !nodes ) nodes = root.getElementsByTagName( "*" ); 3914 return Selector.pseudos[name]( nodes, value, root ); 3915 } 3916 }, 3917 3918 pseudos: { 3919 'first-child': function( nodes, value, root ) 3920 { 3921 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 3922 { 3923 if( Selector.handlers.previousElementSibling( node ) ) continue; 3924 results.push( node ); 3925 } 3926 return results; 3927 }, 3928 'last-child': function( nodes, value, root ) 3929 { 3930 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 3931 { 3932 if( Selector.handlers.nextElementSibling( node ) ) continue; 3933 results.push( node ); 3934 } 3935 return results; 3936 }, 3937 'only-child': function( nodes, value, root ) 3938 { 3939 var h = Selector.handlers; 3940 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 3941 if( !h.previousElementSibling( node ) && !h.nextElementSibling( node ) ) 3942 results.push( node ); 3943 return results; 3944 }, 3945 'nth-child': function( nodes, formula, root ) 3946 { 3947 return Selector.pseudos.nth( nodes, formula, root ); 3948 }, 3949 'nth-last-child': function( nodes, formula, root ) 3950 { 3951 return Selector.pseudos.nth( nodes, formula, root, true ); 3952 }, 3953 'nth-of-type': function( nodes, formula, root ) 3954 { 3955 return Selector.pseudos.nth( nodes, formula, root, false, true ); 3956 }, 3957 'nth-last-of-type': function( nodes, formula, root ) 3958 { 3959 return Selector.pseudos.nth( nodes, formula, root, true, true ); 3960 }, 3961 'first-of-type': function( nodes, formula, root ) 3962 { 3963 return Selector.pseudos.nth( nodes, "1", root, false, true ); 3964 }, 3965 'last-of-type': function( nodes, formula, root ) 3966 { 3967 return Selector.pseudos.nth( nodes, "1", root, true, true ); 3968 }, 3969 'only-of-type': function( nodes, formula, root ) 3970 { 3971 var p = Selector.pseudos; 3972 return p['last-of-type']( p['first-of-type']( nodes, formula, root ), formula, root ); 3973 }, 3974 3975 // handles the an+b logic 3976 getIndices: function( a, b, total ) 3977 { 3978 if( a == 0 ) return b > 0 ? [b] : []; 3979 return $R( 1, total ).inject( [], function( memo, i ) 3980 { 3981 if( 0 == (i - b) % a && (i - b) / a >= 0 ) memo.push( i ); 3982 return memo; 3983 } ); 3984 }, 3985 3986 // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type 3987 nth: function( nodes, formula, root, reverse, ofType ) 3988 { 3989 if( nodes.length == 0 ) return []; 3990 if( formula == 'even' ) formula = '2n+0'; 3991 if( formula == 'odd' ) formula = '2n+1'; 3992 var h = Selector.handlers, results = [], indexed = [], m; 3993 h.mark( nodes ); 3994 for( var i = 0, node; node = nodes[i]; i++ ) 3995 { 3996 if( !node.parentNode._countedByPrototype ) 3997 { 3998 h.index( node.parentNode, reverse, ofType ); 3999 indexed.push( node.parentNode ); 4000 } 4001 } 4002 if( formula.match( /^\d+$/ ) ) 4003 { // just a number 4004 formula = Number( formula ); 4005 for( var i = 0, node; node = nodes[i]; i++ ) 4006 if( node.nodeIndex == formula ) results.push( node ); 4007 } else if( m = formula.match( /^(-?\d*)?n(([+-])(\d+))?/ ) ) 4008 { // an+b 4009 if( m[1] == "-" ) m[1] = -1; 4010 var a = m[1] ? Number( m[1] ) : 1; 4011 var b = m[2] ? Number( m[2] ) : 0; 4012 var indices = Selector.pseudos.getIndices( a, b, nodes.length ); 4013 for( var i = 0, node, l = indices.length; node = nodes[i]; i++ ) 4014 { 4015 for( var j = 0; j < l; j++ ) 4016 if( node.nodeIndex == indices[j] ) results.push( node ); 4017 } 4018 } 4019 h.unmark( nodes ); 4020 h.unmark( indexed ); 4021 return results; 4022 }, 4023 4024 'empty': function( nodes, value, root ) 4025 { 4026 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 4027 { 4028 // IE treats comments as element nodes 4029 if( node.tagName == '!' || node.firstChild ) continue; 4030 results.push( node ); 4031 } 4032 return results; 4033 }, 4034 4035 'not': function( nodes, selector, root ) 4036 { 4037 var h = Selector.handlers, selectorType, m; 4038 var exclusions = new Selector( selector ).findElements( root ); 4039 h.mark( exclusions ); 4040 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 4041 if( !node._countedByPrototype ) results.push( node ); 4042 h.unmark( exclusions ); 4043 return results; 4044 }, 4045 4046 'enabled': function( nodes, value, root ) 4047 { 4048 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 4049 if( !node.disabled && (!node.type || node.type !== 'hidden') ) 4050 results.push( node ); 4051 return results; 4052 }, 4053 4054 'disabled': function( nodes, value, root ) 4055 { 4056 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 4057 if( node.disabled ) results.push( node ); 4058 return results; 4059 }, 4060 4061 'checked': function( nodes, value, root ) 4062 { 4063 for( var i = 0, results = [], node; node = nodes[i]; i++ ) 4064 if( node.checked ) results.push( node ); 4065 return results; 4066 } 4067 }, 4068 4069 operators: { 4070 '=': function( nv, v ) 4071 { 4072 return nv == v; 4073 }, 4074 '!=': function( nv, v ) 4075 { 4076 return nv != v; 4077 }, 4078 '^=': function( nv, v ) 4079 { 4080 return nv == v || nv && nv.startsWith( v ); 4081 }, 4082 '$=': function( nv, v ) 4083 { 4084 return nv == v || nv && nv.endsWith( v ); 4085 }, 4086 '*=': function( nv, v ) 4087 { 4088 return nv == v || nv && nv.include( v ); 4089 }, 4090 '$=': function( nv, v ) 4091 { 4092 return nv.endsWith( v ); 4093 }, 4094 '*=': function( nv, v ) 4095 { 4096 return nv.include( v ); 4097 }, 4098 '~=': function( nv, v ) 4099 { 4100 return (' ' + nv + ' ').include( ' ' + v + ' ' ); 4101 }, 4102 '|=': function( nv, v ) 4103 { 4104 return ('-' + (nv || "").toUpperCase() + 4105 '-').include( '-' + (v || "").toUpperCase() + '-' ); 4106 } 4107 }, 4108 4109 split: function( expression ) 4110 { 4111 var expressions = []; 4112 expression.scan( /(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function( m ) 4113 { 4114 expressions.push( m[1].strip() ); 4115 } ); 4116 return expressions; 4117 }, 4118 4119 matchElements: function( elements, expression ) 4120 { 4121 var matches = $$( expression ), h = Selector.handlers; 4122 h.mark( matches ); 4123 for( var i = 0, results = [], element; element = elements[i]; i++ ) 4124 if( element._countedByPrototype ) results.push( element ); 4125 h.unmark( matches ); 2846 4126 return results; 2847 case 'xpath': 2848 return document._getElementsByXPath(this.xpath, root); 2849 default: 2850 return this.matcher(root); 2851 } 2852 }, 2853 2854 match: function(element) { 2855 this.tokens = []; 2856 2857 var e = this.expression, ps = Selector.patterns, as = Selector.assertions; 2858 var le, p, m; 2859 2860 while (e && le !== e && (/\S/).test(e)) { 2861 le = e; 2862 for (var i in ps) { 2863 p = ps[i]; 2864 if (m = e.match(p)) { 2865 // use the Selector.assertions methods unless the selector 2866 // is too complex. 2867 if (as[i]) { 2868 this.tokens.push([i, Object.clone(m)]); 2869 e = e.replace(m[0], ''); 2870 } else { 2871 // reluctantly do a document-wide search 2872 // and look for a match in the array 2873 return this.findElements(document).include(element); 2874 } 2875 } 2876 } 2877 } 2878 2879 var match = true, name, matches; 2880 for (var i = 0, token; token = this.tokens[i]; i++) { 2881 name = token[0], matches = token[1]; 2882 if (!Selector.assertions[name](element, matches)) { 2883 match = false; break; 2884 } 2885 } 2886 2887 return match; 2888 }, 2889 2890 toString: function() { 2891 return this.expression; 2892 }, 2893 2894 inspect: function() { 2895 return "#<Selector:" + this.expression.inspect() + ">"; 2896 } 2897 }); 2898 2899 Object.extend(Selector, { 2900 _cache: { }, 2901 2902 xpath: { 2903 descendant: "//*", 2904 child: "/*", 2905 adjacent: "/following-sibling::*[1]", 2906 laterSibling: '/following-sibling::*', 2907 tagName: function(m) { 2908 if (m[1] == '*') return ''; 2909 return "[local-name()='" + m[1].toLowerCase() + 2910 "' or local-name()='" + m[1].toUpperCase() + "']"; 2911 }, 2912 className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", 2913 id: "[@id='#{1}']", 2914 attrPresence: function(m) { 2915 m[1] = m[1].toLowerCase(); 2916 return new Template("[@#{1}]").evaluate(m); 2917 }, 2918 attr: function(m) { 2919 m[1] = m[1].toLowerCase(); 2920 m[3] = m[5] || m[6]; 2921 return new Template(Selector.xpath.operators[m[2]]).evaluate(m); 2922 }, 2923 pseudo: function(m) { 2924 var h = Selector.xpath.pseudos[m[1]]; 2925 if (!h) return ''; 2926 if (Object.isFunction(h)) return h(m); 2927 return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); 2928 }, 2929 operators: { 2930 '=': "[@#{1}='#{3}']", 2931 '!=': "[@#{1}!='#{3}']", 2932 '^=': "[starts-with(@#{1}, '#{3}')]", 2933 '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", 2934 '*=': "[contains(@#{1}, '#{3}')]", 2935 '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", 2936 '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" 2937 }, 2938 pseudos: { 2939 'first-child': '[not(preceding-sibling::*)]', 2940 'last-child': '[not(following-sibling::*)]', 2941 'only-child': '[not(preceding-sibling::* or following-sibling::*)]', 2942 'empty': "[count(*) = 0 and (count(text()) = 0)]", 2943 'checked': "[@checked]", 2944 'disabled': "[(@disabled) and (@type!='hidden')]", 2945 'enabled': "[not(@disabled) and (@type!='hidden')]", 2946 'not': function(m) { 2947 var e = m[6], p = Selector.patterns, 2948 x = Selector.xpath, le, v; 2949 2950 var exclusion = []; 2951 while (e && le != e && (/\S/).test(e)) { 2952 le = e; 2953 for (var i in p) { 2954 if (m = e.match(p[i])) { 2955 v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); 2956 exclusion.push("(" + v.substring(1, v.length - 1) + ")"); 2957 e = e.replace(m[0], ''); 2958 break; 2959 } 2960 } 2961 } 2962 return "[not(" + exclusion.join(" and ") + ")]"; 2963 }, 2964 'nth-child': function(m) { 2965 return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); 2966 }, 2967 'nth-last-child': function(m) { 2968 return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); 2969 }, 2970 'nth-of-type': function(m) { 2971 return Selector.xpath.pseudos.nth("position() ", m); 2972 }, 2973 'nth-last-of-type': function(m) { 2974 return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); 2975 }, 2976 'first-of-type': function(m) { 2977 m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); 2978 }, 2979 'last-of-type': function(m) { 2980 m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); 2981 }, 2982 'only-of-type': function(m) { 2983 var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); 2984 }, 2985 nth: function(fragment, m) { 2986 var mm, formula = m[6], predicate; 2987 if (formula == 'even') formula = '2n+0'; 2988 if (formula == 'odd') formula = '2n+1'; 2989 if (mm = formula.match(/^(\d+)$/)) // digit only 2990 return '[' + fragment + "= " + mm[1] + ']'; 2991 if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b 2992 if (mm[1] == "-") mm[1] = -1; 2993 var a = mm[1] ? Number(mm[1]) : 1; 2994 var b = mm[2] ? Number(mm[2]) : 0; 2995 predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + 2996 "((#{fragment} - #{b}) div #{a} >= 0)]"; 2997 return new Template(predicate).evaluate({ 2998 fragment: fragment, a: a, b: b }); 2999 } 3000 } 3001 } 3002 }, 3003 3004 criteria: { 3005 tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;', 3006 className: 'n = h.className(n, r, "#{1}", c); c = false;', 3007 id: 'n = h.id(n, r, "#{1}", c); c = false;', 3008 attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', 3009 attr: function(m) { 3010 m[3] = (m[5] || m[6]); 3011 return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); 3012 }, 3013 pseudo: function(m) { 3014 if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); 3015 return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); 3016 }, 3017 descendant: 'c = "descendant";', 3018 child: 'c = "child";', 3019 adjacent: 'c = "adjacent";', 3020 laterSibling: 'c = "laterSibling";' 3021 }, 3022 3023 patterns: { 3024 // combinators must be listed first 3025 // (and descendant needs to be last combinator) 3026 laterSibling: /^\s*~\s*/, 3027 child: /^\s*>\s*/, 3028 adjacent: /^\s*\+\s*/, 3029 descendant: /^\s/, 3030 3031 // selectors follow 3032 tagName: /^\s*(\*|[\w\-]+)(\b|$)?/, 3033 id: /^#([\w\-\*]+)(\b|$)/, 3034 className: /^\.([\w\-\*]+)(\b|$)/, 3035 pseudo: 3036 /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, 3037 attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/, 3038 attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ 3039 }, 3040 3041 // for Selector.match and Element#match 3042 assertions: { 3043 tagName: function(element, matches) { 3044 return matches[1].toUpperCase() == element.tagName.toUpperCase(); 3045 }, 3046 3047 className: function(element, matches) { 3048 return Element.hasClassName(element, matches[1]); 3049 }, 3050 3051 id: function(element, matches) { 3052 return element.id === matches[1]; 3053 }, 3054 3055 attrPresence: function(element, matches) { 3056 return Element.hasAttribute(element, matches[1]); 3057 }, 3058 3059 attr: function(element, matches) { 3060 var nodeValue = Element.readAttribute(element, matches[1]); 3061 return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); 3062 } 3063 }, 3064 3065 handlers: { 3066 // UTILITY FUNCTIONS 3067 // joins two collections 3068 concat: function(a, b) { 3069 for (var i = 0, node; node = b[i]; i++) 3070 a.push(node); 3071 return a; 3072 }, 3073 3074 // marks an array of nodes for counting 3075 mark: function(nodes) { 3076 var _true = Prototype.emptyFunction; 3077 for (var i = 0, node; node = nodes[i]; i++) 3078 node._countedByPrototype = _true; 3079 return nodes; 3080 }, 3081 3082 unmark: function(nodes) { 3083 for (var i = 0, node; node = nodes[i]; i++) 3084 node._countedByPrototype = undefined; 3085 return nodes; 3086 }, 3087 3088 // mark each child node with its position (for nth calls) 3089 // "ofType" flag indicates whether we're indexing for nth-of-type 3090 // rather than nth-child 3091 index: function(parentNode, reverse, ofType) { 3092 parentNode._countedByPrototype = Prototype.emptyFunction; 3093 if (reverse) { 3094 for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { 3095 var node = nodes[i]; 3096 if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; 3097 } 3098 } else { 3099 for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) 3100 if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; 3101 } 3102 }, 3103 3104 // filters out duplicates and extends all nodes 3105 unique: function(nodes) { 3106 if (nodes.length == 0) return nodes; 3107 var results = [], n; 3108 for (var i = 0, l = nodes.length; i < l; i++) 3109 if (!(n = nodes[i])._countedByPrototype) { 3110 n._countedByPrototype = Prototype.emptyFunction; 3111 results.push(Element.extend(n)); 3112 } 3113 return Selector.handlers.unmark(results); 3114 }, 3115 3116 // COMBINATOR FUNCTIONS 3117 descendant: function(nodes) { 3118 var h = Selector.handlers; 3119 for (var i = 0, results = [], node; node = nodes[i]; i++) 3120 h.concat(results, node.getElementsByTagName('*')); 3121 return results; 3122 }, 3123 3124 child: function(nodes) { 3125 var h = Selector.handlers; 3126 for (var i = 0, results = [], node; node = nodes[i]; i++) { 3127 for (var j = 0, child; child = node.childNodes[j]; j++) 3128 if (child.nodeType == 1 && child.tagName != '!') results.push(child); 3129 } 3130 return results; 3131 }, 3132 3133 adjacent: function(nodes) { 3134 for (var i = 0, results = [], node; node = nodes[i]; i++) { 3135 var next = this.nextElementSibling(node); 3136 if (next) results.push(next); 3137 } 3138 return results; 3139 }, 3140 3141 laterSibling: function(nodes) { 3142 var h = Selector.handlers; 3143 for (var i = 0, results = [], node; node = nodes[i]; i++) 3144 h.concat(results, Element.nextSiblings(node)); 3145 return results; 3146 }, 3147 3148 nextElementSibling: function(node) { 3149 while (node = node.nextSibling) 3150 if (node.nodeType == 1) return node; 3151 return null; 3152 }, 3153 3154 previousElementSibling: function(node) { 3155 while (node = node.previousSibling) 3156 if (node.nodeType == 1) return node; 3157 return null; 3158 }, 3159 3160 // TOKEN FUNCTIONS 3161 tagName: function(nodes, root, tagName, combinator) { 3162 var uTagName = tagName.toUpperCase(); 3163 var results = [], h = Selector.handlers; 3164 if (nodes) { 3165 if (combinator) { 3166 // fastlane for ordinary descendant combinators 3167 if (combinator == "descendant") { 3168 for (var i = 0, node; node = nodes[i]; i++) 3169 h.concat(results, node.getElementsByTagName(tagName)); 3170 return results; 3171 } else nodes = this[combinator](nodes); 3172 if (tagName == "*") return nodes; 3173 } 3174 for (var i = 0, node; node = nodes[i]; i++) 3175 if (node.tagName.toUpperCase() === uTagName) results.push(node); 3176 return results; 3177 } else return root.getElementsByTagName(tagName); 3178 }, 3179 3180 id: function(nodes, root, id, combinator) { 3181 var targetNode = $(id), h = Selector.handlers; 3182 if (!targetNode) return []; 3183 if (!nodes && root == document) return [targetNode]; 3184 if (nodes) { 3185 if (combinator) { 3186 if (combinator == 'child') { 3187 for (var i = 0, node; node = nodes[i]; i++) 3188 if (targetNode.parentNode == node) return [targetNode]; 3189 } else if (combinator == 'descendant') { 3190 for (var i = 0, node; node = nodes[i]; i++) 3191 if (Element.descendantOf(targetNode, node)) return [targetNode]; 3192 } else if (combinator == 'adjacent') { 3193 for (var i = 0, node; node = nodes[i]; i++) 3194 if (Selector.handlers.previousElementSibling(targetNode) == node) 3195 return [targetNode]; 3196 } else nodes = h[combinator](nodes); 3197 } 3198 for (var i = 0, node; node = nodes[i]; i++) 3199 if (node == targetNode) return [targetNode]; 3200 return []; 3201 } 3202 return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; 3203 }, 3204 3205 className: function(nodes, root, className, combinator) { 3206 if (nodes && combinator) nodes = this[combinator](nodes); 3207 return Selector.handlers.byClassName(nodes, root, className); 3208 }, 3209 3210 byClassName: function(nodes, root, className) { 3211 if (!nodes) nodes = Selector.handlers.descendant([root]); 3212 var needle = ' ' + className + ' '; 3213 for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { 3214 nodeClassName = node.className; 3215 if (nodeClassName.length == 0) continue; 3216 if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) 3217 results.push(node); 3218 } 3219 return results; 3220 }, 3221 3222 attrPresence: function(nodes, root, attr, combinator) { 3223 if (!nodes) nodes = root.getElementsByTagName("*"); 3224 if (nodes && combinator) nodes = this[combinator](nodes); 3225 var results = []; 3226 for (var i = 0, node; node = nodes[i]; i++) 3227 if (Element.hasAttribute(node, attr)) results.push(node); 3228 return results; 3229 }, 3230 3231 attr: function(nodes, root, attr, value, operator, combinator) { 3232 if (!nodes) nodes = root.getElementsByTagName("*"); 3233 if (nodes && combinator) nodes = this[combinator](nodes); 3234 var handler = Selector.operators[operator], results = []; 3235 for (var i = 0, node; node = nodes[i]; i++) { 3236 var nodeValue = Element.readAttribute(node, attr); 3237 if (nodeValue === null) continue; 3238 if (handler(nodeValue, value)) results.push(node); 3239 } 3240 return results; 3241 }, 3242 3243 pseudo: function(nodes, name, value, root, combinator) { 3244 if (nodes && combinator) nodes = this[combinator](nodes); 3245 if (!nodes) nodes = root.getElementsByTagName("*"); 3246 return Selector.pseudos[name](nodes, value, root); 3247 } 3248 }, 3249 3250 pseudos: { 3251 'first-child': function(nodes, value, root) { 3252 for (var i = 0, results = [], node; node = nodes[i]; i++) { 3253 if (Selector.handlers.previousElementSibling(node)) continue; 3254 results.push(node); 3255 } 3256 return results; 3257 }, 3258 'last-child': function(nodes, value, root) { 3259 for (var i = 0, results = [], node; node = nodes[i]; i++) { 3260 if (Selector.handlers.nextElementSibling(node)) continue; 3261 results.push(node); 3262 } 3263 return results; 3264 }, 3265 'only-child': function(nodes, value, root) { 3266 var h = Selector.handlers; 3267 for (var i = 0, results = [], node; node = nodes[i]; i++) 3268 if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) 3269 results.push(node); 3270 return results; 3271 }, 3272 'nth-child': function(nodes, formula, root) { 3273 return Selector.pseudos.nth(nodes, formula, root); 3274 }, 3275 'nth-last-child': function(nodes, formula, root) { 3276 return Selector.pseudos.nth(nodes, formula, root, true); 3277 }, 3278 'nth-of-type': function(nodes, formula, root) { 3279 return Selector.pseudos.nth(nodes, formula, root, false, true); 3280 }, 3281 'nth-last-of-type': function(nodes, formula, root) { 3282 return Selector.pseudos.nth(nodes, formula, root, true, true); 3283 }, 3284 'first-of-type': function(nodes, formula, root) { 3285 return Selector.pseudos.nth(nodes, "1", root, false, true); 3286 }, 3287 'last-of-type': function(nodes, formula, root) { 3288 return Selector.pseudos.nth(nodes, "1", root, true, true); 3289 }, 3290 'only-of-type': function(nodes, formula, root) { 3291 var p = Selector.pseudos; 3292 return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); 3293 }, 3294 3295 // handles the an+b logic 3296 getIndices: function(a, b, total) { 3297 if (a == 0) return b > 0 ? [b] : []; 3298 return $R(1, total).inject([], function(memo, i) { 3299 if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); 3300 return memo; 3301 }); 3302 }, 3303 3304 // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type 3305 nth: function(nodes, formula, root, reverse, ofType) { 3306 if (nodes.length == 0) return []; 3307 if (formula == 'even') formula = '2n+0'; 3308 if (formula == 'odd') formula = '2n+1'; 3309 var h = Selector.handlers, results = [], indexed = [], m; 3310 h.mark(nodes); 3311 for (var i = 0, node; node = nodes[i]; i++) { 3312 if (!node.parentNode._countedByPrototype) { 3313 h.index(node.parentNode, reverse, ofType); 3314 indexed.push(node.parentNode); 3315 } 3316 } 3317 if (formula.match(/^\d+$/)) { // just a number 3318 formula = Number(formula); 3319 for (var i = 0, node; node = nodes[i]; i++) 3320 if (node.nodeIndex == formula) results.push(node); 3321 } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b 3322 if (m[1] == "-") m[1] = -1; 3323 var a = m[1] ? Number(m[1]) : 1; 3324 var b = m[2] ? Number(m[2]) : 0; 3325 var indices = Selector.pseudos.getIndices(a, b, nodes.length); 3326 for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { 3327 for (var j = 0; j < l; j++) 3328 if (node.nodeIndex == indices[j]) results.push(node); 3329 } 3330 } 3331 h.unmark(nodes); 3332 h.unmark(indexed); 3333 return results; 3334 }, 3335 3336 'empty': function(nodes, value, root) { 3337 for (var i = 0, results = [], node; node = nodes[i]; i++) { 3338 // IE treats comments as element nodes 3339 if (node.tagName == '!' || node.firstChild) continue; 3340 results.push(node); 3341 } 3342 return results; 3343 }, 3344 3345 'not': function(nodes, selector, root) { 3346 var h = Selector.handlers, selectorType, m; 3347 var exclusions = new Selector(selector).findElements(root); 3348 h.mark(exclusions); 3349 for (var i = 0, results = [], node; node = nodes[i]; i++) 3350 if (!node._countedByPrototype) results.push(node); 3351 h.unmark(exclusions); 3352 return results; 3353 }, 3354 3355 'enabled': function(nodes, value, root) { 3356 for (var i = 0, results = [], node; node = nodes[i]; i++) 3357 if (!node.disabled && (!node.type || node.type !== 'hidden')) 3358 results.push(node); 3359 return results; 3360 }, 3361 3362 'disabled': function(nodes, value, root) { 3363 for (var i = 0, results = [], node; node = nodes[i]; i++) 3364 if (node.disabled) results.push(node); 3365 return results; 3366 }, 3367 3368 'checked': function(nodes, value, root) { 3369 for (var i = 0, results = [], node; node = nodes[i]; i++) 3370 if (node.checked) results.push(node); 3371 return results; 3372 } 3373 }, 3374 3375 operators: { 3376 '=': function(nv, v) { return nv == v; }, 3377 '!=': function(nv, v) { return nv != v; }, 3378 '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); }, 3379 '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); }, 3380 '*=': function(nv, v) { return nv == v || nv && nv.include(v); }, 3381 '$=': function(nv, v) { return nv.endsWith(v); }, 3382 '*=': function(nv, v) { return nv.include(v); }, 3383 '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, 3384 '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() + 3385 '-').include('-' + (v || "").toUpperCase() + '-'); } 3386 }, 3387 3388 split: function(expression) { 3389 var expressions = []; 3390 expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { 3391 expressions.push(m[1].strip()); 3392 }); 3393 return expressions; 3394 }, 3395 3396 matchElements: function(elements, expression) { 3397 var matches = $$(expression), h = Selector.handlers; 3398 h.mark(matches); 3399 for (var i = 0, results = [], element; element = elements[i]; i++) 3400 if (element._countedByPrototype) results.push(element); 3401 h.unmark(matches); 3402 return results; 3403 }, 3404 3405 findElement: function(elements, expression, index) { 3406 if (Object.isNumber(expression)) { 3407 index = expression; expression = false; 3408 } 3409 return Selector.matchElements(elements, expression || '*')[index || 0]; 3410 }, 3411 3412 findChildElements: function(element, expressions) { 3413 expressions = Selector.split(expressions.join(',')); 3414 var results = [], h = Selector.handlers; 3415 for (var i = 0, l = expressions.length, selector; i < l; i++) { 3416 selector = new Selector(expressions[i].strip()); 3417 h.concat(results, selector.findElements(element)); 3418 } 3419 return (l > 1) ? h.unique(results) : results; 3420 } 3421 }); 3422 3423 if (Prototype.Browser.IE) { 3424 Object.extend(Selector.handlers, { 3425 // IE returns comment nodes on getElementsByTagName("*"). 3426 // Filter them out. 3427 concat: function(a, b) { 3428 for (var i = 0, node; node = b[i]; i++) 3429 if (node.tagName !== "!") a.push(node); 3430 return a; 3431 }, 3432 3433 // IE improperly serializes _countedByPrototype in (inner|outer)HTML. 3434 unmark: function(nodes) { 3435 for (var i = 0, node; node = nodes[i]; i++) 3436 node.removeAttribute('_countedByPrototype'); 3437 return nodes; 3438 } 3439 }); 4127 }, 4128 4129 findElement: function( elements, expression, index ) 4130 { 4131 if( Object.isNumber( expression ) ) 4132 { 4133 index = expression; 4134 expression = false; 4135 } 4136 return Selector.matchElements( elements, expression || '*' )[index || 0]; 4137 }, 4138 4139 findChildElements: function( element, expressions ) 4140 { 4141 expressions = Selector.split( expressions.join( ',' ) ); 4142 var results = [], h = Selector.handlers; 4143 for( var i = 0, l = expressions.length, selector; i < l; i++ ) 4144 { 4145 selector = new Selector( expressions[i].strip() ); 4146 h.concat( results, selector.findElements( element ) ); 4147 } 4148 return (l > 1) ? h.unique( results ) : results; 4149 } 4150 } ); 4151 4152 if( Prototype.Browser.IE ) 4153 { 4154 Object.extend( Selector.handlers, { 4155 // IE returns comment nodes on getElementsByTagName("*"). 4156 // Filter them out. 4157 concat: function( a, b ) 4158 { 4159 for( var i = 0, node; node = b[i]; i++ ) 4160 if( node.tagName !== "!" ) a.push( node ); 4161 return a; 4162 }, 4163 4164 // IE improperly serializes _countedByPrototype in (inner|outer)HTML. 4165 unmark: function( nodes ) 4166 { 4167 for( var i = 0, node; node = nodes[i]; i++ ) 4168 node.removeAttribute( '_countedByPrototype' ); 4169 return nodes; 4170 } 4171 } ); 3440 4172 } 3441 4173 3442 function $$() { 3443 return Selector.findChildElements(document, $A(arguments)); 4174 function $$() 4175 { 4176 return Selector.findChildElements( document, $A( arguments ) ); 3444 4177 } 3445 4178 var Form = { 3446 reset: function(form) { 3447 $(form).reset(); 3448 return form; 3449 }, 3450 3451 serializeElements: function(elements, options) { 3452 if (typeof options != 'object') options = { hash: !!options }; 3453 else if (Object.isUndefined(options.hash)) options.hash = true; 3454 var key, value, submitted = false, submit = options.submit; 3455 3456 var data = elements.inject({ }, function(result, element) { 3457 if (!element.disabled && element.name) { 3458 key = element.name; value = $(element).getValue(); 3459 if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && 3460 submit !== false && (!submit || key == submit) && (submitted = true)))) { 3461 if (key in result) { 3462 // a key is already present; construct an array of values 3463 if (!Object.isArray(result[key])) result[key] = [result[key]]; 3464 result[key].push(value); 3465 } 3466 else result[key] = value; 3467 } 3468 } 3469 return result; 3470 }); 3471 3472 return options.hash ? data : Object.toQueryString(data); 3473 } 4179 reset: function( form ) 4180 { 4181 $( form ).reset(); 4182 return form; 4183 }, 4184 4185 serializeElements: function( elements, options ) 4186 { 4187 if( typeof options != 'object' ) options = { hash: !!options }; 4188 else if( Object.isUndefined( options.hash ) ) options.hash = true; 4189 var key, value, submitted = false, submit = options.submit; 4190 4191 var data = elements.inject( { }, function( result, element ) 4192 { 4193 if( !element.disabled && element.name ) 4194 { 4195 key = element.name; 4196 value = $( element ).getValue(); 4197 if( value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && 4198 submit !== false && (!submit || key == submit) && (submitted = true))) ) 4199 { 4200 if( key in result ) 4201 { 4202 // a key is already present; construct an array of values 4203 if( !Object.isArray( result[key] ) ) result[key] = [result[key]]; 4204 result[key].push( value ); 4205 } 4206 else result[key] = value; 4207 } 4208 } 4209 return result; 4210 } ); 4211 4212 return options.hash ? data : Object.toQueryString( data ); 4213 } 3474 4214 }; 3475 4215 3476 4216 Form.Methods = { 3477 serialize: function(form, options) { 3478 return Form.serializeElements(Form.getElements(form), options); 3479 }, 3480 3481 getElements: function(form) { 3482 return $A($(form).getElementsByTagName('*')).inject([], 3483 function(elements, child) { 3484 if (Form.Element.Serializers[child.tagName.toLowerCase()]) 3485 elements.push(Element.extend(child)); 3486 return elements; 3487 } 3488 ); 3489 }, 3490 3491 getInputs: function(form, typeName, name) { 3492 form = $(form); 3493 var inputs = form.getElementsByTagName('input'); 3494 3495 if (!typeName && !name) return $A(inputs).map(Element.extend); 3496 3497 for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { 3498 var input = inputs[i]; 3499 if ((typeName && input.type != typeName) || (name && input.name != name)) 3500 continue; 3501 matchingInputs.push(Element.extend(input)); 3502 } 3503 3504 return matchingInputs; 3505 }, 3506 3507 disable: function(form) { 3508 form = $(form); 3509 Form.getElements(form).invoke('disable'); 3510 return form; 3511 }, 3512 3513 enable: function(form) { 3514 form = $(form); 3515 Form.getElements(form).invoke('enable'); 3516 return form; 3517 }, 3518 3519 findFirstElement: function(form) { 3520 var elements = $(form).getElements().findAll(function(element) { 3521 return 'hidden' != element.type && !element.disabled; 3522 }); 3523 var firstByIndex = elements.findAll(function(element) { 3524 return element.hasAttribute('tabIndex') && element.tabIndex >= 0; 3525 }).sortBy(function(element) { return element.tabIndex }).first(); 3526 3527 return firstByIndex ? firstByIndex : elements.find(function(element) { 3528 return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); 3529 }); 3530 }, 3531 3532 focusFirstElement: function(form) { 3533 form = $(form); 3534 form.findFirstElement().activate(); 3535 return form; 3536 }, 3537 3538 request: function(form, options) { 3539 form = $(form), options = Object.clone(options || { }); 3540 3541 var params = options.parameters, action = form.readAttribute('action') || ''; 3542 if (action.blank()) action = window.location.href; 3543 options.parameters = form.serialize(true); 3544 3545 if (params) { 3546 if (Object.isString(params)) params = params.toQueryParams(); 3547 Object.extend(options.parameters, params); 3548 } 3549 3550 if (form.hasAttribute('method') && !options.method) 3551 options.method = form.method; 3552 3553 return new Ajax.Request(action, options); 3554 } 4217 serialize: function( form, options ) 4218 { 4219 return Form.serializeElements( Form.getElements( form ), options ); 4220 }, 4221 4222 getElements: function( form ) 4223 { 4224 return $A( $( form ).getElementsByTagName( '*' ) ).inject( [], 4225 function( elements, child ) 4226 { 4227 if( Form.Element.Serializers[child.tagName.toLowerCase()] ) 4228 elements.push( Element.extend( child ) ); 4229 return elements; 4230 } 4231 ); 4232 }, 4233 4234 getInputs: function( form, typeName, name ) 4235 { 4236 form = $( form ); 4237 var inputs = form.getElementsByTagName( 'input' ); 4238 4239 if( !typeName && !name ) return $A( inputs ).map( Element.extend ); 4240 4241 for( var i = 0, matchingInputs = [], length = inputs.length; i < length; i++ ) 4242 { 4243 var input = inputs[i]; 4244 if( (typeName && input.type != typeName) || (name && input.name != name) ) 4245 continue; 4246 matchingInputs.push( Element.extend( input ) ); 4247 } 4248 4249 return matchingInputs; 4250 }, 4251 4252 disable: function( form ) 4253 { 4254 form = $( form ); 4255 Form.getElements( form ).invoke( 'disable' ); 4256 return form; 4257 }, 4258 4259 enable: function( form ) 4260 { 4261 form = $( form ); 4262 Form.getElements( form ).invoke( 'enable' ); 4263 return form; 4264 }, 4265 4266 findFirstElement: function( form ) 4267 { 4268 var elements = $( form ).getElements().findAll( function( element ) 4269 { 4270 return 'hidden' != element.type && !element.disabled; 4271 } ); 4272 var firstByIndex = elements.findAll( 4273 function( element ) 4274 { 4275 return element.hasAttribute( 'tabIndex' ) && element.tabIndex >= 0; 4276 } ).sortBy( 4277 function( element ) 4278 { 4279 return element.tabIndex 4280 } ).first(); 4281 4282 return firstByIndex ? firstByIndex : elements.find( function( element ) 4283 { 4284 return ['input', 'select', 'textarea'].include( element.tagName.toLowerCase() ); 4285 } ); 4286 }, 4287 4288 focusFirstElement: function( form ) 4289 { 4290 form = $( form ); 4291 form.findFirstElement().activate(); 4292 return form; 4293 }, 4294 4295 request: function( form, options ) 4296 { 4297 form = $( form ),options = Object.clone( options || { } ); 4298 4299 var params = options.parameters, action = form.readAttribute( 'action' ) || ''; 4300 if( action.blank() ) action = window.location.href; 4301 options.parameters = form.serialize( true ); 4302 4303 if( params ) 4304 { 4305 if( Object.isString( params ) ) params = params.toQueryParams(); 4306 Object.extend( options.parameters, params ); 4307 } 4308 4309 if( form.hasAttribute( 'method' ) && !options.method ) 4310 options.method = form.method; 4311 4312 return new Ajax.Request( action, options ); 4313 } 3555 4314 }; 3556 4315 … … 3558 4317 3559 4318 Form.Element = { 3560 focus: function(element) { 3561 $(element).focus(); 3562 return element; 3563 }, 3564 3565 select: function(element) { 3566 $(element).select(); 3567 return element; 3568 } 4319 focus: function( element ) 4320 { 4321 $( element ).focus(); 4322 return element; 4323 }, 4324 4325 select: function( element ) 4326 { 4327 $( element ).select(); 4328 return element; 4329 } 3569 4330 }; 3570 4331 3571 4332 Form.Element.Methods = { 3572 serialize: function(element) { 3573 element = $(element); 3574 if (!element.disabled && element.name) { 3575 var value = element.getValue(); 3576 if (value != undefined) { 3577 var pair = { }; 3578 pair[element.name] = value; 3579 return Object.toQueryString(pair); 3580 } 3581 } 3582 return ''; 3583 }, 3584 3585 getValue: function(element) { 3586 element = $(element); 3587 var method = element.tagName.toLowerCase(); 3588 return Form.Element.Serializers[method](element); 3589 }, 3590 3591 setValue: function(element, value) { 3592 element = $(element); 3593 var method = element.tagName.toLowerCase(); 3594 Form.Element.Serializers[method](element, value); 3595 return element; 3596 }, 3597 3598 clear: function(element) { 3599 $(element).value = ''; 3600 return element; 3601 }, 3602 3603 present: function(element) { 3604 return $(element).value != ''; 3605 }, 3606 3607 activate: function(element) { 3608 element = $(element); 3609 try { 3610 element.focus(); 3611 if (element.select && (element.tagName.toLowerCase() != 'input' || 3612 !['button', 'reset', 'submit'].include(element.type))) 3613 element.select(); 3614 } catch (e) { } 3615 return element; 3616 }, 3617 3618 disable: function(element) { 3619 element = $(element); 3620 element.disabled = true; 3621 return element; 3622 }, 3623 3624 enable: function(element) { 3625 element = $(element); 3626 element.disabled = false; 3627 return element; 3628 } 4333 serialize: function( element ) 4334 { 4335 element = $( element ); 4336 if( !element.disabled && element.name ) 4337 { 4338 var value = element.getValue(); 4339 if( value != undefined ) 4340 { 4341 var pair = { }; 4342 pair[element.name] = value; 4343 return Object.toQueryString( pair ); 4344 } 4345 } 4346 return ''; 4347 }, 4348 4349 getValue: function( element ) 4350 { 4351 element = $( element ); 4352 var method = element.tagName.toLowerCase(); 4353 return Form.Element.Serializers[method]( element ); 4354 }, 4355 4356 setValue: function( element, value ) 4357 { 4358 element = $( element ); 4359 var method = element.tagName.toLowerCase(); 4360 Form.Element.Serializers[method]( element, value ); 4361 return element; 4362 }, 4363 4364 clear: function( element ) 4365 { 4366 $( element ).value = ''; 4367 return element; 4368 }, 4369 4370 present: function( element ) 4371 { 4372 return $( element ).value != ''; 4373 }, 4374 4375 activate: function( element ) 4376 { 4377 element = $( element ); 4378 try 4379 { 4380 element.focus(); 4381 if( element.select && (element.tagName.toLowerCase() != 'input' || 4382 !['button', 'reset', 'submit'].include( element.type )) ) 4383 element.select(); 4384 } 4385 catch ( e ) 4386 { 4387 } 4388 return element; 4389 }, 4390 4391 disable: function( element ) 4392 { 4393 element = $( element ); 4394 element.disabled = true; 4395 return element; 4396 }, 4397 4398 enable: function( element ) 4399 { 4400 element = $( element ); 4401 element.disabled = false; 4402 return element; 4403 } 3629 4404 }; 3630 4405 … … 3637 4412 3638 4413 Form.Element.Serializers = { 3639 input: function(element, value) { 3640 switch (element.type.toLowerCase()) { 3641 case 'checkbox': 3642 case 'radio': 3643 return Form.Element.Serializers.inputSelector(element, value); 3644 default: 3645 return Form.Element.Serializers.textarea(element, value); 3646 } 3647 }, 3648 3649 inputSelector: function(element, value) { 3650 if (Object.isUndefined(value)) return element.checked ? element.value : null; 3651 else element.checked = !!value; 3652 }, 3653 3654 textarea: function(element, value) { 3655 if (Object.isUndefined(value)) return element.value; 3656 else element.value = value; 3657 }, 3658 3659 select: function(element, value) { 3660 if (Object.isUndefined(value)) 3661 return this[element.type == 'select-one' ? 3662 'selectOne' : 'selectMany'](element); 3663 else { 3664 var opt, currentValue, single = !Object.isArray(value); 3665 for (var i = 0, length = element.length; i < length; i++) { 3666 opt = element.options[i]; 3667 currentValue = this.optionValue(opt); 3668 if (single) { 3669 if (currentValue == value) { 3670 opt.selected = true; 3671 return; 3672 } 3673 } 3674 else opt.selected = value.include(currentValue); 3675 } 3676 } 3677 }, 3678 3679 selectOne: function(element) { 3680 var index = element.selectedIndex; 3681 return index >= 0 ? this.optionValue(element.options[index]) : null; 3682 }, 3683 3684 selectMany: function(element) { 3685 var values, length = element.length; 3686 if (!length) return null; 3687 3688 for (var i = 0, values = []; i < length; i++) { 3689 var opt = element.options[i]; 3690 if (opt.selected) values.push(this.optionValue(opt)); 3691 } 3692 return values; 3693 }, 3694 3695 optionValue: function(opt) { 3696 // extend element because hasAttribute may not be native 3697 return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; 3698 } 4414 input: function( element, value ) 4415 { 4416 switch( element.type.toLowerCase() ) 4417 { 4418 case 'checkbox': 4419 case 'radio': 4420 return Form.Element.Serializers.inputSelector( element, value ); 4421 default: 4422 return Form.Element.Serializers.textarea( element, value ); 4423 } 4424 }, 4425 4426 inputSelector: function( element, value ) 4427 { 4428 if( Object.isUndefined( value ) ) return element.checked ? element.value : null; 4429 else element.checked = !!value; 4430 }, 4431 4432 textarea: function( element, value ) 4433 { 4434 if( Object.isUndefined( value ) ) return element.value; 4435 else element.value = value; 4436 }, 4437 4438 select: function( element, value ) 4439 { 4440 if( Object.isUndefined( value ) ) 4441 return this[element.type == 'select-one' ? 4442 'selectOne' : 'selectMany']( element ); 4443 else 4444 { 4445 var opt, currentValue, single = !Object.isArray( value ); 4446 for( var i = 0, length = element.length; i < length; i++ ) 4447 { 4448 opt = element.options[i]; 4449 currentValue = this.optionValue( opt ); 4450 if( single ) 4451 { 4452 if( currentValue == value ) 4453 { 4454 opt.selected = true; 4455 return; 4456 } 4457 } 4458 else opt.selected = value.include( currentValue ); 4459 } 4460 } 4461 }, 4462 4463 selectOne: function( element ) 4464 { 4465 var index = element.selectedIndex; 4466 return index >= 0 ? this.optionValue( element.options[index] ) : null; 4467 }, 4468 4469 selectMany: function( element ) 4470 { 4471 var values, length = element.length; 4472 if( !length ) return null; 4473 4474 for( var i = 0, values = []; i < length; i++ ) 4475 { 4476 var opt = element.options[i]; 4477 if( opt.selected ) values.push( this.optionValue( opt ) ); 4478 } 4479 return values; 4480 }, 4481 4482 optionValue: function( opt ) 4483 { 4484 // extend element because hasAttribute may not be native 4485 return Element.extend( opt ).hasAttribute( 'value' ) ? opt.value : opt.text; 4486 } 3699 4487 }; 3700 4488 3701 4489 /*--------------------------------------------------------------------------*/ 3702 4490 3703 Abstract.TimedObserver = Class.create(PeriodicalExecuter, { 3704 initialize: function($super, element, frequency, callback) { 3705 $super(callback, frequency); 3706 this.element = $(element); 3707 this.lastValue = this.getValue(); 3708 }, 3709 3710 execute: function() { 3711 var value = this.getValue(); 3712 if (Object.isString(this.lastValue) && Object.isString(value) ? 3713 this.lastValue != value : String(this.lastValue) != String(value)) { 3714 this.callback(this.element, value); 3715 this.lastValue = value; 3716 } 3717 } 3718 }); 3719 3720 Form.Element.Observer = Class.create(Abstract.TimedObserver, { 3721 getValue: function() { 3722 return Form.Element.getValue(this.element); 3723 } 3724 }); 3725 3726 Form.Observer = Class.create(Abstract.TimedObserver, { 3727 getValue: function() { 3728 return Form.serialize(this.element); 3729 } 3730 }); 4491 Abstract.TimedObserver = Class.create( PeriodicalExecuter, { 4492 initialize: function( $super, element, frequency, callback ) 4493 { 4494 $super( callback, frequency ); 4495 this.element = $( element ); 4496 this.lastValue = this.getValue(); 4497 }, 4498 4499 execute: function() 4500 { 4501 var value = this.getValue(); 4502 if( Object.isString( this.lastValue ) && Object.isString( value ) ? 4503 this.lastValue != value : String( this.lastValue ) != String( value ) ) 4504 { 4505 this.callback( this.element, value ); 4506 this.lastValue = value; 4507 } 4508 } 4509 } ); 4510 4511 Form.Element.Observer = Class.create( Abstract.TimedObserver, { 4512 getValue: function() 4513 { 4514 return Form.Element.getValue( this.element ); 4515 } 4516 } ); 4517 4518 Form.Observer = Class.create( Abstract.TimedObserver, { 4519 getValue: function() 4520 { 4521 return Form.serialize( this.element ); 4522 } 4523 } ); 3731 4524 3732 4525 /*--------------------------------------------------------------------------*/ 3733 4526 3734 Abstract.EventObserver = Class.create({ 3735 initialize: function(element, callback) { 3736 this.element = $(element); 3737 this.callback = callback; 3738 3739 this.lastValue = this.getValue(); 3740 if (this.element.tagName.toLowerCase() == 'form') 3741 this.registerFormCallbacks(); 4527 Abstract.EventObserver = Class.create( { 4528 initialize: function( element, callback ) 4529 { 4530 this.element = $( element ); 4531 this.callback = callback; 4532 4533 this.lastValue = this.getValue(); 4534 if( this.element.tagName.toLowerCase() == 'form' ) 4535 this.registerFormCallbacks(); 4536 else 4537 this.registerCallback( this.element ); 4538 }, 4539 4540 onElementEvent: function() 4541 { 4542 var value = this.getValue(); 4543 if( this.lastValue != value ) 4544 { 4545 this.callback( this.element, value ); 4546 this.lastValue = value; 4547 } 4548 }, 4549 4550 registerFormCallbacks: function() 4551 { 4552 Form.getElements( this.element ).each( this.registerCallback, this ); 4553 }, 4554 4555 registerCallback: function( element ) 4556 { 4557 if( element.type ) 4558 { 4559 switch( element.type.toLowerCase() ) 4560 { 4561 case 'checkbox': 4562 case 'radio': 4563 Event.observe( element, 'click', this.onElementEvent.bind( this ) ); 4564 break; 4565 default: 4566 Event.observe( element, 'change', this.onElementEvent.bind( this ) ); 4567 break; 4568 } 4569 } 4570 } 4571 } ); 4572 4573 Form.Element.EventObserver = Class.create( Abstract.EventObserver, { 4574 getValue: function() 4575 { 4576 return Form.Element.getValue( this.element ); 4577 } 4578 } ); 4579 4580 Form.EventObserver = Class.create( Abstract.EventObserver, { 4581 getValue: function() 4582 { 4583 return Form.serialize( this.element ); 4584 } 4585 } ); 4586 if( !window.Event ) var Event = { }; 4587 4588 Object.extend( Event, { 4589 KEY_BACKSPACE: 8, 4590 KEY_TAB: 9, 4591 KEY_RETURN: 13, 4592 KEY_ESC: 27, 4593 KEY_LEFT: 37, 4594 KEY_UP: 38, 4595 KEY_RIGHT: 39, 4596 KEY_DOWN: 40, 4597 KEY_DELETE: 46, 4598 KEY_HOME: 36, 4599 KEY_END: 35, 4600 KEY_PAGEUP: 33, 4601 KEY_PAGEDOWN: 34, 4602 KEY_INSERT: 45, 4603 4604 cache: { }, 4605 4606 relatedTarget: function( event ) 4607 { 4608 var element; 4609 switch( event.type ) 4610 { 4611 case 'mouseover': element = event.fromElement; break; 4612 case 'mouseout': element = event.toElement; break; 4613 default: return null; 4614 } 4615 return Element.extend( element ); 4616 } 4617 } ); 4618 4619 Event.Methods = (function() 4620 { 4621 var isButton; 4622 4623 if( Prototype.Browser.IE ) 4624 { 4625 var buttonMap = { 0: 1, 1: 4, 2: 2 }; 4626 isButton = function( event, code ) 4627 { 4628 return event.button == buttonMap[code]; 4629 }; 4630 4631 } else if( Prototype.Browser.WebKit ) 4632 { 4633 isButton = function( event, code ) 4634 { 4635 switch( code ) 4636 { 4637 case 0: return event.which == 1 && !event.metaKey; 4638 case 1: return event.which == 1 && event.metaKey; 4639 default: return false; 4640 } 4641 }; 4642 4643 } 3742 4644 else 3743 this.registerCallback(this.element); 3744 }, 3745 3746 onElementEvent: function() { 3747 var value = this.getValue(); 3748 if (this.lastValue != value) { 3749 this.callback(this.element, value); 3750 this.lastValue = value; 3751 } 3752 }, 3753 3754 registerFormCallbacks: function() { 3755 Form.getElements(this.element).each(this.registerCallback, this); 3756 }, 3757 3758 registerCallback: function(element) { 3759 if (element.type) { 3760 switch (element.type.toLowerCase()) { 3761 case 'checkbox': 3762 case 'radio': 3763 Event.observe(element, 'click', this.onElementEvent.bind(this)); 3764 break; 3765 default: 3766 Event.observe(element, 'change', this.onElementEvent.bind(this)); 3767 break; 3768 } 3769 } 3770 } 3771 }); 3772 3773 Form.Element.EventObserver = Class.create(Abstract.EventObserver, { 3774 getValue: function() { 3775 return Form.Element.getValue(this.element); 3776 } 3777 }); 3778 3779 Form.EventObserver = Class.create(Abstract.EventObserver, { 3780 getValue: function() { 3781 return Form.serialize(this.element); 3782 } 3783 }); 3784 if (!window.Event) var Event = { }; 3785 3786 Object.extend(Event, { 3787 KEY_BACKSPACE: 8, 3788 KEY_TAB: 9, 3789 KEY_RETURN: 13, 3790 KEY_ESC: 27, 3791 KEY_LEFT: 37, 3792 KEY_UP: 38, 3793 KEY_RIGHT: 39, 3794 KEY_DOWN: 40, 3795 KEY_DELETE: 46, 3796 KEY_HOME: 36, 3797 KEY_END: 35, 3798 KEY_PAGEUP: 33, 3799 KEY_PAGEDOWN: 34, 3800 KEY_INSERT: 45, 3801 3802 cache: { }, 3803 3804 relatedTarget: function(event) { 3805 var element; 3806 switch(event.type) { 3807 case 'mouseover': element = event.fromElement; break; 3808 case 'mouseout': element = event.toElement; break; 3809 default: return null; 3810 } 3811 return Element.extend(element); 3812 } 3813 }); 3814 3815 Event.Methods = (function() { 3816 var isButton; 3817 3818 if (Prototype.Browser.IE) { 3819 var buttonMap = { 0: 1, 1: 4, 2: 2 }; 3820 isButton = function(event, code) { 3821 return event.button == buttonMap[code]; 4645 { 4646 isButton = function( event, code ) 4647 { 4648 return event.which ? (event.which === code + 1) : (event.button === code); 4649 }; 4650 } 4651 4652 return { 4653 isLeftClick: function( event ) 4654 { 4655 return isButton( event, 0 ) 4656 }, 4657 isMiddleClick: function( event ) 4658 { 4659 return isButton( event, 1 ) 4660 }, 4661 isRightClick: function( event ) 4662 { 4663 return isButton( event, 2 ) 4664 }, 4665 4666 element: function( event ) 4667 { 4668 event = Event.extend( event ); 4669 4670 var node = event.target, 4671 type = event.type, 4672 currentTarget = event.currentTarget; 4673 4674 if( currentTarget && currentTarget.tagName ) 4675 { 4676 // Firefox screws up the "click" event when moving between radio buttons 4677 // via arrow keys. It also screws up the "load" and "error" events on images, 4678 // reporting the document as the target instead of the original image. 4679 if( type === 'load' || type === 'error' || 4680 (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' 4681 && currentTarget.type === 'radio') ) 4682 node = currentTarget; 4683 } 4684 if( node.nodeType == Node.TEXT_NODE ) node = node.parentNode; 4685 return Element.extend( node ); 4686 }, 4687 4688 findElement: function( event, expression ) 4689 { 4690 var element = Event.element( event ); 4691 if( !expression ) return element; 4692 var elements = [element].concat( element.ancestors() ); 4693 return Selector.findElement( elements, expression, 0 ); 4694 }, 4695 4696 pointer: function( event ) 4697 { 4698 var docElement = document.documentElement, 4699 body = document.body || { scrollLeft: 0, scrollTop: 0 }; 4700 return { 4701 x: event.pageX || (event.clientX + 4702 (docElement.scrollLeft || body.scrollLeft) - 4703 (docElement.clientLeft || 0)), 4704 y: event.pageY || (event.clientY + 4705 (docElement.scrollTop || body.scrollTop) - 4706 (docElement.clientTop || 0)) 4707 }; 4708 }, 4709 4710 pointerX: function( event ) 4711 { 4712 return Event.pointer( event ).x 4713 }, 4714 pointerY: function( event ) 4715 { 4716 return Event.pointer( event ).y 4717 }, 4718 4719 stop: function( event ) 4720 { 4721 Event.extend( event ); 4722 event.preventDefault(); 4723 event.stopPropagation(); 4724 event.stopped = true; 4725 } 3822 4726 }; 3823 3824 } else if (Prototype.Browser.WebKit) { 3825 isButton = function(event, code) { 3826 switch (code) { 3827 case 0: return event.which == 1 && !event.metaKey; 3828 case 1: return event.which == 1 && event.metaKey; 3829 default: return false; 3830 } 4727 })(); 4728 4729 Event.extend = (function() 4730 { 4731 var methods = Object.keys( Event.Methods ).inject( { }, function( m, name ) 4732 { 4733 m[name] = Event.Methods[name].methodize(); 4734 return m; 4735 } ); 4736 4737 if( Prototype.Browser.IE ) 4738 { 4739 Object.extend( methods, { 4740 stopPropagation: function() 4741 { 4742 this.cancelBubble = true 4743 }, 4744 preventDefault: function() 4745 { 4746 this.returnValue = false 4747 }, 4748 inspect: function() 4749 { 4750 return "[object Event]" 4751 } 4752 } ); 4753 4754 return function( event ) 4755 { 4756 if( !event ) return false; 4757 if( event._extendedByPrototype ) return event; 4758 4759 event._extendedByPrototype = Prototype.emptyFunction; 4760 var pointer = Event.pointer( event ); 4761 Object.extend( event, { 4762 target: event.srcElement, 4763 relatedTarget: Event.relatedTarget( event ), 4764 pageX: pointer.x, 4765 pageY: pointer.y 4766 } ); 4767 return Object.extend( event, methods ); 4768 }; 4769 4770 } 4771 else 4772 { 4773 Event.prototype = Event.prototype || document.createEvent( "HTMLEvents" )['__proto__']; 4774 Object.extend( Event.prototype, methods ); 4775 return Prototype.K; 4776 } 4777 })(); 4778 4779 Object.extend( Event, (function() 4780 { 4781 var cache = Event.cache; 4782 4783 function getEventID( element ) 4784 { 4785 if( element._prototypeEventID ) return element._prototypeEventID[0]; 4786 arguments.callee.id = arguments.callee.id || 1; 4787 return element._prototypeEventID = [++arguments.callee.id]; 4788 } 4789 4790 function getDOMEventName( eventName ) 4791 { 4792 if( eventName && eventName.include( ':' ) ) return "dataavailable"; 4793 return eventName; 4794 } 4795 4796 function getCacheForID( id ) 4797 { 4798 return cache[id] = cache[id] || { }; 4799 } 4800 4801 function getWrappersForEventName( id, eventName ) 4802 { 4803 var c = getCacheForID( id ); 4804 return c[eventName] = c[eventName] || []; 4805 } 4806 4807 function createWrapper( element, eventName, handler ) 4808 { 4809 var id = getEventID( element ); 4810 var c = getWrappersForEventName( id, eventName ); 4811 if( c.pluck( "handler" ).include( handler ) ) return false; 4812 4813 var wrapper = function( event ) 4814 { 4815 if( !Event || !Event.extend || 4816 (event.eventName && event.eventName != eventName) ) 4817 return false; 4818 4819 Event.extend( event ); 4820 handler.call( element, event ); 4821 }; 4822 4823 wrapper.handler = handler; 4824 c.push( wrapper ); 4825 return wrapper; 4826 } 4827 4828 function findWrapper( id, eventName, handler ) 4829 { 4830 var c = getWrappersForEventName( id, eventName ); 4831 return c.find( function( wrapper ) 4832 { 4833 return wrapper.handler == handler 4834 } ); 4835 } 4836 4837 function destroyWrapper( id, eventName, handler ) 4838 { 4839 var c = getCacheForID( id ); 4840 if( !c[eventName] ) return false; 4841 c[eventName] = c[eventName].without( findWrapper( id, eventName, handler ) ); 4842 } 4843 4844 function destroyCache() 4845 { 4846 for( var id in cache ) 4847 for( var eventName in cache[id] ) 4848 cache[id][eventName] = null; 4849 } 4850 4851 4852 // Internet Explorer needs to remove event handlers on page unload 4853 // in order to avoid memory leaks. 4854 if( window.attachEvent ) 4855 { 4856 window.attachEvent( "onunload", destroyCache ); 4857 } 4858 4859 // Safari has a dummy event handler on page unload so that it won't 4860 // use its bfcache. Safari <= 3.1 has an issue with restoring the "document" 4861 // object when page is returned to via the back button using its bfcache. 4862 if( Prototype.Browser.WebKit ) 4863 { 4864 window.addEventListener( 'unload', Prototype.emptyFunction, false ); 4865 } 4866 4867 return { 4868 observe: function( element, eventName, handler ) 4869 { 4870 element = $( element ); 4871 var name = getDOMEventName( eventName ); 4872 4873 var wrapper = createWrapper( element, eventName, handler ); 4874 if( !wrapper ) return element; 4875 4876 if( element.addEventListener ) 4877 { 4878 element.addEventListener( name, wrapper, false ); 4879 } 4880 else 4881 { 4882 element.attachEvent( "on" + name, wrapper ); 4883 } 4884 4885 return element; 4886 }, 4887 4888 stopObserving: function( element, eventName, handler ) 4889 { 4890 element = $( element ); 4891 var id = getEventID( element ), name = getDOMEventName( eventName ); 4892 4893 if( !handler && eventName ) 4894 { 4895 getWrappersForEventName( id, eventName ).each( function( wrapper ) 4896 { 4897 element.stopObserving( eventName, wrapper.handler ); 4898 } ); 4899 return element; 4900 4901 } else if( !eventName ) 4902 { 4903 Object.keys( getCacheForID( id ) ).each( function( eventName ) 4904 { 4905 element.stopObserving( eventName ); 4906 } ); 4907 return element; 4908 } 4909 4910 var wrapper = findWrapper( id, eventName, handler ); 4911 if( !wrapper ) return element; 4912 4913 if( element.removeEventListener ) 4914 { 4915 element.removeEventListener( name, wrapper, false ); 4916 } 4917 else 4918 { 4919 element.detachEvent( "on" + name, wrapper ); 4920 } 4921 4922 destroyWrapper( id, eventName, handler ); 4923 4924 return element; 4925 }, 4926 4927 fire: function( element, eventName, memo ) 4928 { 4929 element = $( element ); 4930 if( element == document && document.createEvent && !element.dispatchEvent ) 4931 element = document.documentElement; 4932 4933 var event; 4934 if( document.createEvent ) 4935 { 4936 event = document.createEvent( "HTMLEvents" ); 4937 event.initEvent( "dataavailable", true, true ); 4938 } 4939 else 4940 { 4941 event = document.createEventObject(); 4942 event.eventType = "ondataavailable"; 4943 } 4944 4945 event.eventName = eventName; 4946 event.memo = memo || { }; 4947 4948 if( document.createEvent ) 4949 { 4950 element.dispatchEvent( event ); 4951 } 4952 else 4953 { 4954 element.fireEvent( event.eventType, event ); 4955 } 4956 4957 return Event.extend( event ); 4958 } 3831 4959 }; 3832 3833 } else { 3834 isButton = function(event, code) { 3835 return event.which ? (event.which === code + 1) : (event.button === code); 3836 }; 3837 } 3838 3839 return { 3840 isLeftClick: function(event) { return isButton(event, 0) }, 3841 isMiddleClick: function(event) { return isButton(event, 1) }, 3842 isRightClick: function(event) { return isButton(event, 2) }, 3843 3844 element: function(event) { 3845 event = Event.extend(event); 3846 3847 var node = event.target, 3848 type = event.type, 3849 currentTarget = event.currentTarget; 3850 3851 if (currentTarget && currentTarget.tagName) { 3852 // Firefox screws up the "click" event when moving between radio buttons 3853 // via arrow keys. It also screws up the "load" and "error" events on images, 3854 // reporting the document as the target instead of the original image. 3855 if (type === 'load' || type === 'error' || 3856 (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' 3857 && currentTarget.type === 'radio')) 3858 node = currentTarget; 3859 } 3860 if (node.nodeType == Node.TEXT_NODE) node = node.parentNode; 3861 return Element.extend(node); 3862 }, 3863 3864 findElement: function(event, expression) { 3865 var element = Event.element(event); 3866 if (!expression) return element; 3867 var elements = [element].concat(element.ancestors()); 3868 return Selector.findElement(elements, expression, 0); 3869 }, 3870 3871 pointer: function(event) { 3872 var docElement = document.documentElement, 3873 body = document.body || { scrollLeft: 0, scrollTop: 0 }; 3874 return { 3875 x: event.pageX || (event.clientX + 3876 (docElement.scrollLeft || body.scrollLeft) - 3877 (docElement.clientLeft || 0)), 3878 y: event.pageY || (event.clientY + 3879 (docElement.scrollTop || body.scrollTop) - 3880 (docElement.clientTop || 0)) 3881 }; 3882 }, 3883 3884 pointerX: function(event) { return Event.pointer(event).x }, 3885 pointerY: function(event) { return Event.pointer(event).y }, 3886 3887 stop: function(event) { 3888 Event.extend(event); 3889 event.preventDefault(); 3890 event.stopPropagation(); 3891 event.stopped = true; 3892 } 3893 }; 3894 })(); 3895 3896 Event.extend = (function() { 3897 var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { 3898 m[name] = Event.Methods[name].methodize(); 3899 return m; 3900 }); 3901 3902 if (Prototype.Browser.IE) { 3903 Object.extend(methods, { 3904 stopPropagation: function() { this.cancelBubble = true }, 3905 preventDefault: function() { this.returnValue = false }, 3906 inspect: function() { return "[object Event]" } 3907 }); 3908 3909 return function(event) { 3910 if (!event) return false; 3911 if (event._extendedByPrototype) return event; 3912 3913 event._extendedByPrototype = Prototype.emptyFunction; 3914 var pointer = Event.pointer(event); 3915 Object.extend(event, { 3916 target: event.srcElement, 3917 relatedTarget: Event.relatedTarget(event), 3918 pageX: pointer.x, 3919 pageY: pointer.y 3920 }); 3921 return Object.extend(event, methods); 3922 }; 3923 3924 } else { 3925 Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__']; 3926 Object.extend(Event.prototype, methods); 3927 return Prototype.K; 3928 } 3929 })(); 3930 3931 Object.extend(Event, (function() { 3932 var cache = Event.cache; 3933 3934 function getEventID(element) { 3935 if (element._prototypeEventID) return element._prototypeEventID[0]; 3936 arguments.callee.id = arguments.callee.id || 1; 3937 return element._prototypeEventID = [++arguments.callee.id]; 3938 } 3939 3940 function getDOMEventName(eventName) { 3941 if (eventName && eventName.include(':')) return "dataavailable"; 3942 return eventName; 3943 } 3944 3945 function getCacheForID(id) { 3946 return cache[id] = cache[id] || { }; 3947 } 3948 3949 function getWrappersForEventName(id, eventName) { 3950 var c = getCacheForID(id); 3951 return c[eventName] = c[eventName] || []; 3952 } 3953 3954 function createWrapper(element, eventName, handler) { 3955 var id = getEventID(element); 3956 var c = getWrappersForEventName(id, eventName); 3957 if (c.pluck("handler").include(handler)) return false; 3958 3959 var wrapper = function(event) { 3960 if (!Event || !Event.extend || 3961 (event.eventName && event.eventName != eventName)) 3962 return false; 3963 3964 Event.extend(event); 3965 handler.call(element, event); 3966 }; 3967 3968 wrapper.handler = handler; 3969 c.push(wrapper); 3970 return wrapper; 3971 } 3972 3973 function findWrapper(id, eventName, handler) { 3974 var c = getWrappersForEventName(id, eventName); 3975 return c.find(function(wrapper) { return wrapper.handler == handler }); 3976 } 3977 3978 function destroyWrapper(id, eventName, handler) { 3979 var c = getCacheForID(id); 3980 if (!c[eventName]) return false; 3981 c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); 3982 } 3983 3984 function destroyCache() { 3985 for (var id in cache) 3986 for (var eventName in cache[id]) 3987 cache[id][eventName] = null; 3988 } 3989 3990 3991 // Internet Explorer needs to remove event handlers on page unload 3992 // in order to avoid memory leaks. 3993 if (window.attachEvent) { 3994 window.attachEvent("onunload", destroyCache); 3995 } 3996 3997 // Safari has a dummy event handler on page unload so that it won't 3998 // use its bfcache. Safari <= 3.1 has an issue with restoring the "document" 3999 // object when page is returned to via the back button using its bfcache. 4000 if (Prototype.Browser.WebKit) { 4001 window.addEventListener('unload', Prototype.emptyFunction, false); 4002 } 4003 4004 return { 4005 observe: function(element, eventName, handler) { 4006 element = $(element); 4007 var name = getDOMEventName(eventName); 4008 4009 var wrapper = createWrapper(element, eventName, handler); 4010 if (!wrapper) return element; 4011 4012 if (element.addEventListener) { 4013 element.addEventListener(name, wrapper, false); 4014 } else { 4015 element.attachEvent("on" + name, wrapper); 4016 } 4017 4018 return element; 4019 }, 4020 4021 stopObserving: function(element, eventName, handler) { 4022 element = $(element); 4023 var id = getEventID(element), name = getDOMEventName(eventName); 4024 4025 if (!handler && eventName) { 4026 getWrappersForEventName(id, eventName).each(function(wrapper) { 4027 element.stopObserving(eventName, wrapper.handler); 4028 }); 4029 return element; 4030 4031 } else if (!eventName) { 4032 Object.keys(getCacheForID(id)).each(function(eventName) { 4033 element.stopObserving(eventName); 4034 }); 4035 return element; 4036 } 4037 4038 var wrapper = findWrapper(id, eventName, handler); 4039 if (!wrapper) return element; 4040 4041 if (element.removeEventListener) { 4042 element.removeEventListener(name, wrapper, false); 4043 } else { 4044 element.detachEvent("on" + name, wrapper); 4045 } 4046 4047 destroyWrapper(id, eventName, handler); 4048 4049 return element; 4050 }, 4051 4052 fire: function(element, eventName, memo) { 4053 element = $(element); 4054 if (element == document && document.createEvent && !element.dispatchEvent) 4055 element = document.documentElement; 4056 4057 var event; 4058 if (document.createEvent) { 4059 event = document.createEvent("HTMLEvents"); 4060 event.initEvent("dataavailable", true, true); 4061 } else { 4062 event = document.createEventObject(); 4063 event.eventType = "ondataavailable"; 4064 } 4065 4066 event.eventName = eventName; 4067 event.memo = memo || { }; 4068 4069 if (document.createEvent) { 4070 element.dispatchEvent(event); 4071 } else { 4072 element.fireEvent(event.eventType, event); 4073 } 4074 4075 return Event.extend(event); 4076 } 4077 }; 4078 })()); 4079 4080 Object.extend(Event, Event.Methods); 4081 4082 Element.addMethods({ 4083 fire: Event.fire, 4084 observe: Event.observe, 4085 stopObserving: Event.stopObserving 4086 }); 4087 4088 Object.extend(document, { 4089 fire: Element.Methods.fire.methodize(), 4090 observe: Element.Methods.observe.methodize(), 4091 stopObserving: Element.Methods.stopObserving.methodize(), 4092 loaded: false 4093 }); 4094 4095 (function() { 4096 /* Support for the DOMContentLoaded event is based on work by Dan Webb, 4960 })() ); 4961 4962 Object.extend( Event, Event.Methods ); 4963 4964 Element.addMethods( { 4965 fire: Event.fire, 4966 observe: Event.observe, 4967 stopObserving: Event.stopObserving 4968 } ); 4969 4970 Object.extend( document, { 4971 fire: Element.Methods.fire.methodize(), 4972 observe: Element.Methods.observe.methodize(), 4973 stopObserving: Element.Methods.stopObserving.methodize(), 4974 loaded: false 4975 } ); 4976 4977 (function() 4978 { 4979 /* Support for the DOMContentLoaded event is based on work by Dan Webb, 4097 4980 Matthias Miller, Dean Edwards and John Resig. */ 4098 4981 4099 var timer; 4100 4101 function fireContentLoadedEvent() { 4102 if (document.loaded) return; 4103 if (timer) window.clearInterval(timer); 4104 document.fire("dom:loaded"); 4105 document.loaded = true; 4106 } 4107 4108 if (document.addEventListener) { 4109 if (Prototype.Browser.WebKit) { 4110 timer = window.setInterval(function() { 4111 if (/loaded|complete/.test(document.readyState)) 4112 fireContentLoadedEvent(); 4113 }, 0); 4114 4115 Event.observe(window, "load", fireContentLoadedEvent); 4116 4117 } else { 4118 document.addEventListener("DOMContentLoaded", 4119 fireContentLoadedEvent, false); 4120 } 4121 4122 } else { 4123 document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>"); 4124 $("__onDOMContentLoaded").onreadystatechange = function() { 4125 if (this.readyState == "complete") { 4126 this.onreadystatechange = null; 4127 fireContentLoadedEvent(); 4128 } 4129 }; 4130 } 4982 var timer; 4983 4984 function fireContentLoadedEvent() 4985 { 4986 if( document.loaded ) return; 4987 if( timer ) window.clearInterval( timer ); 4988 document.fire( "dom:loaded" ); 4989 document.loaded = true; 4990 } 4991 4992 if( document.addEventListener ) 4993 { 4994 if( Prototype.Browser.WebKit ) 4995 { 4996 timer = window.setInterval( function() 4997 { 4998 if( /loaded|complete/.test( document.readyState ) ) 4999 fireContentLoadedEvent(); 5000 }, 0 ); 5001 5002 Event.observe( window, "load", fireContentLoadedEvent ); 5003 5004 } 5005 else 5006 { 5007 document.addEventListener( "DOMContentLoaded", 5008 fireContentLoadedEvent, false ); 5009 } 5010 5011 } 5012 else 5013 { 5014 document.write( "<script id=__onDOMContentLoaded defer src=//:><\/script>" ); 5015 $( "__onDOMContentLoaded" ).onreadystatechange = function() 5016 { 5017 if( this.readyState == "complete" ) 5018 { 5019 this.onreadystatechange = null; 5020 fireContentLoadedEvent(); 5021 } 5022 }; 5023 } 4131 5024 })(); 4132 5025 /*------------------------------- DEPRECATED -------------------------------*/ … … 4139 5032 4140 5033 var Insertion = { 4141 Before: function(element, content) { 4142 return Element.insert(element, {before:content}); 4143 }, 4144 4145 Top: function(element, content) { 4146 return Element.insert(element, {top:content}); 4147 }, 4148 4149 Bottom: function(element, content) { 4150 return Element.insert(element, {bottom:content}); 4151 }, 4152 4153 After: function(element, content) { 4154 return Element.insert(element, {after:content}); 4155 } 5034 Before: function( element, content ) 5035 { 5036 return Element.insert( element, {before:content} ); 5037 }, 5038 5039 Top: function( element, content ) 5040 { 5041 return Element.insert( element, {top:content} ); 5042 }, 5043 5044 Bottom: function( element, content ) 5045 { 5046 return Element.insert( element, {bottom:content} ); 5047 }, 5048 5049 After: function( element, content ) 5050 { 5051 return Element.insert( element, {after:content} ); 5052 } 4156 5053 }; 4157 5054 4158 var $continue = new Error( '"throw $continue" is deprecated, use "return" instead');5055 var $continue = new Error( '"throw $continue" is deprecated, use "return" instead' ); 4159 5056 4160 5057 // This should be moved to script.aculo.us; notice the deprecated methods 4161 5058 // further below, that map to the newer Element methods. 4162 5059 var Position = { 4163 // set to true if needed, warning: firefox performance problems 4164 // NOT neeeded for page scrolling, only if draggable contained in 4165 // scrollable elements 4166 includeScrollOffsets: false, 4167 4168 // must be called before calling withinIncludingScrolloffset, every time the 4169 // page is scrolled 4170 prepare: function() { 4171 this.deltaX = window.pageXOffset 5060 // set to true if needed, warning: firefox performance problems 5061 // NOT neeeded for page scrolling, only if draggable contained in 5062 // scrollable elements 5063 includeScrollOffsets: false, 5064 5065 // must be called before calling withinIncludingScrolloffset, every time the 5066 // page is scrolled 5067 prepare: function() 5068 { 5069 this.deltaX = window.pageXOffset 4172 5070 || document.documentElement.scrollLeft 4173 5071 || document.body.scrollLeft 4174 5072 || 0; 4175 this.deltaY =window.pageYOffset5073 this.deltaY = window.pageYOffset 4176 5074 || document.documentElement.scrollTop 4177 5075 || document.body.scrollTop 4178 5076 || 0; 4179 }, 4180 4181 // caches x/y coordinate pair to use with overlap 4182 within: function(element, x, y) { 4183 if (this.includeScrollOffsets) 4184 return this.withinIncludingScrolloffsets(element, x, y); 4185 this.xcomp = x; 4186 this.ycomp = y; 4187 this.offset = Element.cumulativeOffset(element); 4188 4189 return (y >= this.offset[1] && 4190 y < this.offset[1] + element.offsetHeight && 4191 x >= this.offset[0] && 4192 x < this.offset[0] + element.offsetWidth); 4193 }, 4194 4195 withinIncludingScrolloffsets: function(element, x, y) { 4196 var offsetcache = Element.cumulativeScrollOffset(element); 4197 4198 this.xcomp = x + offsetcache[0] - this.deltaX; 4199 this.ycomp = y + offsetcache[1] - this.deltaY; 4200 this.offset = Element.cumulativeOffset(element); 4201 4202 return (this.ycomp >= this.offset[1] && 4203 this.ycomp < this.offset[1] + element.offsetHeight && 4204 this.xcomp >= this.offset[0] && 4205 this.xcomp < this.offset[0] + element.offsetWidth); 4206 }, 4207 4208 // within must be called directly before 4209 overlap: function(mode, element) { 4210 if (!mode) return 0; 4211 if (mode == 'vertical') 4212 return ((this.offset[1] + element.offsetHeight) - this.ycomp) / 4213 element.offsetHeight; 4214 if (mode == 'horizontal') 4215 return ((this.offset[0] + element.offsetWidth) - this.xcomp) / 4216 element.offsetWidth; 4217 }, 4218 4219 // Deprecation layer -- use newer Element methods now (1.5.2). 4220 4221 cumulativeOffset: Element.Methods.cumulativeOffset, 4222 4223 positionedOffset: Element.Methods.positionedOffset, 4224 4225 absolutize: function(element) { 4226 Position.prepare(); 4227 return Element.absolutize(element); 4228 }, 4229 4230 relativize: function(element) { 4231 Position.prepare(); 4232 return Element.relativize(element); 4233 }, 4234 4235 realOffset: Element.Methods.cumulativeScrollOffset, 4236 4237 offsetParent: Element.Methods.getOffsetParent, 4238 4239 page: Element.Methods.viewportOffset, 4240 4241 clone: function(source, target, options) { 4242 options = options || { }; 4243 return Element.clonePosition(target, source, options); 4244 } 5077 }, 5078 5079 // caches x/y coordinate pair to use with overlap 5080 within: function( element, x, y ) 5081 { 5082 if( this.includeScrollOffsets ) 5083 return this.withinIncludingScrolloffsets( element, x, y ); 5084 this.xcomp = x; 5085 this.ycomp = y; 5086 this.offset = Element.cumulativeOffset( element ); 5087 5088 return (y >= this.offset[1] && 5089 y < this.offset[1] + element.offsetHeight && 5090 x >= this.offset[0] && 5091 x < this.offset[0] + element.offsetWidth); 5092 }, 5093 5094 withinIncludingScrolloffsets: function( element, x, y ) 5095 { 5096 var offsetcache = Element.cumulativeScrollOffset( element ); 5097 5098 this.xcomp = x + offsetcache[0] - this.deltaX; 5099 this.ycomp = y + offsetcache[1] - this.deltaY; 5100 this.offset = Element.cumulativeOffset( element ); 5101 5102 return (this.ycomp >= this.offset[1] && 5103 this.ycomp < this.offset[1] + element.offsetHeight && 5104 this.xcomp >= this.offset[0] && 5105 this.xcomp < this.offset[0] + element.offsetWidth); 5106 }, 5107 5108 // within must be called directly before 5109 overlap: function( mode, element ) 5110 { 5111 if( !mode ) return 0; 5112 if( mode == 'vertical' ) 5113 return ((this.offset[1] + element.offsetHeight) - this.ycomp) / 5114 element.offsetHeight; 5115 if( mode == 'horizontal' ) 5116 return ((this.offset[0] + element.offsetWidth) - this.xcomp) / 5117 element.offsetWidth; 5118 }, 5119 5120 // Deprecation layer -- use newer Element methods now (1.5.2). 5121 5122 cumulativeOffset: Element.Methods.cumulativeOffset, 5123 5124 positionedOffset: Element.Methods.positionedOffset, 5125 5126 absolutize: function( element ) 5127 { 5128 Position.prepare(); 5129 return Element.absolutize( element ); 5130 }, 5131 5132 relativize: function( element ) 5133 { 5134 Position.prepare(); 5135 return Element.relativize( element ); 5136 }, 5137 5138 realOffset: Element.Methods.cumulativeScrollOffset, 5139 5140 offsetParent: Element.Methods.getOffsetParent, 5141 5142 page: Element.Methods.viewportOffset, 5143 5144 clone: function( source, target, options ) 5145 { 5146 options = options || { }; 5147 return Element.clonePosition( target, source, options ); 5148 } 4245 5149 }; 4246 5150 4247 5151 /*--------------------------------------------------------------------------*/ 4248 5152 4249 if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ 4250 function iter(name) { 4251 return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; 4252 } 4253 4254 instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? 4255 function(element, className) { 4256 className = className.toString().strip(); 4257 var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); 4258 return cond ? document._getElementsByXPath('.//*' + cond, element) : []; 4259 } : function(element, className) { 4260 className = className.toString().strip(); 4261 var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); 4262 if (!classNames && !className) return elements; 4263 4264 var nodes = $(element).getElementsByTagName('*'); 4265 className = ' ' + className + ' '; 4266 4267 for (var i = 0, child, cn; child = nodes[i]; i++) { 4268 if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || 4269 (classNames && classNames.all(function(name) { 4270 return !name.toString().blank() && cn.include(' ' + name + ' '); 4271 })))) 4272 elements.push(Element.extend(child)); 4273 } 4274 return elements; 4275 }; 4276 4277 return function(className, parentElement) { 4278 return $(parentElement || document.body).getElementsByClassName(className); 4279 }; 4280 }(Element.Methods); 5153 if( !document.getElementsByClassName ) document.getElementsByClassName = function( instanceMethods ) 5154 { 5155 function iter( name ) 5156 { 5157 return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; 5158 } 5159 5160 instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? 5161 function( element, className ) 5162 { 5163 className = className.toString().strip(); 5164 var cond = /\s/.test( className ) ? $w( className ).map( iter ).join( '' ) : iter( className ); 5165 return cond ? document._getElementsByXPath( './/*' + cond, element ) : []; 5166 } : function( element, className ) 5167 { 5168 className = className.toString().strip(); 5169 var elements = [], classNames = (/\s/.test( className ) ? $w( className ) : null); 5170 if( !classNames && !className ) return elements; 5171 5172 var nodes = $( element ).getElementsByTagName( '*' ); 5173 className = ' ' + className + ' '; 5174 5175 for( var i = 0, child, cn; child = nodes[i]; i++ ) 5176 { 5177 if( child.className && (cn = ' ' + child.className + ' ') && (cn.include( className ) || 5178 (classNames && classNames.all( function( name ) 5179 { 5180 return !name.toString().blank() && cn.include( ' ' + name + ' ' ); 5181 } ))) ) 5182 elements.push( Element.extend( child ) ); 5183 } 5184 return elements; 5185 }; 5186 5187 return function( className, parentElement ) 5188 { 5189 return $( parentElement || document.body ).getElementsByClassName( className ); 5190 }; 5191 }( Element.Methods ); 4281 5192 4282 5193 /*--------------------------------------------------------------------------*/ … … 4284 5195 Element.ClassNames = Class.create(); 4285 5196 Element.ClassNames.prototype = { 4286 initialize: function(element) { 4287 this.element = $(element); 4288 }, 4289 4290 _each: function(iterator) { 4291 this.element.className.split(/\s+/).select(function(name) { 4292 return name.length > 0; 4293 })._each(iterator); 4294 }, 4295 4296 set: function(className) { 4297 this.element.className = className; 4298 }, 4299 4300 add: function(classNameToAdd) { 4301 if (this.include(classNameToAdd)) return; 4302 this.set($A(this).concat(classNameToAdd).join(' ')); 4303 }, 4304 4305 remove: function(classNameToRemove) { 4306 if (!this.include(classNameToRemove)) return; 4307 this.set($A(this).without(classNameToRemove).join(' ')); 4308 }, 4309 4310 toString: function() { 4311 return $A(this).join(' '); 4312 } 5197 initialize: function( element ) 5198 { 5199 this.element = $( element ); 5200 }, 5201 5202 _each: function( iterator ) 5203 { 5204 this.element.className.split( /\s+/ ).select( 5205 function( name ) 5206 { 5207 return name.length > 0; 5208 } )._each( iterator ); 5209 }, 5210 5211 set: function( className ) 5212 { 5213 this.element.className = className; 5214 }, 5215 5216 add: function( classNameToAdd ) 5217 { 5218 if( this.include( classNameToAdd ) ) return; 5219 this.set( $A( this ).concat( classNameToAdd ).join( ' ' ) ); 5220 }, 5221 5222 remove: function( classNameToRemove ) 5223 { 5224 if( !this.include( classNameToRemove ) ) return; 5225 this.set( $A( this ).without( classNameToRemove ).join( ' ' ) ); 5226 }, 5227 5228 toString: function() 5229 { 5230 return $A( this ).join( ' ' ); 5231 } 4313 5232 }; 4314 5233 4315 Object.extend( Element.ClassNames.prototype, Enumerable);5234 Object.extend( Element.ClassNames.prototype, Enumerable ); 4316 5235 4317 5236 /*--------------------------------------------------------------------------*/
Note: See TracChangeset
for help on using the changeset viewer.