/**************************************************
 * Modal.Resize v0.1 (c) 2008 - Joey :: T-Design
 *
 * Met deze class is het mogelijk om je divjes te 
 * resizen, ik pas hem alleen toe op mijn Ajax.Modal
 * als die niet bestaat word het script ook niet
 * uitgevoert!
 *
 * Opties:
 *      elem = Resize element!
 *
 * Opties aanpasbaar via de new ModalResize
 * e.g: new ModalResize('div1', { height:0, width:0});
 *
 **************************************************/

if(typeof(Ajax.Modal) != 'function') {
    throw("Modal Resize heeft Ajax.Modal nodig om te werken");
}
 
var ModalResize = Class.create();

ModalResize.prototype = {
    initialize: function(elem) {
        var options = Object.extend({
            top: 6, // default je kan ze aanpassen via new ModalResize(elem, { left:0, right:0, maxHeight:100} etc..
            left: 6, // default
            right: 6, // default
            bottom: 6, // default
            minHeight: 250, // default
            minWidth: 200, // default
            zindex: 1000, // default
            resize: null
        }, arguments[1] || {} );
        
        // Maak het element lokaal
        this.elem = $(elem);
        this.options = options; // opties lokaal maken
        
        this.registerHandlers();
    },
    
    registerHandlers: function() {
        this.handle = this.elem; // Element borders als handlers registeren
        
        Element.makePositioned(this.elem); // IE iets..
        
        this.active = false;
        this.resizing = false;
        this.cDirection = '';
        
        this.handlerMouseUp = this.resizeStop.bindAsEventListener(this); // Event listeners bouwen
        this.handlerMouseMove = this.resizeUpdate.bindAsEventListener(this);
        this.handlerMouseDown = this.resizeStart.bindAsEventListener(this);
        this.handlerCursorCheck = this.cursor.bindAsEventListener(this); 
        
        this.registerMouseListeners(); // ze registeren via observers
    },
    
    registerMouseListeners: function() {
        Event.observe(document, 'mouseup', this.handlerMouseUp);  
        Event.observe(document, 'mousemove', this.handlerMouseMove);
        Event.observe(this.elem, 'mousemove', this.handlerCursorCheck);
        Event.observe(this.handle, 'mousedown', this.handlerMouseDown); 
    },
    
    // Resizen starten
    resizeStart: function(event) {
        if(Event.isLeftClick(event)) { // Als je links klikt dan beginnen
            var src = Event.element(event);
            
            // Deze allemaal excluden van resizen
            if(src.tagName && (
                src.tagName == 'INPUT' || 
                src.tagName == 'SELECT' || 
                src.tagName == 'BUTTON' || 
                src.tagName == 'TEXTAREA')) return;
                
                var dir = this.directions(event); // Directions achterhalen
                
                // Resizen echt beginnen
                if(dir.length > 0) {
                    this.active = true; // Active naar true zetten
                    this.offset = Position.cumulativeOffset(this.elem); // Offset posities achterhalen
                    this.startTop = this.offset[1]; // Positie boven
                    this.startLeft = this.offset[0]; // Positie links
                    this.startWidth = parseInt(Element.getStyle(this.elem, 'width')); // breedte achterhalen
                    this.startHeight = parseInt(Element.getStyle(this.elem, 'height')); // hoogte achterhalen
                    this.startX = event.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; // X hoogte
                    this.startY = event.clientY + document.body.scrollTop + document.documentElement.scrollTop; // y hoogte
                    
                    this.cDirection = dir; // ze globaal maken
                    Event.stop(event); // Event stoppen
                }
        }
    },
    
    // Resizen stoppen
    resizeStop: function(event) {
        if(this.active && this.resizing) {
            this.finishResize(event, true); // Resizen afronden
            Event.stop(event); // Event stoppen
        }
        this.active = false; // Niet meer active zetten
        this.resizing = false; // Resizen ook uit zetten
    },
    
    // Resizen afronden
    finishResize: function(event, success) {
        this.active = false; // Niet meer active zetten
        this.resizing = false; // Resizen ook uit zetten 

        if(this.options.zindex) // z-index van element terug zetten
            this.elem.style.zIndex = this.originalZ;

        if (this.options.resize) { // Element naar resize zetten
            this.options.resize(this.elem);
        }
    },
    
    // Resizen updaten!
    resizeUpdate: function(event) {
        if(this.active) { // Als active true is 
            if(!this.resizing) { // en resizing false
                var style = this.elem.style; // style van elem achterhalen
                this.resizing = true; // resizing naar true zetten

                if(Element.getStyle(this.elem,'position')=='') // positie parameter bepalen
                  style.position = "relative";

                if(this.options.zindex) {
                  this.originalZ = parseInt(Element.getStyle(this.elem,'z-index') || 0);
                  style.zIndex = this.options.zindex;
                }
            }
            this.draw(event);

            // fix AppleWebKit rendering
            if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); 
            Event.stop(event);
            return false;
        }
    },
    
    // Directions achterhalen
    directions: function(event) {
        var pointer = [Event.pointerX(event), Event.pointerY(event)]; // Muis movement in de gaten houden
        var offsets = Position.cumulativeOffset(this.elem); // Offset achterhalen

        var cursor = '';
        if (this.between(pointer[1] - offsets[1], 0, this.options.top)) cursor += 'n'; // Noorden
        if (this.between((offsets[1] + this.elem.offsetHeight) - pointer[1], 0, this.options.bottom)) cursor += 's'; // Zuiden
        if (this.between(pointer[0] - offsets[0], 0, this.options.left)) cursor += 'w'; // Westen
        if (this.between((offsets[0] + this.elem.offsetWidth) - pointer[0], 0, this.options.right)) cursor += 'e'; // Oosten

        return cursor;
    },
    
    // Directions berekenen
    between: function(val, low, high) {
        return (val >= low && val < high);
    },
    
    // Dynamisch resize cursor toevoegen
    cursor: function(event) {
        var cursor = this.directions(event);
        if (cursor.length > 0) {
            cursor += '-resize';
        } else {
            cursor = '';
        }
        this.elem.style.cursor = cursor;        
    },
    
    // Nieuwe afmeting bereken
    draw: function(event) {
        var pointer = [Event.pointerX(event), Event.pointerY(event)]; // Muis movement in de gaten houden 
        var style = this.elem.style; // element style achterhalen
        
        // Noorden (hoogte)
        if (this.cDirection.indexOf('n') != -1) {
            var pointerMoved = this.startY - pointer[1];
            var margin = Element.getStyle(this.elem, 'margin-top') || "0";
            var newHeight = this.startHeight + pointerMoved;
            if (newHeight > this.options.minHeight) {
                style.height = newHeight + "px";
                style.top = (this.startTop - pointerMoved - parseInt(margin)) + "px";
            }
        }
        // Noorden (breedte)
        if (this.cDirection.indexOf('w') != -1) {
            var pointerMoved = this.startX - pointer[0];
            var margin = Element.getStyle(this.elem, 'margin-left') || "0";
            var newWidth = this.startWidth + pointerMoved;
            if (newWidth > this.options.minWidth) {
                style.left = (this.startLeft - pointerMoved - parseInt(margin))  + "px";
                style.width = newWidth + "px";
            }
        }
        // Noorden (hoogte)
        if (this.cDirection.indexOf('s') != -1) {
            var newHeight = this.startHeight + pointer[1] - this.startY;
            if (newHeight > this.options.minHeight) {
                style.height = newHeight + "px";
            }
        }
        // Noorden (breedte)
        if (this.cDirection.indexOf('e') != -1) {
            var newWidth = this.startWidth + pointer[0] - this.startX;
            if (newWidth > this.options.minWidth) {
                style.width = newWidth + "px";
            }
        }
        
        if(style.visibility=="hidden") style.visibility = ""; // gecko fix
    },
    
    destroy: function() {
        Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
    }
}
