/**
 * KindaPlayer is a simple HTML/CSS based music-player
 *
 * http://github.com/MadRabbit/kinda-player
 *
 * Copyright (C) 2010 Nikolay Nemshilov
 */
var KindaPlayer=new Class(Observer,{extend:{EVENTS:$w('play pause resume stop finish load error loading playing select mute unmute jump'),Options:{controls:'prev play stop next mute list',showFx:'fade',showDuration:400,scrollFx:true,size:'full',volume:100,useID3:true,loop:true,loopDealy:4000,showPlaylist:true,popupLinks:'a[rel^=kinda-player]',albumLinks:'a[rel^=kinda-player-album]',autoplay:false},i18n:{prev:'Previous Song',next:'Next Song',play:'Play/Pause',stop:'Stop',mute:'Mute/Unmute',list:'Toggle playlist',close:'Close the player'},ready:false,index:[]},initialize:function(s,o){this.$super(o);this.element=this.build();this.setPlaylist(s);KindaPlayer.index.push(this)},insertTo:function(e,p){this.element.removeClass('kinda-player-popup').insertTo(e,p);return this},showAt:function(e){if(KindaPlayer.popup&&KindaPlayer.popup!==this)KindaPlayer.popup.hide();this.element.addClass('kinda-player-popup').addClass('kinda-player-nolist').insertTo(document.body).moveTo($(e).position()).show(this.options.showFx,{duration:this.options.showDuration});this.listEl.hide();return KindaPlayer.popup=this},hide:function(){if(this.element.hasClass('kinda-player-popup')&&this.element.visible()){this.stop().element.hide(this.options.showFx,{duration:this.options.showDuration});KindaPlayer.popup=null}return this}});KindaPlayer.include({build:function(){var e=$E('div',{'class':'kinda-player'}).insert([this.buildBox(),this.buildList()]);if(this.options.size=='mini')e.addClass('kinda-player-mini');if(!this.options.showPlayList)e.addClass('kinda-player-nolist');if(!KindaPlayer.ready)e.addClass('kinda-player-waiting');this.closeButton=$E('div',{html:'&times;','class':'kinda-player-button-close',title:KindaPlayer.i18n.close}).insertTo(e,'top').onClick(this.hide.bind(this));return e},buildBox:function(){this.boxEl=$E('div',{'class':'kinda-player-box'});this.boxEl.insert([this.buildStatus(),this.buildButtons()]);return this.boxEl},buildStatus:function(){this.statusLineEl=$E('div',{'class':'kinda-player-status-line'});this.statusLoadEl=$E('div',{'class':'kinda-player-status-load'});this.statusPlayEl=$E('div',{'class':'kinda-player-status-play'});this.statusTextEl=$E('div',{'class':'kinda-player-status-text'});this.statusTimeEl=$E('div',{'class':'kinda-player-status-time'});if(this.options.scrollFx)this.scrollingFx(this.statusTextEl);return this.statusEl=$E('div',{'class':'kinda-player-status'}).insert([this.statusTextEl,this.statusTimeEl,this.statusLineEl.insert([this.statusLoadEl,this.statusPlayEl])])},buildButtons:function(){this.prevButton=$E('input',{type:'button',value:'','class':'kinda-player-button-prev',title:KindaPlayer.i18n.prev});this.nextButton=$E('input',{type:'button',value:'','class':'kinda-player-button-next',title:KindaPlayer.i18n.next});this.playButton=$E('input',{type:'button',value:'','class':'kinda-player-button-play',title:KindaPlayer.i18n.play});this.stopButton=$E('input',{type:'button',value:'','class':'kinda-player-button-stop',title:KindaPlayer.i18n.stop});this.muteButton=$E('input',{type:'button',value:'','class':'kinda-player-button-mute',title:KindaPlayer.i18n.mute});this.listButton=$E('input',{type:'button',value:'','class':'kinda-player-button-list',title:KindaPlayer.i18n.list});return $E('div',{'class':'kinda-player-buttons'}).insert($w(this.options.controls).map(function(n){return this[n+'Button']},this).compact())},buildList:function(){return this.listEl=$E('ul',{'class':'kinda-player-list'})},rebuildList:function(){this.listEl.clean();this.playlist.each(function(s){this.listEl.insert($E('li',{html:s.title}))},this);[this.prevButton,this.nextButton].each(this.playlist.length<2?'disable':'enable');return this},scrollingFx:function(e){(function(){if(!e.scroll_direction)e.scroll_direction=1;var c=e.scrollLeft;var n=c+e.scroll_direction*1;e.scrollLeft=n;if(e.scrollLeft==c)e.scroll_direction*=-1}).periodical(400)}});KindaPlayer.include({setPlaylist:function(s){this.playlist=[];if(isString(s))s=[s];if(isArray(s))for(var i=0;i<s.length;i++)this.addToList(s[i]);else if(isHash(s))for(var a in s)this.addToList(a,s[a]);return this},addToList:function(u,t){if(!this.playlist)this.playlist=[];this.playlist.push(this.initSound({id:'p'+KindaPlayer.index.length+'_'+u.replace(/[^a-z0-9]/g,'_'),url:u,title:t||decodeURIComponent(u.split('/').last())}));return this.rebuildList()},select:function(i){if(this.playlist[i]){var p=this.current;this.current=i;this.currentItem=this.playlist[i];if(p!=i)this.fire('select')}return this},play:function(i){if(this.playing)this.playing.sound.stop();var a=this.select(i).currentItem;if(a){var e='play';this.setVolume(this.options.volume);if(a.sound.paused){a.sound.resume();e='resume'}else{a.sound.setPosition(0);a.sound.play()}this.playing=a;this.fire(e)}return this},pause:function(){if(this.playing){this.playing.sound.pause();this.playing=false;this.fire('pause')}return this},toggle:function(){return this.playing?this.pause():this.play(this.current||0)},stop:function(){if(this.playing){this.playing.sound.stop();this.playing=false;this.fire('stop')}return this},next:function(){return this.play((defined(this.current)&&this.playlist[this.current+1])?this.current+1:0)},prev:function(){return this.play((defined(this.current)&&this.playlist[this.current-1])?this.current-1:this.playlist.length-1)},mute:function(){var i=this.currentItem;if(i){var e=i.sound.muted?'unmute':'mute';i.sound[e]();this.fire(e)}return this},setVolume:function(v){if(isNumber(v)&&this.currentItem)this.currentItem.sound.setVolume(this.options.volume=v);return this},setPosition:function(p){if(isNumber(p)&&this.currentItem){if(p<0)p=0;if(p>100)p=100;var t=this.currentItem.sound;var d=t.loaded?t.duration:t.durationEstimate;if(d!==undefined)t.setPosition(d*p);this.fire('jump',p)}return this},initSound:function(a){if(KindaPlayer.ready){var c=function(p,n,i){if(i)p.fire(n,p.playlist.indexOf(i))};a.sound=soundManager.createSound({id:a.id,url:a.url,ondataerror:c.curry(this,'error',a),onfinish:c.curry(this,'finish',a),onload:c.curry(this,'load',a),onpause:c.curry(this,'pause',a),onplay:c.curry(this,'play',a),onresume:c.curry(this,'resume',a),onstop:c.curry(this,'stop',a),whileloading:c.curry(this,'loading',a),whileplaying:c.curry(this,'playing',a),onid3:this.updateID3.bind(this,a)})}return a},updateID3:function(b){var a=this.playlist.indexOf(b);var i=b.sound.id3;var t=i.songname;if(t&&i.artist)t+=" by "+i.artist;b.title=t;this.listEl.subNodes('li')[a].update(t);if(a===this.current)this.statusTextEl.update(t)}});KindaPlayer.include((function(){var o=KindaPlayer.prototype.initialize;return{initialize:function(){o.apply(this,arguments);this.listEl.onClick(function(e){var i=this.listEl.subNodes('li').indexOf(e.target);if(i>-1)this.play(i)}.bind(this));this.statusLineEl.onClick(function(e){if(this.currentItem){var d=this.statusLineEl.dimensions();this.play().setPosition((e.position().x-d.left)/d.width)}}.bind(this));this.prevButton.onClick(this.prev.bind(this));this.nextButton.onClick(this.next.bind(this));this.playButton.onClick(this.toggle.bind(this));this.stopButton.onClick(this.stop.bind(this));this.muteButton.onClick(this.mute.bind(this));this.listButton.onClick(this.toggleList.bind(this));this.on({select:function(i){this.liById(i).radioClass('kinda-player-list-selected');if(!this.playing){this.statusTextEl.update(this.currentItem.title);this.statusTimeEl.update('0:00/0:00')}},play:function(){this.element.addClass('kinda-player-playing');this.statusTextEl.update(this.currentItem.title)},pause:function(){this.element.removeClass('kinda-player-playing')},stop:function(){this.element.removeClass('kinda-player-playing')},finish:function(){this.element.removeClass('kinda-player-playing');if(this.options.loop&&this.playlist.length>1)this.next.bind(this).delay(this.options.loopDealy)},mute:function(){this.element.addClass('kinda-player-muted')},unmute:function(){this.element.removeClass('kinda-player-muted')},loading:function(i){this.updateStatus(i)},playing:function(i){this.updateStatus(i)}});this.select(0)},fire:function(n,i){return this.$super(n,isNumber(i)?i:this.current)},liById:function(i){return this.listEl.subNodes('li')[i]},toggleList:function(){var v=this.listEl.visible();this.listEl[v?'hide':'show']('slide');this.element[v?'addClass':'removeClass']('kinda-player-nolist')},updateStatus:function(i){if(i===this.current){var t=this.playlist[i].sound;var d=t.loaded?t.duration:t.durationEstimate;var p=t.position;this.statusPlayEl.style.width=(p/d*100).round()+'%';this.statusLoadEl.style.width=(t.bytesLoaded/t.bytesTotal*100).round()+'%';this.statusTimeEl.update(this.formatTime(p)+'/'+this.formatTime(d))}},formatTime:function(m){var t=(m/1000).round();var s=t % 60;if(s<10)s='0'+s;return(t/60).round()+":"+s}}})());soundManager.onready(function(){KindaPlayer.ready=true;KindaPlayer.index.each(function(p){p.playlist.each(function(i){p.initSound(i)});p.element.removeClass('kinda-player-waiting')})});$(document.documentElement).onClick(function(e){var t=$(e.target);if(t&&t.parents().length){if(t.match(KindaPlayer.Options.popupLinks)){e.stop();var a=t.match(KindaPlayer.Options.albumLinks)?$$(KindaPlayer.Options.albumLinks):[t];var d=a.indexOf(t);var c={};a.each(function(l){c[l.href]=l.innerHTML});var b=new KindaPlayer(c).select(d).showAt(t);if(KindaPlayer.Options.autoplay)b.play.bind(b,d).delay(KindaPlayer.Options.showDuration+100)}else if(KindaPlayer.popup){var p=t.parents();if(!p.slice(0,p.length-2).first('hasClass','kinda-player'))KindaPlayer.popup.hide()}}});document.write("<style type=\"text/css\">div.kinda-player,div.kinda-player*{margin:0px;padding:0px;width:auto;height:auto;border:none;background:none;list-style:none}div.kinda-player{width:20em;-moz-border-radius:.24em;-webkit-border-radius:.24em}div.kinda-player-waiting{opacity:0.6;filter:alpha(opacity=60)}div.kinda-player-waiting*{cursor:default !important}div.kinda-player-box,ul.kinda-player-list{color:#000;border:1px solid #BBB;background:#EEE;padding:.4em;position:relative;-moz-border-radius:.24em;-webkit-border-radius:.24em}div.kinda-player-status{position:relative;margin-bottom:.36em}div.kinda-player-status-line{position:relative;height:.4em;border:1px solid #AAA;-moz-border-radius:.2em;-webkit-border-radus:.2em;cursor:pointer;margin-top:.2em}div.kinda-player-status-play,div.kinda-player-status-load{position:absolute;width:0%;height:100%;background:#CCC;z-index:1;-moz-border-radius:.1em;-webkit-border-radus:.1em}div.kinda-player-status-play{background:#999;z-index:2}div.kinda-player-status-text{white-space:nowrap;overflow:hidden;padding:0 .2em;position:relative;z-index:3;margin-right:5.5em}div.kinda-player-status-time{position:absolute;top:0;right:.2em;white-space:nowrap;z-index:4}div.kinda-player-buttons{position:relative}div.kinda-player-buttons input{display:inline-block;*display:inline;*zoom:1;width:18px;height:18px;margin-right:2px;background-color:#CCC;background-image:url(/static/images/kinda_player_icons.png);background-repeat:no-repeat;border:1px solid #AAA;-moz-border-radius:.3em;-webkit-border-radius:.3em;cursor:pointer;opacity:0.7;filter:alpha(opacity=70)}div.kinda-player-buttons input:hover{opacity:1;filter:alpha(opacity=100)}div.kinda-player-buttons input:disabled,div.kinda-player-buttons input:disabled:hover{cursor:default;background-color:#BBB;opacity:0.3;filter:alpha(opacity=30)}input.kinda-player-button-prev{background-position:0px center}input.kinda-player-button-next{background-position:-16px center}input.kinda-player-button-play{background-position:-32px center}input.kinda-player-button-stop{background-position:-64px center}input.kinda-player-button-mute{background-position:-111px center}input.kinda-player-button-list{background-position:-80px center}div.kinda-player-muted input.kinda-player-button-mute{background-position:-127px center}div.kinda-player-playing input.kinda-player-button-play{background-position:-48px center}div.kinda-player-nolist input.kinda-player-button-list{background-position:-96px center}input.kinda-player-button-mute,input.kinda-player-button-list{position:absolute;top:0px;right:20px}input.kinda-player-button-list{right:0px}ul.kinda-player-list{margin:0;padding:0;border-top:none;background-color:#F8F8F8;padding:0 .2em;overflow:hidden}ul.kinda-player-list li{padding:.2em;cursor:pointer;color:#444;white-space:nowrap;overflow:hidden}ul.kinda-player-list li:hover{background:#CCC;color:#000}ul.kinda-player-list li.kinda-player-list-selected{color:#000;font-weight:bold}div.kinda-player-mini div.kinda-player-box{padding:.2em}div.kinda-player-mini div.kinda-player-status{position:relative;margin-left:42px;margin-bottom:0}div.kinda-player-mini div.kinda-player-status-line{margin-top:0}div.kinda-player-mini div.kinda-player-buttons{position:absolute;top:.2em;left:.2em}div.kinda-player-mini div.kinda-player-buttons input{}div.kinda-player-mini input.kinda-player-button-prev,div.kinda-player-mini input.kinda-player-button-next,div.kinda-player-mini input.kinda-player-button-stop,div.kinda-player-mini input.kinda-player-button-list,div.kinda-player-mini ul.kinda-player-list{display:none}div.kinda-player-mini input.kinda-player-button-mute{position:relative;right:auto}div.kinda-player-popup{position:absolute;display:none;z-index:9999;-moz-box-shadow:#888 .1em .2em .5em;-webkit-box-shadow:#888 .1em .2em .5em}div.kinda-player-button-close{font-weight:bold;cursor:pointer;width:10px;height:10px;color:#888;float:right;font-size:120%;margin-right:-14px;display:none;text-shadow:#CCC .1em .1em .1em}div.kinda-player-button-close:hover{color:#000}div.kinda-player-popup div.kinda-player-button-close{display:block}</style>");
