// resizeSibs.js: use 'handle' to resize sibling divs
// Copyright (c) 2009, Archivista GmbH, m. allan noah

// global pointer to self if caller wants to use it
var GRS = '';

var ResizeSibs = Class.create({

  // our overloaded functions
  initialize: function(element,tld,brd,fixed) {

    this.element = element;
    this.tld = tld;
    this.brd = brd;

    // the fixed divs
    this.fixed = [];
    for (var i=0; i<fixed.length; i++) {
      var elem = $(fixed[i]);
      if(!elem) continue;
      this.fixed.push(elem);
    }

    this.element.style.cursor = 'n-resize';

    this.startPtr = [];

    // bind to grab method
    this.eventGrabRef = this.eventGrab.bindAsEventListener(this);
    Event.observe(this.element, "mousedown", this.eventGrabRef);
 
    // get refs for document move & release
    this.eventMoveRef = this.eventMove.bindAsEventListener(this);
    this.eventReleaseRef = this.eventRelease.bindAsEventListener(this);

    // IE sends resize event while we are resizing, lock to ignore
    this.lock = 0;

    // make the initial adjustment
    this.adjust();

    // handler for window resize
    this.eventResizeRef = this.adjust.bindAsEventListener(this);
    Event.observe(window, "resize", this.eventResizeRef);
  },

  eventGrab: function(event) {

    var temp = event.pointer();
    this.startPtr = [temp.x,temp.y];

    document.body.style.cursor = 'n-resize';

    Event.observe(document, "mousemove", this.eventMoveRef);
    Event.observe(document, "mouseup", this.eventReleaseRef);

    event.stop();
    return false;
  },

  // document level handlers
  eventMove: function(event) {

    event.stop();
    return false;
  },

  eventRelease: function(event) {
    Event.stopObserving(document, "mousemove", this.eventMoveRef);
    Event.stopObserving(document, "mouseup", this.eventReleaseRef);
    document.body.style.cursor = 'auto';

    var temp = event.pointer();
    var deltaY = temp.y - this.startPtr[1];

    // moving up, do tld first
    if(deltaY < 0){
      var curr = this.tld.getHeight();
      var act = this.tld.setHeight(curr + deltaY);
      deltaY = act - curr;
      if(deltaY)
        this.brd.setHeight(this.brd.getHeight() - deltaY);
    }

    // moving down, do brd first
    else if(deltaY){
      var curr = this.brd.getHeight();
      var act = this.brd.setHeight(curr - deltaY);
      deltaY = curr - act;
      if(deltaY)
        this.tld.setHeight(this.tld.getHeight() + deltaY);
    }

    event.stop();
    return false;
  },

  adjust: function(event){

    if(this.lock){
      alert('locked');
      return;
    }

    this.lock = 1;

    var fixedTotal = 40;
    for(var i=0; i<this.fixed.length; i++){
      var elem = $(this.fixed[i]);
      if(!elem) continue;
      fixedTotal += elem.offsetHeight+16;
    }

    var remain = document.viewport.getHeight() - fixedTotal;
    if(remain <= 0) return;

    var flexedTotal = this.tld.getHeight() + this.brd.getHeight();
    this.tld.setHeight(remain*this.tld.getHeight()/flexedTotal);
    this.brd.setHeight(remain*this.brd.getHeight()/flexedTotal);

    // have to set the style height = actual height
    // so IE6 will let the page view go full screen
    var cont = $('Content');
    if(cont){
      cont.style.height = '';
      cont.style.height = cont.offsetHeight + 'px';
    }

    this.lock = 0;
    return;
  }

});


