Changeset 1944


Ignore:
Timestamp:
08/09/11 08:13:37 (22 months ago)
Author:
jeroen
Message:

wrapped HTML5 version of related plugin

Location:
plugins/related
Files:
8 added
2 deleted
15 edited

Legend:

Unmodified
Added
Removed
  • plugins/related/build/build.xml

    r1938 r1944  
    22 
    33    <target name="buildJS"> 
     4        <concat destfile="../related.js"> 
     5            <fileset dir="../src/js" includes="*.js" /> 
     6        </concat> 
    47        <java jar="yuicompressor.jar" fork="true"> 
    5             <arg line="'../src/js/related.js'"/> 
     8            <arg line="'../related.js'"/> 
    69            <arg line="-o '../related.js'"/> 
    710        </java> 
  • plugins/related/doc/guide.html

    r1940 r1944  
    3030<p><img alt="Related Example Player" src="assets/related_example.png" style="margin-left: 10px" /></p> 
    3131 
    32 <p>The list of related videos is loaded using an mRSS feed. The plugin automatically renders up t0 2 rows of up to 5 related videos, depending upon how many fit the 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> 
    3333 
    3434<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> 
     
    4141 
    4242<dl> 
    43 <dt><strong>related.file</strong> ( <em>undefined</em> )</dt> 
     43<dt><strong>file</strong> ( <em>undefined</em> )</dt> 
    4444<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> 
    4646<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> 
    4848<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> 
    5050<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 
    5154</dl> 
    5255 
     
    110113 
    111114 
     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 
    112136 
    113137<h2>Playlist Support</h2> 
     
    164188 
    165189 
    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  
    177190<h2>Changelog</h2> 
    178191 
  • 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  
    3636        /** The plugin configuration options.**/ 
    3737        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. **/ 
    3941        private var _dimensions:Array; 
    4042        /** Link to the mRSS file with related videos. **/ 
     
    6365 
    6466        /** Display the related items on complete. **/ 
    65         private function _completeHandler(evt:MediaEvent):void {  
     67        private function _completeHandler(evt:MediaEvent):void { 
    6668            if(_config.oncomplete !== false) { 
    6769                setTimeout(show,50); 
     
    8890        /** Hide the list with related videos. **/ 
    8991        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); 
    9594            // Only 5.7+... 
    9695            try { 
     
    122121                _button = _player.controls.dock.addButton(_icon, "related", _dockHandler); 
    123122            } 
    124             // Add the background sheet. 
     123            // Add the background. 
     124            _container = new MovieClip(); 
     125            _container.alpha = 0; 
     126            _container.visible = false; 
     127            addChild(_container); 
    125128            _back = new Sprite(); 
    126129            _back.buttonMode = true; 
    127130            _back.addChild(new BackSheet()); 
    128131            _back.addEventListener(MouseEvent.CLICK,_backHandler); 
    129             addChild(_back); 
     132            _container.addChild(_back); 
    130133            // Add the replay and close buttons. 
    131134            _replay = new Sprite(); 
     
    133136            _replay.addChild(new ReplayButton()); 
    134137            _replay.addEventListener(MouseEvent.CLICK,_replayHandler); 
    135             addChild(_replay); 
     138            _container.addChild(_replay); 
    136139            _close = new Sprite(); 
    137140            _close.buttonMode = true; 
    138141            _close.addChild(new CloseButton()); 
    139142            _close.addEventListener(MouseEvent.CLICK,_backHandler); 
    140             addChild(_close); 
     143            _container.addChild(_close); 
    141144            // Add the text heading. 
    142145            _heading = new TextField(); 
     
    147150            _heading.selectable = false; 
    148151            _heading.filters = new Array(new DropShadowFilter(1,45,0,1,1,1,1)); 
    149             if(_config.heading) { 
     152            if(_config.heading !== undefined) { 
    150153                _heading.htmlText = _config.heading; 
    151154            } else { 
    152155                _heading.htmlText = "Watch related videos"; 
    153156            } 
    154             addChild(_heading); 
     157            _container.addChild(_heading); 
    155158            // Add the grid for thumbs 
    156159            _grid = new Sprite(); 
    157             addChild(_grid); 
     160            _container.addChild(_grid); 
    158161        }; 
    159162 
     
    190193        /** Loader has loaded the mRSS feed. **/ 
    191194        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            } 
    194202            var related:Array = new Array(); 
    195203            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); 
    198213                } 
    199214            } 
     
    212227                    thumb.y = (_dimensions[1]+10) * row; 
    213228                    _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) { 
    216233                            break; 
    217234                        } else { 
     
    223240                    } 
    224241                } 
    225                 resize(_back.width,_back.height); 
     242                resize(_dimensions[4],_dimensions[5]); 
    226243            } else { 
    227244                _errorHandler(new ErrorEvent(ErrorEvent.ERROR,false,false, 
     
    232249 
    233250        /** The replay button was clicked. **/ 
    234         private function _replayHandler(evt:MouseEvent):void {  
     251        private function _replayHandler(evt:MouseEvent):void { 
    235252            hide(); 
    236253            _player.seek(0); 
     
    245262            _close.x = width - 50; 
    246263            _grid.x = Math.round(width/2 - _grid.width/2); 
    247             _grid.y = Math.round(height/2 - _grid.height/2) + 10; 
     264            _grid.y = Math.round(height/2 - _grid.height/2) + 15; 
    248265            _heading.y = _grid.y - 30; 
    249266            _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]); 
    266273                } 
    267274            } 
     
    272279        public function show():void { 
    273280            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); 
    279282                _player.pause(); 
    280283                // Only 5.7+... 
  • plugins/related/src/as/RelatedThumb.as

    r1940 r1944  
    2929        /** Graphic over the image. **/ 
    3030        private var _glow:DisplayObject; 
     31        /** Height of the thumb. **/ 
     32        private var _height:Number; 
    3133        /** Overlay between the image and text. **/ 
    3234        private var _overlay:Sprite; 
     
    3537        /** TextField formatting. **/ 
    3638        private var _format:TextFormat; 
     39        /** Width of the thumb. **/ 
     40        private var _width:Number; 
    3741 
    3842 
    3943        /** Constructor. **/ 
    4044        public function RelatedThumb(width:Number,height:Number,image:String,link:String,title:String=null) { 
     45            _width = width; 
     46            _height = height; 
    4147            _link = link; 
    4248            _back = new Sprite(); 
    4349            _back.graphics.beginFill(0,1); 
    4450            _back.graphics.drawRect(0,0,width,height); 
    45             _back.filters = new Array(new DropShadowFilter(1)); 
     51            _back.filters = new Array(new DropShadowFilter(0)); 
    4652            addChild(_back); 
    4753            _loader = new Loader(); 
     
    5157            _mask = new Sprite(); 
    5258            _mask.graphics.beginFill(0,1); 
    53             _mask.graphics.drawRect(0,0,width,height); 
     59            _mask.graphics.drawRect(1,1,width-2,height-2); 
    5460            addChild(_mask); 
    5561            _loader.mask = _mask; 
    5662            _glow = new GlowSheet(); 
    57             _glow.width = width; 
     63            _glow.x = 1; 
     64            _glow.y = 1; 
     65            _glow.width = width-2; 
    5866            _glow.scaleY = _glow.scaleX; 
    5967            addChild(_glow); 
     
    6169                _overlay = new Sprite(); 
    6270                _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); 
    6472                addChild(_overlay); 
    6573                _field = new TextField(); 
     
    6775                _field.width = width-10; 
    6876                _field.x = 5; 
    69                 _field.y = height-21; 
     77                _field.y = height-22; 
    7078                _format = new TextFormat('Arial', 12, 0xFFFFFF); 
    7179                _format.align = 'center'; 
     
    94102                Bitmap(_loader.content).smoothing = true; 
    95103            } catch(e:Error) {} 
    96             Stretcher.stretch(_loader,_back.width,_back.height,Stretcher.FILL); 
     104            Stretcher.stretch(_loader,_width,_height,Stretcher.FILL); 
    97105        }; 
    98106 
     
    100108        /** Redirect on thumb click. **/ 
    101109        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)); 
    103114        }; 
    104115 
     
    106117        /** Redirect on thumb click. **/ 
    107118        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)); 
    109123        }; 
    110124 
  • plugins/related/src/js/related.js

    r1938 r1944  
    22 
    33 
    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        }; 
    6262 
    7263 
    8264        /** 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         }; 
    10295 
    11296 
     
    14299 
    15300    /** Register the plugin with JW Player. **/ 
    16     jwplayer().registerPlugin('related', template,'./related.swf'); 
     301    jwplayer().registerPlugin('related', related,'./related.swf'); 
    17302 
    18303 
  • plugins/related/test/assets/screencasts.xml

    r1940 r1944  
    22        <channel> 
    33                <item> 
     4                    <title>Uploading videos</title> 
    45                        <link>http://content.bitsontherun.com/previews/sFLjZ5Ne-izMKc5WX</link> 
    56                        <media:thumbnail url="http://content.bitsontherun.com/thumbs/sFLjZ5Ne-320.jpg" /> 
    67                </item> 
    78                <item> 
     9                    <title>Creating playlists</title> 
    810                        <link>http://content.bitsontherun.com/previews/WhmFbPBE-izMKc5WX</link> 
    911                        <media:thumbnail url="http://content.bitsontherun.com/thumbs/WhmFbPBE-320.jpg" /> 
    1012                </item> 
    1113                <item> 
     14                    <title>Building players</title> 
    1215                        <link>http://content.bitsontherun.com/previews/f3oBo7sS-izMKc5WX</link> 
    1316                        <media:thumbnail url="http://content.bitsontherun.com/thumbs/f3oBo7sS-320.jpg" /> 
    1417                </item> 
    1518                <item> 
     19                    <title>Video Analytics</title> 
    1620                        <link>http://content.bitsontherun.com/previews/erpBm96r-izMKc5WX</link> 
    1721                        <media:thumbnail url="http://content.bitsontherun.com/thumbs/erpBm96r-320.jpg" /> 
    1822                </item> 
    1923                <item> 
     24                    <title>Reseller overview</title> 
    2025                        <link>http://content.bitsontherun.com/previews/yDtLAunz-izMKc5WX</link> 
    2126                        <media:thumbnail url="http://content.bitsontherun.com/thumbs/yDtLAunz-320.jpg" /> 
  • plugins/related/test/dimensions.html

    r1940 r1944  
    88    body,td { padding: 50px; font: 13px/20px Arial; background: #EEE; } 
    99    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; } 
    1111    #player { -webkit-box-shadow: 0 0 5px #999; } 
     12    input { width: 30px; margin: 0 40px 0 10px; } 
    1213</style> 
    1314 
     
    2122<script type="text/javascript"> 
    2223function 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; 
    2328    jwplayer("player").setup({ 
    2429        file: 'http://content.bitsontherun.com/videos/nPripu9l-327.mp4', 
     
    2833        plugins: { 
    2934            '../related.js': { 
     35                dimensions: dimensions, 
    3036                file: feed, 
    3137                usedock: true 
     
    3642}; 
    3743</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> 
    3853 
    3954 
     
    5873    </tr> 
    5974    <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> 
    6479    </tr> 
    6580</table> 
    66  
    6781 
    6882<p> 
  • plugins/related/test/index.html

    r1938 r1944  
    2020<ul> 
    2121    <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> 
    2324</ul> 
    2425<ul> 
    2526    <li><a href="compatibility.html">Backward compatibility</a></li> 
     27    <li><a href="css.html">CSS Styling</a></li> 
    2628</ul> 
    2729 
  • plugins/related/test/options.html

    r1940 r1944  
    1919 
    2020<script type="text/javascript"> 
    21 function reload(oncomplete,usedock,heading) { 
     21function reload(oncomplete,usedock,titles,heading) { 
    2222    jwplayer("player").setup({ 
    2323        file: 'http://content.bitsontherun.com/videos/nPripu9l-327.mp4', 
     
    2929                file: 'assets/blender.xml', 
    3030                oncomplete: oncomplete, 
     31                titles: titles, 
    3132                usedock: usedock, 
    3233                heading: heading 
     
    4041 
    4142<ul> 
    42     <li><a href="javascript:reload(true,true,'Watch related videos');">Both enabled</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,'لوحة ال٠
    4546فاتيح العرؚية');">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> 
    4649</ul> 
    4750 
Note: See TracChangeset for help on using the changeset viewer.