var MIN_WIDTH = 60;
var MAX_WIDTH = 120;
var MAX_DISTANCE = 85;
var MIN_DISTANCE = 0;
var RATIO = 1.50;

// Repräsentiert einen Dockbar-Eintrag
function DockItem(imgid, divid) {

    var div_ref = document.getElementById(divid);
    var img_ref = document.getElementById(imgid);
    var _this = this;
    var pos_x = parseInt(img_ref.style.left) + (parseInt(img_ref.style.width) / 2);
    var pos_y = parseInt(img_ref.style.top);
    var ratio = RATIO;

    this.hit = false;
    // this.z = 0;
    // this.visible = false;

    // Zeit den entsprechenden DIV an
    this.show = function() {
        if (!this.visible) {
	    fade(div_ref, 0);
            this.visible = true;
        }
    }
    
    // Versteckt diesen Block
    this.hide = function() {
        if (this.visible) {
            div_ref.style.display = "none";
            this.visible = false;
        }
    }

    // Wird aufgerufen wenn sich die Maus bewegt hat.
    this.mousemove = function(x, y) {

        // Laufzeitinfos ermitteln
        var dist = calcDistance(img_ref, x, y);
        // var factor = (dist > MAX_DISTANCE) ? 0.0 : (1.0 - (dist / MAX_DISTANCE));
        var factor = 0;
        if (dist < MIN_DISTANCE) {
            factor = 1;
        }
        else if (dist > MAX_DISTANCE) {
            factor = 0;
        }
        else {
            // var cosx = (dist - MIN_DISTANCE) / (MAX_DISTANCE - MIN_DISTANCE);
            // factor = (Math.cos(cosx * 2 * Math.PI) + 1) / 2;
            factor = 1 - ((dist - MIN_DISTANCE) / (MAX_DISTANCE - MIN_DISTANCE));
        }
        var size = MIN_WIDTH + ((MAX_WIDTH - MIN_WIDTH) * factor);
        this.z = parseInt(factor * 100);

        // Bildparameter anpassen
        img_ref.style.width = size + "px";
        img_ref.style.height = (size * ratio) + "px";
        img_ref.style.zIndex = this.z;
        img_ref.style.left = (pos_x - (size / 2)) + "px";
	img_ref.style.top = (pos_y + factor * 20) + "px";

        // Herausfinden, ob Maus auf dem Bild liegt
	var offset = getElementOffset(img_ref);
	if (offset["x"] < x &&
            offset["x"] + size > x &&
            offset["y"] < y &&
            offset["y"] + (size * ratio) > y) {

            // Maus befindet sich auf dem Bild
            this.hit = true;
        }
        else {
            // Maus befindet sich NICHT auf dem Bild
            this.hit = false;
        }
    }
}

// Managerklasse für die Dockbar
function DockBar(frame_id) {

    var frameid = frame_id;
    var mouseX = 0;
    var mouseY = 0;
    
    var frame;
    var items;
    var defaultFrame;
    var visible_item = null;
    
    // Initialisiert die Dockbar
    function _init() {
        frame = document.getElementById(frameid);
        items = new Array();
        
        document.onmousemove = _mousemove;
    }
    _init();
    
    // Wird an das Mousemove-Event des Dokuments angehängt
    function _mousemove(evt) {
    
        evt = (evt) ? evt : ((event) ? event : null);
        
        mouseX = evt.clientX;
        mouseY = evt.clientY;
        
        // Moveevent an alle Bilder weiter geben
        for (var i = 0; i < items.length; i++) {
            items[i].mousemove(mouseX, mouseY);
        }

        // Sichtbarkeiten ermitteln
        var fav_item = null;
        var fav_z = 0;
        for (i = 0; i < items.length; i++) {

            // Prüfen, ob Maus darüber liegt
            if (items[i].hit) {

                // Prüfen, ob gefundenes Item höher liegt
                if (items[i].z > fav_z) {

                    // Wenn ja -> neuer Favorit
                    fav_item = items[i];
                    fav_z = items[i].z;
                }
            }
        }

        // Sichtbarkeit regeln
        if (fav_item == null) {

            // Es ist kein Element angewählt -> Standardtext

            // Prüfen, ob noch ein Element sichtbar ist
            if (visible_item != null) {
                visible_item.hide();
                visible_item = null;
		fade(defaultFrame, 0);
            }
        }
        else {

            // Prüfen, ob bisher ein anderes Element sichtbar war
            if (visible_item == null) {

                // Kein Element vorher sichtbar -> Standardtext
                defaultFrame.style.display = "none";
                visible_item = fav_item;
                visible_item.show();
            }
            else {

                // Prüfen, ob das selbe Element sichtbar war
                if (visible_item != fav_item) {
                    visible_item.hide();
                    visible_item = fav_item;
                    visible_item.show();
                }
            }
        }
    }
    
    // Fügt ein Dockbaritem zur Liste hinzu
    this.addItem = function(item) {
        items.push(item);
    }

    // Setzt den Hauptcontainer
    this.defaultContainer = function(name) {
        defaultFrame = document.getElementById(name);
    }
}

// Ermittelt den Abstand zwischen Mittelpunkt des Elements und der Maus
function calcDistance(element, mousex, mousey) {

    var pos = getElementOffset(element);
    var centerX = pos['x'] + (parseInt(element.clientWidth) / 2);
    var centerY = pos['y'] + (parseInt(element.clientHeight) / 2);
    
    var distX = Math.abs(mousex - centerX);
    var distY = Math.abs(mousey - centerY) 
    
    return Math.sqrt(distX * distX + distY * distY);
}

// Ermittelt die Position des angegebenen Elements innerhalb der Seite
// Liefert einen Array mit ['x'] und ['y']
function getElementOffset(element) {

    var offset = new Array();
    offset['x'] = 0;
    offset['y'] = 0;

    // Sollte das Element existieren
    if (element) {

        // Offsetposition des aktuellen Elements
        offset['x'] += element.offsetLeft;
        offset['y'] += element.offsetTop;
        element = element.offsetParent;

        // Solange weitere OffsetElemente existieren
        while(element && element.offsetParent) {

            // Offsetposition des übergeordneten Elements
            offset['x'] += element.offsetLeft;
            offset['y'] += element.offsetTop;
            element = element.offsetParent;
        }
    }

    // Ergebnis zurück liefern
    return offset;
}

function debug(msg) {
	debugdiv = document.getElementById("debug");
	debugdiv.innerHTML = msg;
}
