// fg.js - Flickr geotagging with Google Map Library.
// Copyright (c) 2006 shichiseki.jp

function FGtag(user, token, nsid) {
  this.user = user;
  this.token = token;
  this.nsid = nsid;
  this.getUserInfo();
}

// --- Class Variables and Methods
FGtag.flickrScript = 'fa.rb';

FGtag.authenticationUrl = function(perms) {
  var url = FGtag.flickrScript + '?command=getFrobUrl';
  var request = new JKL.ParseXML(url);
  var response = request.parse();
  return response.response.frob_url.unescapeHTML();
}

// --- Instance Variables and Methods
FGtag.prototype.perpage = 10;

FGtag.prototype.apiSig = function(params) {
  var url = FGtag.flickrScript + '?command=getApiSig&' + params;
  var request = new JKL.ParseXML(url);
  var response = request.parse();
  return response.response.api_sig.unescapeHTML();
}

FGtag.prototype.callFlickrAPI = function(params, callback, arrayelements) {
  var self = this;
  var endpoint = FGtag.flickrScript + '?command=flickrProxy&' + params;
  var request = new JKL.ParseXML(endpoint);
  var func = function(res) {
    callback(res);
    self.stopLoaderIcon();
  };
  if (arrayelements)
    request.setOutputArrayElements(arrayelements);
  request.async(func);
  this.startLoaderIcon();
  request.parse();
}

FGtag.prototype.syncCallFlickrAPI = function(params, callback, arrayelements) {
  var endpoint = FGtag.flickrScript + '?command=flickrProxy&' + params;
  var request = new JKL.ParseXML(endpoint);
  if (arrayelements)
    request.setOutputArrayElements(arrayelements);
  this.startLoaderIcon();
  var response = request.parse();
  callback(response);
  this.stopLoaderIcon();
}

FGtag.prototype.callFlickrApiWithToken = function(params, callback, arrayelements) {
  var self = this;
  var endpoint = FGtag.flickrScript + '?command=flickrProxyWithToken&' + params;
  var request = new JKL.ParseXML(endpoint);
  var func = function(res) {
    callback(res);
    self.stopLoaderIcon();
  };
  if (arrayelements)
    request.setOutputArrayElements(arrayelements);
  request.async(func);
  this.startLoaderIcon();
  request.parse();
}

FGtag.prototype.getUserInfo = function() {
  var params = 'method=flickr.people.getInfo&user_id=' + this.nsid;
  var self = this;
  var func = function(res) {
    var person = res.rsp.person;
    self.photosUrl = person.photosurl;
    self.userProfileUrl = person.profileurl;
    self.photosCount = person.photos.count;
    self.currentIndex = 0;
    self.photos = [];
    self.photoInfo = [];
  }
  this.syncCallFlickrAPI(params, func);
}

FGtag.prototype.getLocation = function(callback) {
  var photo_id = this.photoInfo[this.currentIndex].id;
  var params = 'method=flickr.photos.geo.getLocation&photo_id=' + photo_id;
  var func = function(res) {
    if (res.rsp.stat != 'ok') return;  // XXX: error handling
    var location = res.rsp.photo.location;
    callback(location.latitude, location.longitude);
  };
  this.callFlickrAPI(params, func);
}

FGtag.prototype.publicPhoto = function(index) {
  if (index < 0 || index > this.photoCount) return null;
  if (!this.photos[index]) {
    var self = this;
    var page = index / this.perpage + 1;
    var params = 'method=flickr.people.getPublicPhotos&user_id=' + this.nsid + '&page=' + page + '&per_page=' + this.perpage;
    var func = function(res) {
      for (var i = 0; i < res.rsp.photos.photo.length; i++) {
        var index = self.perpage * (res.rsp.photos.page - 1) + i;
        var photo = res.rsp.photos.photo[i];
        var imgbox = document.createElement('span');
        var anchor = document.createElement('a');
        var img = document.createElement('img');
        imgbox.setAttribute('photo_id', photo.id);
        anchor.href = self.photosUrl + photo.id;
        img.src = 'http://static.flickr.com/' + photo.server + '/' + photo.id + '_' + photo.secret + '_s.jpg';
        anchor.appendChild(img);
        imgbox.appendChild(anchor);
        self.photos[index] = imgbox;
        self.photoInfo[index] = {"id": photo.id}; // is this not necessary to?
        self.getPhotoInfo(index);
      }
    };
    this.callFlickrAPI(params, func, ['photo']);
  } else {
    if (this.photoHandler)
      this.photoHandler(this.photos[index]);
  }
}

FGtag.prototype.setLocation = function(lat, lon) {
  var self = this;
  var photo_id = this.photoInfo[this.currentIndex].id;
  var params = 'method=flickr.photos.geo.setLocation&photo_id=' + photo_id + '&lat=' + lat + '&lon=' + lon;
  this.msgBox.innerHTML = "Location Set...";
  var func = function(res) {
    if (res.rsp.stat == 'ok')
      self.msgBox.innerHTML += "Done.";
    else
      self.msgBox.innerHTML = "An Error has occured.";
  }
  this.callFlickrApiWithToken(params, func);
}

FGtag.prototype.getPhotoInfo = function (index) {
  var self = this;
  var photo_id = this.photoInfo[index].id;
  var params = 'method=flickr.photos.getInfo&photo_id=' + photo_id;
  var func = function(res) {
    if (res.rsp.stat != 'ok')
      return;
    self.photoInfo[index] = res.rsp.photo;
    if (self.photoHandler && index == self.currentIndex)
      self.photoHandler(self.photos[index]);
  }
  this.callFlickrAPI(params, func);
}

FGtag.prototype.setPhotoHandler = function(func) {
  this.photoHandler = func;
}

FGtag.prototype.setLoaderElement = function(elem) {
  this.loaderElement = elem;
}

FGtag.prototype.startLoaderIcon = function() {
  if (this.loaderElement)
    Element.show(this.loaderElement);
}

FGtag.prototype.stopLoaderIcon = function() {
  if (this.loaderElement)
    Element.hide(this.loaderElement);
}

FGtag.prototype.currentPhoto = function() {
  this.publicPhoto(this.currentIndex);
}

FGtag.prototype.nextPhoto = function() {
  if (this.currentIndex < this.photosCount - 1)
    this.currentIndex++;
  this.currentPhoto();
}

FGtag.prototype.prevPhoto = function() {
  if (this.currentIndex > 0)
    this.currentIndex--;
  this.currentPhoto();
}

