/*
 * Darkbox v1.0
 *
 * Author: James Watts
 * Licence: GPL
 * Updated: 15/07/2009  
 *
 */

var darkbox = {
  elements: 0,
  element : function() {
    var args                = arguments[0] || {};
    var id                  = this.elements++;
    var screen              = document.createElement('div');
    screen.id               = 'darkbox-screen-' + id;
    screen.className        = 'darkbox-screen';
    screen.style.display    = 'none';
    var container           = document.createElement('div');
    container.id            = args.id || 'darkbox-box-' + id;
    container.className     = 'darkbox';
    container.style.display = 'none';
    var box                 = document.createElement('div');
    box.className           = 'darkbox-box';
    var title               = document.createElement('div');
    title.innerHTML         = (args.title)? args.title : '';
    title.id                = 'darkboxTitle' + id;
    title.className         = 'darkbox-title';
    var close               = document.createElement('button');
    close.innerHTML         = (args.button)? args.button : 'Close';
    close.className         = 'darkbox-close';
    var frame               = document.createElement('iframe');
    frame.frameborder       = false;
    frame.marginwidth       = 0;
    frame.marginheight      = 0;
    frame.allowtransparency = true;
    frame.src               = args.url || 'about:blank';
    frame.className         = 'darkbox-frame';
    var info                = document.createElement('div');
    info.innerHTML          = (args.info)? args.info : '';
    info.id                 = 'darkboxInfo' + id;
    info.className          = 'darkbox-info';
    box.appendChild(title);
    box.appendChild(close);
    box.appendChild(frame);
    box.appendChild(info);
    container.appendChild(box);
    var obj = {
      element : {
        id    : this.elements-1,
        screen: screen,
        box   : container,
        title : title,
        info  : info
      },
      onshow  : args.onshow || null,
      onhide  : args.onhide || null,
      visible : false,
      create  : function() {
        try {
          document.getElementsByTagName('body')[0].appendChild(this.element.screen);
          document.getElementsByTagName('body')[0].appendChild(this.element.box);
          return true;
        }
        catch(e) {
          return false;
        }
      },
      remove  : function() {
        try {
          document.getElementsByTagName('body')[0].removeChild(this.element.screen);
          document.getElementsByTagName('body')[0].removeChild(this.element.box);
          return true;
        }
        catch(e) {
          return false;
        }
      },
      show    : function(callback) {
        this.element.screen.style.display = 'block';
        this.element.box.style.display    = 'block';
        this.visible                      = true;
        if(this.onshow) {
          this.onshow.call(this);
        }
        if(callback) { callback.call(this); }
        return true;
      },
      hide    : function(callback) {
        this.element.screen.style.display = 'none';
        this.element.box.style.display    = 'none';
        this.visible                      = false;
        if(this.onhide) {
          this.onhide.call(this);
        }
        if(callback) { callback.call(this); }
        return true;
      },
      toggle  : function(callback) {
        (this.element.box.style.display == 'none')? this.show(callback) : this.hide(callback);
        return true;
      },
      setTitle: function(text) {
        this.element.title.innerHTML = text || '';
      },
      setInfo : function(text) {
        this.element.info.innerHTML = text || '';
      }
    };
    container.handler = obj;
    eval('container.onclick = function() { if(document.getElementById("' + container.id + '")) { document.getElementById("' + container.id + '").handler.remove(); } };');
    eval('close.onclick = function() { if(document.getElementById("' + container.id + '")) { document.getElementById("' + container.id + '").handler.remove(); } };');
    return obj;
  }
};

