/**************************************
COPYRIGHT 2009  Dennis Robertson. All Rights Reserved.
email: dnyr3322@mailc.net

DOM

***************************************/


var activeStyle;
var styleSheetsAll;

function chgStyleInit () {
  var allTitles = '', titles = [], enabled;
  for (var idx = 0; idx < document.styleSheets.length; idx++) {
    if ((document.styleSheets[idx].title != null) && (document.styleSheets[idx].title != '')) {
      /* (title can be null in Safari 4) */
      if (allTitles.indexOf("\"" + document.styleSheets[idx].title + "\"") < 0) {
        if ( ! document.styleSheets[idx].disabled)  enabled = idx;
        titles.push(document.styleSheets[idx].title);
        allTitles = "\"" + titles.join("\"") + "\"";
        }
      }
    }
  if (enabled == undefined)  activeStyle = '';
  else  activeStyle = document.styleSheets[enabled].title;
  styleSheetsAll = (titles.length > 1);
/*  alert('chgStyleInit: ' + activeStyle + ',' + styleSheetsAll);*/
  return;
  }

function loadStyle (styleTitle) {
/*  alert('loadStyle: ' + styleTitle);*/
  debugEl = document.getElementById('debug');
  var debugInfo = '<table>';
  var Lt = document.getElementsByTagName('link');
  var rel;
  //for all link tags ...
  for (var x = 0; x < Lt.length; x++) {
/*    debugInfo += objToString(Lt[x]);*/
    if ((Lt[x].getAttribute('rel').toLowerCase() == 'alternate stylesheet') && Lt[x].getAttribute('title')) {  //if this is a stylesheet with a title
      Lt[x].disabled = true;
      if (Lt[x].getAttribute('title') == styleTitle)  Lt[x].disabled = false;
/*      debugInfo += objToString(Lt[x]);*/
      }
    }
/*  var St = document.getElementsByTagName('style');
  // for all style tags ...
  for (var x = 0; x < St.length; x++) {
    if (St[x].title != '') {
      if (St[x].title == styleTitle)  St[x].setAttribute('rel', 'stylesheet');
      else  St[x].setAttribute('rel', 'alternate stylesheet');
      debugInfo += objToString(St[x]);
      }
    }*/
  debugInfo += '</table>';
/*  debugEl.innerHTML = debugInfo + debugEl.innerHTML;*/
  activeStyle = styleTitle;
  return;
  }

document.chgStyle = function (styleTitle) {
  if (activeStyle == undefined)  chgStyleInit();
  if (activeStyle == styleTitle)  return;
  if ( ! styleSheetsAll) {
    loadStyle(styleTitle);
    return;
    }
  for (var idx = 0; idx < document.styleSheets.length; idx++) {
    if (document.styleSheets[idx].title != '') {
      if (document.styleSheets[idx].title == styleTitle)
        document.styleSheets[idx].disabled = false;
      else
        document.styleSheets[idx].disabled = true;
      }
    }
  activeStyle = styleTitle;
  return;
  }

/**************************************/
document.getElementsByClassName = function (className, tagSubset) {
  var results = [];
  if (className == undefined)  return results;
  if (tagSubset == undefined)  tagSubset = '*';
  var hasClassName = new RegExp("(?:^|\\s)" + className + "(?:$|\\s)");
  var allElements = document.getElementsByTagName(tagSubset);
  var element, elementClass;
  for (var i = 0; (element = allElements[i]) != null; i++) {
    elementClass = element.className;
    if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
      results.push(element);
    }
  return results;
  }

/**************************************/
document.getElementsByAttribute = function (attr, val, tagSubset, container) {
  var arr = new Array();
  if (attr == undefined)  return arr;
  if (val == undefined)  return arr;
  if (tagSubset == undefined)  tagSubset = '*';
  if (container == undefined)  container = document;
  var all;
  if ((container.all != undefined) && (tagSubset == '*'))
    all = container.all;
  else
    all = container.getElementsByTagName(tagSubset);
  for (var k = 0; k < all.length; k++) {
    if (all[k].getAttribute(attr) == val)  arr.push(all[k]);
    }
  return arr;
  }

/**************************************/
document.getElementPosPage = function (el) {
  var pos = { x:0, y:0 };
  if (el.offsetParent) {
    do {
      pos.x = pos.x + el.offsetLeft;
      pos.y = pos.y + el.offsetTop;
      }  while (el = el.offsetParent);
    }  /* if el.offsetParent */
  return pos;
  }

/**************************************/
document.getStyle = function (el, styleJs) {
  var styles;
  if (document.defaultView && document.defaultView.getComputedStyle)
    styles = document.defaultView.getComputedStyle(el, '');
  else if (el.currentStyle)
    styles = el.currentStyle;
  else
    styles = el.style;
  if (styles) {
    if (styleJs && (styleJs != ''))  return styles[styleJs];
    else  return styles;
    }
  return null;
  }

/**************************************/
document.getElementBorderPadding = function (el, sides) {
  var bp = new Array();
  var elStyle = document.getStyle(el);
  var property, side;
  for (var sidesIdx = 0; sidesIdx < sides.length; sidesIdx++) {
    side = sides[sidesIdx].charAt(0).toUpperCase() + sides[sidesIdx].substr(1);
    if ((sides[sidesIdx] == 'top') && (el.clientTop != undefined))
      bp[sides[sidesIdx]] = el.clientTop;
    else if ((sides[sidesIdx] == 'left') && (el.clientLeft != undefined))
      bp[sides[sidesIdx]] = el.clientLeft;
    else if (elStyle == null)
      bp[sides[sidesIdx]] = 0;
    else {
      property = 'border' + side + 'Width';
      bp[sides[sidesIdx]] =parseInt(elStyle[property]);
      }
    if (elStyle != null) {
      property = 'padding' + side;
      bp[sides[sidesIdx]] +=parseInt(elStyle[property]);
      }
    }  /* for */
  return bp;
  }

/**************************************/
// from howtocreate.co.uk
document.getViewportSize = function () {
  var wh = { w:0, h:0 };
  if (typeof(window.innerWidth) == 'number') {
    //Non-IE
    wh.w = window.innerWidth;
    wh.h = window.innerHeight;
    }
  else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) {
    //IE 6+ in 'standards compliant mode'
    wh.w = document.documentElement.clientWidth;
    wh.h = document.documentElement.clientHeight;
    }
  else if (document.body && (document.body.clientWidth || document.body.clientHeight)) {
    //IE 5+ in 'quirks mode'
    wh.w = document.body.clientWidth;
    wh.h = document.body.clientHeight;
    }
  wh.w -= 16;  /* width includes scrollbar, so subtract out */
    /* needed for ff3 at least when scrollbar present; not sure about other browsers/scenarios */
  return wh;
  }

/**************************************/
// define contains() if it doesn't exist
// (not present in FF as of 3.5)
// from quirksmode.org
if (window.Node && Node.prototype && ! Node.prototype.contains) {
  Node.prototype.contains = function (arg) {
    return !!(this.compareDocumentPosition(arg) & 16);
    }
  }
