var jswindows = {};

function jswindow(id, container)
{
 while (!id || jswindows[id])
  id = "jswindow" + rand(1, 999999);
 if (!container) container = document.body;
 var me = jswindows[id] = this;

 var elements = {};
 elements.main = create_element("div", container);
 elements.main.className = "jswindow";
 elements.main.id = id;
 elements.main.innerHTML = 
   "<table class=\"table4\">"+
   "<tr class=\"tr1\" id=\"" + id + "_title\">"+
     "<td height=\"46\" id=\"" + id + "_caption\" style=\"text-align:right;vertical-align:middle;padding-right:5px;padding-top:5px;background:#fff;\"><a id=\"" + id + "_buttons\" href=\"#close\" onclick=\"return false\">Close</a></td>"+
   "</tr>"+
   "<tr class=\"tr1\" id=\"" + id + "_body\">"+
     "<td id=\"" + id + "_content\" style=\"padding:0px 10px 10px;background:#fff;\"></td>"+
   "</tr>"+
   "</table>";

 elements.title = document.getElementById(id + "_title");
 elements.caption = document.getElementById(id + "_caption");
 elements.buttons = document.getElementById(id + "_buttons");
 elements.client = document.getElementById(id + "_client");
 elements.content = document.getElementById(id + "_content");
 
 add_event(elements.main, "mousedown", function(ev) { me.bring_to_front(); });
 add_event(elements.title, "mousedown", function(ev) {
  var origin = get_absolute_position(elements.main);
  var s = get_event_position(ev);
  var drag = function(ev)
  {
   var e = get_event_position(ev);
   var x = origin.x + e.x - s.x;
   var y = origin.y + e.y - s.y;
   set_absolute_position(elements.main, x, y > 0 ? y : 0)
  }
  var end = function(ev)
  {
   remove_event(document, "mousemove", drag);
   remove_event(document, "mouseup", end);
  }
  add_event(document, "mousemove", drag);
  add_event(document, "mouseup", end);
  stop_event(ev);
 });
 add_event(elements.buttons, "click", function() { me.close(); return false; });

 this.get_id = function()
 {
  return id;
 }

 this.get_container = function()
 {
  return elements.main.parentNode;
 }
 
 this.get_element = function(name)
 {
  return elements[name];
 }

 this.set_caption = function(text)
 {
  elements.caption.innerHTML = text;
 }

 this.set_content = function(text)
 {
  elements.content.innerHTML = text;
 }

 this.move = function(x, y)
 {
  elements.main.style.left = x + "px";
  elements.main.style.top = y + "px";
 }
 
 this.center = function()
 {
  this.move(0, 0);
  var ws = get_window_size();
  var ps = get_parent_size(elements.main);
  var scr = get_scrolling();
  var size = get_size(elements.main);
  var x = size.w < ws.w ? Math.round(ps.w/2 - size.w/2 + scr.x) : scr.x;
  var y = size.h < ws.h ? Math.round(ps.h/2 - size.h/2 + scr.y) : scr.y;
  this.move(x > 0 ? x : 0, y > 0 ? y : 0);
 }

 this.resize = function(w, h)
 {
  elements.main.style.width = typeof w == "integer" ? w + "px" : "";
  elements.main.style.height = typeof h == "integer" ? h + "px" : "";
 }

 this.bring_to_front = function()
 {
  var e, p, z = 0;
  for (var i in jswindows)
  {
   e = jswindows[i].get_element("main");
   if (e != elements.main)
   {
    p = e.style.zIndex ? parseInt(e.style.zIndex) : 0;
    if (p > z) z = p;
   }
  }
  p = elements.main.style.zIndex ? parseInt(elements.main.style.zIndex) : 0;
  if (z >= p) elements.main.style.zIndex = z + 1+100;
 }

 this.send_to_back = function()
 {
  var e, p, z = 0;
  for (var i in jswindows)
  {
   e = jswindows[i].get_element("main");
   if (e != elements.main)
   {
    p = e.style.zIndex ? parseInt(e.style.zIndex) : 0;
    if (p < z) z = p;
   }
  }
  p = elements.main.style.zIndex ? parseInt(elements.main.style.zIndex) : 0;
  if (z <= p) elements.main.style.zIndex = z - 1;
 }
 
 this.minimize = function()
 {
  elements.content.style.display = elements.content.style.display == "none" ? "" : "none";
 }

 this.close = function()
 {
  delete jswindows[id];
  elements.main.parentNode.removeChild(elements.main);
 }
 
 this.bring_to_front();
}

function get_parent_window(element)
{
 if (element)
  do element = element.parentNode;
  while (element && element.className != "jswindow");
 return element && (element.id && jswindows[element.id]);
}

function close_parent_window(element)
{
 var w = get_parent_window(element);
 if (w) w.close();
 return false;
}
