
// *************** form, login and search fields ****************

function setJsHover(element) {
  //dummy stub function for ie script
}

function initSidebar () {

  function setElementClear(element,clearText) {
    //set a text input field to clear when focussed
    if (!element) return;
    addEvent(element,'focus',function() {
      element.focus();
      if (element.value != clearText) return;
      element.value = '';
    });
    addEvent(element,'blur',function() {
      if (element.value != '') return;
      element.value = clearText;
    });
    if (element.value == '') element.value = clearText;
    element.blur();
  }

  function setList(element,value){
    // select drop down list element
    for (var i = 0; i < element.length; i++){
      if (element[i].value == value) {
        element[i].selected = true;
        break;
      }
    }
  }

  //sidebar search
  if (getCookie('sideCompanySearchValue') != null){
    setElementClear(getElementById('company-search-box'),getCookie('sideCompanySearchValue'));
    setList(getElementById('company-search-type'),getCookie('sideCompanySearchType'));
  } else {
    setElementClear(getElementById('company-search-box'),'Company name or EPIC');
  }

  if (getCookie('sideDirectorSearchValue') != null){
    setElementClear(getElementById('director-search-box'),getCookie('sideDirectorSearchValue'));
    setList(getElementById('director-search-type'),getCookie('sideDirectorSearchType'));
  } else {
    setElementClear(getElementById('director-search-box'),'Surname, first name');
  }

}

function loginOnLoad() {
	self.focus();

  var username = getCookie('hemscottGuruLogin');
  if (username && username != '') document.loginForm.password.focus();
  else document.loginForm.username.focus();
}

function initRememberMe() {

  var checkbox = getElementById('rememberme');
  if (checkbox) {

    checkbox.style.visibility = 'visible';
    var form = getElementById('loginForm');

    var username = getCookie('hemscottGuruLogin');
    if (username && username != '') {

      form.username.value = username;
      form.rememberme.checked = true;

    }

    addEvent(form,'submit',function () {

      var form = getElementById('loginForm');

      if(form.rememberme.checked) {

        var expires = new Date();
        expires.setDate(expires.getDate()+3650); //expires after 10 years
        setCookie('hemscottGuruLogin',form.username.value,expires,'/');

      } else {

        deleteCookie('hemscottGuruLogin');

      }

    });

  }

}

// *************** external link functionality *****************

function setExternalLinks() {
  var links = getElementsByTagName(document,'a');
  for(var i=0;i < links.length;i++) {
    var link = links[i];
    if ((link.href.indexOf('http://') > -1 && link.href.indexOf('http://' + document.location.host) == -1)
     || (link.href.indexOf('https://') > -1 && link.href.indexOf('https://' + document.location.host) == -1)
     || elementHasClass(link,'external')) {
      link.target = "_blank";
      if (link.title == '') link.title = 'opens in a new window';
      else link.title += ' (opens in a new window)';
      if (!elementHasClass(link,'no-icon')
       && !elementHasClass(link,'feature')
       && !elementHasClass(link,'button')
       && !elementHasClass(link,'button-submit')
       && !elementHasClass(link,'anchor-submit')
       && !elementHasClass(link,'anchor-submit-arrow')
       && link.innerHTML.indexOf('<img') == -1
       && link.innerHTML.indexOf('<IMG') == -1) link.className += ' external-icon';
    }
  }
}


function printPage() {
  window.print();
}

addLoadEvent('navbar',function() {

  //print button
  var printButton = getElementById('print-icon');
  if (printButton) {
    printButton.style.display = 'block';
    printButton.getElementsByTagName('a')[0].href = 'javascript:printPage();';
  }


});


addLoadEvent('excel-download', function() {

  for(i = 1; i < 11; i++) {
    innerAddy = "inner-address" + i;
    if(document.getElementById(innerAddy)) {
      document.getElementById(innerAddy).style.display = "none";
    }
  }



});

// *************** fundamentals sector dropdowns ***************

var supersector;
var sector;
var subsector;

function initSectors() {

  supersector = getElementById('supersector-dropdown');
  sector = getElementById('sector-dropdown');
  subsector = getElementById('subsector-dropdown');

  addEvent(supersector, 'change', updateSectors);
  addEvent(sector, 'change', updateSectors);

  if (typeof(isMSIE) != 'undefined') {

    for (i=0;i<sector.options.length;i++) sectors[sectors.length] = sector.options[i];
    for (i=0;i<subsector.options.length;i++) subsectors[subsectors.length] = subsector.options[i];

  }

  updateSectors();

}

