var my_jswindows = {};

function my_jswindow(id, container)
{
 while (!id || my_jswindows[id])
  id = "my_jswindow" + rand(1, 999999);
 if (!container) container = document.body;
 var me = my_jswindows[id] = this;

 var elements = {};
 elements.main = create_element("div", container);
 elements.main.className = "my_jswindow";
 elements.main.id = id;
 elements.main.innerHTML = "<table cellpadding=\"0\" cellspacing=\"0\" border=\"0\" align=\"center\" width=\"100%\"><tr><td><!--top--><table cellpadding=\"0\" cellspacing=\"0\" style=\"background:url(files/images/panels/ct.gif) repeat-x top; width:100%\">"+
     "<tr  id=\"" + id + "_title\"><td class=\"lt\">&nbsp;</td><td class=\"ct\" id=\"" + id + "_caption\"><h3>Title</h3></td><td class=\"rt\"><div class=\"ct my_jswindow_buttons\" id=\"" + id + "_buttons\"><a href=\"#close\" onclick=\"return false\">X</a></div>&nbsp;</td></tr></table><!--/top--></td></tr>"+
     "<tr><td><!--center--><table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr  id=\"" + id + "_body\"><td class=\"lc\">&nbsp;</td><td class=\"cc\" id=\"" + id + "_content\">&nbsp</td><td class=\"rc\">&nbsp;</td></tr></table><!--/center--></td></tr>"+
     "<tr><td><!--bottom--><table cellpadding=\"0\" cellspacing=\"0\" width=\"100%\"><tr><td class=\"lb\">&nbsp;</td><td class=\"cb\">&nbsp;</td><td class=\"rb\">&nbsp;</td></tr></table><!--/bottom--></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.childNodes[0], "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 my_jswindows)
  {
   e = my_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.send_to_back = function()
 {
  var e, p, z = 0;
  for (var i in my_jswindows)
  {
   e = my_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 my_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 != "my_jswindow");
 return element && (element.id && my_jswindows[element.id]);
}

function close_parent_window(element)
{
 var w = get_parent_window(element);
 if (w) w.close();
 return false;
}
