var wm =
{
  windows : [],
  active  : null,
  z_index : 100,

  open : function(winFile, winId, opt)
  {
    if (opt == undefined) opt = {};
    opt.win_file = winFile;
    opt.win_id = winId;
    opt.returl = escape(location.href);

    var created = false;

    if (this.windows[opt.win_id])
    {
      this.front(opt.win_id);
    }
    else
    {
      created = true;
      this.windows[opt.win_id] = opt;

      $(document.body).insert(
          {
            top :'<div id="' + opt.win_id + '" onmousedown="wm.front(\'' + opt.win_id + '\')" class="float-win"></div>'
          });

      wm.center(opt.win_id);
    }

    var old_opt = {};
    Object.extend(old_opt, this.windows[opt.win_id]);
    Object.extend(old_opt, opt);
    opt = old_opt;

    $(opt.win_id).insert({ top: '<div class="fw-loader" id="' + opt.win_id + 'load'  + '"><img src="/admin/images/ajax-loader.gif" height="100" width="100" border="0" alt="Loading..." title="" /></div>' });
    this.centerChild(opt.win_id + 'load', opt.win_id);

    $$('object').each( function(el) { el.setStyle({visibility : 'hidden'}); } );

    var qs = '';

    $H(opt).each(function (pair) { qs += '&opts[' + pair.key + ']=' + pair.value });

    var form = $(opt.win_id + 'form')

    if (form)
    {
      if (opt.submit)
      {
        $$('.tinymce-editor').each(
          function (el)
          {
            if (el.up('.float-win').id == opt.win_id && tinyMCE.getInstanceById(el.id))
            {
              el.value = tinyMCE.getInstanceById(el.id).getWin().document.body.innerHTML;
            }
          }
        );
        var form_qs = form.serialize();
      }
      form.disable();
    }

    new Ajax.Updater(opt.win_id, '/admin/windows/' + opt.win_file,
        {
          parameters : qs + (form_qs ? '&' + form_qs : ''),
          onComplete : function()
          {
            if (created) 
            {
              wm.center(opt.win_id);
            }
            MakeElementDraggable(opt.win_id, { handle: opt.win_id + 'header', starteffect: false, endeffect: false, zindex: 999 } );
            if ($(opt.win_id + 'form')) $(opt.win_id + 'form').focusFirstElement();
          },
          evalScripts : true
        });
  },

  front : function(id)
  {
    this.active = id;
    if ($(id).style.zIndex < this.z_index) $(id).style.zIndex = ++this.z_index;
    $(id).show();
  },

  center : function(id)
  {
    this.front(id);

    var win = $(id);

    var centerY = GetWinInnerHeight() / 2 + (win.getStyle('position') == 'fixed' ? 0 : GetBodyScrollTop());
    var centerX = GetWinInnerWidth() / 2 + (win.getStyle('position') == 'fixed' ? 0 : GetBodyScrollLeft());
    var win_top = centerY - win.getHeight() / 2;
    var win_left = centerX - win.getWidth() / 2;

    win.style.top = (win_top < 30 ? 30 : win_top) + 'px';
    win.style.left = (win_left < 0 ? 0 : win_left) + 'px';
  },

  centerChild : function(child, id)
  {
    var el = $(child);

    var el_top = $(id).getHeight() / 2 - el.getHeight() / 2;
    var el_left = $(id).getWidth() / 2 - el.getWidth() / 2;

    el.style.top = el_top + 'px';
    el.style.left = el_left + 'px';
  },

  close : function(id)
  {
    if (Prototype.Browser.IE)
    {
      $(id).remove();
    }
    else
    {
      new Effect.DropOut(id, {
        afterFinish: function ()
          {
            $(id).remove();
          }
      });
    }

    if (this.active == id) this.active = null;
    delete this.windows[id];

    var i = 0;
    for (var win_id in this.windows) if ($(win_id)) i++;
    if (i == 0) $$('object').each( function(el) { el.setStyle({visibility : 'visible'}) } );
  },

  minimizeAll : function()
  {
    for (var win_id in this.windows)
    {
      if ($(win_id)) $(win_id).hide();
    }
  },

  cascade : function()
  {
    var i = 0;
    for (var win_id in this.windows)
    {
      i++;

      if ($(win_id))
      {
        $(win_id).style.top = 30 + 50 * (i - 1) + 'px';
        $(win_id).style.left = 5 + 30 * (i - 1) + 'px';
  
        this.front(win_id);
      }
    }
  },

  closeAll : function()
  {
    for (var win_id in this.windows)
    {
      if ($(win_id)) this.close(win_id);
    }
  }
}