From: <Saved by Windows Internet Explorer 7>
Subject: Fullscreen Gigapan Viewer
Date: Fri, 23 Jan 2009 20:46:59 -0800
MIME-Version: 1.0
Content-Type: multipart/related;
	type="text/html";
	boundary="----=_NextPart_000_0000_01C97D9B.BCD30A40"
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5579

This is a multi-part message in MIME format.

------=_NextPart_000_0000_01C97D9B.BCD30A40
Content-Type: text/html;
	charset="utf-8"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://gigapan.org/viewGigapanFullscreen.php?auth=033ef14483ee899496648c2b4b06233c

=EF=BB=BF<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE>Fullscreen Gigapan Viewer</TITLE>
<META http-equiv=3DContent-Type content=3D"text/html; =
charset=3Dutf-8"><LINK=20
href=3D"http://gigapan.org/css/viewGigapanFullscreen.css" =
type=3Dtext/css=20
rel=3Dstylesheet>
<SCRIPT src=3D"http://gigapan.org/js/jquery.js" =
type=3Dtext/javascript></SCRIPT>

<SCRIPT src=3D"http://gigapan.org/js/main.js" =
type=3Dtext/javascript></SCRIPT>

<SCRIPT language=3DJavaScript type=3Dtext/javascript>=0A=
      var displayFlashBrowser =3D false;=0A=
      var flashBrowserHTML =3D "";=0A=
=0A=
      =0A=
      function loadFlashBrowser()=0A=
         {=0A=
         if (displayFlashBrowser)=0A=
            {=0A=
            $("#main_viewer").append(flashBrowserHTML);=0A=
            }=0A=
         }=0A=
      =0A=
=0A=
   </SCRIPT>

<META content=3D"MSHTML 6.00.6000.16788" name=3DGENERATOR></HEAD>
<BODY onload=3DdoPageLoadCallbacks();loadFlashBrowser();>
<DIV id=3Dmain_viewer>
<SCRIPT src=3D"http://gigapan.org/viewer/JavaScriptFlashGateway.js"=20
type=3Dtext/javascript></SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
=0A=
   function flashBrowserLoaded()=0A=
      {=0A=
      isFlashBrowserLoaded =3D true;=0A=
      flashProxy.call('enableBrowser');=0A=
      doFlashBrowserLoadCallbacks();=0A=
      }=0A=
=0A=
=0A=
   var uid =3D new Date().getTime();=0A=
   var flashProxy =3D new FlashProxy(uid, =
'/viewer/JavaScriptFlashGateway.swf');=0A=
=0A=
   // TODO: uncomment this (and add in the appropriate js include) once =
mac scroll wheel support is working properly=0A=
   // var macmousewheel =3D new SWFMacMouseWheel(flashProxy);=0A=
=0A=
   var tag =3D new =
FlashTag("/viewer/PanoramaViewer.swf?url=3Dhttp://share.gigapan.org/gigap=
ans0/15374/tiles/&suffix=3D.jpg&startHideControls=3D0&width=3D59783&heigh=
t=3D24658&nlevels=3D9&cleft=3D0&ctop=3D0&cright=3D59783.0&cbottom=3D24658=
.0&startEnabled=3D1&notifyWhenLoaded=3D1", "100%", "100%");=0A=
   tag.setFlashvars('lcId=3D'+uid);=0A=
   tag.setBgcolor('000000');=0A=
   tag.setId('flash_viewer');=0A=
   displayFlashBrowser =3D true;=0A=
   flashBrowserHTML =3D tag.toString();=0A=
</SCRIPT>
</DIV>
<SCRIPT language=3DJavaScript type=3Dtext/javascript>=0A=
   =0A=
      function setViewBoundsReturn() {}=0A=
=0A=
      function setView() {=0A=
   =0A=
         =0A=
   =0A=
      }=0A=
=0A=
      registerPageLoadCallback("setView();");=0A=
   =0A=
   </SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
   var gaJsHost =3D (("https:" =3D=3D document.location.protocol) ? =
"https://ssl." : "http://www.");=0A=
   document.write(unescape("%3Cscript src=3D'" + gaJsHost + =
"google-analytics.com/ga.js' type=3D'text/javascript'%3E%3C/script%3E"));=0A=
   </SCRIPT>

<SCRIPT type=3Dtext/javascript>=0A=
   var pageTracker =3D _gat._getTracker("UA-4157572-2");=0A=
   pageTracker._initData();=0A=
   pageTracker._trackPageview();=0A=
   </SCRIPT>
</BODY></HTML>

------=_NextPart_000_0000_01C97D9B.BCD30A40
Content-Type: text/css;
	charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Location: http://gigapan.org/css/viewGigapanFullscreen.css

BODY {
	PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: =
0px; WIDTH: 100%; PADDING-TOP: 0px; HEIGHT: 100%; BACKGROUND-COLOR: =
#000000
}

------=_NextPart_000_0000_01C97D9B.BCD30A40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://gigapan.org/js/jquery.js

(function(){=0A=
/*=0A=
 * jQuery 1.2.1 - New Wave Javascript=0A=
 *=0A=
 * Copyright (c) 2007 John Resig (jquery.com)=0A=
 * Dual licensed under the MIT (MIT-LICENSE.txt)=0A=
 * and GPL (GPL-LICENSE.txt) licenses.=0A=
 *=0A=
 * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $=0A=
 * $Rev: 3353 $=0A=
 */=0A=
=0A=
// Map over jQuery in case of overwrite=0A=
if ( typeof jQuery !=3D "undefined" )=0A=
	var _jQuery =3D jQuery;=0A=
=0A=
var jQuery =3D window.jQuery =3D function(selector, context) {=0A=
	// If the context is a namespace object, return a new object=0A=
	return this instanceof jQuery ?=0A=
		this.init(selector, context) :=0A=
		new jQuery(selector, context);=0A=
};=0A=
=0A=
// Map over the $ in case of overwrite=0A=
if ( typeof $ !=3D "undefined" )=0A=
	var _$ =3D $;=0A=
	=0A=
// Map the jQuery namespace to the '$' one=0A=
window.$ =3D jQuery;=0A=
=0A=
var quickExpr =3D /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;=0A=
=0A=
jQuery.fn =3D jQuery.prototype =3D {=0A=
	init: function(selector, context) {=0A=
		// Make sure that a selection was provided=0A=
		selector =3D selector || document;=0A=
=0A=
		// Handle HTML strings=0A=
		if ( typeof selector  =3D=3D "string" ) {=0A=
			var m =3D quickExpr.exec(selector);=0A=
			if ( m && (m[1] || !context) ) {=0A=
				// HANDLE: $(html) -> $(array)=0A=
				if ( m[1] )=0A=
					selector =3D jQuery.clean( [ m[1] ], context );=0A=
=0A=
				// HANDLE: $("#id")=0A=
				else {=0A=
					var tmp =3D document.getElementById( m[3] );=0A=
					if ( tmp )=0A=
						// Handle the case where IE and Opera return items=0A=
						// by name instead of ID=0A=
						if ( tmp.id !=3D m[3] )=0A=
							return jQuery().find( selector );=0A=
						else {=0A=
							this[0] =3D tmp;=0A=
							this.length =3D 1;=0A=
							return this;=0A=
						}=0A=
					else=0A=
						selector =3D [];=0A=
				}=0A=
=0A=
			// HANDLE: $(expr)=0A=
			} else=0A=
				return new jQuery( context ).find( selector );=0A=
=0A=
		// HANDLE: $(function)=0A=
		// Shortcut for document ready=0A=
		} else if ( jQuery.isFunction(selector) )=0A=
			return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( =
selector );=0A=
=0A=
		return this.setArray(=0A=
			// HANDLE: $(array)=0A=
			selector.constructor =3D=3D Array && selector ||=0A=
=0A=
			// HANDLE: $(arraylike)=0A=
			// Watch for when an array-like object is passed as the selector=0A=
			(selector.jquery || selector.length && selector !=3D window && =
!selector.nodeType && selector[0] !=3D undefined && =
selector[0].nodeType) && jQuery.makeArray( selector ) ||=0A=
=0A=
			// HANDLE: $(*)=0A=
			[ selector ] );=0A=
	},=0A=
	=0A=
	jquery: "1.2.1",=0A=
=0A=
	size: function() {=0A=
		return this.length;=0A=
	},=0A=
	=0A=
	length: 0,=0A=
=0A=
	get: function( num ) {=0A=
		return num =3D=3D undefined ?=0A=
=0A=
			// Return a 'clean' array=0A=
			jQuery.makeArray( this ) :=0A=
=0A=
			// Return just the object=0A=
			this[num];=0A=
	},=0A=
	=0A=
	pushStack: function( a ) {=0A=
		var ret =3D jQuery(a);=0A=
		ret.prevObject =3D this;=0A=
		return ret;=0A=
	},=0A=
	=0A=
	setArray: function( a ) {=0A=
		this.length =3D 0;=0A=
		Array.prototype.push.apply( this, a );=0A=
		return this;=0A=
	},=0A=
=0A=
	each: function( fn, args ) {=0A=
		return jQuery.each( this, fn, args );=0A=
	},=0A=
=0A=
	index: function( obj ) {=0A=
		var pos =3D -1;=0A=
		this.each(function(i){=0A=
			if ( this =3D=3D obj ) pos =3D i;=0A=
		});=0A=
		return pos;=0A=
	},=0A=
=0A=
	attr: function( key, value, type ) {=0A=
		var obj =3D key;=0A=
		=0A=
		// Look for the case where we're accessing a style value=0A=
		if ( key.constructor =3D=3D String )=0A=
			if ( value =3D=3D undefined )=0A=
				return this.length && jQuery[ type || "attr" ]( this[0], key ) || =
undefined;=0A=
			else {=0A=
				obj =3D {};=0A=
				obj[ key ] =3D value;=0A=
			}=0A=
		=0A=
		// Check to see if we're setting style values=0A=
		return this.each(function(index){=0A=
			// Set all the styles=0A=
			for ( var prop in obj )=0A=
				jQuery.attr(=0A=
					type ? this.style : this,=0A=
					prop, jQuery.prop(this, obj[prop], type, index, prop)=0A=
				);=0A=
		});=0A=
	},=0A=
=0A=
	css: function( key, value ) {=0A=
		return this.attr( key, value, "curCSS" );=0A=
	},=0A=
=0A=
	text: function(e) {=0A=
		if ( typeof e !=3D "object" && e !=3D null )=0A=
			return this.empty().append( document.createTextNode( e ) );=0A=
=0A=
		var t =3D "";=0A=
		jQuery.each( e || this, function(){=0A=
			jQuery.each( this.childNodes, function(){=0A=
				if ( this.nodeType !=3D 8 )=0A=
					t +=3D this.nodeType !=3D 1 ?=0A=
						this.nodeValue : jQuery.fn.text([ this ]);=0A=
			});=0A=
		});=0A=
		return t;=0A=
	},=0A=
=0A=
	wrapAll: function(html) {=0A=
		if ( this[0] )=0A=
			// The elements to wrap the target around=0A=
			jQuery(html, this[0].ownerDocument)=0A=
				.clone()=0A=
				.insertBefore(this[0])=0A=
				.map(function(){=0A=
					var elem =3D this;=0A=
					while ( elem.firstChild )=0A=
						elem =3D elem.firstChild;=0A=
					return elem;=0A=
				})=0A=
				.append(this);=0A=
=0A=
		return this;=0A=
	},=0A=
=0A=
	wrapInner: function(html) {=0A=
		return this.each(function(){=0A=
			jQuery(this).contents().wrapAll(html);=0A=
		});=0A=
	},=0A=
=0A=
	wrap: function(html) {=0A=
		return this.each(function(){=0A=
			jQuery(this).wrapAll(html);=0A=
		});=0A=
	},=0A=
=0A=
	append: function() {=0A=
		return this.domManip(arguments, true, 1, function(a){=0A=
			this.appendChild( a );=0A=
		});=0A=
	},=0A=
=0A=
	prepend: function() {=0A=
		return this.domManip(arguments, true, -1, function(a){=0A=
			this.insertBefore( a, this.firstChild );=0A=
		});=0A=
	},=0A=
	=0A=
	before: function() {=0A=
		return this.domManip(arguments, false, 1, function(a){=0A=
			this.parentNode.insertBefore( a, this );=0A=
		});=0A=
	},=0A=
=0A=
	after: function() {=0A=
		return this.domManip(arguments, false, -1, function(a){=0A=
			this.parentNode.insertBefore( a, this.nextSibling );=0A=
		});=0A=
	},=0A=
=0A=
	end: function() {=0A=
		return this.prevObject || jQuery([]);=0A=
	},=0A=
=0A=
	find: function(t) {=0A=
		var data =3D jQuery.map(this, function(a){ return jQuery.find(t,a); });=0A=
		return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 =
?=0A=
			jQuery.unique( data ) : data );=0A=
	},=0A=
=0A=
	clone: function(events) {=0A=
		// Do the clone=0A=
		var ret =3D this.map(function(){=0A=
			return this.outerHTML ? jQuery(this.outerHTML)[0] : =
this.cloneNode(true);=0A=
		});=0A=
=0A=
		// Need to set the expando to null on the cloned set if it exists=0A=
		// removeData doesn't work here, IE removes it from the original as =
well=0A=
		// this is primarily for IE but the data expando shouldn't be copied =
over in any browser=0A=
		var clone =3D ret.find("*").andSelf().each(function(){=0A=
			if ( this[ expando ] !=3D undefined )=0A=
				this[ expando ] =3D null;=0A=
		});=0A=
		=0A=
		// Copy the events from the original to the clone=0A=
		if (events =3D=3D=3D true)=0A=
			this.find("*").andSelf().each(function(i) {=0A=
				var events =3D jQuery.data(this, "events");=0A=
				for ( var type in events )=0A=
					for ( var handler in events[type] )=0A=
						jQuery.event.add(clone[i], type, events[type][handler], =
events[type][handler].data);=0A=
			});=0A=
=0A=
		// Return the cloned set=0A=
		return ret;=0A=
	},=0A=
=0A=
	filter: function(t) {=0A=
		return this.pushStack(=0A=
			jQuery.isFunction( t ) &&=0A=
			jQuery.grep(this, function(el, index){=0A=
				return t.apply(el, [index]);=0A=
			}) ||=0A=
=0A=
			jQuery.multiFilter(t,this) );=0A=
	},=0A=
=0A=
	not: function(t) {=0A=
		return this.pushStack(=0A=
			t.constructor =3D=3D String &&=0A=
			jQuery.multiFilter(t, this, true) ||=0A=
=0A=
			jQuery.grep(this, function(a) {=0A=
				return ( t.constructor =3D=3D Array || t.jquery )=0A=
					? jQuery.inArray( a, t ) < 0=0A=
					: a !=3D t;=0A=
			})=0A=
		);=0A=
	},=0A=
=0A=
	add: function(t) {=0A=
		return this.pushStack( jQuery.merge(=0A=
			this.get(),=0A=
			t.constructor =3D=3D String ?=0A=
				jQuery(t).get() :=0A=
				t.length !=3D undefined && (!t.nodeName || jQuery.nodeName(t, =
"form")) ?=0A=
					t : [t] )=0A=
		);=0A=
	},=0A=
=0A=
	is: function(expr) {=0A=
		return expr ? jQuery.multiFilter(expr,this).length > 0 : false;=0A=
	},=0A=
=0A=
	hasClass: function(expr) {=0A=
		return this.is("." + expr);=0A=
	},=0A=
	=0A=
	val: function( val ) {=0A=
		if ( val =3D=3D undefined ) {=0A=
			if ( this.length ) {=0A=
				var elem =3D this[0];=0A=
		    	=0A=
				// We need to handle select boxes special=0A=
				if ( jQuery.nodeName(elem, "select") ) {=0A=
					var index =3D elem.selectedIndex,=0A=
						a =3D [],=0A=
						options =3D elem.options,=0A=
						one =3D elem.type =3D=3D "select-one";=0A=
					=0A=
					// Nothing was selected=0A=
					if ( index < 0 )=0A=
						return null;=0A=
=0A=
					// Loop through all the selected options=0A=
					for ( var i =3D one ? index : 0, max =3D one ? index + 1 : =
options.length; i < max; i++ ) {=0A=
						var option =3D options[i];=0A=
						if ( option.selected ) {=0A=
							// Get the specifc value for the option=0A=
							var val =3D jQuery.browser.msie && =
!option.attributes["value"].specified ? option.text : option.value;=0A=
							=0A=
							// We don't need an array for one selects=0A=
							if ( one )=0A=
								return val;=0A=
							=0A=
							// Multi-Selects return an array=0A=
							a.push(val);=0A=
						}=0A=
					}=0A=
					=0A=
					return a;=0A=
					=0A=
				// Everything else, we just grab the value=0A=
				} else=0A=
					return this[0].value.replace(/\r/g, "");=0A=
			}=0A=
		} else=0A=
			return this.each(function(){=0A=
				if ( val.constructor =3D=3D Array && =
/radio|checkbox/.test(this.type) )=0A=
					this.checked =3D (jQuery.inArray(this.value, val) >=3D 0 ||=0A=
						jQuery.inArray(this.name, val) >=3D 0);=0A=
				else if ( jQuery.nodeName(this, "select") ) {=0A=
					var tmp =3D val.constructor =3D=3D Array ? val : [val];=0A=
=0A=
					jQuery("option", this).each(function(){=0A=
						this.selected =3D (jQuery.inArray(this.value, tmp) >=3D 0 ||=0A=
						jQuery.inArray(this.text, tmp) >=3D 0);=0A=
					});=0A=
=0A=
					if ( !tmp.length )=0A=
						this.selectedIndex =3D -1;=0A=
				} else=0A=
					this.value =3D val;=0A=
			});=0A=
	},=0A=
	=0A=
	html: function( val ) {=0A=
		return val =3D=3D undefined ?=0A=
			( this.length ? this[0].innerHTML : null ) :=0A=
			this.empty().append( val );=0A=
	},=0A=
=0A=
	replaceWith: function( val ) {=0A=
		return this.after( val ).remove();=0A=
	},=0A=
=0A=
	eq: function(i){=0A=
		return this.slice(i, i+1);=0A=
	},=0A=
=0A=
	slice: function() {=0A=
		return this.pushStack( Array.prototype.slice.apply( this, arguments ) =
);=0A=
	},=0A=
=0A=
	map: function(fn) {=0A=
		return this.pushStack(jQuery.map( this, function(elem,i){=0A=
			return fn.call( elem, i, elem );=0A=
		}));=0A=
	},=0A=
=0A=
	andSelf: function() {=0A=
		return this.add( this.prevObject );=0A=
	},=0A=
	=0A=
	domManip: function(args, table, dir, fn) {=0A=
		var clone =3D this.length > 1, a; =0A=
=0A=
		return this.each(function(){=0A=
			if ( !a ) {=0A=
				a =3D jQuery.clean(args, this.ownerDocument);=0A=
				if ( dir < 0 )=0A=
					a.reverse();=0A=
			}=0A=
=0A=
			var obj =3D this;=0A=
=0A=
			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], =
"tr") )=0A=
				obj =3D this.getElementsByTagName("tbody")[0] || =
this.appendChild(document.createElement("tbody"));=0A=
=0A=
			jQuery.each( a, function(){=0A=
				var elem =3D clone ? this.cloneNode(true) : this;=0A=
				if ( !evalScript(0, elem) )=0A=
					fn.call( obj, elem );=0A=
			});=0A=
		});=0A=
	}=0A=
};=0A=
=0A=
function evalScript(i, elem){=0A=
	var script =3D jQuery.nodeName(elem, "script");=0A=
=0A=
	if ( script ) {=0A=
		if ( elem.src )=0A=
			jQuery.ajax({ url: elem.src, async: false, dataType: "script" });=0A=
		else=0A=
			jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || =
"" );=0A=
	=0A=
		if ( elem.parentNode )=0A=
			elem.parentNode.removeChild(elem);=0A=
=0A=
	} else if ( elem.nodeType =3D=3D 1 )=0A=
    jQuery("script", elem).each(evalScript);=0A=
