﻿// Return a new array of the direct child elements for a parent with the specified tag name
// Note: el.getElementsByTagName(tag) already exists, but if you insert/append to the elements it modifies the array
function getChildElementsByTagName(parentElement, tagName) {
  var items = parentElement.childNodes;
  var desired = new Array();
  for (var i = 0; i < items.length; i++) {
    if (items[i].nodeName.toLowerCase() == tagName.toLowerCase()) {
      desired.push(items[i]);
    }
  }
  return desired;
}

// Modify a CSS rule.
// Note: This code requires that the selector be the exact selector used in the CSS.
// Selectors with multiple parts are browser specific, due to implementation.
// So only modify simple selectors!
function changeCSS(selector, element, value) {
  var cssRules;
  if (document.all) {
    cssRules = 'rules';
  } else if (document.getElementById) {
    cssRules = 'cssRules';
  }
  //alert("Num Stylesheets: "+document.styleSheets.length);
  for (var S = 0; S < document.styleSheets.length; S++){
    //alert("Num styles in stylesheet ("+S+"): "+document.styleSheets[S][cssRules].length);
    changeCSSRules(document.styleSheets[S], cssRules, selector, element, value);
  }
}

function changeCSSRules(styleSheet, cssRules, selector, element, value) {
  for (var R = 0; R < styleSheet[cssRules].length; R++) {
    if (styleSheet[cssRules][R].styleSheet) {
      // Recurse through @imported stylesheets
      //alert("@imported stylesheet (rule #"+R+"), size: "+styleSheet[cssRules][R].styleSheet[cssRules].length);
      changeCSSRules(styleSheet[cssRules][R].styleSheet, cssRules, selector, element, value)
    } else if (styleSheet[cssRules][R].selectorText == selector || styleSheet[cssRules][R].selectorText == "*|"+selector) {
      //alert("Set the css selector: "+styleSheet[cssRules][R].selectorText+" "+element+": "+styleSheet[cssRules][R].style[element]);
      styleSheet[cssRules][R].style[element] = value;
    } else {
      //alert("CSS selector Found: "+styleSheet[cssRules][R].selectorText);
    }
  }
}

/* unused
// Show/Hide (un)ordered list items
function toggleListItems(listId, displayType) {
  var ul = document.getElementById(listId);
  var liList = ul.getElementsByTagName("li");
  if (liList.length <= 0) { return };
  // default to 'display: list-item' for showing if displayType is undefined
  var shown = (displayType != null && displayType || 'list-item');
  if (ul.shownFlag != null) { 
    ul.shownFlag = !ul.shownFlag;
  } else {
    ul.shownFlag = (liList[0].style.display == shown);
  }
  var display = ul.shownFlag ? shown : 'none';
  for (var i=0; i<liList.length; i++) {
    liList[i].style.display=display;
  }
}
*/

/* Only used in CSyndFeed
function hideAllWithin(ULNodeId) {
  var ulNode = document.getElementById(ULNodeId);
  var lis = ulNode.getElementsByTagName("li");
  for (var i=0; i<lis.length; i++) {
    var toCollapse = lis[i].getElementsByTagName("div");
    for (var j=0; j<toCollapse.length; j++) {
      toCollapse[j].className='rss-description-hidden';
      toCollapse[j].style.display='none';
      toCollapse[j].previousSibling.previousSibling.className='rss-item-title-collapsed';
    }
  }
}
*/

// minimize / maximize channels via javascript
function toggleChannel(channelId) {
    var channel = dojo.byId("portletContent_" + channelId);
    var border = dojo.byId("portletBotBorder_" + channelId);
    if (channel.style.display == "none") {
        channel.style.display = "block";
        border.style.display = "block";
        //dojo.byId("portletToggleImg_" + channelId).src = skinPath + "/icons/down.png";
        var img = dojo.byId("portletToggleImg_" + channelId);
        img.className = "down icon";
        img.alt = img.title = "Minimize";
    } else {
        channel.style.display = "none";
        border.style.display = "none";
        //dojo.byId("portletToggleImg_" + channelId).src = skinPath + "/icons/up.png";
        var img = dojo.byId("portletToggleImg_" + channelId);
        img.className = "up icon";
        img.alt = img.title = "Maximize";
    }
    return false;
}


