CURRENT NEWS AND EVENTS JUNE, 2016

IF YOU HAVE NOT ALREADY DONE SO, PLEASE DO VISIT THE BELOW PETITION AND SIGN FOR ELVIS’ BIRTHDAY TO BE MADE A NATIONAL HOLIDAY.

https://www.change.org/p/us-government-make-january-8th-elvis-presley-s-birthday-of-every-year-a-national-holiday?recruiter=11063340&utm_source=share_petition&utm_medium=email&utm_campaign=share_email_responsive

Choose who must hold the title of the king for 2016!  

Elvis Presley – The King of Music 2015. All Hail The King!

Hall of Fame The King of MusicThe King of Music

PLEASE DON’T FORGET TO VISIT “THE KING OF MUSIC” POLLING SITE AND VOTE FOR ELVIS EVERY SINGLE DAY DURING 2016.  WE SIMPLY CANNOT LET ANYONE ELSE CLAIM ELVIS’ RIGHTFUL TITLE.  BELOW IS THE LINK TO THE SITE FOR VOTING:

http://thekingofmusic.com/

I vote every single day and I hope everyone who reads this will do so also for every day the rest of this year.

Vote for Elvis KingofMusic

Lets make it happen again for this new year of 2016!

<<<<<<<<<<>>>>>>>>>>

MORE GOOD NEWS FOR 2015

Lets make it happen again for this new year of 2016!

The Song of Ages 2015 is Suspicious Minds – Elvis Presley.

Let’s all remember to vote every single day in 2016 for this same song again or any Elvis song which may be added to the list.  Below is the link for voting for the new year.

http://songofages.com/

<<<<<<<<<<<>>>>>>>>>>

SATURDAY, JUNE 4, 2016

There are so many people all over the world whose hearts are sad and heavy today upon hearing of the death of Muhammad Ali and I am certainly one of those.

I have admired, respected and enjoyed him since way back in the days when he was starting out as Cassius Clay.  Truly, he was THE GREATEST in the world of boxing and on the public stage of life.

I want to share something personal to me from Ali back 26 years ago in 1990.  I wrote him a letter of appreciation and respect in October, 1989.  I never had an address for him until then and wrote soon after I did see his address.  The following February, 1990, I received an envelope from him.  He had autographed my letter to him and thanked me for the “great letter”.  He also drew a large heart on a sheet of his personal letterhead stationary with a note to me and his beautiful autograph.  This was the only fan letter that I have ever written to a “living” public figure.  I did not write to Elvis before 1977 because I knew he got so much mail and mine would be only one of a huge pile of mail.  I waited until after he “died” to write to him. LOL

As we all know, Elvis and Ali were very good friends before 1977.  In the second page of my letter, I told Ali that I was so happy that they had been friends and that I could certainly see why they became friends.  My heart hurts for Jesse now because I know that he has so many happy memories of his time with Ali.

I want to share my autographed notes from Ali as my tribute to his memory.  He was a shining example for all of humanity.  A man who stood up for his principles and never backed down.  My everlasting respect to his memory.

Ali's note on my letter to him20160604

Ali's heart message to me20160604

Elvis Presley was the sweetest, most humble and nicest man you’d want to know.
Muhammad Ali

Here is a video of Ali speaking, during an interview, about Elvis.

Muhamad Ali Talks About Elvis

SUNDAY, JUNE 5, 2016

My friend, Elaine, shared this beautiful photo with me on Facebook.  I thank her so much for showing this to me.

Guitar MAN from Facebook

Ali with Vernon

R.I.P Muhammad Ali

Published on Jun 3, 2016

“Elvis was my close personal friend. He came to my Deer Lake training camp about two years before he died. He told us he didn’t want nobody to bother us. He wanted peace and quiet and I gave him a cabin in my camp and nobody even knew it. When the cameras started watching me train, he was up on the hill sleeping in the cabin. Elvis had a robe made for me. I don’t admire nobody, but Elvis Presley was the sweetest, most humble and nicest man you’d want to know.”

Goodbye Ali, The Greatest of All Time
January 17, 1942 – June 3, 2016

www.youtube.com/watch?v=9O2PGtOfVUY&feature=youtu.be

<<<<<<<<<<>>>>>>>>>>>

MONDAY, JUNE 6, 2016

The below is from a page which I used to have on my site years ago:

Linda Hood Sigmon My Website | lindahoodsigmoncom l lindahoodsigmontruth// // <![CDATA[
/*!
* jQuery JavaScript Library v1.4.2
* http://jquery.com/
*
* Copyright 2010, John Resig
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*
* Includes Sizzle.js
* http://sizzlejs.com/
* Copyright 2010, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
* Date: Sat Feb 13 22:33:48 2010 -0500
*/
(function( window, undefined ) {

// 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.jQueryWS,

// Map over the $ in case of overwrite
_$ = window.$,

// Use the correct document accordingly with window argument (sandbox)
document = window.document,

// 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-]+)$/,

// Is it a simple selector
isSimple = /^.[^:#[.,]*$/,

// Check if a string has a non-whitespace character in it
rnotwhite = /S/,

// Used for trimming whitespace
rtrim = /^(s|u00A0)+|(s|u00A0)+$/g,

// Match a standalone tag
rsingleTag = /^(?:)?$/,

// 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,
hasOwnProperty = Object.prototype.hasOwnProperty,
push = Array.prototype.push,
slice = Array.prototype.slice,
indexOf = Array.prototype.indexOf;

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 ) {
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 = 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] );

if ( elem ) {
// 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 && /^w+$/.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: “1.4.2”,

// 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;

// 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 object literal values or arrays
if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
: jQuery.isArray(copy) ? [] : {};

// 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.jQueryWS = _jQuery;
}

return jQuery;
},

// Is the DOM ready to be used? Set to true once it occurs.
isReady: false,

// Handle when the DOM is ready
ready: function() {
// Make sure that the DOM is not already loaded
if ( !jQuery.isReady ) {
// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
if ( !document.body ) {
return setTimeout( jQuery.ready, 13 );
}

// Remember that the DOM is ready
jQuery.isReady = true;

// 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.triggerHandler ) {
jQuery( document ).triggerHandler( "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" ) {
return jQuery.ready();
}

// 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 toString.call(obj) === "[object Function]";
},

isArray: function( obj ) {
return toString.call(obj) === "[object Array]";
},

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 || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
return false;
}

// Not own constructor property must be Object
if ( obj.constructor
&& !hasOwnProperty.call(obj, "constructor")
&& !hasOwnProperty.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 || hasOwnProperty.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 ( /^[],:{}s]*$/.test(data.replace(/\(?:["\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
.replace(/"[^"\nr]*"|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?/g, "]")
.replace(/(?:^|:|,)(?:s*[)+/g, "")) ) {

// 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;
},

trim: function( text ) {
return (text || "").replace( rtrim, "" );
},

// 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)
if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
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 = [];

// Go through the array, only saving the items
// that pass the validator function
for ( var i = 0, length = elems.length; i < length; i++ ) {
if ( !inv !== !callback( elems[ i ], i ) ) {
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;
},

// Use of jQuery.browser is frowned upon.
// More details: http://docs.jquery.com/Utilities/jQuery.browser
uaMatch: function( ua ) {
ua = ua.toLowerCase();

var match = /(webkit)[ /]([w.]+)/.exec( ua ) ||
/(opera)(?:.*version)?[ /]([w.]+)/.exec( ua ) ||
/(msie) ([w.]+)/.exec( ua ) ||
!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([w.]+))?/.exec( ua ) ||
[];

return { browser: match[1] || "", version: match[2] || "0" };
},

browser: {}
});

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 );
};
}

// 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( error ) {
setTimeout( doScrollCheck, 1 );
return;
}

// and execute any waiting functions
jQuery.ready();
}

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 || "" );
}

if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}

// Mutifunctional method to get and set values to a collection
// The value/s can be optionally by executed if its a function
function access( elems, key, value, exec, fn, pass ) {
var length = elems.length;

// Setting many attributes
if ( typeof key === "object" ) {
for ( var k in key ) {
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;
}

function now() {
return (new Date).getTime();
}
(function() {

jQuery.support = {};

var root = document.documentElement,
script = document.createElement("script"),
div = document.createElement("div"),
id = "script" + now();

div.style.display = "none";
div.innerHTML = "

a“;

var all = div.getElementsByTagName(“*”),
a = div.getElementsByTagName(“a”)[0];

// Can’t get basic test support
if ( !all || !all.length || !a ) {
return;
}

jQuery.support = {
// IE strips leading whitespace when .innerHTML is used
leadingWhitespace: div.firstChild.nodeType === 3,

// Make sure that tbody elements aren’t automatically inserted
// IE will insert them into empty tables
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,

// Get the style information from getAttribute
// (IE uses .cssText insted)
style: /red/.test( a.getAttribute(“style”) ),

// Make sure that URLs aren’t manipulated
// (IE normalizes it by default)
hrefNormalized: a.getAttribute(“href”) === “/a”,

// Make sure that element opacity exists
// (IE uses filter instead)
// Use a regex to work around a WebKit issue. See #5145
opacity: /^0.55$/.test( a.style.opacity ),

// Verify style float existence
// (IE uses styleFloat instead of cssFloat)
cssFloat: !!a.style.cssFloat,

// Make sure that if no value is specified for a checkbox
// that it defaults to “on”.
// (WebKit defaults to “” instead)
checkOn: div.getElementsByTagName(“input”)[0].value === “on”,

// Make sure that a selected-by-default option has a working selected property.
// (WebKit defaults to false instead of true, IE too, if it’s in an optgroup)
optSelected: document.createElement(“select”).appendChild( document.createElement(“option”) ).selected,

parentNode: div.removeChild( div.appendChild( document.createElement(“div”) ) ).parentNode === null,

// Will be defined later
deleteExpando: true,
checkClone: false,
scriptEval: false,
noCloneEvent: true,
boxModel: null
};

script.type = “text/javascript”;
try {
script.appendChild( document.createTextNode( “window.” + id + “=1;” ) );
} catch(e) {}

root.insertBefore( script, root.firstChild );

// Make sure that the execution of code works by injecting a script
// tag with appendChild/createTextNode
// (IE doesn’t support this, fails, and uses .text instead)
if ( window[ id ] ) {
jQuery.support.scriptEval = true;
delete window[ id ];
}

// Test to see if it’s possible to delete an expando from an element
// Fails in Internet Explorer
try {
delete script.test;

} catch(e) {
jQuery.support.deleteExpando = false;
}

root.removeChild( script );

if ( div.attachEvent && div.fireEvent ) {
div.attachEvent(“onclick”, function click() {
// Cloning a node shouldn’t copy over any
// bound event handlers (IE does this)
jQuery.support.noCloneEvent = false;
div.detachEvent(“onclick”, click);
});
div.cloneNode(true).fireEvent(“onclick”);
}

div = document.createElement(“div”);
div.innerHTML = “”;

var fragment = document.createDocumentFragment();
fragment.appendChild( div.firstChild );

// WebKit doesn’t clone checked state correctly in fragments
jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;

// Figure out if the W3C box model works as expected
// document.body must exist before we can do this
jQuery(function() {
var div = document.createElement(“div”);
div.style.width = div.style.paddingLeft = “1px”;

document.body.appendChild( div );
jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
document.body.removeChild( div ).style.display = ‘none’;

div = null;
});

// Technique from Juriy Zaytsev
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
var eventSupported = function( eventName ) {
var el = document.createElement(“div”);
eventName = “on” + eventName;

var isSupported = (eventName in el);
if ( !isSupported ) {
el.setAttribute(eventName, “return;”);
isSupported = typeof el[eventName] === “function”;
}
el = null;

return isSupported;
};

jQuery.support.submitBubbles = eventSupported(“submit”);
jQuery.support.changeBubbles = eventSupported(“change”);

// release memory in IE
root = script = div = all = a = null;
})();

jQuery.props = {
“for”: “htmlFor”,
“class”: “className”,
readonly: “readOnly”,
maxlength: “maxLength”,
cellspacing: “cellSpacing”,
rowspan: “rowSpan”,
colspan: “colSpan”,
tabindex: “tabIndex”,
usemap: “useMap”,
frameborder: “frameBorder”
};
var expando = “jQuery” + now(), uuid = 0, windowData = {};

jQuery.extend({
cache: {},

expando:expando,

// The following elements throw uncatchable exceptions if you
// attempt to add expando properties to them.
noData: {
“embed”: true,
“object”: true,
“applet”: true
},

data: function( elem, name, data ) {
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
return;
}

elem = elem == window ?
windowData :
elem;

var id = elem[ expando ], cache = jQuery.cache, thisCache;

if ( !id && typeof name === “string” && data === undefined ) {
return null;
}

// Compute a unique ID for the element
if ( !id ) {
id = ++uuid;
}

// Avoid generating a new cache unless none exists and we
// want to manipulate it.
if ( typeof name === “object” ) {
elem[ expando ] = id;
thisCache = cache[ id ] = jQuery.extend(true, {}, name);

} else if ( !cache[ id ] ) {
elem[ expando ] = id;
cache[ id ] = {};
}

thisCache = cache[ id ];

// Prevent overriding the named cache with undefined values
if ( data !== undefined ) {
thisCache[ name ] = data;
}

return typeof name === “string” ? thisCache[ name ] : thisCache;
},

removeData: function( elem, name ) {
if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
return;
}

elem = elem == window ?
windowData :
elem;

var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];

// If we want to remove a specific section of the element’s data
if ( name ) {
if ( thisCache ) {
// Remove the section of cache data
delete thisCache[ name ];

// If we’ve removed all the data, remove the element’s cache
if ( jQuery.isEmptyObject(thisCache) ) {
jQuery.removeData( elem );
}
}

// Otherwise, we want to remove all of the element’s data
} else {
if ( jQuery.support.deleteExpando ) {
delete elem[ jQuery.expando ];

} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando );
}

// Completely remove the data cache
delete cache[ id ];
}
}
});

jQuery.fn.extend({
data: function( key, value ) {
if ( typeof key === “undefined” && this.length ) {
return jQuery.data( this[0] );

} else if ( typeof key === “object” ) {
return this.each(function() {
jQuery.data( this, key );
});
}

var parts = key.split(“.”);
parts[1] = parts[1] ? “.” + parts[1] : “”;

if ( value === undefined ) {
var data = this.triggerHandler(“getData” + parts[1] + “!”, [parts[0]]);

if ( data === undefined && this.length ) {
data = jQuery.data( this[0], key );
}
return data === undefined && parts[1] ?
this.data( parts[0] ) :
data;
} else {
return this.trigger(“setData” + parts[1] + “!”, [parts[0], value]).each(function() {
jQuery.data( this, key, value );
});
}
},

removeData: function( key ) {
return this.each(function() {
jQuery.removeData( this, key );
});
}
});
jQuery.extend({
queue: function( elem, type, data ) {
if ( !elem ) {
return;
}

type = (type || “fx”) + “queue”;
var q = jQuery.data( elem, type );

// Speed up dequeue by getting out quickly if this is just a lookup
if ( !data ) {
return q || [];
}

if ( !q || jQuery.isArray(data) ) {
q = jQuery.data( elem, type, jQuery.makeArray(data) );

} else {
q.push( data );
}

return q;
},

dequeue: function( elem, type ) {
type = type || “fx”;

var queue = jQuery.queue( elem, type ), fn = queue.shift();

// If the fx queue is dequeued, always remove the progress sentinel
if ( fn === “inprogress” ) {
fn = queue.shift();
}

if ( fn ) {
// Add a progress sentinel to prevent the fx queue from being
// automatically dequeued
if ( type === “fx” ) {
queue.unshift(“inprogress”);
}

fn.call(elem, function() {
jQuery.dequeue(elem, type);
});
}
}
});

jQuery.fn.extend({
queue: function( type, data ) {
if ( typeof type !== “string” ) {
data = type;
type = “fx”;
}

if ( data === undefined ) {
return jQuery.queue( this[0], type );
}
return this.each(function( i, elem ) {
var queue = jQuery.queue( this, type, data );

if ( type === “fx” && queue[0] !== “inprogress” ) {
jQuery.dequeue( this, type );
}
});
},
dequeue: function( type ) {
return this.each(function() {
jQuery.dequeue( this, type );
});
},

// Based off of the plugin by Clint Helfers, with permission.
// http://blindsignals.com/index.php/2009/07/jquery-delay/
delay: function( time, type ) {
time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
type = type || “fx”;

return this.queue( type, function() {
var elem = this;
setTimeout(function() {
jQuery.dequeue( elem, type );
}, time );
});
},

clearQueue: function( type ) {
return this.queue( type || “fx”, [] );
}
});
var rclass = /[nt]/g,
rspace = /s+/,
rreturn = /r/g,
rspecialurl = /href|src|style/,
rtype = /(button|input)/i,
rfocusable = /(button|input|object|select|textarea)/i,
rclickable = /^(a|area)$/i,
rradiocheck = /radio|checkbox/;

jQuery.fn.extend({
attr: function( name, value ) {
return access( this, name, value, true, jQuery.attr );
},

removeAttr: function( name, fn ) {
return this.each(function(){
jQuery.attr( this, name, “” );
if ( this.nodeType === 1 ) {
this.removeAttribute( name );
}
});
},

addClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
self.addClass( value.call(this, i, self.attr(“class”)) );
});
}

if ( value && typeof value === “string” ) {
var classNames = (value || “”).split( rspace );

for ( var i = 0, l = this.length; i < l; i++ ) {
var elem = this[i];

if ( elem.nodeType === 1 ) {
if ( !elem.className ) {
elem.className = value;

} else {
var className = " " + elem.className + " ", setClass = elem.className;
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
setClass += " " + classNames[c];
}
}
elem.className = jQuery.trim( setClass );
}
}
}
}

return this;
},

removeClass: function( value ) {
if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
self.removeClass( value.call(this, i, self.attr("class")) );
});
}

if ( (value && typeof value === "string") || value === undefined ) {
var classNames = (value || "").split(rspace);

for ( var i = 0, l = this.length; i < l; i++ ) {
var elem = this[i];

if ( elem.nodeType === 1 && elem.className ) {
if ( value ) {
var className = (" " + elem.className + " ").replace(rclass, " ");
for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
className = className.replace(" " + classNames[c] + " ", " ");
}
elem.className = jQuery.trim( className );

} else {
elem.className = "";
}
}
}
}

return this;
},

toggleClass: function( value, stateVal ) {
var type = typeof value, isBool = typeof stateVal === "boolean";

if ( jQuery.isFunction( value ) ) {
return this.each(function(i) {
var self = jQuery(this);
self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
});
}

return this.each(function() {
if ( type === "string" ) {
// toggle individual class names
var className, i = 0, self = jQuery(this),
state = stateVal,
classNames = value.split( rspace );

while ( (className = classNames[ i++ ]) ) {
// check each className given, space seperated list
state = isBool ? state : !self.hasClass( className );
self[ state ? "addClass" : "removeClass" ]( className );
}

} else if ( type === "undefined" || type === "boolean" ) {
if ( this.className ) {
// store className if set
jQuery.data( this, "__className__", this.className );
}

// toggle whole className
this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
}
});
},

hasClass: function( selector ) {
var className = " " + selector + " ";
for ( var i = 0, l = this.length; i -1 ) {
return true;
}
}

return false;
},

val: function( value ) {
if ( value === undefined ) {
var elem = this[0];

if ( elem ) {
if ( jQuery.nodeName( elem, “option” ) ) {
return (elem.attributes.value || {}).specified ? elem.value : elem.text;
}

// We need to handle select boxes special
if ( jQuery.nodeName( elem, “select” ) ) {
var index = elem.selectedIndex,
values = [],
options = elem.options,
one = elem.type === “select-one”;

// Nothing was selected
if ( index < 0 ) {
return null;
}

// Loop through all the selected options
for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i = 0;

} else if ( jQuery.nodeName( this, “select” ) ) {
var values = jQuery.makeArray(val);

jQuery( “option”, this ).each(function() {
this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
});

if ( !values.length ) {
this.selectedIndex = -1;
}

} else {
this.value = val;
}
});
}
});