function updateSectors() {

  sector.disabled = (supersector.value == -1);
  if (sector.disabled) sector.value = -1;
  subsector.disabled = (sector.value == -1);
  if (subsector.disabled) subsector.value = -1;

  if (!sector.disabled) {
    for (i=0;i<sector.options.length;i++) {
      if (sector.options[i].value != -1 && sector.options[i].className != supersector.value) {
        sector.options[i].style.display = 'none';
        if (i == sector.selectedIndex) sector.value = -1;
      } else {
        sector.options[i].style.display = '';
      }
    }
  }

  if (!subsector.disabled) {
    for (i=0;i<subsector.options.length;i++) {
      if (subsector.options[i].value != -1 && subsector.options[i].className != sector.value) {
        subsector.options[i].style.display = 'none';
        if (i == subsector.selectedIndex) subsector.value = -1;
      } else {
        subsector.options[i].style.display = '';
      }
    }
  }

}

// ***************** remuneration subsector dropdowns  ******************

function initRemunerationSectors() {

  sector = getElementById('sector-dropdown');
  subsector = getElementById('subsector-dropdown');

  addEvent(sector, 'change', updateRemunerationSectors);

  if (typeof(isMSIE) != 'undefined') {
    for (i=0;i<subsector.options.length;i++) subsectors[subsectors.length] = subsector.options[i];
  }

  updateRemunerationSectors();

}

function updateRemunerationSectors() {

  subsector.disabled = (sector.value == -1);
  if (subsector.disabled) subsector.value = -1;

  if (!subsector.disabled) {
    for (i=0;i<subsector.options.length;i++) {
      if (subsector.options[i].value != -1 && subsector.options[i].className != sector.value) {
        subsector.options[i].style.display = 'none';
        if (i == subsector.selectedIndex) subsector.value = -1;
      } else {
        subsector.options[i].style.display = '';
      }
    }
  }

}

// ***************** online training functions  ******************

function initSessions() {

  title = getElementById('sessionTitle');
  date = getElementById('sessionDate');

  addEvent(title, 'change', updateSessionDate);

  if (typeof(isMSIE) != 'undefined') {
    for (i=0;i<date.options.length;i++) dates[dates.length] = date.options[i];
  }

  updateSessionDate();

}

function updateSessionDate() {

  date.disabled = (title.value == -1);
  if (date.disabled) date.value = -1;

  if (!date.disabled) {
    for (i=0;i<date.options.length;i++) {
      if (date.options[i].value != -1 && date.options[i].className != title.value) {
        date.options[i].style.display = 'none';
        if (i == date.selectedIndex) date.value = -1;
      } else {
        date.options[i].style.display = '';
      }
    }
  }

}

function validateTrainingForm(){
  // All the textboxes are required
  var error = "";
  if (trim(getElementById("forename").value) == "") error = error + '<br />First name';
  if (trim(getElementById("surname").value) == "") error = error + '<br />Surname';
  if (trim(getElementById("companyName").value) == "") error = error + '<br />Company or establishment';
  if (trim(getElementById("username").value) == "") error = error + '<br />Username';
  if (trim(getElementById("forename").value) == "") error = error + '<br />Email address';
  if (trim(getElementById("forename").value) == "") error = error + '<br />Telephone number';
  if (error != '') error = '<p>Please ensure that the following field(s) are completed:' + error + '</p>';

  if (error != ''){
    getElementById("error-content").innerHTML = error;
    getElementById("error").style.display = 'block';
    return false;
  }else{
    return true;
  }
}

// ***************** toggle functions  ******************

function writeExpandContractAll(title, id) {
  document.write ("&#160;<span style=\"font-weight:normal;\"><a class=\"pointer\" onclick=\"toggleAllRows('"+title+"', '"+id+"', 'show')\">Expand all</a>&#160;|&#160;<a class=\"pointer\" onclick=\"toggleAllRows('"+title+"', '"+id+"', 'hide')\">Contract all</a></span>");
}

function writeExpandContractLink(title, id, position) {
  document.write ("<a title=\"Hide this "+title+"'s consituents\" class=\"pointer\" id =\""+title+"_"+position+"\" onclick=\"toggleRows('"+title+"', '"+id+"', this.parentNode.parentNode.rowIndex)\">&ndash;</a>");
}

