Index: /plugins/captions/v5/test/assets/halo-es.srt
===================================================================
--- /plugins/captions/v5/test/assets/halo-es.srt	(revision 1077)
+++ /plugins/captions/v5/test/assets/halo-es.srt	(revision 1077)
@@ -0,0 +1,47 @@
+1
+00:00:02 --> 00:00:04
+cc: (en espanol) Halo video, origin unknown
+
+2
+00:00:04 --> 00:00:08
+cc: (en espanol) Message <u>#2</u>
+
+3
+00:00:08 --> 00:00:12
+cc: (en espanol) Message <b>#3</b>
+
+4
+00:00:12 --> 00:00:16
+cc: (en espanol) Message <i>#4</i>
+
+5
+00:00:16 --> 00:00:20
+cc: (en espanol) Message <b><u>#5</u></b>
+
+6
+00:00:20 --> 00:00:24
+cc: (en espanol) Message <i><b>#6</b></i>
+
+7
+00:00:24 --> 00:00:28
+cc: (en espanol) Message <u><i>#7</i></u>
+
+8
+00:00:28 --> 00:00:32
+cc: (en espanol) Message <font color="#ff00ff">#8</font>
+
+9
+00:00:32 --> 00:00:36
+cc: (en espanol) Message <font size="+3">#9</font>
+
+10
+00:00:36 --> 00:00:40
+cc: (en espanol) Message <font color="#ffff00" size="+2">#10</font>
+
+11
+00:00:40 --> 00:00:44
+cc: (en espanol) Message <font color="#00ff00" size="+4">#11</font>
+
+12
+00:00:44 --> 00:00:48
+cc: (en espanol) Message <font color="#00ffff" size="+2">#12</font>
Index: /plugins/captions/v5/test/assets/js.html
===================================================================
--- /plugins/captions/v5/test/assets/js.html	(revision 1077)
+++ /plugins/captions/v5/test/assets/js.html	(revision 1077)
@@ -0,0 +1,62 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+	<title>Captions plugin for JW 5 Player</title>
+	<style type='text/css'>
+	#wrapper { width:600px;margin-left:auto;margin-right:auto; }
+	#ccmirror { border:1px solid black;width:480px;text-align:center;line-height:20px; }
+	#ccmirror2 { border:1px solid black;width:480px;text-align:center;line-height:20px; }
+	</style>
+	<script type="text/javascript" src="swfobject.js"></script>
+	<script type="text/javascript">
+		function ccmirror(cc) { 
+			document.getElementById("ccmirror").innerHTML = cc
+		}
+		function ccmirror2(cc) { 
+			document.getElementById("ccmirror2").innerHTML = cc
+		}
+	</script>
+</head>
+<body>
+	<div id="wrapper">
+	<div>
+		<p id="preview">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'halo.srt');
+			so.addVariable('captions.callback', 'ccmirror');
+			
+			so.write('preview');
+		</script>
+		Captions with JS callback (currently echoes to box below)
+		<pre id="ccmirror"><i>Captions appear here</i></pre>
+	</div>
+	<div>
+		<p id="preview2">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply2','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.state', false);
+			so.addVariable('captions.file', 'halo.srt');
+			so.addVariable('captions.callback', 'ccmirror2');
+			
+			so.write('preview2');
+		</script>
+		Captions with JS callback again, but default to off.
+		<pre id="ccmirror2"><i>Captions appear here</i></pre>
+	</div>
+	</div>
+</body>
+</html>
+
Index: /plugins/captions/v5/test/assets/margin.html
===================================================================
--- /plugins/captions/v5/test/assets/margin.html	(revision 1077)
+++ /plugins/captions/v5/test/assets/margin.html	(revision 1077)
@@ -0,0 +1,52 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+	<title>Captions plugin for JW 5 Player</title>
+	<style type='text/css'>
+	#wrapper { width:600px;margin-left:auto;margin-right:auto; }
+	</style>
+	<script type="text/javascript" src="swfobject.js"></script>
+</head>
+<body>
+	<div id="wrapper">
+	<div>
+		<p id="preview">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'halo.srt');
+			
+			// Margin offset for captions plugin
+			so.addVariable('captions.margin', '60');
+
+			so.write('preview');
+		</script>
+		SRT captions with <tt>captions.margin</tt> = 60 (only used in fullscreen).
+	</div>
+	<div>
+		<p id="preview2">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply2','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'halo.srt');
+			so.addVariable('captions.margin', '60');
+			so.addVariable('captions.fontsize', '20');
+
+			so.write('preview2');
+		</script>
+		As above, but with larger caption font.
+	</div>
+	</div>
+</body>
+</html>
+
Index: /plugins/captions/v5/test/assets/swfobject.js
===================================================================
--- /plugins/captions/v5/test/assets/swfobject.js	(revision 1077)
+++ /plugins/captions/v5/test/assets/swfobject.js	(revision 1077)
@@ -0,0 +1,4 @@
+/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
+	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
+*/
+var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();
Index: /plugins/captions/v5/test/assets/language.html
===================================================================
--- /plugins/captions/v5/test/assets/language.html	(revision 1077)
+++ /plugins/captions/v5/test/assets/language.html	(revision 1077)
@@ -0,0 +1,53 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+	<title>Captions plugin for JW 5 Player</title>
+	<style type='text/css'>
+	#wrapper { width:600px;margin-left:auto;margin-right:auto; }
+	</style>
+	<script type="text/javascript" src="swfobject.js"></script>
+</head>
+<body>
+	<div id="wrapper">
+	<div>
+		<p id="preview">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'english:halo.srt,spanish:halo-es.srt');
+			
+			so.write('preview');
+		</script>
+		Captions plugin with multiple SRT captions files, simulating a
+		multi-language configuration.
+	</div>
+	<div>
+		<p id="preview2">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply2','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('dock','false');
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'english:halo.srt,spanish:halo-es.srt');
+			
+			so.addVariable('backcolor','0x8f40a0');
+			so.addVariable('frontcolor','0xA08fA0');
+
+			so.write('preview2');
+		</script>
+		Multi-language configuration again, but without dock and with some
+		colors.
+	</div>
+	</div>
+</body>
+</html>
+
Index: /plugins/captions/v5/test/assets/plain.html
===================================================================
--- /plugins/captions/v5/test/assets/plain.html	(revision 1077)
+++ /plugins/captions/v5/test/assets/plain.html	(revision 1077)
@@ -0,0 +1,50 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+	<title>Captions plugin for JW 5 Player</title>
+	<style type='text/css'>
+	#wrapper { width:600px;margin-left:auto;margin-right:auto; }
+	</style>
+	<script type="text/javascript" src="swfobject.js"></script>
+	<script type="text/javascript">
+		var so = null;
+	</script>
+</head>
+<body>
+	<div id="wrapper">
+	<div>
+		<p id="preview">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'halo.srt');
+			
+			so.write('preview');
+		</script>
+		Minimal caption configuration with SRT captions. CC button in dock.
+	</div>
+	<div>
+		<p id="preview2">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply2','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('dock', 'false');
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'halo.srt');
+			
+			so.write('preview2');
+		</script>
+		Minimal caption configuration again. CC button in controlbar.
+	</div>
+	</div>
+</body>
+</html>
+
Index: /plugins/captions/v5/test/assets/halo.tt.xml
===================================================================
--- /plugins/captions/v5/test/assets/halo.tt.xml	(revision 1077)
+++ /plugins/captions/v5/test/assets/halo.tt.xml	(revision 1077)
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+ <tt xml:lang="en" xmlns="http://www.w3.org/2006/04/ttaf1"  xmlns:tts="http://www.w3.org/2006/04/ttaf1#styling">
+  <head>
+   <styling>
+      <style id="1" tts:textAlign="right" tts:color="#00ff00"/>
+      <style id="2" tts:color="#00ffff"/>
+      <style id="3" style="2" tts:backgroundColor="white"/>
+      <style id="4" style="2 3" tts:fontSize="20"/>
+   </styling>
+  </head>
+  <body>
+   <div xml:lang="en">
+    <p begin="00:00:00.00" dur="00:00:03.07" style="1">I had just joined <span tts:fontFamily="Verdana" tts:fontSize="+3">Macromedia</span> in 1996,</p>
+    <p begin="00:00:03.07" dur="00:00:03.35" style="2">and we were trying to figure out what to do about the <span tts:color="#ccccff">internet.</span></p>
+    <p begin="00:00:06.42" dur="00:00:03.15" style="3">And the company was in dire straights at the time.</p>
+    <p begin="00:00:09.57" dur="00:00:01.45">We were a CD-ROM authoring company,</p>
+    <p begin="00:00:11.42" dur="00:00:02.00" style="4">and the CD-ROM business was going away.</p>
+    <p begin="00:00:13.57" dur="00:00:02.50">One of the technologies I remember seeing was Flash.</p>
+    <p begin="00:00:16.47" dur="00:00:02.00">At the time, it was called <span tts:fontWeight="bold" tts:color="#ccc333">FutureSplash</span>.</p>
+    <p begin="00:00:18.50" dur="00:00:01.20">So this is where Flash got its start.</p>
+    <p begin="00:00:20.10" dur="00:00:03.00">This is smart sketch running on the <span tts:fontStyle="italic">EU-pin computer</span>,</p>
+    <p begin="00:00:23.52" dur="00:00:02.00">which was the first product that FutureWave did.</p>
+    <p begin="00:00:25.52" dur="00:00:02.00">So our vision for this product was to</p>
+    <p begin="00:00:27.52" dur="00:00:01.10">make drawing on the computer</p>
+    <p begin="00:00:29.02" dur="00:00:01.30" style="1">as <span tts:color="#ccc333">easy</span> as drawing on paper.</p>
+    </div>
+  </body>
+</tt>
Index: /plugins/captions/v5/test/assets/halo.srt
===================================================================
--- /plugins/captions/v5/test/assets/halo.srt	(revision 1077)
+++ /plugins/captions/v5/test/assets/halo.srt	(revision 1077)
@@ -0,0 +1,15 @@
+1
+00:00:02 --> 00:00:04
+Halo video, with SRT captions
+
+2
+00:00:04 --> 00:00:08
+<b>Based</b> on the Discovery channel ad campaign
+
+3
+00:00:08 --> 00:00:12
+Testing limited <font color="#ff0000" face="serif" size="11">font changes</font>
+
+5
+00:00:12 --> 00:00:19
+Testing <i>italic</i> and regular <u>underlined</u> text
Index: /plugins/captions/v5/test/assets/index.html
===================================================================
--- /plugins/captions/v5/test/assets/index.html	(revision 1077)
+++ /plugins/captions/v5/test/assets/index.html	(revision 1077)
@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+	<title>Captions plugin for JW 5 Player</title>
+	<style type='text/css'>
+	#wrapper { width:600px;margin-left:auto;margin-right:auto; }
+	</style>
+	<script type="text/javascript" src="swfobject.js"></script>
+	<script type="text/javascript">
+		var so = null;
+	</script>
+</head>
+<body>
+	<div id="wrapper">
+		<h2>Captions plugin test cases:</h2>
+		<ul>
+			<li><a href="plain.html">Base case</a>
+			<li><a href="language.html">Multi language</a>
+			<li><a href="js.html">Javascript callback</a>
+			<li><a href="margin.html">Margin offset</a>
+			<li><a href="tt.html">TT with styling</a>
+		</ul>
+	</div>
+</body>
+</html>
+
Index: /plugins/captions/v5/test/assets/jquery.js
===================================================================
--- /plugins/captions/v5/test/assets/jquery.js	(revision 1077)
+++ /plugins/captions/v5/test/assets/jquery.js	(revision 1077)
@@ -0,0 +1,19 @@
+/*
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
+/*
+ * Sizzle CSS Selector Engine - v0.9.3
+ *  Copyright 2009, The Dojo Foundation
+ *  Released under the MIT, BSD, and GPL Licenses.
+ *  More information: http://sizzlejs.com/
+ */
+(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
Index: /plugins/captions/v5/test/assets/tt.html
===================================================================
--- /plugins/captions/v5/test/assets/tt.html	(revision 1077)
+++ /plugins/captions/v5/test/assets/tt.html	(revision 1077)
@@ -0,0 +1,52 @@
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
+<head>
+	<title>Captions plugin for JW 5 Player</title>
+	<style type='text/css'>
+	#wrapper { width:600px;margin-left:auto;margin-right:auto; }
+	</style>
+	<script type="text/javascript" src="swfobject.js"></script>
+</head>
+<body>
+	<div id="wrapper">
+	<div>
+		<p id="preview">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'halo.tt.xml');
+			
+			so.write('preview');
+		</script>
+		Captions plugin with TT format, including stylesheet and inline-style
+		support. The <a href="halo.tt.xml">XML</a> file contains an assortment
+		of top level stylesheets with spans in individual caption lines.
+	</div>
+	<div>
+		<p id="preview2">You need Flash Player 8 and a browser with javascript to use this wizard!</p>
+		<script type="text/javascript">
+  			var so = new SWFObject('/player-5.0d.swf','ply2','480','380','9','#');
+			so.addParam('allowscriptaccess','always');
+			so.addParam('allowfullscreen','true');
+			so.addParam("wmode","transparent");
+
+			so.addVariable('dock','false');
+			so.addVariable('file','/video/halo.flv');
+			so.addVariable("plugins","./captions.swf");
+			so.addVariable('captions.file', 'halo.tt.xml');
+			
+			so.write('preview2');
+		</script>
+		Captions plugin with TT format, including stylesheet and inline-style
+		support. The <a href="halo.tt.xml">XML</a> file contains an assortment
+		of top level stylesheets with spans in individual caption lines.
+	</div>
+	</div>
+</body>
+</html>
+
Index: /plugins/captions/v5/test/assets/settings.js
===================================================================
--- /plugins/captions/v5/test/assets/settings.js	(revision 1077)
+++ /plugins/captions/v5/test/assets/settings.js	(revision 1077)
@@ -0,0 +1,43 @@
+var tests = {
+	'load test ...':{},
+	'TT captions with button in the dock': {
+		dock:'true',
+		plugins:'captions',
+		file:'../../testing/files/corrie.flv',
+		'captions.file':'files/corrie.xml'
+	},
+	'SRT captions with button in the controlbar': {
+		dock:'false',
+		plugins:'captions',
+		file:'../../testing/files/corrie.flv',
+		'captions.file':'files/corrie.srt'
+	},
+	'TT captions with styling': {
+		plugins:'captions',
+		file:'../../testing/files/bunny.flv',
+		'captions.file':'files/captions.xml'
+	},
+	'SRT captions with styling': {
+		plugins:'captions',
+		file:'../../testing/files/bunny.flv',
+		'captions.file':'files/captions.srt'
+	},
+	'Caption selector in the dock': {
+		plugins:'captions',
+		dock:'true',
+		file:'../../testing/files/bunny.flv',
+		'captions.file':'english:files/captions.srt,deutsch:files/captions.srt,nederlands:files/corrie.srt'
+	},
+	'Caption selector in the controlbar': {
+		plugins:'captions',
+		dock:'false',
+		file:'../../testing/files/bunny.flv',
+		'captions.file':'language 1:files/captions.srt,language 2:files/captions.srt,another one:files/corrie.srt'
+	},
+	'Javascript callback (console.log)': {
+		plugins:'captions',
+		file:'../../testing/files/corrie.flv',
+		'captions.file':'files/corrie.xml',
+		'captions.callback':'console.log'
+	},
+};
Index: /plugins/captions/v5/test/index.js
===================================================================
--- /plugins/captions/v5/test/index.js	(revision 1077)
+++ /plugins/captions/v5/test/index.js	(revision 1077)
@@ -0,0 +1,72 @@
+var settings = {
+	/** Player versions to test. **/
+	players: {
+		'5.0':'/player/tags/mediaplayer-5.0/player.swf',
+		'5.1':'/player/tags/mediaplayer-5.0/player.swf',
+		'trunk':'/player/trunk/fl5/player.swf'
+	},
+	/** Available JW4 plugins to test. **/
+	plugins: {
+		audiodescription:'/player/plugins/audiodescription/v5/audiodescription.swf',
+		captions:'../captions.swf',
+		hd:'/player/plugins/hd/v4/hd.swf'
+	},
+	/** PNG skins to test. **/
+	skins: {
+		none:'',
+		beelden:'/player/skins/beelden/beelden.xml',
+		bekle:'/player/skins/bekle/bekle.xml',
+		bluemetal:'/player/skins/bluemetal/bluemetal.xml',
+		classic:'/player/skins/classic/classic.xml',
+		five:'/player/skins/five/five.xml',
+        lulu:'/player/skins/lulu/lulu.xml',
+		modieus:'/player/skins/modieus/modieus.xml',
+		nacht:'/player/skins/nacht/nacht.xml',
+		snel:'/player/skins/snel/snel.xml',
+        stormtrooper:'/player/skins/stormtrooper/stormtrooper.xml'
+	},
+	/** All the setup examples with their flashvars. **/
+	examples: {
+		'':{},
+		'TT captions with button in the dock': {
+			dock:'true',
+			plugins:'captions',
+			file:'/player/testing/files/corrie.flv',
+			'captions.file':'/player/testing/files/corrie.xml'
+		},
+		'SRT captions with button in the controlbar': {
+			dock:'false',
+			plugins:'captions',
+			file:'/player/testing/files/corrie.flv',
+			'captions.file':'/player/testing/files/corrie.srt'
+		},
+		'TT captions with styling': {
+			plugins:'captions',
+			file:'/player/testing/files/bunny.flv',
+			'captions.file':'/player/testing/files/captions.xml'
+		},
+		'SRT captions with styling': {
+			plugins:'captions',
+			file:'/player/testing/files/bunny.flv',
+			'captions.file':'/player/testing/files/captions.srt'
+		},
+		'Caption selector in the dock': {
+			plugins:'captions',
+			dock:'true',
+			file:'/player/testing/files/bunny.flv',
+			'captions.file':'english:/player/testing/files/captions.srt,deutsch:/player/testing/files/captions.srt,nederlands:/player/testing/files/corrie.srt'
+		},
+		'Caption selector in the controlbar': {
+			plugins:'captions',
+			dock:'false',
+			file:'/player/testing/files/bunny.flv',
+			'captions.file':'language 1:/player/testing/files/captions.srt,language 2:/player/testing/files/captions.srt,another one:/player/testing/files/corrie.srt'
+		},
+		'Javascript callback (console.log)': {
+			plugins:'captions',
+			file:'/player/testing/files/corrie.flv',
+			'captions.file':'/player/testing/files/corrie.xml',
+			'captions.callback':'console.log'
+		}
+	}
+}
Index: /plugins/captions/v5/test/index.html
===================================================================
--- /plugins/captions/v5/test/index.html	(revision 907)
+++ /plugins/captions/v5/test/index.html	(revision 1077)
@@ -1,88 +1,442 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
-<html xmlns="http://www.w3.org/1999/xhtml" lang="EN"> 
+<html>
 <head>