//var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;

/*
function ie6warn() {
  var n = document.getElementById('notification');
  n.innerHTML = "Please upgrade to a better browser such as <a href='http://getfirefox.com'>Firefox</a> or <a href='http://windowsupdate.microsoft.com/'>IE7</a> for a flawless portal experience. <a href=\"javascript:void(0);\" onclick=\"document.getElementById('notification').style.display='none';\">Hide</a>";
  n.style.display = 'block';
}
*/

var leftTabsPadding = 86;
var rightTabsPadding = 20;
var scrollTimerID = null;
var zoomTimerID = null;
var tabScrollSpeed = 8;
var tabScrollTime = 50;
var zoomSpeed = 16;
var zoomTime = 25;

/*
function hasClass(ele,cls) {
  return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
}
function addClass(ele,cls) {
  if (!this.hasClass(ele,cls)) ele.className += " "+cls;
}
function removeClass(ele,cls) {
  var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
  if (ele.className.match(reg)) {
    ele.className=ele.className.replace(reg,' ');
  }
}
*/

function tabsScrollStart(offset) {
  // offset should be 1 or -1
  if (offset > 0) {
    document.getElementById("tab_scroll_right").style.display = "block";
  } else {
    document.getElementById("tab_scroll_left").style.display = "block";
  }
  scrollTimerID  = setTimeout("tabsScroll("+offset+")", tabScrollTime);
}

function tabsScroll(offset) {
  var tabSlider = document.getElementById("tabSlider");
  var newLeftOffset = tabSlider.offsetLeft + offset*tabScrollSpeed;
  if (offset > 0) {
    if (newLeftOffset > leftTabsPadding) {
      // Stop scrolling left
      tabSlider.style.left = leftTabsPadding + "px";
      document.getElementById("tab_scroll_left").style.display = "none";
      tabsScrollStop();
      return;
    }
  } else if (offset < 0) {
    var tabList = document.getElementById("tabList").getElementsByTagName("li");
    //var lastTab = tabList[tabList.length-1].firstChild;
    var lastTab = tabList[tabList.length-1];
    var lastTabRightSide = lastTab.offsetLeft + lastTab.offsetWidth;
    var tabs = document.getElementById("tabs");
    if (newLeftOffset + lastTabRightSide < tabs.offsetWidth - rightTabsPadding ) {
      // Stop scrolling right
      tabSlider.style.left = (tabs.offsetWidth - rightTabsPadding - lastTabRightSide) + "px"; //tabSliderLeftOffset - (visibleTabSpace - tabListRightEnd);
      document.getElementById("tab_scroll_right").style.display = "none";
      tabsScrollStop();
      return
    }
  }
  
  //alert("left = "+newLeftOffset);
  tabSlider.style.left = newLeftOffset + "px";
  scrollTimerID  = setTimeout("tabsScroll("+offset+")", tabScrollTime);
}

function tabsScrollStop() {
  if (scrollTimerID) {
    clearTimeout(scrollTimerID);
    scrollTimerID = null;
  }
  if (zoomTimerID) {
    clearTimeout(zoomTimerID);
    zoomTimerID = null;
  }
  updateScrollButtons();
}


