
var im_active = false;				//used in ajax mode
var im_request_url = '';			//communication script
var im_request_prefix = '';			//standard vars, set onload
var im_chat_slots = 6;				//max concurrent chat-sessions
var im_chat_array = [];				//list of running chats
var im_chat_buffer = new Hash();	//useful while the chatbox is still loading
var im_chat_open = '';				//currently open box
var im_status = 0;					//start offline
var im_request = '';				//currently running request
var im_request_counter = 0;
var im_keep_alive_flag = false;
var im_typing_array = [];
var im_do_trace = false;


/********************************
 * COMMON FUNCTIONS THAT ARE 
 * INFLUENCED BY IM
 ********************************/
function getURL(url){
	if(im_active) im_kill_request();
	document.location.href = url;
}
function submitForm(formname){
	if(im_active) im_kill_request();
	document.forms[formname].submit();
}


/********************************
 * INSTANT MESSENGER FUNCTIONS
 ********************************/

function im_init(){
	//catch all anchor clicks
	if(Browser.Engine.trident){
		im_active = true;
		var jsprefix = "javascript";
		var allAnchors = $('site_content').getElements('a');
		allAnchors.addEvent('click', function(event){
			if(typeof this.href != "undefined" && this.href.substring(0,jsprefix.length)!=jsprefix){
				im_kill_request();
			}
		});
	}
}

function im_unload(){
	$('im_bar_online').setStyle("display", "none");
	$('im_bar_friends_box').setStyle("display", "none");
	$('im_bar_chat_box').setStyle("display", "none");
	$('im_bar_offline_note').setStyle("display", "none");
	$('im_bar_expired').setStyle("display", "block");
}

function im_kill_request(){
	if(im_request!='') im_request.cancel();
}

function im_send(suffix){
	if(im_request_url=="" || im_request_prefix=="") return false;
	if(typeof suffix == "undefined") suffix = "";
	im_kill_request();
	im_request_counter++;
	if(Browser.Engine.trident){
		var d = new Date();
		suffix += "&t="+im_request_counter+"-"+d.getTime();
	}
	var this_pull = im_request_counter;
	im_request = new Request({
		url: im_request_url,
		method: "get",
		evalScripts: true,
		onSuccess: function(responseText, responseXML){
			if(im_keep_alive_flag){
				im_keep_alive_flag = false;
				im_send();
			}
		}
	}).send(im_request_prefix+suffix);
}

function im_connect(nustatus){
	if(im_request_url=="") return false;
	if(typeof nustatus == "undefined") nustatus = 2;
	im_send("&setsta="+nustatus);
	$('im_bar_friends_box').setStyle("display", "block");
	$('im_bar_chat_box').setStyle("display", "block");
	im_update_status_indicator(nustatus);
	$('im_bar_offline_note').setStyle("display", "none");
}

function im_disconnect(nustatus){
	if(typeof nustatus == "undefined") nustatus = 0;
	im_send("&setsta="+nustatus);
	$('im_bar_chat_box').setStyle("display", "none");
	$('im_bar_chat_box').set('html', '');
	im_chat_open = '';
	im_chat_array = [];
	im_typing_array = [];
	$('im_bar_friends_box').setStyle("display", "none");
	im_update_status_indicator(nustatus);
	$('im_bar_offline_note').setStyle("display", "inline");
}

function im_keep_alive(){
	im_keep_alive_flag = true;
}

//called by gui
function im_set_status(nustatus){
	if(nustatus==0){
		im_disconnect();
	}else{
		im_connect(nustatus);
	}
}

function im_update_status_indicator(nustatus){
	for(var i=0; i<=2; i++){
		if(i==nustatus){
			$('im_bar_stat_'+i).setStyle("display", "block");
			$('im_bar_stat_menu_'+i).addClass("list_btn_active");
		}else{
			$('im_bar_stat_'+i).setStyle("display", "none");
			$('im_bar_stat_menu_'+i).removeClass("list_btn_active");
		}
	}
}

function im_chatbox_running(user_id){
	//check im_slots for the provided hash, return true if found
	return im_chat_array.contains(user_id);
}

function im_slot_open(){
	return (im_chat_array.length<im_chat_slots);
}

//output reply
function im_print_reply(user_id, reply){
	reply = reply+'';
	if(reply=='') return false;
	if(im_chatbox_running(user_id)){
		$('chat_box_conv_'+user_id).set('html', $('chat_box_conv_'+user_id).get('html') + reply);
		if(im_chat_open!=user_id) $('chat_tab_'+user_id).addClass("button_im_attention");
		var axListScrollToFx = new Fx.Scroll('chat_box_conv_'+user_id).toBottom();
		document.title = document.title+" ";
	}else if(im_chat_buffer.has(user_id)){
		//still loading chatbox.. append reply
		im_chat_buffer.set(user_id, im_chat_buffer.get(user_id)+reply);
	}else{
		im_load_chatbox(user_id, reply);
	}
}

function im_show_typing(user_id){
	if(im_chatbox_running(user_id)) $('chat_typing_'+user_id).setStyle("display", "block");
}
function im_hide_typing(user_id){
	if(im_chatbox_running(user_id)) $('chat_typing_'+user_id).setStyle("display", "none");
}

