// This file is intended to contain some javascript which is common to most sites, and applied
// to most pages. It's all grouped into a single file to reduce http requests; fewer requests
// equals faster loading (in theory).  

// FILE INCLUDES:
// date validation (previously in includes/date_validation.js)
// email validation (previously in includes/email_validate.js)
// search autocompleter (previously in includes/search_autocomplete.js)
// text resizer
// curved corners on top menu links
// curved corners on tables

//-------------------------------------------------------------------------------------------------
// INITIALIZATION (using Prototype's dom:loaded)
//-------------------------------------------------------------------------------------------------
document.observe("dom:loaded", function() {
  applyAutocompleter();
  addTextResizer();
  addMenuCorners();
  addTableCorners();
});
//-------------------------------------------------------------------------------------------------
// GENERIC FUNCTIONS
//-------------------------------------------------------------------------------------------------
function createElementWithId(strElemName, strId) {
  var elem = document.createElement(strElemName);
  elem.id = strId;
  return (elem);
}
function createElementWithClass(strElemName, strClassName) {
  var elem = document.createElement(strElemName);
  elem.className = strClassName;
  return (elem);
}
function createCookie(name,value,days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
  }
  else expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}
function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
  return null;
}
//-------------------------------------------------------------------------------------------------
// DATE VALIDATION
//-------------------------------------------------------------------------------------------------
function isLeapYear(yr) {
  if (yr % 4 == 0 && (yr % 100 != 0 || yr % 400 == 0))
    return true;
  else
    return false;
}
function onMonthChange(mnth, dy, yr) {
  switch (mnth.options[mnth.selectedIndex].value) {
    case "4":
    case "6":
    case "9":
    case "11":
      if (dy.selectedIndex == 30) dy.selectedIndex = 29;
      break;
    case "2":
      if (isLeapYear(yr.options[yr.selectedIndex].value)) {
        if (dy.selectedIndex >= 29) dy.selectedIndex = 28;
      }
      else {
        if (dy.selectedIndex >= 28) dy.selectedIndex = 27;
      }
      break;
  }
  return true;
}
function onDayChange(mnth, dy, yr) {
  switch (mnth.options[mnth.selectedIndex].value)
  {
    case "4":
    case "6":
    case "9":
    case "11":
      if (dy.selectedIndex == 30) dy.selectedIndex = 29;
      break;
    case "2":
      if (isLeapYear(yr.options[yr.selectedIndex].value)) {
        if (dy.selectedIndex >= 29) dy.selectedIndex = 28;
      }
      else {
        if (dy.selectedIndex >= 28) dy.selectedIndex = 27;
      }
      break;
  }
  return true;
}
function onYearChange(mnth, dy, yr)
{
  switch (mnth.options[mnth.selectedIndex].value) {
    case "2":
      if (isLeapYear(yr.options[yr.selectedIndex].value)) {
        if (dy.selectedIndex >= 29) dy.selectedIndex = 28;
      }
      else {
        if (dy.selectedIndex >= 28) dy.selectedIndex = 27;
      }
      break;
  }
  return true;
}
//-------------------------------------------------------------------------------------------------
// EMAIL VALIDATION
//-------------------------------------------------------------------------------------------------
function isCheckEmail(text)
{
  // there must be >= 1 character before @, so we
  // start looking at character position 1
  // (i.e. second character)

  var i = 1;
  var TextLength = text.length;

  // look for @
  while ((i < TextLength) && (text.charAt(i) != "@")) {
    i++;
  }

  if ((i >= TextLength) || (text.charAt(i) != "@"))
    return false;
  else
    i += 2;

  // look for .
  while ((i < TextLength) && (text.charAt(i) != ".")) {
    i++;
  }

  // there must be at least one character after the .
  if ((i >= TextLength - 1) || (text.charAt(i) != ".")) 
    return false;
  else
    return true;
}
function email_validate_regex(email)
{
  var match = /^\w+(\w|\.|-)*\w@(\w+(\w|-)\.)+\w{2,6}$/.test(email);
  if(match)
    return true;
  else
    return false;
}
//-------------------------------------------------------------------------------------------------
// SEARCH AUTOCOMPLETER
//-------------------------------------------------------------------------------------------------
function applyAutocompleter() {
  // empty input on focus
  var elem;
  elem = $('search');
  elem.onclick = function() {
    this.value = "";
  }
  // apply suggestions formatting now we know js is supported
  $('suggestions').className = "enabled";

  getSuggestions();
}
function getSuggestions() {
  new Ajax.Request('/includes/search_autocomplete.asp',
  {
    method:'post',
    onSuccess: function(transport) {
      var response = transport.responseText || "No suggestions returned";
      //alert("Success! \n\n" + response);
      var SuggestionsArr = response.split('~');
      new Autocompleter.Local('search', 'suggestions', SuggestionsArr, {frequency:0.1, fullSearch:true})
    },
    onFailure: function() { alert('Something went wrong...') }
  });
}
//-------------------------------------------------------------------------------------------------
// TEXT RESIZER
//-------------------------------------------------------------------------------------------------
function addTextResizer() {
  var elem = $('textresizer');
  var s, m, l;

  // create link elements
  s = createElementWithId('a','s');
  m = createElementWithId('a','m');
  l = createElementWithId('a','l');

  // extend elements to allow access to prototype methods
  Element.extend(s);
  Element.extend(m);
  Element.extend(l);

  // add titles and link destinations to the link elements
  s.writeAttribute('title', 'Small text');
  m.writeAttribute('title', 'Medium text');
  l.writeAttribute('title', 'Large text');
  s.writeAttribute('href', '#');
  m.writeAttribute('href', '#');
  l.writeAttribute('href', '#');
  s.update('Small text');
  m.update('Medium text');
  l.update('Large text');

  // add the link elements to the resizer DIV
  elem.appendChild(s);
  elem.appendChild(m);
  elem.appendChild(l);
  elem.setStyle({display: 'block'});

  // add click and keypress events to textresizer
  elem.observe('click', changeTextSizeHandler);
  elem.observe('keypress', changeTextSizeHandler);

  // initalize page size based on cookie
  var cookie = readCookie("size");
  var elemId = cookie ? cookie : getPreferredSize();
  changeTextSize(elemId);
}
function changeTextSizeHandler(event) {
  var elem = event.element();
  var elemId = elem.getAttribute("id");
  changeTextSize(elemId);
  event.stop();
}
function changeTextSize(elemId) {
  var a = $('container');
  switch(elemId) {
    case 's':
      a.style.fontSize = '0.6875em'; // 16px x 0.6875 = 11px
      $('s').addClassName('on');
      $('m').removeClassName('on');
      $('l').removeClassName('on');
    break;
    case 'm':
      a.style.fontSize = '0.75em'; // 16px x 0.75 = 12px
      $('s').removeClassName('on');
      $('m').addClassName('on');
      $('l').removeClassName('on');
    break;
    case 'l':
      a.style.fontSize = '0.875em'; // 16px x 0.875 = 14px
      $('s').removeClassName('on');
      $('m').removeClassName('on');
      $('l').addClassName('on');
    break;
  }
  createCookie("size", elemId, 365);
}
function getPreferredSize() {
  return ('m');
}
//-------------------------------------------------------------------------------------------------
// CURVED CORNERS ON TOP MENU LINKS
//-------------------------------------------------------------------------------------------------
function addMenuCorners() {
  var arrElements = $$('#menu LI.on A');
  var count = arrElements.length;
  var elem;
  var tl, tr, bl, br;

  // iterate through all links and add the extra SPANs inside
  for (var i = 0; i < count; i++) {
    elem = arrElements[i];
    tl = createElementWithClass("span", "tl");
    tr = createElementWithClass("span", "tr");
    bl = createElementWithClass("span", "bl");
    br = createElementWithClass("span", "br");
    elem.appendChild(tl);
    elem.appendChild(tr);
    elem.appendChild(bl);
    elem.appendChild(br);
  }
}
//-------------------------------------------------------------------------------------------------
// CURVED CORNERS ON TABLES
//-------------------------------------------------------------------------------------------------
function addTableCorners() {
  var arrElements = $$('TABLE.datatable');
  var count = arrElements.length;
  var elem;
  var outerNode;
  var wrapperOuter, wrapperInner, tl, tr, bl, br;

  for (var i = 0; i < count; i++) {
    elem = arrElements[i];
    wrapperOuter = createElementWithClass('div', 'table-wrapper-outer');
    wrapperInner = createElementWithClass('div', 'table-wrapper-inner');
    tl = createElementWithClass('span', 'tl');
    tr = createElementWithClass('span', 'tr');
    bl = createElementWithClass('span', 'bl');
    br = createElementWithClass('span', 'br');

    // get parent node of the table
    outerNode = elem.parentNode;

    // insert wrappers next to table
    outerNode.insertBefore(wrapperOuter, elem);
    outerNode.insertBefore(wrapperInner, elem);

    // move the table inside wrapperInner
    outerNode.removeChild(elem);
    wrapperInner.appendChild(elem);

    // move wrapperInner inside wrapperOuter
    outerNode.removeChild(wrapperInner);
    wrapperOuter.appendChild(wrapperInner);

    // add the spans to wrapperInner
    wrapperInner.appendChild(tl);
    wrapperInner.appendChild(tr);
    wrapperInner.appendChild(bl);
    wrapperInner.appendChild(br);

    // extend wrapperOuter and the table elem so we can use prototype element methods with them
    Element.extend(wrapperOuter);
    Element.extend(elem);

    // set wrapperOuter to the width of the table, then extend the table to 100% inside it
    wrapperOuter.style.width = elem.offsetWidth + 'px';
    elem.setAttribute('width','100%');

    // move alignment classes from the table to wrapperOuter
    if (elem.hasClassName('left')) {
      wrapperOuter.addClassName('left');
      elem.removeClassName('left');
    }
    else if (elem.hasClassName('center')) {
      wrapperOuter.addClassName('center');
      elem.removeClassName('center');
    }
    else if (elem.hasClassName('right')) {
      wrapperOuter.addClassName('right');
      elem.removeClassName('right');
    }
  }
}