=0A=
	return script;=0A=
}=0A=
=0A=
jQuery.extend =3D jQuery.fn.extend =3D function() {=0A=
	// copy reference to target object=0A=
	var target =3D arguments[0] || {}, a =3D 1, al =3D arguments.length, =
deep =3D false;=0A=
=0A=
	// Handle a deep copy situation=0A=
	if ( target.constructor =3D=3D Boolean ) {=0A=
		deep =3D target;=0A=
		target =3D arguments[1] || {};=0A=
	}=0A=
=0A=
	// extend jQuery itself if only one argument is passed=0A=
	if ( al =3D=3D 1 ) {=0A=
		target =3D this;=0A=
		a =3D 0;=0A=
	}=0A=
=0A=
	var prop;=0A=
=0A=
	for ( ; a < al; a++ )=0A=
		// Only deal with non-null/undefined values=0A=
		if ( (prop =3D arguments[a]) !=3D null )=0A=
			// Extend the base object=0A=
			for ( var i in prop ) {=0A=
				// Prevent never-ending loop=0A=
				if ( target =3D=3D prop[i] )=0A=
					continue;=0A=
=0A=
				// Recurse if we're merging object values=0A=
				if ( deep && typeof prop[i] =3D=3D 'object' && target[i] )=0A=
					jQuery.extend( target[i], prop[i] );=0A=
=0A=
				// Don't bring in undefined values=0A=
				else if ( prop[i] !=3D undefined )=0A=
					target[i] =3D prop[i];=0A=
			}=0A=
=0A=
	// Return the modified object=0A=
	return target;=0A=
};=0A=
=0A=
var expando =3D "jQuery" + (new Date()).getTime(), uuid =3D 0, win =3D =
{};=0A=
=0A=
jQuery.extend({=0A=
	noConflict: function(deep) {=0A=
		window.$ =3D _$;=0A=
		if ( deep )=0A=
			window.jQuery =3D _jQuery;=0A=
		return jQuery;=0A=
	},=0A=
=0A=
	// This may seem like some crazy code, but trust me when I say that this=0A=
	// is the only cross-browser way to do this. --John=0A=
	isFunction: function( fn ) {=0A=
		return !!fn && typeof fn !=3D "string" && !fn.nodeName && =0A=
			fn.constructor !=3D Array && /function/i.test( fn + "" );=0A=
	},=0A=
	=0A=
	// check if an element is in a XML document=0A=
	isXMLDoc: function(elem) {=0A=
		return elem.documentElement && !elem.body ||=0A=
			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;=0A=
	},=0A=
=0A=
	// Evalulates a script in a global context=0A=
	// Evaluates Async. in Safari 2 :-(=0A=
	globalEval: function( data ) {=0A=
		data =3D jQuery.trim( data );=0A=
		if ( data ) {=0A=
			if ( window.execScript )=0A=
				window.execScript( data );=0A=
			else if ( jQuery.browser.safari )=0A=
				// safari doesn't provide a synchronous global eval=0A=
				window.setTimeout( data, 0 );=0A=
			else=0A=
				eval.call( window, data );=0A=
		}=0A=
	},=0A=
=0A=
	nodeName: function( elem, name ) {=0A=
		return elem.nodeName && elem.nodeName.toUpperCase() =3D=3D =
name.toUpperCase();=0A=
	},=0A=
	=0A=
	cache: {},=0A=
	=0A=
	data: function( elem, name, data ) {=0A=
		elem =3D elem =3D=3D window ? win : elem;=0A=
=0A=
		var id =3D elem[ expando ];=0A=
=0A=
		// Compute a unique ID for the element=0A=
		if ( !id ) =0A=
			id =3D elem[ expando ] =3D ++uuid;=0A=
=0A=
		// Only generate the data cache if we're=0A=
		// trying to access or manipulate it=0A=
		if ( name && !jQuery.cache[ id ] )=0A=
			jQuery.cache[ id ] =3D {};=0A=
		=0A=
		// Prevent overriding the named cache with undefined values=0A=
		if ( data !=3D undefined )=0A=
			jQuery.cache[ id ][ name ] =3D data;=0A=
		=0A=
		// Return the named cache data, or the ID for the element	=0A=
		return name ? jQuery.cache[ id ][ name ] : id;=0A=
	},=0A=
	=0A=
	removeData: function( elem, name ) {=0A=
		elem =3D elem =3D=3D window ? win : elem;=0A=
=0A=
		var id =3D elem[ expando ];=0A=
=0A=
		// If we want to remove a specific section of the element's data=0A=
		if ( name ) {=0A=
			if ( jQuery.cache[ id ] ) {=0A=
				// Remove the section of cache data=0A=
				delete jQuery.cache[ id ][ name ];=0A=
=0A=
				// If we've removed all the data, remove the element's cache=0A=
				name =3D "";=0A=
				for ( name in jQuery.cache[ id ] ) break;=0A=
				if ( !name )=0A=
					jQuery.removeData( elem );=0A=
			}=0A=
=0A=
		// Otherwise, we want to remove all of the element's data=0A=
		} else {=0A=
			// Clean up the element expando=0A=
			try {=0A=
				delete elem[ expando ];=0A=
			} catch(e){=0A=
				// IE has trouble directly removing the expando=0A=
				// but it's ok with using removeAttribute=0A=
				if ( elem.removeAttribute )=0A=
					elem.removeAttribute( expando );=0A=
			}=0A=
=0A=
			// Completely remove the data cache=0A=
			delete jQuery.cache[ id ];=0A=
		}=0A=
	},=0A=
=0A=
	// args is for internal usage only=0A=
	each: function( obj, fn, args ) {=0A=
		if ( args ) {=0A=
			if ( obj.length =3D=3D undefined )=0A=
				for ( var i in obj )=0A=
					fn.apply( obj[i], args );=0A=
			else=0A=
				for ( var i =3D 0, ol =3D obj.length; i < ol; i++ )=0A=
					if ( fn.apply( obj[i], args ) =3D=3D=3D false ) break;=0A=
=0A=
		// A special, fast, case for the most common use of each=0A=
		} else {=0A=
			if ( obj.length =3D=3D undefined )=0A=
				for ( var i in obj )=0A=
					fn.call( obj[i], i, obj[i] );=0A=
			else=0A=
				for ( var i =3D 0, ol =3D obj.length, val =3D obj[0]; =0A=
					i < ol && fn.call(val,i,val) !=3D=3D false; val =3D obj[++i] ){}=0A=
		}=0A=
=0A=
		return obj;=0A=
	},=0A=
	=0A=
	prop: function(elem, value, type, index, prop){=0A=
			// Handle executable functions=0A=
			if ( jQuery.isFunction( value ) )=0A=
				value =3D value.call( elem, [index] );=0A=
				=0A=
			// exclude the following css properties to add px=0A=
			var exclude =3D /z-?index|font-?weight|opacity|zoom|line-?height/i;=0A=
=0A=
			// Handle passing in a number to a CSS property=0A=
			return value && value.constructor =3D=3D Number && type =3D=3D =
"curCSS" && !exclude.test(prop) ?=0A=
				value + "px" :=0A=
				value;=0A=
	},=0A=
=0A=
	className: {=0A=
		// internal only, use addClass("class")=0A=
		add: function( elem, c ){=0A=
			jQuery.each( (c || "").split(/\s+/), function(i, cur){=0A=
				if ( !jQuery.className.has( elem.className, cur ) )=0A=
					elem.className +=3D ( elem.className ? " " : "" ) + cur;=0A=
			});=0A=
		},=0A=
=0A=
		// internal only, use removeClass("class")=0A=
		remove: function( elem, c ){=0A=
			elem.className =3D c !=3D undefined ?=0A=
				jQuery.grep( elem.className.split(/\s+/), function(cur){=0A=
					return !jQuery.className.has( c, cur );	=0A=
				}).join(" ") : "";=0A=
		},=0A=
=0A=
		// internal only, use is(".class")=0A=
		has: function( t, c ) {=0A=
			return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) =
) > -1;=0A=
		}=0A=
	},=0A=
=0A=
	swap: function(e,o,f) {=0A=
		for ( var i in o ) {=0A=
			e.style["old"+i] =3D e.style[i];=0A=
			e.style[i] =3D o[i];=0A=
		}=0A=
		f.apply( e, [] );=0A=
		for ( var i in o )=0A=
			e.style[i] =3D e.style["old"+i];=0A=
	},=0A=
=0A=
	css: function(e,p) {=0A=
		if ( p =3D=3D "height" || p =3D=3D "width" ) {=0A=
			var old =3D {}, oHeight, oWidth, d =3D =
["Top","Bottom","Right","Left"];=0A=
=0A=
			jQuery.each( d, function(){=0A=
				old["padding" + this] =3D 0;=0A=
				old["border" + this + "Width"] =3D 0;=0A=
			});=0A=
=0A=
			jQuery.swap( e, old, function() {=0A=
				if ( jQuery(e).is(':visible') ) {=0A=
					oHeight =3D e.offsetHeight;=0A=
					oWidth =3D e.offsetWidth;=0A=
				} else {=0A=
					e =3D jQuery(e.cloneNode(true))=0A=
						.find(":radio").removeAttr("checked").end()=0A=
						.css({=0A=
							visibility: "hidden", position: "absolute", display: "block", =
right: "0", left: "0"=0A=
						}).appendTo(e.parentNode)[0];=0A=
=0A=
					var parPos =3D jQuery.css(e.parentNode,"position") || "static";=0A=
					if ( parPos =3D=3D "static" )=0A=
						e.parentNode.style.position =3D "relative";=0A=
=0A=
					oHeight =3D e.clientHeight;=0A=
					oWidth =3D e.clientWidth;=0A=
=0A=
					if ( parPos =3D=3D "static" )=0A=
						e.parentNode.style.position =3D "static";=0A=
=0A=
					e.parentNode.removeChild(e);=0A=
				}=0A=
			});=0A=
=0A=
			return p =3D=3D "height" ? oHeight : oWidth;=0A=
		}=0A=
=0A=
		return jQuery.curCSS( e, p );=0A=
	},=0A=
=0A=
	curCSS: function(elem, prop, force) {=0A=
		var ret, stack =3D [], swap =3D [];=0A=
=0A=
		// A helper method for determining if an element's values are broken=0A=
		function color(a){=0A=
			if ( !jQuery.browser.safari )=0A=
				return false;=0A=
=0A=
			var ret =3D document.defaultView.getComputedStyle(a,null);=0A=
			return !ret || ret.getPropertyValue("color") =3D=3D "";=0A=
		}=0A=
=0A=
		if (prop =3D=3D "opacity" && jQuery.browser.msie) {=0A=
			ret =3D jQuery.attr(elem.style, "opacity");=0A=
			return ret =3D=3D "" ? "1" : ret;=0A=
		}=0A=
		=0A=
		if (prop.match(/float/i))=0A=
			prop =3D styleFloat;=0A=
=0A=
		if (!force && elem.style[prop])=0A=
			ret =3D elem.style[prop];=0A=
=0A=
		else if (document.defaultView && =
document.defaultView.getComputedStyle) {=0A=
=0A=
			if (prop.match(/float/i))=0A=
				prop =3D "float";=0A=
=0A=
			prop =3D prop.replace(/([A-Z])/g,"-$1").toLowerCase();=0A=
			var cur =3D document.defaultView.getComputedStyle(elem, null);=0A=
=0A=
			if ( cur && !color(elem) )=0A=
				ret =3D cur.getPropertyValue(prop);=0A=
=0A=
			// If the element isn't reporting its values properly in Safari=0A=
			// then some display: none elements are involved=0A=
			else {=0A=
				// Locate all of the parent display: none elements=0A=
				for ( var a =3D elem; a && color(a); a =3D a.parentNode )=0A=
					stack.unshift(a);=0A=
=0A=
				// Go through and make them visible, but in reverse=0A=
				// (It would be better if we knew the exact display type that they =
had)=0A=
				for ( a =3D 0; a < stack.length; a++ )=0A=
					if ( color(stack[a]) ) {=0A=
						swap[a] =3D stack[a].style.display;=0A=
						stack[a].style.display =3D "block";=0A=
					}=0A=
=0A=
				// Since we flip the display style, we have to handle that=0A=
				// one special, otherwise get the value=0A=
				ret =3D prop =3D=3D "display" && swap[stack.length-1] !=3D null ?=0A=
					"none" :=0A=
					=
document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) =
|| "";=0A=
=0A=
				// Finally, revert the display styles back=0A=
				for ( a =3D 0; a < swap.length; a++ )=0A=
					if ( swap[a] !=3D null )=0A=
						stack[a].style.display =3D swap[a];=0A=
			}=0A=
=0A=
			if ( prop =3D=3D "opacity" && ret =3D=3D "" )=0A=
				ret =3D "1";=0A=
=0A=
		} else if (elem.currentStyle) {=0A=
			var newProp =3D prop.replace(/\-(\w)/g,function(m,c){return =
c.toUpperCase();});=0A=
			ret =3D elem.currentStyle[prop] || elem.currentStyle[newProp];=0A=
=0A=
			// From the awesome hack by Dean Edwards=0A=
			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291=0A=
=0A=
			// If we're not dealing with a regular pixel number=0A=
			// but a number that has a weird ending, we need to convert it to =
pixels=0A=
			if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) {=0A=
				var style =3D elem.style.left;=0A=
				var runtimeStyle =3D elem.runtimeStyle.left;=0A=
				elem.runtimeStyle.left =3D elem.currentStyle.left;=0A=
				elem.style.left =3D ret || 0;=0A=
				ret =3D elem.style.pixelLeft + "px";=0A=
				elem.style.left =3D style;=0A=
				elem.runtimeStyle.left =3D runtimeStyle;=0A=
			}=0A=
		}=0A=
=0A=
		return ret;=0A=
	},=0A=
	=0A=
	clean: function(a, doc) {=0A=
		var r =3D [];=0A=
		doc =3D doc || document;=0A=
=0A=
		jQuery.each( a, function(i,arg){=0A=
			if ( !arg ) return;=0A=
=0A=
			if ( arg.constructor =3D=3D Number )=0A=
				arg =3D arg.toString();=0A=
			=0A=
			// Convert html string into DOM nodes=0A=
			if ( typeof arg =3D=3D "string" ) {=0A=
				// Fix "XHTML"-style tags in all browsers=0A=
				arg =3D arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){=0A=
					return =
tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : =
all+"></"+tag+">";=0A=
				});=0A=
=0A=
				// Trim whitespace, otherwise indexOf won't work as expected=0A=
				var s =3D jQuery.trim(arg).toLowerCase(), div =3D =
doc.createElement("div"), tb =3D [];=0A=
=0A=
				var wrap =3D=0A=
					// option or optgroup=0A=
					!s.indexOf("<opt") &&=0A=
					[1, "<select>", "</select>"] ||=0A=
					=0A=
					!s.indexOf("<leg") &&=0A=
					[1, "<fieldset>", "</fieldset>"] ||=0A=
					=0A=
					s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&=0A=
					[1, "<table>", "</table>"] ||=0A=
					=0A=
					!s.indexOf("<tr") &&=0A=
					[2, "<table><tbody>", "</tbody></table>"] ||=0A=
					=0A=
				 	// <thead> matched above=0A=
					(!s.indexOf("<td") || !s.indexOf("<th")) &&=0A=
					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||=0A=
					=0A=
					!s.indexOf("<col") &&=0A=
					[2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||=0A=
=0A=
					// IE can't serialize <link> and <script> tags normally=0A=
					jQuery.browser.msie &&=0A=
					[1, "div<div>", "</div>"] ||=0A=
					=0A=
					[0,"",""];=0A=
=0A=
				// Go to html and back, then peel off extra wrappers=0A=
				div.innerHTML =3D wrap[1] + arg + wrap[2];=0A=
				=0A=
				// Move to the right depth=0A=
				while ( wrap[0]-- )=0A=
					div =3D div.lastChild;=0A=
				=0A=
				// Remove IE's autoinserted <tbody> from table fragments=0A=
				if ( jQuery.browser.msie ) {=0A=
					=0A=
					// String was a <table>, *may* have spurious <tbody>=0A=
					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) =0A=
						tb =3D div.firstChild && div.firstChild.childNodes;=0A=
						=0A=
					// String was a bare <thead> or <tfoot>=0A=
					else if ( wrap[1] =3D=3D "<table>" && s.indexOf("<tbody") < 0 )=0A=
						tb =3D div.childNodes;=0A=
=0A=
					for ( var n =3D tb.length-1; n >=3D 0 ; --n )=0A=
						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )=0A=
							tb[n].parentNode.removeChild(tb[n]);=0A=
	=0A=
					// IE completely kills leading whitespace when innerHTML is used	=0A=
					if ( /^\s/.test(arg) )	=0A=
						div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), =
div.firstChild );=0A=
=0A=
				}=0A=
				=0A=
				arg =3D jQuery.makeArray( div.childNodes );=0A=
			}=0A=
=0A=
			if ( 0 =3D=3D=3D arg.length && (!jQuery.nodeName(arg, "form") && =
!jQuery.nodeName(arg, "select")) )=0A=
				return;=0A=
=0A=
			if ( arg[0] =3D=3D undefined || jQuery.nodeName(arg, "form") || =
arg.options )=0A=
				r.push( arg );=0A=
			else=0A=
				r =3D jQuery.merge( r, arg );=0A=
=0A=
		});=0A=
