Flickr = {
  baseUrl : "http://api.flickr.com/services/rest/?format=json&jsoncallback=Flickr._flickrResponse",
  apiKey : "44e1c49dee6e10cab168f8f311ca016c",
  cache : {},
  createScript : function(src) {
    this.script = document.createElement('script');
    this.script.setAttribute('type', 'text/javascript');
    this.script.setAttribute('src', src);
    document.body.appendChild(this.script);
  },
  getInfo : function(id, callback) {
    Flickr.callMethod('flickr.photos.getInfo', "photo_id=" + id, callback);
  },
  getSizes : function(id, callback) {
    Flickr.callMethod('flickr.photos.getSizes', "photo_id=" + id, callback);
  },
  callMethod : function(method, args, callback) {
    var url = Flickr.baseUrl + "&method=" + method + "&api_key=" + Flickr.apiKey + "&" + args;
    if (this.cache[url]) return callback(this.cache[url]);
    
    Flickr._cb = callback;
    this.createScript(url);
  },
  _flickrResponse : function(resp) {
    Flickr.cache[this.script.src] = resp;
    Flickr._cb.call(window, resp);
  }
}

Flickr.LightBox = {
  initialize : function(triggers) {
    this.lightBox = this._createLightBox();
    this.hide();
    
    Array.forEach(triggers, function(el) {
     if (el.href)
       Event.add(el, 'click', Flickr.LightBox.show);
    });
  },
  _createLightBox : function() {
    var lb = document.createElement('div');
    lb.id = 'lb';
    document.body.insertBefore(lb, document.body.childNodes[0]);
    return lb;
  },
  _adjustSize : function() {
    var windowHeight = window.innerHeight || document.documentElement.clientHeight;
    var documentHeight = document.documentElement.offsetHeight;
    this.lightBox.style.height = ((documentHeight > windowHeight) ? 
      documentHeight : windowHeight) + "px";
    window.scrollTo(0,0);
  },
  _setContent : function(data) {
    Flickr.getSizes(data.photo.id, function(sizes) {
     var by = data.photo.owner.realname.length > 0 ? " by " + data.photo.owner.realname : '';
     Flickr.LightBox.lightBox.innerHTML = '<div id="lb1" style="width: ' + ((sizes.sizes.size[3].width*1)+88) + 'px"><div id="lb2"><div id="lb3">' +
                                          '<h1>' + data.photo.title._content + '</h1>' +
                                          '<div id="imgc"><div></div><div class="c2"></div><div class="c3"></div><div class="c4"></div><img src="' + sizes.sizes.size[3].source + '" /></div>' +
                                          '<p><a href="' + data.photo.urls.url[0]._content + 
                                          '">Original photo</a>' + by + '</p>' +
                                          '<p id="lbx"><a href="">Close</a></p>' +
                                          '</div></div></div>';
                              
      Event.add('lbx', 'click', Flickr.LightBox.hide);
      Flickr.LightBox._adjustSize();
      Flickr.LightBox.lightBox.style.display = '';
    });
  },
  show : function() {
    var id = this.href.match(/\/(\d+)\/$/)[1];
    Flickr.getInfo(id, function(data) {
        Flickr.LightBox._setContent(data);
    });
    return false;
  },
  hide : function() {
    Flickr.LightBox.lightBox.style.display = 'none';
    return false;
  }
}