/**
 * @author: Mobus developement team
 * @copyright: Mobus Co., Ltd.
 * @package: WOS Playlist library
 * @license: Mobus Co., Ltd.
 * @url: http://www.mobus.co.th
 * @version: 1.0
 * @dependencies prototype.js, scriptaculous.js
 * @Revision 1, Complete
 * @Addtional: support audio static/dynamic ADs (consequence, random) for music tracks
 */


/**** playlist player ****/

var WosMusicPlayList = Class.create();
WosMusicPlayList.prototype = {
	objName: null,
	displayType: null,
	pId: null,
	pTitle: null,
	pDescription: null,
	ownerId: null,
	ownerUsername: null,
	
	// playList DOM
	debugLink: null,
	dataView: null,
	playLink: null,
	stopLink: null,
	prevLink: null,
	nextLink: null,
	swfDOM: null,
	playListDOM: null,
	panelDOM: null,
	musicListDOM: null,
	musicInfoDOM: null,
	templateDOM: null,
	
	// 
	startList: 1,
	maxList: null,
	maxShowList: null,
	prevList: null,
	nextList: null,
	musicListCollection: [],														// musicList.xxx  when x is  musicId, musicType, trackName, userId, username, musicAvatarUrl
	musicListDataCollection: [],
	
	mActiveMediaUrl: null,
	mActiveMediaCount: null,
	mActiveMediaAccessType: null,
	mActiveList: null,
	mActiveMusicId: null,
	mActiveMusicType: null,
	mActiveAvatarUrl: null,
	mActiveTitle: null,
	mActiveUserId: null,
	mActiveUsername: null,
	mActiveAudioId: null,
	mActiveVideoId: null,
	
	flashBoxId: null,
	swfId: null,
	isAds: false,						
	numTrackAds: 0,
	isRandomAds: false,
	audioAdsCollection: ['dance','discovery','freedom','life','love','masterpiece','title','dance','freedom','masterpiece'],		// static
	audioAdsActive: 0,
	sumTrackAds: 1,
	
	initialize: function(obj) {
		this.objName = obj.objName;
		this.flashBoxId = 'flashBox_' + obj.objName;
		this.debugLink = obj.objName + '_debug';
		this.playLink = obj.objName + '_play';
		this.stopLink = obj.objName + '_stop';
		this.prevLink = obj.objName + '_prev';
		this.nextLink = obj.objName + '_next';
		this.musicListCollection = [];
		this.musicListDataCollection = [];
		
		this.displayType = obj.displayType;
		this.pId = obj.playListId;
		this.maxList = obj.maxList;
		this.dataView = obj.dataView;
		this.url = obj.url;
		this.params = obj.params;
		
		if (obj.numTrackAds == undefined) {this.numTrackAds = 0;} else {this.numTrackAds = obj.numTrackAds;} 
		if (obj.isAds == undefined) {this.isAds = false;} else {this.isAds = obj.isAds;}
		if (obj.isRandomAds == undefined) {this.isRandomAds = false;} else {this.isRandomAds = obj.isRandomAds;}
		
		// this.getPlayListInfo(this.pId);
		this.getMusicList(this.pId);
	},
	renderPlayList: function() {
		this.createPanelDOM();
		this.swfDOM = '<div id="' + this.flashBoxId + '" class="playListEngine"></div>';
		
		// this.templateDOM = this.swfDOM + this.panelDOM + this.playListDOM + '<div id="mActive' + this.objName +'"></div>' + this.musicListDOM;
		if (this.displayType == 'small') {
			this.templateDOM = '<div class="pl_small">' + this.swfDOM + this.panelDOM + '<div id="mActive' + this.objName +'"></div>' + this.musicListDOM + '</div>';
		} else if (this.displayType == 'middle') {
			this.templateDOM = '<div class="pl_middle">' + this.swfDOM + this.panelDOM + '<div id="mActive' + this.objName +'"></div>' + this.musicListDOM + '</div>';
		}
		
		$(this.dataView).update(this.templateDOM);
		Event.observe(this.playLink, 'click', this.playMusic.bindAsEventListener(this));
		Event.observe(this.stopLink, 'click', this.stopMusic.bindAsEventListener(this));
		Event.observe(this.prevLink, 'click', this.prevMusic.bindAsEventListener(this));
		Event.observe(this.nextLink, 'click', this.nextMusic.bindAsEventListener(this));
	
		for (var i = 0; i < this.musicListCollection.length; i++) {
			Event.observe(this.musicListCollection[i], 'click', this.selectMusic.bindAsEventListener(this, this.musicListDataCollection[i], this.musicListCollection[i]));
		}
	},
	createPlayListInfoDOM: function() {
		this.playListDOM = '<div class="pl_info">Title: <a href="/website/playlistDisplay.wos?playListId=' + this.pId + '">' + this.pTitle + '</a> <br />Description: ' + this.pDescription + ' </div>';
	},
	createPanelDOM: function() {
		this.panelDOM = '<div class="pl_panel">' +
											'<div class="pl_panelbox">' +
												'<div id="pl_prev"><a id="' + this.prevLink + '" href="javascript:void(0);"><span>&lt&lt</span></a></div>' +
												'<div id="pl_play"><a id="' + this.playLink + '" href="javascript:void(0);"><span>Play</span></a></div>' +
												'<div id="pl_stop" style="display:none;"><a id="' + this.stopLink + '" href="javascript:void(0);"><span>Stop</span></a></div>' +
												'<div id="pl_next"><a id="' + this.nextLink + '" href="javascript:void(0);"><span>&gt&gt</span></a></div>' +
											'</div>' +
										'</div>';
	},
	createMusicListDOM: function(data) {
		var plStyle = '';
		if (this.displayType == 'small') {
			plStyle = 'small';
		} else if (this.displayType == 'middle') {
			plStyle = 'middle';
		}
		var html =  '<div>'; 								 
				html += '<ol class="playList">' +
								'<li><div class="pl_ms-' + plStyle + '"><div class="pl_title t' + plStyle + '">Track title</div> <div class="pl_performer p' + plStyle + '">Performer</div></div></li>' +
								'</ol>' +
								'<ol class="playList">';
		var limit;
		limit = data.length;
		/*
		if (data.length < this.maxList) {
			limit = data.length;
		} else {
			limit = this.maxList;
		}
		*/
								for (var i = 0;i < limit; i++) {
									var _musicLink = this.objName + '_m' + (i + 1);
									html += '<li><a id="' + _musicLink + '" musicid="' + data[i].musicId + '" href="javascript:void(0);"><div class="pl_ms-' + plStyle + '"><div class="pl_title t' + plStyle + '">' + data[i].trackName +'</div> <div class="pl_performer p' + plStyle + '">' + data[i].username + '</div></div></a></li>';
									this.musicListCollection.push(_musicLink);
									this.musicListDataCollection.push([data[i].musicId, data[i].musicType, data[i].trackName, data[i].username, data[i].userId, data[i].userAvatarUrl, data[i].musicAvatarUrl, data[i].relationId]);
								}
				html += '</ol>' +
							'</div>';
		this.musicListDOM = html;
	},
	createMusicInfoDOM: function() {
		var musicType = '';
		var plStyle = '';
		if (this.displayType == 'small') {
			plStyle = 'ms_info_small';
		} else if (this.displayType == 'middle') {
			plStyle = 'ms_info_middle';
		}
		if (this.mActiveMusicType == 'RemixedMusic') {
			musicType = 'remixedMA';
		} else if (this.mActiveMusicType == 'MasterMusic') {
			musicType = 'masterMA';
		}
		this.musicInfoDOM = '<div class="pl_ms_info ' + plStyle + '"><a href="/website/user/profile.wos?username=' + this.mActiveUsername +'"><img src="' + this.mActiveAvatarUrl +'" style="width: 75px;height;75px;float:left;margin-right:5px;" /></a><p class="trackTitle"><a href="/website/musicDisplay.wos?musicId=' + this.mActiveMusicId + '&displayMode=' + musicType +'">' + this.mActiveTitle +'</a></p><p class="performer">by <a href="/website/user/profile.wos?username=' + this.mActiveUsername +'">' + this.mActiveUsername +'</a></p><p><span id="' + this.objName + '_msCount"></span> plays</p></div>';
		var x = 'mActive' + this.objName;
		$(x).update(this.musicInfoDOM);
		$(x).show();
	},
	setActiveMusic: function(id) {
		if (this.mActiveList != null) {
			$(this.mActiveList).removeClassName('active');
		}
		if (id != undefined) {
			$(id).addClassName('active');
			this.mActiveList = id;	
		}
	},
	setPrivateMusic: function(id) {
		if (this.mActiveList != null) {
			$(this.mActiveList).removeClassName('active');
		}
		if ((this.mActiveList != null) && (id != undefined)) {
			$(id).addClassName('active');
			this.mActiveList = id;	
		}
		$(this.mActiveList).style.color = '#CC0000';
	},
	disableMusic: function(mId) {
		// set disable music style (red dot)
	},
	playMusic: function() {
		$('pl_stop').show();
		$('pl_play').hide();
		if (this.mActiveList == null) {
			var id = this.musicListCollection[0];
			this.setActiveMusic(id);
		} else {
			this.setActiveMusic(this.mActiveList);
		}
		
		var act = this.musicListCollection.indexOf(this.mActiveList);
		// this.setActiveMusic(this.musicListCollection[act]);
		this.getMusic(this.musicListDataCollection[act][0]);
		this.setMusicInfo(this.musicListDataCollection[act][0],this.musicListDataCollection[act][1],this.musicListDataCollection[act][2],this.musicListDataCollection[act][3],this.musicListDataCollection[act][4],this.musicListDataCollection[act][5]);
		//console.debug(this.musicListDataCollection[this.musicListCollection.indexOf(this.mActiveList)]);
		
	},
	stopMusic: function() {
		var x = 'mActive' + this.objName;
		// $(x).hide();
		if (this.mActiveList != null) {
			$(this.mActiveList).removeClassName('active');
		}
		
		if (this.swfId != null) {
			this.callExternalInterface(this.objName, 'stop');	
			$('pl_stop').hide();
			$('pl_play').show();
		}
	},
	prevMusic: function() {
		if ((this.mActiveList != null) && (this.musicListCollection.indexOf(this.mActiveList) > 0)) {
			$('pl_stop').show();
			$('pl_play').hide();
			var act = this.musicListCollection.indexOf(this.mActiveList);
			act = act - 1;
			this.setActiveMusic(this.musicListCollection[act]);
			this.setMusicInfo(this.musicListDataCollection[act][0],this.musicListDataCollection[act][1],this.musicListDataCollection[act][2],this.musicListDataCollection[act][3],this.musicListDataCollection[act][4],this.musicListDataCollection[act][5]);
			this.getMusic(this.musicListDataCollection[act][0]);
			//console.debug(this.musicListDataCollection[act]);
		}	
	},
	nextMusic: function() {
		if ((this.mActiveList != null) && (this.musicListCollection.indexOf(this.mActiveList) != (this.musicListCollection.length -1))) {
			$('pl_stop').show();
			$('pl_play').hide();
			var act = this.musicListCollection.indexOf(this.mActiveList);
			act = act + 1;
			this.setActiveMusic(this.musicListCollection[act]);
			this.setMusicInfo(this.musicListDataCollection[act][0],this.musicListDataCollection[act][1],this.musicListDataCollection[act][2],this.musicListDataCollection[act][3],this.musicListDataCollection[act][4],this.musicListDataCollection[act][5]);
			this.getMusic(this.musicListDataCollection[act][0]);
			//console.debug(this.musicListDataCollection[act]);
		} else {
			var id = this.musicListCollection[0];
			this.setActiveMusic(id);
			this.stopMusic();
		}
	},
	isVideo: function() {
		
	},
	enableVideoScreen: function() {
		
	},
	disableVideoScreen: function() {
		
	},
	setMusicInfo: function(musicId, musicType, title, username, userId, img) {
		this.mActiveMusicId = musicId;
		this.mActiveMusicType = musicType;
		this.mActiveTitle = title; 												// textContent link to vocal performer/musician page
		this.mActiveUserId = userId;
		this.mActiveUsername = username;
		this.mActiveAvatarUrl = img;
		this.createMusicInfoDOM();
	},
	getMusic: function(id) {
		var up = this;
		var dtRf = new Date().getTime();
		var url = window.encodeAjaxParamUrl('getMusic','rf', dtRf);						
		var myLyric = new Ajax.Request(url, {
			method: 'post',
			parameters: {'musicId':id},
			onComplete: function(transport) {
				var sJSON = transport.responseText;
				var json = window.decodeJSON(sJSON);
				if(json.notification.summary.type=="ERROR") {					
					alert("Error to get getMusic: " + json.notification.summary.value);
				} else if(json.notification.summary.type=="INFO") {
					if (json.data.musicAudioVisibility == "PUBLIC") {
						up.mActiveAudioId = json.data.musicAudioId;
						up.getAudio(json.data.musicAudioId);	
					} else if (json.data.musicAudioVisibility == "PRIVATE_ME") {
						up.setPrivateMusic();
						up.nextMusic();
					}
				}
			},
			onFailure: function(error) {
				alert("communication error, reason: "+error);
			}
		})
	},
	getAudio: function(id) {
		var up = this;
		var dtRf = new Date().getTime();
		var url = window.encodeAjaxParamUrl('getAudio','rf', dtRf);						
		var myLyric = new Ajax.Request(url, {
			method: 'post',
			parameters: {'audioId':id},
			onComplete: function(transport) {
				var sJSON = transport.responseText;
				var json = window.decodeJSON(sJSON);
				if(json.notification.summary.type=="ERROR") {					
					alert("Error to get media: " + json.notification.summary.value);
				} else if(json.notification.summary.type=="INFO") {
					// check accessType
					up.mActiveMediaUrl = json.data.q128kbpsBroadcastUrl;
					up.mActiveMediaCount = json.data.numView;
					up.mActiveMediaAccessType = json.data.accessType;
					up.createMediaPlayer(json.data.q128kbpsBroadcastUrl);
					var msCount = up.objName + '_msCount';
					$(msCount).update(json.data.numView);
				}
			},
			onFailure: function(error) {
				alert("communication error, reason: "+error);
			}
		})
	},
	getVideo: function(id) {
		
	},
	setMediaUrl: function() {
		$(this.swfId).flashvars = this.mActiveMediaUrl;
	},
	createMusicListScroller: function() {
		
	},
	getPlayListInfo: function(pId) {
		var up = this;
		var dtRf = new Date().getTime();
		var url = window.encodeAjaxParamUrl('getPlayListInfo','rf', dtRf);						
		var myLyric = new Ajax.Request(url, {
			method: 'post',
			parameters: {'playListId':pId},
			onComplete: function(transport) {
				var sJSON = transport.responseText;
				var json = window.decodeJSON(sJSON);
				if(json.notification.summary.type=="ERROR") {					
					alert("Error to get play list: " + json.notification.summary.value);
				} else if(json.notification.summary.type=="INFO") {
					up.pTitle = json.data.title;
					up.pDescription = json.data.description;
					up.createPlayListInfoDOM();
					up.getMusicList(pId);
				}
			},
			onFailure: function(error) {
				alert("communication error, reason: "+error);
			}
		})
	},
	getMusicList: function(pId) {
		var up = this;
		var dtRf = new Date().getTime();
		var url = window.encodeAjaxParamUrl('getMusicListByPlayList','rf', dtRf);						
		var myLyric = new Ajax.Request(url, {
			method: 'post',
			parameters: {'playListId':pId,'limit.first':0,'limit.max':up.maxList},
			onComplete: function(transport) {
				var sJSON = transport.responseText;
				var json = window.decodeJSON(sJSON);
				if(json.notification.summary.type=="ERROR") {					
					alert("Error to get music list: " + json.notification.summary.value);
				} else if(json.notification.summary.type=="INFO") {
					if (json.data.totalRecords != 0) {
						up.createMusicListDOM(json.data.records);
						up.renderPlayList();	
					} else {
						alert("No music for this playlist.");
					}
				}
			},
			onFailure: function(error) {
				alert("communication error, reason: "+error);
			}
		})
	},
	selectMusic: function() {		// [musicListDataCollection][musicListCollection]
		/*
		if (this.isVideo) {
			this.enableVideoScreen();
		} else {
			this.disableVideoScreen();
		}
		*/
		var args = $A(arguments);
		// this.decodeData(args);
		this.setMusicInfo(args[1][0],args[1][1],args[1][2],args[1][3],args[1][4],args[1][5]);
		this.setActiveMusic(args[2]);
		$('pl_stop').show();
		$('pl_play').hide();
		this.getMusic(args[1][0]);
	},
	decodeData: function(data) {
		this.setMusicInfo(args[1][0],args[1][1],data[1][2], data[1][3], data[1][4], data[1][5]);
		this.setActiveMusic(data[2]);
	},
	createMediaPlayer: function(url) {
		this.swfId = 'swf_' + this.objName;;
		var s = new SWFObject('/resources/swf/v1/wosPlayList20090202.swf',this.swfId,'300','50','9','#FFFFFF');
		s.addVariable("file", url);
		s.addVariable("objName", this.objName);
		s.addParam("allowFullScreen","true");
		s.addParam("allowScriptAccess","sameDomain");
		s.addParam("quality","high");
		s.addParam("menu","false");
		s.write(this.flashBoxId);
	},
	createMediaAdsPlayer: function(url) {
		this.swfId = 'swf_' + this.objName;;
		var s = new SWFObject('/resources/swf/v1/wosAdsPlayer20090323.swf',this.swfId,'300','50','9','#FFFFFF');
		s.addVariable("file", url);
		s.addVariable("objName", this.objName);
		s.addParam("allowFullScreen","true");
		s.addParam("allowScriptAccess","sameDomain");
		s.addParam("quality","high");
		s.addParam("menu","false");
		s.write(this.flashBoxId);
	},
	initMusic: function() {
		// console.debug('initMusic');
		this.callExternalInterface(this.objName, 'play');
	},
	callExternalInterface: function(obj, cmd) {
		this.thisMovie(this.swfId).wosApi(obj, cmd);
	},
	thisMovie: function(name) {
		if (navigator.appName.indexOf("Microsoft") != -1) {
        return window[name];
	    }
	    else {
	        return document[name];
	    }
	},
	notifyMediaEnd: function(args) {
		// audio only
		var _audioId = this.mActiveAudioId;
		var dtRf = new Date().getTime();
		var url = encodeAjaxParamUrl('collectPlayListUsageAndAudioView', 'rf',dtRf);
		var wosAjax = new Ajax.Request(url, {
			method: 'post',
			parameters: {'audioId':_audioId,'playListId':this.pId},
			onComplete: function(transport) {
				var sJSON = transport.responseText;
				var json = window.decodeJSON(sJSON);
				if (json.notification.summary.type=="ERROR") {					
				} else if (json.notification.summary.type=="INFO") {
				}
			}, 
			onFailure: function(error) {
			}
		});
		
		this.initAds();
		// this.nextMusic();
	},
	notifyAdsMediaEnd: function(args) {
		// XHR here [Ads logging and monitoring]
		this.nextMusic();
	},
	notifyMediaTime: function(args) {				// TEST
		// console.debug('notifyMediaTime', args[0],args[1],args[2]);
	},
	isPlayerReady: function() {
		this.startPlay(1000);
	},
	startPlay: function(ms) {
		var _self = this;
		setTimeout(function(ms){
			_self.initMusic();
		}, ms);
	},
	initAds: function() {
		if (this.isAds) {
			if (this.numTrackAds != 0) {
				// console.debug('this.sumTrackAds', this.sumTrackAds, 'this.numTrackAds', this.numTrackAds, 'musicList', this.musicListCollection.indexOf(this.mActiveList));
				if (this.sumTrackAds < this.numTrackAds) {
					this.nextMusic();
					this.sumTrackAds++;	
				} else {
					this.selectAudioAds();
					this.sumTrackAds = 1;
				}
			} else {
				this.nextMusic();
			}
		} else {
			this.nextMusic();
		}
	},
	selectAudioAds: function() {
		if (this.isRandomAds) {
			var f = this.audioAdsCollection[Math.floor(Math.random()*10)];
			this.getAudioAds(f);
		} else {
			var o = Math.floor(this.musicListCollection.indexOf(this.mActiveList) / this.numTrackAds);
			if (o >= this.audioAdsCollection.length) {
				var i = Math.floor(o / 10);
				this.audioAdsActive = o - (i * 10) ;
				var f = this.audioAdsCollection[this.audioAdsActive];
				this.getAudioAds(f);
				this.audioAdsActive++;	
			} else {
				var f = this.audioAdsCollection[this.audioAdsActive];
				this.getAudioAds(f);
				this.audioAdsActive++;	
			}
		}
	},
	getAudioAds: function(name) {
		// [Ads media request]
		var url = 'http://audio1.thewos.com/static/thewos_audio_ads_' + name + '.flv';				// static
		// console.debug(url);
		this.createMediaAdsPlayer(url);
	}
}




