/**
 * Returns the element associated with specified id
 */
function $(id) {
	return document.getElementById(id);
} // $

/**
 * According to the state of a checkbox, disable or enable the widget specified
 * as target
 */
function changeActiveState (srcCheckbox, target) {
	var item = document.getElementById(target);
	if (srcCheckbox.checked == true) {
		item.disabled = false;
	}
	else {
		item.disabled = true;
	}
} // changeActiveState()

function changeActiveInfodevState(srcCheckbox) {
	var target = srcCheckbox.id.replace("infodevCheck", "infodevDesc");
	changeActiveState(srcCheckbox, target);
}

/**
 * Move selected option from select box specified as source to select box
 * specified as destination
 */
function moveOption(src, dest) {
	var srcItem = document.getElementById(src);
	var destItem = document.getElementById(dest);
	if (srcItem && destItem && srcItem.selectedIndex != -1) {
		var options = new Array();
		var destLen = destItem.options.length;
		var selIndex = srcItem.selectedIndex;

		var option = new Option(srcItem.options[selIndex].text, srcItem.options[selIndex].value);
		srcItem.options[selIndex] = null;
		destItem.options[destLen] = option;

		for (var i = 0; i < destItem.options.length; i++) {
			options[i] = new Option(destItem.options[i].text, destItem.options[i].value);
		}

		options.sort(sortOptions);

		for (var j = 0; j < options.length; j++) {
			destItem.options[j] = options[j];
		}
	}
} // moveOption()

function sortOptions(optionA, optionB) {
	if (optionA.text.toLowerCase() < optionB.text.toLowerCase()) {
		return -1;
	}
	if (optionA.text.toLowerCase() > optionB.text.toLowerCase()) {
		return 1;
	}
	return 0;
} // sortOptions()

/**
 * Select every single row of all specified select boxes
 * list is an array containing all select boxes you want to select all options
 */
function selectAllOptions(list) {
	for (var i = 0; i < list.length; i++) {
		var select = $(list[i]);
		if (select) {
			for (var j=0; j < select.length; j++) {
				select[j].selected = true;
			}
		}
		else {
			alert("Error, element \"" + list[i] + "\" does not exist when calling selectAllOptions()");
		}
	}
} // selectAll()

function appendText(dest, text) {
	var destElement = $(dest);
	if (!destElement) {
		alert("Error, element \"" + dest + "\" does not exist when calling appendText()");
	}
	else {
		destElement.value = destElement.value + text;
	}
} // appendText()

function clearText(dest) {
	var destElement = $(dest);
	if (!destElement) {
		alert("Error, element \"" + dest + "\" does not exist when calling clearText()");
	}
	else {
		destElement.value = "";
	}
} // clearText()

function getText(dest) {
	var destElement = $(dest);
	if (!destElement) {
		alert("Error, element \"" + dest + "\" does not exist when calling clearText()");
		return false;
	}
	else {
		return destElement.value;
	}
}

function addRuleToList(includeRules, excludeRules, rule, include, exclude) {
	var includeRulesElement = $(includeRules);
	var excludeRulesElement = $(excludeRules);
	var includeElement = $(include);
	var excludeElement = $(exclude);

	if (!includeRulesElement || !excludeRulesElement || !includeElement || !excludeElement) {
		alert("Error, an element does not exist when calling addRuleToList()");
	}
	else {
		if (includeElement.checked == false && excludeElement.checked == false) {
			alert("Error, you must either check whether the rule is an include or an exclude rule");
		}
		else {
			var option = new Option(rule, rule);
			var destSize = 0;
			if (includeElement.checked == true) {
				destSize = includeRulesElement.options.length;
				includeRulesElement.options[destSize] = option;
			}
			else {
				destSize = excludeRulesElement.options.length;
				excludeRulesElement.options[destSize] = option;
			}
		}
	}
}

function removeSelectedItem(dest) {
	var destElement = $(dest);
	if (!destElement) {
		alert("Error,  element \"" + dest + "\" does not exist when calling removeSelectedItem()");
	}
	else {
		var selIndex = destElement.selectedIndex;
		if (selIndex != -1) {
			destElement.options[selIndex] = null;
		}
	}
}