function im_load_chatbox(user_id, reply){
	if(typeof reply == "undefined") reply = "";
	if(!im_slot_open()) return false;
	im_chat_buffer.set(user_id, reply);
	var load_chatbox = new Request({
		url: "index.php",
		evalScripts: true,
		onSuccess: function(responseText, responseXML){
			responseText = responseText+'';
			if(responseText!='failed'){
				var newBox = new Element('div', {'html':responseText , 'class':'im_bar_slot', 'id':'chat_box_slot_'+user_id});
				$('im_bar_chat_box').grab(newBox);
				im_chat_array.include(user_id);
				im_switch_tab(user_id);
				im_init_chatbox(user_id);
				if(im_chat_buffer.has(user_id)){
					var replyBuffer = im_chat_buffer.get(user_id);
					if(replyBuffer!="") im_print_reply(user_id, replyBuffer);
					im_chat_buffer.erase(user_id);
				}
			}
		}
	}).send('sec=ajax&sub1=im&sub2=chatbox&user='+user_id);
}

function im_init_chatbox(user_id){
	$('chat_box_form_'+user_id).addEvent('submit', function(e) {
		new Event(e).stop();
		if($('chat_box_reply_'+user_id).value!=''){
			im_send_reply(''+user_id, $('chat_box_reply_'+user_id).value);
			$('chat_box_reply_'+user_id).value='';
			im_typing_array.erase(user_id);
		}
	});
}

function im_switch_tab(user_id, silent){
	if(typeof silent == "undefined") silent = false;
	if(!im_chatbox_running(user_id)) return false;
	if(im_chat_open==user_id){
		//minimize chatbox
		$('chat_box_'+user_id).setStyle("display", "none");
		$('chat_tab_'+user_id).removeClass("button_im_active");
		im_chat_open = '';
	}else{
		//make sure chat_box is open
		$('im_bar_chat_box').setStyle("display", "block");
		//run through the boxes and tabs
		im_chat_array.each(function(item, index){
			if(item==user_id){
				$('chat_box_'+item).setStyle("display", "block");
				$('chat_tab_'+item).addClass("button_im_active");
				$('chat_tab_'+item).removeClass("button_im_attention");
				im_chat_open = item;
			}else{
				$('chat_box_'+item).setStyle("display", "none");
				$('chat_tab_'+item).removeClass("button_im_active");
			}
		});
	}
	if(!silent){
		im_send("&open="+((im_chat_open=='')? 'none' : im_chat_open));
	}	
}

//called by gui
function im_start_chat(user_id){
	if(!im_chatbox_running(user_id)){
		im_load_chatbox(user_id, "");
	}else{
		im_switch_tab(user_id);
	}
}

function im_dispose_chatbox(user_id){
	if(im_chatbox_running(user_id)){
		$('chat_box_slot_'+user_id).dispose();
		im_chat_array.erase(user_id);
		im_typing_array.erase(user_id);
		if(im_chat_open==user_id){
			im_chat_open='';
			im_send("&open=none&close="+user_id);
		}
	}
}

//called by chatbox-forms
function im_send_reply(user_id, reply){
	im_send('&user='+user_id+'&reply='+reply);
}

function im_send_typing(user_id){
	if(!im_typing_array.contains(user_id)){
		im_typing_array.include(user_id);
		im_send('&user='+user_id+'&typing=1');
	}
}

function im_load_friends(){
	var tabs = "";
	im_chat_array.each(function(item, index){
		tabs += "-"+item;
	});
	if(tabs!="") tabs = "&tabs="+tabs;
	var load_friends = new Request({
		url: "index.php",
		method: "get",
		evalScripts: true,
		onSuccess: function(responseText, responseXML){
			responseText = responseText+'';
			if(responseText!='failed'){
				$('im_bar_friends_box').set('html', responseText);
				$('im_bar_friends_box').setStyle("display", "block");
			}
		}
	}).send('sec=ajax&sub1=im&sub2=friends'+tabs);
}

function im_update_tab_states(user_ids, nustatus){
	for(var i=0; i<=2; i++){
		user_ids.each(function(item, index){
			if(im_chatbox_running(item)){
				if(i==nustatus){
					$('chat_tab_stat_'+item+'_'+i).setStyle("display", "inline");
				}else{
					$('chat_tab_stat_'+item+'_'+i).setStyle("display", "none");
				}
			}
		});
	}
}

function im_init_sound(){
	new Swiff('swf/imsound.swf', {
	    id: 'im_sound_swf',
	    width: 1,
	    height: 1,
	    container: $('im_sound_cont'),
	    params: {
	        wmode: 'transparent'
	    }
	});
}

function im_sound(soundname){
	var mov = $('im_sound_swf');
	mov.playSound(soundname);
}

function im_trace(str){
	if(im_do_trace){
		$('im_debug').setStyle("display", "block");
		str.replace('<', '&lt;');
		str.replace('>', '&gt;');
		$('im_debug_text').set('html', $('im_debug_text').get('html')+'<br>'+str);
		var axDebugScrollToFx = new Fx.Scroll('im_debug').toBottom();
	}
}

