//*
//function $F(id){return $(id).value;}
//*/

function urlencode(str) {
	return escape(str).replace('+', '%2B').replace('%20', '+').replace('*', '%2A').replace('/', '%2F').replace('@', '%40');
}
function urldecode(str) {
	return unescape(str.replace('+', ' '));
}

function trace(msg)
{
	if(typeof(console)!="undefined")
		console.log(msg);
}


// SHOUTBOX for PHPBB by tamat  v.1.6
var shoutbox_version = '1.6'; 

var autorefresh = false;
var waitingResponse = false;
var baseRefreshTime = 3000; //in milliseconds
var currentRefreshTime = baseRefreshTime;
var block_multiple = false;
var encode = true;
var colorize = false;
var party_mode = false;
var show_timestamp = false;
var max_chat_messages = 250;
var ajax_timeout = -1;
var retries = 0; //number of times we try to stablish connection
var time_since_last_update = 0;

var tv_element = null;
var backgrounds = new Array();
var current_background = '';

var last_command = '';
var last_message_id = 0;

var online_users = new Array();
//var user_colors = new Array("FFD","FDF","DFF","CDF","DCF","FDC","FCD","CFD","DFC","DDF","FDD","DFD");
//var dark_user_colors = new Array("CB8A8A","CCA08B","CCB68B","CCCC8B","B6CC8B","A0CC8B","8BCC8B","8BCCA0","8BCCB6","8BCCCC","8BB6CC","8BA0CC","8B8BCC","A08BCC","B68BCC","CC8BCC","CC8BB6","CC8BA0","BFBFBF");
var dark_user_colors = new Array("CB0000","CB4300","CB8600","C9CB00","86CB00","48CB00","00CB05","00CB43","00CB8B","00C4CB","0086CB","0043CB","0000CB","4800CB","8600CB","CB00C9","CB0086","CB0043","777777");
var user_colors = new Array("F0A1A1","F0BDA1","F0D5A1","EFF0A1","D5F0A1","BBF0A1","A1F0A3","A1F0BB","A1F0D5","A1EFF0","A1D3F0","A1BBF0","A1A1F0","BBA1F0","D5A1F0","F0A1EF","F0A1D5","F0A1BB","F0F0F0");

function getEventTarget(e)
{
	var targ;
	if (!e) var e = window.event;
	if (e.target) targ = e.target;
	else if (e.srcElement) targ = e.srcElement;
	//IE bug, skip
	//if (e == null || e.target == null || e.target.value == null ) return false;

	return targ;
}

function errorDialog(msg)
{
	var espan = document.createElement("DIV");
	var code = '<div id="error_dialog">'; //container
	code += '<div class="fullscreen"></div>'; //bg
	code += '<div class="dialog"><h2>Error</h2><pre>'+msg+'</pre><p><a class="button" href="javascript:$(\'#error_dialog\').remove();">Close</a></p></div>';
	code += '</div>';
	espan.innerHTML = code;
	document.body.appendChild(espan);
}


function checkJSONresponse(data)
{
	var result = null;
	try { result = eval("(" + data + ")"); }
	catch(e) { return null; }
	return result;
}

function scrollDown()
{
	$("#chatcontent").stop();
	$("#chatcontent").animate( { scrollTop: $("#chatcontent")[0].scrollHeight });
	//$("#chatcontent").scrollTop = $("#chatcontent")[0].scrollHeight;
}

function debugFunction()
{
	infoMessage('Version: ' + shoutbox_version);
}

function getOnlineUserId(name)
{
	for (var i=0; i < online_users.length; i++)
	{
		if (online_users[i] == name)
			return i;
	}

	online_users[i] = name;
	return i;
}

function addMessage(msg, action)
{
	//$("chatcontent").innerHTML += msg;
	var espan = document.createElement("DIV");
	espan.innerHTML = msg;
	espan.action = action; //useful sometimes

	var root = $("#chatcontent")[0];
	root.appendChild(espan);
	if ( root.childNodes.length > max_chat_messages )
		root.removeChild( root.childNodes[0] );
	scrollDown();

	$(espan).find("img").load( function() { 
		scrollDown(); 
	});
}

