/**
 * 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) {
      if (!select.disabled) {
        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 );
  }

  var location = window.location.pathname;
  var language = location.substr(1,2);
  setCookie("ictdecLang", language, 30);
}

/* 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;
}

// Depending on the user profile (on the user creation/edition page), disable regulators or regions or both.
function manageProfileRestrictions(option) {
  /*var optionIndex = selection.selectedIndex;
  var option = selection[optionIndex];*/

  var toggleSelector = function(disable, selector) {
    var selectorElement = document.getElementById(selector + 'Selector');
    var selectors = document.getElementById(selector);
    selectors.disabled = disable;
    if (disable) {
      alterClass("add", selectorElement, "hiddenSelector");
    } else {
      alterClass("remove", selectorElement, "hiddenSelector");
    }
  }

  if (option.id == "administrator_profile") {
    toggleSelector(true, "regulators");
    toggleSelector(true, "regions");
  } else if (option.id == "regulator_profile") {
    toggleSelector(false, "regulators");
    toggleSelector(true, "regions");
  } else if (option.id == "regional_profile") {
    toggleSelector(true, "regulators");
    toggleSelector(false, "regions");
  }
}

/**
 * Manipulation on the class attribute of an element.
 * Action can be either "add", "remove" or "check".
 * "check" will return true if the elemnent's class contains
 * the class1, false otherwise.
 */
function alterClass(action, element, className) {
  switch (action) {
    case 'add':
      if (!alterClass("check", element, className)) {
        if (element.className) {
          element.className += ' ';
        }
        element.className += className;
      }
      break;
    case 'remove':
      if (alterClass("check", element, className)) {
        var regExp = new RegExp("\\b" + className + "\\b");
        element.className = element.className.replace(regExp, ' ');
      }
      break;
    case 'check':
      var regExp = new RegExp("\\b" + className + "\\b");
      return regExp.test(element.className);
  }
}


// Function to manage the language cookie (in case the user goes to www.ictdec.org/ he/she will be redirected to the
// home page in the last visited language.

function setCookie(c_name,value,expiredays) {
  var exdate = new Date();
  exdate.setDate(exdate.getDate() + expiredays);
  document.cookie = c_name + "=" + escape(value) + ((expiredays == null) ? "": ";expires=" + exdate.toUTCString()) + ";path=/";
}

// Confirm deletion of items
function confirmDeletion(message) {
  if (confirm(message)) {
    return true;
  } else {
    return false;
  }
}

function showHide(id, iconId) {
    var e = $(id);
    var icon = $(iconId);
    if(e.style.display == 'block') {
       e.style.display = 'none';
       icon.src = icon.src.replace("minus", "plus");
    } else {
       e.style.display = 'block';
       icon.src = icon.src.replace("plus", "minus");
    }
 }



