var player = new Object(); // path to script, that returns json encoded playlist { Array( Object[title, src]]) } player.dataSource = '/swftest/streams.php'; player.streams = new Array(); player.instance = null; player.isPlayStarted = false; player.index = null; player.playlistState = true; player.streamsJSON = '[{"title":"2010-05-23 - MainlyHousemix","src":"http:\/\/cmusic.test-all.eu\/uploads\/2010-05-23_MainlyHousemix.mp3"},{"title":"2009-11-20 - Koyote","src":"http:\/\/cmusic.test-all.eu\/uploads\/2009-11-20_Koyote_Main_Time_Mix.mp3"},{"title":"2009-07-31 - ChilloutElectronicamix","src":"http:\/\/cmusic.test-all.eu\/uploads\/2009-07-31_ChilloutElectronicamix.mp3"},{"title":"2009-07-06 - chartmix","src":"http:\/\/cmusic.test-all.eu\/uploads\/2009-07-06_chartmix.mp3"},{"title":"2009-04-29 - CraziestHouseLikeMixEva!","src":"http:\/\/cmusic.test-all.eu\/uploads\/2009-04-29_CraziestHouseLikeMixEva!.mp3"},{"title":"2009-01-01 - TechHouseMix","src":"http:\/\/cmusic.test-all.eu\/uploads\/2009-01-01_TechHouseMix.mp3"},{"title":"2008-12-26 - Christmas","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-12-26_Christmas_Electronica_Mix.mp3"},{"title":"2008-10-15 - MinimalMixI","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-10-15_MinimalMixI_Oktober_cut.mp3"},{"title":"2008-10-10 - TechHouse","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-10-10_TechHouse_Infusion.mp3"},{"title":"2008-10-10 - JaseHouseMix+++","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-10-10_JaseHouseMix+++.mp3"},{"title":"2008-10-03 - TechHouse","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-10-03_TechHouse_AfterhourMix.mp3"},{"title":"2008-09-24 - 130bpm","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-09-24_130bpm_ChillHouseMix.mp3"},{"title":"2008-09-09 - HardMinimalMix","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-09-09_HardMinimalMix.mp3"},{"title":"2008-09-02 - Nu","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-09-02_Nu_HouseMix_0808.mp3"},{"title":"2008-08-08 - TechHouse","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-08-08_TechHouse_BumpingMix.mp3"},{"title":"2008-07-24 - House","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-24_House_Mix1.mp3"},{"title":"2008-07-23 - Schlaflos","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-23_Schlaflos_TechnoMix_neu.mp3"},{"title":"2008-07-16 - GoodMorning","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-16_GoodMorning_TechHouseMix++.mp3"},{"title":"Thomas K - Untiteled","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-15_Thomas_K_100%25MinimalMix.mp3"},{"title":"2008-07-15 - Minimal","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-15_Minimal_Experimental_cut++.mp3"},{"title":"Thomas K - Untiteled","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-12_Thomas_K_MinimalMix.mp3"},{"title":"Thomas K - Untiteled","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-07_Thomas_K_TechHouseMix_part2.mp3"},{"title":"Thomas K - Untiteled","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-07_Thomas_K_TechHouseMix_part1.mp3"},{"title":"Thomas K - Untiteled","src":"http:\/\/cmusic.test-all.eu\/uploads\/2008-07-02_Thomas_K_TechnoMix.mp3"}]'; player.streams = eval("("+player.streamsJSON+")"); // helper methods player.getInstance = function(){ if (this.instance == null){ this.instance = jQuery('#swfplayer')[0]; } } // automatically starts or restores playback on page load player.autoStart = function(){ if (typeof(sessvars.index) != 'undefined' && typeof(this.streams[sessvars.index]) != 'undefined'){ player.playStream(sessvars.index); if (typeof(sessvars.position) != 'undefined'){ this.instance.SetVariable('metod.pause', ''); // ToDo: why needed timeout ? setTimeout('player.seek('+sessvars.position+');', 1000); } } else { player.playStream(0); } this.updatePlaylist(); } // stores position and index of stream is playing in client-side store player.savePlayingData = function(){ sessvars.position = this.position; sessvars.index = this.index; } // events handlers // this callback function is callen by flash player while it initializes player.onInit = function(){ this.getInstance(); if (!this.instance) return; this.autoStart(); this.instance.SetVariable('enabled', 'true'); } player.hoverBtn = function(el){ var src = el.src; src = src.replace('.png', '_hover.png'); el.src = src; } player.outBtn = function(el){ var src = el.src; src = src.replace('_hover', ''); el.src = src; } // this callback function periodically is called from flash to set playing properties in player object player.onUpdate = function(){ this.handleStreamEnd(); this.savePlayingData(); this.updateProgress(); } player.updateProgress = function(){ var pos = this.position; var dur = this.duration; var slider = jQuery('#slider'); var width = pos / dur * 100; if ( isNaN(width) ) width = 100; width += '%'; // alert(width); slider.css('width', width); } // detects if playback is ended and we need to change stream player.handleStreamEnd = function (){ if (this.position==0 && this.isPlayStarted){ if (this.isPlaying == 'false'){ this.next(); } } } player.updatePlaylist = function(){ var objStreams = jQuery('#playlist').children(); for (i=0; i= this.duration){ setTimeout('player.seek('+pos+')', 500); return; } this.instance.SetVariable('method:setPosition', pos); if (!this.isPlaying) this.instance.SetVariable('metod:play', ''); } player.next = function(){ if (this.index < this.streams.length - 1) this.index++; else this.index = 0 this.playStream(this.index); } player.prev = function(){ if (this.index > 0) this.index--; else this.index = this.streams.length - 1; this.playStream(this.index); } player.stop = function(){ this.instance.SetVariable('method:stop', ''); this.isPlayStarted = false; } player.pause = function(){ this.getInstance(); this.instance.SetVariable('method:pause', ''); } player.setVolume = function(volume){ this.getInstance(); this.instance.SetVariable('method:setVolume', volume+''); } // construction methods player.buildPlaylist = function(){ var sTmp = "" for (i=0; i'+ (i+1)+' ' +this.streams[i].title+''; } jQuery('#playlist').html(sTmp); } function findPos(obj) { var curleft = curtop = 0; if (obj.offsetParent) do { curleft += obj.offsetLeft; curtop += obj.offsetTop; } while (obj = obj.offsetParent); return {x:curleft,y:curtop}; } player.buildPlayer = function(){ jQuery('#btnPlay').click(function() { player.play();}); jQuery('#btnStop').click(function() { player.stop();}); jQuery('#btnPause').click(function() { player.pause();}); jQuery('#progressbar').click( function (evt){ var evt = (evt)?evt:window.event; var clickX = (evt.offsetX)?evt.offsetX: evt.pageX - findPos(this).x; var width = this.clientWidth; if (clickX < 0) clickX = 1; var position = parseInt(player.duration * clickX / width, 0) + ""; player.seek(position); } ); jQuery('#volumeBar').mouseup( function (evt){ var evt = (evt)?evt:window.event; var clickX = (evt.offsetX)?evt.offsetX: evt.pageX - findPos(this).x; var width = this.clientWidth; if (clickX < 0) clickX = 1; var volume = parseInt(200 * clickX / width, 0) + ""; player.setVolume(volume); jQuery('#volumeBar div').css('width', volume / 2 + '%' ); } ); this.getInstance(); } function createPlayer(){ if (FlashDetect.installed == false || FlashDetect.major < 8){ var wrp = document.getElementById('player_wrapper'); if (wrp) wrp.outerHTML = ''; wrp = document.getElementById('swfPlaceholder'); if (wrp) wrp.outerHTML = ''; return; } player.buildPlayer(); player.buildPlaylist(); } // initialization of player on DOM ready event jQuery(document).ready( function(){ createPlayer(); }); // Flash detection library var FlashDetect = new function(){ var self = this; self.installed = false; self.raw = ""; self.major = -1; self.minor = -1; self.revision = -1; self.revisionStr = ""; var activeXDetectRules = [ { "name":"ShockwaveFlash.ShockwaveFlash.7", "version":function(obj){ return getActiveXVersion(obj); } }, { "name":"ShockwaveFlash.ShockwaveFlash.6", "version":function(obj){ var version = "6,0,21"; try{ obj.AllowScriptAccess = "always"; version = getActiveXVersion(obj); }catch(err){} return version; } }, { "name":"ShockwaveFlash.ShockwaveFlash", "version":function(obj){ return getActiveXVersion(obj); } } ]; var getActiveXVersion = function(activeXObj){ var version = -1; try{ version = activeXObj.GetVariable("$version"); }catch(err){} return version; }; var getActiveXObject = function(name){ var obj = -1; try{ obj = new ActiveXObject(name); }catch(err){} return obj; }; var parseActiveXVersion = function(str){ var versionArray = str.split(",");//replace with regex return { "raw":str, "major":parseInt(versionArray[0].split(" ")[1], 10), "minor":parseInt(versionArray[1], 10), "revision":parseInt(versionArray[2], 10), "revisionStr":versionArray[2] }; }; var parseStandardVersion = function(str){ var descParts = str.split(/ +/); var majorMinor = descParts[2].split(/\./); var revisionStr = descParts[3]; return { "raw":str, "major":parseInt(majorMinor[0], 10), "minor":parseInt(majorMinor[1], 10), "revisionStr":revisionStr, "revision":parseRevisionStrToInt(revisionStr) }; }; var parseRevisionStrToInt = function(str){ return parseInt(str.replace(/[a-zA-Z]/g, ""), 10) || self.revision; }; self.majorAtLeast = function(version){ return self.major >= version; }; self.FlashDetect = function(){ if(navigator.plugins && navigator.plugins.length>0){ var type = 'application/x-shockwave-flash'; var mimeTypes = navigator.mimeTypes; if(mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin && mimeTypes[type].enabledPlugin.description){ var version = mimeTypes[type].enabledPlugin.description; var versionObj = parseStandardVersion(version); self.raw = versionObj.raw; self.major = versionObj.major; self.minor = versionObj.minor; self.revisionStr = versionObj.revisionStr; self.revision = versionObj.revision; self.installed = true; } }else if(navigator.appVersion.indexOf("Mac")==-1 && window.execScript){ var version = -1; for(var i=0; i