function toggleRows(title, id, rowIndex){
  rowIndex -= 1;
  for (i = rowIndex; i < rowIndex+100; i++){
    if (i == rowIndex){
      if (elementHasClass(document.getElementById(id).tBodies[0].rows[i+1], 'hidden')){
        document.getElementById(title+'_'+rowIndex).innerHTML = "&ndash;";
        document.getElementById(title+'_'+rowIndex).title = "Hide this "+title+"'s consituents";
      }else{
        document.getElementById(title+'_'+rowIndex).innerHTML = "+";
        document.getElementById(title+'_'+rowIndex).title = "Show this "+title+"'s consituents";
      }
    }else{
      if (elementHasClass(document.getElementById(id).tBodies[0].rows[i], 'hidden')){
        removeClass(document.getElementById(id).tBodies[0].rows[i], "hidden");
        applyClass(document.getElementById(id).tBodies[0].rows[i], "visible");
      }else if (elementHasClass(document.getElementById(id).tBodies[0].rows[i], 'visible')){
        removeClass(document.getElementById(id).tBodies[0].rows[i], "visible");
        applyClass(document.getElementById(id).tBodies[0].rows[i], "hidden");
      }else{
        break;
      }
    }
  }
}

function toggleAllRows(title, id, which){
  var aRows = document.getElementById(id).tBodies[0].getElementsByTagName('tr');
  for(var i=0; i < aRows.length; i++ ){
    if (!elementHasClass(aRows[i], 'dark')){
      if (which == 'show'){
        if (elementHasClass(aRows[i], 'hidden')) removeClass(aRows[i], "hidden");
        applyClass(aRows[i], "visible");
      }else{
        if (elementHasClass(aRows[i], 'visible')) removeClass(aRows[i], "visible");
        applyClass(aRows[i], "hidden");
      }
    }else{
      if (which == 'show'){
        document.getElementById(title+'_'+i).innerHTML = "&ndash;";
        document.getElementById(title+'_'+i).title = "Hide this "+title+"'s consituents";
      }else{
        document.getElementById(title+'_'+i).innerHTML = "+";
        document.getElementById(title+'_'+i).title = "Show this "+title+"'s consituents";
      }
    }
  }
}

// ******************** title text  *********************

function replaceTitle() {
  var title = getElementById('title-text');
  var titleImage = createElement('img');
  titleImage.src = '/guru2/images/focus-search-discover.png';
  titleImage.alt = 'Focus:Search:Discover';
  titleImage.id = 'title-text';
  replaceElement(title,titleImage);
}

// ************************* Advisers ***************************

addLoadEvent('sdc',function() {
  for (i = 1; i < 16; i++) {
    var outerAddy = "outer-address" + i;
    var as = document.getElementById(outerAddy);

    if(as) {
      var innerAddyEls = as.getElementsByTagName('div');
      var innerAddy = innerAddyEls[0];
      innerAddy.style.display = "none";
      as.onclick = function() {
        toggle(this);
        return false;
      }
    }
  }
});

function toggle(els) {
  var innerAddyEls = els.getElementsByTagName('div');
  var innerAddy = innerAddyEls[0];
  if(innerAddy.style.display == "none") {
    innerAddy.style.display = "block";
    els.style.backgroundImage="url(http://www.hemscott.com/guru2/images/icons/arrow-side.gif)";
  }
  else {
    innerAddy.style.display = "none";
    els.style.backgroundImage="url(http://www.hemscott.com/guru2/images/icons/arrow.gif)";
  }

}

// ***************** interim and prelim download functions ******************

function selectAllChosenTypes() {
  // Find the selected interim-type name.
  var reportTypes = getElementById("interim_type");
  var reportType = reportTypes[reportTypes.selectedIndex].value;

  // Select(tick) all reports that are of this type.
  var reportItems = document.getElementsByName("rid");
  for (i=0; i<reportItems.length; i++){
    var checkbox = reportItems[i];
    checkbox.checked = (checkbox.className == reportType);
  }
}