function editSelectedItem(select, dest) {
	var destElement = $(dest);
	var selectElement = $(select);

	if (!destElement || !selectElement) {
		alert("Error, an element does not exist when calling editSelectedItem()");
	}
	else {
		var selIndex = selectElement.selectedIndex;
		destElement.value = selectElement.options[selIndex].value;
	}
}

function toggle(itemActive, itemInactive, toDisplay, toHide) {
	var elementActive = $(itemActive);
	var elementInactive = $(itemInactive);
	var toDisplayElement = $(toDisplay);
	var toHideElement = $(toHide);

	if (!elementActive || !elementInactive || !toDisplayElement || !toHideElement) {
		alert("Error, an element does not exist when calling toggle()");
	}
	else {
		elementActive.className = "active";
		elementInactive.className = "inactive";
		toDisplayElement.style.display = "block";
		toHideElement.style.display = "none";
	}
}

var infodevCount = 1;

function setMinInfodevId(count) {
	if (infodevCount <= (count + 1))
		infodevCount = count + 1;
}

function addCategoryReference(codes, display) {
	var parentElement = $("dynamicTable");
	var infoRowElement = $("infoRow");
	if (!parentElement) {
		alert("Error, parent element does not exist");
	}

	// remove empty notice
	if (infoRowElement) {
		infoRowElement.parentNode.removeChild(infoRowElement);
	}

	var tr = document.createElement("TR");
	var td1 = document.createElement("TD");
	var td2 = document.createElement("TD");
	var td3 = document.createElement("TD");

	var input1 = document.createElement("INPUT");
	input1.className = "expand";
	input1.type = "text";
	input1.name = "url(" + infodevCount + ")";
	input1.value = "http://www.ictregulationtoolkit.org/";
	td1.appendChild(input1);

	// create sub table in table cell
	var tableDescriptions = document.createElement("TABLE");
	tableDescriptions.setAttribute("width", "100%");
	tableDescriptions.className = "clear";
	tableDescriptions.appendChild(document.createElement("TBODY"));

	for (var i = 0; i < codes.length; i++) {
		var trDescriptions = document.createElement("TR");
		var tdDescriptionsInput = document.createElement("TD");
		var input = document.createElement("INPUT");

		if (codes.length > 1) {
			var tdDescriptionsLabel = document.createElement("TD");
			tdDescriptionsLabel.setAttribute("width", "30%");
			tdDescriptionsInput.setAttribute("width", "70%");

			var checkbox = document.createElement("INPUT");
			checkbox.type = "checkbox";
			checkbox.id = "infodevCheck" + "_" + infodevCount + "_" + codes[i];
			checkbox.onclick = function() {
				changeActiveInfodevState(this);
			}
			tdDescriptionsLabel.appendChild(checkbox);

			var label = document.createElement("LABEL");
			label.htmlFor = "infodevCheck" + "_" + infodevCount + "_" + codes[i];
			label.appendChild(document.createTextNode(display[i]));
			tdDescriptionsLabel.appendChild(label);

			input.disabled = true;

			trDescriptions.appendChild(tdDescriptionsLabel);
		}

		input.type = "text";
		input.className = "expand";
		input.id = "infodevDesc" + "_" + infodevCount + "_" + codes[i];
		input.name = "description(" + infodevCount + "_" + codes[i] + ")";
		tdDescriptionsInput.appendChild(input);

		trDescriptions.appendChild(tdDescriptionsInput);
		tableDescriptions.tBodies[0].appendChild(trDescriptions);
	}

	td2.appendChild(tableDescriptions);

	var button = document.createElement("INPUT");
	button.value = "Remove";
	button.type = "button";
	button.onclick = function() {
		removeCategoryReference(parentElement, tr);
	}
	td3.appendChild(button);

	td1.vAlign = "top";
	td2.vAlign = "top";
	td3.align = "right";
	td3.vAlign = "top";

	tr.appendChild(td1);
	tr.appendChild(td2);
	tr.appendChild(td3);

	parentElement.tBodies[0].appendChild(tr);

	infodevCount++;

	// re-establish count
	reOrderReferences(parentElement);
}