+<title>JW Player Testing</title>
+<link rel="stylesheet" href="assets/style.css" type="text/css">
+<script type="text/javascript" src="assets/jquery.js"></script>
+<script type="text/javascript" src="assets/swfobject.js"></script>
+<script type="text/javascript" src="index.js"></script>
 <script type="text/javascript">
 
 
-	/** Insert your tests here **/
-	var tests = {
-		'load test ...':{},
-		'TT captions with button in the dock': {
-			dock:'true',
-			plugins:'captions',
-			file:'../../testing/files/corrie.flv',
-			'captions.file':'files/corrie.xml'
-		},
-		'SRT captions with button in the controlbar': {
-			dock:'false',
-			plugins:'captions',
-			file:'../../testing/files/corrie.flv',
-			'captions.file':'files/corrie.srt'
-		},
-		'TT captions with styling': {
-			plugins:'captions',
-			file:'../../testing/files/bunny.flv',
-			'captions.file':'files/captions.xml'
-		},
-		'SRT captions with styling': {
-			plugins:'captions',
-			file:'../../testing/files/bunny.flv',
-			'captions.file':'files/captions.srt'
-		},
-		'Caption selector in the dock': {
-			plugins:'captions',
-			dock:'true',
-			file:'../../testing/files/bunny.flv',
-			'captions.file':'english:files/captions.srt,deutsch:files/captions.srt,nederlands:files/corrie.srt'
-		},
-		'Caption selector in the controlbar': {
-			plugins:'captions',
-			dock:'false',
-			file:'../../testing/files/bunny.flv',
-			'captions.file':'language 1:files/captions.srt,language 2:files/captions.srt,another one:files/corrie.srt'
-		},
-		'Javascript callback (console.log)': {
-			plugins:'captions',
-			file:'../../testing/files/corrie.flv',
-			'captions.file':'files/corrie.xml',
-			'captions.callback':'console.log'
-		},
-	};
-
-
-	/** That's it! No changes needed past this point. **/
-	function loadTests() {
-		var html = '';
-		for(var tst in tests) {
-			var val = './?';
-			for (var itm in tests[tst]) { val += itm+'='+tests[tst][itm]+'&'; }
-			html += '<option value="'+val+'">'+tst+'</option>';
-		}
-		document.getElementById('testSelect').innerHTML = html;
-	};
-	function loadTest() {
-		document.location.href = document.getElementById('testSelect').value;
-	};
+
+
+	/**
+	* Initialization section. Parses settings.js and the browser querystring.
+	* This section is only executed on page (re)load.
+	**/
+
+	/** The complete list with all current flashvars. **/
+	var variables = {width:500,height:260};
+	/** When jQuery is loaded, we initialize everything. **/
+	$().ready(function() { loadSettings(); });
+	/** Load the settings and querystring. **/
+	function loadSettings() {
+		// load the settings.
+		for (itm in settings['examples']) { $("#examples").append("<option>"+itm+"</option>"); }
+		for (itm in settings['players']) { $("#players").append("<option>"+itm+"</option>"); }
+		for (itm in settings['skins']) { $("#skins").append("<option>"+itm+"</option>"); }
+		for (itm in settings['plugins']) { $("#plugins").append("<option>"+itm+"</option>"); }
+		// When an example is selected, we reload the entire page.
+		$("#examples").change(function(evt) {
+			evt.preventDefault();
+			var obj = settings.examples[$('#examples').val()];
+			window.top.location.href = window.top.location.pathname+'?'+$.param(obj);
+		 });
+		// get the options from the querystring.
+		window.top.location.search.replace(/\??(?:([^=]+)=([^&]*)&?)/g,function () {
+			variables[decodeURIComponent(arguments[1])] = decodeURIComponent(arguments[2]);
+		});
+		// set the value and handler on player, skin and plugins.
+		if(variables['player']) { $('#players').val(variables['player']); }
+		$("#players").change(function(evt) { reloadFieldsets(evt); });
+		if(variables['skin']) { $('#skins').val(variables['skin']); }
+		$("#skins").change(function(evt) { insertPlayer(evt); });
+		if(variables['plugins']) { $('#plugins').val(variables['plugins'].split(',')); }
+		$("#plugins").change(function(evt) { reloadFieldsets(evt); });
+		// set the handler on the flashvars and load the whole bunch.
+		$("#flashvarsform").submit(function(evt) { insertPlayer(evt); });
+		reloadFieldsets();
+	};
+
+
+
+
+	/**
+	* Fieldset insertion section. Loads the player/plugins XML files to print the appropriate fieldsets.
+	* This section is executed every time the player/plugins selection changes.
+	**/
+
+	/** The number of XML files that still need to be parsed. **/
+	var parsing;
+	/** All variables that are inserted in an XML-defined field. **/
+	var prefilled;
+	/** Check for inserting of fieldsets. **/
+	function reloadFieldsets(evt) {
+		if(evt) { evt.preventDefault(); }
+		$("#flashvarsform > .removable").remove();
+		$("#fieldsettabs > .removable").remove();
+		$("#custom > .removable").remove();
+		parsing = 1;
+		prefilled = {plugins:'',player:'',skin:''};
+		var swf = settings.players[$("#players").val()];
+		var xml = swf.substr(0,swf.length-4) + '.xml';
+		parsePlayerXML(xml);
+		var str = $("#plugins").val();
+		if(str != null) {
+			arr = str.toString().split(',');
+			for (var i=0; i<arr.length; i++) {
+				parsing++;
+				swf = settings['plugins'][arr[i]];
+				xml = swf.substr(0,swf.length-4) + '.xml';
+				parsePluginXML(xml,arr[i]);
+			}
+		}
+	};
+	/** Insert a specific plugin fieldset. **/
+	function parsePlayerXML(url) {
+		$.get(url,{},function(xml) {
+			var arr = $('player',xml).find('flashvars');
+			for (var i=0; i<arr.length; i++) {
+				var nam = $(arr[i]).attr('section').toLowerCase();
+				insertFieldset(arr[i],nam);
+			}
+			parsing--;
+			if(parsing == 0) { setCustomTabbing(); }
+		});
+	};
+	/** Insert a specific plugin fieldset. **/
+	function parsePluginXML(url,nam) {
+		$.get(url,{},function(xml) {
+			var arr = $('flashvars',xml).find('flashvar');
+			if(arr.length > 0) {
+				insertFieldset(xml,nam,true);
+			}
+			parsing--;
+			if(parsing == 0) { setCustomTabbing(); }
+		});
+	};
+	/** Insert a specific plugin fieldset. **/
+	function insertFieldset(xml,nam,plg) {
+		var tit = nam.substr(0,1).toUpperCase()+nam.substr(1);
+		var set = '<fieldset id="'+nam+'" class="removable">';
+		var arr = $(xml).find('flashvar');
+		$("#customli").before('<li class="removable">'+tit+'</li>');
+		for (var i=0; i<arr.length; i++) {
+			var val = $('name',arr[i]).text();
+			if(plg) { val = nam+'.'+val; }
+			set +='<label>'+val+'</label><input type="text" name="'+val+'" ';
+			if(variables[val]) {
+				set += 'value="'+variables[val]+'" ';
+				prefilled[val] = variables[val];
+			}
+			set += "/>";
+		}
+		set += '</fieldset>';
+		$('#custom').before(set);
+	};
+	/** Set the custom fields and the tabbing functionality. **/
+	function setCustomTabbing() {
+		for(var itm in variables) { 
+			if(prefilled[itm] == undefined) {
+				var elm = '<label class="removable">'+itm+'</label>'
+				elm += '<input type="text" name="'+itm+'" value="'+variables[itm]+'" class="removable"/>';
+				$("#custom").append(elm);
+			}
+		}
+		$('li').click(function() {
+			$('li').removeClass('active');
+			$(this).addClass('active');
+			var itm = $(this).text().toLowerCase();
+			doTab($.trim(itm));
+		});
+		doTab('sources');
+		insertPlayer();
+	};
+	/** Flip to a tab. **/
+	function doTab(itm) {
+		var arr = $("#flashvarsform").find('fieldset');
+		for(var i=0; i<arr.length; i++) {
+			if($(arr[i]).attr('id') == itm) {
+				$(arr[i]).css('display','block');
+			} else {
+				$(arr[i]).css('display','none');
+			}
+		}
+	};
+
+
+
+
+	/**
+	* Player insertion section. Gathers variables from all fields and prints the player on the page.
+	* This section is executed every time the flashvars form is submitted.
+	**/
+
+	/** Print the player on the page. **/
+	function insertPlayer(evt) {
+		if(evt) { evt.preventDefault(); }
+		var vrs = {};
+		variables = {}
+		variables['player'] = $('#players').val();
+		if($("#skins").val() != 'none') {
+			vrs['skin'] = settings['skins'][$("#skins").val()];
+			variables['skin'] = $("#skins").val();
+		}
+		if($("#plugins").val() != null) {
+			var plg = [];
+			var arr = $("#plugins").val();
+			for(var i=0; i<arr.length; i++) {
+				plg.push(settings['plugins'][arr[i]]);
+			}
+			vrs['plugins'] = plg.join(',');
+			variables['plugins'] = arr.join(',');
+		}
+		var arr = $("#flashvarsform").find('input');
+		for(var i=0; i<arr.length; i++) {
+			if($(arr[i]).val()) {
+				vrs[$(arr[i]).attr('name')] = $(arr[i]).val();
+				variables[$(arr[i]).attr('name')] = $(arr[i]).val();
+			}
+		}
+		$('#preview').css('height',vrs['height']);
+		$('#preview').html('<div id="container"></div>');
+		swfobject.embedSWF(
+			settings.players[$('#players').val()],
+			'container',
+			vrs['width'],
+			vrs['height'],
+			'9.0.0',
+			null,
+			vrs,
+			{allowfullscreen:'true',allowscriptaccess:'always'},
+			{id:'player',name:'player'}
+		);
+	};
+
+
+
+
+	/**
+	* Player API section. Contains functions for getting a player reference and executing API calls.
+	* This section is executed when a user starts interacting with the player API.
+	**/
+
+	/** Reference to the player **/
+	var player;
+	/** When the player is ready and the API forms can be shown, display them. **/
+	function playerReady(obj) {
+		player = document.getElementById(obj['id']);
+		$("#variablesform").submit(function(evt) { getVariable(evt); });
+		$("#sendeventform").submit(function(evt) { sendEvent(evt); });
+		$("#listenersform").submit(function(evt) { setListener(evt); });
+	};
+	/** Get a variable from the player. **/
+	function getVariable(evt) {
+		evt.preventDefault();
+		switch($('#vartype').val().toString()) {
+			case 'config':
+				var obj = player.getConfig();
+				break;
+			case 'playlist':
+				var obj = player.getPlaylist();
+				break;
+			case 'plugin.config':
+				var obj = player.getPluginConfig($('#configplugin').val());
+				break;
+		}
+		alertValue(obj);
+	};
+	/** Send an event to the player. **/
+	function sendEvent(evt) {
+		evt.preventDefault();
+		var typ = $('#sendevent').val();
+		var dat = $('#sendeventdata').val();
+		if(typ == 'LOAD' && dat.indexOf('{') > 0) {
+			var arr = new Array();
+			var ply = dat.split(';');
+			for(var i=0; i<ply.length; i++) {
+				var obj = new Object();
+				var itm = ply[i].split(',');
+				for(var j=0; j<itm.length; j++) {
+					obj[itm[j].split(':')[0]] = itm[j].split(':')[1];
+				}
+				arr.push(obj);
+			}
+			if(arr.length > 1) {
+				dat = arr;
+			} else { 
+				dat = obj;
+			}
+		}
+		player.sendEvent(typ,dat);
+	};
+	/** Set a listener to the player. **/
+	function setListener(evt) {
+		evt.preventDefault();
+		var arr = $('#eventtype').val().toString().split(': ');
+		var sel = $('#addremove').val().toString();
+		var fcn = 'alertValue';
+		if(arr.length == 2 && sel == 'add') {
+			if(arr[0] == 'Model') {
+				player.addModelListener(arr[1],fcn);
+			} else { 
+				player.addControllerListener(arr[1],fcn);
+			}
+		} else if(arr.length == 2 && sel == 'remove') {
+			if(arr[0] == 'Model') { 
+				player.removeModelListener(arr[1],fcn);
+			} else {
+				player.removeControllerListener(arr[1],fcn);
+			}
+		}
+	};
+	/** Alert responses from the player. **/
+	function alertValue(obj) {
+		var txt = '';
+		for (itm in obj) {
+			if(typeof(obj[itm]) == 'object') {
+				txt += itm+':\n';
+				for (ent in obj[itm]) {
+					txt += '  '+ent+': '+obj[itm][ent]+'\n';
+				}
+			} else {
+				txt += itm+': '+obj[itm]+'\n';
+			}
+		}
+		alert(txt);
+	};
+
+
+
+
 </script>