function addMessageOnTop(msg)
{
	var espan = document.createElement("DIV");
	espan.innerHTML = msg;

	var root = $("#chatcontent")[0];
	if (root.childNodes.length > 0)
		root.insertBefore(espan, root.childNodes[0]);
	else
		root.appendChild(espan);
}

function toTV(code)
{
	if (tv_element == null)
	{
		tv_element = document.createElement("DIV");
		tv_element.style.position = "fixed";
		tv_element.style.top = "0px";
		tv_element.style.right = "0px";
		tv_element.style.width = "300px";
		tv_element.style.height = "200px";
		tv_element.style.border = "3px solid black";
		tv_element.style.backgroundColor = "#333333";
		
		document.body.appendChild(tv_element);
	}
	
	if (code != "")
	{
		tv_element.style.display = "block";
		tv_element.innerHTML = code;
	}
	else
	{
		tv_element.style.display = "none";
	}
}

function infoMessage(msg)
{
	addMessage('<p class="msg info">'+msg+'</p>');
}


function clearLog()
{
	$("chatcontent").empty();
}

function removeLine(line, delete_line)
{
	var node = $("#line"+line)[0]; //content <p>...</p>
	var parent = node.parentNode; //sentence container <div>
	var super_parent = parent.parentNode; //chat container

	if (delete_line && parent.action != null)
	{
		alert("Deleting msg: " + parent.action.id );
		deleteMessage(parent.action.id);
	}

	super_parent.removeChild(parent);
}


//* BACKGROUNDS **************
function setBackground(url)
{
	document.body.style.backgroundImage = "url('"+url+"')";
	current_background = url;
}

function addBackground(url)
{
	backgrounds.push(url);
	setBackground(url);
}

function prevBackground()
{
	var prev = backgrounds[0];
	for (var i = 1;i < backgrounds.length; i++)
	{
		if (backgrounds[i] == current_background)
			break;
		prev = backgrounds[i];
	}
	setBackground(prev);
}

function nextBackground()
{
	for (var i = 0;i < backgrounds.length - 1; i++)
	{
		if (backgrounds[i] == current_background)
			break;
	}
	setBackground(backgrounds[i+1]);
}


function resetBackground()
{
	if (backgrounds.length > 0)
		setBackground( backgrounds[0] );
	else
		setBackground( '' );
}

//**************************


function sendMessage(msg)
{
	if (encode)	msg = urlencode(msg);

	if (msg.length >= 512)
	{
		infoMessage("Error: message too long");
		return;
	}

	var data = {
		action: 'shoutboxmsg',
		msg: msg,
	};
	if (encode) data.encode = true;

	//send ajax message
	jQuery.ajax({
			url:'ajax.php',
			data: data,
			type:'post',
	
			success: function (response)
			{
				processResponse(response);
			}
	});


	/*
	var params = "action=shoutboxmsg";
	params += "&msg="+msg;
	if (encode) params += "&encode=true";
	jx.load("ajax.php?" + params, processResponse);
	*/

	//change icon as waiting...
	$("#chatinput")[0].style.backgroundColor = "#DDD"

	if (block_multiple)
		$("#chatinput").blur();

	currentRefreshTime = baseRefreshTime;
}

function deleteMessage(id)
{
	//send ajax message
	var params = "action=shoutboxdeletemsg";
	params += "&id="+id;
	if (encode) params += "&encode=true";
	jx.load("ajax.php?" + params, function(data) {} );
}

function autoCompletion(text)
{
	var str = text.substr( 0, text.length ).toLowerCase();
	var pos = str.lastIndexOf(" ");
	var name = '';
	if (pos != -1)
		name = str.substr( pos + 1, str.length );
	else
		name = str;

	for (var i = 0; i < online_users.length; i++)
	{
		if (name == online_users[i].substr( 0, name.length ).toLowerCase() )
		{
			if (pos == -1)
				$("#chatinput")[0].value = online_users[i] + " ";
			else
				$("#chatinput")[0].value = text.substr(0,pos + 1) + online_users[i] + " ";
			return;
		}
	}
}

