/**
 * isMethodType
 * @param {} s 
 */
function isMethodType(s)
{
  return /\b(function|object)\b/i.test(s);
}

function dmsg()
{
  if (typeof console != "undefined" && isMethodType(typeof console.log))
  {
    console.log.apply(console, arguments);
  }  
}

function currentStyle(o, pseudoEl)
{
  var result = new Object();
  
  if (o)
  {
    if (!pseudoEl) pseudoEl = null;
    
    if (isMethodType(typeof window.getComputedStyle))
    {
      result = window.getComputedStyle(o, pseudoEl);
    }
    else if (typeof o.currentStyle != "undefined")
    {
      result = o.currentStyle;
    }
  }
    
  return result;
}

function getAbsPos(o)
{
  var oCoords = new Object();
  oCoords.x = 0;
  oCoords.y = 0;
  
  while (o && o != document)
  {
    oCoords.x += o.offsetLeft;
    oCoords.y += o.offsetTop;
    
    o = o.offsetParent || o.parentNode || o.parentElement;
  }
  
  return oCoords;
}

// TODO: Improve feature detection
var ie = document.all;
var w3c = isMethodType(typeof document.getElementById);
var ns4 = document.layers;

// Position der kleinen Grafik
var divSmall, oSmallPos;

// Breite und Hoehe der Lupe
var lensWidth = 200, lensHeight = 136;

/*
 * Jeder Faktor ist moeglich, wenn Breite und Hoehe der grossen
 * und kleinen Grafik im gleichen Verhaeltnis referenziert werden
 */
var zoom = 4.5909090909090909090909090909091;   

var lens, mouseX = 0, mouseY = 0, X, Y;
var leftClip, topClip, rightClip, bottomClip;
var zoomInterval;

function init()
{
  if (ns4)
  {
    window.alert("Die Lupe funktioniert leider erst ab Netscape 6.");
    return false;
  }

  // Opera ab Version 7 ermitteln
  // (unabhaengig von der eingestellten Identifizierung)
  if (window.opera && navigator.userAgent.indexOf("7") < 0)
  {
    window.alert("Die Lupe funktioniert leider erst ab Opera 7.");
    return false;
  }
  
  if (!divSmall)
  {
    window.alert("Fahren Sie mit dem Mauszeiger über den Ski, um einen Ausschnitt vergrössert anzuzeigen.");
  }

  divSmall = document.getElementById("normalbild");
  if (divSmall) oSmallPos = getAbsPos(divSmall);
   
  lens = (w3c ? document.getElementById("zoombild").style
              : document.all["zoombild"].style);

  // if (ns4) document.captureEvents(Event.MOUSEMOVE);

  zoomIntervals = [
    window.setInterval("cut()", 50),
    window.setInterval("cut()", 50)
  ];
  document.onmousemove = pos;
  
  return false;
}

function clearIntervals()
{
  if (zoomIntervals)
  {
    for (var i = zoomIntervals.length; i--;)
    {
      window.clearInterval(zoomIntervals[i]);
    }
  }
}

// Mausposition und Clipping-Werte berechnen
function pos(e)
{ 
  if (!e) e = window.event; // Event-Definition fuer IE
  if (e)
  {
    // Mausposition innerhalb der kleinen Grafik ermitteln
    mouseX = (ns4 ? e.pageX : e.clientX) - oSmallPos.x
      + (window.scrollX || document.documentElement.scrollLeft || 0); 
    mouseY = (ns4 ? e.pageY : e.clientY) - oSmallPos.y
      + (window.scrollY || document.documentElement.scrollTop || 0);

    // dmsg(mouseX, (ns4 ? e.pageX : e.clientX), oSmallPos.x,
    //  (window.scrollX || window.scrollLeft));
  
    // Umrechnen der Mausposition auf grosse Grafik
    X = Math.round(mouseX * zoom); 
    Y = Math.round(mouseY * zoom); 
      
    // Clipping-Werte fuer die grosse Grafik
    leftClip = X - lensWidth / 2;
    topClip = Y - lensHeight / 2;
    rightClip = X + lensWidth / 2;
    bottomClip = Y + lensHeight / 2;
  }
}

// Clipping und Verschieben der grossen Grafik
function cut()
{
  
  if (mouseX > 0 && mouseX < oSmallPos.x + divSmall.offsetWidth
      && mouseY > 0 && mouseY < oSmallPos.y + divSmall.offsetHeight)
  {
    // Fuer IE 5+, Mozilla, Netscape 6+ und Opera 7 // Clipping
    if (ie || w3c)
    { 
      lens.clip = "rect(" + topClip + "px " + rightClip + "px "
        + bottomClip + "px " + leftClip + "px)";
      
      // Grosse Grafik entsprechend der Mausposition verschieben
      lens.left = parseInt(currentStyle(divSmall).left, 10) - mouseX*(zoom-1) + "px";
      lens.top = parseInt(currentStyle(divSmall).top, 10) - mouseY*(zoom-1) + "px";
            
      // Grosse Grafik sichtbar machen
      lens.visibility = "visible";
    }
  }
  else
  {
    // Grosse Grafik unsichtbar machen
    lens.visibility = "hidden";
  }
}
