var Lightbox = function(options) {
	this.initialize(options);
};
// Keep a global pointer, so that loaded code can call us
var last_lightbox = null;

function Lightbox_Close() {
  if (last_lightbox) {
    last_lightbox.close();
  }
}

Lightbox.prototype = {
  width: 300,
  height: 300,
  overlay: true,
  title: null,
  onclose: null,
  load_callback: null,
  load_closure: null,
  titlebar: false,
  method: 'post',
  show_close: false,
  old_node_id: null,
  lightbox_node_id: 'lightbox_node',
  
  initialize: function(options) {
    if (options) {
      if (options.width) {
        this.width = options.width;
      }
      if (options.height) {
        this.height = options.height;
      }
      if (options.overlay == false){
        this.overlay = false;
      }
      if (options.titlebar) {
        this.titlebar = options.titlebar;
      }
      if (options.method) {
        this.method = options.method;
      }
      if (options.show_close) {
        this.show_close = true;
      }
      if (options.onclose) {
        this.onclose = options.onclose;
      }
      if (options.url) {
        this.load_ajax(options.url)
      }
      if (options.node) {
        if (options.node.id)
          this.lightbox_node_id = options.node.id;

        this.load_node(options.node);
      }
      if (options.iframe) {
        this.load_iframe(options.iframe, options.params);
      }
      if (options.lightbox_node_id) {
        this.lightbox_node_id = options.lightbox_node_id;
      }
    }
    last_lightbox = this;
  },

  load_text: function(message) {
    try {
      mydiv = this.build_frame();
      var inner_div = Builder.node('div');
      inner_div.innerHTML = message;
      mydiv.appendChild(inner_div);

      if (this.overlay) {
        this.show_overlay();
      }
      this.destroy_popup();
      document.body.appendChild(mydiv);
      this.center_div(mydiv);
    } catch(e) { alert(e);}
  },
    
  load_iframe: function(iframe_src, params) {
  try {
      popup = this.build_frame();
      var src = iframe_src;
      if (params) {
        src = '';
      } 
      
      popup.appendChild(
        Builder.node('div', {id: 'lightbox_content', style:'width:100%;height:100%'}, [
          Builder.node('iframe', {id: 'lb_iframe', name: 'lb_iframe', src: src, frameborder: 0, style: 'border:0px;width:100%;height:100%;overflow:hidden'})
        ])
      );
      
      if (this.overlay) {
        this.show_overlay();
      }
      this.destroy_popup();
      document.body.appendChild(popup);
      this.center_div(popup);
      
      if (params) {
        // Must build a form to submit the parameters to the iframe
        var myform = Builder.node('form', {action: iframe_src, target: 'lb_iframe'});
        myform.method = 'POST';
        for (var k in params) {
          myform.appendChild(Builder.node('textarea', {name: k}, params[k]));
        }
        var form_div = Builder.node('div', {style: 'display:none'}, [myform]);
        document.body.appendChild(form_div);
        myform.submit();
      }
  } catch(e) {alert(e.message);}  
  },
  
  load_ajax: function(url, params, callback, closure) {
    //try {
      if (callback) {
        this.load_callback = callback;
      }
      this.load_closure = closure;
      popup = this.build_frame();
      popup.appendChild(Builder.node('div', {id: 'lightbox_content', style:'padding:2px 4px 2px 4px'}));
      popup.style.display = 'none';

      if (this.overlay) {
        this.show_overlay();
      }
      this.destroy_popup();
      document.body.appendChild(popup);
      this.center_div(popup);

      var method = this.method;
      if (url.indexOf("GET ") == 0) {
        url = url.substring(4);
        method = 'get';
      }
      opts = {
          onSuccess:function() {
            $('lightbox_popup').style.display = 'block';
            setTimeout(function() {
            	this.center_div(popup);
            }.bind(this, popup),
            300);
			      this.center_div(popup);
            if (this.load_callback) {
              this.load_callback(this.load_closure);
            }
          }.bind(this),
          onFailure:function() {
            alert('An error occurred');
            this.close();
          }.bind(this),
          evalScripts:true, 
          asynchronus:true,
          method:method
      }; 
      if (params) {
      	opts.parameters = params;
      }
      new Ajax.Updater('lightbox_content', url, opts);
    //} catch(e) { alert(e); this.close()}
  },

  load_node: function(node) {
    try {
      popup = this.build_frame();
    
      if (typeof(node) == 'object') {
        this.old_node_id = node.id;
        node.id = this.lightbox_node_id;
        node.style.display = 'block';
        popup.appendChild(node);
      } else {
        popup.appendChild(Builder.node('div', {id: 'lightbox_content', style:'padding:2px 4px 2px 4px'}, [node]));
      }
    
      if (this.overlay) {
        this.show_overlay();
      }

      this.destroy_popup();
      document.body.appendChild(popup);
      this.center_div(popup);
    } catch(e) { alert(e);}
  },

  set_title: function(title) {
    this.title = title;
    title_div = $('lightbox_title');
    if (title_div) {
      title_div.innerHTML = title;
    }
  },
  
  destroy_popup: function() {
    var old_box = $('lightbox_popup');
    if (old_box) {
      document.body.removeChild(old_box);
    }
  },
    
  build_frame: function() {
    box_title = '';
    if (this.titlebar) {
      box_title = this.titlebar;
    }
    link = Builder.node('a', {href:'javascript:void(0);',style:'position:absolute;top:2px;right:2px'}, [
      Builder.node('img', {src: '/images/close_red_trans_16px.png'})
    ]);
    link.onclick = this.close.bind(this);
    title_div = Builder.node('div', 
      {id:'lightbox_title', style:'width:100%;line-height:14px;height:14px;font-size:9pt;font-weight:bold;padding:2px 2px 4px 4px;background:#DDD;margin-bottom:2px'}, [
      box_title,
      link
    ]);
    mydiv = Builder.node('div', {id: 'lightbox_popup', style: 'width:' + this.width + 'px;height:' + this.height +'px'});
    if (this.titlebar) {
      mydiv.appendChild(title_div);
    }
    if (this.show_close) {
      mydiv.appendChild(
        Builder.node('div', {style:'float:right;margin-right:4px;font-size:9pt;font-weight:bold;line-height:14px'}, [link])
      );
    }
    //mydiv.appendChild(
    //  Builder.node('div', {style:'clear:both'})
    //);
    return mydiv;
  },
  
  close: function() {
    if ($(this.lightbox_node_id)) {
      $(this.lightbox_node_id).style.display = 'none';
      document.body.appendChild($(this.lightbox_node_id));
      $(this.lightbox_node_id).id = this.old_node_id;
    }
    document.body.removeChild($('lightbox_popup'));
    if (this.overlay) {
      this.hide_overlay();
    }
    if (this.onclose) {
      this.onclose.call();
    }
  },
  
  center_div: function(elt) {
    try {
      var height = elt.offsetHeight > 0 ? elt.offsetHeight : this.height
      elt.style.marginLeft = "-" + parseInt(this.width / 2) + "px";
      elt.style.marginTop = "-" + parseInt(height / 2) + "px";
      posy = (document.documentElement.clientHeight / 2) + (document.documentElement.scrollTop);
      elt.style.top = posy;
//    box_width = this.width;
//    box_height = this.height;
//    win_width = document.documentElement.clientWidth;
//    win_height = document.documentElement.clientHeight;
//    var left = parseInt((win_width - box_width) / 2) + "px";
//    var top = parseInt((win_height - box_height) / 2) + "px";
//    elt.style.left = left;
//    elt.style.top = top;
    } catch(e) { alert(e);}
  },
  
  show_overlay: function() {
    try { 
    if (!$('lb_overlay')) {
      document.body.appendChild(Builder.node('div', {id: 'lb_overlay', style: 'display:block'}));
    }
    var overlay = $('lb_overlay');
    var height = document.documentElement.clientHeight;
    var body_height = document.body.clientHeight;
    if (body_height > height) {
      height = body_height;
    }
    overlay.style.height = height;
    overlay.style.display = "block";
    }catch(e) {alert(e);}
  },
  
  hide_overlay: function() {
    $('lb_overlay').style.display = "none";
  }
    
}