function insert_text(txt,foo,foo2)
{
	$("#chatinput")[0].value += txt;
}

function decodeYoutube(url)
{
	var w = '700';
	var h = '400';
	url = url.replace('/watch?v=','/v/');
	url += "&hl=es&fs=1";
	return '<object width="'+w+'" height="'+h+'"><embed src="'+ url +'" type="application/x-shockwave-flash" wmode="transparent" quality="high" width="'+w+'" height="'+h+'"></embed></object>';
}

// USER INPUT************************
function processMsg(e)
{
	//avoid IE problems
	var targ = getEventTarget(e);
	var	str = targ.value;

	//tab for autocompletion
	if (e.keyCode == 9 && str.length > 0)
	{
		autoCompletion(str);
		return false;
	}

	//up_arrow repeat last sentence
	if (e.keyCode == 38 && 0) //e.which returns de ascii code
	{
		$("#chatinput")[0].value = last_command;
		return true;
	}

	//other keys...
	if (e.keyCode!=13)
		return true;

	//jump line
	if (e.keyCode==13 && e.shiftKey==1)
		return true;

	last_command = str;

	//anti-scripts
	if (str.search(/<script/i) != -1)
	{
		infoMessage(str);
		$("#chatinput")[0].value = "";
		return false;
	}

	//null message
	if ( $("#chatinput")[0].value.length == 0)
		return false;

	if (str == "/clear")
		clearLog();
	else if (str == "/debug")
		debugFunction();
	else if (str.substr(0,2) == "/.")
		infoMessage( eval(str.substr(2,512)) );	
	else if (str.substr(0,5) == "/dice")
	{
		var dado = str.substr(6,512);
		if (dado.length > 0)
			sendMessage("Tiras un dado de "+parseInt(dado)+" y sale " + parseInt(Math.random() * (parseInt(dado) - 1) + 1) );
		else
			infoMessage('how many faces? use /dice 6');
	}
	else if (str == "/partymode")
		enablePartyMode();
	else if (str == "/timestamp")
		enableTimestamp();
	else if (str.substr(0,5) == "/song")
	{
		sendMessage('\n<embed src="' + str.substr(6,512) +'" align="baseline" border="5" width="200" height="25" autostart="off" loop="0">');
	}
	else if (str.substr(0,6) == "/flash")
	{
		sendMessage('\n<object width="280" height="210"><embed src="'+ str.substr(7,512) +'" type="application/x-shockwave-flash" wmode="transparent" quality="high" width="280" height="210"></embed></object>');
	}
	else if (str.substr(0,8) == "/youtube")
	{
		urlvid = str.substr(9,512);
		sendMessage( "\n"+ decodeYoutube(urlvid) );
	}
	else if (str.substr(0,3) == "/tv")
	{
		if (tv_element != null)
			tv_element.style.display = ( tv_element.style.display == 'block' ? 'none' : 'block' );
	}
	else if (str.substr(0,5) == "/logs")
	{
		var num = str.substr(6,512);
		if (num.length > 0)
			num = parseInt(num);
		else
			num = 300;
		last_message_id = last_message_id - num;
		infoMessage( 'Showing logs, loading latest ' + num + ' msgs ...' );
		refreshChatSend();
		autorefresh = true;
	}
	else
	{
		if (str[0] != '#')
			sendMessage( formatURLs(str) );
		else
			sendMessage( str );
	}

	//remove text
	$("#chatinput")[0].value = "";

	return false;
}

function remoteCommand( action )
{
	var str = action.message;
	
	if (str.substr(0,3) == "#tv")
	{
		var url = str.substr(4,512);
		if (url.length > 1)
			toTV( decodeYoutube( url ) );
		else
			toTV("");
	}
	if (str.substr(0,3) == "#bg")
	{
		var url = str.substr(4,512);
		if (url == '')
		{
			resetBackground();
			action.message = action.username +' quitó el fondo.';
			addMessage( formatMsg(action), action);
		}
		else
		{
			addBackground(url);
			action.message = action.username +' cambi&oacute; el fondo por <a href="'+url+'">este</a>.</p>';
			addMessage( formatMsg(action), action);
		}
	}	

	//else alert('Unknown remote command: ' + str);
}