=0A=
		return r;=0A=
	},=0A=
	=0A=
	attr: function(elem, name, value){=0A=
		var fix =3D jQuery.isXMLDoc(elem) ? {} : jQuery.props;=0A=
=0A=
		// Safari mis-reports the default selected property of a hidden option=0A=
		// Accessing the parent's selectedIndex property fixes it=0A=
		if ( name =3D=3D "selected" && jQuery.browser.safari )=0A=
			elem.parentNode.selectedIndex;=0A=
		=0A=
		// Certain attributes only work when accessed via the old DOM 0 way=0A=
		if ( fix[name] ) {=0A=
			if ( value !=3D undefined ) elem[fix[name]] =3D value;=0A=
			return elem[fix[name]];=0A=
		} else if ( jQuery.browser.msie && name =3D=3D "style" )=0A=
			return jQuery.attr( elem.style, "cssText", value );=0A=
=0A=
		else if ( value =3D=3D undefined && jQuery.browser.msie && =
jQuery.nodeName(elem, "form") && (name =3D=3D "action" || name =3D=3D =
"method") )=0A=
			return elem.getAttributeNode(name).nodeValue;=0A=
=0A=
		// IE elem.getAttribute passes even for style=0A=
		else if ( elem.tagName ) {=0A=
=0A=
			if ( value !=3D undefined ) {=0A=
				if ( name =3D=3D "type" && jQuery.nodeName(elem,"input") && =
elem.parentNode )=0A=
					throw "type property can't be changed";=0A=
				elem.setAttribute( name, value );=0A=
			}=0A=
=0A=
			if ( jQuery.browser.msie && /href|src/.test(name) && =
!jQuery.isXMLDoc(elem) ) =0A=
				return elem.getAttribute( name, 2 );=0A=
=0A=
			return elem.getAttribute( name );=0A=
=0A=
		// elem is actually elem.style ... set the style=0A=
		} else {=0A=
			// IE actually uses filters for opacity=0A=
			if ( name =3D=3D "opacity" && jQuery.browser.msie ) {=0A=
				if ( value !=3D undefined ) {=0A=
					// IE has trouble with opacity if it does not have layout=0A=
					// Force it by setting the zoom level=0A=
					elem.zoom =3D 1; =0A=
	=0A=
					// Set the alpha filter to set the opacity=0A=
					elem.filter =3D (elem.filter || "").replace(/alpha\([^)]*\)/,"") +=0A=
						(parseFloat(value).toString() =3D=3D "NaN" ? "" : =
"alpha(opacity=3D" + value * 100 + ")");=0A=
				}=0A=
	=0A=
				return elem.filter ? =0A=
					(parseFloat( elem.filter.match(/opacity=3D([^)]*)/)[1] ) / =
100).toString() : "";=0A=
			}=0A=
			name =3D name.replace(/-([a-z])/ig,function(z,b){return =
b.toUpperCase();});=0A=
			if ( value !=3D undefined ) elem[name] =3D value;=0A=
			return elem[name];=0A=
		}=0A=
	},=0A=
	=0A=
	trim: function(t){=0A=
		return (t||"").replace(/^\s+|\s+$/g, "");=0A=
	},=0A=
=0A=
	makeArray: function( a ) {=0A=
		var r =3D [];=0A=
=0A=
		// Need to use typeof to fight Safari childNodes crashes=0A=
		if ( typeof a !=3D "array" )=0A=
			for ( var i =3D 0, al =3D a.length; i < al; i++ )=0A=
				r.push( a[i] );=0A=
		else=0A=
			r =3D a.slice( 0 );=0A=
=0A=
		return r;=0A=
	},=0A=
=0A=
	inArray: function( b, a ) {=0A=
		for ( var i =3D 0, al =3D a.length; i < al; i++ )=0A=
			if ( a[i] =3D=3D b )=0A=
				return i;=0A=
		return -1;=0A=
	},=0A=
=0A=
	merge: function(first, second) {=0A=
		// We have to loop this way because IE & Opera overwrite the length=0A=
		// expando of getElementsByTagName=0A=
=0A=
		// Also, we need to make sure that the correct elements are being =
returned=0A=
		// (IE returns comment nodes in a '*' query)=0A=
		if ( jQuery.browser.msie ) {=0A=
			for ( var i =3D 0; second[i]; i++ )=0A=
				if ( second[i].nodeType !=3D 8 )=0A=
					first.push(second[i]);=0A=
		} else=0A=
			for ( var i =3D 0; second[i]; i++ )=0A=
				first.push(second[i]);=0A=
=0A=
		return first;=0A=
	},=0A=
=0A=
	unique: function(first) {=0A=
		var r =3D [], done =3D {};=0A=
=0A=
		try {=0A=
			for ( var i =3D 0, fl =3D first.length; i < fl; i++ ) {=0A=
				var id =3D jQuery.data(first[i]);=0A=
				if ( !done[id] ) {=0A=
					done[id] =3D true;=0A=
					r.push(first[i]);=0A=
				}=0A=
			}=0A=
		} catch(e) {=0A=
			r =3D first;=0A=
		}=0A=
=0A=
		return r;=0A=
	},=0A=
=0A=
	grep: function(elems, fn, inv) {=0A=
		// If a string is passed in for the function, make a function=0A=
		// for it (a handy shortcut)=0A=
		if ( typeof fn =3D=3D "string" )=0A=
			fn =3D eval("false||function(a,i){return " + fn + "}");=0A=
=0A=
		var result =3D [];=0A=
=0A=
		// Go through the array, only saving the items=0A=
		// that pass the validator function=0A=
		for ( var i =3D 0, el =3D elems.length; i < el; i++ )=0A=
			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )=0A=
				result.push( elems[i] );=0A=
=0A=
		return result;=0A=
	},=0A=
=0A=
	map: function(elems, fn) {=0A=
		// If a string is passed in for the function, make a function=0A=
		// for it (a handy shortcut)=0A=
		if ( typeof fn =3D=3D "string" )=0A=
			fn =3D eval("false||function(a){return " + fn + "}");=0A=
=0A=
		var result =3D [];=0A=
=0A=
		// Go through the array, translating each of the items to their=0A=
		// new value (or values).=0A=
		for ( var i =3D 0, el =3D elems.length; i < el; i++ ) {=0A=
			var val =3D fn(elems[i],i);=0A=
=0A=
			if ( val !=3D=3D null && val !=3D undefined ) {=0A=
				if ( val.constructor !=3D Array ) val =3D [val];=0A=
				result =3D result.concat( val );=0A=
			}=0A=
		}=0A=
=0A=
		return result;=0A=
	}=0A=
});=0A=
=0A=
var userAgent =3D navigator.userAgent.toLowerCase();=0A=
=0A=
// Figure out what browser is being used=0A=
jQuery.browser =3D {=0A=
	version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],=0A=
	safari: /webkit/.test(userAgent),=0A=
	opera: /opera/.test(userAgent),=0A=
	msie: /msie/.test(userAgent) && !/opera/.test(userAgent),=0A=
	mozilla: /mozilla/.test(userAgent) && =
!/(compatible|webkit)/.test(userAgent)=0A=
};=0A=
=0A=
var styleFloat =3D jQuery.browser.msie ? "styleFloat" : "cssFloat";=0A=
	=0A=
jQuery.extend({=0A=
	// Check to see if the W3C box model is being used=0A=
	boxModel: !jQuery.browser.msie || document.compatMode =3D=3D =
"CSS1Compat",=0A=
	=0A=
	styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",=0A=
	=0A=
	props: {=0A=
		"for": "htmlFor",=0A=
		"class": "className",=0A=
		"float": styleFloat,=0A=
		cssFloat: styleFloat,=0A=
		styleFloat: styleFloat,=0A=
		innerHTML: "innerHTML",=0A=
		className: "className",=0A=
		value: "value",=0A=
		disabled: "disabled",=0A=
		checked: "checked",=0A=
		readonly: "readOnly",=0A=
		selected: "selected",=0A=
		maxlength: "maxLength"=0A=
	}=0A=
});=0A=
=0A=
jQuery.each({=0A=
	parent: "a.parentNode",=0A=
	parents: "jQuery.dir(a,'parentNode')",=0A=
	next: "jQuery.nth(a,2,'nextSibling')",=0A=
	prev: "jQuery.nth(a,2,'previousSibling')",=0A=
	nextAll: "jQuery.dir(a,'nextSibling')",=0A=
	prevAll: "jQuery.dir(a,'previousSibling')",=0A=
	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",=0A=
	children: "jQuery.sibling(a.firstChild)",=0A=
	contents: =
"jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:=
jQuery.makeArray(a.childNodes)"=0A=
}, function(i,n){=0A=
	jQuery.fn[ i ] =3D function(a) {=0A=
		var ret =3D jQuery.map(this,n);=0A=
		if ( a && typeof a =3D=3D "string" )=0A=
			ret =3D jQuery.multiFilter(a,ret);=0A=
		return this.pushStack( jQuery.unique(ret) );=0A=
	};=0A=
});=0A=
=0A=
jQuery.each({=0A=
	appendTo: "append",=0A=
	prependTo: "prepend",=0A=
	insertBefore: "before",=0A=
	insertAfter: "after",=0A=
	replaceAll: "replaceWith"=0A=
}, function(i,n){=0A=
	jQuery.fn[ i ] =3D function(){=0A=
		var a =3D arguments;=0A=
		return this.each(function(){=0A=
			for ( var j =3D 0, al =3D a.length; j < al; j++ )=0A=
				jQuery(a[j])[n]( this );=0A=
		});=0A=
	};=0A=
});=0A=
=0A=
jQuery.each( {=0A=
	removeAttr: function( key ) {=0A=
		jQuery.attr( this, key, "" );=0A=
		this.removeAttribute( key );=0A=
	},=0A=
	addClass: function(c){=0A=
		jQuery.className.add(this,c);=0A=
	},=0A=
	removeClass: function(c){=0A=
		jQuery.className.remove(this,c);=0A=
	},=0A=
	toggleClass: function( c ){=0A=
		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" =
](this, c);=0A=
	},=0A=
	remove: function(a){=0A=
		if ( !a || jQuery.filter( a, [this] ).r.length ) {=0A=
			jQuery.removeData( this );=0A=
			this.parentNode.removeChild( this );=0A=
		}=0A=
	},=0A=
	empty: function() {=0A=
		// Clean up the cache=0A=
		jQuery("*", this).each(function(){ jQuery.removeData(this); });=0A=
=0A=
		while ( this.firstChild )=0A=
			this.removeChild( this.firstChild );=0A=
	}=0A=
}, function(i,n){=0A=
	jQuery.fn[ i ] =3D function() {=0A=
		return this.each( n, arguments );=0A=
	};=0A=
});=0A=
=0A=
jQuery.each( [ "Height", "Width" ], function(i,name){=0A=
	var n =3D name.toLowerCase();=0A=
	=0A=
	jQuery.fn[ n ] =3D function(h) {=0A=
		return this[0] =3D=3D window ?=0A=
			jQuery.browser.safari && self["inner" + name] ||=0A=
			jQuery.boxModel && Math.max(document.documentElement["client" + =
name], document.body["client" + name]) ||=0A=
			document.body["client" + name] :=0A=
		=0A=
			this[0] =3D=3D document ?=0A=
				Math.max( document.body["scroll" + name], document.body["offset" + =
name] ) :=0A=
        =0A=
				h =3D=3D undefined ?=0A=
					( this.length ? jQuery.css( this[0], n ) : null ) :=0A=
					this.css( n, h.constructor =3D=3D String ? h : h + "px" );=0A=
	};=0A=
});=0A=
=0A=
var chars =3D jQuery.browser.safari && parseInt(jQuery.browser.version) =
< 417 ?=0A=
		"(?:[\\w*_-]|\\\\.)" :=0A=
		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",=0A=
	quickChild =3D new RegExp("^>\\s*(" + chars + "+)"),=0A=
	quickID =3D new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),=0A=
	quickClass =3D new RegExp("^([#.]?)(" + chars + "*)");=0A=
=0A=
jQuery.extend({=0A=
	expr: {=0A=
		"": "m[2]=3D=3D'*'||jQuery.nodeName(a,m[2])",=0A=
		"#": "a.getAttribute('id')=3D=3Dm[2]",=0A=
		":": {=0A=
			// Position Checks=0A=
			lt: "i<m[3]-0",=0A=
			gt: "i>m[3]-0",=0A=
			nth: "m[3]-0=3D=3Di",=0A=
			eq: "m[3]-0=3D=3Di",=0A=
			first: "i=3D=3D0",=0A=
			last: "i=3D=3Dr.length-1",=0A=
			even: "i%2=3D=3D0",=0A=
			odd: "i%2",=0A=
=0A=
			// Child Checks=0A=
			"first-child": "a.parentNode.getElementsByTagName('*')[0]=3D=3Da",=0A=
			"last-child": =
"jQuery.nth(a.parentNode.lastChild,1,'previousSibling')=3D=3Da",=0A=
			"only-child": =
"!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",=0A=
=0A=
			// Parent Checks=0A=
			parent: "a.firstChild",=0A=
			empty: "!a.firstChild",=0A=
=0A=
			// Text Check=0A=
			contains: =
"(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=3D0",=0A=
=0A=
			// Visibility=0A=
			visible: =
'"hidden"!=3Da.type&&jQuery.css(a,"display")!=3D"none"&&jQuery.css(a,"vis=
ibility")!=3D"hidden"',=0A=
			hidden: =
'"hidden"=3D=3Da.type||jQuery.css(a,"display")=3D=3D"none"||jQuery.css(a,=
"visibility")=3D=3D"hidden"',=0A=
=0A=
			// Form attributes=0A=
			enabled: "!a.disabled",=0A=
			disabled: "a.disabled",=0A=
			checked: "a.checked",=0A=
			selected: "a.selected||jQuery.attr(a,'selected')",=0A=
=0A=
			// Form elements=0A=
			text: "'text'=3D=3Da.type",=0A=
			radio: "'radio'=3D=3Da.type",=0A=
			checkbox: "'checkbox'=3D=3Da.type",=0A=
			file: "'file'=3D=3Da.type",=0A=
			password: "'password'=3D=3Da.type",=0A=
			submit: "'submit'=3D=3Da.type",=0A=
			image: "'image'=3D=3Da.type",=0A=
			reset: "'reset'=3D=3Da.type",=0A=
			button: '"button"=3D=3Da.type||jQuery.nodeName(a,"button")',=0A=
			input: "/input|select|textarea|button/i.test(a.nodeName)",=0A=
=0A=
			// :has()=0A=
			has: "jQuery.find(m[3],a).length",=0A=
=0A=
			// :header=0A=
			header: "/h\\d/i.test(a.nodeName)",=0A=
=0A=
			// :animated=0A=
			animated: "jQuery.grep(jQuery.timers,function(fn){return =
a=3D=3Dfn.elem;}).length"=0A=
		}=0A=
	},=0A=
	=0A=
	// The regular expressions that power the parsing engine=0A=
	parse: [=0A=
		// Match: [@value=3D'test'], [@foo]=0A=
		/^(\[) *@?([\w-]+) *([!*$^~=3D]*) *('?"?)(.*?)\4 *\]/,=0A=
=0A=
		// Match: :contains('foo')=0A=
		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,=0A=
=0A=
		// Match: :even, :last-chlid, #id, .class=0A=
		new RegExp("^([:.#]*)(" + chars + "+)")=0A=
	],=0A=
=0A=
	multiFilter: function( expr, elems, not ) {=0A=
		var old, cur =3D [];=0A=
=0A=
		while ( expr && expr !=3D old ) {=0A=
			old =3D expr;=0A=
			var f =3D jQuery.filter( expr, elems, not );=0A=
			expr =3D f.t.replace(/^\s*,\s*/, "" );=0A=
			cur =3D not ? elems =3D f.r : jQuery.merge( cur, f.r );=0A=
		}=0A=
=0A=
		return cur;=0A=
	},=0A=
=0A=
	find: function( t, context ) {=0A=
		// Quickly handle non-string expressions=0A=
		if ( typeof t !=3D "string" )=0A=
			return [ t ];=0A=
=0A=
		// Make sure that the context is a DOM Element=0A=
		if ( context && !context.nodeType )=0A=
			context =3D null;=0A=
=0A=
		// Set the correct context (if none is provided)=0A=
		context =3D context || document;=0A=
=0A=
		// Initialize the search=0A=
		var ret =3D [context], done =3D [], last;=0A=
=0A=
		// Continue while a selector expression exists, and while=0A=
		// we're no longer looping upon ourselves=0A=
		while ( t && last !=3D t ) {=0A=
			var r =3D [];=0A=
			last =3D t;=0A=
=0A=
			t =3D jQuery.trim(t);=0A=
=0A=
			var foundToken =3D false;=0A=
=0A=
			// An attempt at speeding up child selectors that=0A=
			// point to a specific element tag=0A=
			var re =3D quickChild;=0A=
			var m =3D re.exec(t);=0A=
=0A=
			if ( m ) {=0A=
				var nodeName =3D m[1].toUpperCase();=0A=
=0A=
				// Perform our own iteration and filter=0A=
				for ( var i =3D 0; ret[i]; i++ )=0A=
					for ( var c =3D ret[i].firstChild; c; c =3D c.nextSibling )=0A=
						if ( c.nodeType =3D=3D 1 && (nodeName =3D=3D "*" || =
c.nodeName.toUpperCase() =3D=3D nodeName.toUpperCase()) )=0A=
							r.push( c );=0A=
=0A=
				ret =3D r;=0A=
				t =3D t.replace( re, "" );=0A=
				if ( t.indexOf(" ") =3D=3D 0 ) continue;=0A=
				foundToken =3D true;=0A=
			} else {=0A=
				re =3D /^([>+~])\s*(\w*)/i;=0A=
=0A=
				if ( (m =3D re.exec(t)) !=3D null ) {=0A=
					r =3D [];=0A=
=0A=
					var nodeName =3D m[2], merge =3D {};=0A=
					m =3D m[1];=0A=
=0A=
					for ( var j =3D 0, rl =3D ret.length; j < rl; j++ ) {=0A=
						var n =3D m =3D=3D "~" || m =3D=3D "+" ? ret[j].nextSibling : =
ret[j].firstChild;=0A=
						for ( ; n; n =3D n.nextSibling )=0A=
							if ( n.nodeType =3D=3D 1 ) {=0A=
								var id =3D jQuery.data(n);=0A=
=0A=
								if ( m =3D=3D "~" && merge[id] ) break;=0A=
								=0A=
								if (!nodeName || n.nodeName.toUpperCase() =3D=3D =
nodeName.toUpperCase() ) {=0A=
									if ( m =3D=3D "~" ) merge[id] =3D true;=0A=
									r.push( n );=0A=
								}=0A=
								=0A=
								if ( m =3D=3D "+" ) break;=0A=
							}=0A=
					}=0A=
=0A=
					ret =3D r;=0A=
=0A=
					// And remove the token=0A=
					t =3D jQuery.trim( t.replace( re, "" ) );=0A=
					foundToken =3D true;=0A=
				}=0A=
			}=0A=
=0A=
			// See if there's still an expression, and that we haven't already=0A=
			// matched a token=0A=
			if ( t && !foundToken ) {=0A=
				// Handle multiple expressions=0A=
				if ( !t.indexOf(",") ) {=0A=
					// Clean the result set=0A=
					if ( context =3D=3D ret[0] ) ret.shift();=0A=
=0A=
					// Merge the result sets=0A=
					done =3D jQuery.merge( done, ret );=0A=
=0A=
					// Reset the context=0A=
					r =3D ret =3D [context];=0A=
=0A=
					// Touch up the selector string=0A=
					t =3D " " + t.substr(1,t.length);=0A=
=0A=
				} else {=0A=
					// Optimize for the case nodeName#idName=0A=
					var re2 =3D quickID;=0A=
					var m =3D re2.exec(t);=0A=
					=0A=
					// Re-organize the results, so that they're consistent=0A=
					if ( m ) {=0A=
					   m =3D [ 0, m[2], m[3], m[1] ];=0A=
=0A=
					} else {=0A=
						// Otherwise, do a traditional filter check for=0A=
						// ID, class, and element selectors=0A=
						re2 =3D quickClass;=0A=
						m =3D re2.exec(t);=0A=
					}=0A=
=0A=
					m[2] =3D m[2].replace(/\\/g, "");=0A=
=0A=
					var elem =3D ret[ret.length-1];=0A=
=0A=
					// Try to do a global search by ID, where we can=0A=
					if ( m[1] =3D=3D "#" && elem && elem.getElementById && =
!jQuery.isXMLDoc(elem) ) {=0A=
						// Optimization for HTML document case=0A=
						var oid =3D elem.getElementById(m[2]);=0A=
						=0A=
						// Do a quick check for the existence of the actual ID attribute=0A=
						// to avoid selecting by the name attribute in IE=0A=
						// also check to insure id is a string to avoid selecting an =
element with the name of 'id' inside a form=0A=
						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof =
oid.id =3D=3D "string" && oid.id !=3D m[2] )=0A=
							oid =3D jQuery('[@id=3D"'+m[2]+'"]', elem)[0];=0A=
=0A=
						// Do a quick check for node name (where applicable) so=0A=
						// that div#foo searches will be really fast=0A=
						ret =3D r =3D oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] =
: [];=0A=
					} else {=0A=
						// We need to find all descendant elements=0A=
						for ( var i =3D 0; ret[i]; i++ ) {=0A=
							// Grab the tag name being searched for=0A=
							var tag =3D m[1] =3D=3D "#" && m[3] ? m[3] : m[1] !=3D "" || m[0] =
=3D=3D "" ? "*" : m[2];=0A=
=0A=
							// Handle IE7 being really dumb about <object>s=0A=
							if ( tag =3D=3D "*" && ret[i].nodeName.toLowerCase() =3D=3D =
"object" )=0A=
								tag =3D "param";=0A=
=0A=
							r =3D jQuery.merge( r, ret[i].getElementsByTagName( tag ));=0A=
						}=0A=
=0A=
						// It's faster to filter by class and be done with it=0A=
						if ( m[1] =3D=3D "." )=0A=
							r =3D jQuery.classFilter( r, m[2] );=0A=
=0A=
						// Same with ID filtering=0A=
						if ( m[1] =3D=3D "#" ) {=0A=
							var tmp =3D [];=0A=
=0A=
							// Try to find the element with the ID=0A=
							for ( var i =3D 0; r[i]; i++ )=0A=
								if ( r[i].getAttribute("id") =3D=3D m[2] ) {=0A=
									tmp =3D [ r[i] ];=0A=
									break;=0A=
								}=0A=
=0A=
							r =3D tmp;=0A=
						}=0A=
=0A=
						ret =3D r;=0A=
					}=0A=
=0A=
					t =3D t.replace( re2, "" );=0A=
				}=0A=
=0A=
			}=0A=
=0A=
			// If a selector string still exists=0A=
			if ( t ) {=0A=
				// Attempt to filter it=0A=
				var val =3D jQuery.filter(t,r);=0A=
				ret =3D r =3D val.r;=0A=
				t =3D jQuery.trim(val.t);=0A=
			}=0A=
		}=0A=
=0A=
		// An error occurred with the selector;=0A=
		// just return an empty set instead=0A=
		if ( t )=0A=
			ret =3D [];=0A=
=0A=
		// Remove the root context=0A=
		if ( ret && context =3D=3D ret[0] )=0A=
			ret.shift();=0A=
=0A=
		// And combine the results=0A=
		done =3D jQuery.merge( done, ret );=0A=
=0A=
		return done;=0A=
	},=0A=