function reOrderReferences(parentElement) {
	var childs = parentElement.tBodies[0].childNodes;
	var count = 1; // setting to 1 to ensure correct alternance between odd and even
	for (var i = 1; i < childs.length; i++) { // setting i to 1 to skip table header
		if (childs[i].nodeName == "TR") {
			if (count % 2 == 0) {
				childs[i].className = "even";
			}
			else {
				childs[i].className = "odd";
			}
			count++;
		}
	}

	// re-insert empty notice
	if (count == 1) {
		var tbody = document.createElement("TBODY");
		var tr = document.createElement("TR");
		var td = document.createElement("TD");
		var span = document.createElement("SPAN");

		tr.id = "infoRow";
		td.colSpan = "3";
		td.align = "center";

		span.appendChild(document.createTextNode("No element yet"));
		td.appendChild(span);
		tr.appendChild(td);
		tbody.appendChild(tr);
		parentElement.appendChild(tbody);
	}
}

function removeCategoryReference(parentElement, element) {
	var parent = element.parentNode;
	parent.removeChild(element);
	reOrderReferences(parentElement);
}

function removeCategoryReferenceId(elementId) {
	removeCategoryReference($("dynamicTable"), $(elementId));
}

function initializeMenus() {
	if (document.all && document.getElementById) {
		navTop = document.getElementById("menu-top");
		navBottom = document.getElementById("menu-bottom");
		for (var i = 0; i < navTop.childNodes.length; i++) {
			node = navTop.childNodes[i];
			if (node.nodeName == "LI") {
				node.onmouseover = function() {
					this.className += " over";
				}
				node.onmouseout = function() {
					this.className = this.className.replace(" over", "");
				}
			}
		}
		for (var i = 0; i < navBottom.childNodes.length; i++) {
			node = navBottom.childNodes[i];
			if (node.nodeName == "LI") {
				node.onmouseover = function() {
					this.className += " over";
				}
				node.onmouseout = function() {
					this.className = this.className.replace(" over", "");
				}
			}
		}
	}
}

window.onload=initializeMenus;


var documentCount = 1;

function addDocument(languageListId) {
	var languageList = $(languageListId);
	var selected = languageList.options[languageList.selectedIndex];
	languageList.options[languageList.selectedIndex] = null;

	var parentElement = $("dynamicTable");
	var infoRowElement = $("infoRow");
	if (!parentElement) {
		alert("Error, parent element does not exist");
	}

	// remove empty notice
	if (infoRowElement) {
		infoRowElement.parentNode.removeChild(infoRowElement);
	}

	var tr = document.createElement("TR");
	var td1 = document.createElement("TD");
	var td2 = document.createElement("TD");
	var td3 = document.createElement("TD");
	var td4 = document.createElement("TD");
	var td5 = document.createElement("TD");
	var td6 = document.createElement("TD");
	var td7 = document.createElement("TD");

	var inputActive = document.createElement("INPUT");
	inputActive.type = "checkbox";
	inputActive.checked = true;
	inputActive.name = "docActive(" + selected.value + ")";
	td1.appendChild(inputActive);
	td1.align = "center";

	var languageSpan = document.createElement("SPAN");
	languageSpan.appendChild(document.createTextNode(selected.text));
	td2.appendChild(languageSpan);

	var inputFile = document.createElement("INPUT");
	inputFile.size = 30;
	inputFile.type = "file";
	inputFile.name = "file(" + selected.value + ")";
	td6.appendChild(inputFile);

	var button = document.createElement("INPUT");
	button.value = "Remove";
	button.type = "button";
	button.onclick = function() {
		removeDocument(parentElement, tr, languageList, selected);
	}
	td7.appendChild(button);

	td1.className = "left";
	td2.className = "all";
	td3.className = "all";
	td4.className = "all";
	td5.className = "all";
	td6.className = "all";
	td7.className = "right";

	td7.align = "center";

	tr.appendChild(td1);
	tr.appendChild(td2);
	tr.appendChild(td3);
	tr.appendChild(td4);
	tr.appendChild(td5);
	tr.appendChild(td6);
	tr.appendChild(td7);

	parentElement.tBodies[0].appendChild(tr);

	documentCount++;

	// re-establish count
	reOrderDocuments(parentElement);
}

