///////////////////////////////////////////////////////////////////
// Title........: PMS enhanced
///////////////////////////////////////////////////////////////////
// Description..: A Private Messaging System (PMS) for Mambo/Joomla
// Author.......: Stefan Klingner (original Danial Taherzadeh)
// Version......: 2.0.4
// Created......: 22.02.2007
// Contact......: pms@stefan-klingner.de
// License......: GNU/GPL (based on PMS OpenSource from april 2005)
// Note.........: This script is part of the PMS enhanced package
///////////////////////////////////////////////////////////////////

// functions for list of PMs

// (de)selecting all PMs
// conteur principal du jeu
function conteneur(url,parametre) 
{
	new Ajax.Updater('ajax', url+'&no_html=1', {
				asynchronous:true, 
				evalScripts:true, 
				onComplete:function(request){ajax('modules/mod_wub_joueur.php?option=com_mafiajob&Itemid=27&ajax_menu=1', '', 'ModJoueur');}, 
				onLoading:function(request){Element.show('chargement');}, 
				parameters:parametre
			});
	return;
}

function pms_list_check_all()
{
	if(document.pmsForm.alle.checked==true)
	{
		for(var i=1; i<document.pmsForm.elements.length; i++)
			document.pmsForm.elements[i].checked = true;
	}
	if(document.pmsForm.alle.checked==false)
	{
		for(var i=1; i<document.pmsForm.elements.length; i++)
			document.pmsForm.elements[i].checked = false;
	}
}

// change sort_field_values
function pms_list_update_sort_fields()
{
	document.pmsForm.sort_value.value = document.pmsForm.sort.options[document.pmsForm.sort.selectedIndex].value;
	document.pmsForm.asc_desc_value.value = document.pmsForm.asc_desc.options[document.pmsForm.asc_desc.selectedIndex].value;
}

// check if at least one PM is selected
function pms_list_submit()
{
	var validation = false;
	for(var i=1; i<document.pmsForm.elements.length; i++)
	{
		if(document.pmsForm.elements[i].checked==true) validation = true;
	}
	if(validation)
	{
		document.pmsForm.submit_value.value = "submit";
		return true;
	}
	else
	{
		alert(document.pmsForm.submit_error.value);
		return false;
	}
}

// change the limitstart value for SQL-query in hidden field
function pms_list_page_navigation(limitstart)
{
	document.pmsForm.limitstart.value = limitstart;
	document.pmsForm.submit();
}

// end of functions for list of PMs



// functions for writing a PM

// validate if recipient and message field are entered
function pms_write_validate(error1,error2)
{
	if(document.pmsForm.recip_users.value=="")
	{
		alert(error1);
		return false;
	}
	if(document.pmsForm.message.value=="")
	{
		alert(error2);
		return false;
	}
	return true;
}

// refresh character counter
function pms_write_refresh_character_counter(form,field)
{
	var input_field = eval('document.' + form + '.' + field);
	var input_element = eval('document.getElementById("count_' + field + '")');
	var max_value = eval('document.' + form + '.max_length_' + field + '.value');
	if(input_field.value.length > max_value)
	{
		input_field.value = input_field.value.substr(0,max_value);
		input_element.innerHTML = max_value - input_field.value.length;
	}
	else input_element.innerHTML = max_value - input_field.value.length;
}

// show/hide userlist or addressbooklist on the write PM page
function pms_write_show_userlist_addressbook(list)
{
	if(list=="buddy_users")
	{
		document.getElementById("list_site_users").style.display="none";
		document.getElementById("write_add_button_site_users").style.display="none";
	}
	else
	{
		document.getElementById("list_buddy_users").style.display="none";
		document.getElementById("write_add_button_buddy_users").style.display="none";
	}
	
	if(document.getElementById("list_" + list).style.display=="none")
	{
		document.getElementById("list_" + list).style.display = "block";
		document.getElementById("write_add_button_" + list).style.display = "block";
	}
	else
	{
		document.getElementById("list_" + list).style.display = "none";
		document.getElementById("write_add_button_" + list).style.display = "none";
	}
	
	pms_ajax_user_search_hide();
}

