﻿/* 
(c)2010  GMG Net - Klaus

Klasse, die Grösse von mehreren DOM-Elementen bestimmt bei Grössenveränderung des Browserfensters.

*/

var mooDivResizer = new Class({
    Implements: [Options, Events],
    options: {
        offsetX: 0,                     // wird bei jeder breite abgezogen
        offsetY: 0,                     // wird bei jeder höhe abgezogen
        minDocWidth: 0,                 // wenn der body diese breite unterschreitet wird "onMinimumDocWidthReached" geworfen
        minDocHeight: 0,                // wenn der body diese breite unterschreitet wird "onMinimumDocHeightReached" geworfen
        calcStartGap: false,            // wenn angegeben dann wird der abstand zur gegenüberliegenden Seite automatisch berechnet
        allowReset: true,               // wenn true dann wird beim hinzufügen des elements die originalgrösse gespeichert um später das element wieder auf die ursprungsrösse zu setzen
        resize: true                    // wenn false dann wird bei keinem element mehr die grösse verändert
    },


    /* constructor */
    initialize: function(options) {
        this.elements = new Array();
        window.addEvent('resize', this.resizeAll.bind(this));
    },

    /* adds a new object to the array. all objects in the array will be resized. */
    add: function(jsonElem) {

        // wenn reset erlaubt, dann speichere die aktuelle grösse des elementes
        if (this.options.allowReset == true) {
            jsonElem.domelem = $(jsonElem.elemID);

            if (jsonElem.domelem != null) {
                jsonElem.origHeight = jsonElem.domelem.getSize().y;
                jsonElem.origWidth = jsonElem.domelem.getSize().x;
            }
        }

        // prevent NULL-Values

        if (jsonElem.minHeight == undefined)
            jsonElem.minHeight = 0;

        if (jsonElem.minWidth == undefined)
            jsonElem.minWidth = 0;

        if (jsonElem.toBottom == undefined)
            jsonElem.toBottom = -1;

        if (jsonElem.toRight == undefined)
            jsonElem.toRight = -1;

        // add element to array of elements
        this.elements.push(jsonElem);

        // get x and y of window for later use
        this.calculateWindowDimensions();
    },

    /* calculates the dimensions of the window and the document.body for all browsers */
    calculateWindowDimensions: function() {

        var winsize = window.getSize();
        var docsize = $(document.body).getSize();

        this.winWidth = winsize.x;
        this.winHeight = winsize.y;
        this.docWidth = docsize.x;
        this.docHeight = docsize.y;

        // alert if height of document is too small
        if (this.docHeight <= this.options.minDocHeight) {
            fireEvent("onMinimumDocHeightReached");
        }

        // alert if width of document is too small
        if (this.docWidth <= this.options.minDocWidth) {
            fireEvent("onMinimumDocWidthReached");
        }

    },

    /* returns true if an element with the given id exists */
    exists: function(id) {

        for (var i = 0; i < this.elements.length; i++) {
            if (this.elements[i].elemID == id) {
                return true;
            }
        }
        return false;
    },

    /* returns true if an element with the given id exists */
    getElementById: function(id) {

        for (var i = 0; i < this.elements.length; i++) {
            if (this.elements[i].elemID == id) {
                return this.elements[i];
            }
        }
        return null;
    },

    /* removes an object from the elements-array */
    remove: function(id) {

        for (var i = 0; i < this.elements.length; i++) {
            if (this.elements[i].elemID == id) {
                this.elements.erase(this.elements[i]);
                break;
            }
        }

    },

    /* resizes a given element */
    resize: function(elem) {

        if (this.options.resize == false) {
            return; // stop resize
        }

        // load dom-element
        if (elem.domelem == null) {
            elem.domelem = $(elem.elemID);
        }

        // if not found then stop
        if (elem.domelem == null) {
            return;
        }

        // resetted elements overflow has been set to visible, so set it back to auto
        if (elem.domelem.getStyle('overflow') == 'visible') {
            elem.domelem.setStyle('overflow', 'auto');
        }

        // set height
        if (elem.toBottom > -1) {

            var startgap = 0;

            if (elem.calcStartGap == true || (this.options.calcStartGap == true && elem.calcStartGap == null)) {
                startgap = elem.domelem.getTop();
            }

            var newHeight = this.winHeight - elem.toBottom - this.options.offsetY - startgap;

            if (newHeight > elem.minHeight) {
                elem.domelem.setStyle('height', newHeight);
            } else {
                this.fireEvent("onMinimumHeightReached", elem);
            }

            if (elem.lessHighThen != undefined) {
                if (newHeight < $(elem.lessHighThen).getSize().y)
                    this.fireEvent("onLessHighThen", [elem, elem.lessHighThen]);
            }
        }

        // set width
        if (elem.toRight > -1) {

            var startgap = 0;

            if (elem.calcStartGap == true || (this.options.calcStartGap == true && elem.calcStartGap == null)) {
                startgap = elem.domelem.getLeft();
            }

            var newWidth = this.winWidth - elem.toRight - this.options.offsetX - startgap;

            if (newWidth > elem.minWidth) {
                elem.domelem.setStyle('width', newWidth);
            } else {
                this.fireEvent("onMinimumWidthReached", elem);
            }
        }

        // fire event that element has been resized
        this.fireEvent("onElementResized", elem);
    },

    /* resizes all the elements of the array */
    resizeAll: function(id) {

        this.calculateWindowDimensions();

        // fire event that the whole resize will start 
        this.fireEvent("onResizeStart");

        for (var i = 0; i < this.elements.length; i++) {
            this.resize(this.elements[i]);
        }

        // fire event that the whole resize has been finished
        this.fireEvent("onResizeFinished");
    },

    /* resets all the elements of the array to their original size they had before the resize */
    resetAll: function(id) {

        for (var i = 0; i < this.elements.length; i++) {

            var elem = this.elements[i];
            if (elem.domelem != null) {
                if (elem.origHeight != undefined && elem.origWidth != undefined) {
                    elem.domelem.setStyle('overflow', 'visible');
                    elem.domelem.setStyle('height', elem.origHeight);
                    elem.domelem.setStyle('width', elem.origWidth);
                } else {
                    elem.domelem.setStyle('height', "100%");
                    elem.domelem.setStyle('width', "100%");
                }
            }
        }
    }

});
