jsHelper = {

  addLoadListener: function (fn)
  {
    if (typeof window.addEventListener != 'undefined')
    {
      window.addEventListener('load', fn, false);
    }
    else if (typeof document.addEventListener != 'undefined')
    {
      document.addEventListener('load', fn, false);
    }
    else if (typeof window.attachEvent != 'undefined')
    {
      window.attachEvent('onload', fn);
    }
    else
    {
      var oldfn = window.onload;
      if (typeof window.onload != 'function')
      {
        window.onload = fn;
      }
      else
      {
        window.onload = function()
        {
          oldfn();
          fn();
        };
      }
    }
  }, // end of addLoadListener
  
  getElementsByAttribute: function(attribute, attributeValue)
  {
    var elementArray = new Array();
    var matchedArray = new Array();
    
    if(document.all)
    {
      elementArray = document.all;
    }
    else
    {
      elementArray = document.getElementsByTagName("*");
    }
    
    for (var i = 0; i < elementArray.length; i++)
    {
      if (attribute == "class")
      {
        var pattern = new RegExp("(^| )" +
          attributeValue + "( |$)");
          
        if (pattern.test(elementArray[i].className))
        {
          matchedArray[matchedArray.length] = elementArray[i];
        }
      }
      else if (attribute == "for")
      {
        if (elementArray[i].getAttribute("htmlFor") ||
          elementArray[i].getAttribute("for"))
        {
          if(elementArray[i].htmlFor == attributeValue)
          {
            matchedArray[matchedArray.length] = elementArray[i];
          }
        }
      }
      else if (elementArray[i].getAttribute(attribute) ==
        attributeValue)
      {
        matchedArray[matchedArray.length] = elementArray[i];
      }
    }
    
    return matchedArray;
  }, // end of getElementsByAttribute
  
  attachEventListener: function(target, eventType, functionRef, capture)
  {
    if (typeof target.addEventListener != "undefined")
    {
      target.addEventListener(eventType, functionRef, capture);
    }
    else if (typeof target.attachEvent != "undefined")
    {
      var functionString = eventType + functionRef;
      target["e" + functionString] = functionRef;
      
      target[functionString] = function(event)
      {
        if (typeof event == "undefined")
        {
          event = window.event;
        }
        target["e" + functionString](event);
      };
      
      target.attachEvent("on" + eventType, target[functionString]);
    }
    else
    {
      eventType = "on" + eventType;
      
      if(typeof target[eventType] == "function")
      {
        var oldListener = target[eventType];
        
        target[eventType] = function()
        {
          oldListener();
          
          return functionRef();
        }
      }
      else
      {
        target[eventType] = functionRef;
      }
    }
  }, // end of attachEventListener
  
  getEventTarget: function(event)
  {
    var targetElement = null;
    
    if (typeof event.target != "undefined")
    {
      targetElement = event.target;
    }
    else
    {
      targetElement = event.srcElement;
    }
    
    while (targetElement.nodeType == 3 &&
      targetElement.parentNode != null)
    {
      targetElement = targetElement.parentNode;
    }
    
    return targetElement;
  }, // end of getEventTarget
  
  getScrollingPosition: function()
  {
    var position = [0, 0];
    
    if(typeof window.pageYOffset != 'undefined')
    {
      position = [
        window.pageXOffset,
        window.pageYOffset
      ];
    }
    else if (typeof document.documentElement.scroolTop != 'undefined' &&
      document.documentElement.scrollTop > 0)
    {
      position = [
        document.documentElement.scrollLeft,
        document.documentElement.scrollTop
      ];
    }
    else if (typeof document.body.scrollTop != 'undefined')
    {
      position = [
        document.body.scrollLeft,
        document.body.scrollTop
      ];
    }
    
    return position;
  }, // end of getScrollingPosition
  
  getViewportSize: function()
  {
    var size = [0, 0];
    
    if(typeof window.innerWidth != 'undefined')
    {
      size = [
        window.innerWidth, window.innerHeight
      ];
    }
    else if (typeof document.documentElement != 'undefined'
      && typeof document.documentElement.clientWidth != 'undefined'
      && document.documentElement.clientWidth != 0)
    {
      size = [
        document.documentElement.clientWidth,
        document.documentElement.clientHeight
      ];
    }
    else
    {
      size = [
        document.getElementsByTagName('body')[0].clientWidth,
        document.getElementsByTagName('body')[0].clientHeight
      ];
    }
    
    return size;
  }, // end of getViewportSize
  
  getPosition: function(theElement)
  {
    var positionX = 0;
    var positionY = 0;
    
    while(theElement != null)
    {
      positionX += theElement.offsetLeft;
      positionY += theElement.offsetTop;
      theElement = theElement.offsetParent;
    }
    
    return [positionX, positionY];
  } // end of getPosition
  
};