// add user from userlist, addressbooklist or usersearch to the recip-field
function pms_write_add_recip(selectname,usersearch)
{
	if(selectname!="")
	{
		var select_element = eval('document.pmsForm.' + selectname);
		var selection_value = select_element.options[select_element.selectedIndex].value;
		var selection_text = select_element.options[select_element.selectedIndex].text;
	}
	else
	{
		var selection_text = usersearch;
		var selection_value = "";
	}
	var recip_users_value = document.pmsForm.recip_users.value;
	if(selection_text.indexOf("(")!=-1) selection_text = selection_text.substr(0, selection_text.indexOf("(") - 1);
	var search = recip_users_value.search(selection_text);
	
	if(selectname!="" && selection_value!="no_entry" && search==-1)
	{
		if(recip_users_value=="" || recip_users_value.substr(recip_users_value.length-1,1)==",") document.pmsForm.recip_users.value += selection_text;
		else document.pmsForm.recip_users.value += "," + selection_text;
	}
	else if(usersearch!="" && search==-1)
	{
		if(recip_users_value.lastIndexOf(",")==-1) document.pmsForm.recip_users.value = selection_text;
		else document.pmsForm.recip_users.value = recip_users_value.substr(0, recip_users_value.lastIndexOf(",") + 1) + selection_text;
		document.getElementById("pms_usersearch").style.display = "none";
	}
}

// end of functions for writing a PM



// functions for searching PMs

// validate if at least 1 field is entered
function pms_search_validate(error)
{
	if(document.pmsForm.sender.value=="" && document.pmsForm.recip.value=="" && document.pmsForm.subject.value=="" && document.pmsForm.message.value=="")
	{
		alert(error);
		return false;
	}
	return true;
}

// end of functions for searching PMs



// functions for inserting bb_code and smileys

// insert at cursor-position
function pms_insert_AtCursor(value,form,field)
{
	value = " " + value + " ";
	var input = eval('document.' + form + '.' + field);
	if(document.selection)
	{
		input.focus();
		sel = document.selection.createRange();
		sel.text = value;
	}
	else if(input.selectionStart || input.selectionStart == 0)
	{
		var startPos = input.selectionStart;
		var endPos = input.selectionEnd;
		input.value = input.value.substring(0, startPos) + value + input.value.substring(endPos, input.value.length);
	}
	else input.value += value;
	if(document.getElementById('count_message')) pms_write_refresh_character_counter(form,field);
	input.focus();
}

// count bb-tag
function pms_insert_count_matches(tag,form,field)
{
	var count = 0;
	var input = eval('document.' + form + '.' + field + '.value');
	tag = tag.replace(/\[(.+)\]/, "\\[$1\\]");
	while(input.length > 0)
	{
		var search = input.search(tag);
		if(search != -1)
		{
			count += 1;
			input = input.substring(search + tag.length, input.length);
		}
		else input = '';
	}
	return count;
}

// insert bb-code at cursor position or around selection
function pms_insert_bb_code(tag,form,field)
{
	var aTag = "[" + tag + "]";
	var eTag = "[/" + tag + "]";
	var input = eval('document.' + form + '.' + field);
	input.focus();
	if(typeof document.selection != 'undefined')
	{
		var range = document.selection.createRange();
		var insText = range.text;
		if(insText == '')
		{
			var count_aTag = pms_insert_count_matches(aTag,form,field);
			var count_eTag = pms_insert_count_matches(eTag,form,field);
			if(count_aTag == count_eTag) range.text = aTag;
			else range.text = eTag;
		}
		else
		{
			range.text = aTag + insText + eTag;
		}
		range = document.selection.createRange();
		if (insText.length > 0) range.moveStart('character', aTag.length + insText.length + eTag.length);
		range.select();
	}
	else if(typeof input.selectionStart != 'undefined')
	{
		var pos;
		var start = input.selectionStart;
		var end = input.selectionEnd;
		var insText = input.value.substring(start, end);
		if(insText == '')
		{
			var count_aTag = pms_insert_count_matches(aTag,form,field);
			var count_eTag = pms_insert_count_matches(eTag,form,field);
			if(count_aTag == count_eTag)
			{
				input.value = input.value.substr(0, start) + aTag + input.value.substr(end);
				pos = start + aTag.length;
			}
			else
			{
				input.value = input.value.substr(0, start) + eTag + input.value.substr(end);
				pos = start + eTag.length;
			}
		}
		else
		{
			input.value = input.value.substr(0, start) + aTag + insText + eTag + input.value.substr(end);
			pos = start + aTag.length + insText.length + eTag.length;
		}
		input.selectionStart = pos;
		input.selectionEnd = pos;
	}
	else
	{
		var bb_insert_at = eval('document.' + form + '.bb_insert_at.value');
		var bb_enter_text = eval('document.' + form + '.bb_enter_text.value');
		var pos;
		var re = new RegExp('^[0-9]{0,3}$');
		while(!re.test(pos))
		{
			pos = prompt(bb_insert_at + " (0.." + input.value.length + "):");
		}
		if(pos > input.value.length)
		{
			pos = input.value.length;
		}
		var insText = prompt(bb_enter_text + ":");
		input.value = input.value.substr(0, pos) + aTag + insText + eTag + input.value.substr(pos);
	}
}