=0A=
	classFilter: function(r,m,not){=0A=
		m =3D " " + m + " ";=0A=
		var tmp =3D [];=0A=
		for ( var i =3D 0; r[i]; i++ ) {=0A=
			var pass =3D (" " + r[i].className + " ").indexOf( m ) >=3D 0;=0A=
			if ( !not && pass || not && !pass )=0A=
				tmp.push( r[i] );=0A=
		}=0A=
		return tmp;=0A=
	},=0A=
=0A=
	filter: function(t,r,not) {=0A=
		var last;=0A=
=0A=
		// Look for common filter expressions=0A=
		while ( t  && t !=3D last ) {=0A=
			last =3D t;=0A=
=0A=
			var p =3D jQuery.parse, m;=0A=
=0A=
			for ( var i =3D 0; p[i]; i++ ) {=0A=
				m =3D p[i].exec( t );=0A=
=0A=
				if ( m ) {=0A=
					// Remove what we just matched=0A=
					t =3D t.substring( m[0].length );=0A=
=0A=
					m[2] =3D m[2].replace(/\\/g, "");=0A=
					break;=0A=
				}=0A=
			}=0A=
=0A=
			if ( !m )=0A=
				break;=0A=
=0A=
			// :not() is a special case that can be optimized by=0A=
			// keeping it out of the expression list=0A=
			if ( m[1] =3D=3D ":" && m[2] =3D=3D "not" )=0A=
				r =3D jQuery.filter(m[3], r, true).r;=0A=
=0A=
			// We can get a big speed boost by filtering by class here=0A=
			else if ( m[1] =3D=3D "." )=0A=
				r =3D jQuery.classFilter(r, m[2], not);=0A=
=0A=
			else if ( m[1] =3D=3D "[" ) {=0A=
				var tmp =3D [], type =3D m[3];=0A=
				=0A=
				for ( var i =3D 0, rl =3D r.length; i < rl; i++ ) {=0A=
					var a =3D r[i], z =3D a[ jQuery.props[m[2]] || m[2] ];=0A=
					=0A=
					if ( z =3D=3D null || /href|src|selected/.test(m[2]) )=0A=
						z =3D jQuery.attr(a,m[2]) || '';=0A=
=0A=
					if ( (type =3D=3D "" && !!z ||=0A=
						 type =3D=3D "=3D" && z =3D=3D m[5] ||=0A=
						 type =3D=3D "!=3D" && z !=3D m[5] ||=0A=
						 type =3D=3D "^=3D" && z && !z.indexOf(m[5]) ||=0A=
						 type =3D=3D "$=3D" && z.substr(z.length - m[5].length) =3D=3D =
m[5] ||=0A=
						 (type =3D=3D "*=3D" || type =3D=3D "~=3D") && z.indexOf(m[5]) =
>=3D 0) ^ not )=0A=
							tmp.push( a );=0A=
				}=0A=
				=0A=
				r =3D tmp;=0A=
=0A=
			// We can get a speed boost by handling nth-child here=0A=
			} else if ( m[1] =3D=3D ":" && m[2] =3D=3D "nth-child" ) {=0A=
				var merge =3D {}, tmp =3D [],=0A=
					test =3D /(\d*)n\+?(\d*)/.exec(=0A=
						m[3] =3D=3D "even" && "2n" || m[3] =3D=3D "odd" && "2n+1" ||=0A=
						!/\D/.test(m[3]) && "n+" + m[3] || m[3]),=0A=
					first =3D (test[1] || 1) - 0, last =3D test[2] - 0;=0A=
=0A=
				for ( var i =3D 0, rl =3D r.length; i < rl; i++ ) {=0A=
					var node =3D r[i], parentNode =3D node.parentNode, id =3D =
jQuery.data(parentNode);=0A=
=0A=
					if ( !merge[id] ) {=0A=
						var c =3D 1;=0A=
=0A=
						for ( var n =3D parentNode.firstChild; n; n =3D n.nextSibling )=0A=
							if ( n.nodeType =3D=3D 1 )=0A=
								n.nodeIndex =3D c++;=0A=
=0A=
						merge[id] =3D true;=0A=
					}=0A=
=0A=
					var add =3D false;=0A=
=0A=
					if ( first =3D=3D 1 ) {=0A=
						if ( last =3D=3D 0 || node.nodeIndex =3D=3D last )=0A=
							add =3D true;=0A=
					} else if ( (node.nodeIndex + last) % first =3D=3D 0 )=0A=
						add =3D true;=0A=
=0A=
					if ( add ^ not )=0A=
						tmp.push( node );=0A=
				}=0A=
=0A=
				r =3D tmp;=0A=
=0A=
			// Otherwise, find the expression to execute=0A=
			} else {=0A=
				var f =3D jQuery.expr[m[1]];=0A=
				if ( typeof f !=3D "string" )=0A=
					f =3D jQuery.expr[m[1]][m[2]];=0A=
=0A=
				// Build a custom macro to enclose it=0A=
				f =3D eval("false||function(a,i){return " + f + "}");=0A=
=0A=
				// Execute it against the current filter=0A=
				r =3D jQuery.grep( r, f, not );=0A=
			}=0A=
		}=0A=
=0A=
		// Return an array of filtered elements (r)=0A=
		// and the modified expression string (t)=0A=
		return { r: r, t: t };=0A=
	},=0A=
=0A=
	dir: function( elem, dir ){=0A=
		var matched =3D [];=0A=
		var cur =3D elem[dir];=0A=
		while ( cur && cur !=3D document ) {=0A=
			if ( cur.nodeType =3D=3D 1 )=0A=
				matched.push( cur );=0A=
			cur =3D cur[dir];=0A=
		}=0A=
		return matched;=0A=
	},=0A=
	=0A=
	nth: function(cur,result,dir,elem){=0A=
		result =3D result || 1;=0A=
		var num =3D 0;=0A=
=0A=
		for ( ; cur; cur =3D cur[dir] )=0A=
			if ( cur.nodeType =3D=3D 1 && ++num =3D=3D result )=0A=
				break;=0A=
=0A=
		return cur;=0A=
	},=0A=
	=0A=
	sibling: function( n, elem ) {=0A=
		var r =3D [];=0A=
=0A=
		for ( ; n; n =3D n.nextSibling ) {=0A=
			if ( n.nodeType =3D=3D 1 && (!elem || n !=3D elem) )=0A=
				r.push( n );=0A=
		}=0A=
=0A=
		return r;=0A=
	}=0A=
});=0A=
/*=0A=
 * A number of helper functions used for managing events.=0A=
 * Many of the ideas behind this code orignated from =0A=
 * Dean Edwards' addEvent library.=0A=
 */=0A=
jQuery.event =3D {=0A=
=0A=
	// Bind an event to an element=0A=
	// Original by Dean Edwards=0A=
	add: function(element, type, handler, data) {=0A=
		// For whatever reason, IE has trouble passing the window object=0A=
		// around, causing it to be cloned in the process=0A=
		if ( jQuery.browser.msie && element.setInterval !=3D undefined )=0A=
			element =3D window;=0A=
=0A=
		// Make sure that the function being executed has a unique ID=0A=
		if ( !handler.guid )=0A=
			handler.guid =3D this.guid++;=0A=
			=0A=
		// if data is passed, bind to handler =0A=
		if( data !=3D undefined ) { =0A=
        		// Create temporary function pointer to original handler =0A=
			var fn =3D handler; =0A=
=0A=
			// Create unique handler function, wrapped around original handler =0A=
			handler =3D function() { =0A=
				// Pass arguments and context to original handler =0A=
				return fn.apply(this, arguments); =0A=
			};=0A=
=0A=
			// Store data in unique handler =0A=
			handler.data =3D data;=0A=
=0A=
			// Set the guid of unique handler to the same of original handler, so =
it can be removed =0A=
			handler.guid =3D fn.guid;=0A=
		}=0A=
=0A=
		// Namespaced event handlers=0A=
		var parts =3D type.split(".");=0A=
		type =3D parts[0];=0A=
		handler.type =3D parts[1];=0A=
=0A=
		// Init the element's event structure=0A=
		var events =3D jQuery.data(element, "events") || jQuery.data(element, =
"events", {});=0A=
		=0A=
		var handle =3D jQuery.data(element, "handle", function(){=0A=
			// returned undefined or false=0A=
			var val;=0A=
=0A=
			// Handle the second event of a trigger and when=0A=
			// an event is called after a page has unloaded=0A=
			if ( typeof jQuery =3D=3D "undefined" || jQuery.event.triggered )=0A=
				return val;=0A=
			=0A=
			val =3D jQuery.event.handle.apply(element, arguments);=0A=
			=0A=
			return val;=0A=
		});=0A=
=0A=
		// Get the current list of functions bound to this event=0A=
		var handlers =3D events[type];=0A=
=0A=
		// Init the event handler queue=0A=
		if (!handlers) {=0A=
			handlers =3D events[type] =3D {};	=0A=
			=0A=
			// And bind the global event handler to the element=0A=
			if (element.addEventListener)=0A=
				element.addEventListener(type, handle, false);=0A=
			else=0A=
				element.attachEvent("on" + type, handle);=0A=
		}=0A=
=0A=
		// Add the function to the element's handler list=0A=
		handlers[handler.guid] =3D handler;=0A=
=0A=
		// Keep track of which events have been used, for global triggering=0A=
		this.global[type] =3D true;=0A=
	},=0A=
=0A=
	guid: 1,=0A=
	global: {},=0A=
=0A=
	// Detach an event or set of events from an element=0A=
	remove: function(element, type, handler) {=0A=
		var events =3D jQuery.data(element, "events"), ret, index;=0A=
=0A=
		// Namespaced event handlers=0A=
		if ( typeof type =3D=3D "string" ) {=0A=
			var parts =3D type.split(".");=0A=
			type =3D parts[0];=0A=
		}=0A=
=0A=
		if ( events ) {=0A=
			// type is actually an event object here=0A=
			if ( type && type.type ) {=0A=
				handler =3D type.handler;=0A=
				type =3D type.type;=0A=
			}=0A=
			=0A=
			if ( !type ) {=0A=
				for ( type in events )=0A=
					this.remove( element, type );=0A=
=0A=
			} else if ( events[type] ) {=0A=
				// remove the given handler for the given type=0A=
				if ( handler )=0A=
					delete events[type][handler.guid];=0A=
				=0A=
				// remove all handlers for the given type=0A=
				else=0A=
					for ( handler in events[type] )=0A=
						// Handle the removal of namespaced events=0A=
						if ( !parts[1] || events[type][handler].type =3D=3D parts[1] )=0A=
							delete events[type][handler];=0A=
=0A=
				// remove generic event handler if no more handlers exist=0A=
				for ( ret in events[type] ) break;=0A=
				if ( !ret ) {=0A=
					if (element.removeEventListener)=0A=
						element.removeEventListener(type, jQuery.data(element, "handle"), =
false);=0A=
					else=0A=
						element.detachEvent("on" + type, jQuery.data(element, "handle"));=0A=
					ret =3D null;=0A=
					delete events[type];=0A=
				}=0A=
			}=0A=
=0A=
			// Remove the expando if it's no longer used=0A=
			for ( ret in events ) break;=0A=
			if ( !ret ) {=0A=
				jQuery.removeData( element, "events" );=0A=
				jQuery.removeData( element, "handle" );=0A=
			}=0A=
		}=0A=
	},=0A=
=0A=
	trigger: function(type, data, element, donative, extra) {=0A=
		// Clone the incoming data, if any=0A=
		data =3D jQuery.makeArray(data || []);=0A=
=0A=
		// Handle a global trigger=0A=
		if ( !element ) {=0A=
			// Only trigger if we've ever bound an event for it=0A=
			if ( this.global[type] )=0A=
				jQuery("*").add([window, document]).trigger(type, data);=0A=
=0A=
		// Handle triggering a single element=0A=
		} else {=0A=
			var val, ret, fn =3D jQuery.isFunction( element[ type ] || null ),=0A=
				// Check to see if we need to provide a fake event, or not=0A=
				evt =3D !data[0] || !data[0].preventDefault;=0A=
			=0A=
			// Pass along a fake event=0A=
			if ( evt )=0A=
				data.unshift( this.fix({ type: type, target: element }) );=0A=
=0A=
			// Enforce the right trigger type=0A=
			data[0].type =3D type;=0A=
=0A=
			// Trigger the event=0A=
			if ( jQuery.isFunction( jQuery.data(element, "handle") ) )=0A=
				val =3D jQuery.data(element, "handle").apply( element, data );=0A=
=0A=
			// Handle triggering native .onfoo handlers=0A=
			if ( !fn && element["on"+type] && element["on"+type].apply( element, =
data ) =3D=3D=3D false )=0A=
				val =3D false;=0A=
=0A=
			// Extra functions don't get the custom event object=0A=
			if ( evt )=0A=
				data.shift();=0A=
=0A=
			// Handle triggering of extra function=0A=
			if ( extra && extra.apply( element, data ) =3D=3D=3D false )=0A=
				val =3D false;=0A=
=0A=
			// Trigger the native events (except for clicks on links)=0A=
			if ( fn && donative !=3D=3D false && val !=3D=3D false && =
!(jQuery.nodeName(element, 'a') && type =3D=3D "click") ) {=0A=
				this.triggered =3D true;=0A=
				element[ type ]();=0A=
			}=0A=
=0A=
			this.triggered =3D false;=0A=
		}=0A=
=0A=
		return val;=0A=
	},=0A=
=0A=
	handle: function(event) {=0A=
		// returned undefined or false=0A=
		var val;=0A=
=0A=
		// Empty object is for triggered events with no data=0A=
		event =3D jQuery.event.fix( event || window.event || {} ); =0A=
=0A=
		// Namespaced event handlers=0A=
		var parts =3D event.type.split(".");=0A=
		event.type =3D parts[0];=0A=
=0A=
		var c =3D jQuery.data(this, "events") && jQuery.data(this, =
"events")[event.type], args =3D Array.prototype.slice.call( arguments, 1 =
);=0A=
		args.unshift( event );=0A=
=0A=
		for ( var j in c ) {=0A=
			// Pass in a reference to the handler function itself=0A=
			// So that we can later remove it=0A=
			args[0].handler =3D c[j];=0A=
			args[0].data =3D c[j].data;=0A=
=0A=
			// Filter the functions by class=0A=
			if ( !parts[1] || c[j].type =3D=3D parts[1] ) {=0A=
				var tmp =3D c[j].apply( this, args );=0A=
=0A=
				if ( val !=3D=3D false )=0A=
					val =3D tmp;=0A=
=0A=
				if ( tmp =3D=3D=3D false ) {=0A=
					event.preventDefault();=0A=
					event.stopPropagation();=0A=
				}=0A=
			}=0A=
		}=0A=
=0A=
		// Clean up added properties in IE to prevent memory leak=0A=
		if (jQuery.browser.msie)=0A=
			event.target =3D event.preventDefault =3D event.stopPropagation =3D=0A=
				event.handler =3D event.data =3D null;=0A=
=0A=
		return val;=0A=
	},=0A=
=0A=
	fix: function(event) {=0A=
		// store a copy of the original event object =0A=
		// and clone to set read-only properties=0A=
		var originalEvent =3D event;=0A=
		event =3D jQuery.extend({}, originalEvent);=0A=
		=0A=
		// add preventDefault and stopPropagation since =0A=
		// they will not work on the clone=0A=
		event.preventDefault =3D function() {=0A=
			// if preventDefault exists run it on the original event=0A=
			if (originalEvent.preventDefault)=0A=
				originalEvent.preventDefault();=0A=
			// otherwise set the returnValue property of the original event to =
false (IE)=0A=
			originalEvent.returnValue =3D false;=0A=
		};=0A=
		event.stopPropagation =3D function() {=0A=
			// if stopPropagation exists run it on the original event=0A=
			if (originalEvent.stopPropagation)=0A=
				originalEvent.stopPropagation();=0A=
			// otherwise set the cancelBubble property of the original event to =
true (IE)=0A=
			originalEvent.cancelBubble =3D true;=0A=
		};=0A=
		=0A=
		// Fix target property, if necessary=0A=
		if ( !event.target && event.srcElement )=0A=
			event.target =3D event.srcElement;=0A=
				=0A=
		// check if target is a textnode (safari)=0A=
		if (jQuery.browser.safari && event.target.nodeType =3D=3D 3)=0A=
			event.target =3D originalEvent.target.parentNode;=0A=
=0A=
		// Add relatedTarget, if necessary=0A=
		if ( !event.relatedTarget && event.fromElement )=0A=
			event.relatedTarget =3D event.fromElement =3D=3D event.target ? =
event.toElement : event.fromElement;=0A=
=0A=
		// Calculate pageX/Y if missing and clientX/Y available=0A=
		if ( event.pageX =3D=3D null && event.clientX !=3D null ) {=0A=
			var e =3D document.documentElement, b =3D document.body;=0A=
			event.pageX =3D event.clientX + (e && e.scrollLeft || b.scrollLeft || =
0);=0A=
			event.pageY =3D event.clientY + (e && e.scrollTop || b.scrollTop || =
0);=0A=
		}=0A=
			=0A=
		// Add which for key events=0A=
		if ( !event.which && (event.charCode || event.keyCode) )=0A=
			event.which =3D event.charCode || event.keyCode;=0A=
		=0A=
		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for =
Macs)=0A=
		if ( !event.metaKey && event.ctrlKey )=0A=
			event.metaKey =3D event.ctrlKey;=0A=
=0A=
		// Add which for click: 1 =3D=3D left; 2 =3D=3D middle; 3 =3D=3D right=0A=
		// Note: button is not normalized, so don't use it=0A=
		if ( !event.which && event.button )=0A=
			event.which =3D (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( =
event.button & 4 ? 2 : 0 ) ));=0A=
			=0A=
		return event;=0A=
	}=0A=
};=0A=
=0A=
jQuery.fn.extend({=0A=
	bind: function( type, data, fn ) {=0A=
		return type =3D=3D "unload" ? this.one(type, data, fn) : =
this.each(function(){=0A=
			jQuery.event.add( this, type, fn || data, fn && data );=0A=
		});=0A=
	},=0A=
	=0A=
	one: function( type, data, fn ) {=0A=
		return this.each(function(){=0A=
			jQuery.event.add( this, type, function(event) {=0A=
				jQuery(this).unbind(event);=0A=
				return (fn || data).apply( this, arguments);=0A=
			}, fn && data);=0A=
		});=0A=
	},=0A=
=0A=
	unbind: function( type, fn ) {=0A=
		return this.each(function(){=0A=
			jQuery.event.remove( this, type, fn );=0A=
		});=0A=
	},=0A=
=0A=
	trigger: function( type, data, fn ) {=0A=
		return this.each(function(){=0A=
			jQuery.event.trigger( type, data, this, true, fn );=0A=
		});=0A=
	},=0A=
=0A=
	triggerHandler: function( type, data, fn ) {=0A=
		if ( this[0] )=0A=
			return jQuery.event.trigger( type, data, this[0], false, fn );=0A=
	},=0A=
=0A=
	toggle: function() {=0A=
		// Save reference to arguments for access in closure=0A=
		var a =3D arguments;=0A=
=0A=
		return this.click(function(e) {=0A=
			// Figure out which function to execute=0A=
			this.lastToggle =3D 0 =3D=3D this.lastToggle ? 1 : 0;=0A=
			=0A=
			// Make sure that clicks stop=0A=
			e.preventDefault();=0A=
			=0A=
			// and execute the function=0A=
			return a[this.lastToggle].apply( this, [e] ) || false;=0A=
		});=0A=
	},=0A=
=0A=
	hover: function(f,g) {=0A=
		=0A=
		// A private function for handling mouse 'hovering'=0A=
		function handleHover(e) {=0A=
			// Check if mouse(over|out) are still within the same parent element=0A=
			var p =3D e.relatedTarget;=0A=
	=0A=
			// Traverse up the tree=0A=
			while ( p && p !=3D this ) try { p =3D p.parentNode; } catch(e) { p =
=3D this; };=0A=
			=0A=
			// If we actually just moused on to a sub-element, ignore it=0A=
			if ( p =3D=3D this ) return false;=0A=
			=0A=
			// Execute the right function=0A=
			return (e.type =3D=3D "mouseover" ? f : g).apply(this, [e]);=0A=
		}=0A=
		=0A=
		// Bind the function to the two event listeners=0A=
		return this.mouseover(handleHover).mouseout(handleHover);=0A=
	},=0A=
	=0A=
	ready: function(f) {=0A=
		// Attach the listeners=0A=
		bindReady();=0A=
=0A=
		// If the DOM is already ready=0A=
		if ( jQuery.isReady )=0A=
			// Execute the function immediately=0A=
			f.apply( document, [jQuery] );=0A=
			=0A=
		// Otherwise, remember the function for later=0A=
		else=0A=
			// Add the function to the wait list=0A=
			jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } =
);=0A=
	=0A=
		return this;=0A=
	}=0A=
});=0A=
=0A=
jQuery.extend({=0A=
	/*=0A=
	 * All the code that makes DOM Ready work nicely.=0A=
	 */=0A=
	isReady: false,=0A=
	readyList: [],=0A=
	=0A=
	// Handle when the DOM is ready=0A=
	ready: function() {=0A=
		// Make sure that the DOM is not already loaded=0A=
		if ( !jQuery.isReady ) {=0A=
			// Remember that the DOM is ready=0A=
			jQuery.isReady =3D true;=0A=
			=0A=
			// If there are functions bound, to execute=0A=
			if ( jQuery.readyList ) {=0A=
				// Execute all of them=0A=
				jQuery.each( jQuery.readyList, function(){=0A=
					this.apply( document );=0A=
				});=0A=
				=0A=
				// Reset the list of functions=0A=
				jQuery.readyList =3D null;=0A=
			}=0A=
			// Remove event listener to avoid memory leak=0A=
			if ( jQuery.browser.mozilla || jQuery.browser.opera )=0A=
				document.removeEventListener( "DOMContentLoaded", jQuery.ready, =
false );=0A=
			=0A=
			// Remove script element used by IE hack=0A=
			if( !window.frames.length ) // don't remove if frames are present =
(#1187)=0A=
				jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });=0A=
		}=0A=
	}=0A=
});=0A=
=0A=
jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +=0A=
	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + =0A=
	"submit,keydown,keypress,keyup,error").split(","), function(i,o){=0A=
	=0A=
	// Handle event binding=0A=
	jQuery.fn[o] =3D function(f){=0A=
		return f ? this.bind(o, f) : this.trigger(o);=0A=
	};=0A=
});=0A=
=0A=
var readyBound =3D false;=0A=
=0A=
function bindReady(){=0A=
	if ( readyBound ) return;=0A=
	readyBound =3D true;=0A=
=0A=
	// If Mozilla is used=0A=
	if ( jQuery.browser.mozilla || jQuery.browser.opera )=0A=
		// Use the handy event callback=0A=
		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );=0A=
	=0A=
	// If IE is used, use the excellent hack by Matthias Miller=0A=
	// =