-
-
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
-<title>Test selector</title> 
-
-
-<style type="text/css">
-	html {overflow: auto;} 
-	html, body, div, iframe {margin: 0px; padding: 0px; height: 100%; border: none;} 
-	iframe {display: block; width: 100%; border: none; overflow-y: auto; overflow-x: hidden; } 
-	body { margin: 0; padding: 0; }
-	form { position:absolute; top:0; left: 40px; padding-top: 5px;}
-	select { margin:2px 0; border:1px solid #999; width: 360px; }
+<style  type="text/css" media="all">
+	body { font-family: Arial, sans-serif; padding: 20px 40px; }
+	a { color: #58C; }
+	object { display: block; margin: 0 auto; border: 1px solid #FFF; }
+	form, div { margin: 0 0 40px 0; }
+	fieldset { clear:both; padding: 5px 10px 10px 10px; margin: 0; background:#F5F5F5; border: 1px solid #7A2; }
+	hr { border:0;  clear: both; display: block; height: 10px; width: 100%; }
+	legend { padding: 0; font-weight: bold; }
+	label { display: block; float: left; width: 19%; font-size: 70%; margin: 5px 0 0 0; }
+	input, select { margin: 2px 0; border: 1px solid #999; display: block; float: left; width: 80%; }
+	button { margin: 0; padding: 5px 0; width: 100%; border: 0; background: #7A2; color: #FFF; }
+	li { list-style: none; display: block; float: left; padding: 8px 16px; color: #FFF; margin-right: 2px;
+		border-bottom: 2px solid #FFF; font-size: 70%; cursor: pointer; background: #7A2; }
+	ul { display: block; padding: 0; margin: 0; }
+	p { font-size: 85%; line-height: 150%; padding: 0 0 0 19%; }
+
+	#javascript { height: 100px; display: none; }
+	#javascript form { width: 32%; margin-right: 2%; float: left; }
+	#javascript #listenersform { float: right; margin: 0; }
+	#preview { background: #F5F5F5; text-align: center; }
+	#preview a { display: block; float: right; padding: 5px 10px; font-size: 80%; color: #666; }
+	#flashvarsform li.active { border-bottom: 2px solid #7A2; cursor: default; }
+	#flashvarsform fieldset { display: none; }
+	#plugins { height: 100px; }
 </style>
-
-
 </head>
-<body onload="loadTests()">
-<iframe id="testFrame" name="testFrame" src="../../../../testing/" frameborder="0" marginheight="0" marginwidth="0" width="100%" height="100%" scrolling="auto"></iframe>
-<form><select id="testSelect" name="testSelect" onchange="javascript:loadTest()"></select></form>
+<body>
+
+
+
+<form id="examplesform">
+	<fieldset>
+		<label>Load an example setup</label>
+		<select name="examples" id="examples"></select>
+	</fieldset>
+</form>
+
+
+
+<div id="javascript">
+	<form id="variablesform">
+		<fieldset>
+			<label>Variable</label>
+			<select type="text" id="vartype">
+				<option>config</option>
+				<option>playlist</option>
+				<option>plugin.config</option>
+			</select>
+			<label>Plugin</label>
+			<input type="text" id="configplugin" />
+		</fieldset>
+		<button type="submit" id="variablesbutton">Get variable</button>
+	</form>
+	<form id="sendeventform">
+		<fieldset>
+			<label>Event</label>
+			<select type="text" id="sendevent">
+				<option>ITEM</option>
+				<option>LINK</option>
+				<option>LOAD</option>
+				<option>MUTE</option>
+				<option>NEXT</option>
+				<option>PLAY</option>
+				<option>PREV</option>
+				<option>REDRAW</option>
+				<option>SEEK</option>
+				<option>STOP</option>
+				<option>VOLUME</option>
+			</select>
+			<label>Data</label>
+			<input type="text" id="sendeventdata" />
+		</fieldset>
+		<button type="submit" id="sendeventbutton">Send event</button>
+	</form>
+	<form id="listenersform">
+		<fieldset>
+			<label>Type</label>
+			<select type="text" id="addremove">
+				<option>add</option>
+				<option>remove</option>
+			</select>
+			<label>Event</label>
+			<select type="text" id="eventtype">
+				<option>Controller: ERROR</option>
+				<option>Controller: ITEM</option>
+				<option>Controller: MUTE</option>
+				<option>Controller: PLAY</option>
+				<option>Controller: PLAYLIST</option>
+				<option>Controller: RESIZE</option>
+				<option>Controller: SEEK</option>
+				<option>Controller: STOP</option>
+				<option>Controller: VOLUME</option>
+				<option></option>
+				<option>Model: BUFFER</option>
+				<option>Model: ERROR</option>
+				<option>Model: LOADED</option>
+				<option>Model: META</option>
+				<option>Model: STATE</option>
+				<option>Model: TIME</option>
+			</select>
+		</fieldset>
+		<button type="submit" id="listenersbutton">Set listener</button>
+	</form>
+</div>
+
+
+
+<div id="preview">
+<p>Testing is simple: choose an example, change the flashvars and see if it works.</p>
+</div>
+
+
+
+<form id="flashvarsform">
+	<ul id="fieldsettabs">
+		<li class="active">Sources</li>
+		<li id="customli">Custom</li>
+	</ul>
+	<fieldset></fieldset>
+	<fieldset id="sources">
+		<label>player</label>
+		<select id="players"></select>
+		<label>skin</label>
+		<select id="skins"></select>
+		<label>plugins</label>
+		<select multiple="multiple" id="plugins"></select>
+	</fieldset>
+	<fieldset id="custom">
+		<p>
+			This fieldset contains variables not claimed by the player or plugin. 
+			They can be entered in the browser querystring to show up here.
+		</p>
+	</fieldset>
+	<button type="submit">Reload player</button>
+</form>
+
+
+
 </body>
 </html>
Index: /plugins/captions/v5/doc/srt.rst
===================================================================
--- /plugins/captions/v5/doc/srt.rst	(revision 1077)
+++ /plugins/captions/v5/doc/srt.rst	(revision 1077)
@@ -0,0 +1,38 @@
+.. _srt:
+
+The SRT Captions Format
+=======================
+
+This guide explains the SRT format and the formatting options the Captions plugin supports.
+
+
+Example
+-------
+
+Here's an example SRT file:
+
+
+.. code-block:: text
+
+   1
+   00:00:08,000 --> 00:00:10,000
+   - Nothing is going on.
+
+   2
+   00:00:10,500 --> 00:00:12,500
+   You liar!
+
+   3
+   00:00:13,500 --> 00:00:15,000
+   Are you?
+
+   4
+   00:00:17,000 --> 00:00:20,000
+   Violet, please!
+   - I am not your babe!
+
+   5
+   00:00:24,000 --> 00:00:29,000
+   You stupid cow,
+   look what you gone and done now, ay.
+
Index: /plugins/captions/v5/doc/api.rst
===================================================================
--- /plugins/captions/v5/doc/api.rst	(revision 1077)
+++ /plugins/captions/v5/doc/api.rst	(revision 1077)
@@ -0,0 +1,9 @@
+.. _api:
+
+Captions API
+============
+
+The captions plugin features a small javascript API that can be used to:
+
+* Receive captions in javascript as they are printed in the player.
+* Toggle the display and/or language of these captions.
Index: /plugins/captions/v5/doc/skinning.rst
===================================================================
--- /plugins/captions/v5/doc/skinning.rst	(revision 1077)
+++ /plugins/captions/v5/doc/skinning.rst	(revision 1077)
@@ -0,0 +1,6 @@
+.. _skinning:
+
+Skinning the Captions plugin
+============================
+
+The captions plugin includes support for styling its controlbar button and popup menu through the JW Player PNG Skinning model. Styling of the captions themselves should be included in the DFXP or SRT captions file.
Index: /plugins/captions/v5/doc/dfxp.rst
===================================================================
--- /plugins/captions/v5/doc/dfxp.rst	(revision 1077)
+++ /plugins/captions/v5/doc/dfxp.rst	(revision 1077)
@@ -0,0 +1,30 @@
+.. _dfxp:
+
+The DFXP Captions Format
+========================
+
+This guide explains the DFXP format and the formatting options the Captions plugin supports.
+
+
+Example
+-------
+
+Here's an example DFX file:
+
+
+.. code-block:: xml
+
+   <tt xml:lang="en" xmlns="http://www.w3.org/2006/10/ttaf1">
+     <body>
+       <div xml:id="captions">
+         <p begin="00:00:08" end="00:00:10">- Nothing is going on.</p>
+         <p begin="00:00:10.5" end="00:00:12.5">You liar!</p>
+         <p begin="00:00:13.5" end="00:00:15">Are you?</p>
+         <p begin="00:00:17" end="00:00:20">Violet, please!<br/>- I am not your babe!</p>
+         <p begin="00:00:34" end="00:00:36">Vi, please.<br/>- Leave me alone!</p>
+         <p begin="00:00:36" end="00:00:38.5">- We need to talk.<br/>- Jason, are you deaf?!</p>
+         <p begin="00:00:41" end="00:00:42.9">What's going on?</p>
+         <p begin="00:00:43" end="00:00:45">Get out there and try to salvage this!</p>
+       </div>
+     </body>
+   </tt>
Index: /plugins/captions/v5/doc/conf.py
===================================================================
--- /plugins/captions/v5/doc/conf.py	(revision 1077)
+++ /plugins/captions/v5/doc/conf.py	(revision 1077)
@@ -0,0 +1,195 @@
+# -*- coding: utf-8 -*-
+#
+# JW Player for HTML5 documentation build configuration file, created by
+# sphinx-quickstart on Thu Apr 22 14:04:18 2010.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# Note that not all possible configuration values are present in this
+# autogenerated file.
+#
+# All configuration values have a default; values that are commented out
+# serve to show the default.
+
+import sys, os
+
+# If extensions (or modules to document with autodoc) are in another directory,
+# add these directories to sys.path here. If the directory is relative to the
+# documentation root, use os.path.abspath to make it absolute, like shown here.
+#sys.path.append(os.path.abspath('.'))
+
+# -- General configuration -----------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.todo']
+# extensions = ['sphinx.ext.todo']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The encoding of source files.
+#source_encoding = 'utf-8'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General information about the project.
+project = u'JW Player Captions Plugin'
+copyright = u'2010, Phillip Yen, Jeroen Wijering'
+
+# The version info for the project you're documenting, acts as replacement for
+# |version| and |release|, also used in various other places throughout the
+# built documents.
+#
+# The short X.Y version.
+version = '1.0'
+# The full version, including alpha/beta/rc tags.
+release = '1.0 beta'
+
+# The language for content autogenerated by Sphinx. Refer to documentation
+# for a list of supported languages.
+#language = None
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+#today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directory, that shouldn't be searched
+# for source files.
+exclude_trees = ['_build']
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+# A list of ignored prefixes for module index sorting.
+#modindex_common_prefix = []
+
+
+# -- Options for HTML output ---------------------------------------------------
+
+# The theme to use for HTML and HTML Help pages.  Major themes that come with
+# Sphinx are currently 'default' and 'sphinxdoc'.
+html_theme = 'default'
+
+# Theme options are theme-specific and customize the look and feel of a theme
+# further.  For a list of options available for each theme, see the
+# documentation.
+#html_theme_options = {}
+
+# Add any paths that contain custom themes here, relative to this directory.
+#html_theme_path = []
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+# html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+#html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_use_modindex = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, links to the reST sources are added to the pages.
+#html_show_sourcelink = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'JWPlayerCaptionsPlugindoc'
+
+
+# -- Options for LaTeX output --------------------------------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, documentclass [howto/manual]).
+latex_documents = [
+  ('index', 'JWPlayerHTML5.tex', u'JW Player Captions Plugin Documentation',
+   u'Phillip Yen, Jeroen Wijering','howto',True),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+latex_use_modindex = False
Index: /plugins/captions/v5/doc/Makefile
===================================================================
--- /plugins/captions/v5/doc/Makefile	(revision 1077)
+++ /plugins/captions/v5/doc/Makefile	(revision 1077)
@@ -0,0 +1,54 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS    =
+SPHINXBUILD   = sphinx-build
+PAPER         =
+BUILDDIR      = _build
+
+# Internal variables.
+PAPEROPT_a4     = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
+
+help:
+	@echo "Please use \`make <target>' where <target> is one of"
+	@echo "  html      to make standalone HTML files"
+	@echo "  dirhtml   to make HTML files named index.html in directories"
+	@echo "  pickle    to make pickle files"
+	@echo "  json      to make JSON files"
+	@echo "  htmlhelp  to make HTML files and a HTML help project"
+	@echo "  qthelp    to make HTML files and a qthelp project"
+	@echo "  latex     to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+	@echo "  changes   to make an overview of all changed/added/deprecated items"
+	@echo "  linkcheck to check all external links for integrity"
+	@echo "  doctest   to run all doctests embedded in the documentation (if enabled)"
+
+clean:
+	-rm -rf $(BUILDDIR)/*
+
+html:
+	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+	@echo
+	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+latex:
+	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+	@echo
+	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+	@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
+	      "run these through (pdf)latex."
+
+linkcheck:
+	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
+	@echo
+	@echo "Link check complete; look for any errors in the above output " \
+	      "or in $(BUILDDIR)/linkcheck/output.txt."
+
+doctest:
+	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
+	@echo "Testing of doctests in the sources finished, look at the " \
+	      "results in $(BUILDDIR)/doctest/output.txt."
Index: /plugins/captions/v5/doc/install.rst
===================================================================
--- /plugins/captions/v5/doc/install.rst	(revision 1077)
+++ /plugins/captions/v5/doc/install.rst	(revision 1077)
@@ -0,0 +1,55 @@
+.. _install:
+
+Installing the Captions plugin
+==============================
+
+This guide describes how to install the captions plugin in a JW Player. It also describes its configuration options, and the process of including captions in playlists.
+
+
+
+Simple Installation
+--------------------
+
+A simple installation requires two things: 
+
+* Including the captions plugin in the player's *plugins* flashvar.
+* Setting the **captions.file** flashvar to the location an :ref:`DFXP <dfxp>` or :ref:`SRT <srt>` captions file.
+
+
+Configuration options
+---------------------
+
+The following configuration options (flashvars) are available for the captions plugin: 
+
+.. describe:: captions.file
+
+   Location of the captions file(s) to display. Should be the URL to a valid :ref:`DFXP <dfxp>` or :ref:`SRT <srt>` captions file.
+
+.. describe:: captions.state
+
+   Describes whether to show the captions on startup or not. In case multiple languages are provided, this describes which language is shown.
+
+
+Captions in playlists
+---------------------
+
+Captions can be assigned one or more videos in a playlist. The JWPlayer namespace is used for this. Here's an example playlist in mRSS format with one video, including captions:
+
+.. code-block:: xml
+
+   <rss version="2.0" xmlns:jwplayer="http://www.longtailvideo.com/support">
+     <channel>
+       <title>Example RSS playlist with captions</title>
+   
+       <item>
+         <title>Coronation Street</title>
+         <description>Fragment from a Coronation Street episode that includes closed captions.</description>
+         <pubDate>Sat, 08 May 2010 00:00:00 GMT</pubDate>
+         <enclosure href="http://www.longtailvideo.com/files/corrie.mp4" />
+         <jwplayer:captions.file>http://www.longtailvideo.com/files/corrie.xml</jwplayer:captions.file>
+       </item>
+   
+     </channel>
+   </rss>
+
+Note you should not forget to still set the *plugins=captions* flashvar.
Index: /plugins/captions/v5/doc/index.rst
===================================================================
--- /plugins/captions/v5/doc/index.rst	(revision 1077)
+++ /plugins/captions/v5/doc/index.rst	(revision 1077)
@@ -0,0 +1,52 @@
+.. _overview:
+
+JW Player Captions Plugin
+=========================
+
+
+Introduction
+------------
+
+The Captions plugin for JW Player supports the display of one or more closed captions tracks with audio or video files. These captions are read from external files in either the W3C recommended DFXP (TimedText) XML format or in the SubRip Text plain-text format.
+
+The plugin features a small javascript API and can be skinned using the JW Player PNG skinning model.
+
+Installing
+----------
+
+ .. toctree::
+    :maxdepth: 2
+
+    install
+
+DFXP Captions
+-------------
+
+ .. toctree::
+    :maxdepth: 2
+
+    dfxp
+
+SRT Captions
+------------
+
+ .. toctree::
+    :maxdepth: 2
+
+    srt
+
+Javascript API
+--------------
+
+ .. toctree::
+    :maxdepth: 2
+
+    api
+
+Skinning the plugin
+-------------------
+
+ .. toctree::
+    :maxdepth: 2
+
+    skinning
