/*****************************************
 * Flickr API (in jQuery)
 * version: 1.0 (02/23/2009)
 * written for jQuery 1.3.2
 * by Ryan Heath (http://rpheath.com)
 *****************************************/
var $j = jQuery.noConflict();

(function($j) {
  // core extensions
  $j.extend({
    // determines if an object is empty
    // $j.isEmpty({})             // => true
    // $j.isEmpty({user: 'rph'})  // => false
    isEmpty: function(obj) {
      for (var i in obj) { return false }
      return true
    }
  })
  
  // base flickr object
  $j.flickr = {
    // the actual request url
    // (constructs extra params as they come in)
    url: function(method, params) {
      return 'http://api.flickr.com/services/rest/?method=' + method + '&format=json' +
        '&api_key=' + $j.flickr.settings.api_key + ($j.isEmpty(params) ? '' : '&' + $j.param(params)) + '&jsoncallback=?'
    },
    // translate plugin image sizes to flickr sizes
    translate: function(size) {
      switch(size) {
        case 'sq': return '_s' // square
        case 't' : return '_t' // thumbnail
        case 's' : return '_m' // small
        case 'm' : return ''   // medium
        default  : return ''   // medium
      }
    },
    // determines what to do with the links
    linkTag: function(text, photo, href) {
      //if (href === undefined) href = ['http://www.flickr.com/photos', photo.owner, photo.id].join('/')
      href = ['http://www.flickr.com/photos', 'operationusa', photo.id,'in','set-72157623205078544'].join('/')
      //return '<a href="' + href + '" title="' + photo.title + '">' + text + '</a>'
      return '<a href="' + href + '" title="' + photo.title + '">' + text + '</a>'
    }
  }
  
  // helper methods for thumbnails
  $j.flickr.thumbnail = {
    src: function(photo, size) {
      if (size === undefined) size = $j.flickr.translate($j.flickr.settings.thumbnail_size)
      return 'http://farm' + photo.farm + '.static.flickr.com/' + photo.server + 
        '/' + photo.id + '_' + photo.secret + size + '.jpg'
    },
    imageTag: function(image) {
      return '<img src="' + image.src + '" alt="' + image.alt + '" />'
    }
  }
  
  // accepts a series of photos and constructs
  // the thumbnails that link back to Flickr
  $j.flickr.thumbnail.process = function(photos) {
    var thumbnails = $j.map(photos.photo, function(photo) {
      var image = new Image(), html = '', href = undefined

      image.src = $j.flickr.thumbnail.src(photo)
      image.alt = photo.title

      var size = $j.flickr.settings.link_to_size
      if (size != undefined && size.match(/sq|t|s|m|o/)) 
        href = $j.flickr.thumbnail.src(photo, $j.flickr.translate(size))
      
      html = $j.flickr.linkTag($j.flickr.thumbnail.imageTag(image), photo, href)
        
      return ['<li>' + html + '</li>']
    }).join("\n")
    
    return $j('<ul class="flickr"></ul>').append(thumbnails)
  }
  
  // handles requesting and thumbnailing photos
  $j.flickr.photos = function(method, options) {
    var options = $j.extend($j.flickr.settings, options || {}),
        elements = $j.flickr.self, photos
    
    return elements.each(function() {
      $j.getJSON($j.flickr.url(method, options), function(data) {
        photos = (data.photos === undefined ? data.photoset : data.photos)
        elements.append($j.flickr.thumbnail.process(photos))
      })
    })
  }
  
  // namespace to hold available API methods
  // note: options available to each method match that of Flickr's docs
  $j.flickr.methods = {
    // http://www.flickr.com/services/api/flickr.photos.getRecent.html
    photosGetRecent: function(options) {
      $j.flickr.photos('flickr.photos.getRecent', options)
    },
    // http://www.flickr.com/services/api/flickr.photos.getContactsPublicPhotos.html
    photosGetContactsPublicPhotos: function(options) {
      $j.flickr.photos('flickr.photos.getContactsPublicPhotos', options)
    },
    // http://www.flickr.com/services/api/flickr.photos.search.html
    photosSearch: function(options) {
      $j.flickr.photos('flickr.photos.search', options)
    },
    // http://www.flickr.com/services/api/flickr.photosets.getPhotos.html
    photosetsGetPhotos: function(options) {
      $j.flickr.photos('flickr.photosets.getPhotos', options)
    }
  }
  
  // the plugin
  $j.fn.flickr = function(options) {
    $j.flickr.self = $j(this)
    
    // base configuration
    $j.flickr.settings = $j.extend({
      api_key: 'YOUR API KEY',
      thumbnail_size: 'sq'
    }, options || {})
    
    return $j.flickr.methods
  }
})(jQuery);