var labelFilter = /^[a-z0-9_αινσϊρΡ\s\-]+$/i;
var selectedValue = '';
var selectedLabelName = '';
/*========================================================================*/
function checkbox_checkall(o)
{
	// checkeamos todos los checkbox de la tabla y resaltamos filas
	// o hace ref al checkbox principal
	var i, checkbox;
	var rows = document.getElementById('message_list_table').rows;
	if (o.checked)
	{
		for (i=1;i<rows.length-1;i++)
		{
			checkbox = rows[i].getElementsByTagName('td')[0].firstChild;
			checkbox.checked = true;
			rows[i].className = 'highlighted';
		}
	}else{
		for (i=1;i<rows.length-1;i++)
		{
			checkbox = rows[i].getElementsByTagName('td')[0].firstChild;
			checkbox.checked = false;
			rows[i].className = 'message';
		}
	}
}
/*========================================================================*/
function highlightTR(o)
{
	if (o.checked) o.parentNode.parentNode.className = 'highlighted';
	else o.parentNode.parentNode.className = 'message';
}
/*========================================================================*/
function labels_menu(o, GroupID, actualLabelID)
{
	if (!o.value) return;
	selectedValue = o.value;
	selectedLabelName = o.options[o.selectedIndex].firstChild.nodeValue;
	o.options[0].selected = true;
	window.focus();
	var msg_table = document.getElementById('message_list_table');
	var leftmenu = document.getElementById('group_labels_list');
	var rows = msg_table.rows;
	var i, j, checkbox;
	var msgIDs_array = new Array();
	var msgIDs = '';
	var checked = 0;
	// obtenemos mensajes seleccionados y guardamos values
	for (i=1;i<rows.length-1;i++)
	{
		if (rows[i].getElementsByTagName('td')[0].firstChild.nodeName.toLowerCase() == 'input')
		{
			checkbox = rows[i].getElementsByTagName('td')[0].firstChild;
			if (checkbox.checked)
			{
				msgIDs_array.push(checkbox.value);
				msgIDs += ('&MessageID[]=' + encode(checkbox.value));
				checked++;
			}
		}
	}
	if (!checked)
	{
		alert('No messages selected!');
		return;
	}
	switch (selectedValue)
	{
		case 'new':
			// creamos nuevo label para los mensajes especificados
			var labelName = askLabelName();
			if (labelName === null) return;
			ajax.handler.onreadystatechange = function()
			{
				ajax.showStatus('Loading...', 'ajax_status');
				if (ajax.ok())
				{
					// aplicamos cambios a los mensajes
					var newNode;
					var msg_cell;
					for (i=0;i<msgIDs_array.length;i++)
					{
						msg_cell = document.getElementById('MessageTitle_' + msgIDs_array[i]);
						// actualizamos leftmenu
						updateMessageCount('remove', getLabelPrefix(msg_cell));
						if (actualLabelID != '')
						{
							// eliminamos tbody
							document.getElementById('MessageBody_' + msgIDs_array[i]).parentNode.removeChild(document.getElementById('MessageBody_' + msgIDs_array[i]));
							if (msg_table.rows.length == 2)
							{
								msg_table.parentNode.removeChild(msg_table);
							}
						}else{
							// eliminamos label si existe
							if (getLabelPrefix(msg_cell)) msg_cell.removeChild(getLabelPrefix(msg_cell));
							// creamos label
							createLabel(msg_cell, labelName, ajax.text);
						}
					}
					// nuevo option si existe..
					if (document.getElementById('apply_label_optgroup'))
					{
						var newOpt = document.createElement('option');
						newOpt.value = ajax.text; // nuevo id del label
						newOpt.appendChild(document.createTextNode(labelName));
						document.getElementById('apply_label_optgroup').appendChild(newOpt);
					}
					// nuevo link en la caja del lefthandmenu
					createLeftMenuLink(leftmenu, GroupID, ajax.text, labelName, msgIDs_array.length);
				}
			}
			ajax.request('POST', 'do=setNewLabel&LabelName=' + encode(labelName) + '&GroupID=' + encode(GroupID) + msgIDs, 'includes/labelmanager.php');
			break;
		case 'remove':
			// eliminamos labels para los mensajes seleccionados
			ajax.handler.onreadystatechange = function()
			{
				ajax.showStatus('Loading...', 'ajax_status');
				if (ajax.ok())
				{
					// aplicamos cambios a los mensajes
					var msg_cell;
					for (i=0;i<msgIDs_array.length;i++)
					{
						msg_cell = document.getElementById('MessageTitle_' + msgIDs_array[i]);
						// actualizamos leftmenu
						updateMessageCount('remove', getLabelPrefix(msg_cell));
						if (actualLabelID != '')
						{
							// eliminamos tbody
							document.getElementById('MessageBody_' + msgIDs_array[i]).parentNode.removeChild(document.getElementById('MessageBody_' + msgIDs_array[i]));
							if (msg_table.rows.length == 2)
							{
								msg_table.parentNode.removeChild(msg_table);
							}
						}else{
							// eliminamos label si existe
							if (getLabelPrefix(msg_cell)) msg_cell.removeChild(getLabelPrefix(msg_cell));
						}
					}
				}
			}
			ajax.request('POST', 'do=removeLabel&GroupID=' + encode(GroupID) + msgIDs, 'includes/labelmanager.php');
			break;
		default:
			// usamos label ya creado
			// no hacemos nada si cambiamos al mismo label que estamos viendo
			if (selectedValue == actualLabelID) return;
			ajax.handler.onreadystatechange = function()
			{
				ajax.showStatus('Loading...', 'ajax_status');
				if (ajax.ok())
				{
					// aplicamos cambios a los mensajes
					var newNode;
					var msg_cell;
					for (i=0;i<msgIDs_array.length;i++)
					{
						msg_cell = document.getElementById('MessageTitle_' + msgIDs_array[i]);
						// actualizamos leftmenu
						updateMessageCount('remove', getLabelPrefix(msg_cell));
						if (actualLabelID != '')
						{
							// eliminamos tbody
							document.getElementById('MessageBody_' + msgIDs_array[i]).parentNode.removeChild(document.getElementById('MessageBody_' + msgIDs_array[i]));
							if (msg_table.rows.length == 2)
							{
								msg_table.parentNode.removeChild(msg_table);
							}
						}else{
							// eliminamos label si existe
							if (getLabelPrefix(msg_cell)) msg_cell.removeChild(getLabelPrefix(msg_cell));
							// creamos label
							createLabel(msg_cell, selectedLabelName, selectedValue);
						}
						// actualizamos leftmenu
						updateMessageCount('add', selectedValue);
					}
				}
			}
			ajax.request('POST', 'do=setLabel&LabelID=' + selectedValue + '&GroupID=' + encode(GroupID) + msgIDs, 'includes/labelmanager.php');
	}
}
/*========================================================================*/
// pedimos nombre para nuevo label
function askLabelName()
{
	var labelName = prompt('Enter new label name: ', '');
	if (!labelFilter.test(labelName) && labelName !== null)
	{
		alert('Enter a valid label name!');
		return null;
	}
	return labelName;
}
/*========================================================================*/
// creamos nuevo link en al menu izq
function createLeftMenuLink(leftmenu, GroupID, LabelID, LabelName, cant)
{
	var newRow = leftmenu.insertRow(leftmenu.rows.length-2);
	var newCell = newRow.insertCell(0);
	newCell.className = 'leftmenuitem';
	newCell.innerHTML = '&nbsp;&nbsp;&nbsp;<img align="absmiddle" src="images/dotty.gif" width="8" height="8" border="0" alt="">&nbsp;<a href="index.php?module=message&task=list&GroupID=' + GroupID + '&label=' + LabelID + '" id="label_link_' + LabelID + '">' + LabelName + '</a> (<span id="label_cant_' + LabelID + '">' + cant + '</span>)';
}
/*========================================================================*/
// creamos prefijo para mensajes
function createLabel(msg_cell, labelName, labelID)
{
	newNode = document.createElement('span');
	newNode.className = 'msg_label';
	newNode.setAttribute('labelid', labelID);
	newNode.appendChild(document.createTextNode('[ ' + labelName + ' ] '));
	msg_cell.insertBefore(newNode, msg_cell.firstChild);
}
/*========================================================================*/
// @param		remove|add
// @param		objeto label o id del label
function updateMessageCount(task, label)
{
//	alert(typeof label);
	if (label === null) return;
	var labelID;
	if (typeof label == 'object')
	{
		if (label.id) labelID = label.id.split('_')[3];
		else labelID = label.getAttribute('labelid')
//		alert(labelID);
	}else{
		labelID = label;
	}
	var msg_count = parseInt(document.getElementById('label_cant_' + labelID).innerHTML);
	if (task == 'remove') msg_count--;
	else if (task == 'add') msg_count++;
	document.getElementById('label_cant_' + labelID).innerHTML = msg_count;
}
/*========================================================================*/
// retorna el SPAN si existe
function getLabelPrefix(msg_cell)
{
	if (msg_cell.firstChild.nodeName.toLowerCase() == 'span') return msg_cell.firstChild;
	return null;
}
/*========================================================================*/
function deleteLabel(ID)
{
	if (!confirm("Are you sure?\n\nMessages within the current label will be moved to the main label.")) return;
	ajax.handler.onreadystatechange = function()
	{
		ajax.showStatus('Deleting...', 'ajax_status');
		if (ajax.ok())
		{
			var table = document.getElementById('edit_labels_table');
			document.getElementById('label_row_' + ID).parentNode.removeChild(document.getElementById('label_row_' + ID));
			if (table.rows.length == 0)
			{
				var newRow = table.insertRow(0);
				var newCell = newRow.insertCell(0);
				newCell.appendChild(document.createTextNode('No current Labels'));
			}
			// actualizamos leftmenu
			var tmp = getContainer('TR', document.getElementById('label_link_' + ID));
			tmp.parentNode.removeChild(tmp);
		}
	}
	ajax.request('POST', 'do=deleteLabel&LabelID=' + ID, 'includes/labelmanager.php');
}
/*========================================================================*/
var native_label_name = '';
var currentEditBox = null;
var currentButton = null; // ref al boton de renombrar
/*========================================================================*/
function renameLabel(ID, GroupID, button)
{
	if (currentEditBox != null)
	{
		currentEditBox.parentNode.innerHTML = native_label_name;
		currentEditBox = null;
		currentButton.nextSibling.style.display = 'none';
		currentButton.style.display = '';
		currentButton = null;
	}
	var cell = document.getElementById('label_' + ID);
	native_label_name = cell.innerHTML;
	var obj = '<input type="text" name="label_name" id="label_name" value="' + native_label_name + '" size="30" maxlength="30" class="input_label">';
	cell.innerHTML = obj;
	currentEditBox = document.getElementById('label_name');
	currentEditBox.focus();
	currentButton = button;
	currentButton.nextSibling.style.display = '';
	currentButton.style.display = 'none';
}
/*========================================================================*/
function saveNewLabelName(ID, GroupID, saveButton)
{
	var cell = document.getElementById('label_' + ID);
	if (!labelFilter.test(currentEditBox.value))
	{
		alert('Enter a valid label name!');
		currentEditBox.focus();
		return;
	}
	if (native_label_name != currentEditBox.value)
	{
		ajax.handler.onreadystatechange = function()
		{
			ajax.showStatus('Updating...', 'ajax_status');
			if (ajax.ok())
			{
				// actualizamos leftmenu
				document.getElementById('label_link_' + ID).innerHTML = currentEditBox.value;
				cell.innerHTML = currentEditBox.value;
				currentEditBox = null;
				saveButton.previousSibling.style.display = '';
				saveButton.style.display = 'none';
			}
		}
		ajax.request('POST', 'do=renameLabel&GroupID=' + GroupID + '&LabelID=' + ID + '&LabelName=' + encode(currentEditBox.value), 'includes/labelmanager.php');
	}else{
		cell.innerHTML = currentEditBox.value;
		currentEditBox = null;
		currentButton = null;
		saveButton.previousSibling.style.display = '';
		saveButton.style.display = 'none';
	}
}
/*========================================================================*/
function addNewLabel(GroupID)
{
	var labelName = askLabelName();
	if (labelName === null) return;
	ajax.handler.onreadystatechange = function()
	{
		if (ajax.ok())
		{
			// creamos nueva fila, en el explorer no funca innerHTML, asi q hacemos el triple de codigo
			var table = document.getElementById('edit_labels_table');
			var newRow = table.insertRow(table.rows.length);
			newRow.className = 'row';
			newRow.id = 'label_row_' + ajax.text;
			var newCell = newRow.insertCell(0);
			newCell.id = 'label_' + ajax.text;
			newCell.appendChild(document.createTextNode(labelName));
			newCell = newRow.insertCell(1);
			newCell.width = "70";
			newCell.align = "center";
			var tmp = document.createElement('input');
			tmp.type = "button";
			tmp.value = "Rename";
			tmp.onclick = function() { renameLabel(ajax.text, GroupID, this); }
			tmp.className = "minibutton";
			newCell.appendChild(tmp);
			tmp = document.createElement('input');
			tmp.type = "button";
			tmp.value = "Save";
			tmp.onclick = function() { saveNewLabelName(ajax.text, GroupID, this); }
			tmp.className = "minibutton";
			tmp.style.display='none';
			newCell.appendChild(tmp);
			newCell = newRow.insertCell(2);
			newCell.width = "70";
			newCell.align = "center";
			tmp = document.createElement('input');
			tmp.type = "button";
			tmp.value = "Delete";
			tmp.onclick = function() { deleteLabel(ajax.text); }
			tmp.className = "minibutton";
			newCell.appendChild(tmp);
			createLeftMenuLink(document.getElementById('group_labels_list'), GroupID, ajax.text, labelName, 0);
		}
	}
	ajax.request('POST', 'do=addNewLabel&GroupID=' + GroupID + '&LabelName=' + encode(labelName), 'includes/labelmanager.php');
}
/*========================================================================*/
// ocultar o mostrar cajita con labels
function showHideLabelsBox()
{
	var table = document.getElementById('group_labels_list');
	if (table.getAttribute('collapsed'))
	{
		for (var i=1;i<table.rows.length;i++)
		{
			table.rows[i].style.display = '';
		}
		table.removeAttribute('collapsed');
	}else{
		for (var i=1;i<table.rows.length;i++)
		{
			table.rows[i].style.display = 'none';
		}
		table.setAttribute('collapsed', 1);
	}
}
/*========================================================================*/
function labelOrder(curID, dir)
{
	var curRow = document.getElementById('label_row_' + curID);
	var tmpNode;
	switch (dir)
	{
		case 'up':
			// mover label pa'rriba
			var prevRow = getPreviousNode('TR', curRow);
			if (!prevRow) return;
			var prevID = prevRow.id.split('_')[2];
			ajax.handler.onreadystatechange = function()
			{
				ajax.showStatus('Updating...', 'ajax_status');
				if (ajax.ok())
				{
					tmpNode = prevRow.cloneNode(true);
					prevRow.parentNode.replaceChild(curRow.cloneNode(true), prevRow);
					curRow.parentNode.replaceChild(tmpNode, curRow);
				}
			}
			ajax.request('POST', 'do=orderLabels&reduce=' + curID + '&sum=' + prevID, 'includes/labelmanager.php');
			break;
		case 'down':
			// mover label pa'bajo
			var nextRow = getNextNode('TR', curRow);
			if (!nextRow) return;
			var nextID = nextRow.id.split('_')[2];
			ajax.handler.onreadystatechange = function()
			{
				ajax.showStatus('Updating...', 'ajax_status');
				if (ajax.ok())
				{
					tmpNode = nextRow.cloneNode(true);
					nextRow.parentNode.replaceChild(curRow.cloneNode(true), nextRow);
					curRow.parentNode.replaceChild(tmpNode, curRow);
				}
			}
			ajax.request('POST', 'do=orderLabels&reduce=' + nextID + '&sum=' + curID, 'includes/labelmanager.php');
			break;
	}
}
/*========================================================================*/
function getContainer(parentTag, node)
{
	var tmp = node.parentNode;
	while (tmp && tmp.nodeName.toUpperCase() != parentTag.toUpperCase()) tmp = tmp.parentNode;
	return tmp;
}
/*========================================================================*/
function getPreviousNode(tag, node)
{
	var tmp = node.previousSibling;
	while (tmp && tmp.nodeName.toUpperCase() != tag.toUpperCase()) tmp = tmp.previousSibling;
	return tmp;
}
/*========================================================================*/
function getNextNode(tag, node)
{
	var tmp = node.nextSibling;
	while (tmp && tmp.nodeName.toUpperCase() != tag.toUpperCase()) tmp = tmp.nextSibling;
	return tmp;
}