var outletim = new Class({
	initialize: function(root,theme){
		this.root = root;
		this.theme = theme;
		this.video = 0;
		this.playList = [];
		this.setLabel();
		if(Browser.Engine.trident && Browser.Engine.version == 4) { this.IE6=1; }
		if(Browser.Engine.trident) { this.IE=1; }
		return 0;
	},
/*--------------------------------------------------*/
//	FOOTER	
/*--------------------------------------------------*/
	footer: function(UID,PID,LIST){	
		this.UID = UID | 0;
		this.PID = PID | 0; // default playList ID
		this.order = [];
		this.player('build');
		this.listPL();
		return 0;
	},
/*--------------------------------------------------*/
//	AUTO LABEL
/*--------------------------------------------------*/
	setLabel: function(){		
		$(document.body).getElements('input.autoLabel, textarea.autoLabel').each(function(e){
			if(e.get('title')==e.get('value')) { 
				e.addClass('label'); 
				if(e.get('type')=='password'){ 
					e.set('type','text').addEvent('focus',function(){ this.set('type','password'); });
				}
			}
			e.addEvent('focus',function(){
				if(this.get('title')==this.get('value')) { 
					this.set('value','');
					this.removeClass('label');
				}
			});
			e.addEvent('blur',function(){
				if(!this.get('value')) {
					this.set('value',this.get('title'));
					this.addClass('label');
					if(e.get('type')=='password') this.set('type','text');
				}
			});
		});
		return 0;	
	},
	labelCheck: function(f){
		$(f).getElements('input.autoLabel, textarea.autoLabel').each(function(e){
			if(e.get('title')==e.get('value')) { e.set('disabled','true'); }
		});
	},
/*--------------------------------------------------*/
//	LOADER	
/*--------------------------------------------------*/
	loader: function(ID,color){
		if (color) return new Element('img',{'id':'loader'+ID,'class':'loader','src':this.root+'themes/'+this.theme+'/images/loader.gif'});
		else return new Element('img',{'id':'loader'+ID,'class':'loader','src':this.root+'themes/'+this.theme+'/images/loaderBlack2.gif'});
	},
/*--------------------------------------------------*/
//	outletimBOX	
/*--------------------------------------------------*/
	box: function(title,inner,loader,w,h,overlay,focus,enter){
		if($('outletimOverlay')){ outletim.closeBox(); }
		if(outletim.video) outletim.player('video',true);
		title = title?title:'&nbsp;'
		w = w?w:375;
		h = h?h:345;
		//if IE6
		if(outletim.IE6){
			window.scrollTo(0, 0);
			//$('outletim').setStyle('overflow','hidden');
			var c = window.getCoordinates();
			new Element('div',{'id':'outletimOverlay','styles':{'opacity':(overlay?overlay:.8),'width':c.width,'height':c.height},'events':{
				'click':function(){ outletim.closeBox(); }
			}}).inject($(document.body));
		} else {
			new Element('div',{'id':'outletimOverlay','styles':{'opacity':(overlay?overlay:.8)},'events':{
				'click':function(){ outletim.closeBox(); }
			}}).inject($(document.body));
		}
		var b = new Element('div',{'id':'outletimBOX','styles':{
			'margin-top':-h/2,'margin-left':-w/2,'width':w,'height':h
			,'display':loader?'none':'block'
		}}).inject($(document.body));
		new Element('span',{'class':'close','events':{
			'click':function(){ outletim.closeBox(); }
		}}).inject(new Element('div',{'class':'header','html':title}).inject(b),'top');
		if(loader){
			inner.inject(new Element('div',{'id':'outletimContainer'}).inject(b));
		} else new Element('div',{'id':'outletimContainer','html':inner}).inject(b);
		$(window).addEvent('keydown',function(e){ if(e.key=='esc' || (enter && e.key=='enter')) outletim.closeBox(); });
		$(document.body).addEvent('keydown',function(e){ if(e.key=='esc' || (enter && e.key=='enter')) outletim.closeBox(); });
		if(focus) $(focus).focus();
		return 0;	
	},
	setBox: function(){		
		$(document.body).getElements('a.outletimbox').each(function(e){
			e.addEvent('click',function(){				
				outletim.boxr(e.get('title'));
			});
			e.set('title',e.get('href'));
			e.erase('href');
			e.setStyle('cursor','pointer');
		});
		return 0;	
	},
	boxr: function(href,w,h){
		var content = new IFrame({ 
		    src: href, 'frameborder': 0, 'framescrool': 'no',			 
		    styles: { 'border':'0' },
		    events: { load: function(){ $('outletimBOX').setStyle('display','block'); }}				 
		});
		outletim.box('', content, 1, w, h);
	},
	closeBox: function(){ 
		if($('outletimOverlay'))$('outletimOverlay').destroy(); 
		if($('outletimBOX'))$('outletimBOX').destroy(); 
		$(window).removeEvents('click'); 
		$(window).removeEvents('keydown'); 
		$(document.body).removeEvents('click'); 
		$(document.body).removeEvents('keydown');
		if(outletim.video) outletim.player('video');
		//$('outletim').setStyle('overflow','auto');
	},
/*--------------------------------------------------*/
//	ALERT	
/*--------------------------------------------------*/
	alert: function(text,loader){
		if(loader) loader.destroy();
		var inner = '<table class="alert" cellpadding="0" cellspacing="0" border="0" height="100"><tr><td style="padding:13px;">'+text+'</td></tr></table>';
		outletim.box('', inner, 0, 400, 100, .6, null, 1);
		return 0;	
	},
/*--------------------------------------------------*/
//	CONFIRM	
/*--------------------------------------------------*/
	confirm: function(text,func){
		var inner = '<table class="confirm" cellpadding="0" cellspacing="0" border="0" height="100"><tr><td style="padding:13px;"><br />'+text+'</td></tr>'
			+'<tr><td class="buttons">'
			+'<input class="button cancel" onclick="outletim.closeBox();" value="'+lang.cancel+'" type="button" tabindex="2" />'
			+'<input id="approve" class="button approve" onclick="outletim.closeBox(); '+func+';" value="'+lang.approve+'" type="button" tabindex="1" />'
			+'</td></tr></table>';
		outletim.box('', inner, 0, 400, 100, .6, 'approve');
		return 0;	
	},
/*--------------------------------------------------*/
//	SORTABLE
/*--------------------------------------------------*/
	sortable: function(ID,handle){
		return new Sortables(ID, {
			handle: handle,	revert: 1, constrain: 1, clone: {opacity: .6}, opacity: .2,
			onStart: function(){ 
				outletim.order = this.serialize().filter(function(item){ return item != null; }); 
			},
			onComplete: function(e){
				e.highlight('#333','#000');
				var order = this.serialize().join(',');
				if(outletim.order.join(',')!=order && outletim.order.length > 0){
					new Request.JSON().post('/outletim::ord','PID='+outletim.PID+'&order='+order);
				}
			}
		});
	},
/*--------------------------------------------------*/
//	SEARCH	
/*--------------------------------------------------*/
	search: function(){
		if($('searchQuery').get('value')){
			var loader = outletim.loader(1,1).inject($('results').empty());
			if(outletim.searchRequest) outletim.searchRequest.cancel();
			outletim.searchRequest = new Request.JSON({
				onComplete: function(r){
					loader.destroy();
					if(r){
						//ADVERTISEMENT
						if(advertisement){
							var div = new Element('div',{'class':'item advertisement','html':advertisement}).inject('results');
							new Element('span',{'class':'clear'}).inject('results');
						}
						//-------------
						if(r.error) outletim.alert(r.error);
						else r.each(function(i){
							var div = new Element('div',{'class':'item'}).inject('results');
							new Element('a',{'class':'song','html':'['+outletim.formatTime(i.duration)+'] '+i.title,'events':{
								'click':function(e) {
									outletim.player('play',i);
								}
							}}).inject(div);
							new Element('a',{'class':'add','text':'+','events':{
								'click':function(e) {
									outletim.addSong(i.ID);
								}
							}}).inject(div);
							new Element('span',{'class':'clear'}).inject('results');
						});
						// close video and settings
						$('fzPlayer').removeClass('video');
					}
				}
			}).post('/search','query='+$('searchQuery').get('value'));
		}
	},
/*--------------------------------------------------*/
//	PLAYER	
/*--------------------------------------------------*/
	player: function(cmd,a) {
		switch(cmd){
			case 'build':				
				new Swiff(outletim.root+'lib/player/outletim.swf', {
				    id: 'video',
				    width: 450,
				    height: 20,
				    container: 'fzVideo', 
				    params: {
				        allowFullScreen: 'true',
				        scale: 'noborder',
				        align: 'b',
				        wMode: 'window'
				    }
				});
			break;
			case 'ready':
				$('video').set('spectrum',{'spectrumcolor':'991111'});
				if(song.ID) outletim.player('play',song);
			break;
			case 'play':
				if(outletim.playReq) outletim.playReq.cancel();
				outletim.playReq = new Request.JSON({ onComplete: function(s){ 
					outletim.playing = s;
					if($('footer').hasClass('close')&&!outletim.IE){
						$('footer').fade('hide');
						$('footer').removeClass('close');
					}			
					$('fzPlayer').removeClass('close');
					$('footer').fade('in');		
					if($('songs')) $('songs').getElements('li').each(function(s){ s.removeClass('playing') });
					if($('song'+outletim.playing.ID)) $('song'+outletim.playing.ID).getParent().addClass('playing');				
					$('video').set('load',s);
					$('playingSong').set('html',lang.nowPlaying + s.title);
					document.title = unescape(s.title) + ' / outletim.';
					$('provider').set('src','/themes/'+outletim.theme+'/images/providers/'+s.provider+'.gif');
					$('provider').addEvent('mouseover',function(e){ this.set('src','/themes/'+outletim.theme+'/images/providers/'+s.provider+'Hover.gif'); });
					$('provider').addEvent('mouseout',function(e){ this.set('src','/themes/'+outletim.theme+'/images/providers/'+s.provider+'.gif'); });
				}}).post('/outletim::song','SID='+a.ID);
			break;
			case 'stop':
				//if($('songs')) $('songs').getElements('li').each(function(s){ s.removeClass('playing') });
			break;
			case 'next':
				if($('song'+outletim.playing.ID)){
					if($('song'+outletim.playing.ID).getParent().getNext()){ $('song'+outletim.playing.ID).getParent().getNext().getFirst().getNext().fireEvent('click'); }
					else if($('songs').getFirst()){ $('songs').getFirst().getFirst().getNext().fireEvent('click'); }
				} else if($('songs') && $('songs').getFirst().getFirst()){ $('songs').getFirst().getFirst().getNext().fireEvent('click'); } //else { $('video').set('stop',{}); }
			break;
			case 'pre':
				if($('song'+outletim.playing.ID)){
					if($('song'+outletim.playing.ID).getParent().getPrevious()){ $('song'+outletim.playing.ID).getParent().getPrevious().getFirst().getNext().fireEvent('click'); }
					else if($('songs') && $('songs').getLast().getFirst()){ $('songs').getLast().getFirst().getNext().fireEvent('click'); }
				}
			break;
			case 'completed':
			case 'complated':
				outletim.player('next');
			break;
			case 'error':
				if($('song'+outletim.playing.ID)){
					outletim.player('next');
				} else { outletim.alert(lang.fileRemoved); }
				if(a!=150) new Request.JSON().post('/outletim::error','SID='+outletim.playing.ID);
			break;
			case 'video':
				$('fzPlayer').toggleClass('video');
				if(!a) outletim.video = $('fzPlayer').hasClass('video');
			break;
			case 'share':
				if(outletim.playing)
				outletim.boxr('/share/'+outletim.playing.ID,400,100);
			break;
			case 'report':
				if(outletim.playing)
					outletim.confirm(lang.reportDesc,'new Request.JSON({ onComplete: function(s){ outletim.alert(s.msg,0); }}).post(\'/outletim::report\',\'SID=\'+outletim.playing.ID);');
			break;
			case 'embed':
				if(outletim.playing)
				outletim.boxr('/embed/'+outletim.playing.ID,400,100);
			break;
		}
	},
/*--------------------------------------------------*/
//	PLAYLIST		
/*--------------------------------------------------*/
	togglePL: function() {
		$('PL').toggleClass('close');
	},
	song: function(a) {
		var li = new Element('li',{'id':a.ID,'events':{
			'mouseover':function(e){ this.getElement('.del').setStyle('visibility','visible'); },		
			'mouseout':function(e){ this.getElement('.del').setStyle('visibility','hidden'); }			
		}}).inject('songs');
		new Element('label',{'class':'handler','html':'&nbsp;'}).inject(li);
		new Element('span',{'id':'song'+a.ID,'class':'title','html':'['+outletim.formatTime(a.duration)+'] '+a.title,
			'events':{'click':function(){ outletim.player('play',a); }}}).inject(li);
		new Element('span',{'class':'del','text':'x','events':{'click':function(e){ outletim.removeSong(a.ID) }}}).inject(li);	
		new Element('span',{'class':'clear'}).inject(li);	
		return li;		
	},
	addSong: function(SID) {
		if($('footer').hasClass('close')&&!outletim.IE){
			$('footer').fade('hide');
			$('footer').removeClass('close');
		}			
		$('PL').removeClass('close');
		$('footer').fade('in');
		if($('song'+SID)) { $('song'+SID).getParent().highlight('#333','#000'); return; }
		var loader = this.loader(1).inject('songs');
		if($('songs').getElement('.error')) var error = $('songs').getElement('.error').dispose();	
		new Request.JSON({
			onComplete: function(s){ 
				if(s.error) { outletim.alert(s.error,loader); error.inject('songs'); }
				else outletim.songs.addItems(outletim.song(s).highlight('#333','#000').replaces(loader)); 
			}
		}).post('/outletim::add','PID='+this.PID+'&SID='+SID);
	},
	removeSong: function(songID) {
		$('song'+songID).empty();
		this.loader(1).inject('song'+songID);
		new Request.JSON({
			onComplete: function(s){ 
				outletim.songs.removeItems($('song'+s.ID).getParent()).destroy();
				if(!$('songs').getElements('li').length)  new Element('li',{'class':'error','text':lang.playlistHasCleared}).inject('songs');
			}
		}).post('/outletim::remove','PID='+this.PID+'&SID='+songID);
	},
	listSong: function(PID,title){
		if($('footer').hasClass('close')&&!outletim.IE){
			$('footer').fade('hide');
			$('footer').removeClass('close');
		}
		this.PID = PID;
		outletim.playingList(PID,title);
		$('playList').empty();
		var songs = new Element('ul',{'id':'songs'}).inject('playList');
		outletim.songs = outletim.sortable(songs,'label') // sortable
		var loader = outletim.loader(1).inject(songs);
		new Request.JSON({
			onComplete: function(r){
				loader.destroy();
				if(r==null||!r.length)
					new Element('li',{'class':'error','text':lang.noSongsYet}).inject(songs);
				else if(r.error){
				 	new Element('li',{'class':'error','text':r.error}).inject(songs);
				} else {
					r.each(function(s,i){
						outletim.songs.addItems(outletim.song(s)); 
					});
					$('PL').removeClass('close');
					$('footer').fade('in');
				}
			}
		}).post('/outletim::get','PID='+PID);
	},
	formatTime: function(time) {
		if (time > 0) {
			var integer = ((time*.0166)>>0).toString();
			var decimal = ((time%060)>>0).toString();
			return ((integer.length<2)?'0'+integer:integer)+":"+((decimal.length<2)?'0'+decimal:decimal);
		} else return '00:00';
	},
/*--------------------------------------------------*/
//	PLAYLISTS	
/*--------------------------------------------------*/
	togglePLS: function() {
		$('PLS').toggleClass('close');
	},
	PL: function (ID, title){
		var li = new Element('li',{'id':'pL'+ID,'events':{'click':function(){ outletim.listSong(ID,title); }}});
		new Element('span',{'class':'del','text':'x','events':{'click':function(e){ 
			e.stop(); outletim.confirm(lang.ruSure,'outletim.deletePL('+ID+')'); }}}).inject(li);
		new Element('span',{'class':'title','html':title}).inject(li);
		return li;
	},
	createPL: function(name){
		var loader = this.loader(1).inject('lists');
		new Request.JSON({
			onComplete: function(p){
				if(p.error) { outletim.alert(p.error,loader); }
				else {
					var pl = outletim.PL(p.ID,p.title).highlight('#333','#000').replaces(loader);
					$('PLS').removeClass('close');
					pl.fireEvent('click');
				}
			}
		}).post('/outletim::new','name='+name);
	},
	newPL: function(){
		var text = '<label>'+lang.name+' &nbsp;</label><input id="playListName" type="text" onkeypress="if(event.keyCode == 13){ outletim.createPL($(\'playListName\').value); outletim.closeBox(); }" />';
		var inner = '<table class="save" cellpadding="0" cellspacing="0" border="0" height="130"><tr><td style="padding:13px;"><br />'+text+'</td></tr>'
			+'<tr><td class="buttons">'
			+'<input class="button cancel" onclick="outletim.closeBox();" value="'+lang.cancel+'" type="button" tabindex="2" />'
			+'<input id="save" class="button save" onclick="outletim.createPL($(\'playListName\').value); outletim.closeBox();" value="'+lang.save+'" type="button" tabindex="1" />'
			+'</td></tr></table>';
		outletim.box('', inner, 0, 400, 130, .6, 'playListName');
		return 0;
	},
	deletePL: function(ID){
		if(outletim.PID == ID) outletim.alert(lang.playlistDeleteAlert);
		else {
			this.loader(1).inject($('pL'+ID).empty());
			new Request.JSON({
				onComplete: function(p){
					if(p.code == 400) outletim.alert(lang.playlistDeleteAlert); 
					else {
						if(outletim.PID == p.ID) {	
							$('songs').empty(); 
							new Element('li',{'class':'error','text':lang.playlistHasCleared}).inject('songs');
							outletim.PID = 0;
						}
						$('pL'+p.ID).destroy();
					}
				}
			}).post('/outletim::del','PID='+ID);
		}
	},
	listPL: function(){
		// check
		new Element('span',{'class':'close','events':{'click':function(){ outletim.togglePLS(); }}}).inject(new Element('div',{'class':'header','html':'&nbsp;'}).inject('playLists'),'top');
		var lists = new Element('div',{'id':'lists'}).inject('playLists');
		new Request.JSON({
			onComplete: function(r){
				if(r){ 
						if($('footer').hasClass('close')&&!outletim.IE){
							$('footer').fade('hide');
							$('footer').removeClass('close');
						}
						$('footer').fade('in');
						r.each(function(p){
						if(outletim.PID==0) { outletim.PID = p.ID; outletim.PLtitle = p.title; } 
						else if(outletim.PID==p.ID) { outletim.PLtitle = p.title; }
						outletim.PL(p.ID,p.title).inject(lists);
					});
					$('PL').removeClass('close');
					$('footer').fade('in');
				} 
				outletim.listSong(outletim.PID,outletim.PLtitle);
			}
		}).post('/outletim::list');
	},	
	playingList: function(PID,title){
		$('PLname').set('html',lang.currentPlaylist+': '+(PID?title:lang.defaultPlaylist));
		if(!PID) return;
		$('lists').getElements('li').each(function(p){ p.removeClass('playing') });
		if($('pL'+PID)) $('pL'+PID).addClass('playing');
	},
/*--------------------------------------------------*/
//	CHECK YOUTUBE	
/*--------------------------------------------------*/
	youtube: {
		file: new Image(),
		result: new Image(),
		timer: null,
		check:function() {
			outletim.youtube.file.onload = function() {
				clearTimeout(outletim.youtube.timer);
				outletim.youtube.timer = null;
				outletim.youtube.result.src = '/outletim::youtube::true'; // true
			};
			outletim.youtube.file.src = 'http://www.youtube.com/img/pixel.gif';
			outletim.youtube.timer = setTimeout('outletim.youtube.fail()',2000);
		},
		fail:function() {
			clearTimeout(outletim.youtube.timer);
			outletim.youtube.timer = null;
			outletim.youtube.file = null;
			outletim.youtube.result.src = '/outletim::youtube::false'; // true
		}
	},
	hover: function(e) {
		$(e).getElements('a, span').each(function(e){
			e.addEvent('mouseover',function(e){ this.addClass('hover'); });
			e.addEvent('mouseout',function(e){ this.removeClass('hover'); });
		});
	},
/*--------------------------------------------------*/
//	USER
/*--------------------------------------------------*/
	user: {
		PL: function(PID){
			$('userPlayLists').getElements('a').each(function(p){ p.removeClass('selected') });
			if($('uPL'+PID)) $('uPL'+PID).addClass('selected');
			location.href = '#pl'+PID;
			var loader = outletim.loader(1,1).inject($('results').empty());
			if(outletim.user.PLRequest) outletim.user.PLRequest.cancel();
			outletim.user.PLRequest = new Request.JSON({
				onComplete: function(r){
					loader.destroy();
					if(r){
						if(r.error) outletim.alert(r.error);
						else r.each(function(i){
							var div = new Element('div',{'class':'item'}).inject('results');
							new Element('a',{'class':'song','html':'['+outletim.formatTime(i.duration)+'] '+i.title,'events':{
								'click':function(e) {
									outletim.player('play',i);
								}
							}}).inject(div);
							new Element('a',{'class':'add','text':'+','events':{
								'click':function(e) {
									outletim.addSong(i.ID);
								}
							}}).inject(div);
							new Element('span',{'class':'clear'}).inject('results');
						});
						// close video and settings
						$('fzPlayer').removeClass('video');
					}
				}
			}).post('/outletim::get','PID='+PID);
		}
	}
});