/* showhide.js - response to challenge on Sheriar Designs 9 Jan 2007
   @ http://manisheriar.com/blog/ -
   first some helper functions, then the show/hide library
*/


function getParentOf(elem, tag) {
  while (elem.nodeName.toLowerCase() !== tag && elem.nodeName.toLowerCase() !== 'html') {
    elem = elem.parentNode;
  }
  return (elem.nodeName.toLowerCase() === 'html') ? null : elem;
}

function hasClass(element, myClass) {
  var myClass = myClass.replace(/\-/g, "\\-");
  var re = new RegExp("\\b ?"+myClass+"\\b");
  if (!element.className) return false;
  return re.test(element.className);
}

function addClass(element, myClass) {
  var myClass = myClass.replace(/\-/g, "\\-");
  var re = new RegExp("\\b ?"+myClass+"\\b");
  if (re.test(element.className)) return false;
  element.className += ' '+myClass;
  return true;

}

function removeClass(element, myClass) {
  var myClass = myClass.replace(/\-/g, "\\-");
  var re = new RegExp("\\b ?"+myClass+"\\b");
  if (!re.test(element.className)) return false;
  element.className = element.className.replace(re, '');
  return true;
}

var sH = { // show/hide results of search for trips
  setup: function() {
    if (!document.getElementById || !document.getElementsByTagName) return;
    var allDivs = document.body.getElementsByTagName('div');
    var areaNum = 0, count = 0;
  //  find first tab_group
    while (allDivs[count] && !hasClass(allDivs[count], 'tab_group')) {
      count++;
    }
  // process the rest of the DIVs
    while (allDivs[count] && hasClass(allDivs[count], 'tab_group')) {
        areaNum++;
        // add ids to trip type divs, and link to them from the tabs
        var tabs = allDivs[count].getElementsByTagName('ul');
        var tabListItems = tabs[0].getElementsByTagName('li');
        var links = tabs[0].getElementsByTagName('a');
        var tripType = '';
        // these retain an area's DIVs having class="trip"
        var allTrips,bikeTrips,hikeTrips,multiTrips,insiderTrips;
        allTrips = [];
        bikeTrips = [];
        hikeTrips = [];
        multiTrips = [];
        insiderTrips = [];
        //  hide all subsidiary tabs
        for (var i = 1, j = tabListItems.length; i < j; i++) {
             addClass(tabListItems[i], 'hide');
        }
        count++;
        //  add ids and classes to tabs and targetted divs
        while (allDivs[count] && !hasClass(allDivs[count], 'tab_group')) {
            //  all
            if (hasClass(allDivs[count], 'all')) {
                allDivs[count].id = 'all_' + areaNum;
                links[0].href = '#all_' + areaNum;
                addEvent(links[0], 'click', sH.showAll);
                links[0].onclick = sH.cancelClick;
                //  bike
            } else if (hasClass(allDivs[count], 'bike') && allDivs[count].childNodes.length > 2) {
                tripType = 'bike';
                removeClass(tabListItems[1], 'hide');
                links[1].href = '#bike_' + areaNum;
                allDivs[count].id = 'bike_' + areaNum;
                addEvent(links[1], 'click', sH.show);
                links[1].onclick = sH.cancelClick;
                //  hike
            } else if (hasClass(allDivs[count], 'hike') && allDivs[count].childNodes.length > 2) {
                tripType = 'hike';
                removeClass(tabListItems[2], 'hide');
                links[2].href = '#hike_' + areaNum;
                allDivs[count].id = 'hike_' + areaNum;
                addEvent(links[2], 'click', sH.show);
                links[2].onclick = sH.cancelClick;
                //  multi
            } else if (hasClass(allDivs[count], 'multi') && allDivs[count].childNodes.length > 2) {
                tripType = 'multi';
                removeClass(tabListItems[3], 'hide');
                links[3].href = '#multi_' + areaNum;
                allDivs[count].id = 'multi_' + areaNum;
                addEvent(links[3], 'click', sH.show);
                links[3].onclick = sH.cancelClick;
                //  insider
            } else if (hasClass(allDivs[count], 'insider') && allDivs[count].childNodes.length > 2) {
                tripType = 'insider';
                removeClass(tabListItems[4], 'hide');
                links[4].href = '#insider_' + areaNum;
                allDivs[count].id = 'insider_' + areaNum;
                addEvent(links[4], 'click', sH.show);
                links[4].onclick = sH.cancelClick;
                //  trip
            } else if (hasClass(allDivs[count], 'trip')) {
                allTrips.push(allDivs[count]);
                switch (tripType) {
                    case 'bike': bikeTrips.push(allDivs[count]); break;
                    case 'hike': hikeTrips.push(allDivs[count]); break;
                    case 'multi': multiTrips.push(allDivs[count]); break;
                    case 'insider': insiderTrips.push(allDivs[count]); break;
                }
            }
            count++;
        }
        //  save stuff for later
        sH.tabListItems[areaNum] = tabListItems;
        sH.areaTrips[areaNum] = allTrips;
        sH.areaTrips[areaNum].bike = bikeTrips;
        sH.areaTrips[areaNum].hike = hikeTrips;
        sH.areaTrips[areaNum].multi = multiTrips;
        sH.areaTrips[areaNum].insider = insiderTrips;
        //  set class "first" and "last" on "trips"
        sH.resetFirstAndLast(areaNum);
        areaNum++;
    }
  },

  cancelClick: function() {
    return false;
  },

  resetFirstAndLast: function(areaNum) {
    for (var i=0, j=sH.areaTrips[areaNum].length; i<j; i++) {
      removeClass(sH.areaTrips[areaNum][i], 'first');
      removeClass(sH.areaTrips[areaNum][i], 'last');
      if (i === 0) addClass(sH.areaTrips[areaNum][i], 'first');
      if (i === j - 1) addClass(sH.areaTrips[areaNum][i], 'last');
    }
  },

  showAll: function() {
    var link = getParentOf(this, 'a');  // Safari returns text node
    var fragmentID = link.href.split('#')[1];
    var areaNum = fragmentID.split('_')[1];
  //  set/reset tabs class 'on'
    addClass(sH.tabListItems[areaNum][0].firstChild, 'on');
    for (var i=1, j=sH.tabListItems[areaNum].length; i < j; i++) {
      var li = sH.tabListItems[areaNum][i];
      var link = li.firstChild;
      if (!hasClass(li, 'hide')) {
        removeClass(link, 'on');
        removeClass(document.getElementById(link.href.split('#')[1]), 'hide');
      }
    }
  //  set/reset class "first" and "last" for individual trips
    sH.resetFirstAndLast(areaNum);
    link.blur();
    return false;
  },

  show: function() {
    var link = getParentOf(this, 'a');  // Safari returns text node
    var thisTab = getParentOf(link, 'li');
    if (!thisTab) return false;
    var fragmentID = link.href.split('#')[1];
    var parts = fragmentID.split('_');
    var tripType = parts[0];
    var areaNum = parts[1];
  //  set/reset tab class="on" and target DIV class="hide"
    removeClass(sH.tabListItems[areaNum][0].firstChild, 'on');
    for (var i=1, j=sH.tabListItems[areaNum].length; i < j; i++) {
      var li = sH.tabListItems[areaNum][i];
      var link = li.firstChild;
      if (hasClass(li, 'hide')) continue;
      if (li === thisTab) {
        addClass(link, 'on');
        removeClass(document.getElementById(link.href.split('#')[1]), 'hide');
      }
      else {
        removeClass(link, 'on');
        var activityDiv = document.getElementById(link.href.split('#')[1]);
        if (activityDiv) addClass(activityDiv, 'hide');
      }
    }
  //  add class "first" and "last" to "trip" DIVs
    var last = 0;
    switch (tripType) {
      case 'bike':
        last = sH.areaTrips[areaNum].bike.length - 1;
        addClass(sH.areaTrips[areaNum].bike[0], 'first');
        addClass(sH.areaTrips[areaNum].bike[last], 'last');
        break;
      case 'hike':
        last = sH.areaTrips[areaNum].hike.length - 1;
        addClass(sH.areaTrips[areaNum].hike[0], 'first');
        addClass(sH.areaTrips[areaNum].hike[last], 'last');
        break;
      case 'multi':
        last = sH.areaTrips[areaNum].multi.length - 1;
        addClass(sH.areaTrips[areaNum].multi[0], 'first');
        addClass(sH.areaTrips[areaNum].multi[last], 'last');
        break;
      case 'insider':
        last = sH.areaTrips[areaNum].insider.length - 1;
        addClass(sH.areaTrips[areaNum].insider[0], 'first');
        addClass(sH.areaTrips[areaNum].insider[last], 'last');
        break;
    }
    link.blur();
    return false;
  },

  areaTrips: [],
  tabListItems: []
};

function init() {
  if (arguments.callee.done) return; // quit if this has been called before
  arguments.callee.done = true;

  if (_timer) {
    clearInterval(_timer); // kill the timer
    _timer = null;
  }
  sH.setup();
};

// window.onload by Dean Edwards/Matthias Miller/John Resig
// @ http://dean.edwards.name/weblog/2006/06/again/

/* for Mozilla/Opera9 */
if (document.addEventListener) {
  document.addEventListener("DOMContentLoaded", init, false);
}

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
  document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
  var script = document.getElementById("__ie_onload");
  script.onreadystatechange = function() {
    if (this.readyState == "complete") {
      init(); // call the onload handler
    }
  };
/*@end @*/

/* for Safari */
if (/WebKit/i.test(navigator.userAgent)) { // sniff
  var _timer = setInterval(function() {
    if (/loaded|complete/.test(document.readyState)) {
      init(); // call the onload handler
    }
  }, 10);
}

/* for other browsers */
addEvent(window, 'load', init);

/* Copyright David Hucklesby 2007 */