function processResponse(data)
{
	$("#chatinput")[0].style.backgroundColor = "#FFF"
	$("#chatinput")[0].readOnly = false;
	$("#chatinput").focus();

	//deprecated
	if (data)
	{
		currentRefreshTime = baseRefreshTime;
		addMessage(data);
	}
}

//called when sending a msg
function formatURLs(msg) 
{
	var tokens = msg.split(" ");
	for (var i=0; i < tokens.length; i++)
	{
		if ( tokens[i].substr(0,7) == 'http://' )
		{
			var ext = tokens[i].substr(-3).toLowerCase();
			if ( ext == 'jpg' || ext == 'gif' || ext == 'png' || ext == 'peg')
				tokens[i] = '<img src="' + tokens[i] + '"/>';
			else
				tokens[i] = '<a href="' + tokens[i] + '">' + tokens[i] + '</a>';
		}
	}

	var result = '';
	for (var i=0; i < tokens.length; i++)
		result += tokens[i] + ( i < tokens.length - 1 ? ' ' : '' );
	return result;
}

function formatMsg(action)
{
	var result;
	var msg = action.message;
	var usercolor = user_colors[(action.user_id+10) % user_colors.length];
	var dark_usercolor = dark_user_colors[(action.user_id+10) % dark_user_colors.length];

	var classes = 'msg';
	if (action.is_user == true)
		classes += ' you';
	if (action.username == 'Anonymous')
		classes += ' anon';
	var style = '';
	var tag_info = '';
	if (colorize && action.user_id != 1)
		style += 'background-color: #'+usercolor;
	tag_info = 'class="' +  classes + '" style="' + style + '"';

	var timestamp = '';
	var d = new Date();
	d.setTime(action.timestamp * 1000);
	timestamp = d.toLocaleTimeString();

	var info = '<a title="Escrito el '+d.toLocaleDateString()+' a las '+timestamp+'" class="button" href="" onclick="javascript: removeLine('+action.id+',(event.shiftKey==1)); return false">&#215</a>';
	info += '<span class="timestamp">'+(show_timestamp?timestamp:'')+'</span> ';
	var username = '<span class="username" style="'+(!colorize && (action.user_id != 1) ? 'color: #'+dark_usercolor+';' :'')+'">'+action.username+':</span> ';

	if (action.type == 'text')
	{
		msg = msg.replace(/\n/g,"<br/>"); 	//line breaks
		result = '<p id="line'+action.id+'" '+tag_info+'>'+info+username+msg+'</p>';
	}
	else if (action.type == 'command')
	{
		msg = msg.replace(/\n/g,"<br/>"); 	//line breaks
		result = '<p id="line'+action.id+'" '+tag_info+'>'+info+msg+'</p>';
	}

	getOnlineUserId(action.username); //this store the username
	return result;
}

function showOnlineUsers()
{
	var str = '<p>';
	for (i=0; i < online_users.length; i++)
		str += '<strong>'+online_users[i]+'</strong>';
	str += '</p>';
	return str;
}


// REFRESH SEND **********************************
function refreshChatSend()
{
	var params = "action=shoutboxreload";
	params +="&message_id="+last_message_id;
	jx.load("ajax.php?" + params, refreshChatResponse);
	waitingResponse = true;

	if (ajax_timeout == -1)
		ajax_timeout = setTimeout("refreshChatRetry()",60000);
	//$("chatcontent").style.backgroundImage = "url('../images/loading.gif')";
}

function refreshChatRetry()
{
	retries++;

	if (retries > 5)
	{
		infoMessage("Disconnected");
		playstop_refresh();
		return;
	}
	infoMessage("Connection timeout... retrying");
	refreshChatSend();
}

