/* Version 1.8: kmarx@uni-potsdam.de, 2010-03-10------------------------------*/
/* Settings-------------------------------------------------------------------*/
// Tab container: What element to look for
var iaa_tabcontainer = 'iaa_tabbox';
// Default tab: The tabs are numbered from left to right, starting at zero
var iaa_defaulttab = 0;
// Class name to be assigned to the selected tab
var iaa_classTabSelected = 'iaa_selected';
// Class name to be assigned to tabs not currently selected
var iaa_classTabUnselected = '';
// Headers for each individual card
var iaa_classCardHeader = 'iaa_cardheader';
var iaa_classCard = 'iaa_card';
// Headers for sections within each card
var iaa_classCardSectionHeader = 'iaa_cardsectionheader';
// Expand/collapse
var iaa_classCardSectionIcons = 'iaa_expand';
var iaa_classCardSection = 'iaa_cardsection';
// Common class suffix for hidden elements
var iaa_hiddenSuffix = '_hidden';
var iaa_expandIcon = 'http://cms.rz.uni-potsdam.de/fileadmin/projects/anglistik/images/action-expand.gif';
var iaa_collapseIcon = 'http://cms.rz.uni-potsdam.de/fileadmin/projects/anglistik/images/action-collapse.gif';

/* Code-----------------------------------------------------------------------*/
var iaa_tabs = new Array(), iaa_cards;
var iaa_activetab;

/*
  retrieved 2009-11-14 as licensed under MIT License
*/  
/* MIT licensed code begins here */
/*	
	Developed by Robert Nyman, http://www.robertnyman.com
	Code/licensing: http://code.google.com/p/getelementsbyclassname/
*/

var getElementsByClassName = function (className, tag, elm) {
  if (document.getElementsByClassName) {
    getElementsByClassName = function (className, tag, elm) {
    elm = elm || document;
    var elements = elm.getElementsByClassName(className),
      nodeName = (tag)? new RegExp("\\b" + tag + "\\b", "i") : null,
      returnElements = [],
      current;
      for(var i=0, il=elements.length; i<il; i+=1){
        current = elements[i];
        if(!nodeName || nodeName.test(current.nodeName)) {
          returnElements.push(current);
        }
      }
      return returnElements;
    };
  }
  else if (document.evaluate) {
    getElementsByClassName = function (className, tag, elm) {
      tag = tag || "*";
      elm = elm || document;
      var classes = className.split(" "),
        classesToCheck = "",
        xhtmlNamespace = "http://www.w3.org/1999/xhtml",
        namespaceResolver = (document.documentElement.namespaceURI === xhtmlNamespace)? xhtmlNamespace : null,
        returnElements = [],
        elements,
        node;
      for(var j=0, jl=classes.length; j<jl; j+=1){
        classesToCheck += "[contains(concat(' ', @class, ' '), ' " + classes[j] + " ')]";
      }
      try	{
        elements = document.evaluate(".//" + tag + classesToCheck, elm, namespaceResolver, 0, null);
      }
      catch (e) {
        elements = document.evaluate(".//" + tag + classesToCheck, elm, null, 0, null);
      }
      while ((node = elements.iterateNext())) {
        returnElements.push(node);
      }
      return returnElements;
    };
  }
  else {
    getElementsByClassName = function (className, tag, elm) {
      tag = tag || "*";
      elm = elm || document;
      var classes = className.split(" "),
        classesToCheck = [],
        elements = (tag === "*" && elm.all)? elm.all : elm.getElementsByTagName(tag),
        current,
        returnElements = [],
        match;
      for(var k=0, kl=classes.length; k<kl; k+=1){
        classesToCheck.push(new RegExp("(^|\\s)" + classes[k] + "(\\s|$)"));
      }
      for(var l=0, ll=elements.length; l<ll; l+=1){
        current = elements[l];
        match = false;
        for(var m=0, ml=classesToCheck.length; m<ml; m+=1){
          match = classesToCheck[m].test(current.className);
          if (!match) {
            break;
          }
        }
        if (match) {
          returnElements.push(current);
        }
      }
      return returnElements;
    };
  }
  return getElementsByClassName(className, tag, elm);
};
/* MIT licensed code ends here */

function addEvent(obj, typus, fn){ 
  if (obj.addEventListener){ 
    obj.addEventListener(typus, fn, false); 
    return true; 
  } else if (obj.attachEvent){ 
    var r = obj.attachEvent("on"+typus, fn); 
    return r; 
  } else { 
    return false; 
  } 
}

function updateCardDisplay() {
  var chead, ccard, citem;
  if (!iaa_cards) {
    return false;
  }  
  for (var i = iaa_cards.length-1; i >= 0; i--) {
    if (i == iaa_activetab) {
      iaa_cards[i].className = iaa_classCard;
      try {
        iaa_tabs[i].className = iaa_classTabSelected;
      } catch(e) { }
    } else {
      iaa_cards[i].className = iaa_classCard + iaa_hiddenSuffix;
      try {
        iaa_tabs[i].className = iaa_classTabUnselected;
      } catch(e) { }      
    }      
  } // for all cards
} // updateCardDisplay

