/* ---------------------------------- REMEDIAL JavaScript --------------------------------------- */
function isFunction(a)
{
    return typeof a == 'function';
}

if (!isFunction(Array.prototype.push))
{
  /* add single push */
  Array.prototype.push = function (value)
  {
    this[this.length] = value;
  }
}
if (!isFunction(Array.prototype.pop))
{
  /* add single pop */
  Array.prototype.pop = function ()
  {
    var value = this[this.length-1];
    this.length--;
    return value;
  }
}
/* ------------------------CROSS BROWSER DHTML funktio kirjasto --------------------------------------- */

var DHTMLBase = new DHTMLib();   //crossbrowser dhtml library

function DHTMLib()
{
  this.enableDXFilters = false;  //enable cool DirectX filter tricks, can cause serious error NT

  // K&auml;ytet&auml;&auml;n jos getGeometry ep&auml;onnistuu (NS4)
  this.defaultGeometry =
  {
    x : 0,
    y : 0,
    width : 150,
    height : 20
  };

  this._zIndex = 1;                //zIndex laskuri
  this.SIVUPOHJAN_LEVEYS = 750;    //sivupohjan default-leveys keskityst&auml; varten


  this.browser =
  {
    isIE4 : ( document.all ) ? 1 : 0,
    isNS4 : ( document.layers ) ? 1: 0,
    isDOM : ( document.getElementById && !document.all && !document.layers ) ? 1: 0,
    isIE5 : ( document.all && document.getElementById && !document.layers ) ? 1 : 0
  };

  this.createLayer = function(_id, _sisalto, _x, _y, _vis, _align, _zindex)
  {
     _x = this.calcRelative(_x, _align, 'x');
     _y = this.calcRelative(_y, _align, 'y');

     if(!this._zindex)
      this._zindex = _zindex;

     if (this.browser.isNS4)
        var html =  '<layer id="' + _id + '"' + ' left="' + _x + '"' + ' top="' + _y + '" ' +
                    'visibility="' + (_vis ? 'show' : 'hide') + '">' +
                    _sisalto +
                    '</layer>';
     else
        var html = '<div class="dhtml" id="'+_id +'" style="position:absolute; top:'+_y+';left:'+_x+';z-index:'+_zindex +
                   ';visibility:' + (_vis ? 'visible' : 'hidden') + '">' +
                   _sisalto +
                   '</div>';

     document.writeln(html);

     this._zIndex++;
  }

  this.getLayer = function(layerID, obj)
  {
    if (this.browser.isNS4)
    {
      var layer;
      if (!obj) obj = document;
      if (!(layer = obj[layerID]) && obj.all) layer = obj.all[layerID];
      for(var i = 0; !layer && obj.layers && i<obj.layers.length; i++)
        layer = this.getLayer(layerID, obj.layers[i].document);
      return layer;
    }
    else if (this.browser.isIE4) { return document.all[layerID]; }
    else if (this.browser.isDOM) { return document.getElementById(layerID); }
  }

  this.writeToLayer = function ( _id, _sisalto )
  {
       var layer = this.getLayer( _id );
       if (!layer && this.browser.isNS4) layer = this.getLayer( _id + "_container," + _id );
       if (!layer) return false;
       if (this.browser.isIE4 || this.browser.isDOM) layer.innerHTML = _sisalto;
       else if (this.browser.isNS4)
       {
          layer.document.open();
          layer.document.write(_sisalto);
          layer.document.close();
       }
       else return false;
  }

  this.visibility = function ( _id, _switch )
  {
       if (this.browser.isNS4)
       {
          var visible = 'show';
          var hidden = 'hide';
       }
       else
       {
          var visible = 'visible';
          var hidden = 'hidden';
       }
       var layer = this.getLayer( _id );

       if (!layer) return false;

       if (this.enableDXFilters && this.browser.isIE5 && layer.filters && layer.filters[0])
       {
        layer.filters[0].enabled = true;
        layer.filters[0].Apply();
        layer.filters[0].Play();
       }


       if (_switch == "on" || _switch == true) var visu = visible;
       else var visu = hidden;

       if (this.browser.isIE4 || this.browser.isDOM) layer.style.visibility = visu;
       else if (this.browser.isNS4) layer.visibility = visu;
  }

  this.display = function ( _id, _switch )
  {
    if (this.browser.isNS4)
    {
      alert("runtime display switching is not supported in NS4");
    }
    else
    {
      var layer = this.getLayer( _id );

      if (!layer) return false;

      layer.style.display = _switch ? "block" : "none";
    }
  }

  this.findProp =  function ( _src, prop )
  {
      if (!_src) return null;

      var searchRounds = 0;

      while ((!eval("_src."+prop)) && _src)
      {
          if (_src.parentElement) _src = _src.parentElement;
          else if (_src.parentNode)  _src = _src.parentNode;
          if (searchRounds++ > 10) break;
      }

      if (eval("_src."+prop)) return _src;
      else return null;
  }

  this.bodyWidth = function()
  {
      if (this.browser.isIE4) return document.body.clientWidth;
      else if (this.browser.isNS4 || this.browser.isDOM)
      {
         if (document.height > window.innerHeight) return window.innerWidth;
         else return window.innerWidth - 16;
      }
      return null;
  }

  this.bodyHeight = function()
  {
      if (this.browser.isIE4) return document.body.clientHeight;
      else if (this.browser.isNS4 || this.browser.isDOM)
      {
          if (document.width > window.innerWidth) return window.innerHeight-16;
          else return window.innerHeight;
      }
      return null;
  }

  this.calcRelative =   function( offset, alignment, axis)
  {
      if (!axis) axis = 'x'; //x alignment is default

      switch (alignment)
      {
          case "center":
              if (axis = 'x') offset += ParseInt(this.bodyWidth() / 2);
              break;
          case "mouse":
              if (axis = 'x') offset += window.event.x;
              if (axis = 'y') offset += window.event.y;
              break;
          case "left":
          case "left_mirror":
              if (axis = 'x')
              {
                  var marginaalit = parseInt((this.bodyWidth()-this.SIVUPOHJAN_LEVEYS)/2);
                  if (marginaalit < 0) marginaalit = 0;
                  offset += marginaalit;
              }
              break;
          case "right":
              if (axis = 'x')
              {
                  var marginaalit = parseInt((this.bodyWidth()-this.SIVUPOHJAN_LEVEYS)/2);
                  if (marginaalit < 0) marginaalit = 0;
                  offset += (this.bodyWidth() - marginaalit);
              }
              break;
          case "top":
              break;
          case "bottom":
              if (axis = 'y') offset += this.bodyHeight();
              break;
          default:
              break;
      }
      return offset;
  }

  this.setLayerPosition =   function( layerName, xoffset, yoffset, alignment )
  {
      _layer = this.getLayer( layerName );
      _x = this.calcRelative( xoffset, alignment, 'x');
      _y = this.calcRelative( yoffset, alignment, 'y');
      if (this.browser.isIE4)
      {
        _layer.style.pixelLeft = _x;
        _layer.style.pixelTop = _y;
      }
      else if (this.browser.isDOM)
      {
        _layer.style.left = _x + "px";
        _layer.style.top = _y + "px";
      }
      else if (this.browser.isNS4)
      {
        _layer.left = _x;
        _layer.top = _y;
      }
  }

  this.setupEventObject = function(evt)
  {
    if (this.browser.isNS4 || this.browser.isDOM)
    {
      window.event = evt;
      window.event.fromElement = evt.target;
      window.event.toElement = evt.target;
      window.event.srcElement = evt.target;

      if (this.browser.isNS4)
      {
        window.event.x = evt.pageX;
        window.event.y = evt.pageY;
        window.event.srcElement.handleEvent(evt);
      }
      else if (this.browser.isDOM)
      {
        window.event.x = evt.clientX;
        window.event.y = evt.clientY;
      }
    }
    return;
  }

  this.getGeometry =   function(obj)
  {

    if (!obj) return false; //false if object is lost

     var c =
     {
        width  : obj.offsetWidth || this.defaultGeometry.width ,
        height : obj.offsetHeight || this.defaultGeometry.height,
        x      : obj.x || this.defaultGeometry.x,
        y      : obj.y || this.defaultGeometry.y
     };

    /*
     * Note:  offsetParent in Mozilla gives incorrect value
     * for IMG element.
     */

     while (obj.offsetParent)
     {
          c.x += obj.offsetLeft;
          c.y += obj.offsetTop;
          obj = obj.offsetParent;
     }


     c.left = c.x;
     c.right = c.x + c.width;
     c.top = c.y;
     c.bottom = c.y + c.height;

     return c;
  }

  this.hoverIn = function(obj)
  {
      if (!obj.classNameOrig)
      {
          obj.classNameOrig = obj.className;
          obj.className = obj.className + "_hover";
      }
  }

  this.hoverOut = function(obj)
  {
      if (obj.classNameOrig)
      {
          obj.className = obj.classNameOrig;
          obj.classNameOrig = null;
      }
  }

  this.hideTheseArray = new Array();
  this.hideTheseScan =   function (parent)
  {
    var tagsToHide = [];
        tagsToHide['SELECT'] = true;
        tagsToHide['INPUT'] = true;
        tagsToHide['OBJECT'] = true;
        tagsToHide['EMBED'] = true;

    for(var i = 0; i < parent.childNodes.length; i++)
    {
      child = parent.childNodes[i];
      if (tagsToHide[child.nodeName])
      {
        child.geo = this.getGeometry(child);
        this.hideTheseArray.push(child);
      }
      this.hideTheseScan(child);
    }
  }

}


