if (!window.console) {console = {log:function(str){if ($('console')) {$('console').innerHTML += str;}}};}
var Ajam = {serverUrl:"http://chao.mine.nu"};
Ajam.Updater = Class.create({
  initialize: function(container, uri, options) {
		// method, parameters
    this.options = {
      method: 'get'
    };
    Object.extend(this.options, options || {});
		this.container = $(container);
    this.options.method = this.options.method.toLowerCase();
    this.request(uri);
  },
  request: function(uri) {
    this.uri = uri;
    var params = this.params = this.options.parameters;
    var os_params = {};
    if (params) {
  		if (this.options.method == 'get') {
  			this.method = gadgets.io.MethodType.GET;
  			var queryStr = (typeof params == 'string') ? params : Object.toQueryString(params);
  			uri += (uri.include('?') ? '&' : '?') + queryStr;
  		} else {
  			this.method = gadgets.io.MethodType.POST;
  			os_params[gadgets.io.RequestParameters.POST_DATA] = params;
  		}
  	}
    os_params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
		os_params[gadgets.io.RequestParameters.METHOD] = this.method;
		console.log('ajamming: ' + uri);
    gadgets.io.makeRequest(Ajam.serverUrl + uri, this.requestCallback.bind(this), os_params);
	},
	requestCallback: function(data) {
	  if (data.errorCode) {
	    console.log('ajam error: ' + this.uri + ' ' + data.errorCode + '; message: ' + data.errorMessage);
	    if (data.errorMessage == "Error Parsing Token") {
	      window.parent.location.href = window.parent.location.href;
	    }
	  }
	  else if (this.container) {
	    var insertion = this.options.insertion;
	    if (insertion) {
	      var insertParams = {};
	      insertParams[insertion] = data.text;
	      this.container.insert(insertParams);
	    }
	    else {
		    this.container.update(data.text);
		  }
		}
	}
});
Ajam.WaitMessage = "<div id='spinner'><img src='http://coolchaser.com/images/ajax-loader.gif' /><p>Loading... Please Hold On...</p></div>";

var OSRequester = Class.create({
  initialize: function() {
    this.request = opensocial.newDataRequest();
    this.savedRequests = $A();
    this.receivedResults = false;
    this.results = $H();
    this.pendingCallbacks = $H();
  },
  addFriendsRequest: function() {
    var ownerFriends = opensocial.newIdSpec({userId: "OWNER",groupId: "FRIENDS"});
    var opt_params = {};
    opt_params[opensocial.DataRequest.PeopleRequestFields.FIRST] = 1;
    opt_params[opensocial.DataRequest.PeopleRequestFields.MAX] = 100;    
    var friendRequest = this.request.newFetchPeopleRequest(ownerFriends, opt_params);
    this.request.add(friendRequest, 'friends');
    this.savedRequests.push('friends');
  },
  addOwnerRequest: function() {
    var personRequest = this.request.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER);
    this.request.add(personRequest, 'owner');
    this.savedRequests.push('owner');
  },
  sendRequest: function() {
    if (this.receivedResults) {throw "calling sendRequest twice!";}
    this.request.send(this.receiveResults.bind(this));
  },
  receiveResults: function(data) {
    this.receivedResults = true;
    var results = this.results;
    var self = this;
    this.savedRequests.each(function(reqKey) {
      var keyData = data.get(reqKey);
      results.set(reqKey, keyData);
      var pendingCallback = self.pendingCallbacks.get(reqKey);
      if (pendingCallback) {
        self.sendResults(keyData, pendingCallback.get('success'), pendingCallback.get('error'));
      }
    });
  },
  getResults: function(key, onsuccess, onerr) {
    var data = this.results.get(key);
    if (data) {
      this.sendResults(data, onsuccess, onerr);
    }
    else {
      this.pendingCallbacks.set(key, $H({success:onsuccess, error:onerr}));
    }
  },
  sendResults: function(data, success, err) {
    if (data.hadError()) {
      if (err) {err.call(null, data);}
      else {console.log('requester err: ' + data.getErrorMessage());}
    }
    else {
      success.call(null, data.getData());
    }
  }
});
    
