Started work on new attr plugin - will provide a ton of accessors for common styles...
[jquery.git] / jquery / jquery.js
index 6b1d2f1..668a592 100644 (file)
@@ -2,6 +2,9 @@
  * JQuery (http://jquery.com/)
  * By John Resig (http://ejohn.org/)
  * Under an Attribution, Share Alike License
+ *
+ * $Date$
+ * $Rev$
  */
 
 function $(a,c) {
@@ -32,7 +35,7 @@ function $(a,c) {
        // Load Dynamic Function List
        var self = {
                cur: $.Select($a,$c),
-               $jquery: "0.30",
+               $jquery: "$Rev$",
                
                // The only two getters
                size: function() {return this.get().length},
@@ -56,21 +59,22 @@ function $(a,c) {
                },
                html: function(h) {
                        return h == null && this.size() ?
-        this.get(0).innerHTML : this.set( "innerHTML", h );
+                               this.get(0).innerHTML : this.set( "innerHTML", h );
                },
                val: function(h) {
                        return h == null && this.size() ?
-        this.get(0).value : this.set( "value", h );
+                               this.get(0).value : this.set( "value", h );
                },
                
                css: function(a,b) {
-                       return this.each(function(){
-                               if ( !b )
-                                       for ( var j in a )
-                                               $.attr(this.style,j,a[j]);
-                               else
-                                       $.attr(this.style,a,b);
-                       });
+                       return  a.constructor != String || b ?
+                               this.each(function(){
+                                       if ( !b )
+                                               for ( var j in a )
+                                                       $.attr(this.style,j,a[j]);
+                                       else
+                                               $.attr(this.style,a,b);
+                               }) : $.css( this.get(0), a );
                },
                toggle: function() {
                        return this.each(function(){
@@ -135,10 +139,10 @@ function $(a,c) {
                },
                
                append: function() {
-      var clone = this.size() > 1;
+                       var clone = this.size() > 1;
                        var a = $.clean(arguments);
                        return this.each(function(){
-                               for ( var i in a )
+                               for ( var i = 0; i < a.length; i++ )
                                  this.appendChild( clone ? a[i].cloneNode(true) : a[i] );
                        });
                },
@@ -152,7 +156,7 @@ function $(a,c) {
                },
                
                prepend: function() {
-      var clone = this.size() > 1;
+                       var clone = this.size() > 1;
                        var a = $.clean(arguments);
                        return this.each(function(){
                                for ( var i = a.length - 1; i >= 0; i-- )
@@ -161,16 +165,16 @@ function $(a,c) {
                },
                
                before: function() {
-      var clone = this.size() > 1;
+                       var clone = this.size() > 1;
                        var a = $.clean(arguments);
                        return this.each(function(){
-                               for ( var i in a )
+                               for ( var i = 0; i < a.length; i++ )
                                        this.parentNode.insertBefore( clone ? a[i].cloneNode(true) : a[i], this );
                        });
                },
                
                after: function() {
-      var clone = this.size() > 1;
+                       var clone = this.size() > 1;
                        var a = $.clean(arguments);
                        return this.each(function(){
                                for ( var i = a.length - 1; i >= 0; i-- )
@@ -209,23 +213,25 @@ function $(a,c) {
                        this.cur = this.old;
                        return this;
                },
-               
+
                parent: function(a) {
-                       if ( a == null ) a = 1;
                        this.cur = $.map(this.cur,function(d){
-                               var b = $.parents(d);
-                               if ( a == 0 )
-                                       return b;
-                               else if ( a.constructor == String ) {
-                                       var c = $.filter(a,b);
-                                       return c.length > 0 ? c[0] : null;
-                               } else
-                                       return b.length >= a ? b[a-1] : null;
+                               return d.parentNode;
                        });
+                       if ( a ) this.cur = $.filter(a,this.cur).r;
                        return this;
                },
                
                parents: function(a) {
+                       this.cur = $.map(this.cur,$.parents);
+                       if ( a ) this.cur = $.filter(a,this.cur).r;
+                       return this;
+               },
+               
+               siblings: function(a) {
+                       // Incorrect, need to exclude current element
+                       this.cur = $.map(this.cur,$.sibling);
+                       if ( a ) this.cur = $.filter(a,this.cur).r;
                        return this;
                },
                
@@ -280,7 +286,7 @@ $.apply = function(o,f,a) {
        a = a || [];
        if ( f.apply )
                return f.apply( o, a );
-  else {
+       else {
                var p = [];
                for (var i = 0; i < a.length; i++)
                        p[i] = 'a['+i+']';
@@ -294,37 +300,37 @@ $.apply = function(o,f,a) {
 $.getCSS = function(e,p) {
        // Adapted from Prototype 1.4.0
        if ( p == 'height' || p == 'width' ) {
-    if ($.getCSS(e,"display") != 'none')
+               if ($.getCSS(e,"display") != 'none')
                        return p == 'height' ?
                                e.offsetHeight || parseInt(e.style.height) : 
                                e.offsetWidth || parseInt(e.style.width);
-    var els = e.style;
-    var ov = els.visibility;
-    var op = els.position;
+               var els = e.style;
+               var ov = els.visibility;
+               var op = els.position;
                var od = els.display;
-    els.visibility = 'hidden';
-    els.position = 'absolute';
-    els.display = '';
+               els.visibility = 'hidden';
+               els.position = 'absolute';
+               els.display = '';
                var oHeight = e.clientHeight || parseInt(e.style.height);
-    var oWidth = e.clientWidth || parseInt(e.style.width);
-    els.display = od;
-    els.position = op;
-    els.visibility = ov;
+               var oWidth = e.clientWidth || parseInt(e.style.width);
+               els.display = od;
+               els.position = op;
+               els.visibility = ov;
                return p == 'height' ? oHeight : oWidth;
-  }
+       }
        
-  if (e.style[p])
-    return e.style[p];
-  else if (e.currentStyle)
-    return e.currentStyle[p];
-  else if (document.defaultView && document.defaultView.getComputedStyle) {
-    p = p.replace(/([A-Z])/g,"-$1");
-    p = p.toLowerCase();
-    var s = document.defaultView.getComputedStyle(e,"");
-    var r = s ? s.getPropertyValue(p) : p;
+       if (e.style[p])
+               return e.style[p];
+       else if (e.currentStyle)
+               return e.currentStyle[p];
+       else if (document.defaultView && document.defaultView.getComputedStyle) {
+               p = p.replace(/([A-Z])/g,"-$1");
+               p = p.toLowerCase();
+               var s = document.defaultView.getComputedStyle(e,"");
+               var r = s ? s.getPropertyValue(p) : p;
                return r;
-  } else
-    return null;
+       } else
+               return null;
 };
 $.css = $.getCSS;
 
@@ -378,7 +384,7 @@ $.g = {
                checked: "a.checked"
        },
        // TODO: Write getAttribute helper
-       ".": "$.hasWord(a.className||a.getAttribute('class'),m[2])",
+       ".": "$.hasWord(a,m[2])",
        "@": {
                "=": "$.attr(a,m[3]) == m[4]",
                "!=": "$.attr(a,m[3]) != m[4]",
@@ -410,118 +416,118 @@ $.Select = function( t, context ) {
        }
        
        var ret = [context];
-  var done = [];
+       var done = [];
        var last = null;
   
-  while ( t.length > 0 && last != t ) {
-    var r = [];
-               last = t;
-    
-    t = $.cleanSpaces(t);
-    
-    var re = new RegExp( "^//", "i" );
-    t = t.replace( re, "" );
-
-    if ( t.indexOf('..') == 0 || t.indexOf('/..') == 0 ) {
+       while ( t.length > 0 && last != t ) {
+           var r = [];
+                       last = t;
+           
+           t = $.cleanSpaces(t);
+           
+           var re = new RegExp( "^//", "i" );
+           t = t.replace( re, "" );
+       
+           if ( t.indexOf('..') == 0 || t.indexOf('/..') == 0 ) {
                        if ( t.indexOf('/') == 0 )
                                t = t.substr(1,t.length);
-      r = $.map( ret, function(a){ return a.parentNode; } );
+                       r = $.map( ret, function(a){ return a.parentNode; } );
                        t = t.substr(2,t.length);
                        t = $.cleanSpaces(t);
-    } else if ( t.indexOf('>') == 0 || t.indexOf('/') == 0 ) {
-      r = $.map( ret, function(a){ return ( a.childNodes.length > 0 ? $.sibling( a.firstChild ) : null ); } );
+           } else if ( t.indexOf('>') == 0 || t.indexOf('/') == 0 ) {
+                       r = $.map( ret, function(a){ return ( a.childNodes.length > 0 ? $.sibling( a.firstChild ) : null ); } );
                        t = t.substr(1,t.length);
                        t = $.cleanSpaces(t);
-    } else if ( t.indexOf('+') == 0 ) {
-      r = $.map( ret, function(a){ return $.sibling(a).next; } );
+           } else if ( t.indexOf('+') == 0 ) {
+                       r = $.map( ret, function(a){ return $.sibling(a).next; } );
                        t = t.substr(1,t.length);
                        t = $.cleanSpaces(t);
-    } else if ( t.indexOf('~') == 0 ) {
-      r = $.map( ret, function(a){
-        var r = [];
-        var s = $.sibling(a);
-        if ( s.n > 0 )
-          for ( var i = s.n; i < s.length; i++ )
-            r[r.length] = s[i];
-        return r;
-      } );
+           } else if ( t.indexOf('~') == 0 ) {
+                       r = $.map( ret, function(a){
+                               var r = [];
+                               var s = $.sibling(a);
+                               if ( s.n > 0 )
+                                       for ( var i = s.n; i < s.length; i++ )
+                                               r[r.length] = s[i];
+                                       return r;
+                       });
                        t = t.substr(1,t.length);
                        t = $.cleanSpaces(t);
-    } else if ( t.indexOf(',') == 0 || t.indexOf('|') == 0 ) {
-      if ( ret[0] == context ) ret.shift();
-      done = $.merge( done, ret );
-      r = ret = [context];
+           } else if ( t.indexOf(',') == 0 || t.indexOf('|') == 0 ) {
+                       if ( ret[0] == context ) ret.shift();
+                       done = $.merge( done, ret );
+                       r = ret = [context];
                        t = " " + t.substr(1,t.length);
-    } else {
-      var re = new RegExp( "^([#.]?)([a-z0-9\\*_-]*)", "i" );
-      var m = re.exec(t);
-                       
+           } else {
+                       var re = new RegExp( "^([#.]?)([a-z0-9\\*_-]*)", "i" );
+                       var m = re.exec(t);
+                               
                        if ( m[1] == "#" ) { // Ummm, should make this work in all XML docs
                                var oid = document.getElementById(m[2]);
                                r = oid ? [oid] : [];
-        t = t.replace( re, "" );
+                               t = t.replace( re, "" );
                        } else {
-                         if ( m[2] == "" || m[1] == "." ) m[2] = "*";
-
-                         for ( var i = 0; i < ret.length; i++ ) {
-                                 var o = ret[i];
-                                 if ( o ) {
-                                         switch( m[2] ) {
-                                                 case '*':
-                                                         r = $.merge( $.getAll(o), r );
-                                                 break;
-                                                 case 'text': case 'radio': case 'checkbox': case 'hidden':
-                                                 case 'button': case 'submit': case 'image': case 'password':
-                                                 case 'reset': case 'file':
-                                                         r = $.merge( $.grep( $.tag(o,"input"), 
-                                                                                 function(a){ return a.type == m[2] }), r );
-                                                 break;
-                                                 case 'input':
-                                                         r = $.merge( $.tag(o,"input"), r );
-                                                         r = $.merge( $.tag(o,"select"), r );
-                                                         r = $.merge( $.tag(o,"textarea"), r );
-                                                 break;
-                                                 default:
-                                                         r = $.merge( r, $.tag(o,m[2]) );
-                                                 break;
-                                         }
-                                 }
-                         }
+                               if ( m[2] == "" || m[1] == "." ) m[2] = "*";
+       
+                               for ( var i = 0; i < ret.length; i++ ) {
+                                       var o = ret[i];
+                                       if ( o ) {
+                                               switch( m[2] ) {
+                                                       case '*':
+                                                               r = $.merge( $.getAll(o), r );
+                                                       break;
+                                                       case 'text': case 'radio': case 'checkbox': case 'hidden':
+                                                       case 'button': case 'submit': case 'image': case 'password':
+                                                       case 'reset': case 'file':
+                                                               r = $.merge( $.grep( $.tag(o,"input"), 
+                                                                       function(a){ return a.type == m[2] }), r );
+                                                       break;
+                                                       case 'input':
+                                                               r = $.merge( $.tag(o,"input"), r );
+                                                               r = $.merge( $.tag(o,"select"), r );
+                                                               r = $.merge( $.tag(o,"textarea"), r );
+                                                       break;
+                                                       default:
+                                                               r = $.merge( r, $.tag(o,m[2]) );
+                                                       break;
+                                               }
+                                       }
+                               }
                        }
-    }
+               }
 
                var val = $.filter(t,r);
                ret = r = val.r;
                t = $.cleanSpaces(val.t);
-  }
+       }
 
-  if ( ret && ret[0] == context ) ret.shift();
-  done = $.merge( done, ret );
-  return done;
+       if ( ret && ret[0] == context ) ret.shift();
+       done = $.merge( done, ret );
+       return done;
 };
 
 $.tag = function(a,b){
-  return a && typeof a.getElementsByTagName != "undefined" ?
-    a.getElementsByTagName( b ) : [];
+       return a && typeof a.getElementsByTagName != "undefined" ?
+               a.getElementsByTagName( b ) : [];
 };
 
 $.attr = function(o,a,v){
-  if ( a && a.constructor == String ) {
-    var fix = {
-      'for': 'htmlFor',
-      'text': 'cssText',
-      'class': 'className',
-      'float': 'cssFloat'
-    };
-    a = (fix[a] && fix[a].replace && fix[a]) || a;
-    var r = new RegExp("-([a-z])","ig");
-    a = a.replace(r,function(z,b){return b.toUpperCase();});
-    if ( v != null ) {
-      o[a] = v;
-      if ( o.setAttribute ) o.setAttribute(a,v);
-    } 
-    return o[a] || o.getAttribute(a) || '';
-  } else return '';
+       if ( a && a.constructor == String ) {
+               var fix = {
+                       'for': 'htmlFor',
+                       'text': 'cssText',
+                       'class': 'className',
+                       'float': 'cssFloat'
+               };
+               a = (fix[a] && fix[a].replace && fix[a]) || a;
+               var r = new RegExp("-([a-z])","ig");
+               a = a.replace(r,function(z,b){return b.toUpperCase();});
+               if ( v != null ) {
+                       o[a] = v;
+                       if ( o.setAttribute ) o.setAttribute(a,v);
+               } 
+               return o[a] || o.getAttribute(a) || '';
+       } else return '';
 };
 
 $.filter = function(t,r,not) {
@@ -570,41 +576,43 @@ $.filter = function(t,r,not) {
 $.parents = function(a){
        var b = [];
        var c = a.parentNode;
-       while ( c != null && c != c.documentElement ) {
+       while ( c != null && c != document ) {
                b[b.length] = c;
                c = c.parentNode;
        }
        return b;
 };
 
-$.cleanSpaces = function(t){return t.replace(/^\s+|\s+$/g, '')};
+$.cleanSpaces = function(t){
+       return t.replace(/^\s+|\s+$/g, '')
+};
 
 $.ofType = function(a,n,e) {
-  var t = $.grep($.sibling(a),function(b){return b.nodeName == a.nodeName});
-  if ( e ) n = t.length - n - 1;
-  return n != null ? t[n] == a : t.length;
+       var t = $.grep($.sibling(a),function(b){return b.nodeName == a.nodeName});
+       if ( e ) n = t.length - n - 1;
+       return n != null ? t[n] == a : t.length;
 };
 
 $.sibling = function(a,n,e) {
-  var type = [];
-  var tmp = a.parentNode.childNodes;
-  for ( var i = 0; i < tmp.length; i++ ) {
-    if ( tmp[i].nodeType == 1 )
-      type[type.length] = tmp[i];
-    if ( tmp[i] == a )
-      type.n = type.length - 1;
-  }
-  if ( e ) n = type.length - n - 1;
-  type.cur = ( type[n] == a );
-  type.prev = ( type.n > 0 ? type[type.n - 1] : null );
-  type.next = ( type.n < type.length - 1 ? type[type.n + 1] : null );
-  return type;
+       var type = [];
+       var tmp = a.parentNode.childNodes;
+       for ( var i = 0; i < tmp.length; i++ ) {
+               if ( tmp[i].nodeType == 1 )
+                       type[type.length] = tmp[i];
+               if ( tmp[i] == a )
+                       type.n = type.length - 1;
+       }
+       if ( e ) n = type.length - n - 1;
+       type.cur = ( type[n] == a );
+       type.prev = ( type.n > 0 ? type[type.n - 1] : null );
+       type.next = ( type.n < type.length - 1 ? type[type.n + 1] : null );
+       return type;
 };
 
 $.hasWord = function(e,a) {
-  if ( e == null ) return false;
-  if ( e.className != null ) e = e.className;
-  return new RegExp("(^|\\s)" + a + "(\\s|$)").test(e)
+       if ( e == null ) return false;
+       if ( e.className != null ) e = e.className;
+       return new RegExp("(^|\\s)" + a + "(\\s|$)").test(e)
 };
 
 $.getAll = function(o,r) {
@@ -624,36 +632,36 @@ $.merge = function(a,b) {
        for ( var j = 0; j < b.length; j++ )
                d[j] = b[j];
        
-  for ( var i = 0; i < a.length; i++ ) {
-    var c = true;
-    for ( var j = 0; j < b.length; j++ )
-      if ( a[i] == b[j] )
-        c = false;
-               if ( c )
-                       d[d.length] = a[i];
-  }
+       for ( var i = 0; i < a.length; i++ ) {
+               var c = true;
+               for ( var j = 0; j < b.length; j++ )
+                       if ( a[i] == b[j] )
+                               c = false;
+                       if ( c )
+                               d[d.length] = a[i];
+       }
        return d;
 };
 
 $.grep = function(a,f,s) {
-  var r = [];
+       var r = [];
        if ( a != null )
                for ( var i = 0; i < a.length; i++ )
                        if ( (!s && f(a[i],i)) || (s && !f(a[i],i)) )
                                r[r.length] = a[i];
-  return r;
+       return r;
 };
 
 $.map = function(a,f) {
-  var r = [];
-  for ( var i = 0; i < a.length; i++ ) {
-    var t = f(a[i],i);
-    if ( t != null ) {
-      if ( t.constructor != Array ) t = [t];
+       var r = [];
+       for ( var i = 0; i < a.length; i++ ) {
+               var t = f(a[i],i);
+               if ( t != null ) {
+                       if ( t.constructor != Array ) t = [t];
                        r = $.merge( t, r );
                }
-  }
-  return r;
+       }
+       return r;
 };
 
 // Bind an event to an element
@@ -690,9 +698,10 @@ function removeEvent(element, type, handler) {
        }
 };
 
-function triggerEvent(element,type) {
-  if ( element["on" + type] )
-    element["on" + type]({ type: type });
+function triggerEvent(element,type,data) {
+       data = data || [{ type: type }];
+       if ( element && element["on" + type] )
+               $.apply( element, element["on" + type], data );
 }
 
 function handleEvent(event) {
@@ -701,7 +710,7 @@ function handleEvent(event) {
        var handlers = [];
        for ( var i in this.events[event.type] )
                handlers[handlers.length] = this.events[event.type][i];
-  for ( var i = 0; i < handlers.length; i++ ) {
+       for ( var i = 0; i < handlers.length; i++ ) {
                try {
                        if ( handlers[i].constructor == Function ) {
                                this.$$handleEvent = handlers[i];
@@ -743,6 +752,6 @@ $.fn.text = function(e) {
 };
 
 setTimeout(function(){
-  if ( typeof Prototype != "undefined" && $.g == null && $.clean == null )
-    throw "Error: You are overwriting jQuery, please include jQuery last.";
-}, 1000);
+       if ( typeof Prototype != "undefined" && $.g == null && $.clean == null )
+               throw "Error: You are overwriting jQuery, please include jQuery last.";
+}, 1000);
\ No newline at end of file