dojo.require("dojox.av.FLVideo"); dojo.require("dijit.form.Button"); dojo.require("dijit.form.HorizontalSlider"); dojo.require("dojo.dnd.Source"); dojo.require("dojo.parser"); dojo.require("dojox.analytics.Urchin"); var passthrough = function(msg){ //for catching messages from Flash if(window.console){ console.log(msg); } } var player, controls, progress, lib, libNode; var dndItem = {}; var extended = { onDropExternal: function(){ console.warn("DROP --- check to copy, move, or none:", dndItem); var node = dojo.byId(dndItem.dragNode.id); var target = dndItem.dropNode; if(target.id == "videoOverlay") return; arguments[2] = true; this.inherited("onDropExternal", arguments); } }; //dojo.extend(dojo.dnd.Source, extended); dojo.extend(dojo.dnd.Target, extended); //dojo.dnd.Target.prototype.onDropExternal = extended.onDropExternal; createRelated = function(items){ var txt = 'Related Items:' dojo.forEach(items, function(m){ var id = m.title.replace(/\s/g,""); var path = "media/"+id+".flv"; var thumb = "media/thumbs/"+id+".jpg"; txt += ''; }); txt +=''; return txt; } dojo.addOnLoad(function(){ libNode = dojo.byId("library"); //dojo.dnd.Source; jsId="dnd_library" within "libContainer" lib = dnd_library; dojo.xhrGet({ url:"items.json", handleAs:"json", load:function(items){ controls.setItems(items); var txt = ''; dojo.forEach(items, function(m){ var id = m.id = m.title.replace(/\s/g,""); var path = m.path = "media/"+id+".flv"; var thumb = m.thumb = "media/thumbs/"+id+".jpg"; txt += ''+ '
'+ '
'+ '
'+m.title+'
'+ '
'+m.desc+'
'+ '
'; }); libNode.innerHTML = txt; lib.sync(); controls.load(items[0].path); } }); player = new dojox.av.FLVideo({initialVolume:.2, isDebug:false}, "video"); dojo.connect(player, "onLoad", controls, "init"); dojo.connect(player, "onClick", controls, "toggle"); dojo.connect(player, "onMetaData", controls.progress, "onMeta"); dojo.connect(player, "onEnd", controls, "onEnd"); dojo.connect(player, "onStart", controls, "onStart"); dojo.connect(player, "onPosition", controls.progress, "onPosition"); dojo.subscribe("/dnd/source/over", function(evt){ //console.log("onDndSourceOver", evt); if(evt){ if(evt.node){ dndItem.dropNode = evt.node } if(evt.anchor){ dndItem.dragNode = evt.anchor } } }); dojo.subscribe("/dnd/start", function(evt){ console.log("onDndStart", evt)}); dojo.subscribe("/dnd/drop", function(evt){ //console.log( "onDndDrop", evt); //console.log("dndItem:", dndItem) var node = dojo.byId(dndItem.dragNode.id); var target = dndItem.dropNode; console.log("TARGET:", target) if(target.id=="videoOverlay"){ var path = dojo.attr(node, "path"); controls.load(path); controls.showPause(); } }); dojo.subscribe("/dnd/cancel", function(evt){ //console.log( "onDndCancel") }); new dojox.analytics.Urchin({ acct: "UA-3572741-1", GAonLoad: function(){ this.trackPageView("/demos/video"); } }); }); controls = { progress: { init: function(){ this.duration = null; this.seeking = false; this.progressBar = dijit.byId("progress"); dojo.connect(this.progressBar.sliderHandle, "mousedown", this, "startDrag"); this.timeNode = dojo.byId("timeNode"); this.durNode = dojo.byId("durNode"); this.initialized = true; }, onMeta: function(data){ if(data && data.duration){ this.duration = data.duration; this.durNode.innerHTML = this.timecode(this.duration); this.progressBar.attr("disabled", false); }else{ this.duration = null; this.durNode.innerHTML = "NA"; this.progressBar.attr("disabled", true); this.progressBar.attr("value", 0); } }, onDrag: function(val){ // if(this.seeking){ //console.log("DRAG:", val); var p = val*.01 player.seek(this.duration*p); } }, startDrag: function(){ this.seeking = true; this.conChg = dojo.connect(this.progressBar, "onChange", this, "onDrag"); this.conUp = dojo.connect(dojo.doc, "mouseup", this, "endDrag") }, endDrag: function(){ this.seeking = false; dojo.disconnect(this.conUp); dojo.disconnect(this.conChg); }, onPosition: function(time){ if(this.initialized){ this.timeNode.innerHTML = this.timecode(time); if(this.duration){ if(!this.seeking){ // IE freaks if the prgressBar's value goes over 1.0 var p = Math.min(time/this.duration, 1); this.progressBar.attr("value", p*100); } } } }, timecode: function(time){ ts = time.toString() if(ts.indexOf(".")<0){ ts += ".00" }else if(ts.length - ts.indexOf(".")==2){ ts+="0" }else if(ts.length - ts.indexOf(".")>2){ ts = ts.substring(0, ts.indexOf(".")+3) } return ts; } }, volume: { init:function(){ this.volNode = dojo.byId("volume"); this.volBack = dojo.byId("volBack"); dojo.setSelectable(this.volNode, false); dojo.setSelectable(this.volBack, false); dojo.setSelectable(dojo.byId("volMask"), false); this.volDim = dojo.coords(this.volNode); var v = player.initialVolume; // returns 0 - 1 dojo.style(this.volBack, "backgroundPosition", "-"+(this.volDim.w-(this.volDim.w*v))+"px 0px"); dojo.connect(this.volNode, "mousedown", this, "begDrag"); dojo.connect(dojo.doc, "mouseup", this, "endDrag"); dojo.connect(this.volNode, "mouseover", this, "over"); dojo.connect(this.volNode, "mouseout", this, "out"); }, onDrag: function(evt){ var x = evt.clientX - this.volDim.x; if(x<0) x = 0; if(x>this.volDim.w) x = this.volDim.w; var p = x/this.volDim.w; player.volume(p); var prex = x x = Math.ceil(x*.1)*10; dojo.style(this.volBack, "backgroundPosition", "-"+(this.volDim.w-x)+"px 0px"); }, begDrag: function(){ this.dragging = true; this.conMove = dojo.connect(dojo.doc, "mousemove", this, "onDrag"); }, endDrag: function(){ if(this.conMove) { dojo.disconnect(this.conMove); } this.dragging = false; this.out(); }, over: function(){ dojo.addClass(this.volBack, "volBackHover"); }, out: function(){ if(!this.dragging){ dojo.removeClass(this.volBack, "volBackHover"); } } }, init: function(){ this.progress.init(); this.volume.init(); this.initialized = true; }, setItems:function(_items){ this.items = _items; }, onStart: function(){ this.hideOverlay(); this.showPause(); if(this.conM1) dojo.disconnect(this.conM1); if(this.conM2) dojo.disconnect(this.conM1); if(this.conTog) dojo.disconnect(this.conTog); this.conTog = dojo.connect(dojo.byId("videoOverlay"), "click", this, "toggle"); }, toggle: function(){ if(player.isPlaying){ player.pause(); }else{ player.play(); } }, onEnd: function(){ console.log("onEnd") dojo.disconnect(this.conTog); var rel, m1, m2; for(var i=0, len=this.items.length;ilen-1){ m1=0; m2=1; }else if(m2>len-1){ m2=0; } break; } } m1 = this.items[m1]; m2 = this.items[m2]; var txt = createRelated([ m1, m2 ]); dojo.byId("relatedNode").innerHTML=txt; this.conM1 = dojo.connect(dojo.byId("click_"+m1.id), "click", this, function(){ this.load(m1.path); }); this.conM2 = dojo.connect(dojo.byId("click_"+m2.id), "click", this, function(){ this.load(m2.path); }); this.showOverlay(); this.showPlay(); console.log("onEnd done") }, hideOverlay: function(){ dojo.style(dojo.byId("relatedContainer"), "display", "none"); dojo.style(dojo.byId("relatedBack"), "display", "none"); }, showOverlay: function(){ dojo.style(dojo.byId("relatedContainer"), "display", ""); dojo.style(dojo.byId("relatedBack"), "display", ""); dojo.fadeIn({node:"relatedContainer", start:0, end:.9, duration:500}).play(); dojo.fadeIn({node:"relatedBack", start:0, end:.5, duration:500}).play(); }, doSlider: function(val){ console.log("VALUE:", val); }, load: function(path){ if(!this.initialized){ var c = dojo.connect(this, "init", this, function(){ this.load(path); dojo.disconnect(c); }); return; } console.log("Play:", path) this.currentPath = path; player.play(path); this.hideOverlay(); this.showPause(); }, doPlay: function(){ player.play(); this.hideOverlay(); this.showPause(); }, doPause: function(){ player.pause(); this.showPlay(); }, showPlay: function(){ dojo.style(dijit.byId("pauseButton").domNode, "display", "none"); dojo.style(dijit.byId("playButton").domNode, "display", ""); }, showPause: function(){ dojo.style(dijit.byId("pauseButton").domNode, "display", ""); dojo.style(dijit.byId("playButton").domNode, "display", "none"); } }