text: var jQuery = (function() {
  
  // Define a local copy of jQuery
  var jQuery = function( selector, context ) {
  		// The jQuery object is actually just the init constructor 'enhanced'
  		return new jQuery.fn.init( selector, context );
  	},
  
  	// Map over jQuery in case of overwrite
  	_jQuery = window.jQuery,
  
  	// Map over the $ in case of overwrite
  	_$ = window.$,
  
  	// A central reference to the root jQuery(document)
  	rootjQuery,
  
  	// A simple way to check for HTML strings or ID strings
  	// (both of which we optimize for)
  	quickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,
  
  	// Is it a simple selector
  	isSimple = /^.[^:#\[\.,]*$/,
  
  	// Check if a string has a non-whitespace character in it
  	rnotwhite = /\S/,
  	rwhite = /\s/,
  
  	// Used for trimming whitespace
  	trimLeft = /^\s+/,
  	trimRight = /\s+$/,
  
  	// Check for non-word characters
  	rnonword = /\W/,
  
  	// Check for digits
  	rdigit = /\d/,
  
  	// Match a standalone tag
  	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
  
  	// JSON RegExp
  	rvalidchars = /^[\],:{}\s]*$/,
  	rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
  	rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
  	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
  
  	// Useragent RegExp
  	rwebkit = /(webkit)[ \/]([\w.]+)/,
  	ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
  	rmsie = /(msie) ([\w.]+)/,
  	rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
  
  	// Keep a UserAgent string for use with jQuery.browser
  	userAgent = navigator.userAgent,
  
  	// For matching the engine and version of the browser
  	browserMatch,
  	
  	// Has the ready events already been bound?
  	readyBound = false,
  	
  	// The functions to execute on DOM ready
  	readyList = [],
  
  	// The ready event handler
  	DOMContentLoaded,
  
  	// Save a reference to some core methods
  	toString = Object.prototype.toString,
  	hasOwn = Object.prototype.hasOwnProperty,
  	push = Array.prototype.push,
  	slice = Array.prototype.slice,
  	trim = String.prototype.trim,
  	indexOf = Array.prototype.indexOf,
  	
  	// [[Class]] -> type pairs
  	class2type = {};
  
  jQuery.fn = jQuery.prototype = {
  	init: function( selector, context ) {
  		var match, elem, ret, doc;
  
  		// Handle $(""), $(null), or $(undefined)
  		if ( !selector ) {
  			return this;
  		}
  
  		// Handle $(DOMElement)
  		if ( selector.nodeType ) {
  			this.context = this[0] = selector;
  			this.length = 1;
  			return this;
  		}
  		
  		// The body element only exists once, optimize finding it
  		if ( selector === "body" && !context && document.body ) {
  			this.context = document;
  			this[0] = document.body;
  			this.selector = "body";
  			this.length = 1;
  			return this;
  		}
  
  		// Handle HTML strings
  		if ( typeof selector === "string" ) {
  			// Are we dealing with HTML string or an ID?
  			match = quickExpr.exec( selector );
  
  			// Verify a match, and that no context was specified for #id
  			if ( match && (match[1] || !context) ) {
  
  				// HANDLE: $(html) -> $(array)
  				if ( match[1] ) {
  					doc = (context ? context.ownerDocument || context : document);
  
  					// If a single string is passed in and it's a single tag
  					// just do a createElement and skip the rest
  					ret = rsingleTag.exec( selector );
  
  					if ( ret ) {
  						if ( jQuery.isPlainObject( context ) ) {
  							selector = [ document.createElement( ret[1] ) ];
  							jQuery.fn.attr.call( selector, context, true );
  
  						} else {
  							selector = [ doc.createElement( ret[1] ) ];
  						}
  
  					} else {
  						ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
  						selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
  					}
  					
  					return jQuery.merge( this, selector );
  					
  				// HANDLE: $("#id")
  				} else {
  					elem = document.getElementById( match[2] );
  
  					// Check parentNode to catch when Blackberry 4.6 returns
  					// nodes that are no longer in the document #6963
  					if ( elem && elem.parentNode ) {
  						// Handle the case where IE and Opera return items
  						// by name instead of ID
  						if ( elem.id !== match[2] ) {
  							return rootjQuery.find( selector );
  						}
  
  						// Otherwise, we inject the element directly into the jQuery object
  						this.length = 1;
  						this[0] = elem;
  					}
  
  					this.context = document;
  					this.selector = selector;
  					return this;
  				}
  
  			// HANDLE: $("TAG")
  			} else if ( !context && !rnonword.test( selector ) ) {
  				this.selector = selector;
  				this.context = document;
  				selector = document.getElementsByTagName( selector );
  				return jQuery.merge( this, selector );
  
  			// HANDLE: $(expr, $(...))
  			} else if ( !context || context.jquery ) {
  				return (context || rootjQuery).find( selector );
  
  			// HANDLE: $(expr, context)
  			// (which is just equivalent to: $(context).find(expr)
  			} else {
  				return jQuery( context ).find( selector );
  			}
  
  		// HANDLE: $(function)
  		// Shortcut for document ready
  		} else if ( jQuery.isFunction( selector ) ) {
  			return rootjQuery.ready( selector );
  		}
  
  		if (selector.selector !== undefined) {
  			this.selector = selector.selector;
  			this.context = selector.context;
  		}
  
  		return jQuery.makeArray( selector, this );
  	},
  
  	// Start with an empty selector
  	selector: "",
  
  	// The current version of jQuery being used
  	jquery: "@VERSION",
  
  	// The default length of a jQuery object is 0
  	length: 0,
  
  	// The number of elements contained in the matched element set
  	size: function() {
  		return this.length;
  	},
  
  	toArray: function() {
  		return slice.call( this, 0 );
  	},
  
  	// Get the Nth element in the matched element set OR
  	// Get the whole matched element set as a clean array
  	get: function( num ) {
  		return num == null ?
  
  			// Return a 'clean' array
  			this.toArray() :
  
  			// Return just the object
  			( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
  	},
  
  	// Take an array of elements and push it onto the stack
  	// (returning the new matched element set)
  	pushStack: function( elems, name, selector ) {
  		// Build a new jQuery matched element set
  		var ret = jQuery();
  
  		if ( jQuery.isArray( elems ) ) {
  			push.apply( ret, elems );
  		
  		} else {
  			jQuery.merge( ret, elems );
  		}
  
  		// Add the old object onto the stack (as a reference)
  		ret.prevObject = this;
  
  		ret.context = this.context;
  
  		if ( name === "find" ) {
  			ret.selector = this.selector + (this.selector ? " " : "") + selector;
  		} else if ( name ) {
  			ret.selector = this.selector + "." + name + "(" + selector + ")";
  		}
  
  		// Return the newly-formed element set
  		return ret;
  	},
  
  	// Execute a callback for every element in the matched set.
  	// (You can seed the arguments with an array of args, but this is
  	// only used internally.)
  	each: function( callback, args ) {
  		return jQuery.each( this, callback, args );
  	},
  	
  	ready: function( fn ) {
  		// Attach the listeners
  		jQuery.bindReady();
  
  		// If the DOM is already ready
  		if ( jQuery.isReady ) {
  			// Execute the function immediately
  			fn.call( document, jQuery );
  
  		// Otherwise, remember the function for later
  		} else if ( readyList ) {
  			// Add the function to the wait list
  			readyList.push( fn );
  		}
  
  		return this;
  	},
  	
  	eq: function( i ) {
  		return i === -1 ?
  			this.slice( i ) :
  			this.slice( i, +i + 1 );
  	},
  
  	first: function() {
  		return this.eq( 0 );
  	},
  
  	last: function() {
  		return this.eq( -1 );
  	},
  
  	slice: function() {
  		return this.pushStack( slice.apply( this, arguments ),
  			"slice", slice.call(arguments).join(",") );
  	},
  
  	map: function( callback ) {
  		return this.pushStack( jQuery.map(this, function( elem, i ) {
  			return callback.call( elem, i, elem );
  		}));
  	},
  	
  	end: function() {
  		return this.prevObject || jQuery(null);
  	},
  
  	// For internal use only.
  	// Behaves like an Array's method, not like a jQuery method.
  	push: push,
  	sort: [].sort,
  	splice: [].splice
  };
  
  // Give the init function the jQuery prototype for later instantiation
  jQuery.fn.init.prototype = jQuery.fn;
  
  jQuery.extend = jQuery.fn.extend = function() {
  	// copy reference to target object
  	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy, copyIsArray, clone;
  
  	// Handle a deep copy situation
  	if ( typeof target === "boolean" ) {
  		deep = target;
  		target = arguments[1] || {};
  		// skip the boolean and the target
  		i = 2;
  	}
  
  	// Handle case when target is a string or something (possible in deep copy)
  	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
  		target = {};
  	}
  
  	// extend jQuery itself if only one argument is passed
  	if ( length === i ) {
  		target = this;
  		--i;
  	}
  
  	for ( ; i < length; i++ ) {
  		// Only deal with non-null/undefined values
  		if ( (options = arguments[ i ]) != null ) {
  			// Extend the base object
  			for ( name in options ) {
  				src = target[ name ];
  				copy = options[ name ];
  
  				// Prevent never-ending loop
  				if ( target === copy ) {
  					continue;
  				}
  
  				// Recurse if we're merging plain objects or arrays
  				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
  					if ( copyIsArray ) {
  						copyIsArray = false;
  						clone = src && jQuery.isArray(src) ? src : [];
  
  					} else {
  						clone = src && jQuery.isPlainObject(src) ? src : {};
  					}
  
  					// Never move original objects, clone them
  					target[ name ] = jQuery.extend( deep, clone, copy );
  
  				// Don't bring in undefined values
  				} else if ( copy !== undefined ) {
  					target[ name ] = copy;
  				}
  			}
  		}
  	}
  
  	// Return the modified object
  	return target;
  };
  
  jQuery.extend({
  	noConflict: function( deep ) {
  		window.$ = _$;
  
  		if ( deep ) {
  			window.jQuery = _jQuery;
  		}
  
  		return jQuery;
  	},
  	
  	// Is the DOM ready to be used? Set to true once it occurs.
  	isReady: false,
  
  	// A counter to track how many items to wait for before
  	// the ready event fires. See #6781
  	readyWait: 1,
  	
  	// Handle when the DOM is ready
  	ready: function( wait ) {
  		// A third-party is pushing the ready event forwards
  		if ( wait === true ) {
  			jQuery.readyWait--;
  		}
  
  		// Make sure that the DOM is not already loaded
  		if ( !jQuery.readyWait || (wait !== true && !jQuery.isReady) ) {
  			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
  			if ( !document.body ) {
  				return setTimeout( jQuery.ready, 1 );
  			}
  
  			// Remember that the DOM is ready
  			jQuery.isReady = true;
  
  			// If a normal DOM Ready event fired, decrement, and wait if need be
  			if ( wait !== true && --jQuery.readyWait > 0 ) {
  				return;
  			}
  
  			// If there are functions bound, to execute
  			if ( readyList ) {
  				// Execute all of them
  				var fn, i = 0;
  				while ( (fn = readyList[ i++ ]) ) {
  					fn.call( document, jQuery );
  				}
  
  				// Reset the list of functions
  				readyList = null;
  			}
  
  			// Trigger any bound ready events
  			if ( jQuery.fn.trigger ) {
  				jQuery( document ).trigger( "ready" ).unbind( "ready" );
  			}
  		}
  	},
  	
  	bindReady: function() {
  		if ( readyBound ) {
  			return;
  		}
  
  		readyBound = true;
  
  		// Catch cases where $(document).ready() is called after the
  		// browser event has already occurred.
  		if ( document.readyState === "complete" ) {
  			// Handle it asynchronously to allow scripts the opportunity to delay ready
  			return setTimeout( jQuery.ready, 1 );
  		}
  
  		// Mozilla, Opera and webkit nightlies currently support this event
  		if ( document.addEventListener ) {
  			// Use the handy event callback
  			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
  			
  			// A fallback to window.onload, that will always work
  			window.addEventListener( "load", jQuery.ready, false );
  
  		// If IE event model is used
  		} else if ( document.attachEvent ) {
  			// ensure firing before onload,
  			// maybe late but safe also for iframes
  			document.attachEvent("onreadystatechange", DOMContentLoaded);
  			
  			// A fallback to window.onload, that will always work
  			window.attachEvent( "onload", jQuery.ready );
  
  			// If IE and not a frame
  			// continually check to see if the document is ready
  			var toplevel = false;
  
  			try {
  				toplevel = window.frameElement == null;
  			} catch(e) {}
  
  			if ( document.documentElement.doScroll && toplevel ) {
  				doScrollCheck();
  			}
  		}
  	},
  
  	// See test/unit/core.js for details concerning isFunction.
  	// Since version 1.3, DOM methods and functions like alert
  	// aren't supported. They return false on IE (#2968).
  	isFunction: function( obj ) {
  		return jQuery.type(obj) === "function";
  	},
  
  	isArray: Array.isArray || function( obj ) {
  		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;
  	},
  
  	isNaN: function( obj ) {
  		return obj == null || !rdigit.test( obj ) || isNaN( obj );
  	},
  
  	type: function( obj ) {
  		return obj == null ?
  			String( obj ) :
  			class2type[ toString.call(obj) ] || "object";
  	},
  
  	isPlainObject: function( obj ) {
  		// Must be an Object.
  		// Because of IE, we also have to check the presence of the constructor property.
  		// Make sure that DOM nodes and window objects don't pass through, as well
  		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
  			return false;
  		}
  		
  		// Not own constructor property must be Object
  		if ( obj.constructor &&
  			!hasOwn.call(obj, "constructor") &&
  			!hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
  			return false;
  		}
  		
  		// Own properties are enumerated firstly, so to speed up,
  		// if last one is own, then all properties are own.
  	
  		var key;
  		for ( key in obj ) {}
  		
  		return key === undefined || hasOwn.call( obj, key );
  	},
  
  	isEmptyObject: function( obj ) {
  		for ( var name in obj ) {
  			return false;
  		}
  		return true;
  	},
  	
  	error: function( msg ) {
  		throw msg;
  	},
  	
  	parseJSON: function( data ) {
  		if ( typeof data !== "string" || !data ) {
  			return null;
  		}
  
  		// Make sure leading/trailing whitespace is removed (IE can't handle it)
  		data = jQuery.trim( data );
  		
  		// Make sure the incoming data is actual JSON
  		// Logic borrowed from http://json.org/json2.js
  		if ( rvalidchars.test(data.replace(rvalidescape, "@")
  			.replace(rvalidtokens, "]")
  			.replace(rvalidbraces, "")) ) {
  
  			// Try to use the native JSON parser first
  			return window.JSON && window.JSON.parse ?
  				window.JSON.parse( data ) :
  				(new Function("return " + data))();
  
  		} else {
  			jQuery.error( "Invalid JSON: " + data );
  		}
  	},
  
  	noop: function() {},
  
  	// Evalulates a script in a global context
  	globalEval: function( data ) {
  		if ( data && rnotwhite.test(data) ) {
  			// Inspired by code by Andrea Giammarchi
  			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
  			var head = document.getElementsByTagName("head")[0] || document.documentElement,
  				script = document.createElement("script");
  
  			script.type = "text/javascript";
  
  			if ( jQuery.support.scriptEval ) {
  				script.appendChild( document.createTextNode( data ) );
  			} else {
  				script.text = data;
  			}
  
  			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
  			// This arises when a base node is used (#2709).
  			head.insertBefore( script, head.firstChild );
  			head.removeChild( script );
  		}
  	},
  
  	nodeName: function( elem, name ) {
  		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
  	},
  
  	// args is for internal usage only
  	each: function( object, callback, args ) {
  		var name, i = 0,
  			length = object.length,
  			isObj = length === undefined || jQuery.isFunction(object);
  
  		if ( args ) {
  			if ( isObj ) {
  				for ( name in object ) {
  					if ( callback.apply( object[ name ], args ) === false ) {
  						break;
  					}
  				}
  			} else {
  				for ( ; i < length; ) {
  					if ( callback.apply( object[ i++ ], args ) === false ) {
  						break;
  					}
  				}
  			}
  
  		// A special, fast, case for the most common use of each
  		} else {
  			if ( isObj ) {
  				for ( name in object ) {
  					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
  						break;
  					}
  				}
  			} else {
  				for ( var value = object[0];
  					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
  			}
  		}
  
  		return object;
  	},
  
  	// Use native String.trim function wherever possible
  	trim: trim ?
  		function( text ) {
  			return text == null ?
  				"" :
  				trim.call( text );
  		} :
  
  		// Otherwise use our own trimming functionality
  		function( text ) {
  			return text == null ?
  				"" :
  				text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
  		},
  
  	// results is for internal usage only
  	makeArray: function( array, results ) {
  		var ret = results || [];
  
  		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);
  
  			if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
  				push.call( ret, array );
  			} else {
  				jQuery.merge( ret, array );
  			}
  		}
  
  		return ret;
  	},
  
  	inArray: function( elem, array ) {
  		if ( array.indexOf ) {
  			return array.indexOf( elem );
  		}
  
  		for ( var i = 0, length = array.length; i < length; i++ ) {
  			if ( array[ i ] === elem ) {
  				return i;
  			}
  		}
  
  		return -1;
  	},
  
  	merge: function( first, second ) {
  		var i = first.length, j = 0;
  
  		if ( typeof second.length === "number" ) {
  			for ( var l = second.length; j < l; j++ ) {
  				first[ i++ ] = second[ j ];
  			}
  		
  		} else {
  			while ( second[j] !== undefined ) {
  				first[ i++ ] = second[ j++ ];
  			}
  		}
  
  		first.length = i;
  
  		return first;
  	},
  
  	grep: function( elems, callback, inv ) {
  		var ret = [], retVal;
  		inv = !!inv;
  
  		// Go through the array, only saving the items
  		// that pass the validator function
  		for ( var i = 0, length = elems.length; i < length; i++ ) {
  			retVal = !!callback( elems[ i ], i );
  			if ( inv !== retVal ) {
  				ret.push( elems[ i ] );
  			}
  		}
  
  		return ret;
  	},
  
  	// arg is for internal usage only
  	map: function( elems, callback, arg ) {
  		var ret = [], value;
  
  		// Go through the array, translating each of the items to their
  		// new value (or values).
  		for ( var i = 0, length = elems.length; i < length; i++ ) {
  			value = callback( elems[ i ], i, arg );
  
  			if ( value != null ) {
  				ret[ ret.length ] = value;
  			}
  		}
  
  		return ret.concat.apply( [], ret );
  	},
  
  	// A global GUID counter for objects
  	guid: 1,
  
  	proxy: function( fn, proxy, thisObject ) {
  		if ( arguments.length === 2 ) {
  			if ( typeof proxy === "string" ) {
  				thisObject = fn;
  				fn = thisObject[ proxy ];
  				proxy = undefined;
  
  			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
  				thisObject = proxy;
  				proxy = undefined;
  			}
  		}
  
  		if ( !proxy && fn ) {
  			proxy = function() {
  				return fn.apply( thisObject || this, arguments );
  			};
  		}
  
  		// Set the guid of unique handler to the same of original handler, so it can be removed
  		if ( fn ) {
  			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
  		}
  
  		// So proxy can be declared as an argument
  		return proxy;
  	},
  
  	// Mutifunctional method to get and set values to a collection
  	// The value/s can be optionally by executed if its a function
  	access: function( elems, key, value, exec, fn, pass ) {
  		var length = elems.length;
  	
  		// Setting many attributes
  		if ( typeof key === "object" ) {
  			for ( var k in key ) {
  				jQuery.access( elems, k, key[k], exec, fn, value );
  			}
  			return elems;
  		}
  	
  		// Setting one attribute
  		if ( value !== undefined ) {
  			// Optionally, function values get executed if exec is true
  			exec = !pass && exec && jQuery.isFunction(value);
  		
  			for ( var i = 0; i < length; i++ ) {
  				fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
  			}
  		
  			return elems;
  		}
  	
  		// Getting an attribute
  		return length ? fn( elems[0], key ) : undefined;
  	},
  
  	now: function() {
  		return (new Date()).getTime();
  	},
  
  	// Use of jQuery.browser is frowned upon.
  	// More details: http://docs.jquery.com/Utilities/jQuery.browser
  	uaMatch: function( ua ) {
  		ua = ua.toLowerCase();
  
  		var match = rwebkit.exec( ua ) ||
  			ropera.exec( ua ) ||
  			rmsie.exec( ua ) ||
  			ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
  			[];
  
  		return { browser: match[1] || "", version: match[2] || "0" };
  	},
  
  	browser: {}
  });
  
  // Populate the class2type map
  jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
  	class2type[ "[object " + name + "]" ] = name.toLowerCase();
  });
  
  browserMatch = jQuery.uaMatch( userAgent );
  if ( browserMatch.browser ) {
  	jQuery.browser[ browserMatch.browser ] = true;
  	jQuery.browser.version = browserMatch.version;
  }
  
  // Deprecated, use jQuery.browser.webkit instead
  if ( jQuery.browser.webkit ) {
  	jQuery.browser.safari = true;
  }
  
  if ( indexOf ) {
  	jQuery.inArray = function( elem, array ) {
  		return indexOf.call( array, elem );
  	};
  }
  
  // Verify that \s matches non-breaking spaces
  // (IE fails on this test)
  if ( !rwhite.test( "\xA0" ) ) {
  	trimLeft = /^[\s\xA0]+/;
  	trimRight = /[\s\xA0]+$/;
  }
  
  // All jQuery objects should point back to these
  rootjQuery = jQuery(document);
  
  // Cleanup functions for the document ready method
  if ( document.addEventListener ) {
  	DOMContentLoaded = function() {
  		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
  		jQuery.ready();
  	};
  
  } else if ( document.attachEvent ) {
  	DOMContentLoaded = function() {
  		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
  		if ( document.readyState === "complete" ) {
  			document.detachEvent( "onreadystatechange", DOMContentLoaded );
  			jQuery.ready();
  		}
  	};
  }
  
  // The DOM ready check for Internet Explorer
  function doScrollCheck() {
  	if ( jQuery.isReady ) {
  		return;
  	}
  
  	try {
  		// If IE is used, use the trick by Diego Perini
  		// http://javascript.nwbox.com/IEContentLoaded/
  		document.documentElement.doScroll("left");
  	} catch(e) {
  		setTimeout( doScrollCheck, 1 );
  		return;
  	}
  
  	// and execute any waiting functions
  	jQuery.ready();
  }
  
  // Expose jQuery to the global object
  return (window.jQuery = window.$ = jQuery);
  
  })();
  