http://www.outofhanwell.com/blog/index.php?title=3Dthe_window_onload_prob=
lem_revisited=0A=
	else if ( jQuery.browser.msie ) {=0A=
	=0A=
		// Only works if you document.write() it=0A=
		document.write("<scr" + "ipt id=3D__ie_init defer=3Dtrue " + =0A=
			"src=3D//:><\/script>");=0A=
	=0A=
		// Use the defer script hack=0A=
		var script =3D document.getElementById("__ie_init");=0A=
		=0A=
		// script does not exist if jQuery is loaded dynamically=0A=
		if ( script ) =0A=
			script.onreadystatechange =3D function() {=0A=
				if ( this.readyState !=3D "complete" ) return;=0A=
				jQuery.ready();=0A=
			};=0A=
	=0A=
		// Clear from memory=0A=
		script =3D null;=0A=
	=0A=
	// If Safari  is used=0A=
	} else if ( jQuery.browser.safari )=0A=
		// Continually check to see if the document.readyState is valid=0A=
		jQuery.safariTimer =3D setInterval(function(){=0A=
			// loaded and complete are both valid states=0A=
			if ( document.readyState =3D=3D "loaded" || =0A=
				document.readyState =3D=3D "complete" ) {=0A=
	=0A=
				// If either one are found, remove the timer=0A=
				clearInterval( jQuery.safariTimer );=0A=
				jQuery.safariTimer =3D null;=0A=
	=0A=
				// and execute any waiting functions=0A=
				jQuery.ready();=0A=
			}=0A=
		}, 10); =0A=
=0A=
	// A fallback to window.onload, that will always work=0A=
	jQuery.event.add( window, "load", jQuery.ready );=0A=
}=0A=
jQuery.fn.extend({=0A=
	load: function( url, params, callback ) {=0A=
		if ( jQuery.isFunction( url ) )=0A=
			return this.bind("load", url);=0A=
=0A=
		var off =3D url.indexOf(" ");=0A=
		if ( off >=3D 0 ) {=0A=
			var selector =3D url.slice(off, url.length);=0A=
			url =3D url.slice(0, off);=0A=
		}=0A=
=0A=
		callback =3D callback || function(){};=0A=
=0A=
		// Default to a GET request=0A=
		var type =3D "GET";=0A=
=0A=
		// If the second parameter was provided=0A=
		if ( params )=0A=
			// If it's a function=0A=
			if ( jQuery.isFunction( params ) ) {=0A=
				// We assume that it's the callback=0A=
				callback =3D params;=0A=
				params =3D null;=0A=
=0A=
			// Otherwise, build a param string=0A=
			} else {=0A=
				params =3D jQuery.param( params );=0A=
				type =3D "POST";=0A=
			}=0A=
=0A=
		var self =3D this;=0A=
=0A=
		// Request the remote document=0A=
		jQuery.ajax({=0A=
			url: url,=0A=
			type: type,=0A=
			data: params,=0A=
			complete: function(res, status){=0A=
				// If successful, inject the HTML into all the matched elements=0A=
				if ( status =3D=3D "success" || status =3D=3D "notmodified" )=0A=
					// See if a selector was specified=0A=
					self.html( selector ?=0A=
						// Create a dummy div to hold the results=0A=
						jQuery("<div/>")=0A=
							// inject the contents of the document in, removing the scripts=0A=
							// to avoid any 'Permission Denied' errors in IE=0A=
							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))=0A=
=0A=
							// Locate the specified elements=0A=
							.find(selector) :=0A=
=0A=
						// If not, just inject the full result=0A=
						res.responseText );=0A=
=0A=
				// Add delay to account for Safari's delay in globalEval=0A=
				setTimeout(function(){=0A=
					self.each( callback, [res.responseText, status, res] );=0A=
				}, 13);=0A=
			}=0A=
		});=0A=
		return this;=0A=
	},=0A=