function validateInterimsForm(){
  var reportItems = document.getElementsByName("rid");

  var itemsSelected = 0;
  for (i=0; i<reportItems.length; i++) {
    var checkbox = reportItems[i];
    if (checkbox.checked) {
      itemsSelected++;
    }
  }

  if (itemsSelected == 0) {
    alert("You must select at least one report.");
    return false;
  }
  if (itemsSelected > 5) {
    alert("You may select a maximum of 5 reports.");
    return false;
  }
}

// ***************** director abbreviations key ******************

function toggleAbbrTable(which){
  var abbrevTable = document.getElementById('dr-abbrev');
  var abbrevLinkDiv = document.getElementById('dr-abbrev-link');

  if (which == 'show'){
    abbrevTable.style.display = "block";
    abbrevLinkDiv.innerHTML = '<p><a href="javascript:toggleAbbrTable(\'hide\');">Hide director abbreviations key</a><img style="clear:none;float:none;margin:0 0 0 5px;" alt="" src="/guru2/images/icons/arrow-side.gif"/></p>';
  }else{
    abbrevTable.style.display = "none";
    abbrevLinkDiv.innerHTML = '<p><a href="javascript:toggleAbbrTable(\'show\');">Show director abbreviations key</a><img style="clear:none;float:none;margin:0 0 0 5px;" alt="" src="/guru2/images/icons/arrow.gif"/></p>';
  }
}

// ***************** login page tab functions ******************

var areaTabItems;
var areaTabContent;

addLoadEvent('login-footer',function() {
  var tabsDiv = getElementById('verticals-tabs');
  if (tabsDiv) {
    areaTabItems = getElementsByTagName(tabsDiv,'li');
    for (var i=0; i<areaTabItems.length; i++) {
      var areaTabLink = getElementsByTagName(areaTabItems[i],'a');
      if (areaTabLink.length > 0){
        areaTabLink[0].href = 'javascript:setAreaTab(' + i + ');';
      }
    }
    areaTabContent = getElementsByTagName(getElementById('verticals-inner'),'div');
  }
});

function setAreaTab(index){

  var areaId = "";
  // Change tab
  for (var i=0; i<areaTabItems.length; i++) {
    var areaTabLink = getElementsByTagName(areaTabItems[i],'a');
    if (areaTabLink){
      if (i == index){
        applyClass(areaTabLink[0], "selected");
        areaId = areaTabItems[i].childNodes[1].innerHTML.toLowerCase().replace(/&amp;/gi, 'and').replace(/&/gi, 'and').replace(/ /gi, '-').replace(/'/gi, '');
      }else{
        if (elementHasClass(areaTabLink[0], "selected")) removeClass(areaTabLink[0], "selected");
      }
    }
  }

  // Show/hide content
  for (var i=0; i<areaTabContent.length; i++){
    if (areaTabContent[i].id == areaId) areaTabContent[i].style.display = 'block';
    else areaTabContent[i].style.display = 'none';
  }
}

// ***************** general utility functions ******************

function padNumber(number,width) {
  //pad a number with zeros, up to the specified width;d
  var s = '' + number;
  while (s.length < width) s = '0' + s;
  return s;
}

function trim(text) {
  //trim whitespace from a string
  text = text.replace(/^\s+/g,''); //leading space
  return text.replace(/\s+$/g,''); //trailing space
}

function elementHasClass(element, className) {
  //return true if the element has the given class name
  className = className.replace(/\-/g, '\\-');
  var re = new RegExp('(^|\\s)' + className + '(\\s|$)');
  return re.test(element.className);
}

function applyClass(element, className) {
  //add a class to an element
  if (!elementHasClass(element, className)) element.className += ' ' + className;
}

function removeClass(element, className) {
  //remove a class from an element
  className = className.replace(/\-/g, '\\-');
  var re = new RegExp('(^|\\s)' + className + '(\\s|$)');
  element.className = element.className.replace(re,'');
}

function getElementById(id) {
  //get element with a given id
  return (document.all)? document.all[id] : document.getElementById(id);
}

function getElementsByTagName(container, tagName) {
  //get all html nodes of a given type within a given container
  if (container) return container.getElementsByTagName(tagName);
  else return new Array();
}

function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && oElm.all)? oElm.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    var oElement;
    for(var i=0; i<arrElements.length; i++){
        oElement = arrElements[i];
        if(oRegExp.test(oElement.className)){
            arrReturnElements.push(oElement);
        }
    }
    return (arrReturnElements)
}

