/*
 * @author Ryan Williams / http://ryancw.com
 */

function InstagramScroll(opts) {

  this.opts = opts;
  if (!(this.opts.tag || this.opts.user || this.opts.clientID || this.opts.imageContainer)) {
    throw "Error: tag/user, clientID, and imageContainer must be passed to InstagramScroll.";
  }
  var tag = this.opts.tag;
  var clientID = this.opts.clientID;
  var imageContainer = this.opts.imageContainer;
  var includeCaption = this.opts.includeCaption;
  var includeUsername = this.opts.includeUsername;
  var imageQuality = this.opts.imageQuality || 'standard_resolution';
  var imageSize = this.opts.imageSize || 200;
   // options: low_resolution (300 x 300)
   // standard_resolution (600 x 600)
   // thumbnail (150 x 150)
  var scrollDistance = this.opts.scrollDistance || 350;
  var user = this.opts.user;

  var url;
  var userID;

  function _createRequests() {
    if (user === undefined) {
        url = 'https://api.instagram.com/v1/tags/'
                + tag
                + '/media/recent?client_id='
                + clientID;

        _loadResults();
    } else {
      // need to look up user id using username in order to gather user posts
      $.ajax({
        dataType: 'jsonp',
        url: "https://api.instagram.com/v1/users/search?q="
              + user
              + "&client_id="
              + clientID,
        success: function(response){
          userID = response.data[0].id;
          url = 'https://api.instagram.com/v1/users/'
              + userID
              + '/media/recent/?client_id='
              + clientID;
        _loadResults();
        }
      });
    }
  }

  function _loadResults() {
    $.ajax({
      dataType: 'jsonp',
      url: url,
      success: function(response){
        return _processData(response);
      }
    });
  };

  function _getUserId(name) {
    $.ajax({
      dataType: 'jsonp',
      url: "https://api.instagram.com/v1/users/search?q="
            + name
            + "&client_id="
            + clientID,
      success: function(response){
        return response.data[0].id;
      }
    });
  }

  function _processData(response) {
    if(response != null){
      var ul = $('<ul/>');
      ul.attr({'class': tag});

      $(response.data).each(function(index,obj){
        if(index == 20)
          return response.pagination.next_url;

        var link = $('<a/>'), image = $('<img/>'), li = $('<li/>');
        var imgSrc = obj.images[imageQuality];
        imgSrc = imgSrc.url;
        image.attr({'src': imgSrc,
                    'width': imageSize,
                    'height': imageSize});
        link.attr('href',obj.link);
        image.appendTo(link);
        link.appendTo(li);
        if(includeUsername){
          $('<div class="username">'+obj.caption.from.username+'</div>').appendTo(li);
        }
        if(includeCaption){
          try {
            $('<div class="caption">'+obj.caption.text+'</div>').appendTo(li);
          } catch(e) {

          }
        }
        ul.append(li);
      });

      $(imageContainer).append(ul);
      url = response.pagination.next_url;
    }
  };

  var nextLink = false;
  var loadingImages = false;

  function _loadNext() {
    if (loadingImages || nextLink == url) {
      return false;
    }else{
      loadingImages = true;
      _loadResults();
      nextLink = url;
      loadingImages = false;
    }
  }

  $(window).scroll(function() {
    if($(window).scrollTop() + $(window).height() >
       $(document).height() - scrollDistance) {
      _loadNext();
    }
  });

  _createRequests();
 }