upgrade to AngularJS 1.0.0rc6 runny-nose
[angular-drzb] / test / lib / angular / angular-scenario.js
index f6a8786..90aae04 100644 (file)
@@ -1,5 +1,5 @@
-/** @license
- * jQuery JavaScript Library v1.7
+/*!
+ * jQuery JavaScript Library v1.7.2
  * http://jquery.com/
  *
  * Copyright 2011, John Resig
@@ -11,7 +11,7 @@
  * Copyright 2011, The Dojo Foundation
  * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Thu Nov 3 16:18:21 2011 -0400
+ * Date: Wed Mar 21 12:46:34 2012 -0700
  */
 (function( window, undefined ) {
 'use strict';
@@ -48,9 +48,6 @@ var jQuery = function( selector, context ) {
        trimLeft = /^\s+/,
        trimRight = /\s+$/,
 
-       // Check for digits
-       rdigit = /\d/,
-
        // Match a standalone tag
        rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
 
@@ -214,7 +211,7 @@ jQuery.fn = jQuery.prototype = {
        selector: "",
 
        // The current version of jQuery being used
-       jquery: "1.7",
+       jquery: "1.7.2",
 
        // The default length of a jQuery object is 0
        length: 0,
@@ -286,9 +283,10 @@ jQuery.fn = jQuery.prototype = {
        },
 
        eq: function( i ) {
+               i = +i;
                return i === -1 ?
                        this.slice( i ) :
-                       this.slice( i, +i + 1 );
+                       this.slice( i, i + 1 );
        },
 
        first: function() {
@@ -439,7 +437,7 @@ jQuery.extend({
 
                        // Trigger any bound ready events
                        if ( jQuery.fn.trigger ) {
-                               jQuery( document ).trigger( "ready" ).unbind( "ready" );
+                               jQuery( document ).trigger( "ready" ).off( "ready" );
                        }
                }
        },
@@ -500,13 +498,12 @@ jQuery.extend({
                return jQuery.type(obj) === "array";
        },
 
-       // A crude way of determining if an object is a window
        isWindow: function( obj ) {
-               return obj && typeof obj === "object" && "setInterval" in obj;
+               return obj != null && obj == obj.window;
        },
 
        isNumeric: function( obj ) {
-               return obj != null && rdigit.test( obj ) && !isNaN( obj );
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
        },
 
        type: function( obj ) {
@@ -552,7 +549,7 @@ jQuery.extend({
        },
 
        error: function( msg ) {
-               throw msg;
+               throw new Error( msg );
        },
 
        parseJSON: function( data ) {
@@ -582,6 +579,9 @@ jQuery.extend({
 
        // Cross-browser xml parsing
        parseXML: function( data ) {
+               if ( typeof data !== "string" || !data ) {
+                       return null;
+               }
                var xml, tmp;
                try {
                        if ( window.DOMParser ) { // Standard
@@ -689,8 +689,6 @@ jQuery.extend({
 
                if ( array != null ) {
                        // The window, strings (and functions) also have 'length'
-                       // The extra typeof function check is to prevent crashes
-                       // in Safari 2 (See: #3039)
                        // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
                        var type = jQuery.type( array );
 
@@ -827,31 +825,55 @@ jQuery.extend({
 
        // Mutifunctional method to get and set values to a collection
        // The value/s can optionally be executed if it's a function
-       access: function( elems, key, value, exec, fn, pass ) {
-               var length = elems.length;
+       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+               var exec,
+                       bulk = key == null,
+                       i = 0,
+                       length = elems.length;
 
-               // Setting many attributes
-               if ( typeof key === "object" ) {
-                       for ( var k in key ) {
-                               jQuery.access( elems, k, key[k], exec, fn, value );
+               // Sets many values
+               if ( key && typeof key === "object" ) {
+                       for ( i in key ) {
+                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
                        }
-                       return elems;
-               }
+                       chainable = 1;
 
-               // Setting one attribute
-               if ( value !== undefined ) {
+               // Sets one value
+               } else if ( value !== undefined ) {
                        // Optionally, function values get executed if exec is true
-                       exec = !pass && exec && jQuery.isFunction(value);
+                       exec = pass === undefined && jQuery.isFunction( value );
+
+                       if ( bulk ) {
+                               // Bulk operations only iterate when executing function values
+                               if ( exec ) {
+                                       exec = fn;
+                                       fn = function( elem, key, value ) {
+                                               return exec.call( jQuery( elem ), value );
+                                       };
 
-                       for ( var i = 0; i < length; i++ ) {
-                               fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               // Otherwise they run against the entire set
+                               } else {
+                                       fn.call( elems, value );
+                                       fn = null;
+                               }
                        }
 
-                       return elems;
+                       if ( fn ) {
+                               for (; i < length; i++ ) {
+                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               }
+                       }
+
+                       chainable = 1;
                }
 
-               // Getting an attribute
-               return length ? fn( elems[0], key ) : undefined;
+               return chainable ?
+                       elems :
+
+                       // Gets
+                       bulk ?
+                               fn.call( elems ) :
+                               length ? fn( elems[0], key ) : emptyGet;
        },
 
        now: function() {
@@ -957,20 +979,6 @@ function doScrollCheck() {
        jQuery.ready();
 }
 
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-       define( "jquery", [], function () { return jQuery; } );
-}
-
 return jQuery;
 
 })();
@@ -1024,6 +1032,8 @@ jQuery.Callbacks = function( flags ) {
                stack = [],
                // Last fire value (for non-forgettable lists)
                memory,
+               // Flag to know if list was already fired
+               fired,
                // Flag to know if list is currently firing
                firing,
                // First callback to fire (used internally by add and fireWith)
@@ -1057,6 +1067,7 @@ jQuery.Callbacks = function( flags ) {
                fire = function( context, args ) {
                        args = args || [];
                        memory = !flags.memory || [ context, args ];
+                       fired = true;
                        firing = true;
                        firingIndex = firingStart || 0;
                        firingStart = 0;
@@ -1192,7 +1203,7 @@ jQuery.Callbacks = function( flags ) {
                        },
                        // To know if the callbacks have already been called at least once
                        fired: function() {
-                               return !!memory;
+                               return !!fired;
                        }
                };
 
@@ -1235,7 +1246,8 @@ jQuery.extend({
                                        return this;
                                },
                                always: function() {
-                                       return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+                                       deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+                                       return this;
                                },
                                pipe: function( fnDone, fnFail, fnProgress ) {
                                        return jQuery.Deferred(function( newDefer ) {
@@ -1348,30 +1360,24 @@ jQuery.extend({
 
 jQuery.support = (function() {
 
-       var div = document.createElement( "div" ),
-               documentElement = document.documentElement,
+       var support,
                all,
                a,
                select,
                opt,
                input,
-               marginDiv,
-               support,
                fragment,
-               body,
-               testElementParent,
-               testElement,
-               testElementStyle,
                tds,
                events,
                eventName,
                i,
-               isSupported;
+               isSupported,
+               div = document.createElement( "div" ),
+               documentElement = document.documentElement;
 
        // Preliminary tests
        div.setAttribute("className", "t");
-       div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>";
-
+       div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
 
        all = div.getElementsByTagName( "*" );
        a = div.getElementsByTagName( "a" )[ 0 ];
@@ -1392,11 +1398,11 @@ jQuery.support = (function() {
 
                // Make sure that tbody elements aren't automatically inserted
                // IE will insert them into empty tables
-               tbody: !div.getElementsByTagName( "tbody" ).length,
+               tbody: !div.getElementsByTagName("tbody").length,
 
                // Make sure that link elements get serialized correctly by innerHTML
                // This requires a wrapper element in IE
-               htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+               htmlSerialize: !!div.getElementsByTagName("link").length,
 
                // Get the style information from getAttribute
                // (IE uses .cssText instead)
@@ -1404,7 +1410,7 @@ jQuery.support = (function() {
 
                // Make sure that URLs aren't manipulated
                // (IE normalizes it by default)
-               hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+               hrefNormalized: ( a.getAttribute("href") === "/a" ),
 
                // Make sure that element opacity exists
                // (IE uses filter instead)
@@ -1415,9 +1421,6 @@ jQuery.support = (function() {
                // (IE uses styleFloat instead of cssFloat)
                cssFloat: !!a.style.cssFloat,
 
-               // Make sure unknown elements (like HTML5 elems) are handled appropriately
-               unknownElems: !!div.getElementsByTagName( "nav" ).length,
-
                // Make sure that if no value is specified for a checkbox
                // that it defaults to "on".
                // (WebKit defaults to "" instead)
@@ -1433,6 +1436,10 @@ jQuery.support = (function() {
                // Tests for enctype support on a form(#6743)
                enctype: !!document.createElement("form").enctype,
 
+               // Makes sure cloning an html5 element does not cause problems
+               // Where outerHTML is undefined, this still works
+               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
                // Will be defined later
                submitBubbles: true,
                changeBubbles: true,
@@ -1441,9 +1448,13 @@ jQuery.support = (function() {
                noCloneEvent: true,
                inlineBlockNeedsLayout: false,
                shrinkWrapBlocks: false,
-               reliableMarginRight: true
+               reliableMarginRight: true,
+               pixelMargin: true
        };
 
+       // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
+       jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+
        // Make sure checked status is properly cloned
        input.checked = true;
        support.noCloneChecked = input.cloneNode( true ).checked;
@@ -1478,6 +1489,10 @@ jQuery.support = (function() {
        support.radioValue = input.value === "t";
 
        input.setAttribute("checked", "checked");
+
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       input.setAttribute( "name", "t" );
+
        div.appendChild( input );
        fragment = document.createDocumentFragment();
        fragment.appendChild( div.lastChild );
@@ -1485,96 +1500,12 @@ jQuery.support = (function() {
        // WebKit doesn't clone checked state correctly in fragments
        support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
 
-       div.innerHTML = "";
-
-       // Figure out if the W3C box model works as expected
-       div.style.width = div.style.paddingLeft = "1px";
-
-       // We don't want to do body-related feature tests on frameset
-       // documents, which lack a body. So we use
-       // document.getElementsByTagName("body")[0], which is undefined in
-       // frameset documents, while document.body isn’t. (7398)
-       body = document.getElementsByTagName("body")[ 0 ];
-       // We use our own, invisible, body unless the body is already present
-       // in which case we use a div (#9239)
-       testElement = document.createElement( body ? "div" : "body" );
-       testElementStyle = {
-               visibility: "hidden",
-               width: 0,
-               height: 0,
-               border: 0,
-               margin: 0,
-               background: "none"
-       };
-       if ( body ) {
-               jQuery.extend( testElementStyle, {
-                       position: "absolute",
-                       left: "-999px",
-                       top: "-999px"
-               });
-       }
-       for ( i in testElementStyle ) {
-               testElement.style[ i ] = testElementStyle[ i ];
-       }
-       testElement.appendChild( div );
-       testElementParent = body || documentElement;
-       testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
        // Check if a disconnected checkbox will retain its checked
        // value of true after appended to the DOM (IE6/7)
        support.appendChecked = input.checked;
 
-       support.boxModel = div.offsetWidth === 2;
-
-       if ( "zoom" in div.style ) {
-               // Check if natively block-level elements act like inline-block
-               // elements when setting their display to 'inline' and giving
-               // them layout
-               // (IE < 8 does this)
-               div.style.display = "inline";
-               div.style.zoom = 1;
-               support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
-               // Check if elements with layout shrink-wrap their children
-               // (IE 6 does this)
-               div.style.display = "";
-               div.innerHTML = "<div style='width:4px;'></div>";
-               support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
-       }
-
-       div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
-       tds = div.getElementsByTagName( "td" );
-
-       // Check if table cells still have offsetWidth/Height when they are set
-       // to display:none and there are still other visible table cells in a
-       // table row; if so, offsetWidth/Height are not reliable for use when
-       // determining if an element has been hidden directly using
-       // display:none (it is still safe to use offsets if a parent element is
-       // hidden; don safety goggles and see bug #4512 for more information).
-       // (only IE 8 fails this test)
-       isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-       tds[ 0 ].style.display = "";
-       tds[ 1 ].style.display = "none";
-
-       // Check if empty table cells still have offsetWidth/Height
-       // (IE < 8 fail this test)
-       support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
-       div.innerHTML = "";
-
-       // Check if div with explicit width and no margin-right incorrectly
-       // gets computed margin-right based on width of container. For more
-       // info see bug #3333
-       // Fails in WebKit before Feb 2011 nightlies
-       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-       if ( document.defaultView && document.defaultView.getComputedStyle ) {
-               marginDiv = document.createElement( "div" );
-               marginDiv.style.width = "0";
-               marginDiv.style.marginRight = "0";
-               div.appendChild( marginDiv );
-               support.reliableMarginRight =
-                       ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
-       }
+       fragment.removeChild( input );
+       fragment.appendChild( div );
 
        // Technique from Juriy Zaytsev
        // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
@@ -1583,11 +1514,11 @@ jQuery.support = (function() {
        // avoid an eval call (in setAttribute) which can cause CSP
        // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
        if ( div.attachEvent ) {
-               for( i in {
+               for ( i in {
                        submit: 1,
                        change: 1,
                        focusin: 1
-               } ) {
+               }) {
                        eventName = "on" + i;
                        isSupported = ( eventName in div );
                        if ( !isSupported ) {
@@ -1598,37 +1529,99 @@ jQuery.support = (function() {
                }
        }
 
-       // Run fixed position tests at doc ready to avoid a crash
-       // related to the invisible body in IE8
+       fragment.removeChild( div );
+
+       // Null elements to avoid leaks in IE
+       fragment = select = opt = div = input = null;
+
+       // Run tests that need a body at doc ready
        jQuery(function() {
                var container, outer, inner, table, td, offsetSupport,
-                       conMarginTop = 1,
-                       ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",
-                       vb = "visibility:hidden;border:0;",
-                       style = "style='" + ptlm + "border:5px solid #000;padding:0;'",
-                       html = "<div " + style + "><div></div></div>" +
-                                                       "<table " + style + " cellpadding='0' cellspacing='0'>" +
-                                                       "<tr><td></td></tr></table>";
-
-               // Reconstruct a container
-               body = document.getElementsByTagName("body")[0];
+                       marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
+                       paddingMarginBorderVisibility, paddingMarginBorder,
+                       body = document.getElementsByTagName("body")[0];
+
                if ( !body ) {
                        // Return for frameset docs that don't have a body
-                       // These tests cannot be done
                        return;
                }
 
+               conMarginTop = 1;
+               paddingMarginBorder = "padding:0;margin:0;border:";
+               positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
+               paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
+               style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
+               html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
+                       "<table " + style + "' cellpadding='0' cellspacing='0'>" +
+                       "<tr><td></td></tr></table>";
+
                container = document.createElement("div");
-               container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+               container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
                body.insertBefore( container, body.firstChild );
 
-               // Construct a test element
-               testElement = document.createElement("div");
-               testElement.style.cssText = ptlm + vb;
-
-               testElement.innerHTML = html;
-               container.appendChild( testElement );
-               outer = testElement.firstChild;
+               // Construct the test element
+               div = document.createElement("div");
+               container.appendChild( div );
+
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               // (only IE 8 fails this test)
+               div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName( "td" );
+               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+               tds[ 0 ].style.display = "";
+               tds[ 1 ].style.display = "none";
+
+               // Check if empty table cells still have offsetWidth/Height
+               // (IE <= 8 fail this test)
+               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+               // Check if div with explicit width and no margin-right incorrectly
+               // gets computed margin-right based on width of container. For more
+               // info see bug #3333
+               // Fails in WebKit before Feb 2011 nightlies
+               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+               if ( window.getComputedStyle ) {
+                       div.innerHTML = "";
+                       marginDiv = document.createElement( "div" );
+                       marginDiv.style.width = "0";
+                       marginDiv.style.marginRight = "0";
+                       div.style.width = "2px";
+                       div.appendChild( marginDiv );
+                       support.reliableMarginRight =
+                               ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+               }
+
+               if ( typeof div.style.zoom !== "undefined" ) {
+                       // Check if natively block-level elements act like inline-block
+                       // elements when setting their display to 'inline' and giving
+                       // them layout
+                       // (IE < 8 does this)
+                       div.innerHTML = "";
+                       div.style.width = div.style.padding = "1px";
+                       div.style.border = 0;
+                       div.style.overflow = "hidden";
+                       div.style.display = "inline";
+                       div.style.zoom = 1;
+                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+                       // Check if elements with layout shrink-wrap their children
+                       // (IE 6 does this)
+                       div.style.display = "block";
+                       div.style.overflow = "visible";
+                       div.innerHTML = "<div style='width:5px;'></div>";
+                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+               }
+
+               div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
+               div.innerHTML = html;
+
+               outer = div.firstChild;
                inner = outer.firstChild;
                td = outer.nextSibling.firstChild.firstChild;
 
@@ -1650,24 +1643,24 @@ jQuery.support = (function() {
                offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
                offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
 
+               if ( window.getComputedStyle ) {
+                       div.style.marginTop = "1%";
+                       support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
+               }
+
+               if ( typeof container.style.zoom !== "undefined" ) {
+                       container.style.zoom = 1;
+               }
+
                body.removeChild( container );
-               testElement = container = null;
+               marginDiv = div = container = null;
 
                jQuery.extend( support, offsetSupport );
        });
 
-       testElement.innerHTML = "";
-       testElementParent.removeChild( testElement );
-
-       // Null connected elements to avoid leaks in IE
-       testElement = fragment = select = opt = body = marginDiv = div = input = null;
-
        return support;
 })();
 
-// Keep track of boxModel
-jQuery.boxModel = jQuery.support.boxModel;
-
 
 
 
@@ -1717,7 +1710,7 @@ jQuery.extend({
 
                        // Only defining an ID for JS objects if its cache already exists allows
                        // the code to shortcut on the same path as a DOM node with no cache
-                       id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando,
+                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
                        isEvents = name === "events";
 
                // Avoid doing any more work than we need to when trying to get data on an
@@ -1730,9 +1723,9 @@ jQuery.extend({
                        // Only DOM nodes need a new unique ID for each element since their data
                        // ends up in the global cache
                        if ( isNode ) {
-                               elem[ jQuery.expando ] = id = ++jQuery.uuid;
+                               elem[ internalKey ] = id = ++jQuery.uuid;
                        } else {
-                               id = jQuery.expando;
+                               id = internalKey;
                        }
                }
 
@@ -1815,7 +1808,7 @@ jQuery.extend({
                        cache = isNode ? jQuery.cache : elem,
 
                        // See jQuery.data for more information
-                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+                       id = isNode ? elem[ internalKey ] : internalKey;
 
                // If there is already no cache entry for this object, there is no
                // purpose in continuing
@@ -1829,19 +1822,21 @@ jQuery.extend({
 
                        if ( thisCache ) {
 
-                               // Support space separated names
-                               if ( jQuery.isArray( name ) ) {
-                                       name = name;
-                               } else if ( name in thisCache ) {
-                                       name = [ name ];
-                               } else {
+                               // Support array or space separated string names for data keys
+                               if ( !jQuery.isArray( name ) ) {
 
-                                       // split the camel cased version by spaces
-                                       name = jQuery.camelCase( name );
+                                       // try the string as a key before any manipulation
                                        if ( name in thisCache ) {
                                                name = [ name ];
                                        } else {
-                                               name = name.split( " " );
+
+                                               // split the camel cased version by spaces unless a key with the spaces exists
+                                               name = jQuery.camelCase( name );
+                                               if ( name in thisCache ) {
+                                                       name = [ name ];
+                                               } else {
+                                                       name = name.split( " " );
+                                               }
                                        }
                                }
 
@@ -1885,11 +1880,11 @@ jQuery.extend({
                        // nor does it have a removeAttribute function on Document nodes;
                        // we must handle all of these cases
                        if ( jQuery.support.deleteExpando ) {
-                               delete elem[ jQuery.expando ];
+                               delete elem[ internalKey ];
                        } else if ( elem.removeAttribute ) {
-                               elem.removeAttribute( jQuery.expando );
+                               elem.removeAttribute( internalKey );
                        } else {
-                               elem[ jQuery.expando ] = null;
+                               elem[ internalKey ] = null;
                        }
                }
        },
@@ -1915,62 +1910,70 @@ jQuery.extend({
 
 jQuery.fn.extend({
        data: function( key, value ) {
-               var parts, attr, name,
+               var parts, part, attr, name, l,
+                       elem = this[0],
+                       i = 0,
                        data = null;
 
-               if ( typeof key === "undefined" ) {
+               // Gets all values
+               if ( key === undefined ) {
                        if ( this.length ) {
-                               data = jQuery.data( this[0] );
+                               data = jQuery.data( elem );
 
-                               if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
-                                       attr = this[0].attributes;
-                                       for ( var i = 0, l = attr.length; i < l; i++ ) {
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       attr = elem.attributes;
+                                       for ( l = attr.length; i < l; i++ ) {
                                                name = attr[i].name;
 
                                                if ( name.indexOf( "data-" ) === 0 ) {
                                                        name = jQuery.camelCase( name.substring(5) );
 
-                                                       dataAttr( this[0], name, data[ name ] );
+                                                       dataAttr( elem, name, data[ name ] );
                                                }
                                        }
-                                       jQuery._data( this[0], "parsedAttrs", true );
+                                       jQuery._data( elem, "parsedAttrs", true );
                                }
                        }
 
                        return data;
+               }
 
-               } else if ( typeof key === "object" ) {
+               // Sets multiple values
+               if ( typeof key === "object" ) {
                        return this.each(function() {
                                jQuery.data( this, key );
                        });
                }
 
-               parts = key.split(".");
+               parts = key.split( ".", 2 );
                parts[1] = parts[1] ? "." + parts[1] : "";
+               part = parts[1] + "!";
 
-               if ( value === undefined ) {
-                       data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+               return jQuery.access( this, function( value ) {
 
-                       // Try to fetch any internally stored data first
-                       if ( data === undefined && this.length ) {
-                               data = jQuery.data( this[0], key );
-                               data = dataAttr( this[0], key, data );
-                       }
+                       if ( value === undefined ) {
+                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
 
-                       return data === undefined && parts[1] ?
-                               this.data( parts[0] ) :
-                               data;
+                               // Try to fetch any internally stored data first
+                               if ( data === undefined && elem ) {
+                                       data = jQuery.data( elem, key );
+                                       data = dataAttr( elem, key, data );
+                               }
 
-               } else {
-                       return this.each(function() {
-                               var $this = jQuery( this ),
-                                       args = [ parts[0], value ];
+                               return data === undefined && parts[1] ?
+                                       this.data( parts[0] ) :
+                                       data;
+                       }
+
+                       parts[1] = value;
+                       this.each(function() {
+                               var self = jQuery( this );
 
-                               $this.triggerHandler( "setData" + parts[1] + "!", args );
+                               self.triggerHandler( "setData" + part, parts );
                                jQuery.data( this, key, value );
-                               $this.triggerHandler( "changeData" + parts[1] + "!", args );
+                               self.triggerHandler( "changeData" + part, parts );
                        });
-               }
+               }, null, value, arguments.length > 1, null, false );
        },
 
        removeData: function( key ) {
@@ -1994,7 +1997,7 @@ function dataAttr( elem, key, data ) {
                                data = data === "true" ? true :
                                data === "false" ? false :
                                data === "null" ? null :
-                               jQuery.isNumeric( data ) ? parseFloat( data ) :
+                               jQuery.isNumeric( data ) ? +data :
                                        rbrace.test( data ) ? jQuery.parseJSON( data ) :
                                        data;
                        } catch( e ) {}
@@ -2129,21 +2132,27 @@ jQuery.extend({
 
 jQuery.fn.extend({
        queue: function( type, data ) {
+               var setter = 2;
+
                if ( typeof type !== "string" ) {
                        data = type;
                        type = "fx";
+                       setter--;
                }
 
-               if ( data === undefined ) {
+               if ( arguments.length < setter ) {
                        return jQuery.queue( this[0], type );
                }
-               return this.each(function() {
-                       var queue = jQuery.queue( this, type, data );
 
-                       if ( type === "fx" && queue[0] !== "inprogress" ) {
-                               jQuery.dequeue( this, type );
-                       }
-               });
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
+
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
        },
        dequeue: function( type ) {
                return this.each(function() {
@@ -2197,7 +2206,7 @@ jQuery.fn.extend({
                        }
                }
                resolve();
-               return defer.promise();
+               return defer.promise( object );
        }
 });
 
@@ -2216,7 +2225,7 @@ var rclass = /[\n\t\r]/g,
 
 jQuery.fn.extend({
        attr: function( name, value ) {
-               return jQuery.access( this, name, value, true, jQuery.attr );
+               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
        },
 
        removeAttr: function( name ) {
@@ -2226,7 +2235,7 @@ jQuery.fn.extend({
        },
 
        prop: function( name, value ) {
-               return jQuery.access( this, name, value, true, jQuery.prop );
+               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
        },
 
        removeProp: function( name ) {
@@ -2366,7 +2375,7 @@ jQuery.fn.extend({
 
                if ( !arguments.length ) {
                        if ( elem ) {
-                               hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
 
                                if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
                                        return ret;
@@ -2381,7 +2390,7 @@ jQuery.fn.extend({
                                        ret == null ? "" : ret;
                        }
 
-                       return undefined;
+                       return;
                }
 
                isFunction = jQuery.isFunction( value );
@@ -2410,7 +2419,7 @@ jQuery.fn.extend({
                                });
                        }
 
-                       hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
 
                        // If set returns undefined, fall back to normal setting
                        if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
@@ -2506,7 +2515,7 @@ jQuery.extend({
 
                // don't get/set attributes on text, comment and attribute nodes
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return undefined;
+                       return;
                }
 
                if ( pass && name in jQuery.attrFn ) {
@@ -2514,7 +2523,7 @@ jQuery.extend({
                }
 
                // Fallback to prop when attributes are not supported
-               if ( !("getAttribute" in elem) ) {
+               if ( typeof elem.getAttribute === "undefined" ) {
                        return jQuery.prop( elem, name, value );
                }
 
@@ -2531,7 +2540,7 @@ jQuery.extend({
 
                        if ( value === null ) {
                                jQuery.removeAttr( elem, name );
-                               return undefined;
+                               return;
 
                        } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
                                return ret;
@@ -2556,24 +2565,31 @@ jQuery.extend({
        },
 
        removeAttr: function( elem, value ) {
-               var propName, attrNames, name, l,
+               var propName, attrNames, name, l, isBool,
                        i = 0;
 
-               if ( elem.nodeType === 1 ) {
-                       attrNames = ( value || "" ).split( rspace );
+               if ( value && elem.nodeType === 1 ) {
+                       attrNames = value.toLowerCase().split( rspace );
                        l = attrNames.length;
 
                        for ( ; i < l; i++ ) {
-                               name = attrNames[ i ].toLowerCase();
-                               propName = jQuery.propFix[ name ] || name;
+                               name = attrNames[ i ];
 
-                               // See #9699 for explanation of this approach (setting first, then removal)
-                               jQuery.attr( elem, name, "" );
-                               elem.removeAttribute( getSetAttribute ? name : propName );
+                               if ( name ) {
+                                       propName = jQuery.propFix[ name ] || name;
+                                       isBool = rboolean.test( name );
 
-                               // Set corresponding property to false for boolean attributes
-                               if ( rboolean.test( name ) && propName in elem ) {
-                                       elem[ propName ] = false;
+                                       // See #9699 for explanation of this approach (setting first, then removal)
+                                       // Do not do this for boolean attributes (see #10870)
+                                       if ( !isBool ) {
+                                               jQuery.attr( elem, name, "" );
+                                       }
+                                       elem.removeAttribute( getSetAttribute ? name : propName );
+
+                                       // Set corresponding property to false for boolean attributes
+                                       if ( isBool && propName in elem ) {
+                                               elem[ propName ] = false;
+                                       }
                                }
                        }
                }
@@ -2640,7 +2656,7 @@ jQuery.extend({
 
                // don't get/set properties on text, comment and attribute nodes
                if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                       return undefined;
+                       return;
                }
 
                notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
@@ -2725,7 +2741,8 @@ if ( !getSetAttribute ) {
 
        fixSpecified = {
                name: true,
-               id: true
+               id: true,
+               coords: true
        };
 
        // Use this for any attribute in IE6/7
@@ -2853,15 +2870,12 @@ jQuery.each([ "radio", "checkbox" ], function() {
 
 
 
-var rnamespaces = /\.(.*)$/,
-       rformElems = /^(?:textarea|input|select)$/i,
-       rperiod = /\./g,
-       rspaces = / /g,
-       rescape = /[^\w\s.|`]/g,
+var rformElems = /^(?:textarea|input|select)$/i,
        rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
-       rhoverHack = /\bhover(\.\S+)?/,
+       rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
        rkeyEvent = /^key/,
        rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
        rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
        quickParse = function( selector ) {
                var quick = rquickIs.exec( selector );
@@ -2874,10 +2888,11 @@ var rnamespaces = /\.(.*)$/,
                return quick;
        },
        quickIs = function( elem, m ) {
+               var attrs = elem.attributes || {};
                return (
                        (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
-                       (!m[2] || elem.id === m[2]) &&
-                       (!m[3] || m[3].test( elem.className ))
+                       (!m[2] || (attrs.id || {}).value === m[2]) &&
+                       (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
                );
        },
        hoverHack = function( events ) {
@@ -2905,6 +2920,7 @@ jQuery.event = {
                if ( handler.handler ) {
                        handleObjIn = handler;
                        handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
                }
 
                // Make sure that the handler has a unique ID, used to find/remove it later
@@ -2932,7 +2948,7 @@ jQuery.event = {
 
                // Handle multiple events separated by a space
                // jQuery(...).bind("mouseover mouseout", fn);
-               types = hoverHack(types).split( " " );
+               types = jQuery.trim( hoverHack(types) ).split( " " );
                for ( t = 0; t < types.length; t++ ) {
 
                        tns = rtypenamespace.exec( types[t] ) || [];
@@ -2956,17 +2972,10 @@ jQuery.event = {
                                handler: handler,
                                guid: handler.guid,
                                selector: selector,
+                               quick: selector && quickParse( selector ),
                                namespace: namespaces.join(".")
                        }, handleObjIn );
 
-                       // Delegated event; pre-analyze selector so it's processed quickly on event dispatch
-                       if ( selector ) {
-                               handleObj.quick = quickParse( selector );
-                               if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {
-                                       handleObj.isPositional = true;
-                               }
-                       }
-
                        // Init the event handler queue if we're the first
                        handlers = events[ type ];
                        if ( !handlers ) {
@@ -3011,10 +3020,10 @@ jQuery.event = {
        global: {},
 
        // Detach an event or set of events from an element
-       remove: function( elem, types, handler, selector ) {
+       remove: function( elem, types, handler, selector, mappedTypes ) {
 
                var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
-                       t, tns, type, namespaces, origCount,
+                       t, tns, type, origType, namespaces, origCount,
                        j, events, special, handle, eventType, handleObj;
 
                if ( !elemData || !(events = elemData.events) ) {
@@ -3022,19 +3031,18 @@ jQuery.event = {
                }
 
                // Once for each type.namespace in types; type may be omitted
-               types = hoverHack( types || "" ).split(" ");
+               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
                for ( t = 0; t < types.length; t++ ) {
                        tns = rtypenamespace.exec( types[t] ) || [];
-                       type = tns[1];
+                       type = origType = tns[1];
                        namespaces = tns[2];
 
                        // Unbind all events (on this namespace, if provided) for the element
                        if ( !type ) {
-                               namespaces = namespaces? "." + namespaces : "";
-                               for ( j in events ) {
-                                       jQuery.event.remove( elem, j + namespaces, handler, selector );
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
                                }
-                               return;
+                               continue;
                        }
 
                        special = jQuery.event.special[ type ] || {};
@@ -3043,29 +3051,23 @@ jQuery.event = {
                        origCount = eventType.length;
                        namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
 
-                       // Only need to loop for special events or selective removal
-                       if ( handler || namespaces || selector || special.remove ) {
-                               for ( j = 0; j < eventType.length; j++ ) {
-                                       handleObj = eventType[ j ];
+                       // Remove matching events
+                       for ( j = 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
 
-                                       if ( !handler || handler.guid === handleObj.guid ) {
-                                               if ( !namespaces || namespaces.test( handleObj.namespace ) ) {
-                                                       if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) {
-                                                               eventType.splice( j--, 1 );
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                        ( !handler || handler.guid === handleObj.guid ) &&
+                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       eventType.splice( j--, 1 );
 
-                                                               if ( handleObj.selector ) {
-                                                                       eventType.delegateCount--;
-                                                               }
-                                                               if ( special.remove ) {
-                                                                       special.remove.call( elem, handleObj );
-                                                               }
-                                                       }
-                                               }
+                                       if ( handleObj.selector ) {
+                                               eventType.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
                                        }
                                }
-                       } else {
-                               // Removing all events
-                               eventType.length = 0;
                        }
 
                        // Remove generic event handler if we removed something and no more handlers exist
@@ -3111,6 +3113,11 @@ jQuery.event = {
                        namespaces = [],
                        cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
 
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
+
                if ( type.indexOf( "!" ) >= 0 ) {
                        // Exclusive events trigger only for the exact event (no namespaces)
                        type = type.slice(0, -1);
@@ -3145,11 +3152,6 @@ jQuery.event = {
                event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
                ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
 
-               // triggerHandler() and global events don't bubble or run the default action
-               if ( onlyHandlers || !elem ) {
-                       event.preventDefault();
-               }
-
                // Handle a global trigger
                if ( !elem ) {
 
@@ -3185,8 +3187,9 @@ jQuery.event = {
                if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
 
                        bubbleType = special.delegateType || type;
+                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
                        old = null;
-                       for ( cur = elem.parentNode; cur; cur = cur.parentNode ) {
+                       for ( ; cur; cur = cur.parentNode ) {
                                eventPath.push([ cur, bubbleType ]);
                                old = cur;
                        }
@@ -3198,7 +3201,7 @@ jQuery.event = {
                }
 
                // Fire handlers on the event path
-               for ( i = 0; i < eventPath.length; i++ ) {
+               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
 
                        cur = eventPath[i][0];
                        event.type = eventPath[i][1];
@@ -3207,19 +3210,16 @@ jQuery.event = {
                        if ( handle ) {
                                handle.apply( cur, data );
                        }
+                       // Note that this is a bare JS function and not a jQuery handler
                        handle = ontype && cur[ ontype ];
-                       if ( handle && jQuery.acceptData( cur ) ) {
-                               handle.apply( cur, data );
-                       }
-
-                       if ( event.isPropagationStopped() ) {
-                               break;
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
                        }
                }
                event.type = type;
 
                // If nobody prevented the default action, do it now
-               if ( !event.isDefaultPrevented() ) {
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
 
                        if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
                                !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
@@ -3261,39 +3261,51 @@ jQuery.event = {
                        delegateCount = handlers.delegateCount,
                        args = [].slice.call( arguments, 0 ),
                        run_all = !event.exclusive && !event.namespace,
-                       specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
+                       special = jQuery.event.special[ event.type ] || {},
                        handlerQueue = [],
-                       i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related;
+                       i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
 
                // Use the fix-ed jQuery.Event rather than the (read-only) native event
                args[0] = event;
                event.delegateTarget = this;
 
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
                // Determine handlers that should run if there are delegated events
-               // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
-               if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && !(event.button && event.type === "click") ) {
+
+                       // Pregenerate a single jQuery object for reuse with .is()
+                       jqcur = jQuery(this);
+                       jqcur.context = this.ownerDocument || this;
 
                        for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-                               selMatch = {};
-                               matches = [];
-                               for ( i = 0; i < delegateCount; i++ ) {
-                                       handleObj = handlers[ i ];
-                                       sel = handleObj.selector;
-                                       hit = selMatch[ sel ];
-
-                                       if ( handleObj.isPositional ) {
-                                               // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/
-                                               hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0;
-                                       } else if ( hit === undefined ) {
-                                               hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) );
+
+                               // Don't process events on disabled elements (#6911, #8165)
+                               if ( cur.disabled !== true ) {
+                                       selMatch = {};
+                                       matches = [];
+                                       jqcur[0] = cur;
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+                                               sel = handleObj.selector;
+
+                                               if ( selMatch[ sel ] === undefined ) {
+                                                       selMatch[ sel ] = (
+                                                               handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
+                                                       );
+                                               }
+                                               if ( selMatch[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
                                        }
-                                       if ( hit ) {
-                                               matches.push( handleObj );
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, matches: matches });
                                        }
                                }
-                               if ( matches.length ) {
-                                       handlerQueue.push({ elem: cur, matches: matches });
-                               }
                        }
                }
 
@@ -3317,7 +3329,8 @@ jQuery.event = {
                                        event.data = handleObj.data;
                                        event.handleObj = handleObj;
 
-                                       ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
 
                                        if ( ret !== undefined ) {
                                                event.result = ret;
@@ -3330,6 +3343,11 @@ jQuery.event = {
                        }
                }
 
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
+
                return event.result;
        },
 
@@ -3353,7 +3371,7 @@ jQuery.event = {
        },
 
        mouseHooks: {
-               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "),
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
                filter: function( event, original ) {
                        var eventDoc, doc, body,
                                button = original.button,
@@ -3426,13 +3444,16 @@ jQuery.event = {
                        setup: jQuery.bindReady
                },
 
-               focus: {
-                       delegateType: "focusin",
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
                        noBubble: true
                },
+
+               focus: {
+                       delegateType: "focusin"
+               },
                blur: {
-                       delegateType: "focusout",
-                       noBubble: true
+                       delegateType: "focusout"
                },
 
                beforeunload: {
@@ -3578,7 +3599,7 @@ jQuery.each({
        mouseenter: "mouseover",
        mouseleave: "mouseout"
 }, function( orig, fix ) {
-       jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = {
+       jQuery.event.special[ orig ] = {
                delegateType: fix,
                bindType: fix,
 
@@ -3587,16 +3608,14 @@ jQuery.each({
                                related = event.relatedTarget,
                                handleObj = event.handleObj,
                                selector = handleObj.selector,
-                               oldType, ret;
+                               ret;
 
-                       // For a real mouseover/out, always call the handler; for
-                       // mousenter/leave call the handler if related is outside the target.
+                       // For mousenter/leave call the handler if related is outside the target.
                        // NB: No relatedTarget if the mouse left/entered the browser window
-                       if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) {
-                               oldType = event.type;
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
                                event.type = handleObj.origType;
                                ret = handleObj.handler.apply( this, arguments );
-                               event.type = oldType;
+                               event.type = fix;
                        }
                        return ret;
                }
@@ -3620,16 +3639,23 @@ if ( !jQuery.support.submitBubbles ) {
                                        form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
                                if ( form && !form._submit_attached ) {
                                        jQuery.event.add( form, "submit._submit", function( event ) {
-                                               // Form was submitted, bubble the event up the tree
-                                               if ( this.parentNode ) {
-                                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
-                                               }
+                                               event._submit_bubble = true;
                                        });
                                        form._submit_attached = true;
                                }
                        });
                        // return undefined since we don't need an event listener
                },
+               
+               postDispatch: function( event ) {
+                       // If form was submitted by the user, bubble the event up the tree
+                       if ( event._submit_bubble ) {
+                               delete event._submit_bubble;
+                               if ( this.parentNode && !event.isTrigger ) {
+                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                               }
+                       }
+               },
 
                teardown: function() {
                        // Only need this for delegated form submit events
@@ -3661,7 +3687,7 @@ if ( !jQuery.support.changeBubbles ) {
                                                }
                                        });
                                        jQuery.event.add( this, "click._change", function( event ) {
-                                               if ( this._just_changed ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
                                                        this._just_changed = false;
                                                        jQuery.event.simulate( "change", this, event, true );
                                                }
@@ -3675,7 +3701,7 @@ if ( !jQuery.support.changeBubbles ) {
 
                                if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
                                        jQuery.event.add( elem, "change._change", function( event ) {
-                                               if ( this.parentNode && !event.isSimulated ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
                                                        jQuery.event.simulate( "change", this.parentNode, event, true );
                                                }
                                        });
@@ -3734,9 +3760,9 @@ jQuery.fn.extend({
                // Types can be a map of types/handlers
                if ( typeof types === "object" ) {
                        // ( types-Object, selector, data )
-                       if ( typeof selector !== "string" ) {
+                       if ( typeof selector !== "string" ) { // && selector != null
                                // ( types-Object, data )
-                               data = selector;
+                               data = data || selector;
                                selector = undefined;
                        }
                        for ( type in types ) {
@@ -3782,14 +3808,14 @@ jQuery.fn.extend({
                });
        },
        one: function( types, selector, data, fn ) {
-               return this.on.call( this, types, selector, data, fn, 1 );
+               return this.on( types, selector, data, fn, 1 );
        },
        off: function( types, selector, fn ) {
                if ( types && types.preventDefault && types.handleObj ) {
                        // ( event )  dispatched jQuery.Event
                        var handleObj = types.handleObj;
                        jQuery( types.delegateTarget ).off(
-                               handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
                                handleObj.selector,
                                handleObj.handler
                        );
@@ -3893,7 +3919,7 @@ jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblcl
                }
 
                return arguments.length > 0 ?
-                       this.bind( name, data, fn ) :
+                       this.on( name, null, data, fn ) :
                        this.trigger( name );
        };
 
@@ -3948,7 +3974,7 @@ var Sizzle = function( selector, context, results, seed ) {
        if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
                return [];
        }
-       
+
        if ( !selector || typeof selector !== "string" ) {
                return results;
        }
@@ -3958,7 +3984,7 @@ var Sizzle = function( selector, context, results, seed ) {
                contextXML = Sizzle.isXML( context ),
                parts = [],
                soFar = selector;
-       
+
        // Reset the position of the chunker regexp (start from head)
        do {
                chunker.exec( "" );
@@ -3966,9 +3992,9 @@ var Sizzle = function( selector, context, results, seed ) {
 
                if ( m ) {
                        soFar = m[3];
-               
+
                        parts.push( m[1] );
-               
+
                        if ( m[2] ) {
                                extra = m[3];
                                break;
@@ -3992,7 +4018,7 @@ var Sizzle = function( selector, context, results, seed ) {
                                if ( Expr.relative[ selector ] ) {
                                        selector += parts.shift();
                                }
-                               
+
                                set = posProcess( selector, set, seed );
                        }
                }
@@ -4120,7 +4146,7 @@ Sizzle.find = function( expr, context, isXML ) {
 
        for ( i = 0, len = Expr.order.length; i < len; i++ ) {
                type = Expr.order[i];
-               
+
                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
                        left = match[1];
                        match.splice( 1, 1 );
@@ -4239,7 +4265,7 @@ Sizzle.filter = function( expr, set, inplace, not ) {
 };
 
 Sizzle.error = function( msg ) {
-       throw "Syntax error, unrecognized expression: " + msg;
+       throw new Error( "Syntax error, unrecognized expression: " + msg );
 };
 
 /**
@@ -4252,7 +4278,7 @@ var getText = Sizzle.getText = function( elem ) {
                ret = "";
 
        if ( nodeType ) {
-               if ( nodeType === 1 ) {
+               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
                        // Use textContent || innerText for elements
                        if ( typeof elem.textContent === 'string' ) {
                                return elem.textContent;
@@ -4492,7 +4518,7 @@ var Expr = Sizzle.selectors = {
 
                ATTR: function( match, curLoop, inplace, result, not, isXML ) {
                        var name = match[1] = match[1].replace( rBackslash, "" );
-                       
+
                        if ( !isXML && Expr.attrMap[name] ) {
                                match[1] = Expr.attrMap[name];
                        }
@@ -4526,7 +4552,7 @@ var Expr = Sizzle.selectors = {
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
                                return true;
                        }
-                       
+
                        return match;
                },
 
@@ -4536,7 +4562,7 @@ var Expr = Sizzle.selectors = {
                        return match;
                }
        },
-       
+
        filters: {
                enabled: function( elem ) {
                        return elem.disabled === false && elem.type !== "hidden";
@@ -4549,14 +4575,14 @@ var Expr = Sizzle.selectors = {
                checked: function( elem ) {
                        return elem.checked === true;
                },
-               
+
                selected: function( elem ) {
                        // Accessing this property makes selected-by-default
                        // options in Safari work properly
                        if ( elem.parentNode ) {
                                elem.parentNode.selectedIndex;
                        }
-                       
+
                        return elem.selected === true;
                },
 
@@ -4578,7 +4604,7 @@ var Expr = Sizzle.selectors = {
 
                text: function( elem ) {
                        var attr = elem.getAttribute( "type" ), type = elem.type;
-                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) 
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
                        // use getAttribute instead to test this case
                        return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
                },
@@ -4696,22 +4722,23 @@ var Expr = Sizzle.selectors = {
                        switch ( type ) {
                                case "only":
                                case "first":
-                                       while ( (node = node.previousSibling) )  {
-                                               if ( node.nodeType === 1 ) { 
-                                                       return false; 
+                                       while ( (node = node.previousSibling) ) {
+                                               if ( node.nodeType === 1 ) {
+                                                       return false;
                                                }
                                        }
 
-                                       if ( type === "first" ) { 
-                                               return true; 
+                                       if ( type === "first" ) {
+                                               return true;
                                        }
 
                                        node = elem;
 
+                                       /* falls through */
                                case "last":
-                                       while ( (node = node.nextSibling) )      {
-                                               if ( node.nodeType === 1 ) { 
-                                                       return false; 
+                                       while ( (node = node.nextSibling) ) {
+                                               if ( node.nodeType === 1 ) {
+                                                       return false;
                                                }
                                        }
 
@@ -4724,22 +4751,22 @@ var Expr = Sizzle.selectors = {
                                        if ( first === 1 && last === 0 ) {
                                                return true;
                                        }
-                                       
+
                                        doneName = match[0];
                                        parent = elem.parentNode;
-       
+
                                        if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
                                                count = 0;
-                                               
+
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
                                                        if ( node.nodeType === 1 ) {
                                                                node.nodeIndex = ++count;
                                                        }
-                                               } 
+                                               }
 
                                                parent[ expando ] = doneName;
                                        }
-                                       
+
                                        diff = elem.nodeIndex - last;
 
                                        if ( first === 0 ) {
@@ -4758,7 +4785,7 @@ var Expr = Sizzle.selectors = {
                TAG: function( elem, match ) {
                        return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
                },
-               
+
                CLASS: function( elem, match ) {
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
                                .indexOf( match ) > -1;
@@ -4820,6 +4847,9 @@ for ( var type in Expr.match ) {
        Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
 }
+// Expose origPOS
+// "global" as in regardless of relation to brackets/parens
+Expr.match.globalPOS = origPOS;
 
 var makeArray = function( array, results ) {
        array = Array.prototype.slice.call( array, 0 );
@@ -4828,7 +4858,7 @@ var makeArray = function( array, results ) {
                results.push.apply( results, array );
                return results;
        }
-       
+
        return array;
 };
 
@@ -5060,7 +5090,7 @@ if ( document.querySelectorAll ) {
                if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
                        return;
                }
-       
+
                Sizzle = function( query, context, extra, seed ) {
                        context = context || document;
 
@@ -5069,24 +5099,24 @@ if ( document.querySelectorAll ) {
                        if ( !seed && !Sizzle.isXML(context) ) {
                                // See if we find a selector to speed up
                                var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-                               
+
                                if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
                                        // Speed-up: Sizzle("TAG")
                                        if ( match[1] ) {
                                                return makeArray( context.getElementsByTagName( query ), extra );
-                                       
+
                                        // Speed-up: Sizzle(".CLASS")
                                        } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
                                                return makeArray( context.getElementsByClassName( match[2] ), extra );
                                        }
                                }
-                               
+
                                if ( context.nodeType === 9 ) {
                                        // Speed-up: Sizzle("body")
                                        // The body element only exists once, optimize finding it
                                        if ( query === "body" && context.body ) {
                                                return makeArray( [ context.body ], extra );
-                                               
+
                                        // Speed-up: Sizzle("#ID")
                                        } else if ( match && match[3] ) {
                                                var elem = context.getElementById( match[3] );
@@ -5099,12 +5129,12 @@ if ( document.querySelectorAll ) {
                                                        if ( elem.id === match[3] ) {
                                                                return makeArray( [ elem ], extra );
                                                        }
-                                                       
+
                                                } else {
                                                        return makeArray( [], extra );
                                                }
                                        }
-                                       
+
                                        try {
                                                return makeArray( context.querySelectorAll(query), extra );
                                        } catch(qsaError) {}
@@ -5142,7 +5172,7 @@ if ( document.querySelectorAll ) {
                                        }
                                }
                        }
-               
+
                        return oldSizzle(query, context, extra, seed);
                };
 
@@ -5169,7 +5199,7 @@ if ( document.querySelectorAll ) {
                        // This should fail with an exception
                        // Gecko does not error, returns false instead
                        matches.call( document.documentElement, "[test!='']:sizzle" );
-       
+
                } catch( pseudoError ) {
                        pseudoWorks = true;
                }
@@ -5179,7 +5209,7 @@ if ( document.querySelectorAll ) {
                        expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
 
                        if ( !Sizzle.isXML( node ) ) {
-                               try { 
+                               try {
                                        if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
                                                var ret = matches.call( node, expr );
 
@@ -5216,7 +5246,7 @@ if ( document.querySelectorAll ) {
        if ( div.getElementsByClassName("e").length === 1 ) {
                return;
        }
-       
+
        Expr.order.splice(1, 0, "CLASS");
        Expr.find.CLASS = function( match, context, isXML ) {
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
@@ -5267,7 +5297,7 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
 
                if ( elem ) {
                        var match = false;
-                       
+
                        elem = elem[dir];
 
                        while ( elem ) {
@@ -5320,7 +5350,7 @@ if ( document.documentElement.contains ) {
 
 Sizzle.isXML = function( elem ) {
        // documentElement is verified for cases where it doesn't yet exist
-       // (such as loading iframes in IE - #4833) 
+       // (such as loading iframes in IE - #4833)
        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
 
        return documentElement ? documentElement.nodeName !== "HTML" : false;
@@ -5370,7 +5400,7 @@ var runtil = /Until$/,
        rmultiselector = /,/,
        isSimple = /^.[^:#\[\.,]*$/,
        slice = Array.prototype.slice,
-       POS = jQuery.expr.match.POS,
+       POS = jQuery.expr.match.globalPOS,
        // methods guaranteed to produce a unique set when starting from a unique set
        guaranteedUnique = {
                children: true,
@@ -5437,11 +5467,11 @@ jQuery.fn.extend({
        },
 
        is: function( selector ) {
-               return !!selector && ( 
+               return !!selector && (
                        typeof selector === "string" ?
                                // If this is a positional selector, check membership in the returned set
                                // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                               POS.test( selector ) ? 
+                               POS.test( selector ) ?
                                        jQuery( selector, this.context ).index( this[0] ) >= 0 :
                                        jQuery.filter( selector, this ).length > 0 :
                                this.filter( selector ).length > 0 );
@@ -5449,7 +5479,7 @@ jQuery.fn.extend({
 
        closest: function( selectors, context ) {
                var ret = [], i, l, cur = this[0];
-               
+
                // Array (deprecated as of jQuery 1.7)
                if ( jQuery.isArray( selectors ) ) {
                        var level = 1;
@@ -5568,7 +5598,7 @@ jQuery.each({
                return jQuery.dir( elem, "previousSibling", until );
        },
        siblings: function( elem ) {
-               return jQuery.sibling( elem.parentNode.firstChild, elem );
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
        },
        children: function( elem ) {
                return jQuery.sibling( elem.firstChild );
@@ -5580,12 +5610,7 @@ jQuery.each({
        }
 }, function( name, fn ) {
        jQuery.fn[ name ] = function( until, selector ) {
-               var ret = jQuery.map( this, fn, until ),
-                       // The variable 'args' was introduced in
-                       // https://github.com/jquery/jquery/commit/52a0238
-                       // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
-                       // http://code.google.com/p/v8/issues/detail?id=1050
-                       args = slice.call(arguments);
+               var ret = jQuery.map( this, fn, until );
 
                if ( !runtil.test( name ) ) {
                        selector = until;
@@ -5601,7 +5626,7 @@ jQuery.each({
                        ret = ret.reverse();
                }
 
-               return this.pushStack( ret, name, args.join(",") );
+               return this.pushStack( ret, name, slice.call( arguments ).join(",") );
        };
 });
 
@@ -5694,7 +5719,7 @@ function winnow( elements, qualifier, keep ) {
 
 
 function createSafeFragment( document ) {
-       var list = nodeNames.split( " " ),
+       var list = nodeNames.split( "|" ),
        safeFrag = document.createDocumentFragment();
 
        if ( safeFrag.createElement ) {
@@ -5707,8 +5732,8 @@ function createSafeFragment( document ) {
        return safeFrag;
 }
 
-var nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " +
-               "header hgroup mark meter nav output progress section summary time video",
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
        rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
        rleadingWhitespace = /^\s+/,
        rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
@@ -5717,7 +5742,7 @@ var nodeNames = "abbr article aside audio canvas datalist details figcaption fig
        rhtml = /<|&#?\w+;/,
        rnoInnerhtml = /<(?:script|style)/i,
        rnocache = /<(?:script|object|embed|option|style)/i,
-       rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"),
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
        // checked="checked" or checked
        rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        rscriptType = /\/(java|ecma)script/i,
@@ -5744,20 +5769,12 @@ if ( !jQuery.support.htmlSerialize ) {
 }
 
 jQuery.fn.extend({
-       text: function( text ) {
-               if ( jQuery.isFunction(text) ) {
-                       return this.each(function(i) {
-                               var self = jQuery( this );
-
-                               self.text( text.call(this, i, self.text()) );
-                       });
-               }
-
-               if ( typeof text !== "object" && text !== undefined ) {
-                       return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
-               }
-
-               return jQuery.text( this );
+       text: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
        },
 
        wrapAll: function( html ) {
@@ -5810,8 +5827,10 @@ jQuery.fn.extend({
        },
 
        wrap: function( html ) {
-               return this.each(function() {
-                       jQuery( this ).wrapAll( html );
+               var isFunction = jQuery.isFunction( html );
+
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
                });
        },
 
@@ -5845,7 +5864,7 @@ jQuery.fn.extend({
                                this.parentNode.insertBefore( elem, this );
                        });
                } else if ( arguments.length ) {
-                       var set = jQuery(arguments[0]);
+                       var set = jQuery.clean( arguments );
                        set.push.apply( set, this.toArray() );
                        return this.pushStack( set, "before", arguments );
                }
@@ -5858,7 +5877,7 @@ jQuery.fn.extend({
                        });
                } else if ( arguments.length ) {
                        var set = this.pushStack( this, "after", arguments );
-                       set.push.apply( set, jQuery(arguments[0]).toArray() );
+                       set.push.apply( set, jQuery.clean(arguments) );
                        return set;
                }
        },
@@ -5907,44 +5926,44 @@ jQuery.fn.extend({
        },
 
        html: function( value ) {
-               if ( value === undefined ) {
-                       return this[0] && this[0].nodeType === 1 ?
-                               this[0].innerHTML.replace(rinlinejQuery, "") :
-                               null;
+               return jQuery.access( this, function( value ) {
+                       var elem = this[0] || {},
+                               i = 0,
+                               l = this.length;
 
-               // See if we can take a shortcut and just use innerHTML
-               } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                       (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
-                       !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       null;
+                       }
 
-                       value = value.replace(rxhtmlTag, "<$1></$2>");
 
-                       try {
-                               for ( var i = 0, l = this.length; i < l; i++ ) {
-                                       // Remove element nodes and prevent memory leaks
-                                       if ( this[i].nodeType === 1 ) {
-                                               jQuery.cleanData( this[i].getElementsByTagName("*") );
-                                               this[i].innerHTML = value;
-                                       }
-                               }
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
 
-                       // If using innerHTML throws an exception, use the fallback method
-                       } catch(e) {
-                               this.empty().append( value );
-                       }
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
 
-               } else if ( jQuery.isFunction( value ) ) {
-                       this.each(function(i){
-                               var self = jQuery( this );
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
 
-                               self.html( value.call(this, i, self.html()) );
-                       });
+                                       elem = 0;
 
-               } else {
-                       this.empty().append( value );
-               }
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
+                       }
 
-               return this;
+                       if ( elem ) {
+                               this.empty().append( value );
+                       }
+               }, null, value, arguments.length );
        },
 
        replaceWith: function( value ) {
@@ -6047,7 +6066,23 @@ jQuery.fn.extend({
                        }
 
                        if ( scripts.length ) {
-                               jQuery.each( scripts, evalScript );
+                               jQuery.each( scripts, function( i, elem ) {
+                                       if ( elem.src ) {
+                                               jQuery.ajax({
+                                                       type: "GET",
+                                                       global: false,
+                                                       url: elem.src,
+                                                       async: false,
+                                                       dataType: "script"
+                                               });
+                                       } else {
+                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+                                       }
+
+                                       if ( elem.parentNode ) {
+                                               elem.parentNode.removeChild( elem );
+                                       }
+                               });
                        }
                }
 
@@ -6079,7 +6114,7 @@ function cloneCopyEvent( src, dest ) {
 
                for ( type in events ) {
                        for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                               jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
                        }
                }
        }
@@ -6141,11 +6176,20 @@ function cloneFixAttributes( src, dest ) {
        // cloning other types of input fields
        } else if ( nodeName === "input" || nodeName === "textarea" ) {
                dest.defaultValue = src.defaultValue;
+
+       // IE blanks contents when cloning scripts
+       } else if ( nodeName === "script" && dest.text !== src.text ) {
+               dest.text = src.text;
        }
 
        // Event data gets referenced instead of copied if the expando
        // gets copied too
        dest.removeAttribute( jQuery.expando );
+
+       // Clear flags for bubbling special change/submit events, they must
+       // be reattached when the newly cloned events are first activated
+       dest.removeAttribute( "_submit_attached" );
+       dest.removeAttribute( "_change_attached" );
 }
 
 jQuery.buildFragment = function( args, nodes, scripts ) {
@@ -6159,7 +6203,7 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
                doc = nodes[0].ownerDocument || nodes[0];
        }
 
-  // Ensure that an attr object doesn't incorrectly stand in as a document object
+       // Ensure that an attr object doesn't incorrectly stand in as a document object
        // Chrome and Firefox seem to allow this to occur and will throw exception
        // Fixes #8950
        if ( !doc.createDocumentFragment ) {
@@ -6174,7 +6218,7 @@ jQuery.buildFragment = function( args, nodes, scripts ) {
        if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
                first.charAt(0) === "<" && !rnocache.test( first ) &&
                (jQuery.support.checkClone || !rchecked.test( first )) &&
-               (!jQuery.support.unknownElems && rnoshimcache.test( first )) ) {
+               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
 
                cacheable = true;
 
@@ -6255,12 +6299,24 @@ function findInputs( elem ) {
        }
 }
 
+// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
+function shimCloneNode( elem ) {
+       var div = document.createElement( "div" );
+       safeFragment.appendChild( div );
+
+       div.innerHTML = elem.outerHTML;
+       return div.firstChild;
+}
+
 jQuery.extend({
        clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-               var clone = elem.cloneNode(true),
-                               srcElements,
-                               destElements,
-                               i;
+               var srcElements,
+                       destElements,
+                       i,
+                       // IE<=8 does not properly clone detached, unknown element nodes
+                       clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
+                               elem.cloneNode( true ) :
+                               shimCloneNode( elem );
 
                if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
                                (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
@@ -6272,8 +6328,7 @@ jQuery.extend({
 
                        cloneFixAttributes( elem, clone );
 
-                       // Using Sizzle here is crazy slow, so we use getElementsByTagName
-                       // instead
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
                        srcElements = getAll( elem );
                        destElements = getAll( clone );
 
@@ -6309,7 +6364,8 @@ jQuery.extend({
        },
 
        clean: function( elems, context, fragment, scripts ) {
-               var checkScriptType;
+               var checkScriptType, script, j,
+                               ret = [];
 
                context = context || document;
 
@@ -6318,8 +6374,6 @@ jQuery.extend({
                        context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
                }
 
-               var ret = [], j;
-
                for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
                        if ( typeof elem === "number" ) {
                                elem += "";
@@ -6341,7 +6395,9 @@ jQuery.extend({
                                        var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
                                                wrap = wrapMap[ tag ] || wrapMap._default,
                                                depth = wrap[0],
-                                               div = context.createElement("div");
+                                               div = context.createElement("div"),
+                                               safeChildNodes = safeFragment.childNodes,
+                                               remove;
 
                                        // Append wrapper element to unknown element safe doc fragment
                                        if ( context === document ) {
@@ -6386,6 +6442,21 @@ jQuery.extend({
                                        }
 
                                        elem = div.childNodes;
+
+                                       // Clear elements from DocumentFragment (safeFragment or otherwise)
+                                       // to avoid hoarding elements. Fixes #11356
+                                       if ( div ) {
+                                               div.parentNode.removeChild( div );
+
+                                               // Guard against -1 index exceptions in FF3.6
+                                               if ( safeChildNodes.length > 0 ) {
+                                                       remove = safeChildNodes[ safeChildNodes.length - 1 ];
+
+                                                       if ( remove && remove.parentNode ) {
+                                                               remove.parentNode.removeChild( remove );
+                                                       }
+                                               }
+                                       }
                                }
                        }
 
@@ -6414,16 +6485,17 @@ jQuery.extend({
                                return !elem.type || rscriptType.test( elem.type );
                        };
                        for ( i = 0; ret[i]; i++ ) {
-                               if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
-                                       scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+                               script = ret[i];
+                               if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
+                                       scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
 
                                } else {
-                                       if ( ret[i].nodeType === 1 ) {
-                                               var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+                                       if ( script.nodeType === 1 ) {
+                                               var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
 
                                                ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
                                        }
-                                       fragment.appendChild( ret[i] );
+                                       fragment.appendChild( script );
                                }
                        }
                }
@@ -6477,22 +6549,6 @@ jQuery.extend({
        }
 });
 
-function evalScript( i, elem ) {
-       if ( elem.src ) {
-               jQuery.ajax({
-                       url: elem.src,
-                       async: false,
-                       dataType: "script"
-               });
-       } else {
-               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
-       }
-
-       if ( elem.parentNode ) {
-               elem.parentNode.removeChild( elem );
-       }
-}
-
 
 
 
@@ -6500,29 +6556,27 @@ var ralpha = /alpha\([^)]*\)/i,
        ropacity = /opacity=([^)]*)/,
        // fixed for IE9, see #8346
        rupper = /([A-Z]|^ms)/g,
-       rnumpx = /^-?\d+(?:px)?$/i,
-       rnum = /^-?\d/,
+       rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
+       rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
        rrelNum = /^([\-+])=([\-+.\de]+)/,
+       rmargin = /^margin/,
 
        cssShow = { position: "absolute", visibility: "hidden", display: "block" },
-       cssWidth = [ "Left", "Right" ],
-       cssHeight = [ "Top", "Bottom" ],
+
+       // order is important!
+       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+
        curCSS,
 
        getComputedStyle,
        currentStyle;
 
 jQuery.fn.css = function( name, value ) {
-       // Setting 'undefined' is a no-op
-       if ( arguments.length === 2 && value === undefined ) {
-               return this;
-       }
-
-       return jQuery.access( this, name, value, true, function( elem, name, value ) {
+       return jQuery.access( this, function( elem, name, value ) {
                return value !== undefined ?
                        jQuery.style( elem, name, value ) :
                        jQuery.css( elem, name );
-       });
+       }, name, value, arguments.length > 1 );
 };
 
 jQuery.extend({
@@ -6533,7 +6587,7 @@ jQuery.extend({
                        get: function( elem, computed ) {
                                if ( computed ) {
                                        // We should always get a number back from opacity
-                                       var ret = curCSS( elem, "opacity", "opacity" );
+                                       var ret = curCSS( elem, "opacity" );
                                        return ret === "" ? "1" : ret;
 
                                } else {
@@ -6641,140 +6695,55 @@ jQuery.extend({
 
        // A method for quickly swapping in/out CSS properties to get correct calculations
        swap: function( elem, options, callback ) {
-               var old = {};
+               var old = {},
+                       ret, name;
 
                // Remember the old values, and insert the new ones
-               for ( var name in options ) {
+               for ( name in options ) {
                        old[ name ] = elem.style[ name ];
                        elem.style[ name ] = options[ name ];
                }
 
-               callback.call( elem );
+               ret = callback.call( elem );
 
                // Revert the old values
                for ( name in options ) {
                        elem.style[ name ] = old[ name ];
                }
-       }
-});
 
-// DEPRECATED, Use jQuery.css() instead
-jQuery.curCSS = jQuery.css;
-
-jQuery.each(["height", "width"], function( i, name ) {
-       jQuery.cssHooks[ name ] = {
-               get: function( elem, computed, extra ) {
-                       var val;
-
-                       if ( computed ) {
-                               if ( elem.offsetWidth !== 0 ) {
-                                       return getWH( elem, name, extra );
-                               } else {
-                                       jQuery.swap( elem, cssShow, function() {
-                                               val = getWH( elem, name, extra );
-                                       });
-                               }
-
-                               return val;
-                       }
-               },
-
-               set: function( elem, value ) {
-                       if ( rnumpx.test( value ) ) {
-                               // ignore negative width and height values #1599
-                               value = parseFloat( value );
-
-                               if ( value >= 0 ) {
-                                       return value + "px";
-                               }
-
-                       } else {
-                               return value;
-                       }
-               }
-       };
-});
-
-if ( !jQuery.support.opacity ) {
-       jQuery.cssHooks.opacity = {
-               get: function( elem, computed ) {
-                       // IE uses filters for opacity
-                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                               ( parseFloat( RegExp.$1 ) / 100 ) + "" :
-                               computed ? "1" : "";
-               },
-
-               set: function( elem, value ) {
-                       var style = elem.style,
-                               currentStyle = elem.currentStyle,
-                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-                               filter = currentStyle && currentStyle.filter || style.filter || "";
-
-                       // IE has trouble with opacity if it does not have layout
-                       // Force it by setting the zoom level
-                       style.zoom = 1;
-
-                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
-
-                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
-                               // style.removeAttribute is IE Only, but so apparently is this code path...
-                               style.removeAttribute( "filter" );
-
-                               // if there there is no filter style applied in a css rule, we are done
-                               if ( currentStyle && !currentStyle.filter ) {
-                                       return;
-                               }
-                       }
-
-                       // otherwise, set new filter values
-                       style.filter = ralpha.test( filter ) ?
-                               filter.replace( ralpha, opacity ) :
-                               filter + " " + opacity;
-               }
-       };
-}
-
-jQuery(function() {
-       // This hook cannot be added until DOM ready because the support test
-       // for it is not run until after DOM ready
-       if ( !jQuery.support.reliableMarginRight ) {
-               jQuery.cssHooks.marginRight = {
-                       get: function( elem, computed ) {
-                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                               // Work around by temporarily setting element display to inline-block
-                               var ret;
-                               jQuery.swap( elem, { "display": "inline-block" }, function() {
-                                       if ( computed ) {
-                                               ret = curCSS( elem, "margin-right", "marginRight" );
-                                       } else {
-                                               ret = elem.style.marginRight;
-                                       }
-                               });
-                               return ret;
-                       }
-               };
+               return ret;
        }
 });
 
+// DEPRECATED in 1.3, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
 if ( document.defaultView && document.defaultView.getComputedStyle ) {
        getComputedStyle = function( elem, name ) {
-               var ret, defaultView, computedStyle;
+               var ret, defaultView, computedStyle, width,
+                       style = elem.style;
 
                name = name.replace( rupper, "-$1" ).toLowerCase();
 
-               if ( !(defaultView = elem.ownerDocument.defaultView) ) {
-                       return undefined;
-               }
+               if ( (defaultView = elem.ownerDocument.defaultView) &&
+                               (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
 
-               if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
                        ret = computedStyle.getPropertyValue( name );
                        if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
                                ret = jQuery.style( elem, name );
                        }
                }
 
+               // A tribute to the "awesome hack by Dean Edwards"
+               // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
+               // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+               if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
+                       width = style.width;
+                       style.width = ret;
+                       ret = computedStyle.width;
+                       style.width = width;
+               }
+
                return ret;
        };
 }
@@ -6787,7 +6756,7 @@ if ( document.documentElement.currentStyle ) {
 
                // Avoid setting ret to empty string here
                // so we don't default to auto
-               if ( ret === null && style && (uncomputed = style[ name ]) ) {
+               if ( ret == null && style && (uncomputed = style[ name ]) ) {
                        ret = uncomputed;
                }
 
@@ -6796,7 +6765,7 @@ if ( document.documentElement.currentStyle ) {
 
                // If we're not dealing with a regular pixel number
                // but a number that has a weird ending, we need to convert it to pixels
-               if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+               if ( rnumnonpx.test( ret ) ) {
 
                        // Remember the original values
                        left = style.left;
@@ -6806,7 +6775,7 @@ if ( document.documentElement.currentStyle ) {
                        if ( rsLeft ) {
                                elem.runtimeStyle.left = elem.currentStyle.left;
                        }
-                       style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+                       style.left = name === "fontSize" ? "1em" : ret;
                        ret = style.pixelLeft + "px";
 
                        // Revert the changed values
@@ -6822,53 +6791,143 @@ if ( document.documentElement.currentStyle ) {
 
 curCSS = getComputedStyle || currentStyle;
 
-function getWH( elem, name, extra ) {
+function getWidthOrHeight( elem, name, extra ) {
 
        // Start with offset property
        var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-               which = name === "width" ? cssWidth : cssHeight;
+               i = name === "width" ? 1 : 0,
+               len = 4;
 
        if ( val > 0 ) {
                if ( extra !== "border" ) {
-                       jQuery.each( which, function() {
+                       for ( ; i < len; i += 2 ) {
                                if ( !extra ) {
-                                       val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+                                       val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
                                }
                                if ( extra === "margin" ) {
-                                       val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+                                       val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
                                } else {
-                                       val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+                                       val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
                                }
-                       });
+                       }
                }
 
                return val + "px";
        }
 
        // Fall back to computed then uncomputed css if necessary
-       val = curCSS( elem, name, name );
+       val = curCSS( elem, name );
        if ( val < 0 || val == null ) {
-               val = elem.style[ name ] || 0;
+               val = elem.style[ name ];
+       }
+
+       // Computed unit is not pixels. Stop here and return.
+       if ( rnumnonpx.test(val) ) {
+               return val;
        }
+
        // Normalize "", auto, and prepare for extra
        val = parseFloat( val ) || 0;
 
        // Add padding, border, margin
        if ( extra ) {
-               jQuery.each( which, function() {
-                       val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+               for ( ; i < len; i += 2 ) {
+                       val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
                        if ( extra !== "padding" ) {
-                               val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+                               val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
                        }
                        if ( extra === "margin" ) {
-                               val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+                               val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
                        }
-               });
+               }
        }
 
        return val + "px";
 }
 
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               if ( elem.offsetWidth !== 0 ) {
+                                       return getWidthOrHeight( elem, name, extra );
+                               } else {
+                                       return jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       });
+                               }
+                       }
+               },
+
+               set: function( elem, value ) {
+                       return rnum.test( value ) ?
+                               value + "px" :
+                               value;
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( parseFloat( RegExp.$1 ) / 100 ) + "" :
+                               computed ? "1" : "";
+               },
+
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
+
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
+
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
+                       }
+
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
+
+jQuery(function() {
+       // This hook cannot be added until DOM ready because the support test
+       // for it is not run until after DOM ready
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               return curCSS( elem, "margin-right" );
+                                       } else {
+                                               return elem.style.marginRight;
+                                       }
+                               });
+                       }
+               };
+       }
+});
+
 if ( jQuery.expr && jQuery.expr.filters ) {
        jQuery.expr.filters.hidden = function( elem ) {
                var width = elem.offsetWidth,
@@ -6882,6 +6941,31 @@ if ( jQuery.expr && jQuery.expr.filters ) {
        };
 }
 
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i,
+
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ],
+                               expanded = {};
+
+                       for ( i = 0; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+                       }
+
+                       return expanded;
+               }
+       };
+});
+
 
 
 
@@ -7146,7 +7230,7 @@ jQuery.fn.extend({
 // Attach a bunch of functions for handling common AJAX events
 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
        jQuery.fn[ o ] = function( f ){
-               return this.bind( o, f );
+               return this.on( o, f );
        };
 });
 
@@ -7200,7 +7284,7 @@ jQuery.extend({
                isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
                global: true,
                type: "GET",
-               contentType: "application/x-www-form-urlencoded",
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
                processData: true,
                async: true,
                /*
@@ -7526,7 +7610,7 @@ jQuery.extend({
                // Apply prefilters
                inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
-               // If request was aborted inside a prefiler, stop there
+               // If request was aborted inside a prefilter, stop there
                if ( state === 2 ) {
                        return false;
                }
@@ -7640,7 +7724,7 @@ jQuery.extend({
                                        done( -1, e );
                                // Simply rethrow otherwise
                                } else {
-                                       jQuery.error( e );
+                                       throw e;
                                }
                        }
                }
@@ -7699,11 +7783,11 @@ function buildParams( prefix, obj, traditional, add ) {
                                // a server error. Possible fixes are to modify rack's
                                // deserialization algorithm or to provide an option or flag
                                // to force array serialization to be shallow.
-                               buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
                        }
                });
 
-       } else if ( !traditional && obj != null && typeof obj === "object" ) {
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
                // Serialize object item.
                for ( var name in obj ) {
                        buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
@@ -7899,8 +7983,7 @@ jQuery.ajaxSetup({
 // Detect, normalize options and install callbacks for jsonp requests
 jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
 
-       var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
-               ( typeof s.data === "string" );
+       var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
 
        if ( s.dataTypes[ 0 ] === "jsonp" ||
                s.jsonp !== false && ( jsre.test( s.url ) ||
@@ -8201,7 +8284,13 @@ if ( jQuery.support.ajax ) {
                                                                        if ( xml && xml.documentElement /* #4958 */ ) {
                                                                                responses.xml = xml;
                                                                        }
-                                                                       responses.text = xhr.responseText;
+
+                                                                       // When requesting binary data, IE6-9 will throw an exception
+                                                                       // on any attempt to access responseText (#11426)
+                                                                       try {
+                                                                               responses.text = xhr.responseText;
+                                                                       } catch( _ ) {
+                                                                       }
 
                                                                        // Firefox throws an exception when accessing
                                                                        // statusText for faulty cross-domain requests
@@ -8309,7 +8398,8 @@ jQuery.fn.extend({
                                        // Set elements which have been overridden with display: none
                                        // in a stylesheet to whatever the default browser style is
                                        // for such an element
-                                       if ( display === "" && jQuery.css(elem, "display") === "none" ) {
+                                       if ( (display === "" && jQuery.css(elem, "display") === "none") ||
+                                               !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
                                                jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
                                        }
                                }
@@ -8413,24 +8503,37 @@ jQuery.fn.extend({
                        var opt = jQuery.extend( {}, optall ),
                                isElement = this.nodeType === 1,
                                hidden = isElement && jQuery(this).is(":hidden"),
-                               name, val, p, e,
+                               name, val, p, e, hooks, replace,
                                parts, start, end, unit,
                                method;
 
                        // will store per property easing and be used to determine when an animation is complete
                        opt.animatedProperties = {};
 
+                       // first pass over propertys to expand / normalize
                        for ( p in prop ) {
-
-                               // property name normalization
                                name = jQuery.camelCase( p );
                                if ( p !== name ) {
                                        prop[ name ] = prop[ p ];
                                        delete prop[ p ];
                                }
 
-                               val = prop[ name ];
+                               if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
+                                       replace = hooks.expand( prop[ name ] );
+                                       delete prop[ name ];
 
+                                       // not quite $.extend, this wont overwrite keys already present.
+                                       // also - reusing 'p' from above because we have the correct "name"
+                                       for ( p in replace ) {
+                                               if ( ! ( p in prop ) ) {
+                                                       prop[ p ] = replace[ p ];
+                                               }
+                                       }
+                               }
+                       }
+
+                       for ( name in prop ) {
+                               val = prop[ name ];
                                // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
                                if ( jQuery.isArray( val ) ) {
                                        opt.animatedProperties[ name ] = val[ 1 ];
@@ -8535,7 +8638,7 @@ jQuery.fn.extend({
                }
 
                return this.each(function() {
-                       var i,
+                       var index,
                                hadTimers = false,
                                timers = jQuery.timers,
                                data = jQuery._data( this );
@@ -8545,33 +8648,33 @@ jQuery.fn.extend({
                                jQuery._unmark( true, this );
                        }
 
-                       function stopQueue( elem, data, i ) {
-                               var hooks = data[ i ];
-                               jQuery.removeData( elem, i, true );
+                       function stopQueue( elem, data, index ) {
+                               var hooks = data[ index ];
+                               jQuery.removeData( elem, index, true );
                                hooks.stop( gotoEnd );
                        }
 
                        if ( type == null ) {
-                               for ( i in data ) {
-                                       if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) {
-                                               stopQueue( this, data, i );
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
+                                               stopQueue( this, data, index );
                                        }
                                }
-                       } else if ( data[ i = type + ".run" ] && data[ i ].stop ){
-                               stopQueue( this, data, i );
+                       } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
+                               stopQueue( this, data, index );
                        }
 
-                       for ( i = timers.length; i--; ) {
-                               if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) {
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
                                        if ( gotoEnd ) {
 
                                                // force the next step to be the last
-                                               timers[ i ]( true );
+                                               timers[ index ]( true );
                                        } else {
-                                               timers[ i ].saveState();
+                                               timers[ index ].saveState();
                                        }
                                        hadTimers = true;
-                                       timers.splice( i, 1 );
+                                       timers.splice( index, 1 );
                                }
                        }
 
@@ -8657,11 +8760,11 @@ jQuery.extend({
        },
 
        easing: {
-               linear: function( p, n, firstNum, diff ) {
-                       return firstNum + diff * p;
+               linear: function( p ) {
+                       return p;
                },
-               swing: function( p, n, firstNum, diff ) {
-                       return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+               swing: function( p ) {
+                       return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
                }
        },
 
@@ -8719,8 +8822,12 @@ jQuery.fx.prototype = {
                t.queue = this.options.queue;
                t.elem = this.elem;
                t.saveState = function() {
-                       if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
-                               jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+                       if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+                               if ( self.options.hide ) {
+                                       jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+                               } else if ( self.options.show ) {
+                                       jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+                               }
                        }
                };
 
@@ -8887,12 +8994,14 @@ jQuery.extend( jQuery.fx, {
        }
 });
 
-// Adds width/height step functions
-// Do not set anything below 0
-jQuery.each([ "width", "height" ], function( i, prop ) {
-       jQuery.fx.step[ prop ] = function( fx ) {
-               jQuery.style( fx.elem, prop, Math.max(0, fx.now) );
-       };
+// Ensure props that can't be negative don't go there on undershoot easing
+jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
+       // exclude marginTop, marginLeft, marginBottom and marginRight from this list
+       if ( prop.indexOf( "margin" ) ) {
+               jQuery.fx.step[ prop ] = function( fx ) {
+                       jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+               };
+       }
 });
 
 if ( jQuery.expr && jQuery.expr.filters ) {
@@ -8929,7 +9038,7 @@ function defaultDisplay( nodeName ) {
                        // document to it; WebKit & Firefox won't allow reusing the iframe document.
                        if ( !iframeDoc || !iframe.createElement ) {
                                iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-                               iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+                               iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
                                iframeDoc.close();
                        }
 
@@ -8951,41 +9060,23 @@ function defaultDisplay( nodeName ) {
 
 
 
-var rtable = /^t(?:able|d|h)$/i,
+var getOffset,
+       rtable = /^t(?:able|d|h)$/i,
        rroot = /^(?:body|html)$/i;
 
 if ( "getBoundingClientRect" in document.documentElement ) {
-       jQuery.fn.offset = function( options ) {
-               var elem = this[0], box;
-
-               if ( options ) {
-                       return this.each(function( i ) {
-                               jQuery.offset.setOffset( this, options, i );
-                       });
-               }
-
-               if ( !elem || !elem.ownerDocument ) {
-                       return null;
-               }
-
-               if ( elem === elem.ownerDocument.body ) {
-                       return jQuery.offset.bodyOffset( elem );
-               }
-
+       getOffset = function( elem, doc, docElem, box ) {
                try {
                        box = elem.getBoundingClientRect();
                } catch(e) {}
 
-               var doc = elem.ownerDocument,
-                       docElem = doc.documentElement;
-
                // Make sure we're not dealing with a disconnected DOM node
                if ( !box || !jQuery.contains( docElem, elem ) ) {
                        return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
                }
 
                var body = doc.body,
-                       win = getWindow(doc),
+                       win = getWindow( doc ),
                        clientTop  = docElem.clientTop  || body.clientTop  || 0,
                        clientLeft = docElem.clientLeft || body.clientLeft || 0,
                        scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
@@ -8997,28 +9088,10 @@ if ( "getBoundingClientRect" in document.documentElement ) {
        };
 
 } else {
-       jQuery.fn.offset = function( options ) {
-               var elem = this[0];
-
-               if ( options ) {
-                       return this.each(function( i ) {
-                               jQuery.offset.setOffset( this, options, i );
-                       });
-               }
-
-               if ( !elem || !elem.ownerDocument ) {
-                       return null;
-               }
-
-               if ( elem === elem.ownerDocument.body ) {
-                       return jQuery.offset.bodyOffset( elem );
-               }
-
+       getOffset = function( elem, doc, docElem ) {
                var computedStyle,
                        offsetParent = elem.offsetParent,
                        prevOffsetParent = elem,
-                       doc = elem.ownerDocument,
-                       docElem = doc.documentElement,
                        body = doc.body,
                        defaultView = doc.defaultView,
                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
@@ -9069,6 +9142,29 @@ if ( "getBoundingClientRect" in document.documentElement ) {
        };
 }
 
+jQuery.fn.offset = function( options ) {
+       if ( arguments.length ) {
+               return options === undefined ?
+                       this :
+                       this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+       }
+
+       var elem = this[0],
+               doc = elem && elem.ownerDocument;
+
+       if ( !doc ) {
+               return null;
+       }
+
+       if ( elem === doc.body ) {
+               return jQuery.offset.bodyOffset( elem );
+       }
+
+       return getOffset( elem, doc, doc.documentElement );
+};
+
 jQuery.offset = {
 
        bodyOffset: function( body ) {
@@ -9174,42 +9270,30 @@ jQuery.fn.extend({
 
 
 // Create scrollLeft and scrollTop methods
-jQuery.each( ["Left", "Top"], function( i, name ) {
-       var method = "scroll" + name;
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+       var top = /Y/.test( prop );
 
        jQuery.fn[ method ] = function( val ) {
-               var elem, win;
+               return jQuery.access( this, function( elem, method, val ) {
+                       var win = getWindow( elem );
 
-               if ( val === undefined ) {
-                       elem = this[ 0 ];
-
-                       if ( !elem ) {
-                               return null;
+                       if ( val === undefined ) {
+                               return win ? (prop in win) ? win[ prop ] :
+                                       jQuery.support.boxModel && win.document.documentElement[ method ] ||
+                                               win.document.body[ method ] :
+                                       elem[ method ];
                        }
 
-                       win = getWindow( elem );
-
-                       // Return the scroll offset
-                       return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
-                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
-                                       win.document.body[ method ] :
-                               elem[ method ];
-               }
-
-               // Set the scroll offset
-               return this.each(function() {
-                       win = getWindow( this );
-
                        if ( win ) {
                                win.scrollTo(
-                                       !i ? val : jQuery( win ).scrollLeft(),
-                                        i ? val : jQuery( win ).scrollTop()
+                                       !top ? val : jQuery( win ).scrollLeft(),
+                                        top ? val : jQuery( win ).scrollTop()
                                );
 
                        } else {
-                               this[ method ] = val;
+                               elem[ method ] = val;
                        }
-               });
+               }, method, val, arguments.length, null );
        };
 });
 
@@ -9225,9 +9309,10 @@ function getWindow( elem ) {
 
 
 // Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function( i, name ) {
-
-       var type = name.toLowerCase();
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       var clientProp = "client" + name,
+               scrollProp = "scroll" + name,
+               offsetProp = "offset" + name;
 
        // innerHeight and innerWidth
        jQuery.fn[ "inner" + name ] = function() {
@@ -9249,58 +9334,78 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
                        null;
        };
 
-       jQuery.fn[ type ] = function( size ) {
-               // Get window width or height
-               var elem = this[0];
-               if ( !elem ) {
-                       return size == null ? null : this;
-               }
-
-               if ( jQuery.isFunction( size ) ) {
-                       return this.each(function( i ) {
-                               var self = jQuery( this );
-                               self[ type ]( size.call( this, i, self[ type ]() ) );
-                       });
-               }
+       jQuery.fn[ type ] = function( value ) {
+               return jQuery.access( this, function( elem, type, value ) {
+                       var doc, docElemProp, orig, ret;
+
+                       if ( jQuery.isWindow( elem ) ) {
+                               // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+                               doc = elem.document;
+                               docElemProp = doc.documentElement[ clientProp ];
+                               return jQuery.support.boxModel && docElemProp ||
+                                       doc.body && doc.body[ clientProp ] || docElemProp;
+                       }
+
+                       // Get document width or height
+                       if ( elem.nodeType === 9 ) {
+                               // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                               doc = elem.documentElement;
+
+                               // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
+                               // so we can't use max, as it'll choose the incorrect offset[Width/Height]
+                               // instead we use the correct client[Width/Height]
+                               // support:IE6
+                               if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
+                                       return doc[ clientProp ];
+                               }
 
-               if ( jQuery.isWindow( elem ) ) {
-                       // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
-                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
-                       var docElemProp = elem.document.documentElement[ "client" + name ],
-                               body = elem.document.body;
-                       return elem.document.compatMode === "CSS1Compat" && docElemProp ||
-                               body && body[ "client" + name ] || docElemProp;
-
-               // Get document width or height
-               } else if ( elem.nodeType === 9 ) {
-                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
-                       return Math.max(
-                               elem.documentElement["client" + name],
-                               elem.body["scroll" + name], elem.documentElement["scroll" + name],
-                               elem.body["offset" + name], elem.documentElement["offset" + name]
-                       );
+                               return Math.max(
+                                       elem.body[ scrollProp ], doc[ scrollProp ],
+                                       elem.body[ offsetProp ], doc[ offsetProp ]
+                               );
+                       }
 
-               // Get or set width or height on the element
-               } else if ( size === undefined ) {
-                       var orig = jQuery.css( elem, type ),
+                       // Get width or height on the element
+                       if ( value === undefined ) {
+                               orig = jQuery.css( elem, type );
                                ret = parseFloat( orig );
+                               return jQuery.isNumeric( ret ) ? ret : orig;
+                       }
 
-                       return jQuery.isNumeric( ret ) ? ret : orig;
-
-               // Set the width or height on the element (default to pixels if value is unitless)
-               } else {
-                       return this.css( type, typeof size === "string" ? size : size + "px" );
-               }
+                       // Set the width or height on the element
+                       jQuery( elem ).css( type, value );
+               }, type, value, arguments.length, null );
        };
-
 });
 
 
+
+
 // Expose jQuery to the global object
 window.jQuery = window.$ = jQuery;
-})( window );/**
- * @license AngularJS v1.0.0rc5
- * (c) 2010-2011 AngularJS http://angularjs.org
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
+
+
+
+})( window );
+/**
+ * @license AngularJS v1.0.0rc6
+ * (c) 2010-2012 Google, Inc. http://angularjs.org
  * License: MIT
  */
 (function(window, document){
@@ -9308,9 +9413,6 @@ window.jQuery = window.$ = jQuery;
 
 ////////////////////////////////////
 
-if (typeof document.getAttribute == 'undefined')
-  document.getAttribute = function() {};
-
 /**
  * @ngdoc function
  * @name angular.lowercase
@@ -10546,11 +10648,11 @@ function setupModuleLoader(window) {
  * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
  */
 var version = {
-  full: '1.0.0rc5',    // all of these placeholder strings will be replaced by rake's
+  full: '1.0.0rc6',    // all of these placeholder strings will be replaced by rake's
   major: 1,    // compile task
   minor: 0,
   dot: 0,
-  codeName: 'reality-distortion'
+  codeName: 'runny-nose'
 };
 
 
@@ -12665,7 +12767,7 @@ function $TemplateCacheProvider() {
  * Calling the linking function returns the element of the template. It is either the original element
  * passed in, or the clone of the element if the `cloneAttachFn` is provided.
  *
- * After linking the view is not updateh until after a call to $digest which typically is done by
+ * After linking the view is not updated until after a call to $digest which typically is done by
  * Angular automatically.
  *
  * If you need access to the bound view, there are two ways to do it:
@@ -13042,12 +13144,17 @@ function $CompileProvider($provide) {
           addTextInterpolateDirective(directives, node.nodeValue);
           break;
         case 8: /* Comment */
-          match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);
-          if (match) {
-            nName = directiveNormalize(match[1]);
-            if (addDirective(directives, nName, 'M', maxPriority)) {
-              attrs[nName] = trim(match[2]);
+          try {
+            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);
+            if (match) {
+              nName = directiveNormalize(match[1]);
+              if (addDirective(directives, nName, 'M', maxPriority)) {
+                attrs[nName] = trim(match[2]);
+              }
             }
+          } catch (e) {
+            // turns out that under some circumstances IE9 throws errors when one attempts to read comment's node value.
+            // Just ignore it and continue. (Can't seem to reproduce in test case.)
           }
           break;
       }
@@ -20564,7 +20671,7 @@ var ngValueDirective = [function() {
  *
  * Once scenario in which the use of `ngBind` is prefered over `{{ expression }}` binding is when
  * it's desirable to put bindings into template that is momentarily displayed by the browser in its
- * raw state before Angular compiles it. Since `ngBind` is an element attribute, it makes make the
+ * raw state before Angular compiles it. Since `ngBind` is an element attribute, it makes the
  * bindings invisible to the user while the page is loading.
  *
  * An alternative solution to this problem would be using the
@@ -20674,7 +20781,7 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
  * {@link angular.module.ng.$compileProvider.directive.ngBindHtml ngBindHtml} directive is too
  * restrictive and when you absolutely trust the source of the content you are binding to.
  *
- * See {@link angular.module.ng.$sanitize $sanitize} docs for examples.
+ * See {@link angular.module.ngSanitize.$sanitize $sanitize} docs for examples.
  *
  * @element ANY
  * @param {expression} ngBindHtmlUnsafe {@link guide/dev_guide.expressions Expression} to evaluate.
@@ -22282,8 +22389,11 @@ var scriptDirective = ['$templateCache', function($templateCache) {
     terminal: true,
     compile: function(element, attr) {
       if (attr.type == 'text/ng-template') {
-        var templateUrl = attr.id;
-        $templateCache.put(templateUrl, element.text());
+        var templateUrl = attr.id,
+            // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent
+            text = element[0].text;
+
+        $templateCache.put(templateUrl, text);
       }
     }
   };
@@ -22311,16 +22421,10 @@ var scriptDirective = ['$templateCache', function($templateCache) {
  * be nested into the `<select>` element. This element will then represent `null` or "not selected"
  * option. See example below for demonstration.
  *
- * Note: `ngOptions` provides iterator facility for `<option>` element which must be used instead
- * of {@link angular.module.ng.$compileProvider.directive.ngRepeat ngRepeat}. `ngRepeat` is not
- * suitable for use with `<option>` element because of the following reasons:
- *
- *   * value attribute of the option element that we need to bind to requires a string, but the
- *     source of data for the iteration might be in a form of array containing objects instead of
- *     strings
- *   * {@link angular.module.ng.$compileProvider.directive.ngRepeat ngRepeat} unrolls after the
-  *    select binds causing incorect rendering on most browsers.
- *   * binding to a value not in list confuses most browsers.
+ * Note: `ngOptions` provides iterator facility for `<option>` element which should be used instead
+ * of {@link angular.module.ng.$compileProvider.directive.ngRepeat ngRepeat} when you want the
+ * `select` model to be bound to a non-string value. This is because an option element can currently
+ * be bound to string values only.
  *
  * @param {string} name assignable expression to data-bind to.
  * @param {string=} required The control is considered valid only if value is entered.
@@ -22381,11 +22485,11 @@ var scriptDirective = ['$templateCache', function($templateCache) {
           <select ng-model="color" ng-options="c.name for c in colors"></select><br>
 
           Color (null allowed):
-          <div  class="nullable">
+          <span  class="nullable">
             <select ng-model="color" ng-options="c.name for c in colors">
               <option value="">-- chose color --</option>
             </select>
-          </div><br/>
+          </span><br/>
 
           Color grouped by shade:
           <select ng-model="color" ng-options="c.name group by c.shade for c in colors">
@@ -22415,49 +22519,136 @@ var scriptDirective = ['$templateCache', function($templateCache) {
 var ngOptionsDirective = valueFn({ terminal: true });
 var selectDirective = ['$compile', '$parse', function($compile,   $parse) {
                          //00001111100000000000222200000000000000000000003333000000000000044444444444444444000000000555555555555555550000000666666666666666660000000000000007777
-  var NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*)$/;
+  var NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w\d]*)|(?:\(\s*([\$\w][\$\w\d]*)\s*,\s*([\$\w][\$\w\d]*)\s*\)))\s+in\s+(.*)$/,
+      nullModelCtrl = {$setViewValue: noop};
 
   return {
     restrict: 'E',
-    require: '?ngModel',
-    link: function(scope, element, attr, ctrl) {
-      if (!ctrl) return;
+    require: ['select', '?ngModel'],
+    controller: ['$element', '$scope', function($element, $scope) {
+      var self = this,
+          optionsMap = {},
+          ngModelCtrl = nullModelCtrl,
+          nullOption,
+          unknownOption;
+
+      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {
+        ngModelCtrl = ngModelCtrl_;
+        nullOption = nullOption_;
+        unknownOption = unknownOption_;
+      }
+
+
+      self.addOption = function(value) {
+        optionsMap[value] = true;
+
+        if (ngModelCtrl.$viewValue == value) {
+          $element.val(value);
+          if (unknownOption.parent()) unknownOption.remove();
+        }
+      };
+
+
+      self.removeOption = function(value) {
+        if (this.hasOption(value)) {
+          delete optionsMap[value];
+          if (ngModelCtrl.$viewValue == value) {
+            this.renderUnknownOption(value);
+          }
+        }
+      };
+
+
+      self.renderUnknownOption = function(val) {
+        var unknownVal = '? ' + hashKey(val) + ' ?';
+        unknownOption.val(unknownVal);
+        $element.prepend(unknownOption);
+        $element.val(unknownVal);
+        unknownOption.prop('selected', true); // needed for IE
+      }
+
+
+      self.hasOption = function(value) {
+        return optionsMap.hasOwnProperty(value);
+      }
+
+      $scope.$on('$destroy', function() {
+        // disable unknown option so that we don't do work when the whole select is being destroyed
+        self.renderUnknownOption = noop;
+      });
+    }],
+
+    link: function(scope, element, attr, ctrls) {
+      // if ngModel is not defined, we don't need to do anything
+      if (!ctrls[1]) return;
+
+      var selectCtrl = ctrls[0],
+          ngModelCtrl = ctrls[1],
+          multiple = attr.multiple,
+          optionsExp = attr.ngOptions,
+          nullOption = false, // if false, user will not be able to select it (used by ngOptions)
+          emptyOption,
+          // we can't just jqLite('<option>') since jqLite is not smart enough
+          // to create it in <select> and IE barfs otherwise.
+          optionTemplate = jqLite(document.createElement('option')),
+          optGroupTemplate =jqLite(document.createElement('optgroup')),
+          unknownOption = optionTemplate.clone();
+
+      // find "null" option
+      for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {
+        if (children[i].value == '') {
+          emptyOption = nullOption = children.eq(i);
+          break;
+        }
+      }
 
-      var multiple = attr.multiple,
-          optionsExp = attr.ngOptions;
+      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);
 
       // required validator
       if (multiple && (attr.required || attr.ngRequired)) {
         var requiredValidator = function(value) {
-          ctrl.$setValidity('required', !attr.required || (value && value.length));
+          ngModelCtrl.$setValidity('required', !attr.required || (value && value.length));
           return value;
         };
 
-        ctrl.$parsers.push(requiredValidator);
-        ctrl.$formatters.unshift(requiredValidator);
+        ngModelCtrl.$parsers.push(requiredValidator);
+        ngModelCtrl.$formatters.unshift(requiredValidator);
 
         attr.$observe('required', function() {
-          requiredValidator(ctrl.$viewValue);
+          requiredValidator(ngModelCtrl.$viewValue);
         });
       }
 
-      if (optionsExp) Options(scope, element, ctrl);
-      else if (multiple) Multiple(scope, element, ctrl);
-      else Single(scope, element, ctrl);
+      if (optionsExp) Options(scope, element, ngModelCtrl);
+      else if (multiple) Multiple(scope, element, ngModelCtrl);
+      else Single(scope, element, ngModelCtrl, selectCtrl);
 
 
       ////////////////////////////
 
 
 
-      function Single(scope, selectElement, ctrl) {
-        ctrl.$render = function() {
-          selectElement.val(ctrl.$viewValue);
+      function Single(scope, selectElement, ngModelCtrl, selectCtrl) {
+        ngModelCtrl.$render = function() {
+          var viewValue = ngModelCtrl.$viewValue;
+
+          if (selectCtrl.hasOption(viewValue)) {
+            if (unknownOption.parent()) unknownOption.remove();
+            selectElement.val(viewValue);
+            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy
+          } else {
+            if (isUndefined(viewValue) && emptyOption) {
+              selectElement.val('');
+            } else {
+              selectCtrl.renderUnknownOption(viewValue);
+            }
+          }
         };
 
         selectElement.bind('change', function() {
           scope.$apply(function() {
-            ctrl.$setViewValue(selectElement.val());
+            if (unknownOption.parent()) unknownOption.remove();
+            ngModelCtrl.$setViewValue(selectElement.val());
           });
         });
       }
@@ -22508,26 +22699,26 @@ var selectDirective = ['$compile', '$parse', function($compile,   $parse) {
             groupByFn = $parse(match[3] || ''),
             valueFn = $parse(match[2] ? match[1] : valueName),
             valuesFn = $parse(match[7]),
-            // we can't just jqLite('<option>') since jqLite is not smart enough
-            // to create it in <select> and IE barfs otherwise.
-            optionTemplate = jqLite(document.createElement('option')),
-            optGroupTemplate = jqLite(document.createElement('optgroup')),
-            nullOption = false, // if false then user will not be able to select it
             // This is an array of array of existing option groups in DOM. We try to reuse these if possible
             // optionGroupsCache[0] is the options with no option group
             // optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element
             optionGroupsCache = [[{element: selectElement, label:''}]];
 
-        // find existing special options
-        forEach(selectElement.children(), function(option) {
-          if (option.value == '') {
-            // developer declared null option, so user should be able to select it
-            nullOption = jqLite(option).remove();
-            // compile the element since there might be bindings in it
-            $compile(nullOption)(scope);
-          }
-        });
-        selectElement.html(''); // clear contents
+        if (nullOption) {
+          // compile the element since there might be bindings in it
+          $compile(nullOption)(scope);
+
+          // remove the class, which is added automatically because we recompile the element and it
+          // becomes the compilation root
+          nullOption.removeClass('ng-scope');
+
+          // we need to remove it before calling selectElement.html('') because otherwise IE will
+          // remove the label from the element. wtf?
+          nullOption.remove();
+        }
+
+        // clear contents, we'll add what's needed based on the model
+        selectElement.html('');
 
         selectElement.bind('change', function() {
           scope.$apply(function() {
@@ -22539,8 +22730,8 @@ var selectDirective = ['$compile', '$parse', function($compile,   $parse) {
             if (multiple) {
               value = [];
               for (groupIndex = 0, groupLength = optionGroupsCache.length;
-              groupIndex < groupLength;
-              groupIndex++) {
+                   groupIndex < groupLength;
+                   groupIndex++) {
                 // list of options for that group. (first item has the parent)
                 optionGroup = optionGroupsCache[groupIndex];
 
@@ -22654,7 +22845,7 @@ var selectDirective = ['$compile', '$parse', function($compile,   $parse) {
               }
             }
 
-            lastElement = null;  // start at the begining
+            lastElement = null;  // start at the beginning
             for(index = 0, length = optionGroup.length; index < length; index++) {
               option = optionGroup[index];
               if ((existingOption = existingOptions[index+1])) {
@@ -22720,19 +22911,34 @@ var optionDirective = ['$interpolate', function($interpolate) {
   return {
     restrict: 'E',
     priority: 100,
+    require: '^select',
     compile: function(element, attr) {
       if (isUndefined(attr.value)) {
         var interpolateFn = $interpolate(element.text(), true);
-        if (interpolateFn) {
-          return function (scope, element, attr) {
-            scope.$watch(interpolateFn, function(value) {
-              attr.$set('value', value);
-            });
-          }
-        } else {
+        if (!interpolateFn) {
           attr.$set('value', element.text());
         }
       }
+
+      // For some reason Opera defaults to true and if not overridden this messes up the repeater.
+      // We don't want the view to drive the initialization of the model anyway.
+      element.prop('selected', false);
+
+      return function (scope, element, attr, selectCtrl) {
+        if (interpolateFn) {
+          scope.$watch(interpolateFn, function(newVal, oldVal) {
+            attr.$set('value', newVal);
+            if (newVal !== oldVal) selectCtrl.removeOption(oldVal);
+            selectCtrl.addOption(newVal);
+          });
+        } else {
+          selectCtrl.addOption(attr.value);
+        }
+
+        element.bind('$destroy', function() {
+          selectCtrl.removeOption(attr.value);
+        });
+      };
     }
   }
 }];