jQuery.extend({
attrFn: {
val: true,
css: true,
html: true,
text: true,
data: true,
width: true,
height: true,
offset: true
},

attr: function( elem, name, value, pass ) {
// don’t set attributes on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
return undefined;
}

if ( pass && name in jQuery.attrFn ) {
return jQuery(elem)[name](value);
}

var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
// Whether we are setting (or getting)
set = value !== undefined;

// Try to normalize/fix the name
name = notxml && jQuery.props[ name ] || name;

// Only do all the following if this is a node (faster for style)
if ( elem.nodeType === 1 ) {
// These attributes require special treatment
var special = rspecialurl.test( name );

// Safari mis-reports the default selected property of an option
// Accessing the parent’s selectedIndex property fixes it
if ( name === “selected” && !jQuery.support.optSelected ) {
var parent = elem.parentNode;
if ( parent ) {
parent.selectedIndex;

// Make sure that it also works with optgroups, see #5701
if ( parent.parentNode ) {
parent.parentNode.selectedIndex;
}
}
}

// If applicable, access the attribute via the DOM 0 way
if ( name in elem && notxml && !special ) {
if ( set ) {
// We can’t allow the type property to be changed (since it causes problems in IE)
if ( name === “type” && rtype.test( elem.nodeName ) && elem.parentNode ) {
jQuery.error( “type property can’t be changed” );
}

elem[ name ] = value;
}

// browsers index elements by id/name on forms, give priority to attributes.
if ( jQuery.nodeName( elem, “form” ) && elem.getAttributeNode(name) ) {
return elem.getAttributeNode( name ).nodeValue;
}

// elem.tabIndex doesn’t always return the correct value when it hasn’t been explicitly set
// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
if ( name === “tabIndex” ) {
var attributeNode = elem.getAttributeNode( “tabIndex” );

return attributeNode && attributeNode.specified ?
attributeNode.value :
rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
0 :
undefined;
}

return elem[ name ];
}

if ( !jQuery.support.style && notxml && name === “style” ) {
if ( set ) {
elem.style.cssText = “” + value;
}

return elem.style.cssText;
}

if ( set ) {
// convert the value to a string (all browsers do this but IE) see #1070
elem.setAttribute( name, “” + value );
}

var attr = !jQuery.support.hrefNormalized && notxml && special ?
// Some attributes require a special call on IE
elem.getAttribute( name, 2 ) :
elem.getAttribute( name );

// Non-existent attributes return null, we normalize to undefined
return attr === null ? undefined : attr;
}

// elem is actually elem.style … set the style
// Using attr for specific style information is now deprecated. Use style instead.
return jQuery.style( elem, name, value );
}
});
var rnamespaces = /.(.*)$/,
fcleanup = function( nm ) {
return nm.replace(/[^ws.|`]/g, function( ch ) {
return “\” + ch;
});
};

/*
* A number of helper functions used for managing events.
* Many of the ideas behind this code originated from
* Dean Edwards’ addEvent library.
*/
jQuery.event = {

// Bind an event to an element
// Original by Dean Edwards
add: function( elem, types, handler, data ) {
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}

// For whatever reason, IE has trouble passing the window object
// around, causing it to be cloned in the process
if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
elem = window;
}

var handleObjIn, handleObj;

if ( handler.handler ) {
handleObjIn = handler;
handler = handleObjIn.handler;
}

// Make sure that the function being executed has a unique ID
if ( !handler.guid ) {
handler.guid = jQuery.guid++;
}

// Init the element’s event structure
var elemData = jQuery.data( elem );

// If no elemData is found then we must be trying to bind to one of the
// banned noData elements
if ( !elemData ) {
return;
}

var events = elemData.events = elemData.events || {},
eventHandle = elemData.handle, eventHandle;

if ( !eventHandle ) {
elemData.handle = eventHandle = function() {
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
return typeof jQuery !== “undefined” && !jQuery.event.triggered ?
jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
}

// Add elem as a property of the handle function
// This is to prevent a memory leak with non-native events in IE.
eventHandle.elem = elem;

// Handle multiple events separated by a space
// jQuery(…).bind(“mouseover mouseout”, fn);
types = types.split(” “);

var type, i = 0, namespaces;

while ( (type = types[ i++ ]) ) {
handleObj = handleObjIn ?
jQuery.extend({}, handleObjIn) :
{ handler: handler, data: data };

// Namespaced event handlers
if ( type.indexOf(“.”) > -1 ) {
namespaces = type.split(“.”);
type = namespaces.shift();
handleObj.namespace = namespaces.slice(0).sort().join(“.”);

} else {
namespaces = [];
handleObj.namespace = “”;
}

handleObj.type = type;
handleObj.guid = handler.guid;

// Get the current list of functions bound to this event
var handlers = events[ type ],
special = jQuery.event.special[ type ] || {};

// Init the event handler queue
if ( !handlers ) {
handlers = events[ type ] = [];

// Check for a special event handler
// Only use addEventListener/attachEvent if the special
// events handler returns false
if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
// Bind the global event handler to the element
if ( elem.addEventListener ) {
elem.addEventListener( type, eventHandle, false );

} else if ( elem.attachEvent ) {
elem.attachEvent( “on” + type, eventHandle );
}
}
}

if ( special.add ) {
special.add.call( elem, handleObj );

if ( !handleObj.handler.guid ) {
handleObj.handler.guid = handler.guid;
}
}

// Add the function to the element’s handler list
handlers.push( handleObj );

// Keep track of which events have been used, for global triggering
jQuery.event.global[ type ] = true;
}

// Nullify elem to prevent memory leaks in IE
elem = null;
},

global: {},

// Detach an event or set of events from an element
remove: function( elem, types, handler, pos ) {
// don’t do events on text and comment nodes
if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
return;
}

var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
elemData = jQuery.data( elem ),
events = elemData && elemData.events;

if ( !elemData || !events ) {
return;
}

// types is actually an event object here
if ( types && types.type ) {
handler = types.handler;
types = types.type;
}

// Unbind all events for the element
if ( !types || typeof types === “string” && types.charAt(0) === “.” ) {
types = types || “”;

for ( type in events ) {
jQuery.event.remove( elem, type + types );
}

return;
}

// Handle multiple events separated by a space
// jQuery(…).unbind(“mouseover mouseout”, fn);
types = types.split(” “);

while ( (type = types[ i++ ]) ) {
origType = type;
handleObj = null;
all = type.indexOf(“.”) < 0;
namespaces = [];

if ( !all ) {
// Namespaced event handlers
namespaces = type.split(".");
type = namespaces.shift();

namespace = new RegExp("(^|\.)" +
jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\.(?:.*\.)?") + "(\.|$)")
}

eventType = events[ type ];

if ( !eventType ) {
continue;
}

if ( !handler ) {
for ( var j = 0; j < eventType.length; j++ ) {
handleObj = eventType[ j ];

if ( all || namespace.test( handleObj.namespace ) ) {
jQuery.event.remove( elem, origType, handleObj.handler, j );
eventType.splice( j–, 1 );
}
}

continue;
}

special = jQuery.event.special[ type ] || {};

for ( var j = pos || 0; j = 0 ) {
event.type = type = type.slice(0, -1);
event.exclusive = true;
}

// Handle a global trigger
if ( !elem ) {
// Don’t bubble custom events when global (to avoid too much overhead)
event.stopPropagation();

// Only trigger if we’ve ever bound an event for it
if ( jQuery.event.global[ type ] ) {
jQuery.each( jQuery.cache, function() {
if ( this.events && this.events[type] ) {
jQuery.event.trigger( event, data, this.handle.elem );
}
});
}
}

// Handle triggering a single element

// don’t do events on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
return undefined;
}

// Clean up in case it is reused
event.result = undefined;
event.target = elem;

// Clone the incoming data, if any
data = jQuery.makeArray( data );
data.unshift( event );
}

event.currentTarget = elem;

// Trigger the event, it is assumed that “handle” is a function
var handle = jQuery.data( elem, “handle” );
if ( handle ) {
handle.apply( elem, data );
}

var parent = elem.parentNode || elem.ownerDocument;

// Trigger an inline bound script
try {
if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
if ( elem[ “on” + type ] && elem[ “on” + type ].apply( elem, data ) === false ) {
event.result = false;
}
}

// prevent IE from throwing an error for some elements with some event types, see #3533
} catch (e) {}

if ( !event.isPropagationStopped() && parent ) {
jQuery.event.trigger( event, data, parent, true );

} else if ( !event.isDefaultPrevented() ) {
var target = event.target, old,
isClick = jQuery.nodeName(target, “a”) && type === “click”,
special = jQuery.event.special[ type ] || {};

if ( (!special._default || special._default.call( elem, event ) === false) &&
!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {

try {
if ( target[ type ] ) {
// Make sure that we don’t accidentally re-trigger the onFOO events
old = target[ “on” + type ];

if ( old ) {
target[ “on” + type ] = null;
}

jQuery.event.triggered = true;
target[ type ]();
}

// prevent IE from throwing an error for some elements with some event types, see #3533
} catch (e) {}

if ( old ) {
target[ “on” + type ] = old;
}

jQuery.event.triggered = false;
}
}
},

handle: function( event ) {
var all, handlers, namespaces, namespace, events;

event = arguments[0] = jQuery.event.fix( event || window.event );
event.currentTarget = this;

// Namespaced event handlers
all = event.type.indexOf(“.”) < 0 && !event.exclusive;

if ( !all ) {
namespaces = event.type.split(".");
event.type = namespaces.shift();
namespace = new RegExp("(^|\.)" + namespaces.slice(0).sort().join("\.(?:.*\.)?") + "(\.|$)");
}

var events = jQuery.data(this, "events"), handlers = events[ event.type ];

if ( events && handlers ) {
// Clone the handlers to prevent manipulation
handlers = handlers.slice(0);

for ( var j = 0, l = handlers.length; j -1 ?
jQuery.map( elem.options, function( elem ) {
return elem.selected;
}).join(“-“) :
“”;

} else if ( elem.nodeName.toLowerCase() === “select” ) {
val = elem.selectedIndex;
}

return val;
},

testChange = function testChange( e ) {
var elem = e.target, data, val;

if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
return;
}

data = jQuery.data( elem, “_change_data” );
val = getVal(elem);

// the current data will be also retrieved by beforeactivate
if ( e.type !== “focusout” || elem.type !== “radio” ) {
jQuery.data( elem, “_change_data”, val );
}

if ( data === undefined || val === data ) {
return;
}

if ( data != null || val ) {
e.type = “change”;
return jQuery.event.trigger( e, arguments[1], elem );
}
};

jQuery.event.special.change = {
filters: {
focusout: testChange,

click: function( e ) {
var elem = e.target, type = elem.type;

if ( type === “radio” || type === “checkbox” || elem.nodeName.toLowerCase() === “select” ) {
return testChange.call( this, e );
}
},

// Change has to be called before submit
// Keydown will be called before keypress, which is used in submit-event delegation
keydown: function( e ) {
var elem = e.target, type = elem.type;

if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== “textarea”) ||
(e.keyCode === 32 && (type === “checkbox” || type === “radio”)) ||
type === “select-multiple” ) {
return testChange.call( this, e );
}
},

// Beforeactivate happens also before the previous element is blurred
// with this event you can’t trigger a change event, but you can store
// information/focus[in] is not needed anymore
beforeactivate: function( e ) {
var elem = e.target;
jQuery.data( elem, “_change_data”, getVal(elem) );
}
},

setup: function( data, namespaces ) {
if ( this.type === “file” ) {
return false;
}

for ( var type in changeFilters ) {
jQuery.event.add( this, type + “.specialChange”, changeFilters[type] );
}

return formElems.test( this.nodeName );
},

teardown: function( namespaces ) {
jQuery.event.remove( this, “.specialChange” );

return formElems.test( this.nodeName );
}
};

changeFilters = jQuery.event.special.change.filters;
}

function trigger( type, elem, args ) {
args[0].type = type;
return jQuery.event.handle.apply( elem, args );
}

// Create “bubbling” focus and blur events
if ( document.addEventListener ) {
jQuery.each({ focus: “focusin”, blur: “focusout” }, function( orig, fix ) {
jQuery.event.special[ fix ] = {
setup: function() {
this.addEventListener( orig, handler, true );
},
teardown: function() {
this.removeEventListener( orig, handler, true );
}
};

function handler( e ) {
e = jQuery.event.fix( e );
e.type = fix;
return jQuery.event.handle.call( this, e );
}
});
}

jQuery.each([“bind”, “one”], function( i, name ) {
jQuery.fn[ name ] = function( type, data, fn ) {
// Handle object literals
if ( typeof type === “object” ) {
for ( var key in type ) {
this[ name ](key, data, type[key], fn);
}
return this;
}

if ( jQuery.isFunction( data ) ) {
fn = data;
data = undefined;
}

var handler = name === “one” ? jQuery.proxy( fn, function( event ) {
jQuery( this ).unbind( event, handler );
return fn.apply( this, arguments );
}) : fn;

if ( type === “unload” && name !== “one” ) {
this.one( type, data, fn );

} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.add( this[i], type, handler, data );
}
}

return this;
};
});

jQuery.fn.extend({
unbind: function( type, fn ) {
// Handle object literals
if ( typeof type === "object" && !type.preventDefault ) {
for ( var key in type ) {
this.unbind(key, type[key]);
}

} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
jQuery.event.remove( this[i], type, fn );
}
}

return this;
},

delegate: function( selector, types, data, fn ) {
return this.live( types, data, fn, selector );
},

undelegate: function( selector, types, fn ) {
if ( arguments.length === 0 ) {
return this.unbind( "live" );

} else {
return this.die( types, null, fn, selector );
}
},

trigger: function( type, data ) {
return this.each(function() {
jQuery.event.trigger( type, data, this );
});
},

triggerHandler: function( type, data ) {
if ( this[0] ) {
var event = jQuery.Event( type );
event.preventDefault();
event.stopPropagation();
jQuery.event.trigger( event, data, this[0] );
return event.result;
}
},

toggle: function( fn ) {
// Save reference to arguments for access in closure
var args = arguments, i = 1;

// link all the functions, so any of them can unbind this click handler
while ( i < args.length ) {
jQuery.proxy( fn, args[ i++ ] );
}

return this.click( jQuery.proxy( fn, function( event ) {
// Figure out which function to execute
var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );

// Make sure that clicks stop
event.preventDefault();

// and execute the function
return args[ lastToggle ].apply( this, arguments ) || false;
}));
},

hover: function( fnOver, fnOut ) {
return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
}
});

var liveMap = {
focus: "focusin",
blur: "focusout",
mouseenter: "mouseover",
mouseleave: "mouseout"
};

jQuery.each(["live", "die"], function( i, name ) {
jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
var type, i = 0, match, namespaces, preType,
selector = origSelector || this.selector,
context = origSelector ? this : jQuery( this.context );

if ( jQuery.isFunction( data ) ) {
fn = data;
data = undefined;
}

types = (types || "").split(" ");

while ( (type = types[ i++ ]) != null ) {
match = rnamespaces.exec( type );
namespaces = "";

if ( match ) {
namespaces = match[0];
type = type.replace( rnamespaces, "" );
}

if ( type === "hover" ) {
types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
continue;
}

preType = type;

if ( type === "focus" || type === "blur" ) {
types.push( liveMap[ type ] + namespaces );
type = type + namespaces;

} else {
type = (liveMap[ type ] || type) + namespaces;
}

if ( name === "live" ) {
// bind live handler
context.each(function(){
jQuery.event.add( this, liveConvert( type, selector ),
{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
});

} else {
// unbind live handler
context.unbind( liveConvert( type, selector ), fn );
}
}

return this;
}
});

function liveHandler( event ) {
var stop, elems = [], selectors = [], args = arguments,
related, match, handleObj, elem, j, i, l, data,
events = jQuery.data( this, "events" );

// Make sure we avoid non-left-click bubbling in Firefox (#3861)
if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
return;
}

event.liveFired = this;

var live = events.live.slice(0);

for ( j = 0; j < live.length; j++ ) {
handleObj = live[j];

if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
selectors.push( handleObj.selector );

} else {
live.splice( j–, 1 );
}
}

match = jQuery( event.target ).closest( selectors, event.currentTarget );

for ( i = 0, l = match.length; i < l; i++ ) {
for ( j = 0; j < live.length; j++ ) {
handleObj = live[j];

if ( match[i].selector === handleObj.selector ) {
elem = match[i].elem;
related = null;

// Those two events require additional checking
if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
}

if ( !related || related !== elem ) {
elems.push({ elem: elem, handleObj: handleObj });
}
}
}
}

for ( i = 0, l = elems.length; i +~,([\]+)+|[>+~])(s*,s*)?((?:.|r|n)*)/g,
done = 0,
toString = Object.prototype.toString,
hasDuplicate = false,
baseHasDuplicate = true;

// Here we check if the JavaScript engine is using some sort of
// optimization where it does not always call our comparision
// function. If that is the case, discard the hasDuplicate value.
// Thus far that includes Google Chrome.
[0, 0].sort(function(){
baseHasDuplicate = false;
return 0;
});

var Sizzle = function(selector, context, results, seed) {
results = results || [];
var origContext = context = context || document;

if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
return [];
}

if ( !selector || typeof selector !== “string” ) {
return results;
}

var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
soFar = selector;

// Reset the position of the chunker regexp (start from head)
while ( (chunker.exec(“”), m = chunker.exec(soFar)) !== null ) {
soFar = m[3];

parts.push( m[1] );

if ( m[2] ) {
extra = m[3];
break;
}
}

if ( parts.length > 1 && origPOS.exec( selector ) ) {
if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
set = posProcess( parts[0] + parts[1], context );
} else {
set = Expr.relative[ parts[0] ] ?
[ context ] :
Sizzle( parts.shift(), context );

while ( parts.length ) {
selector = parts.shift();

if ( Expr.relative[ selector ] ) {
selector += parts.shift();
}

set = posProcess( selector, set );
}
}
} else {
// Take a shortcut and set the context if the root selector is an ID
// (but not if it’ll be faster if the inner selector is an ID)
if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length – 1]) ) {
var ret = Sizzle.find( parts.shift(), context, contextXML );
context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
}

if ( context ) {
var ret = seed ?
{ expr: parts.pop(), set: makeArray(seed) } :
Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === “~” || parts[0] === “+”) && context.parentNode ? context.parentNode : context, contextXML );
set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;

if ( parts.length > 0 ) {
checkSet = makeArray(set);
} else {
prune = false;
}

while ( parts.length ) {
var cur = parts.pop(), pop = cur;

if ( !Expr.relative[ cur ] ) {
cur = “”;
} else {
pop = parts.pop();
}

if ( pop == null ) {
pop = context;
}

Expr.relative[ cur ]( checkSet, pop, contextXML );
}
} else {
checkSet = parts = [];
}
}

if ( !checkSet ) {
checkSet = set;
}

if ( !checkSet ) {
Sizzle.error( cur || selector );
}

if ( toString.call(checkSet) === “[object Array]” ) {
if ( !prune ) {
results.push.apply( results, checkSet );
} else if ( context && context.nodeType === 1 ) {
for ( var i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
results.push( set[i] );
}
}
} else {
for ( var i = 0; checkSet[i] != null; i++ ) {
if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
results.push( set[i] );
}
}
}
} else {
makeArray( checkSet, results );
}

if ( extra ) {
Sizzle( extra, origContext, results, seed );
Sizzle.uniqueSort( results );
}

return results;
};

Sizzle.uniqueSort = function(results){
if ( sortOrder ) {
hasDuplicate = baseHasDuplicate;
results.sort(sortOrder);

if ( hasDuplicate ) {
for ( var i = 1; i < results.length; i++ ) {
if ( results[i] === results[i-1] ) {
results.splice(i–, 1);
}
}
}
}

return results;
};

Sizzle.matches = function(expr, set){
return Sizzle(expr, null, null, set);
};

Sizzle.find = function(expr, context, isXML){
var set, match;

if ( !expr ) {
return [];
}

for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
var type = Expr.order[i], match;

if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
var left = match[1];
match.splice(1,1);

if ( left.substr( left.length – 1 ) !== "\" ) {
match[1] = (match[1] || "").replace(/\/g, "");
set = Expr.find[ type ]( match, context, isXML );
if ( set != null ) {
expr = expr.replace( Expr.match[ type ], "" );
break;
}
}
}
}

if ( !set ) {
set = context.getElementsByTagName("*");
}

return {set: set, expr: expr};
};

Sizzle.filter = function(expr, set, inplace, not){
var old = expr, result = [], curLoop = set, match, anyFound,
isXMLFilter = set && set[0] && isXML(set[0]);

while ( expr && set.length ) {
for ( var type in Expr.filter ) {
if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
var filter = Expr.filter[ type ], found, item, left = match[1];
anyFound = false;

match.splice(1,1);

if ( left.substr( left.length – 1 ) === "\" ) {
continue;
}

if ( curLoop === result ) {
result = [];
}

if ( Expr.preFilter[ type ] ) {
match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );

if ( !match ) {
anyFound = found = true;
} else if ( match === true ) {
continue;
}
}

if ( match ) {
for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
if ( item ) {
found = filter( item, match, i, curLoop );
var pass = not ^ !!found;

if ( inplace && found != null ) {
if ( pass ) {
anyFound = true;
} else {
curLoop[i] = false;
}
} else if ( pass ) {
result.push( item );
anyFound = true;
}
}
}
}

if ( found !== undefined ) {
if ( !inplace ) {
curLoop = result;
}

expr = expr.replace( Expr.match[ type ], "" );

if ( !anyFound ) {
return [];
}

break;
}
}
}

// Improper expression
if ( expr === old ) {
if ( anyFound == null ) {
Sizzle.error( expr );
} else {
break;
}
}

old = expr;
}

return curLoop;
};

Sizzle.error = function( msg ) {
throw "Syntax error, unrecognized expression: " + msg;
};

var Expr = Sizzle.selectors = {
order: [ "ID", "NAME", "TAG" ],
match: {
ID: /#((?:[wu00c0-uFFFF-]|\.)+)/,
CLASS: /.((?:[wu00c0-uFFFF-]|\.)+)/,
NAME: /[name=['"]*((?:[wu00c0-uFFFF-]|\.)+)['"]*]/,
ATTR: /[s*((?:[wu00c0-uFFFF-]|\.)+)s*(?:(S?=)s*(['"]*)(.*?)3|)s*]/,
TAG: /^((?:[wu00c0-uFFFF*-]|\.)+)/,
CHILD: /:(only|nth|last|first)-child(?:((even|odd|[dn+-]*)))?/,
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:((d*)))?(?=[^-]|$)/,
PSEUDO: /:((?:[wu00c0-uFFFF-]|\.)+)(?:((['"]?)((?:([^)]+)|[^()]*)+)2))?/
},
leftMatch: {},
attrMap: {
"class": "className",
"for": "htmlFor"
},
attrHandle: {
href: function(elem){
return elem.getAttribute("href");
}
},
relative: {
"+": function(checkSet, part){
var isPartStr = typeof part === "string",
isTag = isPartStr && !/W/.test(part),
isPartStrNotTag = isPartStr && !isTag;

if ( isTag ) {
part = part.toLowerCase();
}

for ( var i = 0, l = checkSet.length, elem; i “: function(checkSet, part){
var isPartStr = typeof part === “string”;

if ( isPartStr && !/W/.test(part) ) {
part = part.toLowerCase();

for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
var parent = elem.parentNode;
checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
}
}
} else {
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
checkSet[i] = isPartStr ?
elem.parentNode :
elem.parentNode === part;
}
}

if ( isPartStr ) {
Sizzle.filter( part, checkSet, true );
}
}
},
"": function(checkSet, part, isXML){
var doneName = done++, checkFn = dirCheck;

if ( typeof part === "string" && !/W/.test(part) ) {
var nodeCheck = part = part.toLowerCase();
checkFn = dirNodeCheck;
}

checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
},
"~": function(checkSet, part, isXML){
var doneName = done++, checkFn = dirCheck;

if ( typeof part === "string" && !/W/.test(part) ) {
var nodeCheck = part = part.toLowerCase();
checkFn = dirNodeCheck;
}

checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
}
},
find: {
ID: function(match, context, isXML){
if ( typeof context.getElementById !== "undefined" && !isXML ) {
var m = context.getElementById(match[1]);
return m ? [m] : [];
}
},
NAME: function(match, context){
if ( typeof context.getElementsByName !== "undefined" ) {
var ret = [], results = context.getElementsByName(match[1]);

for ( var i = 0, l = results.length; i = 0) ) {
if ( !inplace ) {
result.push( elem );
}
} else if ( inplace ) {
curLoop[i] = false;
}
}
}

return false;
},
ID: function(match){
return match[1].replace(/\/g, “”);
},
TAG: function(match, curLoop){
return match[1].toLowerCase();
},
CHILD: function(match){
if ( match[1] === “nth” ) {
// parse equations like ‘even’, ‘odd’, ‘5’, ‘2n’, ‘3n+2’, ‘4n-1’, ‘-n+6’
var test = /(-?)(d*)n((?:+|-)?d*)/.exec(
match[2] === “even” && “2n” || match[2] === “odd” && “2n+1” ||
!/D/.test( match[2] ) && “0n+” + match[2] || match[2]);

// calculate the numbers (first)n+(last) including if they are negative
match[2] = (test[1] + (test[2] || 1)) – 0;
match[3] = test[3] – 0;
}

// TODO: Move to normal caching system
match[0] = done++;

return match;
},
ATTR: function(match, curLoop, inplace, result, not, isXML){
var name = match[1].replace(/\/g, “”);

if ( !isXML && Expr.attrMap[name] ) {
match[1] = Expr.attrMap[name];
}

if ( match[2] === “~=” ) {
match[4] = ” ” + match[4] + ” “;
}

return match;
},
PSEUDO: function(match, curLoop, inplace, result, not){
if ( match[1] === “not” ) {
// If we’re dealing with a complex expression, or a simple one
if ( ( chunker.exec(match[3]) || “” ).length > 1 || /^w/.test(match[3]) ) {
match[3] = Sizzle(match[3], null, null, curLoop);
} else {
var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
if ( !inplace ) {
result.push.apply( result, ret );
}
return false;
}
} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
return true;
}

return match;
},
POS: function(match){
match.unshift( true );
return match;
}
},
filters: {
enabled: function(elem){
return elem.disabled === false && elem.type !== “hidden”;
},
disabled: function(elem){
return elem.disabled === true;
},
checked: function(elem){
return elem.checked === true;
},
selected: function(elem){
// Accessing this property makes selected-by-default
// options in Safari work properly
elem.parentNode.selectedIndex;
return elem.selected === true;
},
parent: function(elem){
return !!elem.firstChild;
},
empty: function(elem){
return !elem.firstChild;
},
has: function(elem, i, match){
return !!Sizzle( match[3], elem ).length;
},
header: function(elem){
return /hd/i.test( elem.nodeName );
},
text: function(elem){
return “text” === elem.type;
},
radio: function(elem){
return “radio” === elem.type;
},
checkbox: function(elem){
return “checkbox” === elem.type;
},
file: function(elem){
return “file” === elem.type;
},
password: function(elem){
return “password” === elem.type;
},
submit: function(elem){
return “submit” === elem.type;
},
image: function(elem){
return “image” === elem.type;
},
reset: function(elem){
return “reset” === elem.type;
},
button: function(elem){
return “button” === elem.type || elem.nodeName.toLowerCase() === “button”;
},
input: function(elem){
return /input|select|textarea|button/i.test(elem.nodeName);
}
},
setFilters: {
first: function(elem, i){
return i === 0;
},
last: function(elem, i, match, array){
return i === array.length – 1;
},
even: function(elem, i){
return i % 2 === 0;
},
odd: function(elem, i){
return i % 2 === 1;
},
lt: function(elem, i, match){
return i match[3] – 0;
},
nth: function(elem, i, match){
return match[3] – 0 === i;
},
eq: function(elem, i, match){
return match[3] – 0 === i;
}
},
filter: {
PSEUDO: function(elem, match, i, array){
var name = match[1], filter = Expr.filters[ name ];

if ( filter ) {
return filter( elem, i, match, array );
} else if ( name === “contains” ) {
return (elem.textContent || elem.innerText || getText([ elem ]) || “”).indexOf(match[3]) >= 0;
} else if ( name === “not” ) {
var not = match[3];

for ( var i = 0, l = not.length; i = 0 );
}
}
},
ID: function(elem, match){
return elem.nodeType === 1 && elem.getAttribute(“id”) === match;
},
TAG: function(elem, match){
return (match === “*” && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
},
CLASS: function(elem, match){
return (” ” + (elem.className || elem.getAttribute(“class”)) + ” “)
.indexOf( match ) > -1;
},
ATTR: function(elem, match){
var name = match[1],
result = Expr.attrHandle[ name ] ?
Expr.attrHandle[ name ]( elem ) :
elem[ name ] != null ?
elem[ name ] :
elem.getAttribute( name ),
value = result + “”,
type = match[2],
check = match[4];

return result == null ?
type === “!=” :
type === “=” ?
value === check :
type === “*=” ?
value.indexOf(check) >= 0 :
type === “~=” ?
(” ” + value + ” “).indexOf(check) >= 0 :
!check ?
value && result !== false :
type === “!=” ?
value !== check :
type === “^=” ?
value.indexOf(check) === 0 :
type === “$=” ?
value.substr(value.length – check.length) === check :
type === “|=” ?
value === check || value.substr(0, check.length + 1) === check + “-” :
false;
},
POS: function(elem, match, i, array){
var name = match[2], filter = Expr.setFilters[ name ];

if ( filter ) {
return filter( elem, i, match, array );
}
}
}
};

var origPOS = Expr.match.POS;

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, function(all, num){
return “\” + (num – 0 + 1);
}));
}

var makeArray = function(array, results) {
array = Array.prototype.slice.call( array, 0 );

if ( results ) {
results.push.apply( results, array );
return results;
}

return array;
};

// Perform a simple check to determine if the browser is capable of
// converting a NodeList to an array using builtin methods.
// Also verifies that the returned array holds DOM nodes
// (which is not the case in the Blackberry browser)
try {
Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;

// Provide a fallback method if it does not work
} catch(e){
makeArray = function(array, results) {
var ret = results || [];

if ( toString.call(array) === “[object Array]” ) {
Array.prototype.push.apply( ret, array );
} else {
if ( typeof array.length === “number” ) {
for ( var i = 0, l = array.length; i < l; i++ ) {
ret.push( array[i] );
}
} else {
for ( var i = 0; array[i]; i++ ) {
ret.push( array[i] );
}
}
}

return ret;
};
}

var sortOrder;

if ( document.documentElement.compareDocumentPosition ) {
sortOrder = function( a, b ) {
if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.compareDocumentPosition ? -1 : 1;
}

var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
} else if ( "sourceIndex" in document.documentElement ) {
sortOrder = function( a, b ) {
if ( !a.sourceIndex || !b.sourceIndex ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.sourceIndex ? -1 : 1;
}

var ret = a.sourceIndex – b.sourceIndex;
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
} else if ( document.createRange ) {
sortOrder = function( a, b ) {
if ( !a.ownerDocument || !b.ownerDocument ) {
if ( a == b ) {
hasDuplicate = true;
}
return a.ownerDocument ? -1 : 1;
}

var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
aRange.setStart(a, 0);
aRange.setEnd(a, 0);
bRange.setStart(b, 0);
bRange.setEnd(b, 0);
var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
if ( ret === 0 ) {
hasDuplicate = true;
}
return ret;
};
}

// Utility function for retreiving the text value of an array of DOM nodes
function getText( elems ) {
var ret = "", elem;

for ( var i = 0; elems[i]; i++ ) {
elem = elems[i];

// Get the text from text nodes and CDATA nodes
if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
ret += elem.nodeValue;

// Traverse everything else, except comment nodes
} else if ( elem.nodeType !== 8 ) {
ret += getText( elem.childNodes );
}
}

return ret;
}

// Check to see if the browser returns elements by name when
// querying by getElementById (and provide a workaround)
(function(){
// We're going to inject a fake input element with a specified name
var form = document.createElement("div"),
id = "script" + (new Date).getTime();
form.innerHTML = "“;

// Inject it into the root element, check its status, and remove it quickly
var root = document.documentElement;
root.insertBefore( form, root.firstChild );

// The workaround has to do additional checks after a getElementById
// Which slows things down for other browsers (hence the branching)
if ( document.getElementById( id ) ) {
Expr.find.ID = function(match, context, isXML){
if ( typeof context.getElementById !== “undefined” && !isXML ) {
var m = context.getElementById(match[1]);
return m ? m.id === match[1] || typeof m.getAttributeNode !== “undefined” && m.getAttributeNode(“id”).nodeValue === match[1] ? [m] : undefined : [];
}
};

Expr.filter.ID = function(elem, match){
var node = typeof elem.getAttributeNode !== “undefined” && elem.getAttributeNode(“id”);
return elem.nodeType === 1 && node && node.nodeValue === match;
};
}

root.removeChild( form );
root = form = null; // release memory in IE
})();

(function(){
// Check to see if the browser returns only elements
// when doing getElementsByTagName(“*”)

// Create a fake element
var div = document.createElement(“div”);
div.appendChild( document.createComment(“”) );

// Make sure no comments are found
if ( div.getElementsByTagName(“*”).length > 0 ) {
Expr.find.TAG = function(match, context){
var results = context.getElementsByTagName(match[1]);

// Filter out possible comments
if ( match[1] === “*” ) {
var tmp = [];

for ( var i = 0; results[i]; i++ ) {
if ( results[i].nodeType === 1 ) {
tmp.push( results[i] );
}
}

results = tmp;
}

return results;
};
}

// Check to see if an attribute returns normalized href attributes
div.innerHTML = “
“;
if ( div.firstChild && typeof div.firstChild.getAttribute !== “undefined” &&
div.firstChild.getAttribute(“href”) !== “#” ) {
Expr.attrHandle.href = function(elem){
return elem.getAttribute(“href”, 2);
};
}

div = null; // release memory in IE
})();

if ( document.querySelectorAll ) {
(function(){
var oldSizzle = Sizzle, div = document.createElement(“div”);
div.innerHTML = ”

“;

// Safari can’t handle uppercase or unicode characters when
// in quirks mode.
if ( div.querySelectorAll && div.querySelectorAll(“.TEST”).length === 0 ) {
return;
}

Sizzle = function(query, context, extra, seed){
context = context || document;

// Only use querySelectorAll on non-XML documents
// (ID selectors don’t work in non-HTML documents)
if ( !seed && context.nodeType === 9 && !isXML(context) ) {
try {
return makeArray( context.querySelectorAll(query), extra );
} catch(e){}
}

return oldSizzle(query, context, extra, seed);
};

for ( var prop in oldSizzle ) {
Sizzle[ prop ] = oldSizzle[ prop ];
}

div = null; // release memory in IE
})();
}

(function(){
var div = document.createElement(“div”);

div.innerHTML = ”

“;

// Opera can’t find a second classname (in 9.6)
// Also, make sure that getElementsByClassName actually exists
if ( !div.getElementsByClassName || div.getElementsByClassName(“e”).length === 0 ) {
return;
}

// Safari caches class attributes, doesn’t catch changes (in 3.2)
div.lastChild.className = “e”;

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 ) {
return context.getElementsByClassName(match[1]);
}
};

div = null; // release memory in IE
})();

function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
for ( var i = 0, l = checkSet.length; i < l; i++ ) {
var elem = checkSet[i];
if ( elem ) {
elem = elem[dir];
var match = false;

while ( elem ) {
if ( elem.sizcache === doneName ) {
match = checkSet[elem.sizset];
break;
}

if ( elem.nodeType === 1 && !isXML ){
elem.sizcache = doneName;
elem.sizset = i;
}

if ( elem.nodeName.toLowerCase() === cur ) {
match = elem;
break;
}

elem = elem[dir];
}

checkSet[i] = match;
}
}
}

function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
for ( var i = 0, l = checkSet.length; i 0 ) {
match = elem;
break;
}
}

elem = elem[dir];
}

checkSet[i] = match;
}
}
}

var contains = document.compareDocumentPosition ? function(a, b){
return !!(a.compareDocumentPosition(b) & 16);
} : function(a, b){
return a !== b && (a.contains ? a.contains(b) : true);
};

var isXML = function(elem){
// documentElement is verified for cases where it doesn’t yet exist
// (such as loading iframes in IE – #4833)
var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
return documentElement ? documentElement.nodeName !== “HTML” : false;
};

var posProcess = function(selector, context){
var tmpSet = [], later = “”, match,
root = context.nodeType ? [context] : context;

// Position selectors must be done after the filter
// And so must :not(positional) so we move all PSEUDOs to the end
while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
later += match[0];
selector = selector.replace( Expr.match.PSEUDO, “” );
}

selector = Expr.relative[selector] ? selector + “*” : selector;

for ( var i = 0, l = root.length; i = 0) === keep;
});
};

jQuery.fn.extend({
find: function( selector ) {
var ret = this.pushStack( “”, “find”, selector ), length = 0;

for ( var i = 0, l = this.length; i 0 ) {
// Make sure that the results are unique
for ( var n = length; n < ret.length; n++ ) {
for ( var r = 0; r < length; r++ ) {
if ( ret[r] === ret[n] ) {
ret.splice(n–, 1);
break;
}
}
}
}
}

return ret;
},

has: function( target ) {
var targets = jQuery( target );
return this.filter(function() {
for ( var i = 0, l = targets.length; i 0;
},

closest: function( selectors, context ) {
if ( jQuery.isArray( selectors ) ) {
var ret = [], cur = this[0], match, matches = {}, selector;

if ( cur && selectors.length ) {
for ( var i = 0, l = selectors.length; i -1 : jQuery(cur).is(match) ) {
ret.push({ selector: selector, elem: cur });
delete matches[selector];
}
}
cur = cur.parentNode;
}
}

return ret;
}

var pos = jQuery.expr.match.POS.test( selectors ) ?
jQuery( selectors, context || this.context ) : null;

return this.map(function( i, cur ) {
while ( cur && cur.ownerDocument && cur !== context ) {
if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
return cur;
}
cur = cur.parentNode;
}
return null;
});
},

// Determine the position of an element within
// the matched set of elements
index: function( elem ) {
if ( !elem || typeof elem === “string” ) {
return jQuery.inArray( this[0],
// If it receives a string, the selector is used
// If it receives nothing, the siblings are used
elem ? jQuery( elem ) : this.parent().children() );
}
// Locate the position of the desired element
return jQuery.inArray(
// If it receives a jQuery object, the first element is used
elem.jquery ? elem[0] : elem, this );
},

add: function( selector, context ) {
var set = typeof selector === “string” ?
jQuery( selector, context || this.context ) :
jQuery.makeArray( selector ),
all = jQuery.merge( this.get(), set );

return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
all :
jQuery.unique( all ) );
},

andSelf: function() {
return this.add( this.prevObject );
}
});

// A painfully simple check to see if an element is disconnected
// from a document (should be improved, where feasible).
function isDisconnected( node ) {
return !node || !node.parentNode || node.parentNode.nodeType === 11;
}

jQuery.each({
parent: function( elem ) {
var parent = elem.parentNode;
return parent && parent.nodeType !== 11 ? parent : null;
},
parents: function( elem ) {
return jQuery.dir( elem, “parentNode” );
},
parentsUntil: function( elem, i, until ) {
return jQuery.dir( elem, “parentNode”, until );
},
next: function( elem ) {
return jQuery.nth( elem, 2, “nextSibling” );
},
prev: function( elem ) {
return jQuery.nth( elem, 2, “previousSibling” );
},
nextAll: function( elem ) {
return jQuery.dir( elem, “nextSibling” );
},
prevAll: function( elem ) {
return jQuery.dir( elem, “previousSibling” );
},
nextUntil: function( elem, i, until ) {
return jQuery.dir( elem, “nextSibling”, until );
},
prevUntil: function( elem, i, until ) {
return jQuery.dir( elem, “previousSibling”, until );
},
siblings: function( elem ) {
return jQuery.sibling( elem.parentNode.firstChild, elem );
},
children: function( elem ) {
return jQuery.sibling( elem.firstChild );
},
contents: function( elem ) {
return jQuery.nodeName( elem, “iframe” ) ?
elem.contentDocument || elem.contentWindow.document :
jQuery.makeArray( elem.childNodes );
}
}, function( name, fn ) {
jQuery.fn[ name ] = function( until, selector ) {
var ret = jQuery.map( this, fn, until );

if ( !runtil.test( name ) ) {
selector = until;
}

if ( selector && typeof selector === “string” ) {
ret = jQuery.filter( selector, ret );
}

ret = this.length > 1 ? jQuery.unique( ret ) : ret;

if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
ret = ret.reverse();
}

return this.pushStack( ret, name, slice.call(arguments).join(“,”) );
};
});

jQuery.extend({
filter: function( expr, elems, not ) {
if ( not ) {
expr = “:not(” + expr + “)”;
}

return jQuery.find.matches(expr, elems);
},

dir: function( elem, dir, until ) {
var matched = [], cur = elem[dir];
while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
if ( cur.nodeType === 1 ) {
matched.push( cur );
}
cur = cur[dir];
}
return matched;
},

nth: function( cur, result, dir, elem ) {
result = result || 1;
var num = 0;

for ( ; cur; cur = cur[dir] ) {
if ( cur.nodeType === 1 && ++num === result ) {
break;
}
}

return cur;
},

sibling: function( n, elem ) {
var r = [];

for ( ; n; n = n.nextSibling ) {
if ( n.nodeType === 1 && n !== elem ) {
r.push( n );
}
}

return r;
}
});
var rinlinejQuery = / jQueryd+=”(?:d+|null)”/g,
rleadingWhitespace = /^s+/,
rxhtmlTag = /(]*?)/>/g,
rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
rtagName = /<([w:]+)/,
rtbody = /

<tbody/i,
rhtml = /<|&#?w+;/,
rnocache = /<script|<object|<embed|































<option|

“;
},
wrapMap = {
option: [ 1, “”, ”

” ],
legend: [ 1, ”

“, ”

” ],
thead: [ 1, ”

“, “

” ],
tr: [ 2, ”

“, “

” ],
td: [ 3, ”

“, “

” ],
col: [ 2, ”

“, “

” ],
area: [ 1, ”

“, “

” ],
_default: [ 0, “”, “” ]
};

wrapMap.optgroup = wrapMap.option;
wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;

// IE can’t serialize

and tags normally
if ( !jQuery.support.htmlSerialize ) {
wrapMap._default = [ 1, “div

“, “

” ];
}

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 );
},

wrapAll: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each(function(i) {
jQuery(this).wrapAll( html.call(this, i) );
});
}

if ( this[0] ) {
// The elements to wrap the target around
var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);

if ( this[0].parentNode ) {
wrap.insertBefore( this[0] );
}

wrap.map(function() {
var elem = this;

while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
elem = elem.firstChild;
}

return elem;
}).append(this);
}

return this;
},

wrapInner: function( html ) {
if ( jQuery.isFunction( html ) ) {
return this.each(function(i) {
jQuery(this).wrapInner( html.call(this, i) );
});
}

return this.each(function() {
var self = jQuery( this ), contents = self.contents();

if ( contents.length ) {
contents.wrapAll( html );

} else {
self.append( html );
}
});
},

wrap: function( html ) {
return this.each(function() {
jQuery( this ).wrapAll( html );
});
},

unwrap: function() {
return this.parent().each(function() {
if ( !jQuery.nodeName( this, “body” ) ) {
jQuery( this ).replaceWith( this.childNodes );
}
}).end();
},

append: function() {
return this.domManip(arguments, true, function( elem ) {
if ( this.nodeType === 1 ) {
this.appendChild( elem );
}
});
},

prepend: function() {
return this.domManip(arguments, true, function( elem ) {
if ( this.nodeType === 1 ) {
this.insertBefore( elem, this.firstChild );
}
});
},

before: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this );
});
} else if ( arguments.length ) {
var set = jQuery(arguments[0]);
set.push.apply( set, this.toArray() );
return this.pushStack( set, “before”, arguments );
}
},

after: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this.nextSibling );
});
} else if ( arguments.length ) {
var set = this.pushStack( this, “after”, arguments );
set.push.apply( set, jQuery(arguments[0]).toArray() );
return set;
}
},

// keepData is for internal use only–do not document
remove: function( selector, keepData ) {
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
if ( !keepData && elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName(“*”) );
jQuery.cleanData( [ elem ] );
}

if ( elem.parentNode ) {
elem.parentNode.removeChild( elem );
}
}
}

return this;
},

empty: function() {
for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
// Remove element nodes and prevent memory leaks
if ( elem.nodeType === 1 ) {
jQuery.cleanData( elem.getElementsByTagName(“*”) );
}

// Remove any remaining nodes
while ( elem.firstChild ) {
elem.removeChild( elem.firstChild );
}
}

return this;
},

clone: function( events ) {
// Do the clone
var ret = this.map(function() {
if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
// IE copies events bound via attachEvent when
// using cloneNode. Calling detachEvent on the
// clone will also remove the events from the orignal
// In order to get around this, we use innerHTML.
// Unfortunately, this means some modifications to
// attributes in IE that are actually only stored
// as properties will not be copied (such as the
// the name attribute on an input).
var html = this.outerHTML, ownerDocument = this.ownerDocument;
if ( !html ) {
var div = ownerDocument.createElement(“div”);
div.appendChild( this.cloneNode(true) );
html = div.innerHTML;
}

return jQuery.clean([html.replace(rinlinejQuery, “”)
// Handle the case in IE 8 where action=/test/> self-closes a tag
.replace(/=([^=”‘>s]+/)>/g, ‘=”$1″>’)
.replace(rleadingWhitespace, “”)], ownerDocument)[0];
} else {
return this.cloneNode(true);
}
});

// Copy the events from the original to the clone
if ( events === true ) {
cloneCopyEvent( this, ret );
cloneCopyEvent( this.find(“*”), ret.find(“*”) );
}

// Return the cloned set
return ret;
},

html: function( value ) {
if ( value === undefined ) {
return this[0] && this[0].nodeType === 1 ?
this[0].innerHTML.replace(rinlinejQuery, “”) :
null;

// See if we can take a shortcut and just use innerHTML
} else if ( typeof value === “string” && !rnocache.test( value ) &&
(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
!wrapMap[ (rtagName.exec( value ) || [“”, “”])[1].toLowerCase() ] ) {

value = value.replace(rxhtmlTag, fcloseTag);

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 using innerHTML throws an exception, use the fallback method
} catch(e) {
this.empty().append( value );
}

} else if ( jQuery.isFunction( value ) ) {
this.each(function(i){
var self = jQuery(this), old = self.html();
self.empty().append(function(){
return value.call( this, i, old );
});
});

} else {
this.empty().append( value );
}

return this;
},

replaceWith: function( value ) {
if ( this[0] && this[0].parentNode ) {
// Make sure that the elements are removed from the DOM before they are inserted
// this can help fix replacing a parent with child elements
if ( jQuery.isFunction( value ) ) {
return this.each(function(i) {
var self = jQuery(this), old = self.html();
self.replaceWith( value.call( this, i, old ) );
});
}

if ( typeof value !== "string" ) {
value = jQuery(value).detach();
}

return this.each(function() {
var next = this.nextSibling, parent = this.parentNode;

jQuery(this).remove();

if ( next ) {
jQuery(next).before( value );
} else {
jQuery(parent).append( value );
}
});
} else {
return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
}
},

detach: function( selector ) {
return this.remove( selector, true );
},

domManip: function( args, table, callback ) {
var results, first, value = args[0], scripts = [], fragment, parent;

// We can't cloneNode fragments that contain checked, in WebKit
if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
return this.each(function() {
jQuery(this).domManip( args, table, callback, true );
});
}

if ( jQuery.isFunction(value) ) {
return this.each(function(i) {
var self = jQuery(this);
args[0] = value.call(this, i, table ? self.html() : undefined);
self.domManip( args, table, callback );
});
}

if ( this[0] ) {
parent = value && value.parentNode;

// If we're in a fragment, just use that instead of building a new one
if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
results = { fragment: parent };

} else {
results = buildFragment( args, this, scripts );
}

fragment = results.fragment;

if ( fragment.childNodes.length === 1 ) {
first = fragment = fragment.firstChild;
} else {
first = fragment.firstChild;
}

if ( first ) {
table = table && jQuery.nodeName( first, "tr" );

for ( var i = 0, l = this.length; i 0 || results.cacheable || this.length > 1 ?
fragment.cloneNode(true) :
fragment
);
}
}

if ( scripts.length ) {
jQuery.each( scripts, evalScript );
}
}

return this;

function root( elem, cur ) {
return jQuery.nodeName(elem, “table”) ?
(elem.getElementsByTagName(“tbody”)[0] ||
elem.appendChild(elem.ownerDocument.createElement(“tbody”))) :
elem;
}
}
});

function cloneCopyEvent(orig, ret) {
var i = 0;

ret.each(function() {
if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
return;
}

var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;

if ( events ) {
delete curData.handle;
curData.events = {};

for ( var type in events ) {
for ( var handler in events[ type ] ) {
jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
}
}
}
});
}

function buildFragment( args, nodes, scripts ) {
var fragment, cacheable, cacheresults,
doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);

// Only cache “small” (1/2 KB) strings that are associated with the main document
// Cloning options loses the selected state, so don’t cache them
// IE 6 doesn’t like it when you put or elements in a fragment
// Also, WebKit does not clone ‘checked’ attributes on cloneNode, so don’t cache
if ( args.length === 1 && typeof args[0] === “string” && args[0].length < 512 && doc === document &&
!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {

cacheable = true;
cacheresults = jQuery.fragments[ args[0] ];
if ( cacheresults ) {
if ( cacheresults !== 1 ) {
fragment = cacheresults;
}
}
}

if ( !fragment ) {
fragment = doc.createDocumentFragment();
jQuery.clean( args, doc, fragment, scripts );
}

if ( cacheable ) {
jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
}

return { fragment: fragment, cacheable: cacheable };
}

jQuery.fragments = {};

jQuery.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function( name, original ) {
jQuery.fn[ name ] = function( selector ) {
var ret = [], insert = jQuery( selector ),
parent = this.length === 1 && this[0].parentNode;

if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
insert[ original ]( this[0] );
return this;

} else {
for ( var i = 0, l = insert.length; i 0 ? this.clone(true) : this).get();
jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
ret = ret.concat( elems );
}

return this.pushStack( ret, name, insert.selector );
}
};
});

jQuery.extend({
clean: function( elems, context, fragment, scripts ) {
context = context || document;

// !context.createElement fails in IE with an error but returns typeof ‘object’
if ( typeof context.createElement === “undefined” ) {
context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
}

var ret = [];

for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
if ( typeof elem === “number” ) {
elem += “”;
}

if ( !elem ) {
continue;
}

// Convert html string into DOM nodes
if ( typeof elem === “string” && !rhtml.test( elem ) ) {
elem = context.createTextNode( elem );

} else if ( typeof elem === “string” ) {
// Fix “XHTML”-style tags in all browsers
elem = elem.replace(rxhtmlTag, fcloseTag);

// Trim whitespace, otherwise indexOf won’t work as expected
var tag = (rtagName.exec( elem ) || [“”, “”])[1].toLowerCase(),
wrap = wrapMap[ tag ] || wrapMap._default,
depth = wrap[0],
div = context.createElement(“div”);

// Go to html and back, then peel off extra wrappers
div.innerHTML = wrap[1] + elem + wrap[2];

// Move to the right depth
while ( depth– ) {
div = div.lastChild;
}

// Remove IE’s autoinserted

from table fragments
if ( !jQuery.support.tbody ) {

// String was a

, *may* have spurious

var hasBody = rtbody.test(elem),
tbody = tag === “table” && !hasBody ?
div.firstChild && div.firstChild.childNodes :

// String was a bare

or

wrap[1] === ”

” && !hasBody ?
div.childNodes :
[];

for ( var j = tbody.length – 1; j >= 0 ; –j ) {
if ( jQuery.nodeName( tbody[ j ], “tbody” ) && !tbody[ j ].childNodes.length ) {
tbody[ j ].parentNode.removeChild( tbody[ j ] );
}
}

}

// IE completely kills leading whitespace when innerHTML is used
if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
}

elem = div.childNodes;
}

if ( elem.nodeType ) {
ret.push( elem );
} else {
ret = jQuery.merge( ret, elem );
}
}

if ( fragment ) {
for ( var 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] );

} else {
if ( ret[i].nodeType === 1 ) {
ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName(“script”))) );
}
fragment.appendChild( ret[i] );
}
}
}

return ret;
},

cleanData: function( elems ) {
var data, id, cache = jQuery.cache,
special = jQuery.event.special,
deleteExpando = jQuery.support.deleteExpando;

for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
id = elem[ jQuery.expando ];

if ( id ) {
data = cache[ id ];

if ( data.events ) {
for ( var type in data.events ) {
if ( special[ type ] ) {
jQuery.event.remove( elem, type );

} else {
removeEvent( elem, type, data.handle );
}
}
}

if ( deleteExpando ) {
delete elem[ jQuery.expando ];

} else if ( elem.removeAttribute ) {
elem.removeAttribute( jQuery.expando );
}

delete cache[ id ];
}
}
}
});
// exclude the following css properties to add px
var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
ralpha = /alpha([^)]*)/,
ropacity = /opacity=([^)]*)/,
rfloat = /float/i,
rdashAlpha = /-([a-z])/ig,
rupper = /([A-Z])/g,
rnumpx = /^-?d+(?:px)?$/i,
rnum = /^-?d/,

cssShow = { position: “absolute”, visibility: “hidden”, display:”block” },
cssWidth = [ “Left”, “Right” ],
cssHeight = [ “Top”, “Bottom” ],

// cache check for defaultView.getComputedStyle
getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
// normalize float css property
styleFloat = jQuery.support.cssFloat ? “cssFloat” : “styleFloat”,
fcamelCase = function( all, letter ) {
return letter.toUpperCase();
};

jQuery.fn.css = function( name, value ) {
return access( this, name, value, true, function( elem, name, value ) {
if ( value === undefined ) {
return jQuery.curCSS( elem, name );
}

if ( typeof value === “number” && !rexclude.test(name) ) {
value += “px”;
}

jQuery.style( elem, name, value );
});
};

jQuery.extend({
style: function( elem, name, value ) {
// don’t set styles on text and comment nodes
if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
return undefined;
}

// ignore negative width and height values #1599
if ( (name === “width” || name === “height”) && parseFloat(value) = 0 ?
(parseFloat( ropacity.exec(style.filter)[1] ) / 100) + “”:
“”;
}

// Make sure we’re using the right name for getting the float value
if ( rfloat.test( name ) ) {
name = styleFloat;
}

name = name.replace(rdashAlpha, fcamelCase);

if ( set ) {
style[ name ] = value;
}

return style[ name ];
},

css: function( elem, name, force, extra ) {
if ( name === “width” || name === “height” ) {
var val, props = cssShow, which = name === “width” ? cssWidth : cssHeight;

function getWH() {
val = name === “width” ? elem.offsetWidth : elem.offsetHeight;

if ( extra === “border” ) {
return;
}

jQuery.each( which, function() {
if ( !extra ) {
val -= parseFloat(jQuery.curCSS( elem, “padding” + this, true)) || 0;
}

if ( extra === “margin” ) {
val += parseFloat(jQuery.curCSS( elem, “margin” + this, true)) || 0;
} else {
val -= parseFloat(jQuery.curCSS( elem, “border” + this + “Width”, true)) || 0;
}
});
}

if ( elem.offsetWidth !== 0 ) {
getWH();
} else {
jQuery.swap( elem, props, getWH );
}

return Math.max(0, Math.round(val));
}

return jQuery.curCSS( elem, name, force );
},

curCSS: function( elem, name, force ) {
var ret, style = elem.style, filter;

// IE uses filters for opacity
if ( !jQuery.support.opacity && name === “opacity” && elem.currentStyle ) {
ret = ropacity.test(elem.currentStyle.filter || “”) ?
(parseFloat(RegExp.$1) / 100) + “” :
“”;

return ret === “” ?
“1” :
ret;
}

// Make sure we’re using the right name for getting the float value
if ( rfloat.test( name ) ) {
name = styleFloat;
}

if ( !force && style && style[ name ] ) {
ret = style[ name ];

} else if ( getComputedStyle ) {

// Only “float” is needed here
if ( rfloat.test( name ) ) {
name = “float”;
}

name = name.replace( rupper, “-$1” ).toLowerCase();

var defaultView = elem.ownerDocument.defaultView;

if ( !defaultView ) {
return null;
}

var computedStyle = defaultView.getComputedStyle( elem, null );

if ( computedStyle ) {
ret = computedStyle.getPropertyValue( name );
}

// We should always get a number back from opacity
if ( name === “opacity” && ret === “” ) {
ret = “1”;
}

} else if ( elem.currentStyle ) {
var camelCase = name.replace(rdashAlpha, fcamelCase);

ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];

// From the awesome hack by Dean Edwards
// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291

// 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 ) ) {
// Remember the original values
var left = style.left, rsLeft = elem.runtimeStyle.left;

// Put in the new values to get a computed value out
elem.runtimeStyle.left = elem.currentStyle.left;
style.left = camelCase === “fontSize” ? “1em” : (ret || 0);
ret = style.pixelLeft + “px”;

// Revert the changed values
style.left = left;
elem.runtimeStyle.left = rsLeft;
}
}

return ret;
},

// A method for quickly swapping in/out CSS properties to get correct calculations
swap: function( elem, options, callback ) {
var old = {};

// Remember the old values, and insert the new ones
for ( var name in options ) {
old[ name ] = elem.style[ name ];
elem.style[ name ] = options[ name ];
}

callback.call( elem );

// Revert the old values
for ( var name in options ) {
elem.style[ name ] = old[ name ];
}
}
});

if ( jQuery.expr && jQuery.expr.filters ) {
jQuery.expr.filters.hidden = function( elem ) {
var width = elem.offsetWidth, height = elem.offsetHeight,
skip = elem.nodeName.toLowerCase() === “tr”;

return width === 0 && height === 0 && !skip ?
true :
width > 0 && height > 0 && !skip ?
false :
jQuery.curCSS(elem, “display”) === “none”;
};

jQuery.expr.filters.visible = function( elem ) {
return !jQuery.expr.filters.hidden( elem );
};
}
var jsc = now(),
rscript = //gi,
rselectTextarea = /select|textarea/i,
rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
jsre = /=?(&|$)/,
rquery = /?/,
rts = /(?|&)_=.*?(&|$)/,
rurl = /^(w+:)?//([^/?#]+)/,
r20 = /%20/g,

// Keep a copy of the old load method
_load = jQuery.fn.load;

jQuery.fn.extend({
load: function( url, params, callback ) {
if ( typeof url !== “string” ) {
return _load.call( this, url );

// Don’t do a request if no elements are being requested
} else if ( !this.length ) {
return this;
}

var off = url.indexOf(” “);
if ( off >= 0 ) {
var selector = url.slice(off, url.length);
url = url.slice(0, off);
}

// Default to a GET request
var type = “GET”;

// If the second parameter was provided
if ( params ) {
// If it’s a function
if ( jQuery.isFunction( params ) ) {
// We assume that it’s the callback
callback = params;
params = null;

// Otherwise, build a param string
} else if ( typeof params === “object” ) {
params = jQuery.param( params, jQuery.ajaxSettings.traditional );
type = “POST”;
}
}

var self = this;

// Request the remote document
jQuery.ajax({
url: url,
type: type,
dataType: “html”,
data: params,
complete: function( res, status ) {
// If successful, inject the HTML into all the matched elements
if ( status === “success” || status === “notmodified” ) {
// See if a selector was specified
self.html( selector ?
// Create a dummy div to hold the results
jQuery(”

“)
// inject the contents of the document in, removing the scripts
// to avoid any ‘Permission Denied’ errors in IE
.append(res.responseText.replace(rscript, “”))

// Locate the specified elements
.find(selector) :

// If not, just inject the full result
res.responseText );
}

if ( callback ) {
self.each( callback, [res.responseText, status, res] );
}
}
});

return this;
},

serialize: function() {
return jQuery.param(this.serializeArray());
},
serializeArray: function() {
return this.map(function() {
return this.elements ? jQuery.makeArray(this.elements) : this;
})
.filter(function() {
return this.name && !this.disabled &&
(this.checked || rselectTextarea.test(this.nodeName) ||
rinput.test(this.type));
})
.map(function( i, elem ) {
var val = jQuery(this).val();

return val == null ?
null :
jQuery.isArray(val) ?
jQuery.map( val, function( val, i ) {
return { name: elem.name, value: val };
}) :
{ name: elem.name, value: val };
}).get();
}
});

// 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);
};
});

jQuery.extend({

get: function( url, data, callback, type ) {
// shift arguments if data argument was omited
if ( jQuery.isFunction( data ) ) {
type = type || callback;
callback = data;
data = null;
}

return jQuery.ajax({
type: “GET”,
url: url,
data: data,
success: callback,
dataType: type
});
},

getScript: function( url, callback ) {
return jQuery.get(url, null, callback, “script”);
},

getJSON: function( url, data, callback ) {
return jQuery.get(url, data, callback, “json”);
},

post: function( url, data, callback, type ) {
// shift arguments if data argument was omited
if ( jQuery.isFunction( data ) ) {
type = type || callback;
callback = data;
data = {};
}

return jQuery.ajax({
type: “POST”,
url: url,
data: data,
success: callback,
dataType: type
});
},

ajaxSetup: function( settings ) {
jQuery.extend( jQuery.ajaxSettings, settings );
},

ajaxSettings: {
url: location.href,
global: true,
type: “GET”,
contentType: “application/x-www-form-urlencoded”,
processData: true,
async: true,
/*
timeout: 0,
data: null,
username: null,
password: null,
traditional: false,
*/
// Create the request object; Microsoft failed to properly
// implement the XMLHttpRequest in IE7 (can’t request local files),
// so we use the ActiveXObject when it is available
// This function can be overriden by calling jQuery.ajaxSetup
xhr: window.XMLHttpRequest && (window.location.protocol !== “file:” || !window.ActiveXObject) ?
function() {
return new window.XMLHttpRequest();
} :
function() {
try {
return new window.ActiveXObject(“Microsoft.XMLHTTP”);
} catch(e) {}
},
accepts: {
xml: “application/xml, text/xml”,
html: “text/html”,
script: “text/javascript, application/javascript”,
json: “application/json, text/javascript”,
text: “text/plain”,
_default: “*/*”
}
},

// Last-Modified header cache for next request
lastModified: {},
etag: {},

ajax: function( origSettings ) {
var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);

var jsonp, status, data,
callbackContext = origSettings && origSettings.context || s,
type = s.type.toUpperCase();

// convert data if not already a string
if ( s.data && s.processData && typeof s.data !== “string” ) {
s.data = jQuery.param( s.data, s.traditional );
}

// Handle JSONP Parameter Callbacks
if ( s.dataType === “jsonp” ) {
if ( type === “GET” ) {
if ( !jsre.test( s.url ) ) {
s.url += (rquery.test( s.url ) ? “&” : “?”) + (s.jsonp || “callback”) + “=?”;
}
} else if ( !s.data || !jsre.test(s.data) ) {
s.data = (s.data ? s.data + “&” : “”) + (s.jsonp || “callback”) + “=?”;
}
s.dataType = “json”;
}

// Build temporary JSONP function
if ( s.dataType === “json” && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
jsonp = s.jsonpCallback || (“jsonp” + jsc++);

// Replace the =? sequence both in the query string and the data
if ( s.data ) {
s.data = (s.data + “”).replace(jsre, “=” + jsonp + “$1”);
}

s.url = s.url.replace(jsre, “=” + jsonp + “$1”);

// We need to make sure
// that a JSONP style response is executed properly
s.dataType = “script”;

// Handle JSONP-style loading
window[ jsonp ] = window[ jsonp ] || function( tmp ) {
data = tmp;
success();
complete();
// Garbage collect
window[ jsonp ] = undefined;

try {
delete window[ jsonp ];
} catch(e) {}

if ( head ) {
head.removeChild( script );
}
};
}

if ( s.dataType === “script” && s.cache === null ) {
s.cache = false;
}

if ( s.cache === false && type === “GET” ) {
var ts = now();

// try replacing _= if it is there
var ret = s.url.replace(rts, “$1_=” + ts + “$2”);

// if nothing was replaced, add timestamp to the end
s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? “&” : “?”) + “_=” + ts : “”);
}

// If data is available, append data to url for get requests
if ( s.data && type === “GET” ) {
s.url += (rquery.test(s.url) ? “&” : “?”) + s.data;
}

// Watch for a new set of requests
if ( s.global && ! jQuery.active++ ) {
jQuery.event.trigger( “ajaxStart” );
}

// Matches an absolute URL, and saves the domain
var parts = rurl.exec( s.url ),
remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);

// If we’re requesting a remote document
// and trying to load JSON or Script with a GET
if ( s.dataType === “script” && type === “GET” && remote ) {
var head = document.getElementsByTagName(“head”)[0] || document.documentElement;
var script = document.createElement(“script”);
script.src = s.url;
if ( s.scriptCharset ) {
script.charset = s.scriptCharset;
}

// Handle Script loading
if ( !jsonp ) {
var done = false;

// Attach handlers for all browsers
script.onload = script.onreadystatechange = function() {
if ( !done && (!this.readyState ||
this.readyState === “loaded” || this.readyState === “complete”) ) {
done = true;
success();
complete();

// Handle memory leak in IE
script.onload = script.onreadystatechange = null;
if ( head && script.parentNode ) {
head.removeChild( script );
}
}
};
}

// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709 and #4378).
head.insertBefore( script, head.firstChild );

// We handle everything using the script element injection
return undefined;
}

var requestDone = false;

// Create the request object
var xhr = s.xhr();

if ( !xhr ) {
return;
}

// Open the socket
// Passing null username, generates a login popup on Opera (#2865)
if ( s.username ) {
xhr.open(type, s.url, s.async, s.username, s.password);
} else {
xhr.open(type, s.url, s.async);
}

// Need an extra try/catch for cross domain requests in Firefox 3
try {
// Set the correct header, if data is being sent
if ( s.data || origSettings && origSettings.contentType ) {
xhr.setRequestHeader(“Content-Type”, s.contentType);
}

// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
if ( jQuery.lastModified[s.url] ) {
xhr.setRequestHeader(“If-Modified-Since”, jQuery.lastModified[s.url]);
}

if ( jQuery.etag[s.url] ) {
xhr.setRequestHeader(“If-None-Match”, jQuery.etag[s.url]);
}
}

// Set header so the called script knows that it’s an XMLHttpRequest
// Only send the header if it’s not a remote XHR
if ( !remote ) {
xhr.setRequestHeader(“X-Requested-With”, “XMLHttpRequest”);
}

// Set the Accepts header for the server, depending on the dataType
xhr.setRequestHeader(“Accept”, s.dataType && s.accepts[ s.dataType ] ?
s.accepts[ s.dataType ] + “, */*” :
s.accepts._default );
} catch(e) {}

// Allow custom headers/mimetypes and early abort
if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
// Handle the global AJAX counter
if ( s.global && ! –jQuery.active ) {
jQuery.event.trigger( “ajaxStop” );
}

// close opended socket
xhr.abort();
return false;
}

if ( s.global ) {
trigger(“ajaxSend”, [xhr, s]);
}

// Wait for a response to come back
var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
// The request was aborted
if ( !xhr || xhr.readyState === 0 || isTimeout === “abort” ) {
// Opera doesn’t call onreadystatechange before this point
// so we simulate the call
if ( !requestDone ) {
complete();
}

requestDone = true;
if ( xhr ) {
xhr.onreadystatechange = jQuery.noop;
}

// The transfer is complete and the data is available, or the request timed out
} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === “timeout”) ) {
requestDone = true;
xhr.onreadystatechange = jQuery.noop;

status = isTimeout === “timeout” ?
“timeout” :
!jQuery.httpSuccess( xhr ) ?
“error” :
s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
“notmodified” :
“success”;

var errMsg;

if ( status === “success” ) {
// Watch for, and catch, XML document parse errors
try {
// process the data (runs the xml through httpData regardless of callback)
data = jQuery.httpData( xhr, s.dataType, s );
} catch(err) {
status = “parsererror”;
errMsg = err;
}
}

// Make sure that the request was successful or notmodified
if ( status === “success” || status === “notmodified” ) {
// JSONP handles its own success callback
if ( !jsonp ) {
success();
}
} else {
jQuery.handleError(s, xhr, status, errMsg);
}

// Fire the complete handlers
complete();

if ( isTimeout === “timeout” ) {
xhr.abort();
}

// Stop memory leaks
if ( s.async ) {
xhr = null;
}
}
};

// Override the abort handler, if we can (IE doesn’t allow it, but that’s OK)
// Opera doesn’t fire onreadystatechange at all on abort
try {
var oldAbort = xhr.abort;
xhr.abort = function() {
if ( xhr ) {
oldAbort.call( xhr );
}

onreadystatechange( “abort” );
};
} catch(e) { }

// Timeout checker
if ( s.async && s.timeout > 0 ) {
setTimeout(function() {
// Check to see if the request is still happening
if ( xhr && !requestDone ) {
onreadystatechange( “timeout” );
}
}, s.timeout);
}

// Send the data
try {
xhr.send( type === “POST” || type === “PUT” || type === “DELETE” ? s.data : null );
} catch(e) {
jQuery.handleError(s, xhr, null, e);
// Fire the complete handlers
complete();
}

// firefox 1.5 doesn’t fire statechange for sync requests
if ( !s.async ) {
onreadystatechange();
}

function success() {
// If a local callback was specified, fire it and pass it the data
if ( s.success ) {
s.success.call( callbackContext, data, status, xhr );
}

// Fire the global callback
if ( s.global ) {
trigger( “ajaxSuccess”, [xhr, s] );
}
}

function complete() {
// Process result
if ( s.complete ) {
s.complete.call( callbackContext, xhr, status);
}

// The request was completed
if ( s.global ) {
trigger( “ajaxComplete”, [xhr, s] );
}

// Handle the global AJAX counter
if ( s.global && ! –jQuery.active ) {
jQuery.event.trigger( “ajaxStop” );
}
}

function trigger(type, args) {
(s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
}

// return XMLHttpRequest to allow aborting the request etc.
return xhr;
},

handleError: function( s, xhr, status, e ) {
// If a local callback was specified, fire it
if ( s.error ) {
s.error.call( s.context || s, xhr, status, e );
}

// Fire the global callback
if ( s.global ) {
(s.context ? jQuery(s.context) : jQuery.event).trigger( “ajaxError”, [xhr, s, e] );
}
},

// Counter for holding the number of active queries
active: 0,

// Determines if an XMLHttpRequest was successful or not
httpSuccess: function( xhr ) {
try {
// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
return !xhr.status && location.protocol === “file:” ||
// Opera returns 0 when status is 304
( xhr.status >= 200 && xhr.status = 0,
data = xml ? xhr.responseXML : xhr.responseText;

if ( xml && data.documentElement.nodeName === “parsererror” ) {
jQuery.error( “parsererror” );
}

// Allow a pre-filtering function to sanitize the response
// s is checked to keep backwards compatibility
if ( s && s.dataFilter ) {
data = s.dataFilter( data, type );
}

// The filter can actually parse the response
if ( typeof data === “string” ) {
// Get the JavaScript object, if JSON is used.
if ( type === “json” || !type && ct.indexOf(“json”) >= 0 ) {
data = jQuery.parseJSON( data );

// If the type is “script”, eval it in global context
} else if ( type === “script” || !type && ct.indexOf(“javascript”) >= 0 ) {
jQuery.globalEval( data );
}
}

return data;
},

// Serialize an array of form elements or a set of
// key/values into a query string
param: function( a, traditional ) {
var s = [];

// Set traditional to true for jQuery <= 1.3.2 behavior.
if ( traditional === undefined ) {
traditional = jQuery.ajaxSettings.traditional;
}

// If an array was passed in, assume that it is an array of form elements.
if ( jQuery.isArray(a) || a.jquery ) {
// Serialize the form elements
jQuery.each( a, function() {
add( this.name, this.value );
});

} else {
// If traditional, encode the "old" way (the way 1.3.2 or older
// did it), otherwise encode params recursively.
for ( var prefix in a ) {
buildParams( prefix, a[prefix] );
}
}

// Return the resulting serialization
return s.join("&").replace(r20, "+");

function buildParams( prefix, obj ) {
if ( jQuery.isArray(obj) ) {
// Serialize array item.
jQuery.each( obj, function( i, v ) {
if ( traditional || /[]$/.test( prefix ) ) {
// Treat each array item as a scalar.
add( prefix, v );
} else {
// If array item is non-scalar (array or object), encode its
// numeric index to resolve deserialization ambiguity issues.
// Note that rack (as of 1.0.0) can't currently deserialize
// nested arrays properly, and attempting to do so may cause
// 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 );
}
});

} else if ( !traditional && obj != null && typeof obj === "object" ) {
// Serialize object item.
jQuery.each( obj, function( k, v ) {
buildParams( prefix + "[" + k + "]", v );
});

} else {
// Serialize scalar item.
add( prefix, obj );
}
}

function add( key, value ) {
// If value is a function, invoke it and return its value
value = jQuery.isFunction(value) ? value() : value;
s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
}
}
});
var elemdisplay = {},
rfxtypes = /toggle|show|hide/,
rfxnum = /^([+-]=)?([d+-.]+)(.*)$/,
timerId,
fxAttrs = [
// height animations
[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
// width animations
[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
// opacity animations
[ "opacity" ]
];

jQuery.fn.extend({
show: function( speed, callback ) {
if ( speed || speed === 0) {
return this.animate( genFx("show", 3), speed, callback);

} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
var old = jQuery.data(this[i], "olddisplay");

this[i].style.display = old || "";

if ( jQuery.css(this[i], "display") === "none" ) {
var nodeName = this[i].nodeName, display;

if ( elemdisplay[ nodeName ] ) {
display = elemdisplay[ nodeName ];

} else {
var elem = jQuery("”).appendTo(“body”);

display = elem.css(“display”);

if ( display === “none” ) {
display = “block”;
}

elem.remove();

elemdisplay[ nodeName ] = display;
}

jQuery.data(this[i], “olddisplay”, display);
}
}

// Set the display of the elements in a second loop
// to avoid the constant reflow
for ( var j = 0, k = this.length; j < k; j++ ) {
this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
}

return this;
}
},

hide: function( speed, callback ) {
if ( speed || speed === 0 ) {
return this.animate( genFx("hide", 3), speed, callback);

} else {
for ( var i = 0, l = this.length; i < l; i++ ) {
var old = jQuery.data(this[i], "olddisplay");
if ( !old && old !== "none" ) {
jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
}
}

// Set the display of the elements in a second loop
// to avoid the constant reflow
for ( var j = 0, k = this.length; j = 0; i– ) {
if ( timers[i].elem === this ) {
if (gotoEnd) {
// force the next step to be the last
timers[i](true);
}

timers.splice(i, 1);
}
}
});

// start the next in the queue if the last step wasn’t forced
if ( !gotoEnd ) {
this.dequeue();
}

return this;
}

});

// Generate shortcuts for custom animations
jQuery.each({
slideDown: genFx(“show”, 1),
slideUp: genFx(“hide”, 1),
slideToggle: genFx(“toggle”, 1),
fadeIn: { opacity: “show” },
fadeOut: { opacity: “hide” }
}, function( name, props ) {
jQuery.fn[ name ] = function( speed, callback ) {
return this.animate( props, speed, callback );
};
});

jQuery.extend({
speed: function( speed, easing, fn ) {
var opt = speed && typeof speed === “object” ? speed : {
complete: fn || !fn && easing ||
jQuery.isFunction( speed ) && speed,
duration: speed,
easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
};

opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === “number” ? opt.duration :
jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;

// Queueing
opt.old = opt.complete;
opt.complete = function() {
if ( opt.queue !== false ) {
jQuery(this).dequeue();
}
if ( jQuery.isFunction( opt.old ) ) {
opt.old.call( this );
}
};

return opt;
},

easing: {
linear: function( p, n, firstNum, diff ) {
return firstNum + diff * p;
},
swing: function( p, n, firstNum, diff ) {
return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
}
},

timers: [],

fx: function( elem, options, prop ) {
this.options = options;
this.elem = elem;
this.prop = prop;

if ( !options.orig ) {
options.orig = {};
}
}

});

jQuery.fx.prototype = {
// Simple function for setting a style value
update: function() {
if ( this.options.step ) {
this.options.step.call( this.elem, this.now, this );
}

(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );

// Set display property to block for height/width animations
if ( ( this.prop === “height” || this.prop === “width” ) && this.elem.style ) {
this.elem.style.display = “block”;
}
},

// Get the current size
cur: function( force ) {
if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
return this.elem[ this.prop ];
}

var r = parseFloat(jQuery.css(this.elem, this.prop, force));
return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
},

// Start an animation from one number to another
custom: function( from, to, unit ) {
this.startTime = now();
this.start = from;
this.end = to;
this.unit = unit || this.unit || “px”;
this.now = this.start;
this.pos = this.state = 0;

var self = this;
function t( gotoEnd ) {
return self.step(gotoEnd);
}

t.elem = this.elem;

if ( t() && jQuery.timers.push(t) && !timerId ) {
timerId = setInterval(jQuery.fx.tick, 13);
}
},

// Simple ‘show’ function
show: function() {
// Remember where we started, so that we can go back to it later
this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
this.options.show = true;

// Begin the animation
// Make sure that we start at a small width/height to avoid any
// flash of content
this.custom(this.prop === “width” || this.prop === “height” ? 1 : 0, this.cur());

// Start by showing the element
jQuery( this.elem ).show();
},

// Simple ‘hide’ function
hide: function() {
// Remember where we started, so that we can go back to it later
this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
this.options.hide = true;

// Begin the animation
this.custom(this.cur(), 0);
},

// Each step of an animation
step: function( gotoEnd ) {
var t = now(), done = true;

if ( gotoEnd || t >= this.options.duration + this.startTime ) {
this.now = this.end;
this.pos = this.state = 1;
this.update();

this.options.curAnim[ this.prop ] = true;

for ( var i in this.options.curAnim ) {
if ( this.options.curAnim[i] !== true ) {
done = false;
}
}

if ( done ) {
if ( this.options.display != null ) {
// Reset the overflow
this.elem.style.overflow = this.options.overflow;

// Reset the display
var old = jQuery.data(this.elem, “olddisplay”);
this.elem.style.display = old ? old : this.options.display;

if ( jQuery.css(this.elem, “display”) === “none” ) {
this.elem.style.display = “block”;
}
}

// Hide the element if the “hide” operation was done
if ( this.options.hide ) {
jQuery(this.elem).hide();
}

// Reset the properties, if the item has been hidden or shown
if ( this.options.hide || this.options.show ) {
for ( var p in this.options.curAnim ) {
jQuery.style(this.elem, p, this.options.orig[p]);
}
}

// Execute the complete function
this.options.complete.call( this.elem );
}

return false;

} else {
var n = t – this.startTime;
this.state = n / this.options.duration;

// Perform the easing function, defaults to swing
var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
var defaultEasing = this.options.easing || (jQuery.easing.swing ? “swing” : “linear”);
this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
this.now = this.start + ((this.end – this.start) * this.pos);

// Perform the next step of the animation
this.update();
}

return true;
}
};

jQuery.extend( jQuery.fx, {
tick: function() {
var timers = jQuery.timers;

for ( var i = 0; i < timers.length; i++ ) {
if ( !timers[i]() ) {
timers.splice(i–, 1);
}
}

if ( !timers.length ) {
jQuery.fx.stop();
}
},

stop: function() {
clearInterval( timerId );
timerId = null;
},

speeds: {
slow: 600,
fast: 200,
// Default speed
_default: 400
},

step: {
opacity: function( fx ) {
jQuery.style(fx.elem, "opacity", fx.now);
},

_default: function( fx ) {
if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
} else {
fx.elem[ fx.prop ] = fx.now;
}
}
}
});

if ( jQuery.expr && jQuery.expr.filters ) {
jQuery.expr.filters.animated = function( elem ) {
return jQuery.grep(jQuery.timers, function( fn ) {
return elem === fn.elem;
}).length;
};
}

function genFx( type, num ) {
var obj = {};

jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
obj[ this ] = type;
});

return obj;
}
if ( "getBoundingClientRect" in document.documentElement ) {
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 );
}

var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
top = box.top + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ) – clientTop,
left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) – clientLeft;

return { top: top, left: left };
};

} 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 );
}

jQuery.offset.initialize();

var offsetParent = elem.offsetParent, prevOffsetParent = elem,
doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
body = doc.body, defaultView = doc.defaultView,
prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
top = elem.offsetTop, left = elem.offsetLeft;

while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
break;
}

computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
top -= elem.scrollTop;
left -= elem.scrollLeft;

if ( elem === offsetParent ) {
top += elem.offsetTop;
left += elem.offsetLeft;

if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
top += parseFloat( computedStyle.borderTopWidth ) || 0;
left += parseFloat( computedStyle.borderLeftWidth ) || 0;
}

prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
}

if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
top += parseFloat( computedStyle.borderTopWidth ) || 0;
left += parseFloat( computedStyle.borderLeftWidth ) || 0;
}

prevComputedStyle = computedStyle;
}

if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
top += body.offsetTop;
left += body.offsetLeft;
}

if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
top += Math.max( docElem.scrollTop, body.scrollTop );
left += Math.max( docElem.scrollLeft, body.scrollLeft );
}

return { top: top, left: left };
};
}

jQuery.offset = {
initialize: function() {
var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
html = "

“;

jQuery.extend( container.style, { position: “absolute”, top: 0, left: 0, margin: 0, border: 0, width: “1px”, height: “1px”, visibility: “hidden” } );

container.innerHTML = html;
body.insertBefore( container, body.firstChild );
innerDiv = container.firstChild;
checkDiv = innerDiv.firstChild;
td = innerDiv.nextSibling.firstChild.firstChild;

this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
this.doesAddBorderForTableAndCells = (td.offsetTop === 5);

checkDiv.style.position = “fixed”, checkDiv.style.top = “20px”;
// safari subtracts parent border width here which is 5px
this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
checkDiv.style.position = checkDiv.style.top = “”;

innerDiv.style.overflow = “hidden”, innerDiv.style.position = “relative”;
this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);

this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);

body.removeChild( container );
body = container = innerDiv = checkDiv = table = td = null;
jQuery.offset.initialize = jQuery.noop;
},

bodyOffset: function( body ) {
var top = body.offsetTop, left = body.offsetLeft;

jQuery.offset.initialize();

if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
top += parseFloat( jQuery.curCSS(body, “marginTop”, true) ) || 0;
left += parseFloat( jQuery.curCSS(body, “marginLeft”, true) ) || 0;
}

return { top: top, left: left };
},

setOffset: function( elem, options, i ) {
// set position first, in-case top/left are set even on static elem
if ( /static/.test( jQuery.curCSS( elem, “position” ) ) ) {
elem.style.position = “relative”;
}
var curElem = jQuery( elem ),
curOffset = curElem.offset(),
curTop = parseInt( jQuery.curCSS( elem, “top”, true ), 10 ) || 0,
curLeft = parseInt( jQuery.curCSS( elem, “left”, true ), 10 ) || 0;

if ( jQuery.isFunction( options ) ) {
options = options.call( elem, i, curOffset );
}

var props = {
top: (options.top – curOffset.top) + curTop,
left: (options.left – curOffset.left) + curLeft
};

if ( “using” in options ) {
options.using.call( elem, props );
} else {
curElem.css( props );
}
}
};

jQuery.fn.extend({
position: function() {
if ( !this[0] ) {
return null;
}

var elem = this[0],

// Get *real* offsetParent
offsetParent = this.offsetParent(),

// Get correct offsets
offset = this.offset(),
parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();

// Subtract element margins
// note: when an element has margin: auto the offsetLeft and marginLeft
// are the same in Safari causing offset.left to incorrectly be 0
offset.top -= parseFloat( jQuery.curCSS(elem, “marginTop”, true) ) || 0;
offset.left -= parseFloat( jQuery.curCSS(elem, “marginLeft”, true) ) || 0;

// Add offsetParent borders
parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], “borderTopWidth”, true) ) || 0;
parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], “borderLeftWidth”, true) ) || 0;

// Subtract the two offsets
return {
top: offset.top – parentOffset.top,
left: offset.left – parentOffset.left
};
},

offsetParent: function() {
return this.map(function() {
var offsetParent = this.offsetParent || document.body;
while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, “position”) === “static”) ) {
offsetParent = offsetParent.offsetParent;
}
return offsetParent;
});
}
});

// Create scrollLeft and scrollTop methods
jQuery.each( [“Left”, “Top”], function( i, name ) {
var method = “scroll” + name;

jQuery.fn[ method ] = function(val) {
var elem = this[0], win;

if ( !elem ) {
return null;
}

if ( val !== undefined ) {
// 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()
);

} else {
this[ method ] = val;
}
});
} else {
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 ];
}
};
});

function getWindow( elem ) {
return (“scrollTo” in elem && elem.document) ?
elem :
elem.nodeType === 9 ?
elem.defaultView || elem.parentWindow :
false;
}
// Create innerHeight, innerWidth, outerHeight and outerWidth methods
jQuery.each([ “Height”, “Width” ], function( i, name ) {

var type = name.toLowerCase();

// innerHeight and innerWidth
jQuery.fn[“inner” + name] = function() {
return this[0] ?
jQuery.css( this[0], type, false, “padding” ) :
null;
};

// outerHeight and outerWidth
jQuery.fn[“outer” + name] = function( margin ) {
return this[0] ?
jQuery.css( this[0], type, false, margin ? “margin” : “border” ) :
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 ]() ) );
});
}

return (“scrollTo” in elem && elem.document) ? // does it walk and quack like a window?
// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
elem.document.compatMode === “CSS1Compat” && elem.document.documentElement[ “client” + name ] ||
elem.document.body[ “client” + name ] :

// Get document width or height
(elem.nodeType === 9) ? // is it a document
// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
Math.max(
elem.documentElement[“client” + name],
elem.body[“scroll” + name], elem.documentElement[“scroll” + name],
elem.body[“offset” + name], elem.documentElement[“offset” + name]
) :

// Get or set width or height on the element
size === undefined ?
// Get width or height on the element
jQuery.css( elem, type ) :

// Set the width or height on the element (default to pixels if value is unitless)
this.css( type, typeof size === “string” ? size : size + “px” );
};

});
// Expose jQuery to the global object
window.jQueryWS = window.$WS = jQuery;

})(window);
// ]]>// 2 bytes 110yyyyy, 10zzzzzz
function(c) {
var cc = c.charCodeAt(0);
return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f);
})
.replace(/[u0800-uffff]/g, // U+0800 – U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz
function(c) {
var cc = c.charCodeAt(0);
return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f);
});
return strUtf;
},

/**
* Decode utf-8 encoded string back into multi-byte Unicode characters
*
* @param {String} strUtf UTF-8 string to be decoded back to Unicode
* @returns {String} decoded string
*/
decode: function(strUtf) {
// note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
var strUni = strUtf.replace(/[u00e0-u00ef][u0080-u00bf][u0080-u00bf]/g, // 3-byte chars
function(c) { // (note parentheses for precence)
var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f);
return String.fromCharCode(cc);
})
.replace(/[u00c0-u00df][u0080-u00bf]/g, // 2-byte chars
function(c) { // (note parentheses for precence)
var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f;
return String.fromCharCode(cc);
});
return strUni;
}
};

while(i < 256) {
var c = String.fromCharCode(i);
a256 += c;
r256[i] = i;
r64[i] = b64.indexOf(c);
++i;
}

function code(s, discard, alpha, beta, w1, w2) {
s = String(s);
var buffer = 0,
i = 0,
length = s.length,
result = '',
bitsInBuffer = 0;

while(i < length) {
var c = s.charCodeAt(i);
c = c < 256 ? alpha[c] : -1;

buffer = (buffer <= w2) {
bitsInBuffer -= w2;
var tmp = buffer >> bitsInBuffer;
result += beta.charAt(tmp);
buffer ^= tmp < 0) result += beta.charAt(buffer < 0);
coded = coded.join(”);
return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded;
};
}(jQueryWS));
// ]]>// <![CDATA[
;(function($){
jq_relocation = $.relocation = $.extend( $.relocation, {} );

jq_relocation['elems'] = $([]);

jq_relocation['timeout_id'];

jq_relocation['str_setTimeout'] = 'setTimeout';

jq_relocation['str_data'] = 'currentLocation';

jq_relocation['delay' ] = 10;

jq_relocation['add'] = function(elem, callback){

this.elems.push({e: elem, c: callback, data: { l: elem.offset().left, t: elem.offset().top }});

if ( this.elems.length == 1 ) {
this.loop();
}

};

jq_relocation['loop'] = function(){
this.timeout_id = window['setTimeout'](function(){

for (i in jq_relocation['elems']){
if (i // <![CDATA[
//WS视频下载插件辅助实现单元
//alert('jQuery.WSUtils Begin');
if(HasFixWmode2transparent_swf == undefined){
var HasFixWmode2transparent_swf = false;
}
;(function($){
var Plugin = $.WSUtils = function() {
return this;
};

Plugin.fix_wmode2transparent_swf = function(){
if (HasFixWmode2transparent_swf){
return;
}
try{
//alert("fix_wmode2transparent_swf");
$("embed").each(function(i) {
//alert("fix_wmode2transparent_swf 1");
var elClone = this.cloneNode(true);
elClone.setAttribute("WMode", "Transparent");
$(this).before(elClone);
$(this).remove();
});
// For object and/or embed into objects
$("object").each(function (i, v) {
//alert("fix_wmode2transparent_swf 2");
var elEmbed = $(this).children("embed");
if(typeof (elEmbed.get(0)) != "undefined") {
if(typeof (elEmbed.get(0).outerHTML) != "undefined") {
elEmbed.attr("wmode", "transparent");
$(this.outerHTML).insertAfter(this);
$(this).remove();
}
return;
}
var algo = this.attributes;
var str_tag = '<OBJECT ';
for (var i=0; i ‘;
var flag = false;
$(this).children().each(function (elem) {
if(this.nodeName == “PARAM”) {
if (this.name == “wmode”) {
flag=true;
str_tag += ”;
}
else str_tag += ”;
}
});
if(!flag)
str_tag += ”;
str_tag += ”;
$(str_tag).insertAfter(this);
$(this).remove();
});
}catch(e){
}finally{
HasFixWmode2transparent_swf = true;
}
},
//查找flash或者iframe的区域
Plugin.FindFlash = function(){
var FlashArea = $(‘object’).parent();
if (FlashArea == null) {
FlashArea = $(‘object’);
}
return FlashArea;
},

//判断是否是广告区域
Plugin.IsADArea = function (Flash){
var Ratio = Flash.width() / Flash.height();
//alert(Rratio);
if ((Ratio (2.6/*原来放的是16/9 但是发现有些视频网站还是会大些所以使用2*/))
return true
/* else if ((Ratio < 1.2) && Flash.width() < 350))
return true */
else
return false;
},
//调用派发系统
Plugin.InvokeProtocol = function (Protocol, seperator){
$.base64.utf8encode = true;
var Msg ='';
if (arguments.length==3) {
Msg = arguments[2];
}else{
for (var i=2;i< arguments.length;i++){
if (i == arguments.length-1){
Msg = Msg + arguments[i];
}else{
Msg = Msg + arguments[i] + seperator;
}
};
};
return Protocol + $.base64.btoa(Msg);
} ,
//获取浏览器类型
Plugin.Browser = function(){
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox/([d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome/([d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version/([d.]+).*safari/)) ? Sys.safari = s[1] : 0;
return Sys;
},

Plugin.newGuid = function() {
var guid = "";
for (var i = 1; i 1){
url = array[1];
}
array = url.split(‘/’);

if (array.length>1){
url = array[0];
}

array = url.split(‘.’);
var MainDomain = array[array.length-2] + ‘.’ + array[array.length-1];
if (array.length>2){
MainDomain = array[array.length-3] + ‘.’ + MainDomain;
}
return MainDomain;
},

//这个函数主要封装了json调用在不同浏览器下的不同行为
Plugin.ajaxEx = function(origSettings){
origSettings = $.extend({}, $.ajaxSettings, origSettings );
if (typeof(chrome)!=’undefined’ || ($.WSUtils.Browser().safari) ){
//alert(origSettings.success);
$.ajax({ type: origSettings.type,
url: origSettings.url,
data: origSettings.data,
async: origSettings.async,
dataType: ‘json’,
beforeSend: function(xhr){
if(origSettings.url.indexOf(“wondershare”) != -1){
xhr.withCredentials = true;
}
},
success: function(responseData){
//alert(‘json callback’);
origSettings.success(responseData);
},
complete: origSettings.complete,
error: origSettings.error
});
}else{
var isCall = false;
$.ajax({
type: origSettings.type,
url: origSettings.url,
data: origSettings.data,
async: origSettings.async,
jsonp: origSettings.jsonp,
dataType: origSettings.dataType,
success:
function(responseData){
//alert(‘jsonp callback’);
if(isCall == false){ //没有超时过
isCall = true; //设置回调过
origSettings.success(responseData);
};
},
complete: origSettings.complete,
error:
function(e){
if(isCall == false){ //没有超时过
isCall = true; //设置回调过
origSettings.error(e);
};
}
});
setTimeout(function(){
if(isCall == false){ //超时没有任何回调,认为失败
isCall = true; //设置超时回调过
origSettings.error(null);
}
}, 30000); //30秒超时检测
};
};
}(jQueryWS));

//alert(‘jQuery.WSUtils End’);
// ]]>// <![CDATA[
//alert('jQuery.Wondershare_WSVCU_Plugin begin');
var AttachStyleEnum = {
AttachOuterTopLeft: 0,
AttachOuterTopRight: 1,
AttachOuterBottomLeft: 2,
AttachOuterBottomRight: 3,
AttachInnerTopLeft: 4,
AttachInnerTopRight: 5,
AttachInnerBottomLeft: 6,
AttachInnerBottomRight: 7
};

;(function($) {
var Plugin = $.Wondershare_WSVCU_Plugin = function() {
return this;
};

Plugin.Log = function(msg){
$.WSUtils.Log(msg);
};

Plugin.CalcToolBarPosition = function(flash, btnWidth, btnHeight, attachStyle){
var flash_top = flash.offset().top;
var flash_left = flash.offset().left;
var flash_width = flash.width();
var flash_height = flash.height();
var divLeft = divTop = 0;
switch (attachStyle)
{
case AttachStyleEnum.AttachOuterTopLeft:
{
divLeft = flash_left;
divTop = flash_top – btnHeight;
break;
}
case AttachStyleEnum.AttachOuterTopRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top – btnHeight;
break;
}
case AttachStyleEnum.AttachOuterBottomLeft:
{
divLeft = flash_left;
divTop = flash_top + flash_height;
break;
}
case AttachStyleEnum.AttachOuterBottomRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top + flash_height;
break;
}
case AttachStyleEnum.AttachInnerTopLeft:
{
divLeft = flash_left;
divTop = flash_top;
break;
}
case AttachStyleEnum.AttachInnerTopRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top;
break;
}
case AttachStyleEnum.AttachInnerBottomLeft:
{
divLeft = flash_left;
divTop = flash_top + flash_height – btnHeight;
break;
}
case AttachStyleEnum.AttachInnerBottomRight:
{
divLeft = flash_left + flash_width – btnWidth;
divTop = flash_top + flash_height – btnHeight;
break;
}
}
return {
x: divLeft,
y: divTop
};
};
/* }(jQueryWS));

;(function($) { */
$.Wondershare_WSVCU_Plugin.Log('ToolBar');
Plugin.ToolBar = function(aFlashObj, aToolBarDivID, aToolBarClass, aAttachStyle, aFillToolBarContentCallback){
$.Wondershare_WSVCU_Plugin.Log('ToolBar 1.1');
var _ToolBar = new Object;
_ToolBar.DivID = $.WSUtils.newGuid();
_ToolBar._T;

_ToolBar._CanHide = false;
_ToolBar._KeepLongHide=false;
_ToolBar._AttachStyle = aAttachStyle;
_ToolBar._ToolBarDivID = '#' + _ToolBar.DivID;
_ToolBar._FillToolBarContent = aFillToolBarContentCallback;
_ToolBar._ToolbarClass = aToolBarClass;
_ToolBar.btnWidth = null;
_ToolBar.btnHeight = null;

$.Wondershare_WSVCU_Plugin.Log('ToolBar 1.2');
_ToolBar.CHECKTIME = 3000;

_ToolBar.GetCanHide = function() { return this._CanHide; };
_ToolBar.SetCanHide = function(value) {
//ClearTimer
if (this._CanHide){
this.ResetHideToolBarTime();
};

this._CanHide = value;
//CreateTime
if (this._CanHide){
var TempToolbar = this;
this._T = setInterval(function(){
TempToolbar.HideToolBar()
}, TempToolbar.CHECKTIME);
};
};

_ToolBar.MouseEnterFlashObject = function() {
if (this._KeepLongHide == true){
return;
}
if($(this._ToolBarDivID).size()==0){
//Append Toolbar
var DivToolBar = '


$(‘body’).append(DivToolBar);
//Fill DivToolBar content
var WH = this._FillToolBarContent(this._ToolBarDivID, aFlashObj);
//Adjuest Position
this.btnWidth = WH[0];
this.btnHeight = WH[1];
this._AdjuestPosition();

$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.3’);
$(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseleave’,
function(){
_ToolBar.SetCanHide(true);
}
);

$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.4’);
$(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseenter’,
function(){
_ToolBar.SetCanHide(false);
}
);
};
this.SetCanHide(false);
};
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.5’);
_ToolBar.MouseLeaveFlashObject = function(){
$.Wondershare_WSVCU_Plugin.Log(‘_ToolBar.mouseleave’);
_ToolBar.SetCanHide(true);
};
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.6’);

_ToolBar.HideToolBar = function(KeepLongHide){
if (KeepLongHide == undefined){
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 1’);

if ($(this._ToolBarDivID) && (this.GetCanHide())){
this.ResetHideToolBarTime();
$(this._ToolBarDivID).remove();
}else{
this.SetCanHide(true);
}
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 2’);
}else{
this.ResetHideToolBarTime();
$(this._ToolBarDivID).remove();
this._KeepLongHide = true;
}
};

_ToolBar.ResetHideToolBarTime = function(){
//Resettime
if (this._T){
clearTimeout(this._T);
this._T = null;
};
};

_ToolBar._AdjuestPosition = function(){
if ($(this._ToolBarDivID).length>0){
//alert(this);
var divPos = $.Wondershare_WSVCU_Plugin.CalcToolBarPosition(aFlashObj, this.btnWidth, this.btnHeight, this._AttachStyle);
$(this._ToolBarDivID).css(‘left’, divPos.x);
$(this._ToolBarDivID).css(‘top’, divPos.y);
}
};

$.relocation.add(aFlashObj, function(data){_ToolBar._AdjuestPosition()});
$.Wondershare_WSVCU_Plugin.Log(‘ToolBar 1.7’);
return _ToolBar;
};
/* }(jQueryWS));

;(function($){ */
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1’);
Plugin.WSBrowserPlugin = function (aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback, CanDisplayCallback, VideoObject){
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.1’);

var _VideoObject = ‘object, embed, video, iframe’;// #player-api
if (VideoObject != undefined){
_VideoObject = _VideoObject + ‘, ‘ + VideoObject();
}
var _ToolBarList = [];

function FindToolbarFunction(elem){
if (_ToolBarList.length>0){
for(var i=0;i0){
for(var i=0;i-1) && (location.href != $.g_url)){
$.g_url = location.href;
location.reload();
}
});

$(document).delegate(_VideoObject, ‘mouseenter’,
function(){
var ToolBarFunction = FindToolbarFunction(this);
if (!CanDisplayCallback($(this), ToolBarFunction)){
return;
}
// if ($(this).get(0).nodeName.toLowerCase() == ‘iframe’){

// if (!$(this).attr(‘src’).match(‘//’)) {
// return;
// }
// if ($.WSUtils.GetMainDomain($(this).attr(‘src’)).toLowerCase() == $.WSUtils.GetMainDomain(location.hostname).toLowerCase()){

// return;
// }
// };

$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.2’ + this);
//
HideAllNotBusyToolbar(this);
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.3’);
//
if (ToolBarFunction == null){
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.4’);
ToolBarFunction = new $.Wondershare_WSVCU_Plugin.ToolBar($(this), aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback);
_ToolBarList.push({o:this, f: ToolBarFunction});
};
ToolBarFunction.MouseEnterFlashObject($(this));
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.5’);
}
);

$(document).delegate(_VideoObject, ‘mouseleave’,
function(){
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.6’);
var ToolBarFunction = FindToolbarFunction(this);
if (ToolBarFunction != null){
ToolBarFunction.MouseLeaveFlashObject($(this));
};
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 1.7’);
}
);
};
$.Wondershare_WSVCU_Plugin.Log(‘Plugin.WSBrowserPlugin 2’);
}(jQueryWS));

//alert(‘jQuery.Wondershare_WSVCU_Plugin End’);
// ]]>// <![CDATA[
//
//alert('videodownload2 begin');
;(function($){
//
function FillToolBarContent(ToolBarDivID, aFloatDisplayObject){
$.Wondershare_WSVCU_Plugin.Log('FillToolBarContent');
var _toolbar = this;
var bro = $.WSUtils.Browser();
if (bro.ie) { browserType = 'id_browser_IE'}
if (bro.firefox) { browserType = 'id_browser_FireFox'}
if (bro.safari) { browserType = 'id_browser_safari'}
if (bro.chrome) { browserType = 'id_browser_Chrome'}

var html =
'


+ ‘
+ ‘
+ ‘


+ ‘


    + ‘

‘;

$(ToolBarDivID).append(html);

var Protocol = ‘WSVCU://’;//
var Seperator = ‘-WS-GUES-‘;//
if ($.Wondershare_WSVCU_Plugin.GetSupportsResoltions){
$.Wondershare_WSVCU_Plugin.Log(‘Enter GetSupportsResoltions’);
var Resoltions = $.Wondershare_WSVCU_Plugin.GetSupportsResoltions();
if (Resoltions.length>1){
var html = “”;
for (var i = 0; i < Resoltions.length; ++i) {
if (Resoltions[i] == 'PlayList'){
html += '

  • ‘+ Resoltions[i] +’

  • }else if (Resoltions[i] == ‘Only Audio’){
    html += ‘

  • ‘+ Resoltions[i] +’

  • }else{
    html += ‘

  • ‘+ Resoltions[i] +’

  • }
    }

    $(ToolBarDivID + ‘Resoltions’).append(html);
    $.Wondershare_WSVCU_Plugin.Log(‘Leave GetSupportsResoltions’);
    $(ToolBarDivID + ‘Resoltions’).mouseleave(function(event){
    $(this).hide();
    });

    $(ToolBarDivID + ‘Download’).click(function(event){
    //
    event.stopPropagation();
    _toolbar.SetCanHide(false);
    $.Wondershare_WSVCU_Plugin.Log(‘Click Download’);
    $(ToolBarDivID + ‘Resoltions’).fadeIn();
    });

    $(ToolBarDivID + ‘Resoltions a’).click(function(event){
    //
    event.stopPropagation();
    $.Wondershare_WSVCU_Plugin.Log(‘click Download click’);
    $(ToolBarDivID + ‘Resoltions’).hide();
    CallDownload($(this).text());
    });
    }else{
    $(ToolBarDivID + ‘Download’).click(function(event){
    //
    event.stopPropagation();
    $.Wondershare_WSVCU_Plugin.Log(‘Click Download’);
    $(ToolBarDivID + ‘Resoltions’).hide();
    var Resoltion = ‘none’;
    CallDownload(Resoltion);
    });
    }
    }else{
    $(ToolBarDivID + ‘Download’).click(function(event){
    //
    event.stopPropagation();
    $.Wondershare_WSVCU_Plugin.Log(‘Click Download’);
    $(ToolBarDivID + ‘Resoltions’).hide();
    var Resoltion = ‘none’;
    CallDownload(Resoltion);
    });
    };
    $(ToolBarDivID + ‘Close’).click(function(event){
    _toolbar.HideToolBar(true);
    });

    function openExternalLink(url) {

    myWindow1 = window.open(url, ‘_blank’, ”);

    myWindow1.focus();

    window.setTimeout(function(){myWindow1.close();}, 500);

    };

    function CallDownload(Resoltion){
    _toolbar.SetCanHide(false);
    var Title = $(document).attr(‘title’);

    var Cookie = document.cookie;
    if (Title==”){
    Title=’none’;
    }else if (Title.length>100){
    Title = Title.slice(0,100);
    };

    if (Cookie==”){
    Cookie =’none’;
    };

    if ((!bro.chrome) && (!bro.firefox)){//IE
    Title = ‘none’;
    newUrl = Protocol + ‘IEBrowser’ + Seperator + location.href + Seperator + Resoltion;
    openExternalLink(newUrl);

    }else
    {
    var Browser = ‘FireFoxBrowser’;
    if (bro.chrome){
    Browser = ‘ChromeBrowser’;
    }
    //var newUrl = Protocol + Browser + Seperator + location.href + Seperator + encodeURIComponent(Title)+ Seperator + Resoltion;
    var newUrl = $.WSUtils.InvokeProtocol(Protocol, Seperator, location.href, Title, Browser, Resoltion);
    openExternalLink(newUrl);
    }
    }

    return [140, 29];
    };

    $.Wondershare_WSVCU_Plugin.Log(‘Begin’);
    //$.WSUtils.fix_wmode2transparent_swf();

    $.Wondershare_WSVCU_Plugin.WSBrowserPlugin(‘ToolBar0’, ‘Wondershare_WSVCU_toolbar’,AttachStyleEnum.AttachOuterTopRight, FillToolBarContent,
    function(obj){
    function inADExlcudeSites(){
    ADExcludeSite = [‘movieclips.com’];
    bFind = false;
    for(var i=0;i

    -1){
    bFind = true;
    }
    }
    return bFind;
    };

    if (/*(!obj.hasClass(‘yt-thumb-default’)) &&*/ ((!inADExlcudeSites()) && ($.WSUtils.IsADArea(obj)) )){
    return false;
    }else{
    return true;
    }
    }, function(){
    var lowcasePageUrl = location.href.toLowerCase();

    if (lowcasePageUrl.indexOf(‘youtube.com’) != -1) {
    return /*’.yt-thumb-default,*/ ‘.videoAdUi, #player-api’;
    }else if (lowcasePageUrl.indexOf(‘lynda.com’) != -1){
    return ‘.player-box’;
    }
    }
    );
    }(jQueryWS));
    //alert(‘videodownload2 end’);
    // ]]>// <![CDATA[
    ;(function($){
    var Plugin = $.Wondershare_WSVCU_Plugin;

    Plugin.Log = function(msg){
    $.WSUtils.Log(msg);
    };
    var lowcasePageUrl = location.href.toLowerCase();

    if (lowcasePageUrl.indexOf('youtube.com') != -1) {
    $(document).ready(function () {
    var bro = $.WSUtils.Browser();
    if ((!bro.chrome) && (!bro.firefox)){//IE
    setTimeout(function(){
    $.WSUtils.fix_wmode2transparent_swf()
    }, 2000);
    }else{
    $.WSUtils.fix_wmode2transparent_swf();
    }
    });

    Plugin.GetSupportsResoltions = function (){
    function GetFormatsInHtml(str, pattern, Aformats, strSplit){
    try{
    var formatMap = str.split(pattern)[1];
    formatMap = formatMap.split('"')[1];

    formatMap = unescape(formatMap);
    formatMap = formatMap.replace(/\u0026/g, "&");
    formatMap += ",";
    formatMap = formatMap.split(strSplit);

    for (var i = 1; i < formatMap.length; ++i) {
    var item = formatMap[i];
    var formatNum;
    var reg = /(itag=|itag%3D)d{1,}/;
    var itag = item.match(reg);
    itag = unescape(itag[0]);
    formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
    if (formatNum.length <= 0)
    formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
    //var formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
    var formatURL = item.substring(0, item.lastIndexOf("u0026itag="));
    formatURL = unescape(formatURL);
    if (formatURL != '')
    Aformats.push([formatNum, formatURL]);
    }

    }catch(err){
    }
    };

    function GetFormats(str, pattern, Aformats){
    try{
    var formatMap = str;
    formatMap = formatMap.split(pattern)[1].split("&")[0];

    formatMap = unescape(formatMap);
    formatMap = formatMap.replace(/%3A/g, ":");
    formatMap = formatMap.replace(/%2F/g, "/");
    formatMap += ",";
    formatMap = formatMap.split("url=");

    for (var i = 1; i < formatMap.length; ++i) {
    var item = formatMap[i];
    //
    var reg = /(itag=|itag%3D)d{1,}/;
    var itag = item.match(reg);
    itag = unescape(itag[0]);
    var formatNum;
    formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
    if (formatNum.length <= 0)
    formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
    var formatURL = item.substring(0, item.lastIndexOf("&itag="));
    if (formatURL.length <= 0)
    formatURL = item;
    formatURL = unescape(formatURL);

    if (formatURL != '')
    Aformats.push([formatNum, formatURL]);
    }
    }catch(err){
    }
    };

    function GetResoltionArray(formats){
    var formatDesc = new Array();
    var i = 0;
    formatDesc[313] = [i++, "4096×1716", "2160p 4K", "WebM" ];
    formatDesc[266] = [i++, "4096×1716", "2160p 4K", "MP4" ];
    formatDesc[138] = [i++, "4096×1716", "2160p 4K", "MP4" ];
    formatDesc[264] = [i++, "2560×1072", "1440p HD", "MP4" ];

    formatDesc[137] = [i++, "1920×1080", "1080p HD", "MP4" ];
    formatDesc[37] = [i++, "1920×1080", "1080p HD", "MP4" ];
    formatDesc[46] = [i++, "1920×1080", "1080p HD", "WebM" ];

    formatDesc[102] = [i++, "1280×720", "720p HD", "WebM"];
    formatDesc[45] = [i++, "1280×720", "720p HD", "WebM" ];
    formatDesc[22] = [i++, "1280×720", "720p HD", "MP4" ];
    formatDesc[136]= [i++, "1280×720", "720p HD", "MP4" ];
    formatDesc[84] = [i++, "1280×720", "720p HD", "MP4" ];
    formatDesc[102] = [i++, "1280×720", "720p HD", "WebM" ];

    formatDesc[35] = [i++, "854×480", "480p", "FLV" ];
    formatDesc[44] = [i++, "854×480", "480p", "WebM" ];
    formatDesc[135] = [i++, "854×480", "480p", "MP4" ];
    formatDesc[101] = [i++, "854×480", "480p", "WebM" ];
    formatDesc[83] = [i++, "854×480", "480p", "MP4" ];

    formatDesc[34] = [i++, "640×360", "360p", "FLV" ];
    formatDesc[43] = [i++, "640×360", "360p", "WebM" ];
    formatDesc[18] = [i++, "640×360", "360p", "MP4" ];
    formatDesc[82] = [i++, "640×360", "360p", "MP4" ];
    formatDesc[100] = [i++, "640×360", "360p", "WebM" ];

    formatDesc[5] = [i++, "320*240", "240p", "FLV" ];
    formatDesc[36] = [i++, "320×240", "240p", "WebM" ];

    function formatSorter(a, b){
    var first = formatDesc[a[0]] ? formatDesc[a[0]][0] : 100;
    var second = formatDesc[b[0]] ? formatDesc[b[0]][0] : 100;
    return first – second;
    };

    Plugin.Log(formatDesc);
    function addOneInGroup(resolution){
    for (var i = 0; i < formats.length; ++i) {
    if (formats[i][2] == resolution) {
    ret[ret.length] = formats[i][2];
    break;
    }
    }
    };

    formats.sort(formatSorter);
    var ret = new Array();
    if (formats == null)
    return ret;
    Plugin.Log(formats.length);
    for (var i = 0; i 0){
    if(location.href.toLowerCase().indexOf(‘list=’)>-1){
    ret[ret.length] = ‘PlayList’;
    }
    }

    return ret;
    };

    var BodySource = document.getElementsByTagName(“body”)[0].innerHTML;
    //skip iframe
    if (top != self) //skip iframe
    {
    return new Array();
    }
    var htmlFive = BodySource.search(“html5-main-video”) != -1;

    var formats = new Array();

    var el_flash = document.getElementById(“movie_player”);
    if (el_flash) {

    GetFormats(el_flash.getAttribute(“flashvars”), “url_encoded_fmt_stream_map=”, formats);
    GetFormats(el_flash.getAttribute(“flashvars”), “adaptive_fmts=”, formats);
    }

    GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘url=’);
    GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘fallback_host=’);
    GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘url=’);
    GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘fallback_host=’);

    return GetResoltionArray(formats);
    }
    }
    }(jQueryWS));
    // ]]>// // <![CDATA[
    /*!
    * jQuery JavaScript Library v1.4.2
    * http://jquery.com/
    *
    * Copyright 2010, John Resig
    * Dual licensed under the MIT or GPL Version 2 licenses.
    * http://jquery.org/license
    *
    * Includes Sizzle.js
    * http://sizzlejs.com/
    * Copyright 2010, The Dojo Foundation
    * Released under the MIT, BSD, and GPL Licenses.
    *
    * Date: Sat Feb 13 22:33:48 2010 -0500
    */
    (function( window, undefined ) {

    // 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.jQueryWS,

    // Map over the $ in case of overwrite
    _$ = window.$,

    // Use the correct document accordingly with window argument (sandbox)
    document = window.document,

    // 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-]+)$/,

    // Is it a simple selector
    isSimple = /^.[^:#[.,]*$/,

    // Check if a string has a non-whitespace character in it
    rnotwhite = /S/,

    // Used for trimming whitespace
    rtrim = /^(s|u00A0)+|(s|u00A0)+$/g,

    // Match a standalone tag
    rsingleTag = /^(?:)?$/,

    // 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,
    hasOwnProperty = Object.prototype.hasOwnProperty,
    push = Array.prototype.push,
    slice = Array.prototype.slice,
    indexOf = Array.prototype.indexOf;

    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 ) {
    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 = 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] );

    if ( elem ) {
    // 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 && /^w+$/.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: “1.4.2”,

    // 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;

    // 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 object literal values or arrays
    if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
    var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
    : jQuery.isArray(copy) ? [] : {};

    // 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.jQueryWS = _jQuery;
    }

    return jQuery;
    },

    // Is the DOM ready to be used? Set to true once it occurs.
    isReady: false,

    // Handle when the DOM is ready
    ready: function() {
    // Make sure that the DOM is not already loaded
    if ( !jQuery.isReady ) {
    // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
    if ( !document.body ) {
    return setTimeout( jQuery.ready, 13 );
    }

    // Remember that the DOM is ready
    jQuery.isReady = true;

    // 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.triggerHandler ) {
    jQuery( document ).triggerHandler( "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" ) {
    return jQuery.ready();
    }

    // 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 toString.call(obj) === "[object Function]";
    },

    isArray: function( obj ) {
    return toString.call(obj) === "[object Array]";
    },

    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 || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
    return false;
    }

    // Not own constructor property must be Object
    if ( obj.constructor
    && !hasOwnProperty.call(obj, "constructor")
    && !hasOwnProperty.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 || hasOwnProperty.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 ( /^[],:{}s]*$/.test(data.replace(/\(?:["\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
    .replace(/"[^"\nr]*"|true|false|null|-?d+(?:.d*)?(?:[eE][+-]?d+)?/g, "]")
    .replace(/(?:^|:|,)(?:s*[)+/g, "")) ) {

    // 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;
    },

    trim: function( text ) {
    return (text || "").replace( rtrim, "" );
    },

    // 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)
    if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
    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 = [];

    // Go through the array, only saving the items
    // that pass the validator function
    for ( var i = 0, length = elems.length; i < length; i++ ) {
    if ( !inv !== !callback( elems[ i ], i ) ) {
    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;
    },

    // Use of jQuery.browser is frowned upon.
    // More details: http://docs.jquery.com/Utilities/jQuery.browser
    uaMatch: function( ua ) {
    ua = ua.toLowerCase();

    var match = /(webkit)[ /]([w.]+)/.exec( ua ) ||
    /(opera)(?:.*version)?[ /]([w.]+)/.exec( ua ) ||
    /(msie) ([w.]+)/.exec( ua ) ||
    !/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([w.]+))?/.exec( ua ) ||
    [];

    return { browser: match[1] || "", version: match[2] || "0" };
    },

    browser: {}
    });

    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 );
    };
    }

    // 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( error ) {
    setTimeout( doScrollCheck, 1 );
    return;
    }

    // and execute any waiting functions
    jQuery.ready();
    }

    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 || "" );
    }

    if ( elem.parentNode ) {
    elem.parentNode.removeChild( elem );
    }
    }

    // Mutifunctional method to get and set values to a collection
    // The value/s can be optionally by executed if its a function
    function access( elems, key, value, exec, fn, pass ) {
    var length = elems.length;

    // Setting many attributes
    if ( typeof key === "object" ) {
    for ( var k in key ) {
    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;
    }

    function now() {
    return (new Date).getTime();
    }
    (function() {

    jQuery.support = {};

    var root = document.documentElement,
    script = document.createElement("script"),
    div = document.createElement("div"),
    id = "script" + now();

    div.style.display = "none";
    div.innerHTML = "

    a“;

    var all = div.getElementsByTagName(“*”),
    a = div.getElementsByTagName(“a”)[0];

    // Can’t get basic test support
    if ( !all || !all.length || !a ) {
    return;
    }

    jQuery.support = {
    // IE strips leading whitespace when .innerHTML is used
    leadingWhitespace: div.firstChild.nodeType === 3,

    // Make sure that tbody elements aren’t automatically inserted
    // IE will insert them into empty tables
    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,

    // Get the style information from getAttribute
    // (IE uses .cssText insted)
    style: /red/.test( a.getAttribute(“style”) ),

    // Make sure that URLs aren’t manipulated
    // (IE normalizes it by default)
    hrefNormalized: a.getAttribute(“href”) === “/a”,

    // Make sure that element opacity exists
    // (IE uses filter instead)
    // Use a regex to work around a WebKit issue. See #5145
    opacity: /^0.55$/.test( a.style.opacity ),

    // Verify style float existence
    // (IE uses styleFloat instead of cssFloat)
    cssFloat: !!a.style.cssFloat,

    // Make sure that if no value is specified for a checkbox
    // that it defaults to “on”.
    // (WebKit defaults to “” instead)
    checkOn: div.getElementsByTagName(“input”)[0].value === “on”,

    // Make sure that a selected-by-default option has a working selected property.
    // (WebKit defaults to false instead of true, IE too, if it’s in an optgroup)
    optSelected: document.createElement(“select”).appendChild( document.createElement(“option”) ).selected,

    parentNode: div.removeChild( div.appendChild( document.createElement(“div”) ) ).parentNode === null,

    // Will be defined later
    deleteExpando: true,
    checkClone: false,
    scriptEval: false,
    noCloneEvent: true,
    boxModel: null
    };

    script.type = “text/javascript”;
    try {
    script.appendChild( document.createTextNode( “window.” + id + “=1;” ) );
    } catch(e) {}

    root.insertBefore( script, root.firstChild );

    // Make sure that the execution of code works by injecting a script
    // tag with appendChild/createTextNode
    // (IE doesn’t support this, fails, and uses .text instead)
    if ( window[ id ] ) {
    jQuery.support.scriptEval = true;
    delete window[ id ];
    }

    // Test to see if it’s possible to delete an expando from an element
    // Fails in Internet Explorer
    try {
    delete script.test;

    } catch(e) {
    jQuery.support.deleteExpando = false;
    }

    root.removeChild( script );

    if ( div.attachEvent && div.fireEvent ) {
    div.attachEvent(“onclick”, function click() {
    // Cloning a node shouldn’t copy over any
    // bound event handlers (IE does this)
    jQuery.support.noCloneEvent = false;
    div.detachEvent(“onclick”, click);
    });
    div.cloneNode(true).fireEvent(“onclick”);
    }

    div = document.createElement(“div”);
    div.innerHTML = “”;

    var fragment = document.createDocumentFragment();
    fragment.appendChild( div.firstChild );

    // WebKit doesn’t clone checked state correctly in fragments
    jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;

    // Figure out if the W3C box model works as expected
    // document.body must exist before we can do this
    jQuery(function() {
    var div = document.createElement(“div”);
    div.style.width = div.style.paddingLeft = “1px”;

    document.body.appendChild( div );
    jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
    document.body.removeChild( div ).style.display = ‘none’;

    div = null;
    });

    // Technique from Juriy Zaytsev
    // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
    var eventSupported = function( eventName ) {
    var el = document.createElement(“div”);
    eventName = “on” + eventName;

    var isSupported = (eventName in el);
    if ( !isSupported ) {
    el.setAttribute(eventName, “return;”);
    isSupported = typeof el[eventName] === “function”;
    }
    el = null;

    return isSupported;
    };

    jQuery.support.submitBubbles = eventSupported(“submit”);
    jQuery.support.changeBubbles = eventSupported(“change”);

    // release memory in IE
    root = script = div = all = a = null;
    })();

    jQuery.props = {
    “for”: “htmlFor”,
    “class”: “className”,
    readonly: “readOnly”,
    maxlength: “maxLength”,
    cellspacing: “cellSpacing”,
    rowspan: “rowSpan”,
    colspan: “colSpan”,
    tabindex: “tabIndex”,
    usemap: “useMap”,
    frameborder: “frameBorder”
    };
    var expando = “jQuery” + now(), uuid = 0, windowData = {};

    jQuery.extend({
    cache: {},

    expando:expando,

    // The following elements throw uncatchable exceptions if you
    // attempt to add expando properties to them.
    noData: {
    “embed”: true,
    “object”: true,
    “applet”: true
    },

    data: function( elem, name, data ) {
    if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
    return;
    }

    elem = elem == window ?
    windowData :
    elem;

    var id = elem[ expando ], cache = jQuery.cache, thisCache;

    if ( !id && typeof name === “string” && data === undefined ) {
    return null;
    }

    // Compute a unique ID for the element
    if ( !id ) {
    id = ++uuid;
    }

    // Avoid generating a new cache unless none exists and we
    // want to manipulate it.
    if ( typeof name === “object” ) {
    elem[ expando ] = id;
    thisCache = cache[ id ] = jQuery.extend(true, {}, name);

    } else if ( !cache[ id ] ) {
    elem[ expando ] = id;
    cache[ id ] = {};
    }

    thisCache = cache[ id ];

    // Prevent overriding the named cache with undefined values
    if ( data !== undefined ) {
    thisCache[ name ] = data;
    }

    return typeof name === “string” ? thisCache[ name ] : thisCache;
    },

    removeData: function( elem, name ) {
    if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
    return;
    }

    elem = elem == window ?
    windowData :
    elem;

    var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];

    // If we want to remove a specific section of the element’s data
    if ( name ) {
    if ( thisCache ) {
    // Remove the section of cache data
    delete thisCache[ name ];

    // If we’ve removed all the data, remove the element’s cache
    if ( jQuery.isEmptyObject(thisCache) ) {
    jQuery.removeData( elem );
    }
    }

    // Otherwise, we want to remove all of the element’s data
    } else {
    if ( jQuery.support.deleteExpando ) {
    delete elem[ jQuery.expando ];

    } else if ( elem.removeAttribute ) {
    elem.removeAttribute( jQuery.expando );
    }

    // Completely remove the data cache
    delete cache[ id ];
    }
    }
    });

    jQuery.fn.extend({
    data: function( key, value ) {
    if ( typeof key === “undefined” && this.length ) {
    return jQuery.data( this[0] );

    } else if ( typeof key === “object” ) {
    return this.each(function() {
    jQuery.data( this, key );
    });
    }

    var parts = key.split(“.”);
    parts[1] = parts[1] ? “.” + parts[1] : “”;

    if ( value === undefined ) {
    var data = this.triggerHandler(“getData” + parts[1] + “!”, [parts[0]]);

    if ( data === undefined && this.length ) {
    data = jQuery.data( this[0], key );
    }
    return data === undefined && parts[1] ?
    this.data( parts[0] ) :
    data;
    } else {
    return this.trigger(“setData” + parts[1] + “!”, [parts[0], value]).each(function() {
    jQuery.data( this, key, value );
    });
    }
    },

    removeData: function( key ) {
    return this.each(function() {
    jQuery.removeData( this, key );
    });
    }
    });
    jQuery.extend({
    queue: function( elem, type, data ) {
    if ( !elem ) {
    return;
    }

    type = (type || “fx”) + “queue”;
    var q = jQuery.data( elem, type );

    // Speed up dequeue by getting out quickly if this is just a lookup
    if ( !data ) {
    return q || [];
    }

    if ( !q || jQuery.isArray(data) ) {
    q = jQuery.data( elem, type, jQuery.makeArray(data) );

    } else {
    q.push( data );
    }

    return q;
    },

    dequeue: function( elem, type ) {
    type = type || “fx”;

    var queue = jQuery.queue( elem, type ), fn = queue.shift();

    // If the fx queue is dequeued, always remove the progress sentinel
    if ( fn === “inprogress” ) {
    fn = queue.shift();
    }

    if ( fn ) {
    // Add a progress sentinel to prevent the fx queue from being
    // automatically dequeued
    if ( type === “fx” ) {
    queue.unshift(“inprogress”);
    }

    fn.call(elem, function() {
    jQuery.dequeue(elem, type);
    });
    }
    }
    });

    jQuery.fn.extend({
    queue: function( type, data ) {
    if ( typeof type !== “string” ) {
    data = type;
    type = “fx”;
    }

    if ( data === undefined ) {
    return jQuery.queue( this[0], type );
    }
    return this.each(function( i, elem ) {
    var queue = jQuery.queue( this, type, data );

    if ( type === “fx” && queue[0] !== “inprogress” ) {
    jQuery.dequeue( this, type );
    }
    });
    },
    dequeue: function( type ) {
    return this.each(function() {
    jQuery.dequeue( this, type );
    });
    },

    // Based off of the plugin by Clint Helfers, with permission.
    // http://blindsignals.com/index.php/2009/07/jquery-delay/
    delay: function( time, type ) {
    time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
    type = type || “fx”;

    return this.queue( type, function() {
    var elem = this;
    setTimeout(function() {
    jQuery.dequeue( elem, type );
    }, time );
    });
    },

    clearQueue: function( type ) {
    return this.queue( type || “fx”, [] );
    }
    });
    var rclass = /[nt]/g,
    rspace = /s+/,
    rreturn = /r/g,
    rspecialurl = /href|src|style/,
    rtype = /(button|input)/i,
    rfocusable = /(button|input|object|select|textarea)/i,
    rclickable = /^(a|area)$/i,
    rradiocheck = /radio|checkbox/;

    jQuery.fn.extend({
    attr: function( name, value ) {
    return access( this, name, value, true, jQuery.attr );
    },

    removeAttr: function( name, fn ) {
    return this.each(function(){
    jQuery.attr( this, name, “” );
    if ( this.nodeType === 1 ) {
    this.removeAttribute( name );
    }
    });
    },

    addClass: function( value ) {
    if ( jQuery.isFunction(value) ) {
    return this.each(function(i) {
    var self = jQuery(this);
    self.addClass( value.call(this, i, self.attr(“class”)) );
    });
    }

    if ( value && typeof value === “string” ) {
    var classNames = (value || “”).split( rspace );

    for ( var i = 0, l = this.length; i < l; i++ ) {
    var elem = this[i];

    if ( elem.nodeType === 1 ) {
    if ( !elem.className ) {
    elem.className = value;

    } else {
    var className = " " + elem.className + " ", setClass = elem.className;
    for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
    if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
    setClass += " " + classNames[c];
    }
    }
    elem.className = jQuery.trim( setClass );
    }
    }
    }
    }

    return this;
    },

    removeClass: function( value ) {
    if ( jQuery.isFunction(value) ) {
    return this.each(function(i) {
    var self = jQuery(this);
    self.removeClass( value.call(this, i, self.attr("class")) );
    });
    }

    if ( (value && typeof value === "string") || value === undefined ) {
    var classNames = (value || "").split(rspace);

    for ( var i = 0, l = this.length; i < l; i++ ) {
    var elem = this[i];

    if ( elem.nodeType === 1 && elem.className ) {
    if ( value ) {
    var className = (" " + elem.className + " ").replace(rclass, " ");
    for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
    className = className.replace(" " + classNames[c] + " ", " ");
    }
    elem.className = jQuery.trim( className );

    } else {
    elem.className = "";
    }
    }
    }
    }

    return this;
    },

    toggleClass: function( value, stateVal ) {
    var type = typeof value, isBool = typeof stateVal === "boolean";

    if ( jQuery.isFunction( value ) ) {
    return this.each(function(i) {
    var self = jQuery(this);
    self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
    });
    }

    return this.each(function() {
    if ( type === "string" ) {
    // toggle individual class names
    var className, i = 0, self = jQuery(this),
    state = stateVal,
    classNames = value.split( rspace );

    while ( (className = classNames[ i++ ]) ) {
    // check each className given, space seperated list
    state = isBool ? state : !self.hasClass( className );
    self[ state ? "addClass" : "removeClass" ]( className );
    }

    } else if ( type === "undefined" || type === "boolean" ) {
    if ( this.className ) {
    // store className if set
    jQuery.data( this, "__className__", this.className );
    }

    // toggle whole className
    this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
    }
    });
    },

    hasClass: function( selector ) {
    var className = " " + selector + " ";
    for ( var i = 0, l = this.length; i -1 ) {
    return true;
    }
    }

    return false;
    },

    val: function( value ) {
    if ( value === undefined ) {
    var elem = this[0];

    if ( elem ) {
    if ( jQuery.nodeName( elem, “option” ) ) {
    return (elem.attributes.value || {}).specified ? elem.value : elem.text;
    }

    // We need to handle select boxes special
    if ( jQuery.nodeName( elem, “select” ) ) {
    var index = elem.selectedIndex,
    values = [],
    options = elem.options,
    one = elem.type === “select-one”;

    // Nothing was selected
    if ( index < 0 ) {
    return null;
    }

    // Loop through all the selected options
    for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i = 0;

    } else if ( jQuery.nodeName( this, “select” ) ) {
    var values = jQuery.makeArray(val);

    jQuery( “option”, this ).each(function() {
    this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
    });

    if ( !values.length ) {
    this.selectedIndex = -1;
    }

    } else {
    this.value = val;
    }
    });
    }
    });

    jQuery.extend({
    attrFn: {
    val: true,
    css: true,
    html: true,
    text: true,
    data: true,
    width: true,
    height: true,
    offset: true
    },

    attr: function( elem, name, value, pass ) {
    // don’t set attributes on text and comment nodes
    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
    return undefined;
    }

    if ( pass && name in jQuery.attrFn ) {
    return jQuery(elem)[name](value);
    }

    var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
    // Whether we are setting (or getting)
    set = value !== undefined;

    // Try to normalize/fix the name
    name = notxml && jQuery.props[ name ] || name;

    // Only do all the following if this is a node (faster for style)
    if ( elem.nodeType === 1 ) {
    // These attributes require special treatment
    var special = rspecialurl.test( name );

    // Safari mis-reports the default selected property of an option
    // Accessing the parent’s selectedIndex property fixes it
    if ( name === “selected” && !jQuery.support.optSelected ) {
    var parent = elem.parentNode;
    if ( parent ) {
    parent.selectedIndex;

    // Make sure that it also works with optgroups, see #5701
    if ( parent.parentNode ) {
    parent.parentNode.selectedIndex;
    }
    }
    }

    // If applicable, access the attribute via the DOM 0 way
    if ( name in elem && notxml && !special ) {
    if ( set ) {
    // We can’t allow the type property to be changed (since it causes problems in IE)
    if ( name === “type” && rtype.test( elem.nodeName ) && elem.parentNode ) {
    jQuery.error( “type property can’t be changed” );
    }

    elem[ name ] = value;
    }

    // browsers index elements by id/name on forms, give priority to attributes.
    if ( jQuery.nodeName( elem, “form” ) && elem.getAttributeNode(name) ) {
    return elem.getAttributeNode( name ).nodeValue;
    }

    // elem.tabIndex doesn’t always return the correct value when it hasn’t been explicitly set
    // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
    if ( name === “tabIndex” ) {
    var attributeNode = elem.getAttributeNode( “tabIndex” );

    return attributeNode && attributeNode.specified ?
    attributeNode.value :
    rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
    0 :
    undefined;
    }

    return elem[ name ];
    }

    if ( !jQuery.support.style && notxml && name === “style” ) {
    if ( set ) {
    elem.style.cssText = “” + value;
    }

    return elem.style.cssText;
    }

    if ( set ) {
    // convert the value to a string (all browsers do this but IE) see #1070
    elem.setAttribute( name, “” + value );
    }

    var attr = !jQuery.support.hrefNormalized && notxml && special ?
    // Some attributes require a special call on IE
    elem.getAttribute( name, 2 ) :
    elem.getAttribute( name );

    // Non-existent attributes return null, we normalize to undefined
    return attr === null ? undefined : attr;
    }

    // elem is actually elem.style … set the style
    // Using attr for specific style information is now deprecated. Use style instead.
    return jQuery.style( elem, name, value );
    }
    });
    var rnamespaces = /.(.*)$/,
    fcleanup = function( nm ) {
    return nm.replace(/[^ws.|`]/g, function( ch ) {
    return “\” + ch;
    });
    };

    /*
    * A number of helper functions used for managing events.
    * Many of the ideas behind this code originated from
    * Dean Edwards’ addEvent library.
    */
    jQuery.event = {

    // Bind an event to an element
    // Original by Dean Edwards
    add: function( elem, types, handler, data ) {
    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
    return;
    }

    // For whatever reason, IE has trouble passing the window object
    // around, causing it to be cloned in the process
    if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
    elem = window;
    }

    var handleObjIn, handleObj;

    if ( handler.handler ) {
    handleObjIn = handler;
    handler = handleObjIn.handler;
    }

    // Make sure that the function being executed has a unique ID
    if ( !handler.guid ) {
    handler.guid = jQuery.guid++;
    }

    // Init the element’s event structure
    var elemData = jQuery.data( elem );

    // If no elemData is found then we must be trying to bind to one of the
    // banned noData elements
    if ( !elemData ) {
    return;
    }

    var events = elemData.events = elemData.events || {},
    eventHandle = elemData.handle, eventHandle;

    if ( !eventHandle ) {
    elemData.handle = eventHandle = function() {
    // Handle the second event of a trigger and when
    // an event is called after a page has unloaded
    return typeof jQuery !== “undefined” && !jQuery.event.triggered ?
    jQuery.event.handle.apply( eventHandle.elem, arguments ) :
    undefined;
    };
    }

    // Add elem as a property of the handle function
    // This is to prevent a memory leak with non-native events in IE.
    eventHandle.elem = elem;

    // Handle multiple events separated by a space
    // jQuery(…).bind(“mouseover mouseout”, fn);
    types = types.split(” “);

    var type, i = 0, namespaces;

    while ( (type = types[ i++ ]) ) {
    handleObj = handleObjIn ?
    jQuery.extend({}, handleObjIn) :
    { handler: handler, data: data };

    // Namespaced event handlers
    if ( type.indexOf(“.”) > -1 ) {
    namespaces = type.split(“.”);
    type = namespaces.shift();
    handleObj.namespace = namespaces.slice(0).sort().join(“.”);

    } else {
    namespaces = [];
    handleObj.namespace = “”;
    }

    handleObj.type = type;
    handleObj.guid = handler.guid;

    // Get the current list of functions bound to this event
    var handlers = events[ type ],
    special = jQuery.event.special[ type ] || {};

    // Init the event handler queue
    if ( !handlers ) {
    handlers = events[ type ] = [];

    // Check for a special event handler
    // Only use addEventListener/attachEvent if the special
    // events handler returns false
    if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
    // Bind the global event handler to the element
    if ( elem.addEventListener ) {
    elem.addEventListener( type, eventHandle, false );

    } else if ( elem.attachEvent ) {
    elem.attachEvent( “on” + type, eventHandle );
    }
    }
    }

    if ( special.add ) {
    special.add.call( elem, handleObj );

    if ( !handleObj.handler.guid ) {
    handleObj.handler.guid = handler.guid;
    }
    }

    // Add the function to the element’s handler list
    handlers.push( handleObj );

    // Keep track of which events have been used, for global triggering
    jQuery.event.global[ type ] = true;
    }

    // Nullify elem to prevent memory leaks in IE
    elem = null;
    },

    global: {},

    // Detach an event or set of events from an element
    remove: function( elem, types, handler, pos ) {
    // don’t do events on text and comment nodes
    if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
    return;
    }

    var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
    elemData = jQuery.data( elem ),
    events = elemData && elemData.events;

    if ( !elemData || !events ) {
    return;
    }

    // types is actually an event object here
    if ( types && types.type ) {
    handler = types.handler;
    types = types.type;
    }

    // Unbind all events for the element
    if ( !types || typeof types === “string” && types.charAt(0) === “.” ) {
    types = types || “”;

    for ( type in events ) {
    jQuery.event.remove( elem, type + types );
    }

    return;
    }

    // Handle multiple events separated by a space
    // jQuery(…).unbind(“mouseover mouseout”, fn);
    types = types.split(” “);

    while ( (type = types[ i++ ]) ) {
    origType = type;
    handleObj = null;
    all = type.indexOf(“.”) < 0;
    namespaces = [];

    if ( !all ) {
    // Namespaced event handlers
    namespaces = type.split(".");
    type = namespaces.shift();

    namespace = new RegExp("(^|\.)" +
    jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\.(?:.*\.)?") + "(\.|$)")
    }

    eventType = events[ type ];

    if ( !eventType ) {
    continue;
    }

    if ( !handler ) {
    for ( var j = 0; j < eventType.length; j++ ) {
    handleObj = eventType[ j ];

    if ( all || namespace.test( handleObj.namespace ) ) {
    jQuery.event.remove( elem, origType, handleObj.handler, j );
    eventType.splice( j–, 1 );
    }
    }

    continue;
    }

    special = jQuery.event.special[ type ] || {};

    for ( var j = pos || 0; j = 0 ) {
    event.type = type = type.slice(0, -1);
    event.exclusive = true;
    }

    // Handle a global trigger
    if ( !elem ) {
    // Don’t bubble custom events when global (to avoid too much overhead)
    event.stopPropagation();

    // Only trigger if we’ve ever bound an event for it
    if ( jQuery.event.global[ type ] ) {
    jQuery.each( jQuery.cache, function() {
    if ( this.events && this.events[type] ) {
    jQuery.event.trigger( event, data, this.handle.elem );
    }
    });
    }
    }

    // Handle triggering a single element

    // don’t do events on text and comment nodes
    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
    return undefined;
    }

    // Clean up in case it is reused
    event.result = undefined;
    event.target = elem;

    // Clone the incoming data, if any
    data = jQuery.makeArray( data );
    data.unshift( event );
    }

    event.currentTarget = elem;

    // Trigger the event, it is assumed that “handle” is a function
    var handle = jQuery.data( elem, “handle” );
    if ( handle ) {
    handle.apply( elem, data );
    }

    var parent = elem.parentNode || elem.ownerDocument;

    // Trigger an inline bound script
    try {
    if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
    if ( elem[ “on” + type ] && elem[ “on” + type ].apply( elem, data ) === false ) {
    event.result = false;
    }
    }

    // prevent IE from throwing an error for some elements with some event types, see #3533
    } catch (e) {}

    if ( !event.isPropagationStopped() && parent ) {
    jQuery.event.trigger( event, data, parent, true );

    } else if ( !event.isDefaultPrevented() ) {
    var target = event.target, old,
    isClick = jQuery.nodeName(target, “a”) && type === “click”,
    special = jQuery.event.special[ type ] || {};

    if ( (!special._default || special._default.call( elem, event ) === false) &&
    !isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {

    try {
    if ( target[ type ] ) {
    // Make sure that we don’t accidentally re-trigger the onFOO events
    old = target[ “on” + type ];

    if ( old ) {
    target[ “on” + type ] = null;
    }

    jQuery.event.triggered = true;
    target[ type ]();
    }

    // prevent IE from throwing an error for some elements with some event types, see #3533
    } catch (e) {}

    if ( old ) {
    target[ “on” + type ] = old;
    }

    jQuery.event.triggered = false;
    }
    }
    },

    handle: function( event ) {
    var all, handlers, namespaces, namespace, events;

    event = arguments[0] = jQuery.event.fix( event || window.event );
    event.currentTarget = this;

    // Namespaced event handlers
    all = event.type.indexOf(“.”) < 0 && !event.exclusive;

    if ( !all ) {
    namespaces = event.type.split(".");
    event.type = namespaces.shift();
    namespace = new RegExp("(^|\.)" + namespaces.slice(0).sort().join("\.(?:.*\.)?") + "(\.|$)");
    }

    var events = jQuery.data(this, "events"), handlers = events[ event.type ];

    if ( events && handlers ) {
    // Clone the handlers to prevent manipulation
    handlers = handlers.slice(0);

    for ( var j = 0, l = handlers.length; j -1 ?
    jQuery.map( elem.options, function( elem ) {
    return elem.selected;
    }).join(“-“) :
    “”;

    } else if ( elem.nodeName.toLowerCase() === “select” ) {
    val = elem.selectedIndex;
    }

    return val;
    },

    testChange = function testChange( e ) {
    var elem = e.target, data, val;

    if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
    return;
    }

    data = jQuery.data( elem, “_change_data” );
    val = getVal(elem);

    // the current data will be also retrieved by beforeactivate
    if ( e.type !== “focusout” || elem.type !== “radio” ) {
    jQuery.data( elem, “_change_data”, val );
    }

    if ( data === undefined || val === data ) {
    return;
    }

    if ( data != null || val ) {
    e.type = “change”;
    return jQuery.event.trigger( e, arguments[1], elem );
    }
    };

    jQuery.event.special.change = {
    filters: {
    focusout: testChange,

    click: function( e ) {
    var elem = e.target, type = elem.type;

    if ( type === “radio” || type === “checkbox” || elem.nodeName.toLowerCase() === “select” ) {
    return testChange.call( this, e );
    }
    },

    // Change has to be called before submit
    // Keydown will be called before keypress, which is used in submit-event delegation
    keydown: function( e ) {
    var elem = e.target, type = elem.type;

    if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== “textarea”) ||
    (e.keyCode === 32 && (type === “checkbox” || type === “radio”)) ||
    type === “select-multiple” ) {
    return testChange.call( this, e );
    }
    },

    // Beforeactivate happens also before the previous element is blurred
    // with this event you can’t trigger a change event, but you can store
    // information/focus[in] is not needed anymore
    beforeactivate: function( e ) {
    var elem = e.target;
    jQuery.data( elem, “_change_data”, getVal(elem) );
    }
    },

    setup: function( data, namespaces ) {
    if ( this.type === “file” ) {
    return false;
    }

    for ( var type in changeFilters ) {
    jQuery.event.add( this, type + “.specialChange”, changeFilters[type] );
    }

    return formElems.test( this.nodeName );
    },

    teardown: function( namespaces ) {
    jQuery.event.remove( this, “.specialChange” );

    return formElems.test( this.nodeName );
    }
    };

    changeFilters = jQuery.event.special.change.filters;
    }

    function trigger( type, elem, args ) {
    args[0].type = type;
    return jQuery.event.handle.apply( elem, args );
    }

    // Create “bubbling” focus and blur events
    if ( document.addEventListener ) {
    jQuery.each({ focus: “focusin”, blur: “focusout” }, function( orig, fix ) {
    jQuery.event.special[ fix ] = {
    setup: function() {
    this.addEventListener( orig, handler, true );
    },
    teardown: function() {
    this.removeEventListener( orig, handler, true );
    }
    };

    function handler( e ) {
    e = jQuery.event.fix( e );
    e.type = fix;
    return jQuery.event.handle.call( this, e );
    }
    });
    }

    jQuery.each([“bind”, “one”], function( i, name ) {
    jQuery.fn[ name ] = function( type, data, fn ) {
    // Handle object literals
    if ( typeof type === “object” ) {
    for ( var key in type ) {
    this[ name ](key, data, type[key], fn);
    }
    return this;
    }

    if ( jQuery.isFunction( data ) ) {
    fn = data;
    data = undefined;
    }

    var handler = name === “one” ? jQuery.proxy( fn, function( event ) {
    jQuery( this ).unbind( event, handler );
    return fn.apply( this, arguments );
    }) : fn;

    if ( type === “unload” && name !== “one” ) {
    this.one( type, data, fn );

    } else {
    for ( var i = 0, l = this.length; i < l; i++ ) {
    jQuery.event.add( this[i], type, handler, data );
    }
    }

    return this;
    };
    });

    jQuery.fn.extend({
    unbind: function( type, fn ) {
    // Handle object literals
    if ( typeof type === "object" && !type.preventDefault ) {
    for ( var key in type ) {
    this.unbind(key, type[key]);
    }

    } else {
    for ( var i = 0, l = this.length; i < l; i++ ) {
    jQuery.event.remove( this[i], type, fn );
    }
    }

    return this;
    },

    delegate: function( selector, types, data, fn ) {
    return this.live( types, data, fn, selector );
    },

    undelegate: function( selector, types, fn ) {
    if ( arguments.length === 0 ) {
    return this.unbind( "live" );

    } else {
    return this.die( types, null, fn, selector );
    }
    },

    trigger: function( type, data ) {
    return this.each(function() {
    jQuery.event.trigger( type, data, this );
    });
    },

    triggerHandler: function( type, data ) {
    if ( this[0] ) {
    var event = jQuery.Event( type );
    event.preventDefault();
    event.stopPropagation();
    jQuery.event.trigger( event, data, this[0] );
    return event.result;
    }
    },

    toggle: function( fn ) {
    // Save reference to arguments for access in closure
    var args = arguments, i = 1;

    // link all the functions, so any of them can unbind this click handler
    while ( i < args.length ) {
    jQuery.proxy( fn, args[ i++ ] );
    }

    return this.click( jQuery.proxy( fn, function( event ) {
    // Figure out which function to execute
    var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
    jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );

    // Make sure that clicks stop
    event.preventDefault();

    // and execute the function
    return args[ lastToggle ].apply( this, arguments ) || false;
    }));
    },

    hover: function( fnOver, fnOut ) {
    return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
    }
    });

    var liveMap = {
    focus: "focusin",
    blur: "focusout",
    mouseenter: "mouseover",
    mouseleave: "mouseout"
    };

    jQuery.each(["live", "die"], function( i, name ) {
    jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
    var type, i = 0, match, namespaces, preType,
    selector = origSelector || this.selector,
    context = origSelector ? this : jQuery( this.context );

    if ( jQuery.isFunction( data ) ) {
    fn = data;
    data = undefined;
    }

    types = (types || "").split(" ");

    while ( (type = types[ i++ ]) != null ) {
    match = rnamespaces.exec( type );
    namespaces = "";

    if ( match ) {
    namespaces = match[0];
    type = type.replace( rnamespaces, "" );
    }

    if ( type === "hover" ) {
    types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
    continue;
    }

    preType = type;

    if ( type === "focus" || type === "blur" ) {
    types.push( liveMap[ type ] + namespaces );
    type = type + namespaces;

    } else {
    type = (liveMap[ type ] || type) + namespaces;
    }

    if ( name === "live" ) {
    // bind live handler
    context.each(function(){
    jQuery.event.add( this, liveConvert( type, selector ),
    { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
    });

    } else {
    // unbind live handler
    context.unbind( liveConvert( type, selector ), fn );
    }
    }

    return this;
    }
    });

    function liveHandler( event ) {
    var stop, elems = [], selectors = [], args = arguments,
    related, match, handleObj, elem, j, i, l, data,
    events = jQuery.data( this, "events" );

    // Make sure we avoid non-left-click bubbling in Firefox (#3861)
    if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
    return;
    }

    event.liveFired = this;

    var live = events.live.slice(0);

    for ( j = 0; j < live.length; j++ ) {
    handleObj = live[j];

    if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
    selectors.push( handleObj.selector );

    } else {
    live.splice( j–, 1 );
    }
    }

    match = jQuery( event.target ).closest( selectors, event.currentTarget );

    for ( i = 0, l = match.length; i < l; i++ ) {
    for ( j = 0; j < live.length; j++ ) {
    handleObj = live[j];

    if ( match[i].selector === handleObj.selector ) {
    elem = match[i].elem;
    related = null;

    // Those two events require additional checking
    if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
    related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
    }

    if ( !related || related !== elem ) {
    elems.push({ elem: elem, handleObj: handleObj });
    }
    }
    }
    }

    for ( i = 0, l = elems.length; i +~,([\]+)+|[>+~])(s*,s*)?((?:.|r|n)*)/g,
    done = 0,
    toString = Object.prototype.toString,
    hasDuplicate = false,
    baseHasDuplicate = true;

    // Here we check if the JavaScript engine is using some sort of
    // optimization where it does not always call our comparision
    // function. If that is the case, discard the hasDuplicate value.
    // Thus far that includes Google Chrome.
    [0, 0].sort(function(){
    baseHasDuplicate = false;
    return 0;
    });

    var Sizzle = function(selector, context, results, seed) {
    results = results || [];
    var origContext = context = context || document;

    if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
    return [];
    }

    if ( !selector || typeof selector !== “string” ) {
    return results;
    }

    var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
    soFar = selector;

    // Reset the position of the chunker regexp (start from head)
    while ( (chunker.exec(“”), m = chunker.exec(soFar)) !== null ) {
    soFar = m[3];

    parts.push( m[1] );

    if ( m[2] ) {
    extra = m[3];
    break;
    }
    }

    if ( parts.length > 1 && origPOS.exec( selector ) ) {
    if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
    set = posProcess( parts[0] + parts[1], context );
    } else {
    set = Expr.relative[ parts[0] ] ?
    [ context ] :
    Sizzle( parts.shift(), context );

    while ( parts.length ) {
    selector = parts.shift();

    if ( Expr.relative[ selector ] ) {
    selector += parts.shift();
    }

    set = posProcess( selector, set );
    }
    }
    } else {
    // Take a shortcut and set the context if the root selector is an ID
    // (but not if it’ll be faster if the inner selector is an ID)
    if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
    Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length – 1]) ) {
    var ret = Sizzle.find( parts.shift(), context, contextXML );
    context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
    }

    if ( context ) {
    var ret = seed ?
    { expr: parts.pop(), set: makeArray(seed) } :
    Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === “~” || parts[0] === “+”) && context.parentNode ? context.parentNode : context, contextXML );
    set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;

    if ( parts.length > 0 ) {
    checkSet = makeArray(set);
    } else {
    prune = false;
    }

    while ( parts.length ) {
    var cur = parts.pop(), pop = cur;

    if ( !Expr.relative[ cur ] ) {
    cur = “”;
    } else {
    pop = parts.pop();
    }

    if ( pop == null ) {
    pop = context;
    }

    Expr.relative[ cur ]( checkSet, pop, contextXML );
    }
    } else {
    checkSet = parts = [];
    }
    }

    if ( !checkSet ) {
    checkSet = set;
    }

    if ( !checkSet ) {
    Sizzle.error( cur || selector );
    }

    if ( toString.call(checkSet) === “[object Array]” ) {
    if ( !prune ) {
    results.push.apply( results, checkSet );
    } else if ( context && context.nodeType === 1 ) {
    for ( var i = 0; checkSet[i] != null; i++ ) {
    if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
    results.push( set[i] );
    }
    }
    } else {
    for ( var i = 0; checkSet[i] != null; i++ ) {
    if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
    results.push( set[i] );
    }
    }
    }
    } else {
    makeArray( checkSet, results );
    }

    if ( extra ) {
    Sizzle( extra, origContext, results, seed );
    Sizzle.uniqueSort( results );
    }

    return results;
    };

    Sizzle.uniqueSort = function(results){
    if ( sortOrder ) {
    hasDuplicate = baseHasDuplicate;
    results.sort(sortOrder);

    if ( hasDuplicate ) {
    for ( var i = 1; i < results.length; i++ ) {
    if ( results[i] === results[i-1] ) {
    results.splice(i–, 1);
    }
    }
    }
    }

    return results;
    };

    Sizzle.matches = function(expr, set){
    return Sizzle(expr, null, null, set);
    };

    Sizzle.find = function(expr, context, isXML){
    var set, match;

    if ( !expr ) {
    return [];
    }

    for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
    var type = Expr.order[i], match;

    if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
    var left = match[1];
    match.splice(1,1);

    if ( left.substr( left.length – 1 ) !== "\" ) {
    match[1] = (match[1] || "").replace(/\/g, "");
    set = Expr.find[ type ]( match, context, isXML );
    if ( set != null ) {
    expr = expr.replace( Expr.match[ type ], "" );
    break;
    }
    }
    }
    }

    if ( !set ) {
    set = context.getElementsByTagName("*");
    }

    return {set: set, expr: expr};
    };

    Sizzle.filter = function(expr, set, inplace, not){
    var old = expr, result = [], curLoop = set, match, anyFound,
    isXMLFilter = set && set[0] && isXML(set[0]);

    while ( expr && set.length ) {
    for ( var type in Expr.filter ) {
    if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
    var filter = Expr.filter[ type ], found, item, left = match[1];
    anyFound = false;

    match.splice(1,1);

    if ( left.substr( left.length – 1 ) === "\" ) {
    continue;
    }

    if ( curLoop === result ) {
    result = [];
    }

    if ( Expr.preFilter[ type ] ) {
    match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );

    if ( !match ) {
    anyFound = found = true;
    } else if ( match === true ) {
    continue;
    }
    }

    if ( match ) {
    for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
    if ( item ) {
    found = filter( item, match, i, curLoop );
    var pass = not ^ !!found;

    if ( inplace && found != null ) {
    if ( pass ) {
    anyFound = true;
    } else {
    curLoop[i] = false;
    }
    } else if ( pass ) {
    result.push( item );
    anyFound = true;
    }
    }
    }
    }

    if ( found !== undefined ) {
    if ( !inplace ) {
    curLoop = result;
    }

    expr = expr.replace( Expr.match[ type ], "" );

    if ( !anyFound ) {
    return [];
    }

    break;
    }
    }
    }

    // Improper expression
    if ( expr === old ) {
    if ( anyFound == null ) {
    Sizzle.error( expr );
    } else {
    break;
    }
    }

    old = expr;
    }

    return curLoop;
    };

    Sizzle.error = function( msg ) {
    throw "Syntax error, unrecognized expression: " + msg;
    };

    var Expr = Sizzle.selectors = {
    order: [ "ID", "NAME", "TAG" ],
    match: {
    ID: /#((?:[wu00c0-uFFFF-]|\.)+)/,
    CLASS: /.((?:[wu00c0-uFFFF-]|\.)+)/,
    NAME: /[name=['"]*((?:[wu00c0-uFFFF-]|\.)+)['"]*]/,
    ATTR: /[s*((?:[wu00c0-uFFFF-]|\.)+)s*(?:(S?=)s*(['"]*)(.*?)3|)s*]/,
    TAG: /^((?:[wu00c0-uFFFF*-]|\.)+)/,
    CHILD: /:(only|nth|last|first)-child(?:((even|odd|[dn+-]*)))?/,
    POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:((d*)))?(?=[^-]|$)/,
    PSEUDO: /:((?:[wu00c0-uFFFF-]|\.)+)(?:((['"]?)((?:([^)]+)|[^()]*)+)2))?/
    },
    leftMatch: {},
    attrMap: {
    "class": "className",
    "for": "htmlFor"
    },
    attrHandle: {
    href: function(elem){
    return elem.getAttribute("href");
    }
    },
    relative: {
    "+": function(checkSet, part){
    var isPartStr = typeof part === "string",
    isTag = isPartStr && !/W/.test(part),
    isPartStrNotTag = isPartStr && !isTag;

    if ( isTag ) {
    part = part.toLowerCase();
    }

    for ( var i = 0, l = checkSet.length, elem; i “: function(checkSet, part){
    var isPartStr = typeof part === “string”;

    if ( isPartStr && !/W/.test(part) ) {
    part = part.toLowerCase();

    for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    var elem = checkSet[i];
    if ( elem ) {
    var parent = elem.parentNode;
    checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
    }
    }
    } else {
    for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    var elem = checkSet[i];
    if ( elem ) {
    checkSet[i] = isPartStr ?
    elem.parentNode :
    elem.parentNode === part;
    }
    }

    if ( isPartStr ) {
    Sizzle.filter( part, checkSet, true );
    }
    }
    },
    "": function(checkSet, part, isXML){
    var doneName = done++, checkFn = dirCheck;

    if ( typeof part === "string" && !/W/.test(part) ) {
    var nodeCheck = part = part.toLowerCase();
    checkFn = dirNodeCheck;
    }

    checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
    },
    "~": function(checkSet, part, isXML){
    var doneName = done++, checkFn = dirCheck;

    if ( typeof part === "string" && !/W/.test(part) ) {
    var nodeCheck = part = part.toLowerCase();
    checkFn = dirNodeCheck;
    }

    checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
    }
    },
    find: {
    ID: function(match, context, isXML){
    if ( typeof context.getElementById !== "undefined" && !isXML ) {
    var m = context.getElementById(match[1]);
    return m ? [m] : [];
    }
    },
    NAME: function(match, context){
    if ( typeof context.getElementsByName !== "undefined" ) {
    var ret = [], results = context.getElementsByName(match[1]);

    for ( var i = 0, l = results.length; i = 0) ) {
    if ( !inplace ) {
    result.push( elem );
    }
    } else if ( inplace ) {
    curLoop[i] = false;
    }
    }
    }

    return false;
    },
    ID: function(match){
    return match[1].replace(/\/g, “”);
    },
    TAG: function(match, curLoop){
    return match[1].toLowerCase();
    },
    CHILD: function(match){
    if ( match[1] === “nth” ) {
    // parse equations like ‘even’, ‘odd’, ‘5’, ‘2n’, ‘3n+2’, ‘4n-1’, ‘-n+6’
    var test = /(-?)(d*)n((?:+|-)?d*)/.exec(
    match[2] === “even” && “2n” || match[2] === “odd” && “2n+1” ||
    !/D/.test( match[2] ) && “0n+” + match[2] || match[2]);

    // calculate the numbers (first)n+(last) including if they are negative
    match[2] = (test[1] + (test[2] || 1)) – 0;
    match[3] = test[3] – 0;
    }

    // TODO: Move to normal caching system
    match[0] = done++;

    return match;
    },
    ATTR: function(match, curLoop, inplace, result, not, isXML){
    var name = match[1].replace(/\/g, “”);

    if ( !isXML && Expr.attrMap[name] ) {
    match[1] = Expr.attrMap[name];
    }

    if ( match[2] === “~=” ) {
    match[4] = ” ” + match[4] + ” “;
    }

    return match;
    },
    PSEUDO: function(match, curLoop, inplace, result, not){
    if ( match[1] === “not” ) {
    // If we’re dealing with a complex expression, or a simple one
    if ( ( chunker.exec(match[3]) || “” ).length > 1 || /^w/.test(match[3]) ) {
    match[3] = Sizzle(match[3], null, null, curLoop);
    } else {
    var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
    if ( !inplace ) {
    result.push.apply( result, ret );
    }
    return false;
    }
    } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
    return true;
    }

    return match;
    },
    POS: function(match){
    match.unshift( true );
    return match;
    }
    },
    filters: {
    enabled: function(elem){
    return elem.disabled === false && elem.type !== “hidden”;
    },
    disabled: function(elem){
    return elem.disabled === true;
    },
    checked: function(elem){
    return elem.checked === true;
    },
    selected: function(elem){
    // Accessing this property makes selected-by-default
    // options in Safari work properly
    elem.parentNode.selectedIndex;
    return elem.selected === true;
    },
    parent: function(elem){
    return !!elem.firstChild;
    },
    empty: function(elem){
    return !elem.firstChild;
    },
    has: function(elem, i, match){
    return !!Sizzle( match[3], elem ).length;
    },
    header: function(elem){
    return /hd/i.test( elem.nodeName );
    },
    text: function(elem){
    return “text” === elem.type;
    },
    radio: function(elem){
    return “radio” === elem.type;
    },
    checkbox: function(elem){
    return “checkbox” === elem.type;
    },
    file: function(elem){
    return “file” === elem.type;
    },
    password: function(elem){
    return “password” === elem.type;
    },
    submit: function(elem){
    return “submit” === elem.type;
    },
    image: function(elem){
    return “image” === elem.type;
    },
    reset: function(elem){
    return “reset” === elem.type;
    },
    button: function(elem){
    return “button” === elem.type || elem.nodeName.toLowerCase() === “button”;
    },
    input: function(elem){
    return /input|select|textarea|button/i.test(elem.nodeName);
    }
    },
    setFilters: {
    first: function(elem, i){
    return i === 0;
    },
    last: function(elem, i, match, array){
    return i === array.length – 1;
    },
    even: function(elem, i){
    return i % 2 === 0;
    },
    odd: function(elem, i){
    return i % 2 === 1;
    },
    lt: function(elem, i, match){
    return i match[3] – 0;
    },
    nth: function(elem, i, match){
    return match[3] – 0 === i;
    },
    eq: function(elem, i, match){
    return match[3] – 0 === i;
    }
    },
    filter: {
    PSEUDO: function(elem, match, i, array){
    var name = match[1], filter = Expr.filters[ name ];

    if ( filter ) {
    return filter( elem, i, match, array );
    } else if ( name === “contains” ) {
    return (elem.textContent || elem.innerText || getText([ elem ]) || “”).indexOf(match[3]) >= 0;
    } else if ( name === “not” ) {
    var not = match[3];

    for ( var i = 0, l = not.length; i = 0 );
    }
    }
    },
    ID: function(elem, match){
    return elem.nodeType === 1 && elem.getAttribute(“id”) === match;
    },
    TAG: function(elem, match){
    return (match === “*” && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
    },
    CLASS: function(elem, match){
    return (” ” + (elem.className || elem.getAttribute(“class”)) + ” “)
    .indexOf( match ) > -1;
    },
    ATTR: function(elem, match){
    var name = match[1],
    result = Expr.attrHandle[ name ] ?
    Expr.attrHandle[ name ]( elem ) :
    elem[ name ] != null ?
    elem[ name ] :
    elem.getAttribute( name ),
    value = result + “”,
    type = match[2],
    check = match[4];

    return result == null ?
    type === “!=” :
    type === “=” ?
    value === check :
    type === “*=” ?
    value.indexOf(check) >= 0 :
    type === “~=” ?
    (” ” + value + ” “).indexOf(check) >= 0 :
    !check ?
    value && result !== false :
    type === “!=” ?
    value !== check :
    type === “^=” ?
    value.indexOf(check) === 0 :
    type === “$=” ?
    value.substr(value.length – check.length) === check :
    type === “|=” ?
    value === check || value.substr(0, check.length + 1) === check + “-” :
    false;
    },
    POS: function(elem, match, i, array){
    var name = match[2], filter = Expr.setFilters[ name ];

    if ( filter ) {
    return filter( elem, i, match, array );
    }
    }
    }
    };

    var origPOS = Expr.match.POS;

    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, function(all, num){
    return “\” + (num – 0 + 1);
    }));
    }

    var makeArray = function(array, results) {
    array = Array.prototype.slice.call( array, 0 );

    if ( results ) {
    results.push.apply( results, array );
    return results;
    }

    return array;
    };

    // Perform a simple check to determine if the browser is capable of
    // converting a NodeList to an array using builtin methods.
    // Also verifies that the returned array holds DOM nodes
    // (which is not the case in the Blackberry browser)
    try {
    Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;

    // Provide a fallback method if it does not work
    } catch(e){
    makeArray = function(array, results) {
    var ret = results || [];

    if ( toString.call(array) === “[object Array]” ) {
    Array.prototype.push.apply( ret, array );
    } else {
    if ( typeof array.length === “number” ) {
    for ( var i = 0, l = array.length; i < l; i++ ) {
    ret.push( array[i] );
    }
    } else {
    for ( var i = 0; array[i]; i++ ) {
    ret.push( array[i] );
    }
    }
    }

    return ret;
    };
    }

    var sortOrder;

    if ( document.documentElement.compareDocumentPosition ) {
    sortOrder = function( a, b ) {
    if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
    if ( a == b ) {
    hasDuplicate = true;
    }
    return a.compareDocumentPosition ? -1 : 1;
    }

    var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
    if ( ret === 0 ) {
    hasDuplicate = true;
    }
    return ret;
    };
    } else if ( "sourceIndex" in document.documentElement ) {
    sortOrder = function( a, b ) {
    if ( !a.sourceIndex || !b.sourceIndex ) {
    if ( a == b ) {
    hasDuplicate = true;
    }
    return a.sourceIndex ? -1 : 1;
    }

    var ret = a.sourceIndex – b.sourceIndex;
    if ( ret === 0 ) {
    hasDuplicate = true;
    }
    return ret;
    };
    } else if ( document.createRange ) {
    sortOrder = function( a, b ) {
    if ( !a.ownerDocument || !b.ownerDocument ) {
    if ( a == b ) {
    hasDuplicate = true;
    }
    return a.ownerDocument ? -1 : 1;
    }

    var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
    aRange.setStart(a, 0);
    aRange.setEnd(a, 0);
    bRange.setStart(b, 0);
    bRange.setEnd(b, 0);
    var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
    if ( ret === 0 ) {
    hasDuplicate = true;
    }
    return ret;
    };
    }

    // Utility function for retreiving the text value of an array of DOM nodes
    function getText( elems ) {
    var ret = "", elem;

    for ( var i = 0; elems[i]; i++ ) {
    elem = elems[i];

    // Get the text from text nodes and CDATA nodes
    if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
    ret += elem.nodeValue;

    // Traverse everything else, except comment nodes
    } else if ( elem.nodeType !== 8 ) {
    ret += getText( elem.childNodes );
    }
    }

    return ret;
    }

    // Check to see if the browser returns elements by name when
    // querying by getElementById (and provide a workaround)
    (function(){
    // We're going to inject a fake input element with a specified name
    var form = document.createElement("div"),
    id = "script" + (new Date).getTime();
    form.innerHTML = "“;

    // Inject it into the root element, check its status, and remove it quickly
    var root = document.documentElement;
    root.insertBefore( form, root.firstChild );

    // The workaround has to do additional checks after a getElementById
    // Which slows things down for other browsers (hence the branching)
    if ( document.getElementById( id ) ) {
    Expr.find.ID = function(match, context, isXML){
    if ( typeof context.getElementById !== “undefined” && !isXML ) {
    var m = context.getElementById(match[1]);
    return m ? m.id === match[1] || typeof m.getAttributeNode !== “undefined” && m.getAttributeNode(“id”).nodeValue === match[1] ? [m] : undefined : [];
    }
    };

    Expr.filter.ID = function(elem, match){
    var node = typeof elem.getAttributeNode !== “undefined” && elem.getAttributeNode(“id”);
    return elem.nodeType === 1 && node && node.nodeValue === match;
    };
    }

    root.removeChild( form );
    root = form = null; // release memory in IE
    })();

    (function(){
    // Check to see if the browser returns only elements
    // when doing getElementsByTagName(“*”)

    // Create a fake element
    var div = document.createElement(“div”);
    div.appendChild( document.createComment(“”) );

    // Make sure no comments are found
    if ( div.getElementsByTagName(“*”).length > 0 ) {
    Expr.find.TAG = function(match, context){
    var results = context.getElementsByTagName(match[1]);

    // Filter out possible comments
    if ( match[1] === “*” ) {
    var tmp = [];

    for ( var i = 0; results[i]; i++ ) {
    if ( results[i].nodeType === 1 ) {
    tmp.push( results[i] );
    }
    }

    results = tmp;
    }

    return results;
    };
    }

    // Check to see if an attribute returns normalized href attributes
    div.innerHTML = “
    “;
    if ( div.firstChild && typeof div.firstChild.getAttribute !== “undefined” &&
    div.firstChild.getAttribute(“href”) !== “#” ) {
    Expr.attrHandle.href = function(elem){
    return elem.getAttribute(“href”, 2);
    };
    }

    div = null; // release memory in IE
    })();

    if ( document.querySelectorAll ) {
    (function(){
    var oldSizzle = Sizzle, div = document.createElement(“div”);
    div.innerHTML = ”

    “;

    // Safari can’t handle uppercase or unicode characters when
    // in quirks mode.
    if ( div.querySelectorAll && div.querySelectorAll(“.TEST”).length === 0 ) {
    return;
    }

    Sizzle = function(query, context, extra, seed){
    context = context || document;

    // Only use querySelectorAll on non-XML documents
    // (ID selectors don’t work in non-HTML documents)
    if ( !seed && context.nodeType === 9 && !isXML(context) ) {
    try {
    return makeArray( context.querySelectorAll(query), extra );
    } catch(e){}
    }

    return oldSizzle(query, context, extra, seed);
    };

    for ( var prop in oldSizzle ) {
    Sizzle[ prop ] = oldSizzle[ prop ];
    }

    div = null; // release memory in IE
    })();
    }

    (function(){
    var div = document.createElement(“div”);

    div.innerHTML = ”

    “;

    // Opera can’t find a second classname (in 9.6)
    // Also, make sure that getElementsByClassName actually exists
    if ( !div.getElementsByClassName || div.getElementsByClassName(“e”).length === 0 ) {
    return;
    }

    // Safari caches class attributes, doesn’t catch changes (in 3.2)
    div.lastChild.className = “e”;

    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 ) {
    return context.getElementsByClassName(match[1]);
    }
    };

    div = null; // release memory in IE
    })();

    function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
    for ( var i = 0, l = checkSet.length; i < l; i++ ) {
    var elem = checkSet[i];
    if ( elem ) {
    elem = elem[dir];
    var match = false;

    while ( elem ) {
    if ( elem.sizcache === doneName ) {
    match = checkSet[elem.sizset];
    break;
    }

    if ( elem.nodeType === 1 && !isXML ){
    elem.sizcache = doneName;
    elem.sizset = i;
    }

    if ( elem.nodeName.toLowerCase() === cur ) {
    match = elem;
    break;
    }

    elem = elem[dir];
    }

    checkSet[i] = match;
    }
    }
    }

    function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
    for ( var i = 0, l = checkSet.length; i 0 ) {
    match = elem;
    break;
    }
    }

    elem = elem[dir];
    }

    checkSet[i] = match;
    }
    }
    }

    var contains = document.compareDocumentPosition ? function(a, b){
    return !!(a.compareDocumentPosition(b) & 16);
    } : function(a, b){
    return a !== b && (a.contains ? a.contains(b) : true);
    };

    var isXML = function(elem){
    // documentElement is verified for cases where it doesn’t yet exist
    // (such as loading iframes in IE – #4833)
    var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
    return documentElement ? documentElement.nodeName !== “HTML” : false;
    };

    var posProcess = function(selector, context){
    var tmpSet = [], later = “”, match,
    root = context.nodeType ? [context] : context;

    // Position selectors must be done after the filter
    // And so must :not(positional) so we move all PSEUDOs to the end
    while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
    later += match[0];
    selector = selector.replace( Expr.match.PSEUDO, “” );
    }

    selector = Expr.relative[selector] ? selector + “*” : selector;

    for ( var i = 0, l = root.length; i = 0) === keep;
    });
    };

    jQuery.fn.extend({
    find: function( selector ) {
    var ret = this.pushStack( “”, “find”, selector ), length = 0;

    for ( var i = 0, l = this.length; i 0 ) {
    // Make sure that the results are unique
    for ( var n = length; n < ret.length; n++ ) {
    for ( var r = 0; r < length; r++ ) {
    if ( ret[r] === ret[n] ) {
    ret.splice(n–, 1);
    break;
    }
    }
    }
    }
    }

    return ret;
    },

    has: function( target ) {
    var targets = jQuery( target );
    return this.filter(function() {
    for ( var i = 0, l = targets.length; i 0;
    },

    closest: function( selectors, context ) {
    if ( jQuery.isArray( selectors ) ) {
    var ret = [], cur = this[0], match, matches = {}, selector;

    if ( cur && selectors.length ) {
    for ( var i = 0, l = selectors.length; i -1 : jQuery(cur).is(match) ) {
    ret.push({ selector: selector, elem: cur });
    delete matches[selector];
    }
    }
    cur = cur.parentNode;
    }
    }

    return ret;
    }

    var pos = jQuery.expr.match.POS.test( selectors ) ?
    jQuery( selectors, context || this.context ) : null;

    return this.map(function( i, cur ) {
    while ( cur && cur.ownerDocument && cur !== context ) {
    if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
    return cur;
    }
    cur = cur.parentNode;
    }
    return null;
    });
    },

    // Determine the position of an element within
    // the matched set of elements
    index: function( elem ) {
    if ( !elem || typeof elem === “string” ) {
    return jQuery.inArray( this[0],
    // If it receives a string, the selector is used
    // If it receives nothing, the siblings are used
    elem ? jQuery( elem ) : this.parent().children() );
    }
    // Locate the position of the desired element
    return jQuery.inArray(
    // If it receives a jQuery object, the first element is used
    elem.jquery ? elem[0] : elem, this );
    },

    add: function( selector, context ) {
    var set = typeof selector === “string” ?
    jQuery( selector, context || this.context ) :
    jQuery.makeArray( selector ),
    all = jQuery.merge( this.get(), set );

    return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
    all :
    jQuery.unique( all ) );
    },

    andSelf: function() {
    return this.add( this.prevObject );
    }
    });

    // A painfully simple check to see if an element is disconnected
    // from a document (should be improved, where feasible).
    function isDisconnected( node ) {
    return !node || !node.parentNode || node.parentNode.nodeType === 11;
    }

    jQuery.each({
    parent: function( elem ) {
    var parent = elem.parentNode;
    return parent && parent.nodeType !== 11 ? parent : null;
    },
    parents: function( elem ) {
    return jQuery.dir( elem, “parentNode” );
    },
    parentsUntil: function( elem, i, until ) {
    return jQuery.dir( elem, “parentNode”, until );
    },
    next: function( elem ) {
    return jQuery.nth( elem, 2, “nextSibling” );
    },
    prev: function( elem ) {
    return jQuery.nth( elem, 2, “previousSibling” );
    },
    nextAll: function( elem ) {
    return jQuery.dir( elem, “nextSibling” );
    },
    prevAll: function( elem ) {
    return jQuery.dir( elem, “previousSibling” );
    },
    nextUntil: function( elem, i, until ) {
    return jQuery.dir( elem, “nextSibling”, until );
    },
    prevUntil: function( elem, i, until ) {
    return jQuery.dir( elem, “previousSibling”, until );
    },
    siblings: function( elem ) {
    return jQuery.sibling( elem.parentNode.firstChild, elem );
    },
    children: function( elem ) {
    return jQuery.sibling( elem.firstChild );
    },
    contents: function( elem ) {
    return jQuery.nodeName( elem, “iframe” ) ?
    elem.contentDocument || elem.contentWindow.document :
    jQuery.makeArray( elem.childNodes );
    }
    }, function( name, fn ) {
    jQuery.fn[ name ] = function( until, selector ) {
    var ret = jQuery.map( this, fn, until );

    if ( !runtil.test( name ) ) {
    selector = until;
    }

    if ( selector && typeof selector === “string” ) {
    ret = jQuery.filter( selector, ret );
    }

    ret = this.length > 1 ? jQuery.unique( ret ) : ret;

    if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
    ret = ret.reverse();
    }

    return this.pushStack( ret, name, slice.call(arguments).join(“,”) );
    };
    });

    jQuery.extend({
    filter: function( expr, elems, not ) {
    if ( not ) {
    expr = “:not(” + expr + “)”;
    }

    return jQuery.find.matches(expr, elems);
    },

    dir: function( elem, dir, until ) {
    var matched = [], cur = elem[dir];
    while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
    if ( cur.nodeType === 1 ) {
    matched.push( cur );
    }
    cur = cur[dir];
    }
    return matched;
    },

    nth: function( cur, result, dir, elem ) {
    result = result || 1;
    var num = 0;

    for ( ; cur; cur = cur[dir] ) {
    if ( cur.nodeType === 1 && ++num === result ) {
    break;
    }
    }

    return cur;
    },

    sibling: function( n, elem ) {
    var r = [];

    for ( ; n; n = n.nextSibling ) {
    if ( n.nodeType === 1 && n !== elem ) {
    r.push( n );
    }
    }

    return r;
    }
    });
    var rinlinejQuery = / jQueryd+=”(?:d+|null)”/g,
    rleadingWhitespace = /^s+/,
    rxhtmlTag = /(]*?)/>/g,
    rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
    rtagName = /<([w:]+)/,
    rtbody = /

    <tbody/i,
    rhtml = /<|&#?w+;/,
    rnocache = /<script|<object|<embed|































    <option|

    “;
    },
    wrapMap = {
    option: [ 1, “”, ”

    ” ],
    legend: [ 1, ”

    “, ”

    ” ],
    thead: [ 1, ”

    “, “

    ” ],
    tr: [ 2, ”

    “, “

    ” ],
    td: [ 3, ”

    “, “

    ” ],
    col: [ 2, ”

    “, “

    ” ],
    area: [ 1, ”

    “, “

    ” ],
    _default: [ 0, “”, “” ]
    };

    wrapMap.optgroup = wrapMap.option;
    wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
    wrapMap.th = wrapMap.td;

    // IE can’t serialize

    and tags normally
    if ( !jQuery.support.htmlSerialize ) {
    wrapMap._default = [ 1, “div

    “, “

    ” ];
    }

    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 );
    },

    wrapAll: function( html ) {
    if ( jQuery.isFunction( html ) ) {
    return this.each(function(i) {
    jQuery(this).wrapAll( html.call(this, i) );
    });
    }

    if ( this[0] ) {
    // The elements to wrap the target around
    var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);

    if ( this[0].parentNode ) {
    wrap.insertBefore( this[0] );
    }

    wrap.map(function() {
    var elem = this;

    while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
    elem = elem.firstChild;
    }

    return elem;
    }).append(this);
    }

    return this;
    },

    wrapInner: function( html ) {
    if ( jQuery.isFunction( html ) ) {
    return this.each(function(i) {
    jQuery(this).wrapInner( html.call(this, i) );
    });
    }

    return this.each(function() {
    var self = jQuery( this ), contents = self.contents();

    if ( contents.length ) {
    contents.wrapAll( html );

    } else {
    self.append( html );
    }
    });
    },

    wrap: function( html ) {
    return this.each(function() {
    jQuery( this ).wrapAll( html );
    });
    },

    unwrap: function() {
    return this.parent().each(function() {
    if ( !jQuery.nodeName( this, “body” ) ) {
    jQuery( this ).replaceWith( this.childNodes );
    }
    }).end();
    },

    append: function() {
    return this.domManip(arguments, true, function( elem ) {
    if ( this.nodeType === 1 ) {
    this.appendChild( elem );
    }
    });
    },

    prepend: function() {
    return this.domManip(arguments, true, function( elem ) {
    if ( this.nodeType === 1 ) {
    this.insertBefore( elem, this.firstChild );
    }
    });
    },

    before: function() {
    if ( this[0] && this[0].parentNode ) {
    return this.domManip(arguments, false, function( elem ) {
    this.parentNode.insertBefore( elem, this );
    });
    } else if ( arguments.length ) {
    var set = jQuery(arguments[0]);
    set.push.apply( set, this.toArray() );
    return this.pushStack( set, “before”, arguments );
    }
    },

    after: function() {
    if ( this[0] && this[0].parentNode ) {
    return this.domManip(arguments, false, function( elem ) {
    this.parentNode.insertBefore( elem, this.nextSibling );
    });
    } else if ( arguments.length ) {
    var set = this.pushStack( this, “after”, arguments );
    set.push.apply( set, jQuery(arguments[0]).toArray() );
    return set;
    }
    },

    // keepData is for internal use only–do not document
    remove: function( selector, keepData ) {
    for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
    if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
    if ( !keepData && elem.nodeType === 1 ) {
    jQuery.cleanData( elem.getElementsByTagName(“*”) );
    jQuery.cleanData( [ elem ] );
    }

    if ( elem.parentNode ) {
    elem.parentNode.removeChild( elem );
    }
    }
    }

    return this;
    },

    empty: function() {
    for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
    // Remove element nodes and prevent memory leaks
    if ( elem.nodeType === 1 ) {
    jQuery.cleanData( elem.getElementsByTagName(“*”) );
    }

    // Remove any remaining nodes
    while ( elem.firstChild ) {
    elem.removeChild( elem.firstChild );
    }
    }

    return this;
    },

    clone: function( events ) {
    // Do the clone
    var ret = this.map(function() {
    if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
    // IE copies events bound via attachEvent when
    // using cloneNode. Calling detachEvent on the
    // clone will also remove the events from the orignal
    // In order to get around this, we use innerHTML.
    // Unfortunately, this means some modifications to
    // attributes in IE that are actually only stored
    // as properties will not be copied (such as the
    // the name attribute on an input).
    var html = this.outerHTML, ownerDocument = this.ownerDocument;
    if ( !html ) {
    var div = ownerDocument.createElement(“div”);
    div.appendChild( this.cloneNode(true) );
    html = div.innerHTML;
    }

    return jQuery.clean([html.replace(rinlinejQuery, “”)
    // Handle the case in IE 8 where action=/test/> self-closes a tag
    .replace(/=([^=”‘>s]+/)>/g, ‘=”$1″>’)
    .replace(rleadingWhitespace, “”)], ownerDocument)[0];
    } else {
    return this.cloneNode(true);
    }
    });

    // Copy the events from the original to the clone
    if ( events === true ) {
    cloneCopyEvent( this, ret );
    cloneCopyEvent( this.find(“*”), ret.find(“*”) );
    }

    // Return the cloned set
    return ret;
    },

    html: function( value ) {
    if ( value === undefined ) {
    return this[0] && this[0].nodeType === 1 ?
    this[0].innerHTML.replace(rinlinejQuery, “”) :
    null;

    // See if we can take a shortcut and just use innerHTML
    } else if ( typeof value === “string” && !rnocache.test( value ) &&
    (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
    !wrapMap[ (rtagName.exec( value ) || [“”, “”])[1].toLowerCase() ] ) {

    value = value.replace(rxhtmlTag, fcloseTag);

    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 using innerHTML throws an exception, use the fallback method
    } catch(e) {
    this.empty().append( value );
    }

    } else if ( jQuery.isFunction( value ) ) {
    this.each(function(i){
    var self = jQuery(this), old = self.html();
    self.empty().append(function(){
    return value.call( this, i, old );
    });
    });

    } else {
    this.empty().append( value );
    }

    return this;
    },

    replaceWith: function( value ) {
    if ( this[0] && this[0].parentNode ) {
    // Make sure that the elements are removed from the DOM before they are inserted
    // this can help fix replacing a parent with child elements
    if ( jQuery.isFunction( value ) ) {
    return this.each(function(i) {
    var self = jQuery(this), old = self.html();
    self.replaceWith( value.call( this, i, old ) );
    });
    }

    if ( typeof value !== "string" ) {
    value = jQuery(value).detach();
    }

    return this.each(function() {
    var next = this.nextSibling, parent = this.parentNode;

    jQuery(this).remove();

    if ( next ) {
    jQuery(next).before( value );
    } else {
    jQuery(parent).append( value );
    }
    });
    } else {
    return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
    }
    },

    detach: function( selector ) {
    return this.remove( selector, true );
    },

    domManip: function( args, table, callback ) {
    var results, first, value = args[0], scripts = [], fragment, parent;

    // We can't cloneNode fragments that contain checked, in WebKit
    if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
    return this.each(function() {
    jQuery(this).domManip( args, table, callback, true );
    });
    }

    if ( jQuery.isFunction(value) ) {
    return this.each(function(i) {
    var self = jQuery(this);
    args[0] = value.call(this, i, table ? self.html() : undefined);
    self.domManip( args, table, callback );
    });
    }

    if ( this[0] ) {
    parent = value && value.parentNode;

    // If we're in a fragment, just use that instead of building a new one
    if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
    results = { fragment: parent };

    } else {
    results = buildFragment( args, this, scripts );
    }

    fragment = results.fragment;

    if ( fragment.childNodes.length === 1 ) {
    first = fragment = fragment.firstChild;
    } else {
    first = fragment.firstChild;
    }

    if ( first ) {
    table = table && jQuery.nodeName( first, "tr" );

    for ( var i = 0, l = this.length; i 0 || results.cacheable || this.length > 1 ?
    fragment.cloneNode(true) :
    fragment
    );
    }
    }

    if ( scripts.length ) {
    jQuery.each( scripts, evalScript );
    }
    }

    return this;

    function root( elem, cur ) {
    return jQuery.nodeName(elem, “table”) ?
    (elem.getElementsByTagName(“tbody”)[0] ||
    elem.appendChild(elem.ownerDocument.createElement(“tbody”))) :
    elem;
    }
    }
    });

    function cloneCopyEvent(orig, ret) {
    var i = 0;

    ret.each(function() {
    if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
    return;
    }

    var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;

    if ( events ) {
    delete curData.handle;
    curData.events = {};

    for ( var type in events ) {
    for ( var handler in events[ type ] ) {
    jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
    }
    }
    }
    });
    }

    function buildFragment( args, nodes, scripts ) {
    var fragment, cacheable, cacheresults,
    doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);

    // Only cache “small” (1/2 KB) strings that are associated with the main document
    // Cloning options loses the selected state, so don’t cache them
    // IE 6 doesn’t like it when you put or elements in a fragment
    // Also, WebKit does not clone ‘checked’ attributes on cloneNode, so don’t cache
    if ( args.length === 1 && typeof args[0] === “string” && args[0].length < 512 && doc === document &&
    !rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {

    cacheable = true;
    cacheresults = jQuery.fragments[ args[0] ];
    if ( cacheresults ) {
    if ( cacheresults !== 1 ) {
    fragment = cacheresults;
    }
    }
    }

    if ( !fragment ) {
    fragment = doc.createDocumentFragment();
    jQuery.clean( args, doc, fragment, scripts );
    }

    if ( cacheable ) {
    jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
    }

    return { fragment: fragment, cacheable: cacheable };
    }

    jQuery.fragments = {};

    jQuery.each({
    appendTo: "append",
    prependTo: "prepend",
    insertBefore: "before",
    insertAfter: "after",
    replaceAll: "replaceWith"
    }, function( name, original ) {
    jQuery.fn[ name ] = function( selector ) {
    var ret = [], insert = jQuery( selector ),
    parent = this.length === 1 && this[0].parentNode;

    if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
    insert[ original ]( this[0] );
    return this;

    } else {
    for ( var i = 0, l = insert.length; i 0 ? this.clone(true) : this).get();
    jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
    ret = ret.concat( elems );
    }

    return this.pushStack( ret, name, insert.selector );
    }
    };
    });

    jQuery.extend({
    clean: function( elems, context, fragment, scripts ) {
    context = context || document;

    // !context.createElement fails in IE with an error but returns typeof ‘object’
    if ( typeof context.createElement === “undefined” ) {
    context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
    }

    var ret = [];

    for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
    if ( typeof elem === “number” ) {
    elem += “”;
    }

    if ( !elem ) {
    continue;
    }

    // Convert html string into DOM nodes
    if ( typeof elem === “string” && !rhtml.test( elem ) ) {
    elem = context.createTextNode( elem );

    } else if ( typeof elem === “string” ) {
    // Fix “XHTML”-style tags in all browsers
    elem = elem.replace(rxhtmlTag, fcloseTag);

    // Trim whitespace, otherwise indexOf won’t work as expected
    var tag = (rtagName.exec( elem ) || [“”, “”])[1].toLowerCase(),
    wrap = wrapMap[ tag ] || wrapMap._default,
    depth = wrap[0],
    div = context.createElement(“div”);

    // Go to html and back, then peel off extra wrappers
    div.innerHTML = wrap[1] + elem + wrap[2];

    // Move to the right depth
    while ( depth– ) {
    div = div.lastChild;
    }

    // Remove IE’s autoinserted

    from table fragments
    if ( !jQuery.support.tbody ) {

    // String was a

    , *may* have spurious

    var hasBody = rtbody.test(elem),
    tbody = tag === “table” && !hasBody ?
    div.firstChild && div.firstChild.childNodes :

    // String was a bare

    or

    wrap[1] === ”

    ” && !hasBody ?
    div.childNodes :
    [];

    for ( var j = tbody.length – 1; j >= 0 ; –j ) {
    if ( jQuery.nodeName( tbody[ j ], “tbody” ) && !tbody[ j ].childNodes.length ) {
    tbody[ j ].parentNode.removeChild( tbody[ j ] );
    }
    }

    }

    // IE completely kills leading whitespace when innerHTML is used
    if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
    div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
    }

    elem = div.childNodes;
    }

    if ( elem.nodeType ) {
    ret.push( elem );
    } else {
    ret = jQuery.merge( ret, elem );
    }
    }

    if ( fragment ) {
    for ( var 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] );

    } else {
    if ( ret[i].nodeType === 1 ) {
    ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName(“script”))) );
    }
    fragment.appendChild( ret[i] );
    }
    }
    }

    return ret;
    },

    cleanData: function( elems ) {
    var data, id, cache = jQuery.cache,
    special = jQuery.event.special,
    deleteExpando = jQuery.support.deleteExpando;

    for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
    id = elem[ jQuery.expando ];

    if ( id ) {
    data = cache[ id ];

    if ( data.events ) {
    for ( var type in data.events ) {
    if ( special[ type ] ) {
    jQuery.event.remove( elem, type );

    } else {
    removeEvent( elem, type, data.handle );
    }
    }
    }

    if ( deleteExpando ) {
    delete elem[ jQuery.expando ];

    } else if ( elem.removeAttribute ) {
    elem.removeAttribute( jQuery.expando );
    }

    delete cache[ id ];
    }
    }
    }
    });
    // exclude the following css properties to add px
    var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
    ralpha = /alpha([^)]*)/,
    ropacity = /opacity=([^)]*)/,
    rfloat = /float/i,
    rdashAlpha = /-([a-z])/ig,
    rupper = /([A-Z])/g,
    rnumpx = /^-?d+(?:px)?$/i,
    rnum = /^-?d/,

    cssShow = { position: “absolute”, visibility: “hidden”, display:”block” },
    cssWidth = [ “Left”, “Right” ],
    cssHeight = [ “Top”, “Bottom” ],

    // cache check for defaultView.getComputedStyle
    getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
    // normalize float css property
    styleFloat = jQuery.support.cssFloat ? “cssFloat” : “styleFloat”,
    fcamelCase = function( all, letter ) {
    return letter.toUpperCase();
    };

    jQuery.fn.css = function( name, value ) {
    return access( this, name, value, true, function( elem, name, value ) {
    if ( value === undefined ) {
    return jQuery.curCSS( elem, name );
    }

    if ( typeof value === “number” && !rexclude.test(name) ) {
    value += “px”;
    }

    jQuery.style( elem, name, value );
    });
    };

    jQuery.extend({
    style: function( elem, name, value ) {
    // don’t set styles on text and comment nodes
    if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
    return undefined;
    }

    // ignore negative width and height values #1599
    if ( (name === “width” || name === “height”) && parseFloat(value) = 0 ?
    (parseFloat( ropacity.exec(style.filter)[1] ) / 100) + “”:
    “”;
    }

    // Make sure we’re using the right name for getting the float value
    if ( rfloat.test( name ) ) {
    name = styleFloat;
    }

    name = name.replace(rdashAlpha, fcamelCase);

    if ( set ) {
    style[ name ] = value;
    }

    return style[ name ];
    },

    css: function( elem, name, force, extra ) {
    if ( name === “width” || name === “height” ) {
    var val, props = cssShow, which = name === “width” ? cssWidth : cssHeight;

    function getWH() {
    val = name === “width” ? elem.offsetWidth : elem.offsetHeight;

    if ( extra === “border” ) {
    return;
    }

    jQuery.each( which, function() {
    if ( !extra ) {
    val -= parseFloat(jQuery.curCSS( elem, “padding” + this, true)) || 0;
    }

    if ( extra === “margin” ) {
    val += parseFloat(jQuery.curCSS( elem, “margin” + this, true)) || 0;
    } else {
    val -= parseFloat(jQuery.curCSS( elem, “border” + this + “Width”, true)) || 0;
    }
    });
    }

    if ( elem.offsetWidth !== 0 ) {
    getWH();
    } else {
    jQuery.swap( elem, props, getWH );
    }

    return Math.max(0, Math.round(val));
    }

    return jQuery.curCSS( elem, name, force );
    },

    curCSS: function( elem, name, force ) {
    var ret, style = elem.style, filter;

    // IE uses filters for opacity
    if ( !jQuery.support.opacity && name === “opacity” && elem.currentStyle ) {
    ret = ropacity.test(elem.currentStyle.filter || “”) ?
    (parseFloat(RegExp.$1) / 100) + “” :
    “”;

    return ret === “” ?
    “1” :
    ret;
    }

    // Make sure we’re using the right name for getting the float value
    if ( rfloat.test( name ) ) {
    name = styleFloat;
    }

    if ( !force && style && style[ name ] ) {
    ret = style[ name ];

    } else if ( getComputedStyle ) {

    // Only “float” is needed here
    if ( rfloat.test( name ) ) {
    name = “float”;
    }

    name = name.replace( rupper, “-$1” ).toLowerCase();

    var defaultView = elem.ownerDocument.defaultView;

    if ( !defaultView ) {
    return null;
    }

    var computedStyle = defaultView.getComputedStyle( elem, null );

    if ( computedStyle ) {
    ret = computedStyle.getPropertyValue( name );
    }

    // We should always get a number back from opacity
    if ( name === “opacity” && ret === “” ) {
    ret = “1”;
    }

    } else if ( elem.currentStyle ) {
    var camelCase = name.replace(rdashAlpha, fcamelCase);

    ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];

    // From the awesome hack by Dean Edwards
    // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291

    // 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 ) ) {
    // Remember the original values
    var left = style.left, rsLeft = elem.runtimeStyle.left;

    // Put in the new values to get a computed value out
    elem.runtimeStyle.left = elem.currentStyle.left;
    style.left = camelCase === “fontSize” ? “1em” : (ret || 0);
    ret = style.pixelLeft + “px”;

    // Revert the changed values
    style.left = left;
    elem.runtimeStyle.left = rsLeft;
    }
    }

    return ret;
    },

    // A method for quickly swapping in/out CSS properties to get correct calculations
    swap: function( elem, options, callback ) {
    var old = {};

    // Remember the old values, and insert the new ones
    for ( var name in options ) {
    old[ name ] = elem.style[ name ];
    elem.style[ name ] = options[ name ];
    }

    callback.call( elem );

    // Revert the old values
    for ( var name in options ) {
    elem.style[ name ] = old[ name ];
    }
    }
    });

    if ( jQuery.expr && jQuery.expr.filters ) {
    jQuery.expr.filters.hidden = function( elem ) {
    var width = elem.offsetWidth, height = elem.offsetHeight,
    skip = elem.nodeName.toLowerCase() === “tr”;

    return width === 0 && height === 0 && !skip ?
    true :
    width > 0 && height > 0 && !skip ?
    false :
    jQuery.curCSS(elem, “display”) === “none”;
    };

    jQuery.expr.filters.visible = function( elem ) {
    return !jQuery.expr.filters.hidden( elem );
    };
    }
    var jsc = now(),
    rscript = //gi,
    rselectTextarea = /select|textarea/i,
    rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
    jsre = /=?(&|$)/,
    rquery = /?/,
    rts = /(?|&)_=.*?(&|$)/,
    rurl = /^(w+:)?//([^/?#]+)/,
    r20 = /%20/g,

    // Keep a copy of the old load method
    _load = jQuery.fn.load;

    jQuery.fn.extend({
    load: function( url, params, callback ) {
    if ( typeof url !== “string” ) {
    return _load.call( this, url );

    // Don’t do a request if no elements are being requested
    } else if ( !this.length ) {
    return this;
    }

    var off = url.indexOf(” “);
    if ( off >= 0 ) {
    var selector = url.slice(off, url.length);
    url = url.slice(0, off);
    }

    // Default to a GET request
    var type = “GET”;

    // If the second parameter was provided
    if ( params ) {
    // If it’s a function
    if ( jQuery.isFunction( params ) ) {
    // We assume that it’s the callback
    callback = params;
    params = null;

    // Otherwise, build a param string
    } else if ( typeof params === “object” ) {
    params = jQuery.param( params, jQuery.ajaxSettings.traditional );
    type = “POST”;
    }
    }

    var self = this;

    // Request the remote document
    jQuery.ajax({
    url: url,
    type: type,
    dataType: “html”,
    data: params,
    complete: function( res, status ) {
    // If successful, inject the HTML into all the matched elements
    if ( status === “success” || status === “notmodified” ) {
    // See if a selector was specified
    self.html( selector ?
    // Create a dummy div to hold the results
    jQuery(”

    “)
    // inject the contents of the document in, removing the scripts
    // to avoid any ‘Permission Denied’ errors in IE
    .append(res.responseText.replace(rscript, “”))

    // Locate the specified elements
    .find(selector) :

    // If not, just inject the full result
    res.responseText );
    }

    if ( callback ) {
    self.each( callback, [res.responseText, status, res] );
    }
    }
    });

    return this;
    },

    serialize: function() {
    return jQuery.param(this.serializeArray());
    },
    serializeArray: function() {
    return this.map(function() {
    return this.elements ? jQuery.makeArray(this.elements) : this;
    })
    .filter(function() {
    return this.name && !this.disabled &&
    (this.checked || rselectTextarea.test(this.nodeName) ||
    rinput.test(this.type));
    })
    .map(function( i, elem ) {
    var val = jQuery(this).val();

    return val == null ?
    null :
    jQuery.isArray(val) ?
    jQuery.map( val, function( val, i ) {
    return { name: elem.name, value: val };
    }) :
    { name: elem.name, value: val };
    }).get();
    }
    });

    // 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);
    };
    });

    jQuery.extend({

    get: function( url, data, callback, type ) {
    // shift arguments if data argument was omited
    if ( jQuery.isFunction( data ) ) {
    type = type || callback;
    callback = data;
    data = null;
    }

    return jQuery.ajax({
    type: “GET”,
    url: url,
    data: data,
    success: callback,
    dataType: type
    });
    },

    getScript: function( url, callback ) {
    return jQuery.get(url, null, callback, “script”);
    },

    getJSON: function( url, data, callback ) {
    return jQuery.get(url, data, callback, “json”);
    },

    post: function( url, data, callback, type ) {
    // shift arguments if data argument was omited
    if ( jQuery.isFunction( data ) ) {
    type = type || callback;
    callback = data;
    data = {};
    }

    return jQuery.ajax({
    type: “POST”,
    url: url,
    data: data,
    success: callback,
    dataType: type
    });
    },

    ajaxSetup: function( settings ) {
    jQuery.extend( jQuery.ajaxSettings, settings );
    },

    ajaxSettings: {
    url: location.href,
    global: true,
    type: “GET”,
    contentType: “application/x-www-form-urlencoded”,
    processData: true,
    async: true,
    /*
    timeout: 0,
    data: null,
    username: null,
    password: null,
    traditional: false,
    */
    // Create the request object; Microsoft failed to properly
    // implement the XMLHttpRequest in IE7 (can’t request local files),
    // so we use the ActiveXObject when it is available
    // This function can be overriden by calling jQuery.ajaxSetup
    xhr: window.XMLHttpRequest && (window.location.protocol !== “file:” || !window.ActiveXObject) ?
    function() {
    return new window.XMLHttpRequest();
    } :
    function() {
    try {
    return new window.ActiveXObject(“Microsoft.XMLHTTP”);
    } catch(e) {}
    },
    accepts: {
    xml: “application/xml, text/xml”,
    html: “text/html”,
    script: “text/javascript, application/javascript”,
    json: “application/json, text/javascript”,
    text: “text/plain”,
    _default: “*/*”
    }
    },

    // Last-Modified header cache for next request
    lastModified: {},
    etag: {},

    ajax: function( origSettings ) {
    var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);

    var jsonp, status, data,
    callbackContext = origSettings && origSettings.context || s,
    type = s.type.toUpperCase();

    // convert data if not already a string
    if ( s.data && s.processData && typeof s.data !== “string” ) {
    s.data = jQuery.param( s.data, s.traditional );
    }

    // Handle JSONP Parameter Callbacks
    if ( s.dataType === “jsonp” ) {
    if ( type === “GET” ) {
    if ( !jsre.test( s.url ) ) {
    s.url += (rquery.test( s.url ) ? “&” : “?”) + (s.jsonp || “callback”) + “=?”;
    }
    } else if ( !s.data || !jsre.test(s.data) ) {
    s.data = (s.data ? s.data + “&” : “”) + (s.jsonp || “callback”) + “=?”;
    }
    s.dataType = “json”;
    }

    // Build temporary JSONP function
    if ( s.dataType === “json” && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
    jsonp = s.jsonpCallback || (“jsonp” + jsc++);

    // Replace the =? sequence both in the query string and the data
    if ( s.data ) {
    s.data = (s.data + “”).replace(jsre, “=” + jsonp + “$1”);
    }

    s.url = s.url.replace(jsre, “=” + jsonp + “$1”);

    // We need to make sure
    // that a JSONP style response is executed properly
    s.dataType = “script”;

    // Handle JSONP-style loading
    window[ jsonp ] = window[ jsonp ] || function( tmp ) {
    data = tmp;
    success();
    complete();
    // Garbage collect
    window[ jsonp ] = undefined;

    try {
    delete window[ jsonp ];
    } catch(e) {}

    if ( head ) {
    head.removeChild( script );
    }
    };
    }

    if ( s.dataType === “script” && s.cache === null ) {
    s.cache = false;
    }

    if ( s.cache === false && type === “GET” ) {
    var ts = now();

    // try replacing _= if it is there
    var ret = s.url.replace(rts, “$1_=” + ts + “$2”);

    // if nothing was replaced, add timestamp to the end
    s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? “&” : “?”) + “_=” + ts : “”);
    }

    // If data is available, append data to url for get requests
    if ( s.data && type === “GET” ) {
    s.url += (rquery.test(s.url) ? “&” : “?”) + s.data;
    }

    // Watch for a new set of requests
    if ( s.global && ! jQuery.active++ ) {
    jQuery.event.trigger( “ajaxStart” );
    }

    // Matches an absolute URL, and saves the domain
    var parts = rurl.exec( s.url ),
    remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);

    // If we’re requesting a remote document
    // and trying to load JSON or Script with a GET
    if ( s.dataType === “script” && type === “GET” && remote ) {
    var head = document.getElementsByTagName(“head”)[0] || document.documentElement;
    var script = document.createElement(“script”);
    script.src = s.url;
    if ( s.scriptCharset ) {
    script.charset = s.scriptCharset;
    }

    // Handle Script loading
    if ( !jsonp ) {
    var done = false;

    // Attach handlers for all browsers
    script.onload = script.onreadystatechange = function() {
    if ( !done && (!this.readyState ||
    this.readyState === “loaded” || this.readyState === “complete”) ) {
    done = true;
    success();
    complete();

    // Handle memory leak in IE
    script.onload = script.onreadystatechange = null;
    if ( head && script.parentNode ) {
    head.removeChild( script );
    }
    }
    };
    }

    // Use insertBefore instead of appendChild to circumvent an IE6 bug.
    // This arises when a base node is used (#2709 and #4378).
    head.insertBefore( script, head.firstChild );

    // We handle everything using the script element injection
    return undefined;
    }

    var requestDone = false;

    // Create the request object
    var xhr = s.xhr();

    if ( !xhr ) {
    return;
    }

    // Open the socket
    // Passing null username, generates a login popup on Opera (#2865)
    if ( s.username ) {
    xhr.open(type, s.url, s.async, s.username, s.password);
    } else {
    xhr.open(type, s.url, s.async);
    }

    // Need an extra try/catch for cross domain requests in Firefox 3
    try {
    // Set the correct header, if data is being sent
    if ( s.data || origSettings && origSettings.contentType ) {
    xhr.setRequestHeader(“Content-Type”, s.contentType);
    }

    // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
    if ( s.ifModified ) {
    if ( jQuery.lastModified[s.url] ) {
    xhr.setRequestHeader(“If-Modified-Since”, jQuery.lastModified[s.url]);
    }

    if ( jQuery.etag[s.url] ) {
    xhr.setRequestHeader(“If-None-Match”, jQuery.etag[s.url]);
    }
    }

    // Set header so the called script knows that it’s an XMLHttpRequest
    // Only send the header if it’s not a remote XHR
    if ( !remote ) {
    xhr.setRequestHeader(“X-Requested-With”, “XMLHttpRequest”);
    }

    // Set the Accepts header for the server, depending on the dataType
    xhr.setRequestHeader(“Accept”, s.dataType && s.accepts[ s.dataType ] ?
    s.accepts[ s.dataType ] + “, */*” :
    s.accepts._default );
    } catch(e) {}

    // Allow custom headers/mimetypes and early abort
    if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
    // Handle the global AJAX counter
    if ( s.global && ! –jQuery.active ) {
    jQuery.event.trigger( “ajaxStop” );
    }

    // close opended socket
    xhr.abort();
    return false;
    }

    if ( s.global ) {
    trigger(“ajaxSend”, [xhr, s]);
    }

    // Wait for a response to come back
    var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
    // The request was aborted
    if ( !xhr || xhr.readyState === 0 || isTimeout === “abort” ) {
    // Opera doesn’t call onreadystatechange before this point
    // so we simulate the call
    if ( !requestDone ) {
    complete();
    }

    requestDone = true;
    if ( xhr ) {
    xhr.onreadystatechange = jQuery.noop;
    }

    // The transfer is complete and the data is available, or the request timed out
    } else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === “timeout”) ) {
    requestDone = true;
    xhr.onreadystatechange = jQuery.noop;

    status = isTimeout === “timeout” ?
    “timeout” :
    !jQuery.httpSuccess( xhr ) ?
    “error” :
    s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
    “notmodified” :
    “success”;

    var errMsg;

    if ( status === “success” ) {
    // Watch for, and catch, XML document parse errors
    try {
    // process the data (runs the xml through httpData regardless of callback)
    data = jQuery.httpData( xhr, s.dataType, s );
    } catch(err) {
    status = “parsererror”;
    errMsg = err;
    }
    }

    // Make sure that the request was successful or notmodified
    if ( status === “success” || status === “notmodified” ) {
    // JSONP handles its own success callback
    if ( !jsonp ) {
    success();
    }
    } else {
    jQuery.handleError(s, xhr, status, errMsg);
    }

    // Fire the complete handlers
    complete();

    if ( isTimeout === “timeout” ) {
    xhr.abort();
    }

    // Stop memory leaks
    if ( s.async ) {
    xhr = null;
    }
    }
    };

    // Override the abort handler, if we can (IE doesn’t allow it, but that’s OK)
    // Opera doesn’t fire onreadystatechange at all on abort
    try {
    var oldAbort = xhr.abort;
    xhr.abort = function() {
    if ( xhr ) {
    oldAbort.call( xhr );
    }

    onreadystatechange( “abort” );
    };
    } catch(e) { }

    // Timeout checker
    if ( s.async && s.timeout > 0 ) {
    setTimeout(function() {
    // Check to see if the request is still happening
    if ( xhr && !requestDone ) {
    onreadystatechange( “timeout” );
    }
    }, s.timeout);
    }

    // Send the data
    try {
    xhr.send( type === “POST” || type === “PUT” || type === “DELETE” ? s.data : null );
    } catch(e) {
    jQuery.handleError(s, xhr, null, e);
    // Fire the complete handlers
    complete();
    }

    // firefox 1.5 doesn’t fire statechange for sync requests
    if ( !s.async ) {
    onreadystatechange();
    }

    function success() {
    // If a local callback was specified, fire it and pass it the data
    if ( s.success ) {
    s.success.call( callbackContext, data, status, xhr );
    }

    // Fire the global callback
    if ( s.global ) {
    trigger( “ajaxSuccess”, [xhr, s] );
    }
    }

    function complete() {
    // Process result
    if ( s.complete ) {
    s.complete.call( callbackContext, xhr, status);
    }

    // The request was completed
    if ( s.global ) {
    trigger( “ajaxComplete”, [xhr, s] );
    }

    // Handle the global AJAX counter
    if ( s.global && ! –jQuery.active ) {
    jQuery.event.trigger( “ajaxStop” );
    }
    }

    function trigger(type, args) {
    (s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
    }

    // return XMLHttpRequest to allow aborting the request etc.
    return xhr;
    },

    handleError: function( s, xhr, status, e ) {
    // If a local callback was specified, fire it
    if ( s.error ) {
    s.error.call( s.context || s, xhr, status, e );
    }

    // Fire the global callback
    if ( s.global ) {
    (s.context ? jQuery(s.context) : jQuery.event).trigger( “ajaxError”, [xhr, s, e] );
    }
    },

    // Counter for holding the number of active queries
    active: 0,

    // Determines if an XMLHttpRequest was successful or not
    httpSuccess: function( xhr ) {
    try {
    // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
    return !xhr.status && location.protocol === “file:” ||
    // Opera returns 0 when status is 304
    ( xhr.status >= 200 && xhr.status = 0,
    data = xml ? xhr.responseXML : xhr.responseText;

    if ( xml && data.documentElement.nodeName === “parsererror” ) {
    jQuery.error( “parsererror” );
    }

    // Allow a pre-filtering function to sanitize the response
    // s is checked to keep backwards compatibility
    if ( s && s.dataFilter ) {
    data = s.dataFilter( data, type );
    }

    // The filter can actually parse the response
    if ( typeof data === “string” ) {
    // Get the JavaScript object, if JSON is used.
    if ( type === “json” || !type && ct.indexOf(“json”) >= 0 ) {
    data = jQuery.parseJSON( data );

    // If the type is “script”, eval it in global context
    } else if ( type === “script” || !type && ct.indexOf(“javascript”) >= 0 ) {
    jQuery.globalEval( data );
    }
    }

    return data;
    },

    // Serialize an array of form elements or a set of
    // key/values into a query string
    param: function( a, traditional ) {
    var s = [];

    // Set traditional to true for jQuery <= 1.3.2 behavior.
    if ( traditional === undefined ) {
    traditional = jQuery.ajaxSettings.traditional;
    }

    // If an array was passed in, assume that it is an array of form elements.
    if ( jQuery.isArray(a) || a.jquery ) {
    // Serialize the form elements
    jQuery.each( a, function() {
    add( this.name, this.value );
    });

    } else {
    // If traditional, encode the "old" way (the way 1.3.2 or older
    // did it), otherwise encode params recursively.
    for ( var prefix in a ) {
    buildParams( prefix, a[prefix] );
    }
    }

    // Return the resulting serialization
    return s.join("&").replace(r20, "+");

    function buildParams( prefix, obj ) {
    if ( jQuery.isArray(obj) ) {
    // Serialize array item.
    jQuery.each( obj, function( i, v ) {
    if ( traditional || /[]$/.test( prefix ) ) {
    // Treat each array item as a scalar.
    add( prefix, v );
    } else {
    // If array item is non-scalar (array or object), encode its
    // numeric index to resolve deserialization ambiguity issues.
    // Note that rack (as of 1.0.0) can't currently deserialize
    // nested arrays properly, and attempting to do so may cause
    // 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 );
    }
    });

    } else if ( !traditional && obj != null && typeof obj === "object" ) {
    // Serialize object item.
    jQuery.each( obj, function( k, v ) {
    buildParams( prefix + "[" + k + "]", v );
    });

    } else {
    // Serialize scalar item.
    add( prefix, obj );
    }
    }

    function add( key, value ) {
    // If value is a function, invoke it and return its value
    value = jQuery.isFunction(value) ? value() : value;
    s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
    }
    }
    });
    var elemdisplay = {},
    rfxtypes = /toggle|show|hide/,
    rfxnum = /^([+-]=)?([d+-.]+)(.*)$/,
    timerId,
    fxAttrs = [
    // height animations
    [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
    // width animations
    [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
    // opacity animations
    [ "opacity" ]
    ];

    jQuery.fn.extend({
    show: function( speed, callback ) {
    if ( speed || speed === 0) {
    return this.animate( genFx("show", 3), speed, callback);

    } else {
    for ( var i = 0, l = this.length; i < l; i++ ) {
    var old = jQuery.data(this[i], "olddisplay");

    this[i].style.display = old || "";

    if ( jQuery.css(this[i], "display") === "none" ) {
    var nodeName = this[i].nodeName, display;

    if ( elemdisplay[ nodeName ] ) {
    display = elemdisplay[ nodeName ];

    } else {
    var elem = jQuery("”).appendTo(“body”);

    display = elem.css(“display”);

    if ( display === “none” ) {
    display = “block”;
    }

    elem.remove();

    elemdisplay[ nodeName ] = display;
    }

    jQuery.data(this[i], “olddisplay”, display);
    }
    }

    // Set the display of the elements in a second loop
    // to avoid the constant reflow
    for ( var j = 0, k = this.length; j < k; j++ ) {
    this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
    }

    return this;
    }
    },

    hide: function( speed, callback ) {
    if ( speed || speed === 0 ) {
    return this.animate( genFx("hide", 3), speed, callback);

    } else {
    for ( var i = 0, l = this.length; i < l; i++ ) {
    var old = jQuery.data(this[i], "olddisplay");
    if ( !old && old !== "none" ) {
    jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
    }
    }

    // Set the display of the elements in a second loop
    // to avoid the constant reflow
    for ( var j = 0, k = this.length; j = 0; i– ) {
    if ( timers[i].elem === this ) {
    if (gotoEnd) {
    // force the next step to be the last
    timers[i](true);
    }

    timers.splice(i, 1);
    }
    }
    });

    // start the next in the queue if the last step wasn’t forced
    if ( !gotoEnd ) {
    this.dequeue();
    }

    return this;
    }

    });

    // Generate shortcuts for custom animations
    jQuery.each({
    slideDown: genFx(“show”, 1),
    slideUp: genFx(“hide”, 1),
    slideToggle: genFx(“toggle”, 1),
    fadeIn: { opacity: “show” },
    fadeOut: { opacity: “hide” }
    }, function( name, props ) {
    jQuery.fn[ name ] = function( speed, callback ) {
    return this.animate( props, speed, callback );
    };
    });

    jQuery.extend({
    speed: function( speed, easing, fn ) {
    var opt = speed && typeof speed === “object” ? speed : {
    complete: fn || !fn && easing ||
    jQuery.isFunction( speed ) && speed,
    duration: speed,
    easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
    };

    opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === “number” ? opt.duration :
    jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;

    // Queueing
    opt.old = opt.complete;
    opt.complete = function() {
    if ( opt.queue !== false ) {
    jQuery(this).dequeue();
    }
    if ( jQuery.isFunction( opt.old ) ) {
    opt.old.call( this );
    }
    };

    return opt;
    },

    easing: {
    linear: function( p, n, firstNum, diff ) {
    return firstNum + diff * p;
    },
    swing: function( p, n, firstNum, diff ) {
    return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
    }
    },

    timers: [],

    fx: function( elem, options, prop ) {
    this.options = options;
    this.elem = elem;
    this.prop = prop;

    if ( !options.orig ) {
    options.orig = {};
    }
    }

    });

    jQuery.fx.prototype = {
    // Simple function for setting a style value
    update: function() {
    if ( this.options.step ) {
    this.options.step.call( this.elem, this.now, this );
    }

    (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );

    // Set display property to block for height/width animations
    if ( ( this.prop === “height” || this.prop === “width” ) && this.elem.style ) {
    this.elem.style.display = “block”;
    }
    },

    // Get the current size
    cur: function( force ) {
    if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
    return this.elem[ this.prop ];
    }

    var r = parseFloat(jQuery.css(this.elem, this.prop, force));
    return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
    },

    // Start an animation from one number to another
    custom: function( from, to, unit ) {
    this.startTime = now();
    this.start = from;
    this.end = to;
    this.unit = unit || this.unit || “px”;
    this.now = this.start;
    this.pos = this.state = 0;

    var self = this;
    function t( gotoEnd ) {
    return self.step(gotoEnd);
    }

    t.elem = this.elem;

    if ( t() && jQuery.timers.push(t) && !timerId ) {
    timerId = setInterval(jQuery.fx.tick, 13);
    }
    },

    // Simple ‘show’ function
    show: function() {
    // Remember where we started, so that we can go back to it later
    this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
    this.options.show = true;

    // Begin the animation
    // Make sure that we start at a small width/height to avoid any
    // flash of content
    this.custom(this.prop === “width” || this.prop === “height” ? 1 : 0, this.cur());

    // Start by showing the element
    jQuery( this.elem ).show();
    },

    // Simple ‘hide’ function
    hide: function() {
    // Remember where we started, so that we can go back to it later
    this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
    this.options.hide = true;

    // Begin the animation
    this.custom(this.cur(), 0);
    },

    // Each step of an animation
    step: function( gotoEnd ) {
    var t = now(), done = true;

    if ( gotoEnd || t >= this.options.duration + this.startTime ) {
    this.now = this.end;
    this.pos = this.state = 1;
    this.update();

    this.options.curAnim[ this.prop ] = true;

    for ( var i in this.options.curAnim ) {
    if ( this.options.curAnim[i] !== true ) {
    done = false;
    }
    }

    if ( done ) {
    if ( this.options.display != null ) {
    // Reset the overflow
    this.elem.style.overflow = this.options.overflow;

    // Reset the display
    var old = jQuery.data(this.elem, “olddisplay”);
    this.elem.style.display = old ? old : this.options.display;

    if ( jQuery.css(this.elem, “display”) === “none” ) {
    this.elem.style.display = “block”;
    }
    }

    // Hide the element if the “hide” operation was done
    if ( this.options.hide ) {
    jQuery(this.elem).hide();
    }

    // Reset the properties, if the item has been hidden or shown
    if ( this.options.hide || this.options.show ) {
    for ( var p in this.options.curAnim ) {
    jQuery.style(this.elem, p, this.options.orig[p]);
    }
    }

    // Execute the complete function
    this.options.complete.call( this.elem );
    }

    return false;

    } else {
    var n = t – this.startTime;
    this.state = n / this.options.duration;

    // Perform the easing function, defaults to swing
    var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
    var defaultEasing = this.options.easing || (jQuery.easing.swing ? “swing” : “linear”);
    this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
    this.now = this.start + ((this.end – this.start) * this.pos);

    // Perform the next step of the animation
    this.update();
    }

    return true;
    }
    };

    jQuery.extend( jQuery.fx, {
    tick: function() {
    var timers = jQuery.timers;

    for ( var i = 0; i < timers.length; i++ ) {
    if ( !timers[i]() ) {
    timers.splice(i–, 1);
    }
    }

    if ( !timers.length ) {
    jQuery.fx.stop();
    }
    },

    stop: function() {
    clearInterval( timerId );
    timerId = null;
    },

    speeds: {
    slow: 600,
    fast: 200,
    // Default speed
    _default: 400
    },

    step: {
    opacity: function( fx ) {
    jQuery.style(fx.elem, "opacity", fx.now);
    },

    _default: function( fx ) {
    if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
    fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
    } else {
    fx.elem[ fx.prop ] = fx.now;
    }
    }
    }
    });

    if ( jQuery.expr && jQuery.expr.filters ) {
    jQuery.expr.filters.animated = function( elem ) {
    return jQuery.grep(jQuery.timers, function( fn ) {
    return elem === fn.elem;
    }).length;
    };
    }

    function genFx( type, num ) {
    var obj = {};

    jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
    obj[ this ] = type;
    });

    return obj;
    }
    if ( "getBoundingClientRect" in document.documentElement ) {
    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 );
    }

    var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
    clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
    top = box.top + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ) – clientTop,
    left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) – clientLeft;

    return { top: top, left: left };
    };

    } 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 );
    }

    jQuery.offset.initialize();

    var offsetParent = elem.offsetParent, prevOffsetParent = elem,
    doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
    body = doc.body, defaultView = doc.defaultView,
    prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
    top = elem.offsetTop, left = elem.offsetLeft;

    while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
    if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
    break;
    }

    computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
    top -= elem.scrollTop;
    left -= elem.scrollLeft;

    if ( elem === offsetParent ) {
    top += elem.offsetTop;
    left += elem.offsetLeft;

    if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
    top += parseFloat( computedStyle.borderTopWidth ) || 0;
    left += parseFloat( computedStyle.borderLeftWidth ) || 0;
    }

    prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
    }

    if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
    top += parseFloat( computedStyle.borderTopWidth ) || 0;
    left += parseFloat( computedStyle.borderLeftWidth ) || 0;
    }

    prevComputedStyle = computedStyle;
    }

    if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
    top += body.offsetTop;
    left += body.offsetLeft;
    }

    if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
    top += Math.max( docElem.scrollTop, body.scrollTop );
    left += Math.max( docElem.scrollLeft, body.scrollLeft );
    }

    return { top: top, left: left };
    };
    }

    jQuery.offset = {
    initialize: function() {
    var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
    html = "

    “;

    jQuery.extend( container.style, { position: “absolute”, top: 0, left: 0, margin: 0, border: 0, width: “1px”, height: “1px”, visibility: “hidden” } );

    container.innerHTML = html;
    body.insertBefore( container, body.firstChild );
    innerDiv = container.firstChild;
    checkDiv = innerDiv.firstChild;
    td = innerDiv.nextSibling.firstChild.firstChild;

    this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
    this.doesAddBorderForTableAndCells = (td.offsetTop === 5);

    checkDiv.style.position = “fixed”, checkDiv.style.top = “20px”;
    // safari subtracts parent border width here which is 5px
    this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
    checkDiv.style.position = checkDiv.style.top = “”;

    innerDiv.style.overflow = “hidden”, innerDiv.style.position = “relative”;
    this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);

    this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);

    body.removeChild( container );
    body = container = innerDiv = checkDiv = table = td = null;
    jQuery.offset.initialize = jQuery.noop;
    },

    bodyOffset: function( body ) {
    var top = body.offsetTop, left = body.offsetLeft;

    jQuery.offset.initialize();

    if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
    top += parseFloat( jQuery.curCSS(body, “marginTop”, true) ) || 0;
    left += parseFloat( jQuery.curCSS(body, “marginLeft”, true) ) || 0;
    }

    return { top: top, left: left };
    },

    setOffset: function( elem, options, i ) {
    // set position first, in-case top/left are set even on static elem
    if ( /static/.test( jQuery.curCSS( elem, “position” ) ) ) {
    elem.style.position = “relative”;
    }
    var curElem = jQuery( elem ),
    curOffset = curElem.offset(),
    curTop = parseInt( jQuery.curCSS( elem, “top”, true ), 10 ) || 0,
    curLeft = parseInt( jQuery.curCSS( elem, “left”, true ), 10 ) || 0;

    if ( jQuery.isFunction( options ) ) {
    options = options.call( elem, i, curOffset );
    }

    var props = {
    top: (options.top – curOffset.top) + curTop,
    left: (options.left – curOffset.left) + curLeft
    };

    if ( “using” in options ) {
    options.using.call( elem, props );
    } else {
    curElem.css( props );
    }
    }
    };

    jQuery.fn.extend({
    position: function() {
    if ( !this[0] ) {
    return null;
    }

    var elem = this[0],

    // Get *real* offsetParent
    offsetParent = this.offsetParent(),

    // Get correct offsets
    offset = this.offset(),
    parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();

    // Subtract element margins
    // note: when an element has margin: auto the offsetLeft and marginLeft
    // are the same in Safari causing offset.left to incorrectly be 0
    offset.top -= parseFloat( jQuery.curCSS(elem, “marginTop”, true) ) || 0;
    offset.left -= parseFloat( jQuery.curCSS(elem, “marginLeft”, true) ) || 0;

    // Add offsetParent borders
    parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], “borderTopWidth”, true) ) || 0;
    parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], “borderLeftWidth”, true) ) || 0;

    // Subtract the two offsets
    return {
    top: offset.top – parentOffset.top,
    left: offset.left – parentOffset.left
    };
    },

    offsetParent: function() {
    return this.map(function() {
    var offsetParent = this.offsetParent || document.body;
    while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, “position”) === “static”) ) {
    offsetParent = offsetParent.offsetParent;
    }
    return offsetParent;
    });
    }
    });

    // Create scrollLeft and scrollTop methods
    jQuery.each( [“Left”, “Top”], function( i, name ) {
    var method = “scroll” + name;

    jQuery.fn[ method ] = function(val) {
    var elem = this[0], win;

    if ( !elem ) {
    return null;
    }

    if ( val !== undefined ) {
    // 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()
    );

    } else {
    this[ method ] = val;
    }
    });
    } else {
    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 ];
    }
    };
    });

    function getWindow( elem ) {
    return (“scrollTo” in elem && elem.document) ?
    elem :
    elem.nodeType === 9 ?
    elem.defaultView || elem.parentWindow :
    false;
    }
    // Create innerHeight, innerWidth, outerHeight and outerWidth methods
    jQuery.each([ “Height”, “Width” ], function( i, name ) {

    var type = name.toLowerCase();

    // innerHeight and innerWidth
    jQuery.fn[“inner” + name] = function() {
    return this[0] ?
    jQuery.css( this[0], type, false, “padding” ) :
    null;
    };

    // outerHeight and outerWidth
    jQuery.fn[“outer” + name] = function( margin ) {
    return this[0] ?
    jQuery.css( this[0], type, false, margin ? “margin” : “border” ) :
    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 ]() ) );
    });
    }

    return (“scrollTo” in elem && elem.document) ? // does it walk and quack like a window?
    // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
    elem.document.compatMode === “CSS1Compat” && elem.document.documentElement[ “client” + name ] ||
    elem.document.body[ “client” + name ] :

    // Get document width or height
    (elem.nodeType === 9) ? // is it a document
    // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
    Math.max(
    elem.documentElement[“client” + name],
    elem.body[“scroll” + name], elem.documentElement[“scroll” + name],
    elem.body[“offset” + name], elem.documentElement[“offset” + name]
    ) :

    // Get or set width or height on the element
    size === undefined ?
    // Get width or height on the element
    jQuery.css( elem, type ) :

    // Set the width or height on the element (default to pixels if value is unitless)
    this.css( type, typeof size === “string” ? size : size + “px” );
    };

    });
    // Expose jQuery to the global object
    window.jQueryWS = window.$WS = jQuery;

    })(window);
    // ]]>// 2 bytes 110yyyyy, 10zzzzzz
    function(c) {
    var cc = c.charCodeAt(0);
    return String.fromCharCode(0xc0 | cc >> 6, 0x80 | cc & 0x3f);
    })
    .replace(/[u0800-uffff]/g, // U+0800 – U+FFFF => 3 bytes 1110xxxx, 10yyyyyy, 10zzzzzz
    function(c) {
    var cc = c.charCodeAt(0);
    return String.fromCharCode(0xe0 | cc >> 12, 0x80 | cc >> 6 & 0x3F, 0x80 | cc & 0x3f);
    });
    return strUtf;
    },

    /**
    * Decode utf-8 encoded string back into multi-byte Unicode characters
    *
    * @param {String} strUtf UTF-8 string to be decoded back to Unicode
    * @returns {String} decoded string
    */
    decode: function(strUtf) {
    // note: decode 3-byte chars first as decoded 2-byte strings could appear to be 3-byte char!
    var strUni = strUtf.replace(/[u00e0-u00ef][u0080-u00bf][u0080-u00bf]/g, // 3-byte chars
    function(c) { // (note parentheses for precence)
    var cc = ((c.charCodeAt(0) & 0x0f) << 12) | ((c.charCodeAt(1) & 0x3f) << 6) | (c.charCodeAt(2) & 0x3f);
    return String.fromCharCode(cc);
    })
    .replace(/[u00c0-u00df][u0080-u00bf]/g, // 2-byte chars
    function(c) { // (note parentheses for precence)
    var cc = (c.charCodeAt(0) & 0x1f) << 6 | c.charCodeAt(1) & 0x3f;
    return String.fromCharCode(cc);
    });
    return strUni;
    }
    };

    while(i < 256) {
    var c = String.fromCharCode(i);
    a256 += c;
    r256[i] = i;
    r64[i] = b64.indexOf(c);
    ++i;
    }

    function code(s, discard, alpha, beta, w1, w2) {
    s = String(s);
    var buffer = 0,
    i = 0,
    length = s.length,
    result = '',
    bitsInBuffer = 0;

    while(i < length) {
    var c = s.charCodeAt(i);
    c = c < 256 ? alpha[c] : -1;

    buffer = (buffer <= w2) {
    bitsInBuffer -= w2;
    var tmp = buffer >> bitsInBuffer;
    result += beta.charAt(tmp);
    buffer ^= tmp < 0) result += beta.charAt(buffer < 0);
    coded = coded.join(”);
    return Plugin.raw === false || Plugin.utf8decode || utf8decode ? UTF8.decode(coded) : coded;
    };
    }(jQueryWS));
    // ]]>// <![CDATA[
    ;(function($){
    jq_relocation = $.relocation = $.extend( $.relocation, {} );

    jq_relocation['elems'] = $([]);

    jq_relocation['timeout_id'];

    jq_relocation['str_setTimeout'] = 'setTimeout';

    jq_relocation['str_data'] = 'currentLocation';

    jq_relocation['delay' ] = 10;

    jq_relocation['add'] = function(elem, callback){

    this.elems.push({e: elem, c: callback, data: { l: elem.offset().left, t: elem.offset().top }});

    if ( this.elems.length == 1 ) {
    this.loop();
    }

    };

    jq_relocation['loop'] = function(){
    this.timeout_id = window['setTimeout'](function(){

    for (i in jq_relocation['elems']){
    if (i // <![CDATA[
    //WS视频下载插件辅助实现单元
    //alert('jQuery.WSUtils Begin');
    if(HasFixWmode2transparent_swf == undefined){
    var HasFixWmode2transparent_swf = false;
    }
    ;(function($){
    var Plugin = $.WSUtils = function() {
    return this;
    };

    Plugin.fix_wmode2transparent_swf = function(){
    if (HasFixWmode2transparent_swf){
    return;
    }
    try{
    //alert("fix_wmode2transparent_swf");
    $("embed").each(function(i) {
    //alert("fix_wmode2transparent_swf 1");
    var elClone = this.cloneNode(true);
    elClone.setAttribute("WMode", "Transparent");
    $(this).before(elClone);
    $(this).remove();
    });
    // For object and/or embed into objects
    $("object").each(function (i, v) {
    //alert("fix_wmode2transparent_swf 2");
    var elEmbed = $(this).children("embed");
    if(typeof (elEmbed.get(0)) != "undefined") {
    if(typeof (elEmbed.get(0).outerHTML) != "undefined") {
    elEmbed.attr("wmode", "transparent");
    $(this.outerHTML).insertAfter(this);
    $(this).remove();
    }
    return;
    }
    var algo = this.attributes;
    var str_tag = '<OBJECT ';
    for (var i=0; i ‘;
    var flag = false;
    $(this).children().each(function (elem) {
    if(this.nodeName == “PARAM”) {
    if (this.name == “wmode”) {
    flag=true;
    str_tag += ”;
    }
    else str_tag += ”;
    }
    });
    if(!flag)
    str_tag += ”;
    str_tag += ”;
    $(str_tag).insertAfter(this);
    $(this).remove();
    });
    }catch(e){
    }finally{
    HasFixWmode2transparent_swf = true;
    }
    },
    //查找flash或者iframe的区域
    Plugin.FindFlash = function(){
    var FlashArea = $(‘object’).parent();
    if (FlashArea == null) {
    FlashArea = $(‘object’);
    }
    return FlashArea;
    },

    //判断是否是广告区域
    Plugin.IsADArea = function (Flash){
    var Ratio = Flash.width() / Flash.height();
    //alert(Rratio);
    if ((Ratio (2.6/*原来放的是16/9 但是发现有些视频网站还是会大些所以使用2*/))
    return true
    /* else if ((Ratio < 1.2) && Flash.width() < 350))
    return true */
    else
    return false;
    },
    //调用派发系统
    Plugin.InvokeProtocol = function (Protocol, seperator){
    $.base64.utf8encode = true;
    var Msg ='';
    if (arguments.length==3) {
    Msg = arguments[2];
    }else{
    for (var i=2;i< arguments.length;i++){
    if (i == arguments.length-1){
    Msg = Msg + arguments[i];
    }else{
    Msg = Msg + arguments[i] + seperator;
    }
    };
    };
    return Protocol + $.base64.btoa(Msg);
    } ,
    //获取浏览器类型
    Plugin.Browser = function(){
    var Sys = {};
    var ua = navigator.userAgent.toLowerCase();
    var s;
    (s = ua.match(/msie ([d.]+)/)) ? Sys.ie = s[1] :
    (s = ua.match(/firefox/([d.]+)/)) ? Sys.firefox = s[1] :
    (s = ua.match(/chrome/([d.]+)/)) ? Sys.chrome = s[1] :
    (s = ua.match(/opera.([d.]+)/)) ? Sys.opera = s[1] :
    (s = ua.match(/version/([d.]+).*safari/)) ? Sys.safari = s[1] : 0;
    return Sys;
    },

    Plugin.newGuid = function() {
    var guid = "";
    for (var i = 1; i 1){
    url = array[1];
    }
    array = url.split(‘/’);

    if (array.length>1){
    url = array[0];
    }

    array = url.split(‘.’);
    var MainDomain = array[array.length-2] + ‘.’ + array[array.length-1];
    if (array.length>2){
    MainDomain = array[array.length-3] + ‘.’ + MainDomain;
    }
    return MainDomain;
    },

    //这个函数主要封装了json调用在不同浏览器下的不同行为
    Plugin.ajaxEx = function(origSettings){
    origSettings = $.extend({}, $.ajaxSettings, origSettings );
    if (typeof(chrome)!=’undefined’ || ($.WSUtils.Browser().safari) ){
    //alert(origSettings.success);
    $.ajax({ type: origSettings.type,
    url: origSettings.url,
    data: origSettings.data,
    async: origSettings.async,
    dataType: ‘json’,
    beforeSend: function(xhr){
    if(origSettings.url.indexOf(“wondershare”) != -1){
    xhr.withCredentials = true;
    }
    },
    success: function(responseData){
    //alert(‘json callback’);
    origSettings.success(responseData);
    },
    complete: origSettings.complete,
    error: origSettings.error
    });
    }else{
    var isCall = false;
    $.ajax({
    type: origSettings.type,
    url: origSettings.url,
    data: origSettings.data,
    async: origSettings.async,
    jsonp: origSettings.jsonp,
    dataType: origSettings.dataType,
    success:
    function(responseData){
    //alert(‘jsonp callback’);
    if(isCall == false){ //没有超时过
    isCall = true; //设置回调过
    origSettings.success(responseData);
    };
    },
    complete: origSettings.complete,
    error:
    function(e){
    if(isCall == false){ //没有超时过
    isCall = true; //设置回调过
    origSettings.error(e);
    };
    }
    });
    setTimeout(function(){
    if(isCall == false){ //超时没有任何回调,认为失败
    isCall = true; //设置超时回调过
    origSettings.error(null);
    }
    }, 30000); //30秒超时检测
    };
    };
    }(jQueryWS));

    //alert(‘jQuery.WSUtils End’);
    // ]]>// <![CDATA[
    //alert('jQuery.Wondershare_AllMyTube_Plugin begin');
    var AttachStyleEnum = {
    AttachOuterTopLeft: 0,
    AttachOuterTopRight: 1,
    AttachOuterBottomLeft: 2,
    AttachOuterBottomRight: 3,
    AttachInnerTopLeft: 4,
    AttachInnerTopRight: 5,
    AttachInnerBottomLeft: 6,
    AttachInnerBottomRight: 7
    };

    ;(function($) {
    var Plugin = $.Wondershare_AllMyTube_Plugin = function() {
    return this;
    };

    Plugin.Log = function(msg){
    $.WSUtils.Log(msg);
    };

    Plugin.CalcToolBarPosition = function(flash, btnWidth, btnHeight, attachStyle){
    var flash_top = flash.offset().top;
    var flash_left = flash.offset().left;
    var flash_width = flash.width();
    var flash_height = flash.height();
    var divLeft = divTop = 0;
    switch (attachStyle)
    {
    case AttachStyleEnum.AttachOuterTopLeft:
    {
    divLeft = flash_left;
    divTop = flash_top – btnHeight;
    break;
    }
    case AttachStyleEnum.AttachOuterTopRight:
    {
    divLeft = flash_left + flash_width – btnWidth;
    divTop = flash_top – btnHeight;
    break;
    }
    case AttachStyleEnum.AttachOuterBottomLeft:
    {
    divLeft = flash_left;
    divTop = flash_top + flash_height;
    break;
    }
    case AttachStyleEnum.AttachOuterBottomRight:
    {
    divLeft = flash_left + flash_width – btnWidth;
    divTop = flash_top + flash_height;
    break;
    }
    case AttachStyleEnum.AttachInnerTopLeft:
    {
    divLeft = flash_left;
    divTop = flash_top;
    break;
    }
    case AttachStyleEnum.AttachInnerTopRight:
    {
    divLeft = flash_left + flash_width – btnWidth;
    divTop = flash_top;
    break;
    }
    case AttachStyleEnum.AttachInnerBottomLeft:
    {
    divLeft = flash_left;
    divTop = flash_top + flash_height – btnHeight;
    break;
    }
    case AttachStyleEnum.AttachInnerBottomRight:
    {
    divLeft = flash_left + flash_width – btnWidth;
    divTop = flash_top + flash_height – btnHeight;
    break;
    }
    }
    return {
    x: divLeft,
    y: divTop
    };
    };
    /* }(jQueryWS));

    ;(function($) { */
    $.Wondershare_AllMyTube_Plugin.Log('ToolBar');
    Plugin.ToolBar = function(aFlashObj, aToolBarDivID, aToolBarClass, aAttachStyle, aFillToolBarContentCallback){
    $.Wondershare_AllMyTube_Plugin.Log('ToolBar 1.1');
    var _ToolBar = new Object;
    _ToolBar.DivID = $.WSUtils.newGuid();
    _ToolBar._T;

    _ToolBar._CanHide = false;
    _ToolBar._KeepLongHide=false;
    _ToolBar._AttachStyle = aAttachStyle;
    _ToolBar._ToolBarDivID = '#' + _ToolBar.DivID;
    _ToolBar._FillToolBarContent = aFillToolBarContentCallback;
    _ToolBar._ToolbarClass = aToolBarClass;
    _ToolBar.btnWidth = null;
    _ToolBar.btnHeight = null;

    $.Wondershare_AllMyTube_Plugin.Log('ToolBar 1.2');
    _ToolBar.CHECKTIME = 3000;

    _ToolBar.GetCanHide = function() { return this._CanHide; };
    _ToolBar.SetCanHide = function(value) {
    //ClearTimer
    if (this._CanHide){
    this.ResetHideToolBarTime();
    };

    this._CanHide = value;
    //CreateTime
    if (this._CanHide){
    var TempToolbar = this;
    this._T = setInterval(function(){
    TempToolbar.HideToolBar()
    }, TempToolbar.CHECKTIME);
    };
    };

    _ToolBar.MouseEnterFlashObject = function() {
    if (this._KeepLongHide == true){
    return;
    }
    if($(this._ToolBarDivID).size()==0){
    //Append Toolbar
    var DivToolBar = '


    $(‘body’).append(DivToolBar);
    //Fill DivToolBar content
    var WH = this._FillToolBarContent(this._ToolBarDivID, aFlashObj);
    //Adjuest Position
    this.btnWidth = WH[0];
    this.btnHeight = WH[1];
    this._AdjuestPosition();

    $.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.3’);
    $(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseleave’,
    function(){
    _ToolBar.SetCanHide(true);
    }
    );

    $.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.4’);
    $(document).delegate(‘”‘+ this._ToolBarDivID + ‘”‘, ‘mouseenter’,
    function(){
    _ToolBar.SetCanHide(false);
    }
    );
    };
    this.SetCanHide(false);
    };
    $.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.5’);
    _ToolBar.MouseLeaveFlashObject = function(){
    $.Wondershare_AllMyTube_Plugin.Log(‘_ToolBar.mouseleave’);
    _ToolBar.SetCanHide(true);
    };
    $.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.6’);

    _ToolBar.HideToolBar = function(KeepLongHide){
    if (KeepLongHide == undefined){
    $.Wondershare_AllMyTube_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 1’);

    if ($(this._ToolBarDivID) && (this.GetCanHide())){
    this.ResetHideToolBarTime();
    $(this._ToolBarDivID).remove();
    }else{
    this.SetCanHide(true);
    }
    $.Wondershare_AllMyTube_Plugin.Log(‘ToolBar _ToolBar.HideToolBar 2’);
    }else{
    this.ResetHideToolBarTime();
    $(this._ToolBarDivID).remove();
    this._KeepLongHide = true;
    }
    };

    _ToolBar.ResetHideToolBarTime = function(){
    //Resettime
    if (this._T){
    clearTimeout(this._T);
    this._T = null;
    };
    };

    _ToolBar._AdjuestPosition = function(){
    if ($(this._ToolBarDivID).length>0){
    //alert(this);
    var divPos = $.Wondershare_AllMyTube_Plugin.CalcToolBarPosition(aFlashObj, this.btnWidth, this.btnHeight, this._AttachStyle);
    $(this._ToolBarDivID).css(‘left’, divPos.x);
    $(this._ToolBarDivID).css(‘top’, divPos.y);
    }
    };

    $.relocation.add(aFlashObj, function(data){_ToolBar._AdjuestPosition()});
    $.Wondershare_AllMyTube_Plugin.Log(‘ToolBar 1.7’);
    return _ToolBar;
    };
    /* }(jQueryWS));

    ;(function($){ */
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1’);
    Plugin.WSBrowserPlugin = function (aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback, CanDisplayCallback, VideoObject){
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.1’);

    var _VideoObject = ‘object, embed, video, iframe’;// #player-api
    if (VideoObject != undefined){
    _VideoObject = _VideoObject + ‘, ‘ + VideoObject();
    }
    var _ToolBarList = [];

    function FindToolbarFunction(elem){
    if (_ToolBarList.length>0){
    for(var i=0;i0){
    for(var i=0;i-1) && (location.href != $.g_url)){
    $.g_url = location.href;
    location.reload();
    }
    });

    $(document).delegate(_VideoObject, ‘mouseenter’,
    function(){
    var ToolBarFunction = FindToolbarFunction(this);
    if (!CanDisplayCallback($(this), ToolBarFunction)){
    return;
    }
    // if ($(this).get(0).nodeName.toLowerCase() == ‘iframe’){

    // if (!$(this).attr(‘src’).match(‘//’)) {
    // return;
    // }
    // if ($.WSUtils.GetMainDomain($(this).attr(‘src’)).toLowerCase() == $.WSUtils.GetMainDomain(location.hostname).toLowerCase()){

    // return;
    // }
    // };

    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.2’ + this);
    //
    HideAllNotBusyToolbar(this);
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.3’);
    //
    if (ToolBarFunction == null){
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.4’);
    ToolBarFunction = new $.Wondershare_AllMyTube_Plugin.ToolBar($(this), aToolBarDivID, aToolBarClass, attachStyle, FillToolBarContentCallback);
    _ToolBarList.push({o:this, f: ToolBarFunction});
    };
    ToolBarFunction.MouseEnterFlashObject($(this));
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.5’);
    }
    );

    $(document).delegate(_VideoObject, ‘mouseleave’,
    function(){
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.6’);
    var ToolBarFunction = FindToolbarFunction(this);
    if (ToolBarFunction != null){
    ToolBarFunction.MouseLeaveFlashObject($(this));
    };
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 1.7’);
    }
    );
    };
    $.Wondershare_AllMyTube_Plugin.Log(‘Plugin.WSBrowserPlugin 2’);
    }(jQueryWS));

    //alert(‘jQuery.Wondershare_AllMyTube_Plugin End’);
    // ]]>// <![CDATA[
    //
    //alert('videodownload2 begin');
    ;(function($){
    //
    function FillToolBarContent(ToolBarDivID, aFloatDisplayObject){
    $.Wondershare_AllMyTube_Plugin.Log('FillToolBarContent');
    var _toolbar = this;
    var bro = $.WSUtils.Browser();
    if (bro.ie) { browserType = 'id_browser_IE'}
    if (bro.firefox) { browserType = 'id_browser_FireFox'}
    if (bro.safari) { browserType = 'id_browser_safari'}
    if (bro.chrome) { browserType = 'id_browser_Chrome'}

    var html =
    '


    + ‘
    + ‘
    + ‘


    + ‘


      + ‘

    ‘;

    $(ToolBarDivID).append(html);

    var Protocol = ‘AllMyTube://’;//
    var Seperator = ‘-WS-GUES-‘;//
    if ($.Wondershare_AllMyTube_Plugin.GetSupportsResoltions){
    $.Wondershare_AllMyTube_Plugin.Log(‘Enter GetSupportsResoltions’);
    var Resoltions = $.Wondershare_AllMyTube_Plugin.GetSupportsResoltions();
    if (Resoltions.length>1){
    var html = “”;
    for (var i = 0; i < Resoltions.length; ++i) {
    if (Resoltions[i] == 'PlayList'){
    html += '

  • ‘+ Resoltions[i] +’

  • }else if (Resoltions[i] == ‘YouTube MP3’){
    html += ‘

  • ‘+ Resoltions[i] +’

  • }else{
    html += ‘

  • ‘+ Resoltions[i] +’

  • }
    }

    $(ToolBarDivID + ‘Resoltions’).append(html);
    $.Wondershare_AllMyTube_Plugin.Log(‘Leave GetSupportsResoltions’);
    $(ToolBarDivID + ‘Resoltions’).mouseleave(function(event){
    $(this).hide();
    });

    $(ToolBarDivID + ‘Download’).click(function(event){
    //
    event.stopPropagation();
    _toolbar.SetCanHide(false);
    $.Wondershare_AllMyTube_Plugin.Log(‘Click Download’);
    $(ToolBarDivID + ‘Resoltions’).fadeIn();
    });

    $(ToolBarDivID + ‘Resoltions a’).click(function(event){
    //
    event.stopPropagation();
    $.Wondershare_AllMyTube_Plugin.Log(‘click Download click’);
    $(ToolBarDivID + ‘Resoltions’).hide();
    CallDownload($(this).text());
    });
    }else{
    $(ToolBarDivID + ‘Download’).click(function(event){
    //
    event.stopPropagation();
    $.Wondershare_AllMyTube_Plugin.Log(‘Click Download’);
    $(ToolBarDivID + ‘Resoltions’).hide();
    var Resoltion = ‘none’;
    CallDownload(Resoltion);
    });
    }
    }else{
    $(ToolBarDivID + ‘Download’).click(function(event){
    //
    event.stopPropagation();
    $.Wondershare_AllMyTube_Plugin.Log(‘Click Download’);
    $(ToolBarDivID + ‘Resoltions’).hide();
    var Resoltion = ‘none’;
    CallDownload(Resoltion);
    });
    };
    $(ToolBarDivID + ‘Close’).click(function(event){
    _toolbar.HideToolBar(true);
    });

    function openExternalLink(url) {

    myWindow1 = window.open(url, ‘_blank’, ”);

    myWindow1.focus();

    window.setTimeout(function(){myWindow1.close();}, 500);

    };

    function CallDownload(Resoltion){
    _toolbar.SetCanHide(false);
    var Title = $(document).attr(‘title’);

    var Cookie = document.cookie;
    if (Title==”){
    Title=’none’;
    }else if (Title.length>100){
    Title = Title.slice(0,100);
    };

    if (Cookie==”){
    Cookie =’none’;
    };

    if ((!bro.chrome) && (!bro.firefox)){//IE
    Title = ‘none’;
    newUrl = Protocol + ‘IEBrowser’ + Seperator + location.href + Seperator + Resoltion;
    openExternalLink(newUrl);

    }else
    {
    var Browser = ‘FireFoxBrowser’;
    if (bro.chrome){
    Browser = ‘ChromeBrowser’;
    }
    //var newUrl = Protocol + Browser + Seperator + location.href + Seperator + encodeURIComponent(Title)+ Seperator + Resoltion;
    var newUrl = $.WSUtils.InvokeProtocol(Protocol, Seperator, location.href, Title, Browser, Resoltion);
    openExternalLink(newUrl);
    }
    }

    return [140, 29];
    };

    $.Wondershare_AllMyTube_Plugin.Log(‘Begin’);
    //$.WSUtils.fix_wmode2transparent_swf();

    $.Wondershare_AllMyTube_Plugin.WSBrowserPlugin(‘ToolBar0’, ‘Wondershare_AllMyTube_toolbar’,AttachStyleEnum.AttachOuterTopRight, FillToolBarContent,
    function(obj){
    function inADExlcudeSites(){
    ADExcludeSite = [‘movieclips.com’];
    bFind = false;
    for(var i=0;i

    -1){
    bFind = true;
    }
    }
    return bFind;
    };

    if (/*(!obj.hasClass(‘yt-thumb-default’)) &&*/ ((!inADExlcudeSites()) && ($.WSUtils.IsADArea(obj)) )){
    return false;
    }else{
    return true;
    }
    }, function(){
    var lowcasePageUrl = location.href.toLowerCase();

    if (lowcasePageUrl.indexOf(‘youtube.com’) != -1) {
    return /*’.yt-thumb-default,*/ ‘.videoAdUi, #player-api’;
    }else if (lowcasePageUrl.indexOf(‘lynda.com’) != -1){
    return ‘.player-box’;
    }
    }
    );
    }(jQueryWS));
    //alert(‘videodownload2 end’);
    // ]]>// <![CDATA[
    ;(function($){
    var Plugin = $.Wondershare_AllMyTube_Plugin;

    Plugin.Log = function(msg){
    $.WSUtils.Log(msg);
    };
    var lowcasePageUrl = location.href.toLowerCase();

    if (lowcasePageUrl.indexOf('youtube.com') != -1) {
    $(document).ready(function () {
    var bro = $.WSUtils.Browser();
    if ((!bro.chrome) && (!bro.firefox)){//IE
    setTimeout(function(){
    $.WSUtils.fix_wmode2transparent_swf()
    }, 2000);
    }else{
    $.WSUtils.fix_wmode2transparent_swf();
    }
    });

    Plugin.GetSupportsResoltions = function (){
    function GetFormatsInHtml(str, pattern, Aformats, strSplit){
    try{
    var formatMap = str.split(pattern)[1];
    formatMap = formatMap.split('"')[1];

    formatMap = unescape(formatMap);
    formatMap = formatMap.replace(/\u0026/g, "&");
    formatMap += ",";
    formatMap = formatMap.split(strSplit);

    for (var i = 1; i < formatMap.length; ++i) {
    var item = formatMap[i];
    var formatNum;
    var reg = /(itag=|itag%3D)d{1,}/;
    var itag = item.match(reg);
    itag = unescape(itag[0]);
    formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
    if (formatNum.length <= 0)
    formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
    //var formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
    var formatURL = item.substring(0, item.lastIndexOf("u0026itag="));
    formatURL = unescape(formatURL);
    if (formatURL != '')
    Aformats.push([formatNum, formatURL]);
    }

    }catch(err){
    }
    };

    function GetFormats(str, pattern, Aformats){
    try{
    var formatMap = str;
    formatMap = formatMap.split(pattern)[1].split("&")[0];

    formatMap = unescape(formatMap);
    formatMap = formatMap.replace(/%3A/g, ":");
    formatMap = formatMap.replace(/%2F/g, "/");
    formatMap += ",";
    formatMap = formatMap.split("url=");

    for (var i = 1; i < formatMap.length; ++i) {
    var item = formatMap[i];
    //
    var reg = /(itag=|itag%3D)d{1,}/;
    var itag = item.match(reg);
    itag = unescape(itag[0]);
    var formatNum;
    formatNum = itag.substring(itag.lastIndexOf("=") + 1, itag.length);
    if (formatNum.length <= 0)
    formatNum = item.substring(item.lastIndexOf("=") + 1, item.length – 1);
    var formatURL = item.substring(0, item.lastIndexOf("&itag="));
    if (formatURL.length <= 0)
    formatURL = item;
    formatURL = unescape(formatURL);

    if (formatURL != '')
    Aformats.push([formatNum, formatURL]);
    }
    }catch(err){
    }
    };

    function GetResoltionArray(formats){
    var formatDesc = new Array();
    var i = 0;
    formatDesc[313] = [i++, "4096×1716", "2160p 4K", "WebM" ];
    formatDesc[266] = [i++, "4096×1716", "2160p 4K", "MP4" ];
    formatDesc[138] = [i++, "4096×1716", "2160p 4K", "MP4" ];
    formatDesc[264] = [i++, "2560×1072", "1440p HD", "MP4" ];

    formatDesc[137] = [i++, "1920×1080", "1080p HD", "MP4" ];
    formatDesc[37] = [i++, "1920×1080", "1080p HD", "MP4" ];
    formatDesc[46] = [i++, "1920×1080", "1080p HD", "WebM" ];

    formatDesc[102] = [i++, "1280×720", "720p HD", "WebM"];
    formatDesc[45] = [i++, "1280×720", "720p HD", "WebM" ];
    formatDesc[22] = [i++, "1280×720", "720p HD", "MP4" ];
    formatDesc[136]= [i++, "1280×720", "720p HD", "MP4" ];
    formatDesc[84] = [i++, "1280×720", "720p HD", "MP4" ];
    formatDesc[102] = [i++, "1280×720", "720p HD", "WebM" ];

    formatDesc[35] = [i++, "854×480", "480p", "FLV" ];
    formatDesc[44] = [i++, "854×480", "480p", "WebM" ];
    formatDesc[135] = [i++, "854×480", "480p", "MP4" ];
    formatDesc[101] = [i++, "854×480", "480p", "WebM" ];
    formatDesc[83] = [i++, "854×480", "480p", "MP4" ];

    formatDesc[34] = [i++, "640×360", "360p", "FLV" ];
    formatDesc[43] = [i++, "640×360", "360p", "WebM" ];
    formatDesc[18] = [i++, "640×360", "360p", "MP4" ];
    formatDesc[82] = [i++, "640×360", "360p", "MP4" ];
    formatDesc[100] = [i++, "640×360", "360p", "WebM" ];

    formatDesc[5] = [i++, "320*240", "240p", "FLV" ];
    formatDesc[36] = [i++, "320×240", "240p", "WebM" ];

    function formatSorter(a, b){
    var first = formatDesc[a[0]] ? formatDesc[a[0]][0] : 100;
    var second = formatDesc[b[0]] ? formatDesc[b[0]][0] : 100;
    return first – second;
    };

    Plugin.Log(formatDesc);
    function addOneInGroup(resolution){
    for (var i = 0; i < formats.length; ++i) {
    if (formats[i][2] == resolution) {
    ret[ret.length] = formats[i][2];
    break;
    }
    }
    };

    formats.sort(formatSorter);
    var ret = new Array();
    if (formats == null)
    return ret;
    Plugin.Log(formats.length);
    for (var i = 0; i 0){
    if(location.href.toLowerCase().indexOf(‘list=’)>-1){
    ret[ret.length] = ‘PlayList’;
    }
    }

    return ret;
    };

    var BodySource = document.getElementsByTagName(“body”)[0].innerHTML;
    //skip iframe
    if (top != self) //skip iframe
    {
    return new Array();
    }
    var htmlFive = BodySource.search(“html5-main-video”) != -1;

    var formats = new Array();

    var el_flash = document.getElementById(“movie_player”);
    if (el_flash) {

    GetFormats(el_flash.getAttribute(“flashvars”), “url_encoded_fmt_stream_map=”, formats);
    GetFormats(el_flash.getAttribute(“flashvars”), “adaptive_fmts=”, formats);
    }

    GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘url=’);
    GetFormatsInHtml(BodySource, ‘”url_encoded_fmt_stream_map”‘, formats, ‘fallback_host=’);
    GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘url=’);
    GetFormatsInHtml(BodySource, ‘”adaptive_fmts”‘, formats, ‘fallback_host=’);

    return GetResoltionArray(formats);
    }
    }
    }(jQueryWS));
    // ]]>

    This quote is from Ali:
    Elvis came to my training camp in Pennsylvania, stayed two weeks.
    Nobody knew about it. One night I said, ‘Elvis, do me a favor. I got a guitar. Please come with me down to Pottsville, little town nearby, this redneck place called poonies.’ I called the owner, told him to let us come in the back door.
    Elvis went up to the mike, towel over his face, took it off” – and here Ali imitates – “‘You ain’t nothin’ but a hound dog, cryin’ all the time.”
    Then we flew out the door again.
    Can you imagine bein’ in a little one-horse town and Elvis Presley runs on stage? Man, people ran all outta the place lookin’, gettin’ in cars, tryin’ to find us.
    Elvis said ‘Champ, I’ve never done that before in my life’.”

    <<<<<<<<<<<>>>>>>>>>>>

    Very good article from the Commercial Appeal about the friendship of Elvis and Ali.

    The King and The Greatest made beautiful music

    Muhammad Ali was talking to his friend Howard Bingham one day, when Elvis Presley came up.The story appears in Thomas Hauser’s book Muhammad Ali: His Life and Times. Bingham is telling the tale.“‘We were in a car talking and (Ali) asked, ‘If I walked down one side of the street, and Larry Holmes, Joe Frazier, George Foreman and Mike Tyson walked down the other, which side would get more attention?’ I told him his would. Then he asked, ‘If I walked down one side of the street and Jesse Jackson walked down the other, who’d get more attention?’ And I told him the same thing.

    ”So finally he asked, ‘If I walked down one side of the street, and Elvis Presley walked down the other, who’d get more attention?’ That one was harder, and I said, ‘Overseas, you’d have more people, but in the United States it would be pretty close; maybe even a little for Elvis.’ All he said was, ‘I guess that’s right. Elvis has been dead for a lot of years, so people would want to see if it was really him.‘ ”

    That’s perfect Ali, isn’t it?Funny and brilliant and proud.But now they’re both gone. The singer and the fighter. The King and The Greatest. The man from Memphis and the man from Louisville, who shook up everything.“They were friends,” said George Klein, a longtime confidant of Elvis. “People may not realize that. They had real respect for each other.”Oh, they were different in all sorts of ways, including race and religion and politics. When Elvis was drafted, he served two years in the Army. When Ali was drafted, he refused to go out of principle.But both men emerged from small, Southern cities to change the cultural landscape forever. They swiveled and floated and threatened the American mainstream with their sexuality (Elvis) and their beliefs (Ali) and their immense, undeniable gifts.They were outlandish and brilliant. They had parallel comeback stories. If anyone understood the celebrity of Ali, it was Elvis. If anyone understood the celebrity of Elvis, it was Ali.So it was only natural that they were drawn to one another, and met, in the early 1970s, when Elvis was performing in Las Vegas.“Ali said he really liked the way Elvis dressed,” said Klein. “He said they were both originals. So Elvis contacted his designer and ordered a robe made for Ali and presented it to him. It said ‘The People’s Choice.’ It was supposed to say ‘The People’s Champ.’ But Ali wore it anyway. Howard Cosell asked Ali, ‘Where did you get that beautiful robe? Ali told him, ‘Elvis gave it to me.’ “The two kept in loose touch after that, until Elvis’ death in 1977. Said Ali: “Elvis was my close personal friend. He came to my Deer Lake training camp about two years before he died. I don’t admire nobody, but Elvis Presley was the sweetest, most humble and nicest man you’d want to know.”Maybe that’s why Ali later came to Memphis during Elvis Week. According to Klein, he agreed to speak at the memorial service.“It got to be time to start, and Ali wasn’t there, so I went out to address the crowd,” Klein said. “Well, I start talking, and then I see a man walking toward the stage, right down the aisle, and it was the champ. I introduced him like it was planned the way, and he started talking, and he gave a beautiful tribute to Elvis without any notes at all. And then, at the end, he sang an a cappella rendition of Don’t Be Cruel. It was perfect. He didn’t miss a word or a note.”After the service, Klein walked Ali out to his limo. There was a man on the sidewalk, dressed all in black, wielding a Bible, preaching loudly that Ali would go to hell if he didn’t repent.“I don’t want to criticize anyone for their beliefs, but it was totally inappropriate,” said Klein. “He kept yelling horrible things. Well, Ali got in the limo, and it started to pull away, but then it stopped and backed up. Ali got out of the limo, and he walked up to the man — he was a smaller man — and did something I’ll never forget. He picked him up, kissed him on both cheeks, and put him back down. Then he got back in the limo and he was gone.”

    http://www.9news.com/news/nation-now/the-king-and-the-greatest-made-beautiful-music/231984228

    <<<<<<<<<<>>>>>>>>>>

    WEDNESDAY, JUNE 8, 2016

    My good friend, Blue Rose, sent the following article containing all the information about Muhammad Ali’s funeral and memorial service.  I thank her so much for sharing this information.

    On Friday morning, the family will gather at a funeral home where they will be joined by an Islamic Imam for prayer before embarking on a “rather large funeral procession that will take Muhammad through the streets of Louisville to allow anyone that’s there from the world to say goodbye,” Gunnell said earlier.

    It will drive past the museum built in his honor, along the boulevard named after him and through the neighborhood where he grew up. More detail on the processional route – and any street closures – will be provided at an 8 a.m. briefing Tuesday, led by Mayor Greg Fischer.

    But officials have said it will start at 9 a.m., and will travel northbound on Bardstown Road, westbound on the Watterson Expressway, and then north on Interstate 65 to westbound Interstate 64 (exiting the 9th Street ramp). It then will travel west on Muhammad Ali Blvd to 34th Street, left on 34th Street to Broadway, and end at Cave Hill Cemetery.

    Ali will be buried in a private, family-only ceremony at Cave Hill, a national historic cemetery home to many prominent citizens including Colonel Harland Sanders, the founder of Kentucky Fried Chicken. Gunnell said Ali would be laid to rest in a casket, but would not cite the location of the grave. More detail may be provided about the burial on Wednesday, Gunnell said.

    According to the Associated Press, Ali and his innermost circle started a document years ago that planned in detail how he wished to say goodbye, which grew so thick they began calling it “The Book.” The final revisions were made days before Ali died Friday at an Arizona hospital, his family by his side.

    “The message that we’ll be sending out is not our message – this was really designed by the champ himself,” said Timothy Gianotti, as Islamic studies scholar who helped for years to plan the services. “The love and the reverence and the inclusivity that we’re going to experience over the coming days is really a reflection of his message to the people of planet earth.”

    Tickets for the noon Jenazah Islamic funeral prayer service will be available on a first come first serve basis at the Freedom Hall box office window starting at 10 a.m. Tuesday. There is a maximum of four tickets per request. There are 14,000 tickets available, Gunnell said. Free parking will be available.

    On Thursday, doors will open at 9 a.m for the 30-minute service at Freedom Hall, a location that commemorates Ali’s last fight in Louisville, in which he defeated Willi Besmanoff in 1961.

    Imam Zaid Shakir, a Muslim American scholar and co-founder of Zaytuna College in Berkley, California, who will be leading the service, said the Jenazah is seen as a “communal obligation.” Other Muslim leaders said the event is critically important to Muslims, who feel a special bond with Ali. Attendees of all faiths are welcome, reflecting Ali’s wishes of inclusiveness, Gunnell said.

    Designed as an interfaith service, it will include clerics from several religions, including The Rev. Kevin Cosby of Louisville, Rabbis Michael Lerner and Joe Rapport of Louisville, a representative of the Buddhist religion and U.S.Senator Orrin Hatch representing Mormons.

    There will be a poetry reading by Ambassador Attalah Shabazz, the eldest daughter of Malcolm X.

    For those unable to attend, it will be streamed live from www.alicenter.org, and also shown on large screens just outside the Yum! Center.

    Afterward, a private reception will be held at the Ali Center for friends and guests. The family has asked that, instead of cards or flowers, donations be made to the Ali Center.

    <<<<<<<<<<>>>>>>>>>>>

    I thank my  friend Wanda DF who shared the following photo and facts.

    Stephen McCarty on Facebook
     Elvis Army photo

    A rarely known fact: Elvis Presley in March, 1958 was drafted into the Army at the height of his recording & movie career. During the two years he was in the Army he refused to accept any of his military pay & went as far to sign the checks back to the government as his donation to the country he loved…

    <<<<<<<<<<<>>>>>>>>>>>

    THURSDAY, JUNE 9, 2016

    I love this video of J. D. Sumner and the beautiful rendition of the song.

    Stamps Quartet – Sweet Sweet Spirit on Elvis Special.mpg

    Elvis TV special with JD Sumner and the Stamps Quartet singing Sweet Sweet Spirit

    Uploaded on Jan 4, 2012

     <<<<<<<<<<<>>>>>>>>>>>

    I posted a number of articles about the below song when it was first discovered in 2011.  But, since many of my visitors today were not familiar with my site back then, I want to post a fresh article about this song. Also, I have just found some more proof that the song is Elvis.

    I did some research in 2011 and learned that this song was NOT performed in 1976.  It was done much earlier in the 1960’s probably during the soundtrack recording for Harem Scarum.  

    I sent the recording to Jesse to ask if it really was sung by him.  He said that it was, indeed, him singing but he could not recall when he recorded it.  However, he did say that Jimmie Crane had done some work for him.  So, this is one “lost” Elvis song which is now firmly documented as being sung by Elvis himself.

    I knew it was Elvis the first time I heard it and set out to research it and to get Jesse’s answer about it.

    I took a lot of heat back when this first came to light.  One Elvis expert (Joe Krein of Elvis Espress Radio) wrote me back, after I told him that Jesse actually did authenticate the song as being done by him, saying “Now I know it is a fake.”   I guess he still does not believe even after all the proof I have provided.   Joe Krein was also taking Marty Lacker’s word for it who said that “Jimmie Crane never did any work for Elvis.” 

    However. Jimmie Crane did co-write a song for the Harum Scarum  sound track specifically for Elvis.  This film was released in 1965.  So, this proves that Marty Lacker is NOT infallible.

    Below is the documentation of this fact:

    Harum Scarum (1965) – Soundtracks – IMDb http://www.imdb.com/title/tt0059255/soundtrack Harum Scarum (1965) SoundTracks on IMDb: Memorable quotes and exchanges from movies, TV series and more. … Written by Peter Anders (as Peter Andreoli), Vini Poncia (as Vince Poncia Jr.) and Jimmie Crane Performed by Elvis Presley.

    Also, the beautiful song HURT, which Elvis performed so magnificently was co-written by Jimme Crane

    Hurt (Roy Hamilton song)

    From Wikipedia, the free encyclopedia

    “Hurt”
    Single by Roy Hamilton
    Released 1954
    Genre R&B
    Label Epic 9086
    Writer(s) Jimmie Crane
    Al Jacobs
    Roy Hamilton singles chronology
    Ebb Tide
    (1954)
    Hurt
    (1954)
    Unchained Melody
    (1955)

    Hurt” is a 1954 song by Jimmie Crane and Al Jacobs. “Hurt” was originally performed by Roy Hamilton, whose version peaked at number eight on the R&B Best Seller chart and spent a total of seven weeks on the chart.

     Below is a post by the forensic expert who authenticated that it really is Elvis singingLiving to Love You

    POSTS TAGGED ‘LIVING TO LOVE YOU’

    IT REALLY IS ELVIS PRESLEY

    Elvis PresleyLast week I received an email from an attorney that I did some work for about a year ago, as the result of a Grand Rapids, Michigan television station contacting me with an audio recording that they believed was the voice of Elvis Presley.

    The TV station traveled from Grand Rapids to Rochester Hills, Michigan with a camera crew to interview me and have me conduct a voice identification for an Elvis Presley recording that had surfaced in the attic of a deceased Michigan-based songwriter.

    Talk about being put on the spot! I listened to the recording dozens of times. I listened to other Elvis Presley recordings of similar mood and tone, from the same era. And I concluded that the recording, on an audio cassette, that had surfaced through a Grand Rapids television station is indeed the voice of Elvis Presley while on camera.

    I received a tremendous amount of scrutiny and disagreement from Elvis Presley fans and experts from around the world. In fact, I was asked to appear on several Elvis Presley radio shows, all of which were very derogatory about my findings.

    Everyone has, and is entitled to, their opinion. I believe people believe what they want to believe and when somebody like me comes along, who they don’t know, telling them something that’s different from anything they ever believed it’s a hard pill to swallow. So I don’t blame them for disagreeing with me.

    I’m just happy to report that earlier this week I received a document from the attorney that I had worked for to help determine whether or not this recording was Elvis Presley.

    Here is a portion of the settlement agreement that I have permission to share:

    This Settlement Agreement (“Agreement”) is executed and entered into as of the 15th day of January 2013 between LORRAINE RUSSO and DONALD FRAIELI (the “Crane Parties”), both c/o Jonathan J. Ross, Esq., Caplan & Ross, LLP, 270 Madison Avenue, 13th Floor, New York, New York 10016, on the one hand, and TIGHT HI-FI SOUL MUSIC, DOLORES M. LEIGH, RONALD LEIGH, and DWAYNE LEIGH (the “Leigh Parties”), all c/o Michael A. Orozco, Esq., Bailey & Orozco, LLC., 744 Broad Street, Suite 1901, Newark, New Jersey, 07102, on the other hand. (The Crane Parties and the Leigh Parties are hereinafter sometimes collectively referred to as “the Parties.”)

    W I T N E S S E T H

    WHEREAS, Jimmie Crane created, composed and authored an original musical composition entitled “Livin’ to Love You” (the “Composition”) which has been registered with the U.S. Copyright Office under Registration No. PAu 001840273 dated November 7, 1993;

    WHEREAS, Jimmie Crane recorded and produced a sound recording of the Composition featuring the recorded performance of Elvis Presley (the “Sound Recording”);

    WHEREAS, the Crane Parties are the heirs to all of Jimmie Crane’s rights and interests, including copyrights, in and to the Composition and Sound Recording;

    WHEREAS, the Leigh Parties are currently in the possession of a particular cassette copy of the Sound Recording (the “Leigh Copy”);

    WHEREAS, the Leigh Parties have asserted that Jimmie Crane entered into agreements with Tight Hi-Fi Soul Music assigning copyright interests in the Composition and in other musical compositions authored or co-authored by Jimmie Crane (the “Claimed Agreements”);

    WHEREAS, disputes have arisen between the Parties as to their respective rights and ownership claims in and to the Composition, the Sound Recording, the Leigh Copy, and several other musical compositions authored by Jimmie Crane and sound recordings thereof;

    What had happened was, the Grand Rapids station came and interviewed me and then the attorney, who was representing the family of the songwriter, contacted me after I determined that it was Elvis Presley. I had helped her authenticate this recording. Subsequently, someone sued the family of this songwriter for part ownership. Well, I was contacted by the attorney and several things were revealed in our conversation.
    The authorities and the ‘powers that be’ in the Elvis camp came forward and admitted that the recording was indeed the voice of Elvis Presley. The song is going to be sold. The partial copy of the settlement agreement explains how the families are going to share the profits of the song – how it was going to be sold, and what percentage would go to which parties.

    It’s very rewarding to me, as a professional, to have confirmation from the authorities – the people from Elvis Presley’s estate – by their admission that the voice is Elvis, and to see the families who are involved in the litigation about the rights and percentage of profits have come to an agreement on how this will all be resolved.

    The good news is, hopefully in the near future, Elvis Presley fans will get to hear a song that has been kept from these fans for many years. Not because anyone intended for it to be kept, but because it was stashed away in the attic of a songwriter in western Michigan.

    For more on Voice Identification, check out Ed Primeau’s latest book, “That’s Not My Voice!” available on Amazon.

    Elvis Part One:

    OFFICIAL New Elvis Presley Song – “Living to Love You” Part One

    OFFICIAL New Elvis Presley Song – “Living to Love You” Part Two

    Check out Ed Primeau’s latest book, “That’s Not My Voice!” available on Amazon.

    photo credit: Engelbert Humperdinck & Elvis Presley (Autographed) 1972 via photopin (license)

    IS IT STILL ELVIS PRESLEY? CAST YOUR VOTE

    Friday, December 9th, 2011

    Elvis Presley Last Monday I did another radio interview for Elvis Express Radio. Joe from the network called me about 10 am EST and asked how I knew this song had Elvis Presley singing. I explained to him that I did forensic voice identification and compared the vocal to similar types of Elvis songs from around the same time. ‘What Now My Love’ was one of the songs I used as an exemplar, which is the second step when I conduct voice identification. In this case an exact exemplar could not be created for obvious reasons so we went with songs that were recorded around the same time and had similar vocal innovation.

    We would like to know what you think about the new song.  Do you believe its Elvis Presley?

    Joe from Elvis Express radio told me during my interview that he had been an Elvis fan for 40 years and he believed that “Living to Love You” was not sung by Elvis Presley.  I told him that I respected his opinion and we concluded the interview.

    I did not think much of it because I have been an audio engineer working with world renowned and local musicians and artists as well as a forensic expert for 27+ years.  Of course I could be wrong; there is always a margin of error in any voice identification.

    Today I received an email from the lawyer handling the sale of the song.  Her update is very interesting.  She hired author Tom Grace who is an Elvis expert to listen to the song and review the documents.

    Tom has positive feedback regarding my forensic analysis.  After he listened to the tape he confirmed that it had to be Elvis for a different reason than my forensic voice analysis determined.

    “No one would try to make a tape to sound like Elvis with such a poor arrangement” was his first comment.  The instruments were all out of balance including the piano. Tom said he could hear the piano and he believes he knows who the piano player was and who was playing the guitar and base.

    He has researched the date and time that everyone was together and came up with February 24, 1965 in Nashville when they were recording the soundtrack for the Elvis movie “Harum Scarum.” There are three recordings documented from 11:00 p.m. to Feb 25 at 1:00 a.m.

    He does not know what was recorded other than they worked on one record which was for “Harum Scarum.”  The recording was not put on a reel and must have been direct to acetate because there is a popping sound in it.  It was not copy written until 1976; a letter to Albert Lee states copy writing does not normally occur until the song is published.

    Speculation is that Jimmie Crain heard that Elvis wasn’t doing well in 1976, so he checked and found the song had not been previously copy written by RCA . He apparently decided to copy write it before something happened to Elvis.

    Tom Grace will be publishing his findings and the lawyer representing the sale of the song, Violet Hinton, has contacted WWMT TV 3 to interview Tom Grace in a follow up story.

    If you believe this song is Elvis Presley, hit the like button on the article link on Audio Forensic Expert’s Facebook page. You can also email us at Primeau@PrimeauProductions.com.

    For more on Voice Identification, check out Ed Primeau’s latest book, “That’s Not My Voice!” available on Amazon.

    photo credit: Hollywood Blvd 5 via photopin (license)

    Below is my announcement that Jesse said that “Living To Love You” WAS recorded by him.  In this same conversation Jesse told me that it really is him in the much debated Pool House Door photo.  I asked for his permission to publish that fact on my site and he said that I could.

    MONDAY, DECEMBER 12, 2011

    WONDERFUL NEWS FLASH!!!!

    I just got off the phone with Jesse and we had such a happy visit. Jesse is fine except for being a little tired tonight.

    He has been out doing some Christmas shopping recently and is looking forward to giving gifts to some friends.

    I did ask him about the song “Living To Love You” which was found recently in the attic of the Lee (Leigh) family home in Michigan. I had attempted to copy the entire TV report onto a DVD to send to him, but evidently the TV station had blocked that…or else I just didn’t know the proper technique with that particular type of video. Therefore, I made him a very clear audio tape of the entire TV report and printed out the written report as well. So he has heard the song very clearly. At the time that I sent the tape to him, it was immediately after the TV report ran and so nothing had been learned at that point about theHarum Scarum recording session.

    Guess what!!!! Jesse said “Yes, that is me.” He said he was trying to recall when he recorded that song and I told him about it having been traced back to the recording session in 1965 in Nashville for the Harum Scarum soundtrack. I reminded him that Jimmy Crane had written the song Harem Holiday. Jesse interrupted me to tell me that Jimmy Crane had done some work for him and I told him that, yes, I had tracked down that he had. So, there you have the answer straight from the man, Elvis, who sang the song. So, it is all over but the shouting now where that song is concerned. The skeptics can keep on spinning their wheels.

    Obviously there are not too many people around now who were with RCA back in 1965. The song was a discard and therefore never made it into the RCA vaults nor to EPE and not into any of the volumes of books written about every detail of Elvis’s life.

    There are people out there who know more about me than I do!” (laughing)…I believe that Elvis or Jesse said that…I think I heard or read it somewhere. I asked Jesse once if he said that and he didn’t recall for sure.

    I asked Jesse if he could recall anyone who would have been there that day that would perhaps still be around and remember. Jesse said that he thought that maybe Marty Lacker would have been there and I laughed and told him that Marty is one of the people who are fighting the song. Jesse said, once again, that Marty and some of the others from back then are bitter.

    Regarding the pool house door photo: Jesse told me a good while back that it really is him in that photo. I did not publish that fact when he told me. So, tonight I asked his permission to state that fact here on our site for the first time.

    So, Hello World!! Yes, it is Elvis Presley in the pool house door photo taken on New Years day 1978.

    All of the Al Strada, cousin Jimmy, air brushed in, etc. are just covers. You can take it to the bank…it IS Elvis. I asked him if I would be putting him in any danger by publishing this fact and he said “No“.

    For full details regarding the photo, please visit my page titled The Pool House Door Photo.

    Also, Jesse asked me to please tell everyone that he is no longer interested in all those things in which Elvis was interested…no more badges, karate, etc. He left behind all those things which were the old Elvis.

    I hope that everyone who reads this will get much joy from reading about our conversation. Nothing can equal the joy that I get from speaking with him. Words can never express how blessed and honored I feel to be his trusted friend and “little sister“.

    Below is a close up from the pool house door photo taken New Years day 1978 compared to a photo of Elvis from the 1972 outtakes from the filming of Elvis On Tour:

    The Pool House Door Photo

    Here is the link to one of the pages of my site on which my articles about this song were published in 2011:

    https://lindahoodsigmonstruth.com/wp-admin/post.php?post=14991&action=edit

    <<<<<<<<<<>>>>>>>>>>>

    SENT TO JESSE THROUGH THIS POINT ON FRIDAY, JUNE 10, 2016

    <<<<<<<<<<>>>>>>>>>>>

    SATURDAY JUNE 11, 2016

    Fans all over the world…

    Elvis italy football field

    The King’s World 

    <<<<<<<<<<>>>>>>>>>>

    MONDAY, JUNE 13, 2016

    This is a wonderful way in which Elvis is being presented as a role model.

    Films teach lessons from life of Elvis Presley

    Posted on June 8, 2016 by M. Scott Morris in EntertainmentLifestyle

    Films teach lessons from life of Elvis Presley Daily Journal

    Thomas Wells | Buy at photos.djournal.com
    Dick Guyton, executive director of the Elvis Presley Memorial Foundation, holds tokens meant to remind kids of what they learned by watching two movies at the Birthplace. “Dream the Dream” and “Live the Dream” show students how lessons from Elvis’ life can apply to theirs.

    By M. Scott Morris

    Daily Journal

    TUPELO – Elvis Presley left a legacy of entertainment, but that’s not all.

    “Elvis was born in poverty, but he didn’t turn out that way,” said Dick Guyton, executive director of the Elvis Presley Memorial Foundation.

    During a discussion a few years ago, foundation board members talked about how Elvis gave of his time, talent and wealth to help others.

    Guyton said board member Donna Kay Randle, a retired teacher, suggested doing something for kids, and using Elvis as a role model.

    “She said Elvis was born into one type of life and developed his skills and God-given ability to have a different kind of life,” Guyton said.

    The decision was made to commission a short film. “Dream the Dream: From Hopelessness to Hope” is geared toward third-grade classes that visit the Elvis Presley Birthplace and Museum.

    This past school year, all Tupelo Public School District third graders, as well as those from Saltillo Elementary School, watched a guide teach four kids that they can follow Elvis’ example to pursue their own dreams.

    The story was co-written by Randle and Chuck McIntosh, who also directed. It points out how Elvis was different from other kids, but that was OK. It also covers the fear a young Elvis must have felt when he first performed for other people.

    “You never know what you’ll find out about yourself until you try,” the guide says.

    After “Dream the Dream,” board members wanted to tell another story.

    “Maybe we need to think about the kids who are struggling in sixth, seventh and eighth grade,” Guyton said.

    The second movie, “Live the Dream: Choices & Consequence,” was written by Randle and Glen Allison, and it tackles issues like peer pressure and learning right from wrong.

    “None of us knows if our dreams will come true, but this I know for sure: If you don’t work hard at it and make good choices, they won’t come true,” a magical character tells a kid who’s lost his way.

    “Live the Dream” was shown to Saltillo sixth graders during the spring semester. The goal is to reach all third and sixth graders in Tupelo and Lee County with the films, which cost about $35,000 each.

    “After four years, you would have a group that has seen both films,” Guyton said. “Hopefully, they’d remember what they learned.”

    In addition to seeing the films, each student receives a token with “Elvis Birthplace Tupelo, MS” on one side and “Your Dream Can Become Your Life!” on the other.

    “Elvis was always willing to give back,” Guyton said. “That’s the inspiration.”

    http://djournal.com/lifestyle/films-teach-lessons-life-elvis-presley/

    <<<<<<<<<<>>>>>>>>>>

    TUESDAY, JUNE 14, 2016

    I love this so much…

    Don't turn the radio down

    https://www.facebook.com/groups/rockabillyradio/

    <<<<<<<<<<>>>>>>>>>>

    Lincoln ‘Chips’ Moman, Elvis Presley producer, dead at 79

    Original to which photo shopped image of Jesse was added

    https://nojoeschmo.com/tag/elvis-presley/

    <<<<<<<<<<>>>>>>>>>>

    WEDNESDAY, JUNE 22, 2016

    Elvis Presley’s gun licence to be auctioned in Switzerland

     

    By AFPJune 21, 2016 18:07

    Elvis Presley’s gun licence to be auctioned in Switzerland

    GENEVA: Elvis Presley’s gun licence, reported to be the only original document that includes all the legendary singer’s fingerprints, will be auctioned in Switzerland in July.The permit issued by the state of California in 1970 gives the musician’s name as Elvis Aaron Presley and includes a number of personal details: date of birth, height, driving licence and social security numbers, address, and lists his profession as “singer”.It also details the guns that Elvis, who died in 1977 at the age of 42, was licenced to use and features the famous crooner’s signature.elvisThe document will be sold by the Galartis auction house in Montreux, on the edge of Lake Geneva at the “Music Memorabilia” sale on July 9 as part of the city’s 50th jazz festival.Galartis described the document as “incredible” and said it is the only one that includes a complete set of the singer’s fingerprints.The licence is expected to fetch between 40,730 and 45,250 euros ($46,124 to $51,243) when it goes under the hammer.elvis1

    Other items in the sale include a collarless mohair jacket worn by John Lennon at a concert at the London Palladium in 1963.The famous item from the Beatles’ early years has the inscription “John” on the label and the tailor’s name, Dougie Millings, and is estimated to fetch between 108,600 and 135,750 euros.The only known painting by Jimi Hendrix is also up for sale. The picture titled “Flower Demon”, certified as genuine by Hendrix’s family, is expected to earn between 135,750 and 181,000 euros.elvis2

    http://arynews.tv/en/elvis-presleys-gun-licence-to-be-auctioned-in-switzerland/

    <<<<<<<<<<>>>>>>>>>>

    THURSDAY, JUNE 23, 2016

    I want to thank two friends, one a very good old friend, Lucilia,  who passed the below comparison on to me, and a new visitor to my site, J. Lopes, who found this excellent photo comparison and asked that it be forwarded to me.  We can never have too much good evidence!!!Wanda-Smiling-and-Elvis 2 (2)

    Elvis and Jesse (1950's and 1994)

    <<<<<<<<<<>>>>>>>>>>

    This is just a flash from the past as I do know that I have shared it somewhere on my site prior to this.   I just came across it and I wanted to share it again for those who may not have seen it before.  This is an excerpt from a letter which Jesse wrote to Dr. Hinton during the course of writing his book. This is from my own copy of the rough draft of the book.

    Jesse letter about us, book, and being Jesse

    I did recall on which page I had shared the above excerpt before.  Here is the link to that page for those who care to view more of the letters which Jesse wrote to Dr. Hinton and which were published in his book.

    https://lindahoodsigmonstruth.com/jesses-handwritten-letters-which-were-published-in-the-book/

    <<<<<<<<<<>>>>>>>>>>

    Jesse called me just now and it was so wonderful speaking with him.  He is feeling well today.  He is getting out for rides every once in a while and he enjoys that. We had such a happy chat and it sure made my day.  He was checking to see how Tom and I are doing.  So, there is no news this time to share.

    <<<<<<<<<<>>>>>>>>>>

    SENT TO JESSE THROUGH THIS POINT ON FRIDAY, JUNE 24, 2016

    <<<<<<<<<<>>>>>>>>>>

    SATURDAY, JUNE 25, 2016

    I want to share this performance of Fairytale from one of Elvis’ last shows in 1977.  For me, this song is one of his going-away songs.  He introduces this as “…the story of my life“.   However, it is very telling to me in that it is the story of the end of a fairytale which was not what it had seemed.  “…I’ve been lost in a dream”  “I’ll pack up all my things and walk away.   “and nothin’ will get better if I stay.”   “And now I’ve opened up my eyes and found it’s all been just a great big fairytale.

    I’ll bet you won’t forget me when I go.”

    Read more: Elvis Presley – Fairytale Lyrics | MetroLyrics .

    Elvis – Fairytale

    vsbonvenutoep  Published on Nov 30, 2012

    www://youtu.be/yswfyPEBtFM

    <<<<<<<<<<>>>>>>>>>>

    SATURDAY, JUNE 25, 2016

    This is a good 2006 interview with D. J. Fontana…enjoy.

    talking elvis with dj fontana

    dj Fontana talking Elvis in Holland 2006

    www://youtu.be/tR4rwllxYx4

    <<<<<<<<<<<>>>>>>>>>>>

    The king of music

    Please vote for Elvis every single day. One vote per day is permitted. He was the King of Music for May and is at the top for June by just a few hundred votes. Please pass along to everyone you know.

    The king of music

    Choose the king of music! There are many singers, but the king is only one! Every vote matters! Choose the all time best singer. Your opinion is important.

    THEKINGOFMUSIC.COM

    <<<<<<<<<<>>>>>>>>>>

    Shared on Facebook…Elvis framed speech

     <<<<<<<<<<>>>>>>>>>>

    SUNDAY, JUNE 26, 2016

    Today was the anniversary of Elvis’ very last concert before he “retired”.  Here is a film of that show.  Bear in mind while viewing this that Elvis KNEW this would be his last concert.

    Elvis Presley 1977 06 26 The Last Farewell

    www://youtu.be/frFzeg91x70

    Elvis Presley Last Song Performed On Stage 1977-06-26.avi

    www://youtu.be/Sm7D3w-U9gQ

    Today also marks the anniversary of a very sad occasion.  

    Elvis’/Jesse’s father passed away on June 26, 1979 just two years from the date of this last show.

    Jesse and I have not discussed this specifically…but this “coincidence” of date is an example of numerology in Elvis’/Jesse’s life. 26 reduces to an 8, of course.  

    <<<<<<<<<<>>>>>>>>>>

    THURSDAY, JUNE 30, 2016

    I apologize for my absence the last few days.  I had eye surgery which prohibited me from being on the computer as I could not see well enough.  My vision is improving but still not completely back to normal. 

    Jesse called me on Tuesday evening and again yesterday afternoon.  He was concerned about my surgery and was calling because of that.  Needless to say, his calls did wonders for me as always.  He is doing well.  Of course, Jesse is very saddened by the loss of his friend Scotty Moore.  As we all know, he has lost several of his longtime friends during the last several months.  This breaks my heart for Jesse.

    <<<<<<<<<<>>>>>>>>>>

    I want to share this special video of Scotty Moore and Carl Perkins reminiscing about the early years.  I want to do this in memory of Scotty.  I think Jesse will enjoy seeing these two old friends together.

    Scotty Moore and Carl Perkins Reminisce

    Published on Aug 25, 2013

    “Shorty after Scotty started performing again in the early ’90s a documentary was produced about he, Elvis and Bill in the first year of performing, 1954-55. The company created an info-mercial with the intent of promoting the video by having Scotty and Carl Perkins sit and talk a bit about the content. The video was never released and Scotty and Carl were never paid (again). Scotty though had a copy of the info-mercial and has made the parts with he and Carl available to his fans on his website and myspace page. Scotty said this was better than the actual documentary.”

    www://youtu.be/2zJTKGA0aQU

    <<<<<<<<<<>>>>>>>>>>

    SENT TO JESSE THRU THIS POINT ON THURSDAY, JUNE 30, 2016

    <<<<<<<<<<>>>>>>>>>>

    I HAVE BEGUN A NEW PAGE FOR THE MONTH OF JULY, 2016.

    BELOW IS THE LINK TO THE NEW PAGE.

    https://lindahoodsigmonstruth.com/current-news-events/current-news-and-events-july-2016/

    <<<<<<<<<<>>>>>>>>>>

    ELVIS IS STILL ALIVE AND HAS APPROVED THIS WEBSITE.