=0A=
	serialize: function() {=0A=
		return jQuery.param(this.serializeArray());=0A=
	},=0A=
	serializeArray: function() {=0A=
		return this.map(function(){=0A=
			return jQuery.nodeName(this, "form") ?=0A=
				jQuery.makeArray(this.elements) : this;=0A=
		})=0A=
		.filter(function(){=0A=
			return this.name && !this.disabled && =0A=
				(this.checked || /select|textarea/i.test(this.nodeName) || =0A=
					/text|hidden|password/i.test(this.type));=0A=
		})=0A=
		.map(function(i, elem){=0A=
			var val =3D jQuery(this).val();=0A=
			return val =3D=3D null ? null :=0A=
				val.constructor =3D=3D Array ?=0A=
					jQuery.map( val, function(val, i){=0A=
						return {name: elem.name, value: val};=0A=
					}) :=0A=
					{name: elem.name, value: val};=0A=
		}).get();=0A=
	}=0A=
});=0A=
=0A=
// Attach a bunch of functions for handling common AJAX events=0A=
jQuery.each( =
"ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(",=
"), function(i,o){=0A=
	jQuery.fn[o] =3D function(f){=0A=
		return this.bind(o, f);=0A=
	};=0A=
});=0A=
=0A=
var jsc =3D (new Date).getTime();=0A=
=0A=
jQuery.extend({=0A=
	get: function( url, data, callback, type ) {=0A=
		// shift arguments if data argument was ommited=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			callback =3D data;=0A=
			data =3D null;=0A=
		}=0A=
		=0A=
		return jQuery.ajax({=0A=
			type: "GET",=0A=
			url: url,=0A=
			data: data,=0A=
			success: callback,=0A=
			dataType: type=0A=
		});=0A=
	},=0A=
=0A=
	getScript: function( url, callback ) {=0A=
		return jQuery.get(url, null, callback, "script");=0A=
	},=0A=
=0A=
	getJSON: function( url, data, callback ) {=0A=
		return jQuery.get(url, data, callback, "json");=0A=
	},=0A=
=0A=
	post: function( url, data, callback, type ) {=0A=
		if ( jQuery.isFunction( data ) ) {=0A=
			callback =3D data;=0A=
			data =3D {};=0A=
		}=0A=
=0A=
		return jQuery.ajax({=0A=
			type: "POST",=0A=
			url: url,=0A=
			data: data,=0A=
			success: callback,=0A=
			dataType: type=0A=
		});=0A=
	},=0A=
=0A=
	ajaxSetup: function( settings ) {=0A=
		jQuery.extend( jQuery.ajaxSettings, settings );=0A=
	},=0A=
=0A=
	ajaxSettings: {=0A=
		global: true,=0A=
		type: "GET",=0A=
		timeout: 0,=0A=
		contentType: "application/x-www-form-urlencoded",=0A=
		processData: true,=0A=
		async: true,=0A=
		data: null=0A=
	},=0A=
	=0A=
	// Last-Modified header cache for next request=0A=
	lastModified: {},=0A=
=0A=
	ajax: function( s ) {=0A=
		var jsonp, jsre =3D /=3D(\?|%3F)/g, status, data;=0A=
=0A=
		// Extend the settings, but re-extend 's' so that it can be=0A=
		// checked again later (in the test suite, specifically)=0A=
		s =3D jQuery.extend(true, s, jQuery.extend(true, {}, =
jQuery.ajaxSettings, s));=0A=
=0A=
		// convert data if not already a string=0A=
		if ( s.data && s.processData && typeof s.data !=3D "string" )=0A=
			s.data =3D jQuery.param(s.data);=0A=
=0A=
		// Handle JSONP Parameter Callbacks=0A=
		if ( s.dataType =3D=3D "jsonp" ) {=0A=
			if ( s.type.toLowerCase() =3D=3D "get" ) {=0A=
				if ( !s.url.match(jsre) )=0A=
					s.url +=3D (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || =
"callback") + "=3D?";=0A=
			} else if ( !s.data || !s.data.match(jsre) )=0A=
				s.data =3D (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + =
"=3D?";=0A=
			s.dataType =3D "json";=0A=
		}=0A=
=0A=
		// Build temporary JSONP function=0A=
		if ( s.dataType =3D=3D "json" && (s.data && s.data.match(jsre) || =
s.url.match(jsre)) ) {=0A=
			jsonp =3D "jsonp" + jsc++;=0A=
=0A=
			// Replace the =3D? sequence both in the query string and the data=0A=
			if ( s.data )=0A=
				s.data =3D s.data.replace(jsre, "=3D" + jsonp);=0A=
			s.url =3D s.url.replace(jsre, "=3D" + jsonp);=0A=
=0A=
			// We need to make sure=0A=
			// that a JSONP style response is executed properly=0A=
			s.dataType =3D "script";=0A=
=0A=
			// Handle JSONP-style loading=0A=
			window[ jsonp ] =3D function(tmp){=0A=
				data =3D tmp;=0A=
				success();=0A=
				complete();=0A=
				// Garbage collect=0A=
				window[ jsonp ] =3D undefined;=0A=
				try{ delete window[ jsonp ]; } catch(e){}=0A=
			};=0A=
		}=0A=
=0A=
		if ( s.dataType =3D=3D "script" && s.cache =3D=3D null )=0A=
			s.cache =3D false;=0A=
=0A=
		if ( s.cache =3D=3D=3D false && s.type.toLowerCase() =3D=3D "get" )=0A=
			s.url +=3D (s.url.match(/\?/) ? "&" : "?") + "_=3D" + (new =
Date()).getTime();=0A=
=0A=
		// If data is available, append data to url for get requests=0A=
		if ( s.data && s.type.toLowerCase() =3D=3D "get" ) {=0A=
			s.url +=3D (s.url.match(/\?/) ? "&" : "?") + s.data;=0A=
=0A=
			// IE likes to send both get and post data, prevent this=0A=
			s.data =3D null;=0A=
		}=0A=
=0A=
		// Watch for a new set of requests=0A=
		if ( s.global && ! jQuery.active++ )=0A=
			jQuery.event.trigger( "ajaxStart" );=0A=
=0A=
		// If we're requesting a remote document=0A=
		// and trying to load JSON or Script=0A=
		if ( !s.url.indexOf("http") && s.dataType =3D=3D "script" ) {=0A=
			var head =3D document.getElementsByTagName("head")[0];=0A=
			var script =3D document.createElement("script");=0A=
			script.src =3D s.url;=0A=
=0A=
			// Handle Script loading=0A=
			if ( !jsonp && (s.success || s.complete) ) {=0A=
				var done =3D false;=0A=
=0A=
				// Attach handlers for all browsers=0A=
				script.onload =3D script.onreadystatechange =3D function(){=0A=
					if ( !done && (!this.readyState || =0A=
							this.readyState =3D=3D "loaded" || this.readyState =3D=3D =
"complete") ) {=0A=
						done =3D true;=0A=
						success();=0A=
						complete();=0A=
						head.removeChild( script );=0A=
					}=0A=
				};=0A=
			}=0A=
=0A=
			head.appendChild(script);=0A=
=0A=
			// We handle everything using the script element injection=0A=
			return;=0A=
		}=0A=
=0A=
		var requestDone =3D false;=0A=
=0A=
		// Create the request object; Microsoft failed to properly=0A=
		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject =
when it is available=0A=
		var xml =3D window.ActiveXObject ? new =
ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();=0A=
=0A=
		// Open the socket=0A=
		xml.open(s.type, s.url, s.async);=0A=
=0A=
		// Set the correct header, if data is being sent=0A=
		if ( s.data )=0A=
			xml.setRequestHeader("Content-Type", s.contentType);=0A=
=0A=
		// Set the If-Modified-Since header, if ifModified mode.=0A=
		if ( s.ifModified )=0A=
			xml.setRequestHeader("If-Modified-Since",=0A=
				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );=0A=
=0A=
		// Set header so the called script knows that it's an XMLHttpRequest=0A=
		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");=0A=
=0A=
		// Allow custom headers/mimetypes=0A=
		if ( s.beforeSend )=0A=
			s.beforeSend(xml);=0A=
			=0A=
		if ( s.global )=0A=
		    jQuery.event.trigger("ajaxSend", [xml, s]);=0A=
=0A=
		// Wait for a response to come back=0A=
		var onreadystatechange =3D function(isTimeout){=0A=
			// The transfer is complete and the data is available, or the request =
timed out=0A=
			if ( !requestDone && xml && (xml.readyState =3D=3D 4 || isTimeout =
=3D=3D "timeout") ) {=0A=
				requestDone =3D true;=0A=
				=0A=
				// clear poll interval=0A=
				if (ival) {=0A=
					clearInterval(ival);=0A=
					ival =3D null;=0A=
				}=0A=
				=0A=
				status =3D isTimeout =3D=3D "timeout" && "timeout" ||=0A=
					!jQuery.httpSuccess( xml ) && "error" ||=0A=
					s.ifModified && jQuery.httpNotModified( xml, s.url ) && =
"notmodified" ||=0A=
					"success";=0A=
=0A=
				if ( status =3D=3D "success" ) {=0A=
					// Watch for, and catch, XML document parse errors=0A=
					try {=0A=
						// process the data (runs the xml through httpData regardless of =
callback)=0A=
						data =3D jQuery.httpData( xml, s.dataType );=0A=
					} catch(e) {=0A=
						status =3D "parsererror";=0A=
					}=0A=
				}=0A=
=0A=
				// Make sure that the request was successful or notmodified=0A=
				if ( status =3D=3D "success" ) {=0A=
					// Cache Last-Modified header, if ifModified mode.=0A=
					var modRes;=0A=
					try {=0A=
						modRes =3D xml.getResponseHeader("Last-Modified");=0A=
					} catch(e) {} // swallow exception thrown by FF if header is not =
available=0A=
	=0A=
					if ( s.ifModified && modRes )=0A=
						jQuery.lastModified[s.url] =3D modRes;=0A=
=0A=
					// JSONP handles its own success callback=0A=
					if ( !jsonp )=0A=
						success();	=0A=
				} else=0A=
					jQuery.handleError(s, xml, status);=0A=
=0A=
				// Fire the complete handlers=0A=
				complete();=0A=
=0A=
				// Stop memory leaks=0A=
				if ( s.async )=0A=
					xml =3D null;=0A=
			}=0A=
		};=0A=
		=0A=
		if ( s.async ) {=0A=
			// don't attach the handler to the request, just poll it instead=0A=
			var ival =3D setInterval(onreadystatechange, 13); =0A=
=0A=
			// Timeout checker=0A=
			if ( s.timeout > 0 )=0A=
				setTimeout(function(){=0A=
					// Check to see if the request is still happening=0A=
					if ( xml ) {=0A=
						// Cancel the request=0A=
						xml.abort();=0A=
	=0A=
						if( !requestDone )=0A=
							onreadystatechange( "timeout" );=0A=
					}=0A=
				}, s.timeout);=0A=
		}=0A=
			=0A=
		// Send the data=0A=
		try {=0A=
			xml.send(s.data);=0A=
		} catch(e) {=0A=
			jQuery.handleError(s, xml, null, e);=0A=
		}=0A=
		=0A=
		// firefox 1.5 doesn't fire statechange for sync requests=0A=
		if ( !s.async )=0A=
			onreadystatechange();=0A=
		=0A=
		// return XMLHttpRequest to allow aborting the request etc.=0A=
		return xml;=0A=
=0A=
		function success(){=0A=
			// If a local callback was specified, fire it and pass it the data=0A=
			if ( s.success )=0A=
				s.success( data, status );=0A=
=0A=
			// Fire the global callback=0A=
			if ( s.global )=0A=
				jQuery.event.trigger( "ajaxSuccess", [xml, s] );=0A=
		}=0A=
=0A=
		function complete(){=0A=
			// Process result=0A=
			if ( s.complete )=0A=
				s.complete(xml, status);=0A=
=0A=
			// The request was completed=0A=
			if ( s.global )=0A=
				jQuery.event.trigger( "ajaxComplete", [xml, s] );=0A=
=0A=
			// Handle the global AJAX counter=0A=
			if ( s.global && ! --jQuery.active )=0A=
				jQuery.event.trigger( "ajaxStop" );=0A=
		}=0A=
	},=0A=
=0A=
	handleError: function( s, xml, status, e ) {=0A=
		// If a local callback was specified, fire it=0A=
		if ( s.error ) s.error( xml, status, e );=0A=
=0A=
		// Fire the global callback=0A=
		if ( s.global )=0A=
			jQuery.event.trigger( "ajaxError", [xml, s, e] );=0A=
	},=0A=
=0A=
	// Counter for holding the number of active queries=0A=
	active: 0,=0A=
=0A=
	// Determines if an XMLHttpRequest was successful or not=0A=
	httpSuccess: function( r ) {=0A=
		try {=0A=
			return !r.status && location.protocol =3D=3D "file:" ||=0A=
				( r.status >=3D 200 && r.status < 300 ) || r.status =3D=3D 304 ||=0A=
				jQuery.browser.safari && r.status =3D=3D undefined;=0A=
		} catch(e){}=0A=
		return false;=0A=
	},=0A=
=0A=
	// Determines if an XMLHttpRequest returns NotModified=0A=
	httpNotModified: function( xml, url ) {=0A=
		try {=0A=
			var xmlRes =3D xml.getResponseHeader("Last-Modified");=0A=
=0A=
			// Firefox always returns 200. check Last-Modified date=0A=
			return xml.status =3D=3D 304 || xmlRes =3D=3D =
jQuery.lastModified[url] ||=0A=
				jQuery.browser.safari && xml.status =3D=3D undefined;=0A=
		} catch(e){}=0A=
		return false;=0A=
	},=0A=
=0A=
	httpData: function( r, type ) {=0A=
		var ct =3D r.getResponseHeader("content-type");=0A=
		var xml =3D type =3D=3D "xml" || !type && ct && ct.indexOf("xml") >=3D =
0;=0A=
		var data =3D xml ? r.responseXML : r.responseText;=0A=
=0A=
		if ( xml && data.documentElement.tagName =3D=3D "parsererror" )=0A=
			throw "parsererror";=0A=
=0A=
		// If the type is "script", eval it in global context=0A=
		if ( type =3D=3D "script" )=0A=
			jQuery.globalEval( data );=0A=
=0A=
		// Get the JavaScript object, if JSON is used.=0A=
		if ( type =3D=3D "json" )=0A=
			data =3D eval("(" + data + ")");=0A=
=0A=
		return data;=0A=
	},=0A=
=0A=
	// Serialize an array of form elements or a set of=0A=
	// key/values into a query string=0A=
	param: function( a ) {=0A=
		var s =3D [];=0A=
=0A=
		// If an array was passed in, assume that it is an array=0A=
		// of form elements=0A=
		if ( a.constructor =3D=3D Array || a.jquery )=0A=
			// Serialize the form elements=0A=
			jQuery.each( a, function(){=0A=
				s.push( encodeURIComponent(this.name) + "=3D" + encodeURIComponent( =
this.value ) );=0A=
			});=0A=
=0A=
		// Otherwise, assume that it's an object of key/value pairs=0A=
		else=0A=
			// Serialize the key/values=0A=
			for ( var j in a )=0A=
				// If the value is an array then the key names need to be repeated=0A=
				if ( a[j] && a[j].constructor =3D=3D Array )=0A=
					jQuery.each( a[j], function(){=0A=
						s.push( encodeURIComponent(j) + "=3D" + encodeURIComponent( this ) =
);=0A=
					});=0A=
				else=0A=
					s.push( encodeURIComponent(j) + "=3D" + encodeURIComponent( a[j] ) =
);=0A=
=0A=
		// Return the resulting serialization=0A=
		return s.join("&").replace(/%20/g, "+");=0A=
	}=0A=
=0A=
});=0A=
jQuery.fn.extend({=0A=
	show: function(speed,callback){=0A=
		return speed ?=0A=
			this.animate({=0A=
				height: "show", width: "show", opacity: "show"=0A=
			}, speed, callback) :=0A=
			=0A=
			this.filter(":hidden").each(function(){=0A=
				this.style.display =3D this.oldblock ? this.oldblock : "";=0A=
				if ( jQuery.css(this,"display") =3D=3D "none" )=0A=
					this.style.display =3D "block";=0A=
			}).end();=0A=
	},=0A=
	=0A=
	hide: function(speed,callback){=0A=
		return speed ?=0A=
			this.animate({=0A=
				height: "hide", width: "hide", opacity: "hide"=0A=
			}, speed, callback) :=0A=
			=0A=
			this.filter(":visible").each(function(){=0A=
				this.oldblock =3D this.oldblock || jQuery.css(this,"display");=0A=
				if ( this.oldblock =3D=3D "none" )=0A=
					this.oldblock =3D "block";=0A=
				this.style.display =3D "none";=0A=
			}).end();=0A=
	},=0A=
=0A=
	// Save the old toggle function=0A=
	_toggle: jQuery.fn.toggle,=0A=
	=0A=
	toggle: function( fn, fn2 ){=0A=
		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?=0A=
			this._toggle( fn, fn2 ) :=0A=
			fn ?=0A=
				this.animate({=0A=
					height: "toggle", width: "toggle", opacity: "toggle"=0A=
				}, fn, fn2) :=0A=
				this.each(function(){=0A=
					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();=0A=
				});=0A=
	},=0A=
	=0A=
	slideDown: function(speed,callback){=0A=
		return this.animate({height: "show"}, speed, callback);=0A=
	},=0A=
	=0A=
	slideUp: function(speed,callback){=0A=
		return this.animate({height: "hide"}, speed, callback);=0A=
	},=0A=
=0A=
	slideToggle: function(speed, callback){=0A=
		return this.animate({height: "toggle"}, speed, callback);=0A=
	},=0A=
	=0A=
	fadeIn: function(speed, callback){=0A=
		return this.animate({opacity: "show"}, speed, callback);=0A=
	},=0A=
	=0A=
	fadeOut: function(speed, callback){=0A=
		return this.animate({opacity: "hide"}, speed, callback);=0A=
	},=0A=
	=0A=
	fadeTo: function(speed,to,callback){=0A=
		return this.animate({opacity: to}, speed, callback);=0A=
	},=0A=
	=0A=
	animate: function( prop, speed, easing, callback ) {=0A=
		var opt =3D jQuery.speed(speed, easing, callback);=0A=
=0A=
		return this[ opt.queue =3D=3D=3D false ? "each" : "queue" ](function(){=0A=
			opt =3D jQuery.extend({}, opt);=0A=
			var hidden =3D jQuery(this).is(":hidden"), self =3D this;=0A=
			=0A=
			for ( var p in prop ) {=0A=
				if ( prop[p] =3D=3D "hide" && hidden || prop[p] =3D=3D "show" && =
!hidden )=0A=
					return jQuery.isFunction(opt.complete) && opt.complete.apply(this);=0A=
=0A=
				if ( p =3D=3D "height" || p =3D=3D "width" ) {=0A=
					// Store display property=0A=
					opt.display =3D jQuery.css(this, "display");=0A=
=0A=
					// Make sure that nothing sneaks out=0A=
					opt.overflow =3D this.style.overflow;=0A=
				}=0A=
			}=0A=
=0A=
			if ( opt.overflow !=3D null )=0A=
				this.style.overflow =3D "hidden";=0A=
=0A=
			opt.curAnim =3D jQuery.extend({}, prop);=0A=
			=0A=
			jQuery.each( prop, function(name, val){=0A=
				var e =3D new jQuery.fx( self, opt, name );=0A=
=0A=
				if ( /toggle|show|hide/.test(val) )=0A=
					e[ val =3D=3D "toggle" ? hidden ? "show" : "hide" : val ]( prop );=0A=
				else {=0A=
					var parts =3D val.toString().match(/^([+-]=3D)?([\d+-.]+)(.*)$/),=0A=
						start =3D e.cur(true) || 0;=0A=
=0A=
					if ( parts ) {=0A=
						var end =3D parseFloat(parts[2]),=0A=
							unit =3D parts[3] || "px";=0A=
=0A=
						// We need to compute starting value=0A=
						if ( unit !=3D "px" ) {=0A=
							self.style[ name ] =3D (end || 1) + unit;=0A=
							start =3D ((end || 1) / e.cur(true)) * start;=0A=
							self.style[ name ] =3D start + unit;=0A=
						}=0A=
=0A=
						// If a +=3D/-=3D token was provided, we're doing a relative =
animation=0A=
						if ( parts[1] )=0A=
							end =3D ((parts[1] =3D=3D "-=3D" ? -1 : 1) * end) + start;=0A=
=0A=
						e.custom( start, end, unit );=0A=
					} else=0A=
						e.custom( start, val, "" );=0A=
				}=0A=
			});=0A=
=0A=
			// For JS strict compliance=0A=
			return true;=0A=
		});=0A=
	},=0A=
	=0A=
	queue: function(type, fn){=0A=
		if ( jQuery.isFunction(type) ) {=0A=
			fn =3D type;=0A=
			type =3D "fx";=0A=
		}=0A=
=0A=
		if ( !type || (typeof type =3D=3D "string" && !fn) )=0A=
			return queue( this[0], type );=0A=
=0A=
		return this.each(function(){=0A=
			if ( fn.constructor =3D=3D Array )=0A=
				queue(this, type, fn);=0A=
			else {=0A=
				queue(this, type).push( fn );=0A=
			=0A=
				if ( queue(this, type).length =3D=3D 1 )=0A=
					fn.apply(this);=0A=
			}=0A=
		});=0A=
	},=0A=
=0A=
	stop: function(){=0A=
		var timers =3D jQuery.timers;=0A=
=0A=
		return this.each(function(){=0A=
			for ( var i =3D 0; i < timers.length; i++ )=0A=
				if ( timers[i].elem =3D=3D this )=0A=
					timers.splice(i--, 1);=0A=
		}).dequeue();=0A=
	}=0A=
=0A=
});=0A=
=0A=
var queue =3D function( elem, type, array ) {=0A=
	if ( !elem )=0A=
		return;=0A=
=0A=
	var q =3D jQuery.data( elem, type + "queue" );=0A=
=0A=
	if ( !q || array )=0A=
		q =3D jQuery.data( elem, type + "queue", =0A=
			array ? jQuery.makeArray(array) : [] );=0A=
=0A=
	return q;=0A=
};=0A=
=0A=
jQuery.fn.dequeue =3D function(type){=0A=
	type =3D type || "fx";=0A=
=0A=
	return this.each(function(){=0A=
		var q =3D queue(this, type);=0A=
=0A=
		q.shift();=0A=
=0A=
		if ( q.length )=0A=
			q[0].apply( this );=0A=
	});=0A=
};=0A=
=0A=
jQuery.extend({=0A=
	=0A=
	speed: function(speed, easing, fn) {=0A=
		var opt =3D speed && speed.constructor =3D=3D Object ? speed : {=0A=
			complete: fn || !fn && easing || =0A=
				jQuery.isFunction( speed ) && speed,=0A=
			duration: speed,=0A=
			easing: fn && easing || easing && easing.constructor !=3D Function && =
easing=0A=
		};=0A=
=0A=
		opt.duration =3D (opt.duration && opt.duration.constructor =3D=3D =
Number ? =0A=
			opt.duration : =0A=
			{ slow: 600, fast: 200 }[opt.duration]) || 400;=0A=
	=0A=
		// Queueing=0A=
		opt.old =3D opt.complete;=0A=
		opt.complete =3D function(){=0A=
			jQuery(this).dequeue();=0A=
			if ( jQuery.isFunction( opt.old ) )=0A=
				opt.old.apply( this );=0A=
		};=0A=
	=0A=
		return opt;=0A=
	},=0A=
	=0A=
	easing: {=0A=
		linear: function( p, n, firstNum, diff ) {=0A=
			return firstNum + diff * p;=0A=
		},=0A=
		swing: function( p, n, firstNum, diff ) {=0A=
			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;=0A=
		}=0A=
	},=0A=
	=0A=
	timers: [],=0A=
=0A=
	fx: function( elem, options, prop ){=0A=
		this.options =3D options;=0A=
		this.elem =3D elem;=0A=
		this.prop =3D prop;=0A=
=0A=
		if ( !options.orig )=0A=
			options.orig =3D {};=0A=
	}=0A=
=0A=
});=0A=
=0A=
jQuery.fx.prototype =3D {=0A=
=0A=
	// Simple function for setting a style value=0A=
	update: function(){=0A=
		if ( this.options.step )=0A=
			this.options.step.apply( this.elem, [ this.now, this ] );=0A=
=0A=
		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );=0A=
=0A=
		// Set display property to block for height/width animations=0A=
		if ( this.prop =3D=3D "height" || this.prop =3D=3D "width" )=0A=
			this.elem.style.display =3D "block";=0A=
	},=0A=
=0A=
	// Get the current size=0A=
	cur: function(force){=0A=
		if ( this.elem[this.prop] !=3D null && this.elem.style[this.prop] =
=3D=3D null )=0A=
			return this.elem[ this.prop ];=0A=
=0A=
		var r =3D parseFloat(jQuery.curCSS(this.elem, this.prop, force));=0A=
		return r && r > -10000 ? r : parseFloat(jQuery.css(this.elem, =
this.prop)) || 0;=0A=
	},=0A=
=0A=
	// Start an animation from one number to another=0A=
	custom: function(from, to, unit){=0A=
		this.startTime =3D (new Date()).getTime();=0A=
		this.start =3D from;=0A=
		this.end =3D to;=0A=
		this.unit =3D unit || this.unit || "px";=0A=
		this.now =3D this.start;=0A=
		this.pos =3D this.state =3D 0;=0A=
		this.update();=0A=
=0A=
		var self =3D this;=0A=
		function t(){=0A=
			return self.step();=0A=
		}=0A=
=0A=
		t.elem =3D this.elem;=0A=
=0A=
		jQuery.timers.push(t);=0A=
=0A=
		if ( jQuery.timers.length =3D=3D 1 ) {=0A=
			var timer =3D setInterval(function(){=0A=
				var timers =3D jQuery.timers;=0A=
				=0A=
				for ( var i =3D 0; i < timers.length; i++ )=0A=
					if ( !timers[i]() )=0A=
						timers.splice(i--, 1);=0A=
=0A=
				if ( !timers.length )=0A=
					clearInterval( timer );=0A=
			}, 13);=0A=
		}=0A=
	},=0A=
=0A=
	// Simple 'show' function=0A=
	show: function(){=0A=
		// Remember where we started, so that we can go back to it later=0A=
		this.options.orig[this.prop] =3D jQuery.attr( this.elem.style, =
this.prop );=0A=
		this.options.show =3D true;=0A=
=0A=
		// Begin the animation=0A=
		this.custom(0, this.cur());=0A=
=0A=
		// Make sure that we start at a small width/height to avoid any=0A=
		// flash of content=0A=
		if ( this.prop =3D=3D "width" || this.prop =3D=3D "height" )=0A=
			this.elem.style[this.prop] =3D "1px";=0A=
		=0A=
		// Start by showing the element=0A=
		jQuery(this.elem).show();=0A=
	},=0A=
=0A=
	// Simple 'hide' function=0A=
	hide: function(){=0A=
		// Remember where we started, so that we can go back to it later=0A=
		this.options.orig[this.prop] =3D jQuery.attr( this.elem.style, =
this.prop );=0A=
		this.options.hide =3D true;=0A=
=0A=
		// Begin the animation=0A=
		this.custom(this.cur(), 0);=0A=
	},=0A=