function initCards() {
  var l = document.location.href, s;
  var tabbox = document.getElementById(iaa_tabcontainer);
  if (tabbox) iaa_cards = getElementsByClassName('iaa_card');
  if (tabbox && iaa_cards) {

    // Generate tabs from the individual card headers, and hide the headers
    var cheads = getElementsByClassName(iaa_classCardHeader);
    if (cheads) {
      for (var i = 0, j = cheads.length; i < j; i++) {
        s = cheads[i].innerHTML;
        var newa = document.createElement('a'); 
        newa.id = 'iaa_tab'+i;
        /^([^#]+)/.exec(window.location.href);
        newa.href = RegExp.$1 + '#c/' + i;  // for bookmarking, tabbed browsing
        newa.innerHTML = s;
        addEvent(newa, 'click', function(e) { loadThisCard(e); });
        
        if (i >= iaa_cards.length || !/[a-z]/.exec(iaa_cards[i].innerHTML)) {
          newa.style.display = 'none';
          cheads[i].style.display = 'none';
          if (iaa_cards[i]) {
            iaa_cards[i].style.display = 'none';
          }  
        } else {
          cheads[i].className = iaa_classCardHeader + iaa_hiddenSuffix;        
        }  
        if (i == iaa_activetab) {
          newa.className = iaa_classTabSelected;
        } else {
          newa.className = iaa_classTabUnselected;
        }
        tabbox.appendChild(newa);
        iaa_tabs.push(newa);        
        
      }
    }
    
    // If there are tabs and cards, display and activate the tabs        
    iaa_tabs = tabbox.getElementsByTagName('a');    // Get the tabs
    // If the user requested a specific card throught the URL
    if (/#c\/([0-9]+)/.exec(l)) {
      iaa_activetab = parseInt(RegExp.$1);
      if (!iaa_tabs[iaa_activetab]) {
        iaa_activetab = iaa_defaulttab;
      }  
    } else {
      iaa_activetab = iaa_defaulttab;
    }

    updateCardDisplay();     
  } // if this page has tabs
  
  // Make section headers clickable
  var iaa_sections = getElementsByClassName(iaa_classCardSectionHeader);
  if (iaa_sections) {
    var thissection;
    for (var i = iaa_sections.length-1; i >= 0; i--) {
      thissection = iaa_sections[i].nextSibling;
      if (!thissection || thissection.className != iaa_classCardSection) {
        thissection = thissection.nextSibling;
      } 
      if (thissection && thissection.className == iaa_classCardSection) {
        thissection.className = iaa_classCardSection + iaa_hiddenSuffix;
        addEvent(iaa_sections[i], 'click', function(e) { toggleSection(e); });
      } else {
        iaa_sections[i].style.display = 'none';
      }
    }
  }
  
  /*
  var iaa_icons = getElementsByClassName(iaa_classCardSectionIcons);
  if (iaa_icons) {
    for (var i = iaa_icons.length-1; i >= 0; i--) {
      addEvent(iaa_icons[i], 'click', function(e) { toggleSection(e); });
    }
  }
  */                   
} // initCards

function loadCard(card) {
  if (card >= 0 && card < iaa_cards.length) {
    iaa_activetab = card;
    updateCardDisplay();
  }
} // loadCard 

function loadThisCard(vent) {
  if (!vent) { vent = window.event; }
  if (vent.srcElement) {
    var thiselement = vent.srcElement;
  } else {
    var thiselement = vent.target;
  }    
  if (/([0-9]+)/.exec(thiselement.id)) {
    loadCard(parseInt(RegExp.$1));
  }
} // loadThisCard 

function toggleSection(vent) {
  if (!vent) { vent = window.event; }
  if (vent.srcElement) {
    var thiselement = vent.srcElement;
  } else {
    var thiselement = vent.target;
  }

  if (thiselement.tagName == 'IMG') {
    thiselement = thiselement.parentNode;
  }      
  var thissection = thiselement.nextSibling;
  if (!thissection || 
      (thissection.className != iaa_classCardSection &&
       thissection.className != iaa_classCardSection + iaa_hiddenSuffix)) {
    thissection = thissection.nextSibling;
  }        
  var collapse = false;
  if (thissection &&
      (thissection.className != iaa_classCardSection ||
       thissection.className != iaa_classCardSection + iaa_hiddenSuffix)) {
    if (thissection.className == iaa_classCardSection) {
      thissection.className = iaa_classCardSection + iaa_hiddenSuffix;
      collapse = true;
    } else {
      thissection.className = iaa_classCardSection
    }
  }
  for (var i = thiselement.childNodes.length-1; i >= 0; i--) {
    if (thiselement.childNodes[i].tagName == 'IMG') {
      if (collapse) {
        thiselement.childNodes[i].src = iaa_expandIcon;
      } else {
        thiselement.childNodes[i].src = iaa_collapseIcon;
      }
      break;
    }
  }        
} // toggleSection  

addEvent(window, 'load', initCards);
