Changeset 1944
- Timestamp:
- 08/09/11 08:13:37 (22 months ago)
- Location:
- plugins/related
- Files:
-
- 8 added
- 2 deleted
- 15 edited
-
assets/close.png (modified) (previous)
-
assets/notset.png (added)
-
assets/related.png (added)
-
assets/replay.png (modified) (previous)
-
assets/sheet.png (modified) (previous)
-
build/build.xml (modified) (1 diff)
-
doc/assets/related_dimensions.png (added)
-
doc/assets/related_example.png (modified) (previous)
-
doc/assets/related_iphone.png (deleted)
-
doc/guide.html (modified) (4 diffs)
-
related.js (modified) (1 diff)
-
related.swf (modified) (previous)
-
src/as/Related.as (modified) (12 diffs)
-
src/as/RelatedThumb.as (modified) (8 diffs)
-
src/js/related.js (modified) (2 diffs)
-
src/js/related.thumb.js (added)
-
test/assets/empty.xml (added)
-
test/assets/malformed.xml (added)
-
test/assets/screencasts.xml (modified) (1 diff)
-
test/css.html (added)
-
test/dimensions.html (modified) (5 diffs)
-
test/errors.html (added)
-
test/index.html (modified) (1 diff)
-
test/options.html (modified) (3 diffs)
-
test/recursion.html (deleted)
Legend:
- Unmodified
- Added
- Removed
-
plugins/related/build/build.xml
r1938 r1944 2 2 3 3 <target name="buildJS"> 4 <concat destfile="../related.js"> 5 <fileset dir="../src/js" includes="*.js" /> 6 </concat> 4 7 <java jar="yuicompressor.jar" fork="true"> 5 <arg line="'../ src/js/related.js'"/>8 <arg line="'../related.js'"/> 6 9 <arg line="-o '../related.js'"/> 7 10 </java> -
plugins/related/doc/guide.html
r1940 r1944 30 30 <p><img alt="Related Example Player" src="assets/related_example.png" style="margin-left: 10px" /></p> 31 31 32 <p>The list of related videos is loaded using an mRSS feed. The plugin automatically renders up t 0 2 rows of up to 5 related videos, depending upon how many fitthe screen. Buttons for re-playing the video and for closing the overlay are shown in the top corners.</p>32 <p>The list of related videos is loaded using an mRSS feed. The plugin automatically renders up to 2 rows of up to 5 related videos on the screen. Buttons for re-playing the video and for closing the overlay are shown in the top corners.</p> 33 33 34 34 <p>The plugin works in both Flash and HTML5, including touch devices like the iPad/iPhone and Android. When using a playlist, every entry can have its own related videos.</p> … … 41 41 42 42 <dl> 43 <dt><strong> related.file</strong> ( <em>undefined</em> )</dt>43 <dt><strong>file</strong> ( <em>undefined</em> )</dt> 44 44 <dd>Location of the mRSS file with related videos, e.g. <strong>http://example.com/related.xml</strong>.</dd> 45 <dt><strong> related.oncomplete</strong> ( <em>true</em> )</dt>45 <dt><strong>oncomplete</strong> ( <em>true</em> )</dt> 46 46 <dd>Whether to display the related videos screen when the video is completed. When set <strong>false</strong>, the screen does not automatically pop up.</dd> 47 <dt><strong> related.usedock</strong> ( <em>true</em> )</dt>47 <dt><strong>usedock</strong> ( <em>true</em> )</dt> 48 48 <dd>Whether to add a button to the player to pop up the related videos screen manually. When set <strong>false</strong>, this button is omitted.</dd> 49 <dt><strong> related.heading</strong> ( <em>Watch related videos</em> )</dt>49 <dt><strong>heading</strong> ( <em>Watch related videos</em> )</dt> 50 50 <dd>Single line heading displayed above the grid with related videos. Generally contains a short call-to-action.</dd> 51 <dt><strong>titles</strong> ( <em>true</em> )</dt> 52 <dd>Whether to show the titles over the thumbs or not. When set <strong>false</strong>, only the thumbnail images are shown.</dd> 53 51 54 </dl> 52 55 … … 110 113 111 114 115 <h2>Thumbnail dimensions</h2> 116 117 <p>By default, the thumbnails in the related videos screen are 140px wide by 70px high. The plugin will automatically render as many thumbs as fit the screen, with a maximum of 5 columns and 2 rows. A 10px spacing is used in between the thumbs:</p> 118 119 <p><img alt="Related Thumb Dimensions" src="assets/related_dimensions.png" style="margin-left: 10px" /></p> 120 121 <p>These dimensions can be changed by setting a configuration option: <strong>dimensions</strong>. This option needs to be a comma-separated list of the <em>width</em>, <em>height</em>, <em>columns</em> and <em>rows</em>. for example:</p> 122 123 <ul> 124 <li>Setting the dimensions option to <strong>"120,70,5,3"</strong> will render fairly small (120x70 pixels) thumbnails in up to 5 columns and 3 rows.</li> 125 <li>Setting the dimensions option to <strong>"200,120,2,1"</strong> will render up to two (one row, 2 columns) fairly large (200x120 pixels) thumbnails.</li> 126 </ul> 127 128 129 <h2>Device Support</h2> 130 131 <p>On touch devices (iPhone, iPad, Android), the related plugin fully functions, with one exception: the Related dock button is not available when the video is playing. This because no custom controls can be shown when a video plays in fullscreen.</p> 132 133 <p>Before and after playback, the player is displayed inline in the page and the related videos screen is available.</p> 134 135 112 136 113 137 <h2>Playlist Support</h2> … … 164 188 165 189 166 167 <h2>Device Support</h2>168 169 <p>On touch devices (iPhone, iPad, Android), the related plugin fully functions, with one exception: the Related dock button is not available when the video is playing. This because no custom controls can be shown when a video plays in fullscreen.</p>170 171 <p>Before and after playback, the player is displayed inline in the page and the related videos screen is available:</p>172 173 <p><img alt="Related on iPhone" src="assets/related_iphone.png" style="margin-left: 10px" /></p>174 175 176 177 190 <h2>Changelog</h2> 178 191 -
plugins/related/related.js
r1938 r1944 1 (function(a){var b=function(e, d,c){this.resize=function(g,f){}};a().registerPlugin("related",b,"./related.swf")})(jwplayer);1 (function(a){var b=function(e,t,w){var l;var g;var i;var q;var v;var u;var s;var j={cursor:"pointer",position:"absolute",left:"0px",top:"0px",margin:"0px",padding:"0px",display:"block",width:"50px",height:"50px"};var n={backgroundImage:"url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAGQCAYAAACJccGfAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJlJREFUeNrskksKwDAIRFV6/+v1Nv0sQymkBD+jVchGdOY5hIlop6GEHrXd75hOnNqNIA5Y0cQaPisLGiZgQbbzFdhrS0/ksUUhhb02aKW0Rh6w0i55OCqRdmLd6Mb4C7nzKJkYCqkPh4nLv0QXNIJsg9BRVkpz+Nj6oKOQ+qSuYZuH9HVCcka4qCEgiYnLtWze+Garfu0lwAArHE4YPfyZuAAAAABJRU5ErkJggg==)",backgroundRepeat:"no-repeat",backgroundSize:"100% 100%",opacity:0,webkitTransition:"opacity 150ms linear",MozTransition:"opacity 150ms linear",msTransition:"opacity 150ms linear",transition:"opacity 150ms linear",cursor:"pointer",visibility:"hidden"};var o={position:"absolute",border:"none",color:"#FFF",display:"block",font:"16px/24px Arial,sans-serif",overflow:"hidden",width:"240px",margin:"0 0 0 0",textAlign:"center",textTransform:"none",textShadow:"#000 1px 1px 0",padding:"0 0 0 0"};var z="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAArlJREFUeNrsWe1xozAQhZv8hw7sDkQH5CpwOnA6oATSQdIB7sC5CshVgFMBuQqcq0BZzT3N7SiAFiw7nol2ZkcyWi16Wn28xUkSJUqUKN9CtNYlaUPa68/So01BvXanjiddAGBFxY70lvRA+kz64piZtnvSNX6/oc+Q3R1pgbb7NE3/XCIKG9IjaWciIrTrUd94otv57EKC0FgKmdCuQr1FOQUmQx99NjBmOWG2Gqkd6RaD2rIBHrE0p3w0ErulQMyMdlI7FgkOorbREfjpJHZzQSgMoBTaNQMgKrYHtO+Uwp7xvnMukEYYjYYdq2MgSskSZVFpQgIxp04ttPOB6Oz9IfBXS+zmABGFmA18CkRnDwHhhatDgchmAuk8IOzSunogEhB2w68uBmTB0qo9IDp7DF80Igs3+xSI6is3+9zj1wdCf9XxWwovxJJR89FIzLwQVRJSZlIU7bBfC2IvoR44YMJTlIWkUTsgGikZPCtpXEjjWxaJ5ipo/AmJ1VGSMIVIrG5m5cVp+oteVNi0lepjqa6xeUeqWyDVLcj+3ZPqFhdJdQdoe6iPD2USJUqUKFFOSMLUGfyqKSZxDiClgBCaG79aQFi998yPmcRROQNfeSJUOlEyN3g+YJONTEwWerZ7psrSbJ498ogwrtWirFmOYZMvhf7Wz4ZNWM8+gPfBbn6e5FD5aJcHZrRnM2uBVGxgG/a8ZsA75lPZfAf+a+b/GHRpEZl7ZcvjCR8GODHkYojkLQDsRlyaPgf4OTAflkCad/5FWxIMCBMz+LsUYoBQ8duxeYHdQ/LvD58xPzn3w58zuzw4jWez/YAvNWvU145NDuqeAwyn72tsYuNnR/Wn5P+/Wz8RQeu/GIj2aTm783uLTbp31vkj3xdoN/U9s2nxLMOead2sk/WvsWdUEiVKlChRrlE+BBgA99ZhJqocsJoAAAAASUVORK5CYII=";var A="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAytJREFUeNrsWC2T2zAQdToBAQUGBYaGgYGBBgUGBwwPHAg8UFB4P+VgQMGBgoMGBQcLAw0NCgwKDAoMOpPuJk/TrWpL68S5Xue0Mxp/PUt6q11pd6MoSJAgQf4nmZ36436/T+myosbX2PrcUqupfcXz2oebzWbNsxIhAjyZAhPjwStMRoohGYsJ7wZwS2oJvj0SofbiRIjEEiR4sJIGrRW4d9R+YpKVY3VzEB/EueTNSBLXWIGth4TB8SosqP2gdoNvf2vz2NcW/1wP4c4mIsxpR4OyxjofDqbCWv5M7RvMpwCmj0zHfePfQdy5K3IwEwzkxcF3+P5R+MsnmE7htPXjGK0PN5oIaSbBZEolrsFKSBIlnPrg4MC6pAQunXJFeOtshnzCwr3FxG0SZge7h8+sPatSQyGrKYmkcEINbuEg8YCVmuO7TyolTk0k7tn/h3A+EhGcX+PItRI3bvtVytJDohzrxP+KSOohwedLJ7bqF0vki4dEa+KvU0ORc4i0Sqdj3HsPCT7srnCvWd12SiK1OAN8uLmHRC6wGn+rpyTCE0gUh9MOE75xkOD77yK8d6UIiQ83iggOp1po04dj03rqIVHB0WtX7kEkFsDXY3IUrbPz+RDTIIUCxxr/YJHYgYQ5a1ySK3HjiWCH4Y5XTAZac+FanPJXIipYuRIn7hOKWp2SYF06sYqFuV00sXqdqW5P2O4tKiiLDztFdB0kSJAgQV6J8KGpiMtUkQS19eQZIh+Cdk0KMVJqxV/xUOFgAG/I26lCgpjNK3MlgQ067JCbHOIhEVM1eP+AE3qD/zJ6frKiARPeM5lDDZmuHM5k/B4h0BaKyPBfPcnJz0R4UmK5zURvjRah5Vtxv+npJzMmh35irNBHs0JsStRygc8mWxErPZUF7MRoCpr1lUI5cGSl3CHYbGA+rP07eh+NSIVPJtInHWuSK+nQaOfDR8eyqTGbHNkkl2TvRYb47OUg1moB8yqiP0uri57aVQ6cId0hnV3AjFL4l9ypYg05LZFGaLvDsykwNNBuE/2u2DdwaLsIXeL/TDxHlnNXYoOo8D6NggQJEiTIS5RfAgwAwPzrJ/KrwvYAAAAASUVORK5CYII=";var B=function(){if(q){e.pause(true);w.style.visibility="visible";w.style.opacity=1;try{e.getPlugin("display").hide();e.getPlugin("dock").hide()}catch(C){}}};function y(C){if(t.oncomplete!==false){setTimeout(B,50)}}function k(C){if(C==q){console.log("RELATED: Failed to load "+C)}else{console.log("RELATED: "+C)}q=undefined;u.innerHTML="";d();if(t.usedock!==false){e.getPlugin("dock").setButton("related",B,A)}}function d(C){setTimeout(r,200);w.style.opacity=0;try{e.getPlugin("display").show();e.getPlugin("dock").show()}catch(D){}}function r(){w.style.visibility="hidden"}function p(D){q=undefined;u.innerHTML="";d();var C=e.getPlaylist()[D.index];if(C["related.file"]){q=C["related.file"]}else{if(t.file){q=t.file}}if(q){if(t.usedock!==false){e.getPlugin("dock").setButton("related",B,z)}a.utils.ajax(q,f,k)}else{k("No related videos file found")}}function f(D){var J=[];var K=[];try{J=a.utils.parsers.rssparser.parse(D.responseXML.firstChild)}catch(I){k("This feed is not valid XML and/or RSS.");return}for(var H=0;H<J.length;H++){if(J[H].image&&J[H].link&&J[H].title){var G={link:J[H].link,image:J[H].image};if(t.titles!==false){G.title=J[H].title}K.push(G)}}if(K.length){var E=0;var L=0;for(var F=0;F<K.length;F++){var C=a.related.thumb(i[0],i[1],K[F].image,K[F].link,K[F].title);u.appendChild(C);m(C,{left:((i[0]+10)*E)+"px",top:((i[1]+10)*L)+"px"});i[6]=Math.max(i[6],i[0]*(E+1)+10*E);i[7]=Math.max(i[7],i[1]*(L+1)+10*L);if(E==i[2]-1||(i[0]+10)*(E+2)>i[4]){if(L==i[3]-1||(i[1]+10)*(L+2)>i[5]-40){break}else{L++;E=0}}else{E++}}c(i[4],i[5])}else{k("RSS feed has 0 entries that contain title,link and image.")}}function h(){if(e.getRenderingMode()=="flash"){return}e.onPlaylistItem(p);e.onComplete(y);m(w,n);w.onclick=d;s=document.createElement("div");m(s,j);m(s,{background:"transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABKhJREFUeNrsWF1IY1cQvtGsVruSoCiKoqH+FVFvQClBxITimw/aLir4orCgxRfz5pOkqa9K1lSs+tCksKKomAgSlJImBRHqi0YRKihJ4y8oXuuu/z/TmXDvchH3p5uke6X3gyFzT85Jzndm5szMZRgZMmTIkCFDhoz/FwBAjfIM5bvHSkCJwgaDwd84jgOLxQI4vPSYCChQMq+vr394jUAdTk9Pwel0QklJCcTHx3/zGEh8jvLt1dXVKjwAsszY2Ngrq9X67FEQWVtbO4e34O7uDjY2NmBkZKRX8q6VmZkJZrMZDg4O3sYH1tfXoauryy51L2uOi4sDnU4Xio2TkxNwuVwwODgINzc3ISKXl5ehsZycnJeR+tPYKBDx3d7eBra3tw2zs7OfraysMKgzAwMDDF4CTFVVFRMbG8skJCQwaLXSxcVFNa6ZC/dPlVGyyi8o3uPjY83U1JRCqVQSCcDnL30+348syz5Rq9WMVquluVopxMRTlHKUr1G+QlG9Z36G2+3+ldzr4uICJicnKb94IrGXmDDXF+OG3Pjp3tra+qO9vf34PRu7zsrK+pMUhUIRcrFIIVwi15g3TklJSkpiCgoKSFW/Y74KA72CFIwj5uzsTDJEuL29vU2BSHl5OZOXl0c+zz7gVvEYJyXZ2dmhmDg/P2d2d3clkzeejo6O/oSnG7pW8YQBgxuQjI9OXzTvCYoBb689IZesrq5CZWVlxGIkbNTU1Jimp6ffJDt0NcDsDg6H43d8bEJ5jvIz5pBdYc7R0RH09vYSCekQSU9P/6Kpqekl5gv4EJDV6LZKS0sTKmJWMqk8MTHRgDkBMAG+kwRZor+/H5KTkwVr2KRYmthUKhU0NjbCzMwMbG5uwv7+PmBAh+JheHgYKioqAK9cgYRfHEdSgop3FfhAYRkZMmSIk6ceJWo5I+a/JOP1eg3RSoAx/+JEWRQLvUdAWeLHLHyK8KPU8mPNKCZ+jGB54LeaRd/TZw5vMZNoTq34OZIWoarWiE2RNzc3V9PZ2cnRGJbjLzAZajiOox6cyGiwgfoeC0hvfn5+AGGsr6+/T8bY1tbmxbUBbIc1VqvV29DQQC2AEdtfYfMtPT09VGCaIu7jHo9HyAF0gp7Dw0M/jZFOlqquriZrmfgXchw/z4SAvr6+Dn49zVW1trZyc3NzDrIIfU8bRt3W0dFBC2gdpKamkhs2R6vV9aL8RUp3d7dmeXmZVPJ9hvSJiQkDWoQe7cI8wvz8fF1paSmTkpJClg2YzWbv+Pi4lvoSEV4YjcYW7O+dWBU4saevw7G6aAe702AwMDs7O0bcoNFut1MvUqfT6ZZbWloYvV5/TL5PLrKwsOB801IWF5O7BIqKigxDQ0OBjIwMjfAduppPo9EsY6epRbcSDuPvaLmWh39WYVPlEF4k4ulSHPiDwaAFS3jw+0OxzOEa8nH/PdfyCIFOv2Gz2UCIBboI6K0kX4vVRusG1d+7PlV8BSvERLMQE6g7+M1wIj8Xr/eIikebUAnTepfLJaz7pIlPIGL6iLVkYa6srMz2yUt8igt+Ix9DhC0sLFwSbjwpVCQ5YWyElQoJGTJkSBD/CDAA0ma8tkQpWYgAAAAASUVORK5CYII=)"});s.onclick=x;w.appendChild(s);g=document.createElement("div");m(g,j);m(g,{background:"transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA0xJREFUeNrsVz1IW1EUjtKtQyh0yRQr2kFCIlHB7cUMBhpCXKKY5UVBnfwZWgUppFvHOEUkg84ucXBxeg1ChiKmUCQ0EV+K1Q4BnyKImujtOem95fp8pvTHeIX7weHlnXNeON+955x7rs0mISEhISEhISEh0UgQQoIgOyBvfuPnBvkM8lZEEiHCYWpqioA6buHnrVQqVeY3MzODfglhiFxfX1eICX19fRikypF4fnV1VTX7oQnELgSR9fX198QC/f39p2D2wM+nZ2dnJbN9aGiIEVFE2RRlcHCQwIrfIjMxMVG+vLz8aNZHIhFGQigimBqK1+vNn5yckHo4Pz8n4McI5EQicYNQR0fHzt7eniWJ3d1d4na7eRJ2m8Cw+/3+L1ZEVFV9NCSwOz07PDwsWhEBPenu7r7RzUQl8bJarX6tVyMXFxckEAgUhN0RiNEP58mNtgUtl8RiMbK/v3+L0MjIiC4cGYjrlTlQbMVdXV21mnA6neTo6OguMuIAVv67Ocienh5W2Bis4nK5vlmlmlDnyNLS0ms+uPHxcRaggSc7dfOEQqFT3m92dla8AxGCJNvb23xwKGGTnxoMBkmhUCDz8/O8n1C1kuACs5x+KeImv4RNQkLiUd3ZNZAHaaPN//sPfT7fh4c4E5r/YfXjIAY91xJ17CjTnD5Bv9FBwlRnp7tJ6NPTqBTCO7gOc9Rya2uroes66e3txQA1RVHI5OTktNlOdQoI3kMSeC+Zm5vDUz8MujQckEhWQ30+n89x08C9EolvbGyk6QzlpKJDMDoSWV1d1Xg7+gOIgkbYoVwuhys/3dbWhsEjQTzp9a2tLYPtDOjTfxLTk78lk81mB+DxDgTvHs6mpqYX7e3tGry3mO3sm0wm40P74uJiaXh4eKFYLJbgu07QLYyNjbWwMqPPgUbUyBrcMWywwLX8xndN036NI5ubm7wddysGxNZGR0cxuBWHw9GZTCYXjo+PMfhP+D00iRrRaDS6kkqlShyhe08v1TB+1vrBwcEy3sGBDKZPbZLFdKJ2A1IG7TpNLVbUBqQgNgl08pTL5RxrApFIBPVaI7ueSsd0fvDTuPYbp3aDGyDt1IeN+Ozu7uH0ekOKXUJCQkJCguKHAAMAvduPUQLB93IAAAAASUVORK5CYII=)"});g.onclick=d;w.appendChild(g);v=document.createElement("div");if(t.heading){v.innerHTML=t.heading}else{v.innerHTML="Watch related videos"}m(v,o);w.appendChild(v);u=document.createElement("div");w.appendChild(u);m(u,{position:"absolute"})}e.onReady(h);this.resize=function(E,C){if(e.getRenderingMode()=="flash"){return}if(!i){i=[140,80,5,2,E,C,0,0];if(t.dimensions){var F=t.dimensions.split(",");for(var D=0;D<4;D++){i[D]=Number(F[D])}}}c(E,C)};function c(D,C){m(w,{height:C+"px",width:D+"px"});m(g,{left:(D-50)+"px"});m(u,{left:Math.round(D/2-i[6]/2)+"px",top:Math.round(C/2-i[7]/2)+"px"});m(v,{left:Math.round(D/2-i[6]/2)+"px",width:i[6]+"px",top:Math.round(C/2-i[7]/2-30)+"px"})}function x(C){e.seek(0)}function m(C,D){for(var E in D){C.style[E]=D[E]}}};a().registerPlugin("related",b,"./related.swf")})(jwplayer);(function(a){if(a.related){return}a.related={};a.related.thumb=function(e,g,j,i,p){var b;var d={border:"1px solid #000",webkitBoxShadow:"0 0 4px #000",MozBoxShadow:"0 0 4px #000",msBoxShadow:"0 0 4px #000",boxShadow:"0 0 4px #000",backgroundColor:"#000",backgroundSize:"cover",position:"absolute",textDecoration:"none",display:"block",margin:"0 0 0 0",padding:"0 0 0 0"};var l;var o={psition:"absolute",left:"0px",top:"0px",border:"none",margin:"0 0 0 0",padding:"0 0 0 0"};var n;var k={backgroundColor:"rgba(0,0,0,0.8)",left:"0px",position:"absolute",border:"none",color:"#FFF",display:"block",font:"12px/26px Arial,sans-serif",overflow:"hidden",margin:"0 0 0 0",textAlign:"center",textDecoration:"none",textTransform:"none",padding:"0 0 0 0",height:"26px"};function f(q){c(b,{border:"1px solid #FFF",webkitBoxShadow:"0 0 4px #FFF",MozBoxShadow:"0 0 4px #FFF",msBoxShadow:"0 0 4px #FFF",boxShadow:"0 0 4px #FFF"})}function m(q){c(b,{border:"1px solid #000",webkitBoxShadow:"0 0 4px #000",MozBoxShadow:"0 0 4px #000",msBoxShadow:"0 0 4px #000",boxShadow:"0 0 4px #000"})}function h(){b=document.createElement("a");b.setAttribute("href",i);b.setAttribute("target","_top");b.onmouseout=m;b.onmouseover=f;c(b,d);c(b,{backgroundImage:"url("+j+")",width:(e-2)+"px",height:(g-2)+"px"});l=document.createElement("img");l.setAttribute("src","data:image/png;base64,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");c(l,o);c(l,{width:e-2+"px",height:g-20+"px"});b.appendChild(l);if(p){n=document.createElement("div");n.innerHTML=p;c(n,k);c(n,{top:(g-28)+"px",width:(e-2)+"px"});b.appendChild(n)}return b}function c(q,r){for(var s in r){q.style[s]=r[s]}}return h()}})(jwplayer); -
plugins/related/src/as/Related.as
r1940 r1944 36 36 /** The plugin configuration options.**/ 37 37 private var _config:Object; 38 /** Number of columns and rows in the grid. **/ 38 /** Clip with all graphics. **/ 39 private var _container:MovieClip; 40 /** Default dimensions for the grid. **/ 39 41 private var _dimensions:Array; 40 42 /** Link to the mRSS file with related videos. **/ … … 63 65 64 66 /** Display the related items on complete. **/ 65 private function _completeHandler(evt:MediaEvent):void { 67 private function _completeHandler(evt:MediaEvent):void { 66 68 if(_config.oncomplete !== false) { 67 69 setTimeout(show,50); … … 88 90 /** Hide the list with related videos. **/ 89 91 public function hide():void { 90 _back.visible = false; 91 _replay.visible = false; 92 _close.visible = false; 93 _grid.visible = false; 94 _heading.visible = false; 92 _back.alpha = 1; 93 new Animations(_container).fade(0,0.2); 95 94 // Only 5.7+... 96 95 try { … … 122 121 _button = _player.controls.dock.addButton(_icon, "related", _dockHandler); 123 122 } 124 // Add the background sheet. 123 // Add the background. 124 _container = new MovieClip(); 125 _container.alpha = 0; 126 _container.visible = false; 127 addChild(_container); 125 128 _back = new Sprite(); 126 129 _back.buttonMode = true; 127 130 _back.addChild(new BackSheet()); 128 131 _back.addEventListener(MouseEvent.CLICK,_backHandler); 129 addChild(_back);132 _container.addChild(_back); 130 133 // Add the replay and close buttons. 131 134 _replay = new Sprite(); … … 133 136 _replay.addChild(new ReplayButton()); 134 137 _replay.addEventListener(MouseEvent.CLICK,_replayHandler); 135 addChild(_replay);138 _container.addChild(_replay); 136 139 _close = new Sprite(); 137 140 _close.buttonMode = true; 138 141 _close.addChild(new CloseButton()); 139 142 _close.addEventListener(MouseEvent.CLICK,_backHandler); 140 addChild(_close);143 _container.addChild(_close); 141 144 // Add the text heading. 142 145 _heading = new TextField(); … … 147 150 _heading.selectable = false; 148 151 _heading.filters = new Array(new DropShadowFilter(1,45,0,1,1,1,1)); 149 if(_config.heading ) {152 if(_config.heading !== undefined) { 150 153 _heading.htmlText = _config.heading; 151 154 } else { 152 155 _heading.htmlText = "Watch related videos"; 153 156 } 154 addChild(_heading);157 _container.addChild(_heading); 155 158 // Add the grid for thumbs 156 159 _grid = new Sprite(); 157 addChild(_grid);160 _container.addChild(_grid); 158 161 }; 159 162 … … 190 193 /** Loader has loaded the mRSS feed. **/ 191 194 private function _loaderHandler(evt:Event):void { 192 var xml:XML = XML(evt.target.data); 193 var rss:Array = _parser.parse(xml); 195 try { 196 var xml:XML = XML(evt.target.data); 197 var rss:Array = _parser.parse(xml); 198 } catch (error:Error) { 199 _errorHandler(new ErrorEvent(ErrorEvent.ERROR,false,false,"This feed is not valid XML and/or RSS.")); 200 return; 201 } 194 202 var related:Array = new Array(); 195 203 for (var i:Number = 0; i < rss.length; i++) { 196 if(rss[i].image && rss[i].link) { 197 related.push(rss[i]); 204 if(rss[i].image && rss[i].link && rss[i].title) { 205 var entry:Object = { 206 image: rss[i].image, 207 link: rss[i].link 208 } 209 if(_config.titles !== false) { 210 entry.title = rss[i].title 211 } 212 related.push(entry); 198 213 } 199 214 } … … 212 227 thumb.y = (_dimensions[1]+10) * row; 213 228 _grid.addChild(thumb); 214 if(col == _dimensions[2]-1) { 215 if(row == _dimensions[3]-1) { 229 if(col == _dimensions[2]-1 || 230 (_dimensions[0]+10)*(col+2) > _dimensions[4]) { 231 if(row == _dimensions[3]-1 || 232 (_dimensions[1]+10)*(row+2) > _dimensions[5]-40) { 216 233 break; 217 234 } else { … … 223 240 } 224 241 } 225 resize(_ back.width,_back.height);242 resize(_dimensions[4],_dimensions[5]); 226 243 } else { 227 244 _errorHandler(new ErrorEvent(ErrorEvent.ERROR,false,false, … … 232 249 233 250 /** The replay button was clicked. **/ 234 private function _replayHandler(evt:MouseEvent):void { 251 private function _replayHandler(evt:MouseEvent):void { 235 252 hide(); 236 253 _player.seek(0); … … 245 262 _close.x = width - 50; 246 263 _grid.x = Math.round(width/2 - _grid.width/2); 247 _grid.y = Math.round(height/2 - _grid.height/2) + 1 0;264 _grid.y = Math.round(height/2 - _grid.height/2) + 15; 248 265 _heading.y = _grid.y - 30; 249 266 _heading.x = Math.round(width/2 - _heading.width/2); 250 // Determinie thumb grid dimensions on first resize. 251 if(!_dimensions) { 252 if (width >= 600) { 253 _dimensions = new Array( 254 160, 255 90, 256 Math.min(Math.floor(width/170),5), 257 Math.min(Math.floor((height-40)/100),2) 258 ); 259 } else { 260 _dimensions = new Array( 261 120, 262 70, 263 Math.min(Math.floor(width/130),5), 264 Math.min(Math.floor((height-40)/80),2) 265 ); 267 // Store thumb dimensions on first resize. 268 _dimensions = [140,80,5,2,width,height]; 269 if(_config.dimensions) { 270 var dim:Array = _config.dimensions.split(','); 271 for(var i:Number=0; i<dim.length; i++) { 272 _dimensions[i] = Number(dim[i]); 266 273 } 267 274 } … … 272 279 public function show():void { 273 280 if(_file) { 274 _back.visible = true; 275 _replay.visible = true; 276 _close.visible = true; 277 _grid.visible = true; 278 _heading.visible = true; 281 new Animations(_container).fade(1,0.2); 279 282 _player.pause(); 280 283 // Only 5.7+... -
plugins/related/src/as/RelatedThumb.as
r1940 r1944 29 29 /** Graphic over the image. **/ 30 30 private var _glow:DisplayObject; 31 /** Height of the thumb. **/ 32 private var _height:Number; 31 33 /** Overlay between the image and text. **/ 32 34 private var _overlay:Sprite; … … 35 37 /** TextField formatting. **/ 36 38 private var _format:TextFormat; 39 /** Width of the thumb. **/ 40 private var _width:Number; 37 41 38 42 39 43 /** Constructor. **/ 40 44 public function RelatedThumb(width:Number,height:Number,image:String,link:String,title:String=null) { 45 _width = width; 46 _height = height; 41 47 _link = link; 42 48 _back = new Sprite(); 43 49 _back.graphics.beginFill(0,1); 44 50 _back.graphics.drawRect(0,0,width,height); 45 _back.filters = new Array(new DropShadowFilter( 1));51 _back.filters = new Array(new DropShadowFilter(0)); 46 52 addChild(_back); 47 53 _loader = new Loader(); … … 51 57 _mask = new Sprite(); 52 58 _mask.graphics.beginFill(0,1); 53 _mask.graphics.drawRect( 0,0,width,height);59 _mask.graphics.drawRect(1,1,width-2,height-2); 54 60 addChild(_mask); 55 61 _loader.mask = _mask; 56 62 _glow = new GlowSheet(); 57 _glow.width = width; 63 _glow.x = 1; 64 _glow.y = 1; 65 _glow.width = width-2; 58 66 _glow.scaleY = _glow.scaleX; 59 67 addChild(_glow); … … 61 69 _overlay = new Sprite(); 62 70 _overlay.graphics.beginFill(0,0.8); 63 _overlay.graphics.drawRect( 0,height-26,width,26);71 _overlay.graphics.drawRect(1,height-27,width-2,26); 64 72 addChild(_overlay); 65 73 _field = new TextField(); … … 67 75 _field.width = width-10; 68 76 _field.x = 5; 69 _field.y = height-2 1;77 _field.y = height-22; 70 78 _format = new TextFormat('Arial', 12, 0xFFFFFF); 71 79 _format.align = 'center'; … … 94 102 Bitmap(_loader.content).smoothing = true; 95 103 } catch(e:Error) {} 96 Stretcher.stretch(_loader,_ back.width,_back.height,Stretcher.FILL);104 Stretcher.stretch(_loader,_width,_height,Stretcher.FILL); 97 105 }; 98 106 … … 100 108 /** Redirect on thumb click. **/ 101 109 private function _outHandler(event:MouseEvent):void { 102 _back.filters = new Array(new DropShadowFilter(1)); 110 _back.graphics.clear(); 111 _back.graphics.beginFill(0,1); 112 _back.graphics.drawRect(0,0,_width,_height); 113 _back.filters = new Array(new DropShadowFilter(0)); 103 114 }; 104 115 … … 106 117 /** Redirect on thumb click. **/ 107 118 private function _overHandler(event:MouseEvent):void { 108 _back.filters = new Array(new DropShadowFilter(0,45,0xFFFFFF,1,5,5,1.5)); 119 _back.graphics.clear(); 120 _back.graphics.beginFill(0xFFFFFF,1); 121 _back.graphics.drawRect(0,0,_width,_height); 122 _back.filters = new Array(new DropShadowFilter(0,45,0xFFFFFF)); 109 123 }; 110 124 -
plugins/related/src/js/related.js
r1938 r1944 2 2 3 3 4 /** This plugin displays a screen with related videos.**/ 5 var template = function(_player, _options, _div) { 4 /** 5 * Displays a grid with related videos on screen. 6 **/ 7 var related = function(_player, _options, _div) { 8 9 10 /** Reference to the container with elements. **/ 11 var _container; 12 /** Reference to the close button. **/ 13 var _close; 14 /** Array with thumb dimensions. **/ 15 var _dimensions; 16 /** mRSS feed that contains the related videos. **/ 17 var _file; 18 /** Reference to the heading text. **/ 19 var _heading; 20 /** Reference to the grid with thumbs. **/ 21 var _grid; 22 /** Reference to the replay button. **/ 23 var _replay; 24 25 26 /** Styling for close and replay buttons. **/ 27 var _buttonStyle = { 28 cursor: 'pointer', 29 position: 'absolute', 30 left: '0px', 31 top: '0px', 32 margin: '0px', 33 padding: '0px', 34 display: 'block', 35 width: '50px', 36 height: '50px' 37 }; 38 /** Styling for enclosing DIV. **/ 39 var _divStyle = { 40 backgroundImage: 'url(../assets/sheet.png)', 41 backgroundRepeat: 'no-repeat', 42 backgroundSize: '100% 100%', 43 opacity: 0, 44 webkitTransition: 'opacity 150ms linear', 45 MozTransition: 'opacity 150ms linear', 46 msTransition: 'opacity 150ms linear', 47 transition: 'opacity 150ms linear', 48 cursor: 'pointer', 49 visibility: 'hidden' 50 }; 51 /** styling for heading. **/ 52 var _headingStyle = { 53 position: 'absolute', 54 border: 'none', 55 color: '#FFF', 56 display: 'block', 57 font: '16px/24px Arial,sans-serif', 58 overflow: 'hidden', 59 width: '240px', 60 margin: '0 0 0 0', 61 textAlign: 'center', 62 textTransform: 'none', 63 textShadow: '#000 1px 1px 0', 64 padding: '0 0 0 0' 65 }; 66 67 68 /** Dock icon for related items found. **/ 69 var ICON_RELATED = '../assets/related.png'; 70 /** Dock icon for no related items. **/ 71 var ICON_NOT_SET = '../assets/notset.png'; 72 73 74 75 /** Display the related videos menu. **/ 76 var show = function() { 77 if(_file) { 78 _player.pause(true); 79 _div.style.visibility = 'visible'; 80 _div.style.opacity = 1; 81 try { 82 _player.getPlugin("display").hide(); 83 _player.getPlugin("dock").hide(); 84 } catch (e) { /* Only 5.7+ */ } 85 } 86 }; 87 88 89 /** Display the related items on complete. **/ 90 function _complete(event) { 91 if(_options.oncomplete !== false) { 92 setTimeout(show,50); 93 } 94 }; 95 96 97 /** Clean up dock when loading error occured. **/ 98 function _error(message) { 99 if(message == _file) { 100 console.log("RELATED: Failed to load "+message); 101 } else { 102 console.log("RELATED: "+message); 103 } 104 _file = undefined; 105 _grid.innerHTML = ''; 106 _hide(); 107 if(_options.usedock !== false) { 108 _player.getPlugin("dock").setButton('related',show,ICON_NOT_SET); 109 } 110 }; 111 112 113 /** Hide the related videos menu. **/ 114 function _hide(event) { 115 setTimeout(_hideWrap,200); 116 _div.style.opacity = 0; 117 try { 118 _player.getPlugin("display").show(); 119 _player.getPlugin("dock").show(); 120 } catch (e) { /* Only 5.7+ */ } 121 }; 122 123 124 /** Set invisibility after transition is done. **/ 125 function _hideWrap() { 126 _div.style.visibility = 'hidden'; 127 }; 128 129 130 /** Grab related videos from playlist item **/ 131 function _item(event) { 132 // Reset old data 133 _file = undefined; 134 _grid.innerHTML = ''; 135 _hide(); 136 // Check for new feed 137 var item = _player.getPlaylist()[event.index]; 138 if(item['related.file']) { 139 _file = item['related.file']; 140 } else if (_options['file']) { 141 _file = _options['file']; 142 } 143 // Load the feed and set the dock icon 144 if(_file) { 145 if(_options.usedock !== false) { 146 _player.getPlugin("dock").setButton('related',show,ICON_RELATED); 147 } 148 jwplayer.utils.ajax(_file, _loaded, _error); 149 } else { 150 _error("No related videos file found"); 151 } 152 }; 153 154 155 /** Create thumbs when RSS feed is loaded. **/ 156 function _loaded(event) { 157 var rss = []; 158 var related = []; 159 try { 160 rss = jwplayer.utils.parsers.rssparser.parse(event.responseXML.firstChild); 161 } catch (e) { 162 _error("This feed is not valid XML and/or RSS."); 163 return; 164 } 165 for (var i=0; i < rss.length; i++) { 166 if(rss[i].image && rss[i].link && rss[i].title) { 167 var obj = { link: rss[i].link, image: rss[i].image }; 168 if(_options.titles !== false) { 169 obj.title = rss[i].title; 170 } 171 related.push(obj); 172 } 173 } 174 // Render the thumbnails. 175 if(related.length) { 176 var col = 0; 177 var row = 0; 178 for(var j = 0; j < related.length; j++) { 179 // Append new thumb to grid. 180 var thumb = jwplayer.related.thumb( 181 _dimensions[0], 182 _dimensions[1], 183 related[j].image, 184 related[j].link, 185 related[j].title 186 ); 187 _grid.appendChild(thumb); 188 _style(thumb,{ 189 left: ((_dimensions[0]+10) * col)+'px', 190 top: ((_dimensions[1]+10) * row)+'px' 191 }); 192 // Store the new grid width and height 193 _dimensions[6] = Math.max(_dimensions[6],_dimensions[0]*(col+1)+10*col) 194 _dimensions[7] = Math.max(_dimensions[7],_dimensions[1]*(row+1)+10*row) 195 // Calculate column/row wrapping. 196 if(col == _dimensions[2]-1 || 197 (_dimensions[0]+10)*(col+2) > _dimensions[4]) { 198 if(row == _dimensions[3]-1 || 199 (_dimensions[1]+10)*(row+2) > _dimensions[5]-40) { 200 break; 201 } else { 202 row++; 203 col = 0; 204 } 205 } else { 206 col++; 207 } 208 } 209 _reposition(_dimensions[4],_dimensions[5]); 210 } else { 211 _error("RSS feed has 0 entries that contain title,link and image."); 212 } 213 }; 214 215 216 /** Set dock buttons when player is ready. **/ 217 function _setup() { 218 if(_player.getRenderingMode() == 'flash') { return; } 219 _player.onPlaylistItem(_item); 220 _player.onComplete(_complete); 221 _style(_div,_divStyle); 222 _div.onclick = _hide; 223 _replay = document.createElement("div"); 224 _style(_replay,_buttonStyle); 225 _style(_replay,{background:'transparent url(../assets/replay.png)'}); 226 _replay.onclick = _seek; 227 _div.appendChild(_replay); 228 _close = document.createElement("div"); 229 _style(_close,_buttonStyle); 230 _style(_close,{background:'transparent url(../assets/close.png)'}); 231 _close.onclick = _hide; 232 _div.appendChild(_close); 233 _heading = document.createElement("div"); 234 if(_options.heading) { 235 _heading.innerHTML = _options.heading; 236 } else { 237 _heading.innerHTML = "Watch related videos"; 238 } 239 _style(_heading,_headingStyle); 240 _div.appendChild(_heading); 241 _grid = document.createElement("div"); 242 _div.appendChild(_grid); 243 _style(_grid,{position:'absolute'}); 244 }; 245 _player.onReady(_setup); 246 247 248 /** Store thumb dimensions on first resize. **/ 249 this.resize = function(width,height) { 250 if(_player.getRenderingMode() == 'flash') { return; } 251 if(!_dimensions) { 252 _dimensions = [140,80,5,2,width,height,0,0]; 253 if(_options.dimensions) { 254 var dim = _options.dimensions.split(','); 255 for(var i=0; i<4; i++) { 256 _dimensions[i] = Number(dim[i]); 257 } 258 } 259 } 260 _reposition(width,height); 261 }; 6 262 7 263 8 264 /** Reposition elements upon a resize. **/ 9 this.resize = function(width,height) {}; 265 function _reposition(width,height) { 266 _style(_div,{ 267 height: height+'px', 268 width: width+'px' 269 }); 270 _style(_close,{left: (width-50)+'px'}); 271 _style(_grid,{ 272 left: Math.round(width/2 - _dimensions[6]/2)+'px', 273 top: Math.round(height/2 - _dimensions[7]/2)+'px' 274 }); 275 _style(_heading,{ 276 left: Math.round(width/2 - _dimensions[6]/2)+'px', 277 width: _dimensions[6]+'px', 278 top: Math.round(height/2 - _dimensions[7]/2 - 30)+'px' 279 }); 280 }; 281 282 283 /** Replay the current video. **/ 284 function _seek(event) { 285 _player.seek(0); 286 }; 287 288 289 /** Apply CSS styles to elements. **/ 290 function _style(element,styles) { 291 for(var property in styles) { 292 element.style[property] = styles[property]; 293 } 294 }; 10 295 11 296 … … 14 299 15 300 /** Register the plugin with JW Player. **/ 16 jwplayer().registerPlugin('related', template,'./related.swf');301 jwplayer().registerPlugin('related', related,'./related.swf'); 17 302 18 303 -
plugins/related/test/assets/screencasts.xml
r1940 r1944 2 2 <channel> 3 3 <item> 4 <title>Uploading videos</title> 4 5 <link>http://content.bitsontherun.com/previews/sFLjZ5Ne-izMKc5WX</link> 5 6 <media:thumbnail url="http://content.bitsontherun.com/thumbs/sFLjZ5Ne-320.jpg" /> 6 7 </item> 7 8 <item> 9 <title>Creating playlists</title> 8 10 <link>http://content.bitsontherun.com/previews/WhmFbPBE-izMKc5WX</link> 9 11 <media:thumbnail url="http://content.bitsontherun.com/thumbs/WhmFbPBE-320.jpg" /> 10 12 </item> 11 13 <item> 14 <title>Building players</title> 12 15 <link>http://content.bitsontherun.com/previews/f3oBo7sS-izMKc5WX</link> 13 16 <media:thumbnail url="http://content.bitsontherun.com/thumbs/f3oBo7sS-320.jpg" /> 14 17 </item> 15 18 <item> 19 <title>Video Analytics</title> 16 20 <link>http://content.bitsontherun.com/previews/erpBm96r-izMKc5WX</link> 17 21 <media:thumbnail url="http://content.bitsontherun.com/thumbs/erpBm96r-320.jpg" /> 18 22 </item> 19 23 <item> 24 <title>Reseller overview</title> 20 25 <link>http://content.bitsontherun.com/previews/yDtLAunz-izMKc5WX</link> 21 26 <media:thumbnail url="http://content.bitsontherun.com/thumbs/yDtLAunz-320.jpg" /> -
plugins/related/test/dimensions.html
r1940 r1944 8 8 body,td { padding: 50px; font: 13px/20px Arial; background: #EEE; } 9 9 td { padding: 0 20px 0 0; border-collapse: collapse; } 10 #player, p, ul, table { margin-top: 20px; display: block; }10 #player, p, ul, table, form { margin-top: 20px; display: block; } 11 11 #player { -webkit-box-shadow: 0 0 5px #999; } 12 input { width: 30px; margin: 0 40px 0 10px; } 12 13 </style> 13 14 … … 21 22 <script type="text/javascript"> 22 23 function reload(width,height,feed) { 24 var dimensions = document.getElementById("dimWidth").value + 25 "," + document.getElementById("dimHeight").value + 26 "," + document.getElementById("dimCols").value + 27 "," + document.getElementById("dimRows").value; 23 28 jwplayer("player").setup({ 24 29 file: 'http://content.bitsontherun.com/videos/nPripu9l-327.mp4', … … 28 33 plugins: { 29 34 '../related.js': { 35 dimensions: dimensions, 30 36 file: feed, 31 37 usedock: true … … 36 42 }; 37 43 </script> 44 45 46 47 <form> 48 <label>Width:</label><input type="text" id="dimWidth" value="140" /> 49 <label>Height:</label><input type="text" id="dimHeight" value="80" /> 50 <label>Cols:</label><input type="text" id="dimCols" value="5" /> 51 <label>Rows:</label><input type="text" id="dimRows" value="2" /> 52 </form> 38 53 39 54 … … 58 73 </tr> 59 74 <tr> 60 <td> 960x540:</td>61 <td><a href="javascript:reload( 960,540,'assets/blender.xml');">3 videos</a></td>62 <td><a href="javascript:reload( 960,540,'assets/screencasts.xml');">5 videos</a></td>63 <td><a href="javascript:reload( 960,540,'assets/heineken.xml');">15 videos</a></td>75 <td>800x450:</td> 76 <td><a href="javascript:reload(800,450,'assets/blender.xml');">3 videos</a></td> 77 <td><a href="javascript:reload(800,450,'assets/screencasts.xml');">5 videos</a></td> 78 <td><a href="javascript:reload(800,450,'assets/heineken.xml');">15 videos</a></td> 64 79 </tr> 65 80 </table> 66 67 81 68 82 <p> -
plugins/related/test/index.html
r1938 r1944 20 20 <ul> 21 21 <li><a href="playlist.html">Playlist support</a></li> 22 <li><a href="dimensions.html">Various Dimensions</a></li> 22 <li><a href="dimensions.html">Various dimensions</a></li> 23 <li><a href="errors.html">Error handling</a></li> 23 24 </ul> 24 25 <ul> 25 26 <li><a href="compatibility.html">Backward compatibility</a></li> 27 <li><a href="css.html">CSS Styling</a></li> 26 28 </ul> 27 29 -
plugins/related/test/options.html
r1940 r1944 19 19 20 20 <script type="text/javascript"> 21 function reload(oncomplete,usedock, heading) {21 function reload(oncomplete,usedock,titles,heading) { 22 22 jwplayer("player").setup({ 23 23 file: 'http://content.bitsontherun.com/videos/nPripu9l-327.mp4', … … 29 29 file: 'assets/blender.xml', 30 30 oncomplete: oncomplete, 31 titles: titles, 31 32 usedock: usedock, 32 33 heading: heading … … 40 41 41 42 <ul> 42 <li><a href="javascript:reload(true,true, 'Watch related videos');">Bothenabled</a></li>43 <li><a href="javascript:reload(true,false, 'Watch some additional related videos');">Only oncomplete, long heading</a></li>44 <li><a href="javascript:reload(false,true, 'ÙÙØØ© اÙÙ43 <li><a href="javascript:reload(true,true,true,'Watch related videos');">Oncomplete + dock enabled</a></li> 44 <li><a href="javascript:reload(true,false,true,'Watch some additional related videos');">Only oncomplete, long heading</a></li> 45 <li><a href="javascript:reload(false,true,true,'ÙÙØØ© اÙÙ 45 46 ÙØ§ØªÙØ Ø§ÙØ¹Ø±ØšÙØ©');">Only the dock, arab heading</a></li> 47 <li><a href="javascript:reload(false,true,false,'ÙÙØØ© اÙÙ 48 ÙØ§ØªÙØ Ø§ÙØ¹Ø±ØšÙØ©');">Only the dock, no thumb titles</a></li> 46 49 </ul> 47 50
Note: See TracChangeset
for help on using the changeset viewer.