function reOrderDocuments(parentElement) {
	var childs = parentElement.tBodies[0].childNodes;
	var count = 0;
	var pass = 2;
	for (var i = 0; i < childs.length; i++) { // setting i to 1 to skip table header
		if (childs[i].nodeName == "TR") {
			if (pass > 0) {
				pass = pass - 1;
			}
			else {
				if (count % 2 == 0) {
					childs[i].className = "even";
				}
				else {
					childs[i].className = "odd";
				}
				count++;
			}
		}
	}

	// re-insert empty notice
	if (count == 0) {
		var tr = document.createElement("TR");
		var td = document.createElement("TD");
		var span = document.createElement("SPAN");

		tr.id = "infoRow";
		td.colSpan = "7";
		td.align = "center";

		span.appendChild(document.createTextNode("No file available"));
		td.appendChild(span);
		tr.appendChild(td);
		parentElement.tBodies[0].appendChild(tr);
	}
}

function removeDocument(parentElement, element, languageList, option) {
	var parent = element.parentNode;
	parent.removeChild(element);
	reOrderDocuments(parentElement);
	languageList.options[languageList.options.length] = option;

	var options = new Array();
	for (var i = 0; i < languageList.options.length; i++) {
		var tmpOption = languageList.options[i];
		options[i] = new Option(tmpOption.text, tmpOption.value);
	}
	options.sort(sortOptions);
	for (var i = 0; i < options.length; i++) {
		languageList.options[i] = options[i];
	}
}

function resetDecisionsSearchForm() {
	$("query").value = "";
	$("title").checked = true;
	$("reference").checked = false;
	var categoriesAndDatabases = document.getElementsByTagName("input");
	for (var i = 0; i < categoriesAndDatabases.length; i++) {
		if (categoriesAndDatabases[i].name == "categories"
			|| categoriesAndDatabases[i].name == "databases") {
			
			categoriesAndDatabases[i].checked = false;
		}
	}
}

function appendOption(text, value, dest) {
	if (trim(text) == "" || trim(value) == "") {
		return;
	}
	var destElement = $(dest);
	for (var i = 0; i < destElement.options.length; i++) {
		if (destElement.options[i].value == value) {
			return;
		}
	}
	destElement.options[destElement.options.length] = new Option(text, value);
}

function trim(str) {
	return str.replace(/^\s*|\s*$/g,"");
}





/* Glabal function */

/* Load after page is loaded */
function TDCload(){
	if( $('searchForm') ){
		var searchForm = $('searchForm')
		updateState( searchForm.decision, 'advancedSearchActive', 'advancedSearchInactive' )

		if ( $('countriesFilters') )  initialiseFilter( $('countriesFilters'), searchForm.states, true );
		if ( $('databasesFilters') )  initialiseFilter( $('databasesFilters'), searchForm.databases, searchForm.decision.checked );
		if ( $('categoriesFilters') ) initialiseFilter( $('categoriesFilters'), searchForm.categories, searchForm.decision.checked );
	}
}

/* Advanced search functions */

/**
 * Change inputs to enable or disable depending of the value of a "radio" button or "checkbox" case.
 * The value of the checkable element must be the same as the ID of the "input" container.
 * checkableElementArray: The array of checkable elements ("radio" or "checkbox").
 * enableClass: The name of the CSS class to set on the container if it's enable
 * disableClass: The name of the CSS class to set on the container if it's disable
 *
 * Exemple: <input type="radio" value="container" name="theRadio" onclick="updateState( $('formID').theRadio, 'container', 'containerDisable' )">
 *          <div id="container">
 *             <input ...>
 *             ...
 *          </div>
 *
 * N.B. Use "onclick" instead of "onchange" because "onchange" is broken on IE
 **/
function updateState( checkableElementArray, enableClass, disableClass ) {
	var validCheckableElementArray = validateArray( checkableElementArray );
	if (!validCheckableElementArray) return;

	for(var i=0; i < validCheckableElementArray.length; i++) {
		var checkableElement = validCheckableElementArray[i];
		var container = $(checkableElement.value);
		if(checkableElement.checked ) {
			// Enable evreything
			container.className = enableClass;
			changeInputsState( container, true );
		}else{
			// Disable evreything
			container.className = disableClass;
			changeInputsState( container, false );
		}
	}

	return;
}