// end of functions for inserting bb_code and smileys



// functions for backend

// check if entered date is a valid one
function pms_backend_checkDate(day,month,year)
{
	var monthLength = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
	if(month.substr(0,1)=="0") month = month.substr(1,1);
	if(day<1 || month<1 || month>12 || year<1) return false;
	if (year/4 == parseInt(year/4)) monthLength[1] = 29;
	if (year/100 == parseInt(year/100)) monthLength[1] = 28;
	if (year/400 == parseInt(year/400))	monthLength[1] = 29;
	if (day > monthLength[month-1]) return false;
	else return true;
	}

// add additional error checkings on global backend submitfunction
function submitbutton(pressbutton)
{
	if(pressbutton=="filter")
	{
		var error_wrong_date = document.adminForm.error_wrong_date.value;
		var valid_date_start = false;
		var valid_date_end = false;
		var date_start = document.adminForm.date_start.value;
		var date_end = document.adminForm.date_end.value;
		var pattern = /(\d{2}).(\d{2}).(\d{4})/;
		if(date_start=="") valid_date_start = true;
		else if(pattern.exec(date_start)) valid_date_start = pms_backend_checkDate(RegExp.$1,RegExp.$2,RegExp.$3);
		if(date_end=="") valid_date_end = true;
		else if(pattern.exec(date_end)) valid_date_end = pms_backend_checkDate(RegExp.$1,RegExp.$2,RegExp.$3);
		if(valid_date_start && valid_date_end) submitform("");
		else alert(error_wrong_date);
		return;
	}
	if(pressbutton=="save" && document.adminForm.act.value=="view_edit")
	{
		var error_no_users = document.adminForm.error_no_users.value;
		var error_same_users = document.adminForm.error_same_users.value;
		var error_no_message = document.adminForm.error_no_message.value;
		if(document.adminForm.db_sender_id.selectedIndex==-1 || document.adminForm.db_recip_id.selectedIndex==-1) alert(error_no_users);
		else if(document.adminForm.db_sender_id.selectedIndex==document.adminForm.db_recip_id.selectedIndex) alert(error_same_users);
		else if(document.adminForm.db_message.value=="") alert(error_no_message);
		else submitform(pressbutton);
		return;
	}
	if(pressbutton=="save" && document.adminForm.act.value=="config")
	{
		var error_invalid_values = document.adminForm.error_invalid_values.value;
		var error_fields = new Array();
		var j = 0;
		var error_output = "";
		
		for (var i = 0; i < document.adminForm.length; ++i)
		{
			if(document.adminForm.elements[i].type=="text")
			{
				if(isNaN(document.adminForm.elements[i].value) ||
				document.adminForm.elements[i].value=="" ||
				document.adminForm.elements[i].value/1<0)
				{
					error_fields[j] = document.adminForm.elements[i].name;
					++j;
				}
			}
		}
		error_output = error_invalid_values + "\n\r";
		for(var k = 0; k < j; ++k) error_output += "- " + error_fields[k] + "\n\r";
		if(error_fields.length>0) alert(error_output);
		else submitform(pressbutton);
		return;
	}
	submitform(pressbutton);
}

// check if all fields are entered in about-formular
function pms_backend_about_validate(error)
{
	if(document.adminForm.about_name.value=="" || document.adminForm.about_mail.value=="" || document.adminForm.about_subject.value=="" || document.adminForm.about_message.value=="")
	{
		alert(error);
		return false;
	}
	else return true;
}

// end of functions for backend



// functions for addressbook and ignorelist

// add user from global userlist to addressbook or ignorelist
function pms_addressbook_ignorelist_add_user(type)
{
	if(document.pmsForm.site_users.selectedIndex!=-1)
	{
		var selection_value = document.pmsForm.site_users.options[document.pmsForm.site_users.selectedIndex].value;
		var selection_text = document.pmsForm.site_users.options[document.pmsForm.site_users.selectedIndex].text;
		var field_ids = eval('document.pmsForm.' + type + '_ids');
		var field_users = eval('document.pmsForm.' + type + '_users');
		var ids = field_ids.value;
		var search = ids.search("/|" + selection_value + "|/");
		var entry = new Option(selection_text, selection_value);

		if(selection_value!="no_entry")
		{
			if(ids.length==0)
			{
				field_users.options[0] = null;
				field_users.options[field_users.length] = entry;
				field_ids.value = "|" + selection_value + "|";
			}
			else if(search==-1)
			{
				field_users.options[field_users.length] = entry;
				field_ids.value += ",|" + selection_value + "|";
			}
		}
	}
}

