var MSG_COOKIE_NAME = "cookie_msg_1.0";

var TEMPLATE_TRACKINFO_URL	= "http://www.9sky.com/soin/trks/{0}";
var TEXT_UNCHECKED_TRACK = "没有可播放的歌曲!";

function System_play(){}
System_play.prototype.setCookie = function(name, value)
{
	var argv = this.setCookie.arguments;
	var argc = this.setCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var domain = (argc > 3) ? argv[3] : null;
	var path = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;
	document.cookie = name + "=" + encodeURI(value) +
	((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
	((domain == null) ? "" : ("; domain=" + domain)) +
	((path == null) ? "" : ("; path=" + path)) +
	((secure == true) ? "; secure" : "");
}

System_play.prototype.setCookies = function(name, key, value)
{
	var argv = this.setCookies.arguments;
	var argc = this.setCookies.arguments.length;
	var expires = (argc > 3) ? argv[3] : null;
	var domain = (argc > 4) ? argv[4] : null;
	var path = (argc > 5) ? argv[5] : null;
	var secure = (argc > 6) ? argv[6] : false;
	var becookie = this.getCookie(name);
	if(becookie == "")
		value = key + "=" + encodeURI(value);
	else{
		var re = new RegExp("(" + key + "=)[^&]*", "gi");
		if(re.test(becookie))
			value = becookie.replace(re, "$1" + encodeURI(value));
		else
			value = becookie + "&" + key + "=" + encodeURI(value);
	}
	document.cookie = name + "=" + value +
	((expires == null) ? "" : ("; expires=" + expires.toGMTString())) +
	((domain == null) ? "" : ("; domain=" + domain)) +
	((path == null) ? "" : ("; path=" + path)) +
	((secure == true) ? "; secure" : "");
}


System_play.prototype.getCookie = function(name, key)
{
	var arg = name + "=";
	var i = document.cookie.indexOf(arg);
	if(i==-1) return '';
	var str = document.cookie.substring(i+arg.length);
	var j=str.indexOf(";");
	if(j>-1) str=str.substring(0,j);
	if(key&&key.length>0){
		arg=key+"=";
		i=str.indexOf(arg);
		if(i==-1)return '';
		str=str.substring(i+arg.length);
		j=str.indexOf("&");
		if(j>-1)str=str.substring(0,j);
	}
	return decodeURI(str);
}

System_play.prototype.foreach = function(array, hFn)
{
	for(var i=0; i<array.length; i++)
	{
		var obj = array[i];
		if (hFn)
		{ 
			if ( hFn(obj, i) ) { break; }
		}
	}
}


Date.prototype.addYears = function(v)
{
	var d = this;
	d.setTime (d.getTime() + v * (365 * 30 * 24 * 60 * 60 * 1000));
	return d;
}

String.prototype.format = function()
{
	var number;
	var template = this;
	for (var i = 0; i < arguments.length; i++) 
	{
		number = "\{(" + i + ")\}";
		var reg = new RegExp(number, "ig");
		template = template.replace(reg, arguments[i]);
	}
   
	return template;
}

var system_play = new System_play();


function MSG()
{
	this.m_receiver = null;
	this.m_message = null;
	this.m_params = null;
	this.m_ptime = null;
}

function MSGListener(name, fn)
{
	var self = this;	
	
	this.m_name = name;
	this.m_hwnd = "player_window_{0}".format(name);
	this.m_milliSeconds = 2000;
	this.m_enable = true;
						
	var v = system_play.getCookie(this.m_hwnd);
	var exists = ( (v && v == 1) ? true : false);
	exists = false;
	if (exists) 
	{		
		if (fn) { fn(this); }
		this.m_enable = false;
	}
	else
	{
		 
		var date = new Date();
		date.addYears(1);
		system_play.setCookie(this.m_hwnd, 1, date, "9sky.com", "/");
		window.onbeforeunload =	function() { self.kill(); }
		document.body.onunload = function() { self.kill(); }
	}
}

MSGListener.prototype.On_Accept = null;
MSGListener.prototype.OnAccept = function(e)
{
	if (this.On_Accept) { this.On_Accept(this, e); }
}

MSGListener.prototype.start = function()
{
	if (this.m_enable)
	{
		var self = this;
		
		var msgStackString = system_play.getCookie(MSG_COOKIE_NAME);
		
		var arrMSGStack = msgStackString.split("$");
		
		var unhandleMSG = null;
		for(var i=0; i<arrMSGStack.length; i++)
		{	
			var msgString = arrMSGStack[i];
			var msg = this.getMSG(msgString);
			if (msg)
			{
				if (this.m_name == msg.m_receiver)
				{
					this.OnAccept(msg);
				}
				else
				{
					if (unhandleMSG)
					{
						unhandleMSG = "$" + msgString;
					}
					else
					{
						unhandleMSG = msgString;
					}
				}
			}
		}
		
		var date = new Date();
		date.addYears(1);
		system_play.setCookie(MSG_COOKIE_NAME, unhandleMSG, date, "9sky.com", "/");
		this.m_ptime = setTimeout(function() { self.start(); }, this.m_milliSeconds);
	}
}

MSGListener.prototype.clearStack = function()
{
	system_play.setCookie(MSG_COOKIE_NAME, "", null, "9sky.com", "/");
}

MSGListener.prototype.getMSG = function(msgString)
{
	if (msgString && msgString.toString() != "")
	{
		var arrMSG = msgString.split("/");
		var msg = new MSG();
		
		msg.m_receiver = arrMSG[0];
		msg.m_message = arrMSG[1];
		msg.m_params = arrMSG.slice(2, arrMSG.length);
		
		return msg;
	}
	return null;
}

MSGListener.prototype.kill = function()
{
	var date = new Date();
	date.addYears(1);
	this.stop();
	system_play.setCookie(this.m_hwnd, -1, date, "9sky.com", "/");
}

MSGListener.prototype.stop = function()
{
	this.m_enable = false;
	clearTimeout(this.m_ptime);
}

function MSGClient()
{
	this.m_existsWindow = false;
}

MSGClient.prototype.On_Send = null;
MSGClient.prototype.OnSend = function(args)
{
	if (this.On_Send) { this.On_Send(args); }
}

MSGClient.prototype.send = function()
{
	var args = this.send.arguments;
	
	if (args.length < 1) return;
	
	var ieWindow = "player_window_{0}".format(args[0]);

	var v = system_play.getCookie(ieWindow);
	var exists = ( (v && v == 1) ? true : false);
	
	this.m_existsWindow = exists;
	
	var newMsg = "";
	system_play.foreach(args,	function(e, i)
							{
								newMsg += e.toString();
								if (i < args.length-1) { newMsg += "/"; }
							});
	
	this.OnSend(args);
	
				
	if (exists == false) { return false; }
	
	var msgs = "";
	var msgStackString = system_play.getCookie(MSG_COOKIE_NAME);
	if (newMsg != "")
	{
		if (msgStackString && msgStackString != "")
		{
			msgs = msgStackString + "$";
		}
		msgs += newMsg;
		
		var date = new Date();
		date.addYears(1);
		system_play.setCookie(MSG_COOKIE_NAME, msgs, date, "9sky.com", "/");
	}
}
//MSG Server & Client

var MSG_PLAY			= "play";
var MSG_GETDATA			= "getdata";
var MSG_PLAYLIST_ADD	= "addPlayList";


var ST_KEYWORK			= "keyword";
var ST_KEY_TRACK		= "trk";
var ST_KEY_ARTIST		= "art";
var ST_ALBUM			= "alb";
var ST_ARTISTHOT		= "hot";
var ST_TOP				= "top";
var ST_COMMEND			= "commend";
var ST_ARTISTID			= "artid";
var ST_TAG_USER			= "tag0";
var ST_TAG_INTERNAL		= "tag1";
var ST_TAG_USER_INTERNAL= "tag2";
var ST_TOPID			= "toptrk";
var ST_TRACK_YEAR		= "years";
var ST_PACKAGE			= "package";
var ST_TRACKS			= "trks";

var IE_WINDOW_PLAYER = "Player";

var msgClient = new MSGClient();

msgClient.On_Send = function(args)
{
	//不存在窗口,者弹出
	if (this.m_existsWindow == false)
	{
		var from = args[2];
		var target = args[3];
		var url = "http://playlist.9sky.com/playlist/Transition.aspx?from={0}&target={1}".format(from, target);
		window.open(url, "Player");
	}
}

function PlayFrom(from, target)
{
	msgClient.send(IE_WINDOW_PLAYER, MSG_PLAY, from, target);
}

function PlayArtist(artID)
{
	PlayFrom(ST_ARTISTID, artID);
}

function PlayAlbum(albID)
{
	PlayFrom(ST_ALBUM, albID);
}

function PlayTop(topID)
{
	PlayFrom(ST_TOPID, topID);
}

function PlayCommend(hotID)
{
	PlayFrom(ST_COMMEND, hotID);
}

function PlayTagUser(kid, userID)
{
	if (kid==null) return;
	msgClient.send(IE_WINDOW_PLAYER, MSG_PLAY, ST_TAG_USER_INTERNAL, kid, userID);
}

function PlayTag(kid)
{
	PlayFrom(ST_TAG_INTERNAL, kid);
}

//增加播放列表
function AddPlayList(from, target)
{
	msgClient.send(IE_WINDOW_PLAYER, MSG_PLAYLIST_ADD, from, target);
}

function PlayTrackIDs(trkIDs)
{
	if (trkIDs == "")
	{
		alert(TEXT_UNCHECKED_TRACK);
	}
	else
	{
		window.open(TEMPLATE_TRACKINFO_URL.format(trkIDs), "Player");
	}
}

function AddTrackIDsToPlayList(trkIDs)
{
	if (trkIDs == "")
	{
		alert(TEXT_UNCHECKED_TRACK);
	}
	else
	{
		AddPlayList("trks", trkIDs);
	}
}	