(function($, global){
  var doc;

  doc = global.document;  // caching because the reference is used frequently
  $.support.cors = true;

  mcd.flickrFeed = {
    config: {
      flickr_api_feed: 'http://api.flickr.com/services/rest/?',
      method:'flickr.photos.search',
      user_id: "12354",

      api_key: "00ab1b33aed44ce1cfce36e5abad3a52",
      secret: "f49b53a061c2f6b8",
      responseFormat: {
        format: 'json',
        jsoncallback: 'mcd.flickrFeed.displayPhotos',
        lang:'en-us'
      }
    },
    requestObj: {
      randomPerPage: 0,
      syncWithRecent: false,
      recentPhotos: []

    },

    init: function (user_id, api_key, feed_path) {
      if (user_id !== undefined) this.config.user_id = user_id;
      if (api_key !== undefined) this.config.api_key = api_key;
      if (feed_path !== undefined) this.config.flickr_api_feed = feed_path;
    },

    generateRequest: function (params) {
      var url = this.config.flickr_api_feed + 'method=' + this.config.method + '&api_key=' + this.config.api_key;
      for (var key in this.config.responseFormat) {
          url += '&' + key + '=' + this.config.responseFormat[key];
      }

      for (var key in params) {
          url += '&' + key + '=' + params[key];
      }

      //console.log(url);
      return url;
    },

    writePhotoObj: function (photo) {
      var s = "";
     
      //generate image URL (using small (s) images which are 75x75)
      t_url = "http://farm" + photo.farm + 
      ".static.flickr.com/" + photo.server + "/" + 
      photo.id + "_" + photo.secret + "_" + "s.jpg";
       
      p_url = "http://www.flickr.com/photos/" + 
      photo.owner + "/" + photo.id;
     
      //stick it in a div
      s +=  '<div class="flickr_badge_image"><a href="' + p_url + '">' + '<img alt="'+ 
      photo.title + '"src="' + t_url + '"/>' + '</a></div>';

      //return the awesomeness!
      return s;
    },

    displayRecentPhotos : function (rsp) {
      //mcd.Logger.trace(rsp);
      
      if (rsp.stat != "ok"){
        // If this executes, something broke!
        return;
      }
      
      //find object to write to
      var divObj = $.doc.find('#recent-photos');
      //
      //string obj to store html markup
      var s = "";
      
      var recentPhotos = [];
      //this loop runs through every item and creates HTML 
      for (var i=0; i < rsp.photos.photo.length; i++) {
        photo = rsp.photos.photo[ i ];
        s += this.writePhotoObj(photo);
        recentPhotos.push(photo.id);
      }
      //store photos retrieved to obj for other uses (if needed)
      this.requestObj.recentPhotos = recentPhotos;
      //
      //write generated html to page
      divObj.html(s);
    },

    displayRandomPhotos : function (rsp) {
      //mcd.Logger.trace(rsp);
      
      if (rsp.stat != "ok"){
        // If this executes, something broke!
        return;
      }
      
      //find object to write to
      var divObj = $.doc.find('#random-photos');
      //
      //string obj to store html markup
      var s = "";
      
      //this loop runs through every item and creates HTML 
      var i = 0;
      var len = rsp.photos.photo.length;
      while (i < this.requestObj.randomPerPage) {
        //select random photo obj from array
        var r = Math.floor(Math.random()*len);
        photo = rsp.photos.photo[ r ];
        //
        ///check if selected photo isn't already on page
        if ($.inArray(photo.id, this.requestObj.recentPhotos) === -1) {
          //setup obj to be written to page
          s += this.writePhotoObj(photo);
          //remove selected photo from array so it's not re-used
          rsp.photos.photo.splice(r, 1);
          len = rsp.photos.photo.length;
          //increment photos ready
          i++;
        }
      }
      //
      //write generated html to page
      divObj.html(s); 
    },

    sendRequest: function (params, callback) {
      var request = this.generateRequest(params);
      //mcd.Logger.trace('request: '+request);

      $.ajax({ 
        url:request, 
        context: document.body,
        dataType: 'jsonp',
        cache: false,
        type: 'GET',
        timeout: 10000,
        error: function (er, status, errorThrown) {
          if (er.readyState === 4 && er.status === 200) return;
          else mcd.Logger.trace('ERROR: Retrieving feed - '+status + '  '+errorThrown);
        }

      });
    },

    getRecentPhotos: function (per_page, user_id) {
      var user = (user_id === undefined) ? this.config.user_id : user_id;
      //
      //set response function 
      this.config.responseFormat.jsoncallback = 'mcd.flickrFeed.displayRecentPhotos';
      //make the request!!
      this.sendRequest({
        per_page:per_page, 
        pages:1,
        sort:'date-posted-desc',
        content_type:1,
        user_id:user
      });
    },

    getRandomPhotos: function (per_page, syncWithRecent, user_id) {
      var user = (user_id === undefined) ? this.config.user_id : user_id;
      //
      //set response function 
      this.config.responseFormat.jsoncallback = 'mcd.flickrFeed.displayRandomPhotos';
      //only way to get "random" data is to overrequest on data and then make a random selection from data set
      //mixing up data to get various sets of images, and limiting request to only 100 photos to make request/response faster
      var sortList = ['date-posted-asc','date-posted-desc','date-posted-asc','interestingness-desc','interestingness-asc'];
      var sortSelection = sortList[Math.floor(Math.random()*sortList.length)];
      //store how many items should be displayed on page for resposne function
      this.requestObj.randomPerPage = per_page;
      //store if the response should be synced with recent photos requested
      this.requestObj.syncWithRecent = syncWithRecent;
      //make the request!
      this.sendRequest({
        per_page:100, 
        pages:1,
        sort:sortSelection,
        content_type:1,
        user_id:user
      });
    }


  }

}(jQuery, this));


mcd.flickrFeed.init('45103814@N05');
mcd.flickrFeed.getRecentPhotos(3);
mcd.flickrFeed.getRandomPhotos(3, true);
