var winZIndex = 1000;

var Windows = new Class(
{
  Implements: [Options, Events],

  options: {minWidth: 150, minHeight: 150, width: 200, height: 200, top: -1000000, left: -1000000, center: true, target: '', id: ''},
  handle: null,
  drag: null,
  dragParams: {},

  initialize: function(options)
  {
    this.setOptions(options);
    this._create();
  },

  _create : function()
   {
    this.handle = $(this.options.id);
    if (!this.handle) return;
    var target = (this.options.target) ? $(this.options.target) : null;
    this.handle.setStyles({'width': this.options.width + 2, 'left': this.options.left, 'top': this.options.top, 'z-index': winZIndex});
    this.handle.addEvent('mousedown', this.up.bind(this));
    winZIndex++;
    var bar = this.handle.getElement('.topBar');
    if (bar)
    {
       var closeBtn = bar.getElement('.closeBtn');
       if (closeBtn) closeBtn.addEvent('click', this.close.bind(this));
    }
    var content = this.handle.getElement('.centralArea').setStyles({'width': this.options.width, 'height': this.options.height});
    this.drag = new Drag.Move(this.handle, {snap: 0, handle: bar, container: target, onSnap: function(el){el.addClass('dragging');}, onComplete: function(el){el.removeClass('dragging');}});
    var that = this;
    var rightBorder = this.handle.getElement('.rightBorder');
    this.rbDrag = new Drag(rightBorder,
    {
        onSnap : function(elem)
        {
        that.dragParams.w = content.getSize().x;
        that.dragParams.W = that.handle.getSize().x;
        that.dragParams.target = content;
        },

      onDrag : function(elem)
         {
        var delta = this.mouse.now.x - this.mouse.start.x;
        var w = that.dragParams.w + delta;
        var targetPos = that.dragParams.target.getPosition();
        if (w < that.options.minWidth || (W + targetPos.x) > (window.getScrollLeft() + window.getWidth())) return;
        var W = that.dragParams.W + delta;
        that.dragParams.target.setStyle('width', w);
        that.handle.setStyle('width', W)
      }
    });

    var leftBorder = this.handle.getElement('.leftBorder');
    this.lbDrag = new Drag(leftBorder,
      {
      onSnap : function(elem)
         {
        that.dragParams.w = content.getSize().x;
        that.dragParams.W = that.handle.getSize().x;
        that.dragParams.pos = content.getPosition();
        that.dragParams.target = content;
      },

      onDrag : function(elem)
         {
        var delta = this.mouse.now.x - this.mouse.start.x;
        var w = that.dragParams.w - delta;
        var W = that.dragParams.W - delta;
        var L = this.mouse.start.x + delta;
        var x = (target) ? target.getPosition().x : 0;
        if (w < that.options.minWidth || L < x) return;
        that.dragParams.target.setStyle('width', w);
        that.handle.setStyle('width', W);
        that.handle.setStyle('left', L);
      }
    });

    var bottomBorder = this.handle.getElement('.bottomBorder');
    this.bDrag = new Drag(bottomBorder,
      {
      onSnap : function(elem)
         {
        that.dragParams.h = content.getSize().y;
        that.dragParams.H = that.handle.getSize().y;
        that.dragParams.target = content;
      },

      onDrag : function(elem)
         {
        var delta = this.mouse.now.y - this.mouse.start.y;
        var h = that.dragParams.h + delta;
        var H = that.dragParams.H + delta;
        var targetPos = that.dragParams.target.getPosition();
        if (h < that.options.minHeight || (H + targetPos.y) > (window.getScrollTop() + window.getHeight())) return;
        that.dragParams.target.setStyle('height', h);
        that.handle.setStyle('height', H);
      }
    });

   var brResize = this.handle.getElement('.resize');
   this.resizeDrag = new Drag(brResize,
     {
     preventDefault: true,
     style: false,
     onSnap : function(elem)
        {
       that.dragParams.h = content.getSize().y;
       that.dragParams.H = that.handle.getSize().y;
       that.dragParams.w = content.getSize().x;
       that.dragParams.W = that.handle.getSize().x;
       that.dragParams.target = content;
     },

     onDrag : function()
        {
       var deltay = this.mouse.now.y - this.mouse.start.y;
       var deltax = this.mouse.now.x - this.mouse.start.x;
       var h = that.dragParams.h + deltay;
       var H = that.dragParams.H + deltay;
       var w = that.dragParams.w + deltax;
       var W = that.dragParams.W + deltax;
       var targetPos = that.dragParams.target.getPosition();
       if (h < that.options.minHeight || (H + targetPos.y) > (window.getScrollTop() + window.getHeight()) || w < that.options.minWidth || (W + targetPos.x) > (window.getScrollLeft() + window.getWidth())) return;
       that.dragParams.target.setStyle('height', h);
       that.handle.setStyle('height', H);
       that.dragParams.target.setStyle('width', w);
       that.handle.setStyle('width', W);
     }
   });
 },

 _destroy : function()
  {
   if ($type(this.handle) == 'element')
     {
        if (this.options.center) this.handle.megaFormFinish();
      else this.handle.display('none');
   }
 },

 open: function()
  {
   if (this.handle)
     {
        if (this.options.center) this.handle.megaFormStart();
        else this.handle.display('');
     }
 },

 close: function()
 {
   this.beforeClose();
   this._destroy();
 },

 up: function()
  {
   this.handle.setStyle('z-index', winZIndex++);
 },

 setSize: function(size)
 {
    if (this.handle)
     {
        this.handle.setStyles(size);
        size.width -= 2;
        this.handle.getElement('.centralArea').setStyles(size);
     }
 },

 beforeClose: function()
 {
   // reserved
 }

});