function updateScrollButtons() {
  var tabList = document.getElementById("tabList")
  if (tabList == null) { return; }
  tabList = tabList.getElementsByTagName("li");
  var rightScrollButton = document.getElementById("tab_scroll_right");
  var leftScrollButton = document.getElementById("tab_scroll_left");
  
  // Show leftScrollButton ?
  var tabSlider = document.getElementById("tabSlider");
  var tabs = document.getElementById("tabs");
  var tabSliderLeftOffset = tabSlider.offsetLeft;
  if (tabSliderLeftOffset < leftTabsPadding) {
    leftScrollButton.style.display = 'block';
  } else {
    leftScrollButton.style.display = 'none';
  }
  
  // Show rightScrollButton ?
  var lastTab = tabList[tabList.length-1];
  var tabListRightEnd = lastTab.offsetLeft + lastTab.offsetWidth + tabSliderLeftOffset;
  var visibleTabSpace = tabs.offsetWidth - rightTabsPadding;
  if (tabListRightEnd > visibleTabSpace) {
    rightScrollButton.style.display = 'block';
  } else {
    rightScrollButton.style.display = 'none';
    // Correct for window widenning
    if (tabSliderLeftOffset < leftTabsPadding && tabListRightEnd < visibleTabSpace) {
      //alert("window widenning: "+tabSliderLeftOffset+", "+tabListRightEnd+", "+visibleTabSpace);
      tabSlider.style.left = (tabSliderLeftOffset + visibleTabSpace - tabListRightEnd) + "px";
    }
  }
}
//addEvent(window, 'load', updateScrollButtons);
dojo.addOnLoad(updateScrollButtons);
addEvent(window, 'resize', updateScrollButtons);
//dojo.connect(window, 'onresize', updateScrollButtons); // Can't get this to work??

function zoomToTab(tabIndex) {
  var tabList = document.getElementById("tabList").getElementsByTagName("li");
  
  // Check for in range
  if (tabIndex == -1) {
    tabIndex = tabList.length-1;
  } else if (tabIndex > tabList.length-1 || tabIndex < 0) {
    alert("zoomToTab: tabIndex out of range (0-"+tabList.length-1+"): "+tabIndex);
    return;
  }
  
  var tabSlider = document.getElementById("tabSlider");
  var currTab = tabList[tabIndex];
  //var currTab = tabList[tabIndex].firstChild;
  var currTabLeftSide = currTab.offsetLeft;
  
  var tabs = document.getElementById("tabs");
  var tabSliderLeftOffset = tabSlider.offsetLeft;
  
  // Check off to the left
  if (currTabLeftSide < leftTabsPadding - tabSliderLeftOffset) {
    tabSlider.style.left = (tabSliderLeftOffset + zoomSpeed) + "px";
    zoomTimerID  = setTimeout("zoomToTab("+tabIndex+")", zoomTime);
    return;
  }
  
  var tabListRightEnd = currTabLeftSide + currTab.offsetWidth + tabSliderLeftOffset;
  var visibleTabSpace = tabs.offsetWidth - rightTabsPadding;
  
  // Check off to the right
  if (tabListRightEnd > visibleTabSpace) {
    tabSlider.style.left = (tabSliderLeftOffset - zoomSpeed) + "px";
    zoomTimerID  = setTimeout("zoomToTab("+tabIndex+")", zoomTime);
    return;
  }
  
  //alert("tabListRightEnd: " +tabListRightEnd+ " visibleTabSpace: " +visibleTabSpace);
  
  // Tab already on screen
  tabsScrollStop();
}

function zoomToCurrentTab() {
  var tabList = document.getElementById("tabList")
  if (tabList == null) { return; }
  tabList = tabList.getElementsByTagName("li");
  var selectedTabID = "tab_"+tabId
  
  var currTab;
  for (var i=0; i<=tabList.length-1; i++) {
    currTab = tabList[i];
    if (currTab.getAttribute('id') == selectedTabID) {
      //alert("Tab "+i+" not on screen");
      zoomToTab(i);
      return;
    }
  }
}

var zoomDelay = 100;
//addEvent(window, 'load', function() {setTimeout("zoomToCurrentTab()", zoomDelay);} );
dojo.addOnLoad( function() {setTimeout("zoomToCurrentTab()", zoomDelay);} );