// If "enable" is "true", all "input", "textarea" and "select" elements in "inputsContainer" will be set to true.
// They will be set to false otherwise.
function changeInputsState( inputsContainer, enable ){
	var inputs = inputsContainer.getElementsByTagName('input');
	for(var i=0; i < inputs.length; i++) {
		inputs[i].disabled = !enable;
	}

	var selects = inputsContainer.getElementsByTagName('select');
	for(var i=0; i < selects.length; i++) {
		selects[i].disabled = !enable;
	}

	var textareas = inputsContainer.getElementsByTagName('textarea');
	for(var i=0; i < textareas.length; i++) {
		textareas[i].disabled = !enable;
	}
}

function validateArray( array ) {
	if (!array) return false;
	if (!array.length)
		// This is not a array, it's a single element.
		array = singleElementToArray(array);
	return array;
}

function singleElementToArray( singleElement ){
	var array = new Array();
	array[0] = singleElement;
	return array;
}


/**
 * Update the "Search Critera" list.
 * It add a "li" elements to the HTML content of a "ul" or a "ol".
 * group: The object containing the list.
 * checkableElement: The checkbox of the filter
 *
 * N.B. The label containing the field value must be the first label element of the parent.
 * The created element has the ID "filter_" + checkableElement.id.
 **/
function updateFilter( group, checkableElement ){
	if ( checkableElement.checked ){
		if ( $(checkableElement.id) )
			addFilter( group, checkableElement );
	}else{
		if ( $(checkableElement.id) )
			removeFilter( group, checkableElement );
	}
}

function addFilter( group, checkableElement ){
	// Create an array containing all "li" (including the new one)
	var filters = new Array();
	filters[0] = createFilter(group, checkableElement);
	var actualFilters = group.getElementsByTagName('li');
	for (var i=0; i<actualFilters.length; i++){
		// Can not copy the element with:
		//    filters[i+1] = actualFilters[i];
		// because IE use pointer instead of a copy.
		filters[i+1] = actualFilters[i].cloneNode(true);
	}

	// Sort "li" with a "li" comparator
	filters.sort(sortLi);

	// Remove all existing "li"s
	group.innerHTML = '';

	// Reinsert all "li" in the correct order
	for (var i=0; i<filters.length; i++){
		group.appendChild( filters[i] );
	}

	// Display the group as a list item.
	displayFilter( group, true );
}

// "li" Comparator - Compare the content of the first span found inside the "li" content
function sortLi(liA, liB) {
	var labelA = liA.getElementsByTagName('span')[0].innerHTML.toLowerCase();
	var labelB = liB.getElementsByTagName('span')[0].innerHTML.toLowerCase();

	if (labelA < labelB) {
		return -1;
	}
	if (labelA > labelB) {
		return 1;
	}
	return 0;
} // sortLi()

function removeFilter( group, checkableElement ){
	checkableElement.checked = false;
	group.removeChild( $("filter_"+checkableElement.id) );

	displayFilter( group, true );
}

// Display the filter list in the Search Critera box
// if display is set to true. Hide it otherwise.
function displayFilter( group, display ){
	if ( display  &&  group.getElementsByTagName('li').length )
		group.parentNode.style.display = 'list-item';
	else
		group.parentNode.style.display = 'none';
}

// Add filters according to the elementsArray values.
// Also call displayFilter
function initialiseFilter( group, elementsArray, display ){
	for (var i=0; i<elementsArray.length; i++)
		if ( elementsArray[i].checked )
			group.appendChild( createFilter(group, elementsArray[i]) );
	displayFilter( group, display );
}

// Create a filter containing a delete button and a span for orderate
function createFilter( group, checkableElement ){
	var label = checkableElement.parentNode.getElementsByTagName('label')[0].innerHTML;

	var filter = document.createElement('li');
	filter.id = "filter_"+checkableElement.id;
	filter.innerHTML = "<a href=\"javascript:removeFilter( $('"+group.id+"'), $('"+checkableElement.id+"') )\">[Remove]</a> <span>"+label+"</span>";

	return filter;
}


function redirectSelectBox(selectBox) {
	var index = selectBox.selectedIndex;
	location = selectBox.options[index].value;
}