function addEvent(element, event, func) {
  //add an event to the specified element, preserving any existing events that are attached
  if (!element) return;
  if (element.addEventListener) {
    element.addEventListener(event, func, false);
    return true;
  } else {
    var oldFn = element['on' + event];
    var fn;
    if (oldFn) {
      fn = function() {
        return oldFn();
        return func();
      }
    } else {
      fn = func;
    }
    if (element.attachEvent) return element.attachEvent('on' + event, fn);
    else element['on' + event] = fn;
  }
}

function addLoadEvent(id,func) {
  //add an onload event which will fire once the given id is located within the document
  //this is more reliable than window.onload and will happen exactly when needed

  function loadEvent() {
    var element = getElementById(id);
    if (element) func(); else window.setTimeout(loadEvent,2000);
  }

  loadEvent();

}

function createElement(tagName) {
  //create an html node of the specified type
  return document.createElement(tagName);
}

function createTextNode(text) {
  //create an html text node
  return document.createTextNode(text);
}

function replaceElement(element,replacement) {
  //replace an html node with the specified alternative
  if (element) element.parentNode.replaceChild(replacement,element);
}

function insertElement(parent,child) {
  //insert an html node within the specified parent, after the last child
  if (parent) parent.appendChild(child);
}

function removeElement(element) {
  //remove the specified node from the dom tree
  if (element && element.parentNode) element.parentNode.removeChild(element);
}

function insertElementBefore(element,before) {
  //insert an html node before the specified element
  if (before && before.parentNode) before.parentNode.insertBefore(element,before);
}

function insertElementAfter(element,after) {
  //insert an html node after the specified element
  if (after && after.parentNode) {
    if (after.nextSibling) insertElementBefore(element,after.nextSibling);
    else insertElement(after.parentNode,element);
  }
}

function showChildren(element, show) {
  //show or hide all the children of the specified element
  var display = (show)? 'inline':'none';
  if (element) for (e in element.childNodes) {
    var e = element.childNodes[e];
    if (e.style) e.style.display = display;
  }
}

function setElementPosition(element,x,y) {
  //set the absolute (document relative) position of an element in pixels
  if (element.offsetParent) { // using ie's relative positioning model
    x -= getOffsetLeft(element.parentNode);
    y -= getOffsetTop(element.parentNode);
  }
  element.style.left = x + 'px';
  element.style.top = y + 'px';
}

function getOffsetTop(element) {
  //get the absolute (document relative) position of an element in pixels
  var o = element.offsetTop;
  while (element.offsetParent) {
    element = element.offsetParent
    o += element.offsetTop;
  }
  return o;
}

function getOffsetLeft(element) {
  //get the absolute (document relative) position of an element in pixels
  var o = element.offsetLeft;
  while (element.offsetParent) {
    element = element.offsetParent
    o += element.offsetLeft;
  }
  return o;
}

function importScript(url) {
  //import an external javascript file
  document.writeln('<script type="text/javascript" src="' + url + '"></scr' + 'ipt>');
}

function getQueryParams(query) {
  //decode query parameters into an associative array
  var params = new Object();
  if (!query) return params;
  var start = query.indexOf('?');
  if (start > -1) query = query.substr(start + 1);
  var paramArray = query.split("&");
  for (var i in paramArray) {
    var param = paramArray[i];
    var splitPos = param.indexOf("=");
    var name = param.substring(0,splitPos);
    var value = param.substring(splitPos+1);
    params[name] = value;
  }
  return params;
}

function setCookie(name, value, expires, path, domain, secure) {
  //set a cookie
  document.cookie = name + '=' + escape(value) +
    ((typeof(expires) != 'undefined' && expires) ? '; expires=' + expires.toGMTString() : '') +
    ((typeof(path) != 'undefined' && path) ? '; path=' + path : '; path=/') +
    ((typeof(domain) != 'undefined' && domain) ? '; domain=' + domain : '') +
    ((typeof(secure) != 'undefined' && secure) ? '; secure' : '');
}

function deleteCookie(name) {
  //delete a cookie
  document.cookie = name + '=; expires=0; path=/';
}

function getCookie(name) {
  //get a cookie
  var dc = document.cookie;
  var prefix = name + '=';
  var begin = dc.indexOf('; ' + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else begin += 2;
  var end = document.cookie.indexOf(';', begin);
  if (end == -1) end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}