// REFRESH RESPONSE **********************************
function refreshChatResponse(data)
{
	retries = 0;
	if (ajax_timeout != -1)
		clearTimeout ( ajax_timeout );
	ajax_timeout = -1;

	time_since_last_update = 0;

	$("#chatcontent")[0].style.backgroundImage = "none";
	waitingResponse = false;
	if (autorefresh)
	{
		var t=setTimeout("refreshChatSend()",currentRefreshTime);
		//currentRefreshTime += 100;
	}

	if (data)
	{
		var response = '';
		try
		{
			response = eval("(" + data + ")");
		}
		catch (e)
		{
			//alert("error on msg");
			return;
		}
		//addMessage(response.actions[0].action.type);
		
		if (response.actions.length > 0)
			currentRefreshTime = baseRefreshTime;
		else
			currentRefreshTime *= 1.01;

		for(var i=0;i < response.actions.length; i++)
		{
			var action = response.actions[i].action;

			//if (last_message_id != 0 && action.id - last_message_id > 1)
			//	infoMessage( 'Message lost...' );

			if (last_message_id == 0)
				infoMessage( 'Previusly in this shoutbox...' );
			else if (action.id < last_message_id) //repeated message
				continue;

			//process actions
			if (action.type == "text")
				addMessage( formatMsg(action), action );
			else if (action.type == "command")
				remoteCommand( action );
			else if (action.type == "info")
				infoMessage( action.message );
			last_message_id = action.id;
		}
	}
//	else addMessage("<p class='msg'>...</p>");

}

function playstop_refresh()
{
	autorefresh = !autorefresh;
	var target = $("#autorefresh_button")[0];
	target.innerHTML = ( autorefresh ? 'on' : 'off' );
	if (autorefresh) refreshChatSend();
}

function colorizeText()
{
	colorize = !colorize;
	if (colorize)
		infoMessage("Colorize enabled");
	else
		infoMessage("Colorize disabled");
}

function enableTimestamp()
{
	show_timestamp = !show_timestamp;
	if (show_timestamp)
		infoMessage("Timestamp enabled");
	else
		infoMessage("Timestamp disabled");
}

// TV *******************************



//******* PARTY MODE ******************

function bgColorChange()
{
	if (party_mode)
	{
		var r = parseInt(Math.random() * user_colors.length);
		$("#chatcontent")[0].style.backgroundColor = '#' + user_colors[r];
		var timer=setTimeout( "bgColorChange()", 100 );
	}
}

function enablePartyMode()
{
	if (party_mode==false)
	{
		party_mode = true;
		bgColorChange();
		var t = setTimeout( "function(){party_mode=false;}",60*1000);
	}
	else 
	{
		party_mode = false;
		$("#chatcontent")[0].style.backgroundColor = '#FFF';
	}
}

function updateChatCounter()
{
	$("#chat_counter")[0].innerHTML = (time_since_last_update/1000).toFixed(0) + "secs";
	time_since_last_update += 1000;
}

//************************************
function showHideShoutbox()
{
	if ($("#shoutboxbody")[0].style.display == "block")
	{
		$("#shoutboxbody")[0].style.display = "none";
	}
	else
	{
		$("#shoutboxbody")[0].style.display = "block";
		if(waitingResponse == false && autorefresh == false)
		{
			autorefresh = true;
			refreshChatSend();
		}
		$("#chatinput").focus();
	}
}

function initShoutbox()
{
	if(autorefresh) 
		refreshChatSend();
		
	if (document.body.style.backgroundImage == '')
		addBackground( 'http://www.internetpierde.com/images/background-cenefa.jpg');
	else
		addBackground( document.body.style.backgroundImage );

	if ($("#autorefresh_button").length > 0)
		$("#autorefresh_button")[0].innerHTML = ( autorefresh ? 'on' : 'off' );

	setInterval( updateChatCounter, 1000);
		
	showHideShoutbox();
}

//soundManagerInit();
function init()
{
	if ( $('#shoutbox').length > 0 )
		initShoutbox();
}