// remove user from addressbook or ignorelist
function pms_addressbook_ignorelist_remove_user(type)
{
	var field_ids = eval('document.pmsForm.' + type + '_ids');
	var field_users = eval('document.pmsForm.' + type + '_users');
	if(field_users.selectedIndex!=-1)
	{
		var selection_value = field_users.options[field_users.selectedIndex].value;
		var no_entry = document.pmsForm.no_entry.value;
		var ids = field_ids.value;
		var search = ids.search("/|" + selection_value + "|/");

		if(selection_value!="no_entry")
		{
			field_users.options[field_users.selectedIndex] = null;
			if(ids.length==selection_value.length+2) field_ids.value = "";
			else if(search==1) field_ids.value = ids.substr(0, search - 1) + ids.substr(search + selection_value.length + 2);
			else field_ids.value = ids.substr(0, search - 2) + ids.substr(search + selection_value.length + 1);
			if(field_ids.value=="") field_users.options[0] = new Option(no_entry, "no_entry");
		}
	}
}

// end of functions for addressbook and ignorelist



// functions for ajax implementation

// hide list from ajax-search when leaving the recip-field
function pms_ajax_user_search_hide()
{
	document.getElementById("pms_usersearch").style.display = "none";
}

// actions when ajax-script is finish
function pms_ajax_handleHttpResponse()
{
	if(http_user_list.readyState==4)
	{
		if(http_user_list.status==200)
		{
			document.getElementById("list_site_users").innerHTML = http_user_list.responseText;
		}
	}
	if(http_user_search.readyState==4)
	{
		if(http_user_search.status==200)
		{
			document.getElementById("pms_usersearch").innerHTML = http_user_search.responseText;
			document.getElementById("pms_usersearch").style.display = "block";
		}
	}
}

// filter userlist in case of selected letter
function pms_ajax_user_list_filter(my_id, session_id)
{
	var filter = document.pmsForm.filter_site_users.options[document.pmsForm.filter_site_users.selectedIndex].value;
	http_user_list.open("GET", "components/com_pms/userlist.php?filter=" + filter + "&my_id=" + my_id + "&session_id=" + session_id, true);
	http_user_list.onreadystatechange = pms_ajax_handleHttpResponse;
	http_user_list.send(null);
}

// search for users in case of entered letters
function pms_ajax_user_search(my_id, session_id)
{
	var input = document.pmsForm.recip_users.value;
	var pos_last_comma = input.lastIndexOf(",");
	var search = "";
	if(pos_last_comma==-1)
	{
		search = input;
		search = search.replace(/^(\s+)/, "", search);
	}
	else
	{
		search = input.substr(pos_last_comma + 1);
		search = search.replace(/^(\s+)/, "", search);
	}
	http_user_search.open("GET", "components/com_pms/usersearch.php?search=" + search + "&my_id=" + my_id + "&session_id=" + session_id, true);
	http_user_search.onreadystatechange = pms_ajax_handleHttpResponse;
	http_user_search.send(null);
}

// define global ajax object
function pms_ajax_getHTTPObject()
{
	var xmlhttp = false;
		
	// try to create a new instance of the xmlhttprequest object        
	try
	{
		// Internet Explorer
		if(window.ActiveXObject)
		{
			for(var i = 5; i; i--)
			{
				try
				{
					// loading of a newer version of msxml dll (msxml3 - msxml5) failed
					// use fallback solution
					// old style msxml version independent, deprecated
					if(i==2)
					{
						xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");    
					}
					// try to use the latest msxml dll
					else
					{

						xmlhttp = new ActiveXObject("Msxml2.XMLHTTP." + i + ".0");
					}
					break;
				}
				catch(excNotLoadable)
				{                        
					xmlhttp = false;
				}
			}
		}
		// Mozilla, Opera und Safari
		else if(window.XMLHttpRequest)
		{
			xmlhttp = new XMLHttpRequest();
		}
	}
	// loading of xmlhttp object failed
	catch(excNotLoadable)
	{
		xmlhttp = false;
	}
    return xmlhttp ;
}

var http_user_list = pms_ajax_getHTTPObject();
var http_user_search = pms_ajax_getHTTPObject();

// end of functions for ajax implementation