=0A=
	// Each step of an animation=0A=
	step: function(){=0A=
		var t =3D (new Date()).getTime();=0A=
=0A=
		if ( t > this.options.duration + this.startTime ) {=0A=
			this.now =3D this.end;=0A=
			this.pos =3D this.state =3D 1;=0A=
			this.update();=0A=
=0A=
			this.options.curAnim[ this.prop ] =3D true;=0A=
=0A=
			var done =3D true;=0A=
			for ( var i in this.options.curAnim )=0A=
				if ( this.options.curAnim[i] !=3D=3D true )=0A=
					done =3D false;=0A=
=0A=
			if ( done ) {=0A=
				if ( this.options.display !=3D null ) {=0A=
					// Reset the overflow=0A=
					this.elem.style.overflow =3D this.options.overflow;=0A=
				=0A=
					// Reset the display=0A=
					this.elem.style.display =3D this.options.display;=0A=
					if ( jQuery.css(this.elem, "display") =3D=3D "none" )=0A=
						this.elem.style.display =3D "block";=0A=
				}=0A=
=0A=
				// Hide the element if the "hide" operation was done=0A=
				if ( this.options.hide )=0A=
					this.elem.style.display =3D "none";=0A=
=0A=
				// Reset the properties, if the item has been hidden or shown=0A=
				if ( this.options.hide || this.options.show )=0A=
					for ( var p in this.options.curAnim )=0A=
						jQuery.attr(this.elem.style, p, this.options.orig[p]);=0A=
			}=0A=
=0A=
			// If a callback was provided, execute it=0A=
			if ( done && jQuery.isFunction( this.options.complete ) )=0A=
				// Execute the complete function=0A=
				this.options.complete.apply( this.elem );=0A=
=0A=
			return false;=0A=
		} else {=0A=
			var n =3D t - this.startTime;=0A=
			this.state =3D n / this.options.duration;=0A=
=0A=
			// Perform the easing function, defaults to swing=0A=
			this.pos =3D jQuery.easing[this.options.easing || =
(jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, =
this.options.duration);=0A=
			this.now =3D this.start + ((this.end - this.start) * this.pos);=0A=
=0A=
			// Perform the next step of the animation=0A=
			this.update();=0A=
		}=0A=
=0A=
		return true;=0A=
	}=0A=
=0A=
};=0A=
=0A=
jQuery.fx.step =3D {=0A=
	scrollLeft: function(fx){=0A=
		fx.elem.scrollLeft =3D fx.now;=0A=
	},=0A=
=0A=
	scrollTop: function(fx){=0A=
		fx.elem.scrollTop =3D fx.now;=0A=
	},=0A=
=0A=
	opacity: function(fx){=0A=
		jQuery.attr(fx.elem.style, "opacity", fx.now);=0A=
	},=0A=
=0A=
	_default: function(fx){=0A=
		fx.elem.style[ fx.prop ] =3D fx.now + fx.unit;=0A=
	}=0A=
};=0A=
// The Offset Method=0A=
// Originally By Brandon Aaron, part of the Dimension Plugin=0A=
// http://jquery.com/plugins/project/dimensions=0A=
jQuery.fn.offset =3D function() {=0A=
	var left =3D 0, top =3D 0, elem =3D this[0], results;=0A=
	=0A=
	if ( elem ) with ( jQuery.browser ) {=0A=
		var	absolute     =3D jQuery.css(elem, "position") =3D=3D "absolute", =0A=
		    parent       =3D elem.parentNode, =0A=
		    offsetParent =3D elem.offsetParent, =0A=
		    doc          =3D elem.ownerDocument,=0A=
		    safari2      =3D safari && parseInt(version) < 522;=0A=
	=0A=
		// Use getBoundingClientRect if available=0A=
		if ( elem.getBoundingClientRect ) {=0A=
			box =3D elem.getBoundingClientRect();=0A=
		=0A=
			// Add the document scroll offsets=0A=
			add(=0A=
				box.left + Math.max(doc.documentElement.scrollLeft, =
doc.body.scrollLeft),=0A=
				box.top  + Math.max(doc.documentElement.scrollTop,  =
doc.body.scrollTop)=0A=
			);=0A=
		=0A=
			// IE adds the HTML element's border, by default it is medium which =
is 2px=0A=
			// IE 6 and IE 7 quirks mode the border width is overwritable by the =
following css html { border: 0; }=0A=
			// IE 7 standards mode, the border is always 2px=0A=
			if ( msie ) {=0A=
				var border =3D jQuery("html").css("borderWidth");=0A=
				border =3D (border =3D=3D "medium" || jQuery.boxModel && =
parseInt(version) >=3D 7) && 2 || border;=0A=
				add( -border, -border );=0A=
			}=0A=
	=0A=
		// Otherwise loop through the offsetParents and parentNodes=0A=
		} else {=0A=
		=0A=
			// Initial element offsets=0A=
			add( elem.offsetLeft, elem.offsetTop );=0A=
		=0A=
			// Get parent offsets=0A=
			while ( offsetParent ) {=0A=
				// Add offsetParent offsets=0A=
				add( offsetParent.offsetLeft, offsetParent.offsetTop );=0A=
			=0A=
				// Mozilla and Safari > 2 does not include the border on offset =
parents=0A=
				// However Mozilla adds the border for table cells=0A=
				if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 )=0A=
					border( offsetParent );=0A=
				=0A=
				// Safari <=3D 2 doubles body offsets with an absolutely positioned =
element or parent=0A=
				if ( safari2 && !absolute && jQuery.css(offsetParent, "position") =
=3D=3D "absolute" )=0A=
					absolute =3D true;=0A=
			=0A=
				// Get next offsetParent=0A=
				offsetParent =3D offsetParent.offsetParent;=0A=
			}=0A=
		=0A=
			// Get parent scroll offsets=0A=
			while ( parent.tagName && !/^body|html$/i.test(parent.tagName) ) {=0A=
				// Work around opera inline/table scrollLeft/Top bug=0A=
				if ( !/^inline|table-row.*$/i.test(jQuery.css(parent, "display")) )=0A=
					// Subtract parent scroll offsets=0A=
					add( -parent.scrollLeft, -parent.scrollTop );=0A=
			=0A=
				// Mozilla does not add the border for a parent that has overflow =
!=3D visible=0A=
				if ( mozilla && jQuery.css(parent, "overflow") !=3D "visible" )=0A=
					border( parent );=0A=
			=0A=
				// Get next parent=0A=
				parent =3D parent.parentNode;=0A=
			}=0A=
		=0A=
			// Safari doubles body offsets with an absolutely positioned element =
or parent=0A=
			if ( safari2 && absolute )=0A=
				add( -doc.body.offsetLeft, -doc.body.offsetTop );=0A=
		}=0A=
=0A=
		// Return an object with top and left properties=0A=
		results =3D { top: top, left: left };=0A=
	}=0A=
=0A=
	return results;=0A=
=0A=
	function border(elem) {=0A=
		add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, =
"borderTopWidth") );=0A=
	}=0A=
=0A=
	function add(l, t) {=0A=
		left +=3D parseInt(l) || 0;=0A=
		top +=3D parseInt(t) || 0;=0A=
	}=0A=
};=0A=
})();=0A=

------=_NextPart_000_0000_01C97D9B.BCD30A40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://gigapan.org/js/main.js

var xmlRequest =3D null;=0A=
=0A=
function customLoginBehavior()=0A=
   {=0A=
   // Does nothing by default.  Pages that need extra functionality upon =
login should redefine this function.=0A=
//alert("base customLoginBehavior");=0A=
   }=0A=
