// ==UserScript==
// @name           Fire Wrench
// @namespace      http://fireeagle.yahoo.net
// @description    Fire Eagle for GreaseMonkey
// @include        http://*
// ==/UserScript==

var p = unsafeWindow;
var timeout;
window.FireWrench = {};
FireWrench.key = "FR8mhn2Am2Cg";
FireWrench.secret = "aCXrbFQGWQKYglaPeD831tsEWuJC71SE";
FireWrench._fe = null;
FireWrench._ready = false;
FireWrench._authorized = false;

window.FireWrench.GetInstance = function() {
  return FireWrench._fe;
}

window.FireWrench.IsReady = function() {
  return FireWrench._ready;
}

window.FireWrench.IsAuthorized = function() {
  return FireWrench._authorized;
}

window.FireWrench.getHttpRequest = function(method, url, callback) {
  // make sure its our urls before we call the request
  var o = { method: method,
	    url: url,
	    onload: callback}
  GM_xmlhttpRequest(o);
}

window.FireWrench.json = 'json';
window.FireWrench.xml = 'xml';

// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

FireWrench.loadProto = function() {
  FireWrench.loadScript('http://shamurai.com/static/js/oauth/sha1.js');
  timeout = window.setTimeout(FireWrench.waitForSha, 100);
}

FireWrench.waitForSha = function() {
  window.clearTimeout(timeout);
  if (typeof p.hex_sha1=='undefined') {
    timeout = window.setTimeout(FireWrench.waitForSha, 100);
  } else {
    FireWrench.loadScript('http://shamurai.com/static/js/oauth/oauth.js');
    timeout = window.setTimeout(FireWrench.waitForOAuth, 100);
  }
}

FireWrench.waitForOAuth = function() {
  window.clearTimeout(timeout);
  if (typeof p.OAuth=='undefined') {
    timeout = window.setTimeout(FireWrench.waitForOAuth, 100);
  } else {
    FireWrench.loadScript('http://shamurai.com/static/js/fe/oauthext.js');
    timeout = window.setTimeout(FireWrench.waitForOAuthExt, 100);
  }
}

FireWrench.waitForOAuthExt = function() {
  window.clearTimeout(timeout);
  if (typeof p.OAuth.getUrl=='undefined') {
    timeout = window.setTimeout(FireWrench.waitForOAuthExt, 100);
  } else {
    FireWrench.loadScript('http://shamurai.com/static/js/fe/fe.js');
    timeout = window.setTimeout(FireWrench.waitForFE, 100);
  }
}

FireWrench.waitForFE = function() {
  if (typeof p.FireEagle=='undefined') {
    timeout = window.setTimeout(FireWrench.waitForFE, 100);
  } else {
    FireWrench.init();
  }
}

FireWrench.loadScript = function(u) {
  var proto = document.createElement('script');
  proto.type = 'text/javascript';
  proto.src = u;
  document.getElementsByTagName('head')[0].appendChild(proto);
}

window.addEventListener('load', FireWrench.loadProto, false);

document.addEventListener('click', 
			  function(event) {
			    if(event.target.id == "reset") {
			      FireWrench.resetAuth();			  
			      event.stopPropagation();
			      event.preventDefault();
			    }
			  }, 
			  true);

FireWrench.init = function() {
  var url = "";
  url += window.location;
  if (GM_getValue('authorized') != true) {
    if (url.indexOf("http://shamurai.com/bin/firewrench/callback.php") == 0) {
      FireWrench.finishAuth();
    } else if (url.indexOf("http://shamurai.com/bin/firewrench") == 0) {
      FireWrench.getAuthorization();
    }   
  } else {
    var t = GM_getValue('oauthToken');
    var s = GM_getValue('oauthTokenSecret');
    FireWrench._fe = new p.FireEagle(FireWrench.key, 
				     FireWrench.secret, 
				     t, 
				     s);
    FireWrench._fe.setSSL(true);
    FireWrench._ready = true;
    if (url.indexOf("http://shamurai.com/bin/firewrench") == 0) {
      var div = document.getElementById('startAuth');
      div.style.display = 'none';
      FireWrench.done();
      FireWrench.getLocation();
    }   
  }
}

FireWrench.done = function() {
  var div = document.getElementById('finishAuth');
  div.style.display = 'block';
  var r = '<input type="button" id="reset" value="Reset Authentication" ';
  r += 'onClick="window.resetAuth()">';
  document.getElementById('resetSpan').innerHTML = r;
}

FireWrench.resetAuth = function() {
  GM_setValue('oauthToken', '');
  GM_setValue('oauthTokenSecret', '');
  GM_setValue('authorized', false);
  window.location.reload();
}

FireWrench.getLocation = function() {
  var url = FireWrench._fe.getUserUrl(p.FireEagle.RESPONSE_FORMAT.json);
  window.FireWrench.getHttpRequest('GET', url, FireWrench.showLocation);
}

FireWrench.showLocation = function(responseDetails) {
  var div = document.getElementById('myLocation');
  var r = responseDetails.responseText;
  var j = eval('(' + r + ')');
  if (j.user.location_hierarchy.length == 0) {
    return;
  }
  var s = j.user.location_hierarchy[0].name;	
  s = "The Fire Eagle spotted you: <strong>" + s + "</strong>."; 
  div.innerHTML = s;
}

FireWrench.getAuthorization = function() {
  FireWrench._fe = new p.FireEagle(FireWrench.key, FireWrench.secret);  
  var url = FireWrench._fe.getRequestTokenUrl();
  var div = document.getElementById('startAuth');
  div.innerHTML = "<p>Looks like you haven't authenticated yet...</p>";  
  window.FireWrench.getHttpRequest('GET', url, FireWrench.getAuthUrl);
}

FireWrench.getAuthUrl = function(responseDetails) {
  var div = document.getElementById('startAuth');
  var content = responseDetails.responseText;
  FireWrench._fe.parseTokens(content);  
  var c = '<a href="' + FireWrench._fe.getAuthorizeUrl() + '>Authorize me!</a>';
  GM_setValue('oauthToken', FireWrench._fe.oauthToken);
  GM_setValue('oauthTokenSecret', FireWrench._fe.oauthTokenSecret);
  div.innerHTML += c;
}

FireWrench.finishAuth = function() {
  var t = GM_getValue('oauthToken');
  var s = GM_getValue('oauthTokenSecret');
  FireWrench._fe = new p.FireEagle(FireWrench.key, 
				   FireWrench.secret, 
				   t, 
				   s);
  var div = document.getElementById('startAuth');
  var content = "<p>Great! Lets finish the authorization.</p>";
  div.innerHTML = content;
  var url = FireWrench._fe.getAccessUrl();
  window.FireWrench.getHttpRequest('GET', url, FireWrench.saveTokens)
}

FireWrench.saveTokens = function(responseDetails) { 
  var content = responseDetails.responseText;
  FireWrench._fe = new p.FireEagle(FireWrench.key, 
				   FireWrench.secret);
  FireWrench._fe.parseTokens(content);
  GM_setValue('oauthToken', FireWrench._fe.oauthToken);
  GM_setValue('oauthTokenSecret', FireWrench._fe.oauthTokenSecret);
  GM_setValue('authorized', true);
  FireWrench._authorized = true;
  var div = document.getElementById('startAuth');
  var content = "<p>Yay! We're all done!</p>";
  content += "<p><a href='./'>Continue</a></p>";
  div.innerHTML = content;
}

