* @cat DOM/Attributes
*/
text: function(e) {
- if ( typeof e == "string" )
+ if ( typeof e != "object" && e != null )
return this.empty().append( document.createTextNode( e ) );
var t = "";
/**
* Searches for all elements that match the specified expression.
-
+ *
* This method is a good way to find additional descendant
* elements with which to process.
*
* @cat DOM/Manipulation
*/
clone: function(deep) {
- // Need to remove events on the element and its descendants
+ deep = deep != undefined ? deep : true
var $this = this.add(this.find("*"));
- $this.each(function() {
- this._$events = {};
- for (var type in this.$events)
- this._$events[type] = jQuery.extend({},this.$events[type]);
- }).unbind();
+ if (jQuery.browser.msie) {
+ // Need to remove events on the element and its descendants
+ $this.each(function() {
+ this._$events = {};
+ for (var type in this.$events)
+ this._$events[type] = jQuery.extend({},this.$events[type]);
+ }).unbind();
+ }
// Do the clone
var r = this.pushStack( jQuery.map( this, function(a){
- return a.cloneNode( deep != undefined ? deep : true );
+ return a.cloneNode( deep );
}) );
- // Add the events back to the original and its descendants
- $this.each(function() {
- var events = this._$events;
- for (var type in events)
- for (var handler in events[type])
- jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
- this._$events = null;
- });
+ if (jQuery.browser.msie) {
+ $this.each(function() {
+ // Add the events back to the original and its descendants
+ var events = this._$events;
+ for (var type in events)
+ for (var handler in events[type])
+ jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
+ this._$events = null;
+ });
+ }
+
+ // copy form values over
+ if (deep) {
+ var inputs = r.add(r.find('*')).filter('select,input[@type=checkbox]');
+ $this.filter('select,input[@type=checkbox]').each(function(i) {
+ if (this.selectedIndex)
+ inputs[i].selectedIndex = this.selectedIndex;
+ if (this.checked)
+ inputs[i].checked = true;
+ });
+ }
// Return the cloned set
return r;
obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
jQuery.each( a, function(){
- fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
+ if ( jQuery.nodeName(this, "script") ) {
+ if ( this.src )
+ jQuery.ajax({ url: this.src, async: false, dataType: "script" });
+ else
+ (new Function( this.text || this.textContent || this.innerHTML || "" ))();
+ } else
+ fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
});
-
});
}
};
// check if an element is in a XML document
isXMLDoc: function(elem) {
- return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
+ return elem.documentElement && !elem.body ||
+ elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
},
nodeName: function( elem, name ) {
className: {
// internal only, use addClass("class")
add: function( elem, c ){
- jQuery.each( c.split(/\s+/), function(i, cur){
+ jQuery.each( (c || "").split(/\s+/), function(i, cur){
if ( !jQuery.className.has( elem.className, cur ) )
elem.className += ( elem.className ? " " : "" ) + cur;
});
},
curCSS: function(elem, prop, force) {
- var ret;
+ var ret, stack = [], swap = [];
+
+ // A helper method for determining if an element's values are broken
+ function color(a){
+ if ( !jQuery.browser.safari )
+ return false;
+
+ var ret = document.defaultView.getComputedStyle(a,null);
+ return !ret || ret.getPropertyValue("color") == "";
+ }
if (prop == "opacity" && jQuery.browser.msie) {
ret = jQuery.attr(elem.style, "opacity");
}
if (prop.match(/float/i))
- prop = jQuery.browser.msie ? "styleFloat" : "cssFloat";
+ prop = jQuery.styleFloat;
if (!force && elem.style[prop])
ret = elem.style[prop];
prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
var cur = document.defaultView.getComputedStyle(elem, null);
- if ( cur )
+ if ( cur && !color(elem) )
ret = cur.getPropertyValue(prop);
- else if ( prop == "display" )
- ret = "none";
- else
- jQuery.swap(elem, { display: "block" }, function() {
- var c = document.defaultView.getComputedStyle(this, "");
- ret = c && c.getPropertyValue(prop) || "";
- });
+
+ // If the element isn't reporting its values properly in Safari
+ // then some display: none elements are involved
+ else {
+ // Locate all of the parent display: none elements
+ for ( var a = elem; color(a); a = a.parentNode )
+ stack.unshift(a);
+
+ // Go through and make them visible, but in reverse
+ // (It would be better if we knew the exact display type that they had)
+ for ( a = 0; a < stack.length; a++ )
+ if ( color(stack[a]) ) {
+ swap[a] = stack[a].style.display;
+ stack[a].style.display = "block";
+ }
+
+ // Since we flip the display style, we have to handle that
+ // one special, otherwise get the value
+ ret = prop == "display" && swap[stack.length-1] != null ?
+ "none" :
+ document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
+
+ // Finally, revert the display styles back
+ for ( a = 0; a < swap.length; a++ )
+ if ( swap[a] != null )
+ stack[a].style.display = swap[a];
+ }
+
+ if ( prop == "opacity" && ret == "" )
+ ret = "1";
} else if (elem.currentStyle) {
var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
for ( var n = tb.length-1; n >= 0 ; --n )
if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
tb[n].parentNode.removeChild(tb[n]);
-
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( /^\s/.test(arg) )
+ div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
+
}
arg = jQuery.makeArray( div.childNodes );
attr: function(elem, name, value){
var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
+
+ // Safari mis-reports the default selected property of a hidden option
+ // Accessing the parent's selectedIndex property fixes it
+ if ( name == "selected" && jQuery.browser.safari )
+ elem.parentNode.selectedIndex;
// Certain attributes only work when accessed via the old DOM 0 way
if ( fix[name] ) {
if ( value != undefined ) elem[fix[name]] = value;
return elem[fix[name]];
+ } else if ( jQuery.browser.msie && name == "style" )
+ return jQuery.attr( elem.style, "cssText", value );
- } else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
+ else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
return elem.getAttributeNode(name).nodeValue;
// IE elem.getAttribute passes even for style
else if ( elem.tagName ) {
- // IE actually uses filters for opacity ... elem is actually elem.style
+
+ if ( value != undefined ) elem.setAttribute( name, value );
+ if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) )
+ return elem.getAttribute( name, 2 );
+ return elem.getAttribute( name );
+
+ // elem is actually elem.style ... set the style
+ } else {
+ // IE actually uses filters for opacity
if ( name == "opacity" && jQuery.browser.msie ) {
if ( value != undefined ) {
// IE has trouble with opacity if it does not have layout
return elem.filter ?
(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
}
-
- if ( value != undefined ) elem.setAttribute( name, value );
- if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) )
- return elem.getAttribute( name, 2 );
- return elem.getAttribute( name );
-
- // elem is actually elem.style ... set the style
- } else {
name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
if ( value != undefined ) elem[name] = value;
return elem[name];
* @cat JavaScript
*/
trim: function(t){
- return t.replace(/^\s+|\s+$/g, "");
+ return (t||"").replace(/^\s+|\s+$/g, "");
},
makeArray: function( a ) {
unique: function(first) {
var r = [], num = jQuery.mergeNum++;
- for ( var i = 0, fl = first.length; i < fl; i++ )
- if ( num != first[i].mergeNum ) {
- first[i].mergeNum = num;
- r.push(first[i]);
- }
+ try {
+ for ( var i = 0, fl = first.length; i < fl; i++ )
+ if ( num != first[i].mergeNum ) {
+ first[i].mergeNum = num;
+ r.push(first[i]);
+ }
+ } catch(e) {
+ r = first;
+ }
return r;
},
// Figure out what browser is being used
jQuery.browser = {
- version: b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)[1],
+ version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
safari: /webkit/.test(b),
opera: /opera/.test(b),
msie: /msie/.test(b) && !/opera/.test(b),
// Check to see if the W3C box model is being used
jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
+ jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat",
+
jQuery.props = {
"for": "htmlFor",
"class": "className",
- "float": jQuery.browser.msie ? "styleFloat" : "cssFloat",
- cssFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
- styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
+ "float": jQuery.styleFloat,
+ cssFloat: jQuery.styleFloat,
+ styleFloat: jQuery.styleFloat,
innerHTML: "innerHTML",
className: "className",
value: "value",
selected: "selected",
maxlength: "maxLength"
};
+
};
/**