=0A=
// set up the defaults for all AJAX calls made with jQuery=0A=
$.ajaxSetup({=0A=
   url: '/rpc.php',=0A=
   type: 'POST',=0A=
   dataType: 'html'=0A=
});=0A=
=0A=
function getXMLRequest() {=0A=
	if(xmlRequest && xmlRequest.readyState !=3D 4 && xmlRequest.readyState =
!=3D 0) {=0A=
		//alert("Another operation is in progress--please wait until it =
finishes...");=0A=
		return null;=0A=
	}=0A=
=0A=
	try {=0A=
		xmlRequest =3D new XMLHttpRequest();=0A=
	} catch (e) {=0A=
		try {=0A=
			xmlRequest =3D new ActiveXObject("Msxml2.XMLHTTP");=0A=
		} catch (e) {=0A=
			xmlRequest =3D new ActiveXObject("Microsoft.XMLHTTP");=0A=
		}=0A=
	}=0A=
=0A=
	xmlRequest.open("POST", "rpc.php", true);=0A=
	xmlRequest.setRequestHeader('Content-type', =
'application/x-www-form-urlencoded');=0A=
=0A=
	xmlRequest =3D xmlRequest;=0A=
=0A=
	return xmlRequest;=0A=
}=0A=
=0A=
// LOGIN WINDOW HANDLERS=0A=
=0A=
// popup login window=0A=
var _login_done_js =3D null;=0A=
=0A=
function doLogin_save(result) {=0A=
			logged_in =3D true;=0A=
=0A=
			var e =3D document.getElementById("header_auth");=0A=
=0A=
			// FIXME Shouldn't have hardcoded content here...=0A=
			if(e)=0A=
				e.innerHTML =3D result + "&nbsp;&nbsp; <A =
HREF=3D'myHomeGigapans.php'>My Home</A> | <A HREF=3D'" + =
window.location.href + ((window.location.href.indexOf("?") > 0) ? =
"&header_mode=3Dlogout" : "?header_mode=3Dlogout") + "'>Logout</A>";=0A=
=0A=
         // perform any required custom behavior=0A=
//alert("doLogin_save doing customLoginBehavior");=0A=
         customLoginBehavior();=0A=
}=0A=
=0A=
function doLogin_process() {=0A=
	if(xmlRequest.readyState =3D=3D 4) {=0A=
		var result =3D xmlRequest.responseText;=0A=
=0A=
		if(result.indexOf("ERROR") < 0) {=0A=
			doLogin_save(result);=0A=
			dialog_hide(_login_done_js);=0A=
      } else=0A=
			alert("Bad username and/or password.");=0A=
	}=0A=
=0A=
	return true;=0A=
}=0A=
=0A=
function doLogin() {=0A=
	var r =3D getXMLRequest();=0A=
=0A=
	if(! r)=0A=
		return false;=0A=
=0A=
	var username =3D document.getElementById("dialog_username").value;=0A=
	var password =3D document.getElementById("dialog_password").value;=0A=
=0A=
	r.onreadystatechange =3D doLogin_process;=0A=
	r.send("proc=3Dlogin&username=3D" + username + "&password=3D" + =
password + "&url=3D" + window.location.href);=0A=
=0A=
	return true;=0A=
}=0A=
=0A=
function doForgotPassword()=0A=
   {=0A=
=0A=
   var email =3D document.getElementById("dialog_email").value;=0A=
=0A=
   $.ajax(=0A=
      {=0A=
      data:=0A=
         {=0A=
         proc: 'forgot_password',=0A=
         email: email=0A=
         },=0A=
      complete: function()=0A=
         {=0A=
         dialog_hide();=0A=
         },=0A=
      success: function()=0A=
         {=0A=
         alert("If "+email+" is the email address you used to register, =
we have mailed a new password to you.\n\n" +=0A=
               "If you have more than one email address and are not =
certain which you used when registering, it's OK to try more than one.");=0A=
         }=0A=
      });=0A=
=0A=
   return true;=0A=
   }=0A=
=0A=
function shiftFocusUponEnterKeyEvent(evt, elementIdToGetFocus, =
codeToExecute)=0A=
   {=0A=
   evt =3D (evt) ? evt : ((event) ? event : null);=0A=
   if (evt)=0A=
      {=0A=
      var element =3D document.getElementById(elementIdToGetFocus);=0A=
      if (evt.keyCode =3D=3D 13)=0A=
         {=0A=
         if (element)=0A=
            {=0A=
            element.focus();=0A=
            }=0A=
         if (codeToExecute)=0A=
            {=0A=
            eval(codeToExecute);=0A=
            }=0A=
         }=0A=
      }=0A=
   }=0A=
=0A=
function login(done_js, container) {=0A=
	_login_done_js =3D done_js;=0A=
	var login_html =3D '';=0A=
=0A=
	login_html +=3D '<DIV CLASS=3D"dialog_login">';=0A=
	login_html +=3D '		<DIV CLASS=3D"field">';=0A=
	login_html +=3D '			<SPAN CLASS=3D"label">username</SPAN>';=0A=
	login_html +=3D '			<INPUT TYPE=3D"text" ID=3D"dialog_username" =
onfocus=3D"this.select();" =
onkeyup=3D"shiftFocusUponEnterKeyEvent(event,\'dialog_password\');">';=0A=
	login_html +=3D '		</DIV>';=0A=
=0A=
	login_html +=3D '		<DIV CLASS=3D"field">';=0A=
	login_html +=3D '			<SPAN CLASS=3D"label">password</SPAN>';=0A=
	login_html +=3D '			<INPUT TYPE=3D"password" ID=3D"dialog_password" =
onfocus=3D"this.select();" =
onkeyup=3D"shiftFocusUponEnterKeyEvent(event,\'submit\',\'doLogin();\');"=
>';=0A=
	login_html +=3D '		</DIV>';=0A=
=0A=
	login_html +=3D '		<INPUT TYPE=3D"button" VALUE=3D"login" ID=3D"submit" =
onClick=3D"doLogin();">';=0A=
=0A=
	login_html +=3D '		<A onClick=3D"forgotPassword();" =
ID=3D"forgot_password">I forgot my password</A>';=0A=
=0A=
	login_html +=3D '		<P>';=0A=
	login_html +=3D '			or, <A HREF=3D"createAccount.php">Create a FREE =
account now</A>';=0A=
	login_html +=3D '		</P>';=0A=
	login_html +=3D '</DIV>';=0A=
=0A=
	return dialog_ask("Login", login_html, container,'','dialog_username');=0A=
}=0A=
=0A=
function forgotPassword() {=0A=
	var forgot_password_html =3D "";=0A=
=0A=
	forgot_password_html +=3D '<DIV CLASS=3D"dialog_forgot_password">';=0A=
	forgot_password_html +=3D '	<DIV CLASS=3D"field">';=0A=
	forgot_password_html +=3D '		<SPAN CLASS=3D"label">e-mail</SPAN>';=0A=
	forgot_password_html +=3D '		<INPUT TYPE=3D"text" ID=3D"dialog_email" =
onfocus=3D"this.select();" =
onkeyup=3D"shiftFocusUponEnterKeyEvent(event,\'submit\',\'doForgotPasswor=
d();\');">';=0A=
	forgot_password_html +=3D '	</DIV>';=0A=
=0A=
	forgot_password_html +=3D '	<INPUT TYPE=3D"button" VALUE=3D"send new =
password" ID=3D"submit" onClick=3D"doForgotPassword();">';=0A=
	forgot_password_html +=3D '</DIV>';=0A=
=0A=
	dialog_hide();=0A=
=0A=
	return dialog_ask("Forgot Password", forgot_password_html, =
document.getElementById("flash_viewer_spacer_top"),'','dialog_email');=0A=
}=0A=
=0A=
function isLoggedIn() {=0A=
	return logged_in;=0A=
}=0A=
=0A=
=0A=
// PAGE LOAD HANDLER=0A=
=0A=
var _original_page_width =3D 0;=0A=
=0A=
// redirects to URL that saves screen size in session=0A=
function fetchWindowSize(force) {=0A=
   if(_have_window_size =3D=3D false || force =3D=3D true) {=0A=
=0A=
      if(document.body.clientWidth =3D=3D _original_page_width && =
_have_window_size =3D=3D true) {=0A=
         return true;=0A=
      }=0A=
=0A=
      var queryString =3D "?";=0A=
      if (window.location.search !=3D '') {=0A=
         var keyValuePairs =3D =
window.location.search.substring(1).split("&");=0A=
         for (var j=3D0; j < keyValuePairs.length; j++) {=0A=
            var keyValue =3D keyValuePairs[j].split("=3D");=0A=
            if ("window_width" !=3D keyValue[0] && "window_height" !=3D =
keyValue[0]) {=0A=
               queryString +=3D keyValuePairs[j] + "&";=0A=
            }=0A=
         }=0A=
      }=0A=
      // todo: consider using this algorithm, for more accurate =
measurements: =
http://www.howtocreate.co.uk/tutorials/javascript/browserwindow=0A=
      queryString +=3D "window_height=3D" + document.body.clientHeight + =
"&window_width=3D" + document.body.clientWidth;=0A=
=0A=
      // todo: consider passing this using AJAX, so we don't have to =
force a page reload=0A=
      window.location.href =3D window.location.protocol + "//" +=0A=
                             window.location.host +=0A=
                             window.location.pathname +=0A=
                             queryString +=0A=
                             window.location.hash;=0A=
=0A=
      _have_window_size =3D true;=0A=
   }=0A=
=0A=
	return true;=0A=
}=0A=
=0A=
// Allow widgets to register for page load notification=0A=
var _load_callbacks =3D Array();=0A=
function doPageLoadCallbacks(e) {=0A=
	for(var i in _load_callbacks) {=0A=
		if(typeof(_load_callbacks[i]) !=3D "string")=0A=
			continue;=0A=
=0A=
		eval(_load_callbacks[i]);=0A=
	}=0A=
=0A=
	return true;=0A=
}=0A=
=0A=
function registerPageLoadCallback(f) {=0A=
	return _load_callbacks.push(f);=0A=
}=0A=
=0A=
// Allow widgets to register for flash browser load notification=0A=
var _flash_load_callbacks =3D Array();=0A=
function doFlashBrowserLoadCallbacks() {=0A=
   for(var i in _flash_load_callbacks) {=0A=
		if(typeof(_flash_load_callbacks[i]) !=3D "string")=0A=
			continue;=0A=
=0A=
		eval(_flash_load_callbacks[i]);=0A=
	}=0A=
=0A=
	return true;=0A=
}=0A=
=0A=
function registerFlashBrowserLoadCallback(f) {=0A=
	return _flash_load_callbacks.push(f);=0A=
}=0A=
=0A=
// RESIZE HANDLERS=0A=
function updateScreenSize() {=0A=
	if(_resize_timeout) {=0A=
		clearTimeout(_resize_timeout);=0A=
		_resize_timeout =3D null;=0A=
	}=0A=
=0A=
	// no graphics on this page require knowing screen size=0A=
	if(typeof(_refresh_on_resize) !=3D "undefined") {=0A=
		if(_refresh_on_resize !=3D true)=0A=
			return false;=0A=
	}=0A=
=0A=
	_resize_timeout =3D setTimeout("fetchWindowSize(true);", 500);=0A=
}=0A=
=0A=
function getScreenSize() {=0A=
  _original_page_width =3D document.body.clientWidth;=0A=
}=0A=
=0A=
var _resize_callbacks =3D Array();=0A=
function registerPageResizeCallback(f) {=0A=
	return _resize_callbacks.push(f);=0A=
}=0A=
=0A=
var _resize_timeout =3D null;=0A=
function doPageResizeCallbacks(e) {=0A=
	for(var i in _resize_callbacks) {=0A=
		if(typeof(_resize_callbacks[i]) !=3D "string")=0A=
			continue;=0A=
=0A=
		eval(_resize_callbacks[i]);=0A=
	}=0A=
=0A=
	return true;=0A=
}=0A=
=0A=
registerPageResizeCallback("updateScreenSize()");=0A=
registerPageLoadCallback("getScreenSize()");=0A=

------=_NextPart_000_0000_01C97D9B.BCD30A40
Content-Type: application/octet-stream
Content-Transfer-Encoding: quoted-printable
Content-Location: http://gigapan.org/viewer/JavaScriptFlashGateway.js

/*=0A=
Macromedia(r) Flash(r) JavaScript Integration Kit License=0A=
=0A=
=0A=
Copyright (c) 2005 Macromedia, inc. All rights reserved.=0A=
=0A=
Redistribution and use in source and binary forms, with or without =
modification,=0A=
are permitted provided that the following conditions are met:=0A=
=0A=
1. Redistributions of source code must retain the above copyright =
notice, this=0A=
list of conditions and the following disclaimer.=0A=
=0A=
2. Redistributions in binary form must reproduce the above copyright =
notice,=0A=
this list of conditions and the following disclaimer in the =
documentation and/or=0A=
other materials provided with the distribution.=0A=
=0A=
3. The end-user documentation included with the redistribution, if any, =
must=0A=
include the following acknowledgment:=0A=
=0A=
"This product includes software developed by Macromedia, Inc.=0A=
(http://www.macromedia.com)."=0A=
=0A=
Alternately, this acknowledgment may appear in the software itself, if =
and=0A=
wherever such third-party acknowledgments normally appear.=0A=
=0A=
4. The name Macromedia must not be used to endorse or promote products =
derived=0A=
from this software without prior written permission. For written =
permission,=0A=
please contact devrelations@macromedia.com.=0A=
=0A=
5. Products derived from this software may not be called "Macromedia" or=0A=
"Macromedia Flash", nor may "Macromedia" or "Macromedia Flash" appear in =
their=0A=
name.=0A=
=0A=
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED =
WARRANTIES,=0A=
INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY =
AND=0A=
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL =
MACROMEDIA OR=0A=
ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,=0A=
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, =
PROCUREMENT=0A=
OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR =
BUSINESS=0A=
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN =
CONTRACT,=0A=
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN =
ANY WAY=0A=
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF =
SUCH=0A=
DAMAGE.=0A=
=0A=
--=0A=
=0A=
This code is part of the Flash / JavaScript Integration Kit:=0A=
http://www.macromedia.com/go/flashjavascript/=0A=
=0A=
Created by:=0A=
=0A=
Christian Cantrell=0A=
http://weblogs.macromedia.com/cantrell/=0A=
mailto:cantrell@macromedia.com=0A=
=0A=
Mike Chambers=0A=
http://weblogs.macromedia.com/mesh/=0A=
mailto:mesh@macromedia.com=0A=
=0A=
Macromedia=0A=
*/=0A=
=0A=
/**=0A=
 * Create a new Exception object.=0A=
 * name: The name of the exception.=0A=
 * message: The exception message.=0A=
 */=0A=
function Exception(name, message)=0A=
{=0A=
    if (name)=0A=
        this.name =3D name;=0A=
    if (message)=0A=
        this.message =3D message;=0A=
}=0A=
=0A=
/**=0A=
 * Set the name of the exception. =0A=
 */=0A=
Exception.prototype.setName =3D function(name)=0A=
{=0A=
    this.name =3D name;=0A=
}=0A=
=0A=
/**=0A=
 * Get the exception's name. =0A=
 */=0A=
Exception.prototype.getName =3D function()=0A=
{=0A=
    return this.name;=0A=
}=0A=
=0A=
/**=0A=
 * Set a message on the exception. =0A=
 */=0A=
Exception.prototype.setMessage =3D function(msg)=0A=
{=0A=
    this.message =3D msg;=0A=
}=0A=
=0A=
/**=0A=
 * Get the exception message. =0A=
 */=0A=
Exception.prototype.getMessage =3D function()=0A=
{=0A=
    return this.message;=0A=
}=0A=
=0A=
/**=0A=
 * Generates a browser-specific Flash tag. Create a new instance, set =
whatever=0A=
 * properties you need, then call either toString() to get the tag as a =
string, or=0A=
 * call write() to write the tag out.=0A=
 */=0A=
=0A=
/**=0A=
 * Creates a new instance of the FlashTag.=0A=
 * src: The path to the SWF file.=0A=
 * width: The width of your Flash content.=0A=
 * height: the height of your Flash content.=0A=
 */=0A=
function FlashTag(src, width, height)=0A=
{=0A=
    this.src       =3D src;=0A=
    this.width     =3D width;=0A=
    this.height    =3D height;=0A=
    this.version   =3D '7,0,14,0';=0A=
    this.id        =3D null;=0A=
    this.bgcolor   =3D 'ffffff';=0A=
    this.flashVars =3D null;=0A=
}=0A=
=0A=
/**=0A=
 * Sets the Flash version used in the Flash tag.=0A=
 */=0A=
FlashTag.prototype.setVersion =3D function(v)=0A=
{=0A=
    this.version =3D v;=0A=
}=0A=
=0A=
/**=0A=
 * Sets the ID used in the Flash tag.=0A=
 */=0A=
FlashTag.prototype.setId =3D function(id)=0A=
{=0A=
    this.id =3D id;=0A=
}=0A=
=0A=
/**=0A=
 * Sets the background color used in the Flash tag.=0A=
 */=0A=
FlashTag.prototype.setBgcolor =3D function(bgc)=0A=
{=0A=
    this.bgcolor =3D bgc;=0A=
}=0A=
=0A=
/**=0A=
 * Sets any variables to be passed into the Flash content. =0A=
 */=0A=
FlashTag.prototype.setFlashvars =3D function(fv)=0A=
{=0A=
    this.flashVars =3D fv;=0A=
}=0A=
=0A=
/**=0A=
 * Get the Flash tag as a string. =0A=
 */=0A=
FlashTag.prototype.toString =3D function()=0A=
{=0A=
    var ie =3D (navigator.appName.indexOf ("Microsoft") !=3D -1) ? 1 : 0;=0A=
    var flashTag =3D new String();=0A=
    if (ie)=0A=
    {=0A=
        flashTag +=3D '<object =
classid=3D"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" ';=0A=
        if (this.id !=3D null)=0A=
        {=0A=
            flashTag +=3D 'id=3D"'+this.id+'" ';=0A=
        }=0A=
        flashTag +=3D =
'codebase=3D"http://download.macromedia.com/pub/shockwave/cabs/flash/swfl=
ash.cab#version=3D'+this.version+'" ';=0A=
        flashTag +=3D 'width=3D"'+this.width+'" ';=0A=
        flashTag +=3D 'height=3D"'+this.height+'">';=0A=
        flashTag +=3D '<param name=3D"movie" value=3D"'+this.src+'"/>';=0A=
        flashTag +=3D '<param name=3D"quality" value=3D"high"/>';=0A=
        flashTag +=3D '<param name=3D"bgcolor" =
value=3D"#'+this.bgcolor+'"/>';=0A=
        if (this.flashVars !=3D null)=0A=
        {=0A=
            flashTag +=3D '<param name=3D"flashvars" =
value=3D"'+this.flashVars+'"/>';=0A=
        }=0A=
        flashTag +=3D '</object>';=0A=
    }=0A=
    else=0A=
    {=0A=
        flashTag +=3D '<embed src=3D"'+this.src+'" ';=0A=
        flashTag +=3D 'quality=3D"high" '; =0A=
        flashTag +=3D 'bgcolor=3D"#'+this.bgcolor+'" ';=0A=
        flashTag +=3D 'width=3D"'+this.width+'" ';=0A=
        flashTag +=3D 'height=3D"'+this.height+'" ';=0A=
        flashTag +=3D 'type=3D"application/x-shockwave-flash" ';=0A=
        if (this.flashVars !=3D null)=0A=
        {=0A=
            flashTag +=3D 'flashvars=3D"'+this.flashVars+'" ';=0A=
        }=0A=
        if (this.id !=3D null)=0A=
        {=0A=
            flashTag +=3D 'name=3D"'+this.id+'" ';=0A=
        }=0A=
        flashTag +=3D =
'pluginspage=3D"http://www.macromedia.com/go/getflashplayer">';=0A=
        flashTag +=3D '</embed>';=0A=
    }=0A=
    return flashTag;=0A=
}=0A=
=0A=
/**=0A=
 * Write the Flash tag out. Pass in a reference to the document to write =
to. =0A=
 */=0A=
FlashTag.prototype.write =3D function(doc)=0A=
{=0A=
    doc.write(this.toString());=0A=
}=0A=
=0A=
/**=0A=
 * The FlashSerializer serializes JavaScript variables of types object, =
array, string,=0A=
 * number, date, boolean, null or undefined into XML. =0A=
 */=0A=
=0A=
/**=0A=
 * Create a new instance of the FlashSerializer.=0A=
 * useCdata: Whether strings should be treated as character data. If =
false, strings are simply XML encoded.=0A=
 */=0A=
function FlashSerializer(useCdata)=0A=
{=0A=
    this.useCdata =3D useCdata;=0A=
}=0A=
=0A=
/**=0A=
 * Serialize an array into a format that can be deserialized in Flash. =
Supported data types are object,=0A=
 * array, string, number, date, boolean, null, and undefined. Returns a =
string of serialized data.=0A=
 */=0A=
FlashSerializer.prototype.serialize =3D function(args)=0A=
{=0A=
    var qs =3D new String();=0A=
=0A=
    for (var i =3D 0; i < args.length; ++i)=0A=
    {=0A=
        switch(typeof(args[i]))=0A=
        {=0A=
            case 'undefined':=0A=
                qs +=3D 't'+(i)+'=3Dundf';=0A=
                break;=0A=
            case 'string':=0A=
                qs +=3D 't'+(i)+'=3Dstr&d'+(i)+'=3D'+escape(args[i]);=0A=
                break;=0A=
            case 'number':=0A=
                qs +=3D 't'+(i)+'=3Dnum&d'+(i)+'=3D'+escape(args[i]);=0A=
                break;=0A=
            case 'boolean':=0A=
                qs +=3D 't'+(i)+'=3Dbool&d'+(i)+'=3D'+escape(args[i]);=0A=
                break;=0A=
            case 'object':=0A=
                if (args[i] =3D=3D null)=0A=
                {=0A=
                    qs +=3D 't'+(i)+'=3Dnull';=0A=
                }=0A=
                else if (args[i] instanceof Date)=0A=
                {=0A=
                    qs +=3D =
't'+(i)+'=3Ddate&d'+(i)+'=3D'+escape(args[i].getTime());=0A=
                }=0A=
                else // array or object=0A=
                {=0A=
                    try=0A=
                    {=0A=
                        qs +=3D =
't'+(i)+'=3Dxser&d'+(i)+'=3D'+escape(this._serializeXML(args[i]));=0A=
                    }=0A=
                    catch (exception)=0A=
                    {=0A=
                        throw new =
Exception("FlashSerializationException",=0A=
                                            "The following error =
occurred during complex object serialization: " + =
exception.getMessage());=0A=
                    }=0A=
                }=0A=
                break;=0A=
            default:=0A=
                throw new Exception("FlashSerializationException",=0A=
                                    "You can only serialize strings, =
numbers, booleans, dates, objects, arrays, nulls, and undefined.");=0A=
        }=0A=
=0A=
        if (i !=3D (args.length - 1))=0A=
        {=0A=
            qs +=3D '&';=0A=
        }=0A=
    }=0A=
=0A=
    return qs;=0A=
}=0A=
=0A=
/**=0A=
 * Private=0A=
 */=0A=
FlashSerializer.prototype._serializeXML =3D function(obj)=0A=
{=0A=
    var doc =3D new Object();=0A=
    doc.xml =3D '<fp>'; =0A=
    this._serializeNode(obj, doc, null);=0A=
    doc.xml +=3D '</fp>'; =0A=
    return doc.xml;=0A=
}=0A=
=0A=
/**=0A=
 * Private=0A=
 */=0A=
FlashSerializer.prototype._serializeNode =3D function(obj, doc, name)=0A=
{=0A=
    switch(typeof(obj))=0A=
    {=0A=
        case 'undefined':=0A=
            doc.xml +=3D '<undf'+this._addName(name)+'/>';=0A=
            break;=0A=
        case 'string':=0A=
            doc.xml +=3D =
'<str'+this._addName(name)+'>'+this._escapeXml(obj)+'</str>';=0A=
            break;=0A=
        case 'number':=0A=
            doc.xml +=3D '<num'+this._addName(name)+'>'+obj+'</num>';=0A=
            break;=0A=
        case 'boolean':=0A=
            doc.xml +=3D '<bool'+this._addName(name)+' =
val=3D"'+obj+'"/>';=0A=
            break;=0A=
        case 'object':=0A=
            if (obj =3D=3D null)=0A=
            {=0A=
                doc.xml +=3D '<null'+this._addName(name)+'/>';=0A=
            }=0A=
            else if (obj instanceof Date)=0A=
            {=0A=
                doc.xml +=3D =
'<date'+this._addName(name)+'>'+obj.getTime()+'</date>';=0A=
            }=0A=
            else if (obj instanceof Array)=0A=
            {=0A=
                doc.xml +=3D '<array'+this._addName(name)+'>';=0A=
                for (var i =3D 0; i < obj.length; ++i)=0A=
                {=0A=
                    this._serializeNode(obj[i], doc, null);=0A=
                }=0A=
                doc.xml +=3D '</array>';=0A=
            }=0A=
            else=0A=
            {=0A=
                doc.xml +=3D '<obj'+this._addName(name)+'>';=0A=
                for (var n in obj)=0A=
                {=0A=
                    if (typeof(obj[n]) =3D=3D 'function')=0A=
                        continue;=0A=
                    this._serializeNode(obj[n], doc, n);=0A=
                }=0A=
                doc.xml +=3D '</obj>';=0A=
            }=0A=
            break;=0A=
        default:=0A=
            throw new Exception("FlashSerializationException",=0A=
                                "You can only serialize strings, =
numbers, booleans, objects, dates, arrays, nulls and undefined");=0A=
            break;=0A=
    }=0A=
}=0A=
=0A=
/**=0A=
 * Private=0A=
 */=0A=
FlashSerializer.prototype._addName=3D function(name)=0A=
{=0A=
    if (name !=3D null)=0A=
    {=0A=
        return ' name=3D"'+name+'"';=0A=
    }=0A=
    return '';=0A=
}=0A=
=0A=
/**=0A=
 * Private=0A=
 */=0A=
FlashSerializer.prototype._escapeXml =3D function(str)=0A=
{=0A=
    if (this.useCdata)=0A=
        return '<![CDATA['+str+']]>';=0A=
    else=0A=
        return str.replace(/&/g,'&amp;').replace(/</g,'&lt;');=0A=
}=0A=
=0A=
/**=0A=
 * The FlashProxy object is what proxies function calls between =
JavaScript and Flash.=0A=
 * It handles all argument serialization issues.=0A=
 */=0A=
=0A=
/**=0A=
 * Instantiates a new FlashProxy object. Pass in a uniqueID and the name =
(including the path)=0A=
 * of the Flash proxy SWF. The ID is the same ID that needs to be passed =
into your Flash content as lcId.=0A=
 */=0A=
function FlashProxy(uid, proxySwfName)=0A=
{=0A=
    this.uid =3D uid;=0A=
    this.proxySwfName =3D proxySwfName;=0A=
    this.flashSerializer =3D new FlashSerializer(false);=0A=
}=0A=
=0A=
/**=0A=
 * Call a function in your Flash content.  Arguments should be:=0A=
 * 1. ActionScript function name to call,=0A=
 * 2. any number of additional arguments of type object,=0A=
 *    array, string, number, boolean, date, null, or undefined.=0A=
 */=0A=
FlashProxy.prototype.call =3D function()=0A=
{=0A=
=0A=
    if (arguments.length =3D=3D 0)=0A=
    {=0A=
        throw new Exception("Flash Proxy Exception",=0A=
                            "The first argument should be the function =
name followed by any number of additional arguments.");=0A=
    }=0A=
=0A=
    var funcname =3D escape(arguments[0]);=0A=
=0A=
    _deleteOlderDuplicateCall(funcname);=0A=
=0A=
    var qs =3D 'lcId=3D' + escape(this.uid) + '&functionName=3D' + =
funcname;=0A=
=0A=
    if (arguments.length > 1)=0A=
    {=0A=
        var justArgs =3D new Array();=0A=
        for (var i =3D 1; i < arguments.length; ++i)=0A=
        {=0A=
            justArgs.push(arguments[i]);=0A=
        }=0A=
        qs +=3D ('&' + this.flashSerializer.serialize(justArgs));=0A=
    }=0A=
=0A=
    var divName =3D '_flash_proxy_' + this.uid;=0A=
=0A=
    _callLater(divName,this.proxySwfName, qs, funcname);=0A=
}=0A=
=0A=
var _q =3D new Array();=0A=
var _qdelay =3D 300;=0A=
var _qtimer =3D undefined; =0A=
=0A=
function _callLater(divName, proxySwfName, qs, funcname) {=0A=
    var es =3D '_execute(\''+divName+'\', \''+proxySwfName+'\', =
\''+qs+'\', \''+funcname+'\')';=0A=
    var item =3D new Array();=0A=
    item[0] =3D funcname;=0A=
    item[1] =3D es;=0A=
    _q.push(item);=0A=
    if (_qtimer =3D=3D undefined) {=0A=
        _qtimer =3D setTimeout('_sendOne()', 1);=0A=
    }=0A=
}=0A=
=0A=
function _sendOne() {=0A=
    _qtimer =3D undefined;=0A=
    if (_q.length =3D=3D 0) {=0A=
        return;=0A=
    }=0A=
    eval(_q.shift()[1]);=0A=
    //alert("sent; q now len "+_q.length);=0A=
    if (_q.length > 0) {=0A=
        if (_qtimer =3D=3D undefined) {=0A=
            _qtimer =3D setTimeout('_sendOne()', _qdelay);=0A=
        }=0A=
    }=0A=
}=0A=
=0A=
function _deleteOlderDuplicateCall(funcname) {=0A=
    // if there's already a call in the queue with the same name, remove =
it.=0A=
    // but only a few specific function names are given this treatment, =
the rest are ignored=0A=
    // @#@t list of names hardcoded for Gigapan!=0A=
    // only one call is removed, on the assumption that this is called =
every time=0A=
    // and thus at most one matching call can be present in the queue=0A=
    if ((funcname =3D=3D 'hideSnapInclusion') || (funcname =3D=3D =
'showSnapInclusion')) {=0A=
        var ii;=0A=
        for (ii =3D _q.length - 1; ii >=3D 0; ii--) {=0A=
            if (_q[ii][0] =3D=3D funcname) {=0A=
                _q.splice(ii,1);=0A=
                return;=0A=
            }=0A=
        }=0A=
    }=0A=
}=0A=
=0A=
function _execute(divName, proxySwfName, qs, funcname) {=0A=
    if(!document.getElementById(divName))=0A=
    {=0A=
        var newTarget =3D document.createElement("div");=0A=
        newTarget.id =3D divName;=0A=
        document.body.appendChild(newTarget);=0A=
    }=0A=
    var target =3D document.getElementById(divName);=0A=
    var ft =3D new FlashTag(proxySwfName, 1, 1);=0A=
    ft.setVersion('6,0,65,0');=0A=
    ft.setFlashvars(qs);=0A=
=0A=
    var fts =3D ft.toString();=0A=
    target.innerHTML =3D fts;=0A=
}=0A=
=0A=
/**=0A=
 * This is the function that proxies function calls from Flash to =
JavaScript.=0A=
 * It is called implicitly.=0A=
 */=0A=
FlashProxy.callJS =3D function()=0A=
{=0A=
    var functionToCall =3D eval(arguments[0]);=0A=
    var argArray =3D new Array();=0A=
    if (arguments.length > 2) {=0A=
    	for (var i =3D 1; i < arguments.length; ++i)=0A=
    	{=0A=
    	    argArray.push(arguments[i]);=0A=
    	}=0A=
    } else {=0A=
	var argsStr =3D arguments[1].toString();=0A=
        argArray =3D argsStr.split(',');=0A=
    }=0A=
    functionToCall.apply(functionToCall, argArray);=0A=
}=0A=
=0A=

------=_NextPart_000_0000_01C97D9B.BCD30A40--