var FriendInviter = Class.create({
  initialize: function(friends, options) {
    this.friends = friends;
    this.options = {
      container: 'container',
      elementClass: 'avatar',
      message: 'join me with [app]',
      inviteType: 'app',
      title: 'hello world'
    };
    this.options = Object.extend(this.options, options || {});
    this.container = $(this.options.container);
    friends.each(this.addPerson.bind(this));
    // ImageAdjuster.adjustImageClass('thumb', 50, 50);
  },
  addPerson: function(person) {
    var divElt = new Element('div', {'class':'avatar', id:person.getId()}).insert(
      new Element('div', {'class':'box'}).insert(
        new Element('img', {'class':'thumb', src:person.getField(opensocial.Person.Field.THUMBNAIL_URL)}))).insert(
        new Element('p', {'class':'name'}).insert(
          person.getDisplayName())); 
    divElt.observe('click', this.invite.bindAsEventListener(this, divElt));
    this.container.insert(divElt);
  },
  invite: function(evt, elt) {
    if (!elt.inviting) {
      var friendid = elt.id;
      var params = {};
      var mesg;
      elt.inviting = true;
      var inviteType = this.afterAppInvite || this.getInviteType();
      if (inviteType == 'sendGift') {
        mesg = opensocial.newMessage(this.options.appMessage);
        opensocial.requestShareApp(friendid, mesg, this.appInviteCB.bind(this, elt), params);
      }
      else {
        var content = inviteType == 'privateMessage' ? this.options.privateMessage : this.options.comment;
        mesg = opensocial.newMessage(content);
        mesg.setField(opensocial.Message.Field.TITLE, this.options.title);
        mesg.setField(opensocial.Message.Field.TYPE, inviteType);
        opensocial.requestSendMessage(friendid, mesg, this.inviteCB.bind(this, elt), params);
      }
    }
  },
  getFriend: function(friendid) {
    var friendArray = this.friends.asArray();
    for (var  i=0; i<friendArray.length; ++i) {
      if (friendArray[i].getId() == friendid) {return friendArray[i];}
    }
    return null;
  },
  inviteCB: function(elt,result) {
    elt.inviting = false;
    if (result.getData() == MyOpenSpace.PostTo.Result.SUCCESS || this.afterAppInvite) {
      var selectedFriend = this.getFriend(elt.id);
      if (selectedFriend && this.options.afterInvited) {
        this.options.afterInvited(selectedFriend);
      }
      this.afterAppInvite = null;
    }
  },
  appInviteCB: function(elt, result) {
    elt.inviting = false;
    if (result.getData() == MyOpenSpace.PostTo.Result.SUCCESS) {
      this.afterAppInvite = 'privateMessage';
      this.invite(null, elt);
    }
  },
  getInviteType: function() {
    if (typeof(this.options.inviteType) == 'function') {return this.options.inviteType();}
    else {return this.options.inviteType;}
  }
});

function createActivity(template, template_params, media) {
  var params = {};
  params[opensocial.Activity.Field.TITLE_ID] = template;
  params[opensocial.Activity.Field.TEMPLATE_PARAMS] = template_params || {};
  
  params[opensocial.Activity.Field.MEDIA_ITEMS] = media || [];
  
  var activity = opensocial.newActivity(params);
  opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH);
  // var params = {};
  // params[opensocial.Activity.Field.TITLE_ID] = "Template_1";
  // params[opensocial.Activity.Field.TEMPLATE_PARAMS] = {};
  // 
  // var mediaItemArray = [];
  // params[opensocial.Activity.Field.MEDIA_ITEMS] = mediaItemArray;
  // 
  // var activity = opensocial.newActivity(params);
  // opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH);
}

function sendBulletin(title, message, callback) {
  var mesg_params = {};
  mesg_params[opensocial.Message.Field.TYPE] = opensocial.Message.Type.NOTIFICATION;
  mesg_params[opensocial.Message.Field.TITLE] = title;
  var mesg = opensocial.newMessage(message, mesg_params);
  opensocial.requestSendMessage(opensocial.IdSpec.PersonId.VIEWER, mesg, callback);
}

function postToProfile(title, message, callback) {
  var mesg_params = {};
  mesg_params[opensocial.Message.Field.TYPE] = 'PROFILE';
  mesg_params[opensocial.Message.Field.TITLE] = title;
  var mesg = opensocial.newMessage(message, mesg_params);
  opensocial.requestSendMessage(opensocial.IdSpec.PersonId.VIEWER, mesg, callback);
}

function getOSParams(key) {
  var paramStr = location.href.split('?', 2)[1];
  if (!paramStr) {paramStr = location.href.split('#')[1];}
  if (paramStr) {return paramStr.toQueryParams()[key];}
  else {return null;}
}

function scroll_to_top() {
  window.location.replace("#top");
  document.location.replace("#");
}

function appendScript(url) {
  var head = document.getElementsByTagName("head")[0];
  var script = document.createElement("script");
  script.charset = "utf-8";
  script.src = url;
  script.type = 'text/javascript';
  head.appendChild(script);
}
