// Adding some contextual depth to your web browsing.
// version 0.1 BETA!
// 2009-12-01
// Copyright (c) 2009, Alex Abreu
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
//
// --------------------------------------------------------------------
//
// This is a Greasemonkey user script.
//
// To install, you need Greasemonkey: http://greasemonkey.mozdev.org/
// Then restart Firefox and revisit this script.
// Under Tools, there will be a new menu item to "Install User Script".
// Accept the default configuration and install.
//
// To uninstall, go to Tools/Manage User Scripts,
// select "Contexture", and click Uninstall.
//
// --------------------------------------------------------------------
//
// ==UserScript==
// @name          Contexture
// @namespace     http://www.contexture.in/gm
// @description   Contexture offers a visual layer showing information about the structure and categorization of each site you visit, providing a moving contextual lens through which to view informational content.
// @include       *
// @exclude       http://*.google.com/*
// @exclude       http://*.yahoo.com/*
// @exclude       http://www.bing.com/*
// @exclude       https://*.google.com/*
// @exclude       https://*.yahoo.com/*
// @exclude       https://www.bing.com/*
// @exclude       http://*.wikipedia.org/*
// @require http://www.alexabreu.com/includes/js/contextfree.js
// @require http://www.alexabreu.com/includes/js/mootools-core-gm-1.2.4.js
// @require http://www.alexabreu.com/includes/js/mootools-1.2.4.2-more.js
// @require http://www.alexabreu.com/includes/js/sha1.js
// @require http://www.alexabreu.com/includes/js/oauth.js
// @require http://www.alexabreu.com/includes/js/oauth-helper.js
// @require http://www.alexabreu.com/includes/js/text.js
// @require http://www.alexabreu.com/includes/js/xml2json.js
// ==/UserScript==

var resources = [{file : 'http://www.google-analytics.com/ga.js', type : 'js'}, 
				 {file : 'http://www.alexabreu.com/context/css/context.css', type : 'css'}
				];

var context = {'html' : 'http://www.alexabreu.com/context/html/context.html'};

var alchemy = { 'apikey' : '5daab9e86f56ff960122985a5f10b511ae69052c',
				'category' : 'http://access.alchemyapi.com/calls/url/URLGetCategory'};
				
var delicious = {'url_tags' : 'http://badges.del.icio.us/feeds/json/url/blogbadge'};

var stw = {'url' : 'http://www.alexabreu.com/context/php/get-thumb.php'};

var google_data = {	oauth_consumer_key : 'www.contexture.in',
					oauth_consumer_secret : 'in1wilqowCnd49JSkYzV0UHS',
					oauth_token_secret : 'PjmXnh7Qqhei0Dep8H2uDk+q',
					oauth_token : '1/u7x5pm0zQJpTYMYuFDuuGw'
			  	  };
			  	  
var back_type = {'apikey' : 'c8465b9a895f7304ad7f.',
				 'tweets' : 'http://backtweets.com/search.json'
				};
				
var awis = {'url' : 'http://www.alexabreu.com/context/php/awis.php',
			'SitesLinkingIn' : {'action' : 'SitesLinkingIn' , 'response_group' : 'SitesLinkingIn'}
		   }

// DKHFWNfV34GWeWeVAnFK4dmiaxOUhMSRH3or8OVJNTPG4t1kyNKz.W9JHl6k
unsafeWindow.test =[];

var tips = [];	  

var interface_toggle_animation = null;	  

				
function loadResources(file, type) {			
		
	for (i in resources) {
		if (resources[i].type == 'js') {
			var script = document.createElement('script');
			script.type = 'text/javascript';
			script.src = resources[i].file;
			
			//$(document.head).adopt(script);
		}
		else if (resources[i].type == 'css') {
			var link = document.createElement('link');
		    link.rel = 'stylesheet';
		    link.type = 'text/css';
		    link.href = resources[i].file;

			$(document.head).adopt(link);
		}
		   
	}
}





function getClickPath() {
	console.log('getting click path');
	//google_data.oauth_token = GM_getValue('oauth_token');
	//google_data.oauth_token_secret = GM_getValue('oauth_token_secret');
	if ( $defined(google_data.oauth_token) && $defined(google_data.oauth_token_secret) ) {
		console.log('token and secret already exist');
		console.log('token: ' + google_data.oauth_token);
		console.log('secret: ' + google_data.oauth_token_secret);
	}
	else {
		console.log('token and secret not found! get one first.')
		return -1;
	}
	
	var data = {'ids' : 'ga:23842403',
				'dimensions' : 'ga:hostname,ga:exitPagePath,ga:landingPagePath',
				'metrics' : 'ga:entrances,ga:exits',
				'filters' : 'ga:hostname==www.contexture.in',
				'start-date' : '2009-10-24',
				'end-date' : '2009-11-07'
				}

	var prepData = function(data) {
		var qs = '';
		$each(data, function(item, key) {
			qs += key + '=' + encodeURIComponent( item ) + '&';  
		});
		qs = '?' + qs.substr(0, qs.length-1);
		console.log('query string: ' + qs);
		return qs;
	}
	
	prepData(data);
	
	var message = { method: 'GET', 
					action: 'https://www.google.com/analytics/feeds/data' + prepData(data),
					parameters : [] };
	
	message.parameters.push(['oauth_token', google_data.oauth_token]);
	
	var accessor = { consumerSecret : google_data.oauth_consumer_secret,
					 token : google_data.oauth_token,
					 tokenSecret : google_data.oauth_token_secret
				   };
					   
	google_data.helper.signRequest(message, accessor);
		
	var r = new Request.HTML ({url : message.action,
							   //data : prepData(data),
						  	   method : message.method,
						  	   headers : {"Host" : "www.google.com",
						  	   			  "Accept" : "*/*",
						  	   			  "Authorization" : OAuth.getAuthorizationHeader('',message.parameters),
						  	   			  "X-If-No-Redirect" : true,
						  	   			  "Content-Type" : "application/atom+xml",
						  	   			  "GData-Version" : "2.0",
						  	   			  
						  	   },
						  	   onSuccess : function (responseTree, responseElements, responseHTML, responseJavaScript) {
												 	console.log(responseElements);
							   },
							   onFailure : function (xhr) {
							   						console.log(xhr.responseText);
												 	console.log(xhr);
							   }
	}).send();
	console.log(r);
	
}


window.addEvent('domready', function(e){
	console.log('initializing');
	loadResources();
	
	google_data.helper = new OAuthHelper({ oauth_version : '1.0',
			 	 						   oauth_signature_method : 'HMAC-SHA1',
			 	 						   oauth_consumer_key : google_data.oauth_consumer_key,
			 	 						   oauth_consumer_secret : google_data.oauth_consumer_secret,
			 	 						   oauth_callback : 'http://www.alexabreu.com/context/oauth',
			 	 						   oauth_scope : 'https://www.google.com/analytics/feeds/',
			 	 						   get_request_token_url : 'https://www.google.com/accounts/OAuthGetRequestToken',
									 	   authorize_token_url : 'https://www.google.com/accounts/OAuthAuthorizeToken',
									 	   get_access_token_url : 'https://www.google.com/accounts/OAuthGetAccessToken'
	});
		
	/*
try {
		var pageTracker = unsafeWindow._gat._getTracker("UA-7168648-1");
		pageTracker._trackPageview();
	} 
	catch(e) {
		console.log(unsafeWindow);
		console.log(e);
	}
*/
	//console.log(unsafeWindow.history);
	
	var wrapper = new Element('div', {id : 'context-wrapper'});
	$(document.body).adopt(wrapper);
	
		
	var a = new Request.HTML({url : context.html, 
									 data : '',
									 method : 'get',
									 onSuccess : function (responseTree, responseElements, responseHTML, responseJavaScript) {
									 	console.log(responseHTML);
									 	wrapper.set('html', responseHTML);
									 	
									 	interface_toggle_animation = new Fx.Morph('interface', {duration: 'short', transition: Fx.Transitions.Back.easeOut});
									 	
									 	$('contexture-toggle').addEvent('click', function(e) {				 		
									 		console.log('toggling contexture window...');
									 		toggle_interface();
									 	});
									 	
									 	getDeliciousTags(window.location.href, $('contexture-tags'));
									 	var awis_request = new Request.HTML({url : awis.url, 
											  data : 'action='+awis.SitesLinkingIn.action + '&response_group=' + awis.SitesLinkingIn.response_group + '&url='+encodeURIComponent(window.location.href) + '&r=c',
											  method : 'get',
											  onSuccess : function (responseTree, responseElements, responseHTML, responseJavaScript) {
											 	var xml = responseElements[0];
											 	var sites = xml.getElementsByTagName('aws:site');
											 	var sites_array = [];
											 	for (var i = 0; i < sites.length; i++) {
											 		var title_node = $(sites[i]).getElementsByTagName('aws:title');
											 		var url_node = $(sites[i]).getElementsByTagName('aws:url');
											 		var title = title_node[0].innerHTML;
											 		var url = url_node[0].innerHTML;
											 		var exclude = new Array('google', 'yahoo', 'lycos');
											 		sites_array.push({'title' : title, 'url' : url})
											 	}
											 	//console.log(sites_array);
											 	sites_array.each(function(site, index){
											 		var site_wrapper = new Element('div', {'class' : 'contexture-site-wrapper c' + (index+1) });
											 		var category = new Element('div', {'class' : 'contexture-category', 'text' : 'loading...'});
											 		site_wrapper.adopt(category);
											 		var a = new Element ('a', {class : 'contexture-site-link', href : site.url, title : site.url, tags : 'No tags found, sorry.'});
											 		site_wrapper.inject($('contexture-links-in'), 'after');
											 		a.wraps(site_wrapper);
											 		
											 		getDeliciousTags(site.url, a, true);
											 		getAlchemyCategory(site.url, category);
											 		getSTWThumbnail(a.hostname, site_wrapper);
											 	});
											 	tips = new Tips('.contexture-site-link', {className : 'contexture-tips', title : 'title', text : 'tags'});
											 	tips.addEvent('show', function(tip, element){
												    if ($defined(element.get('tags'))) {
												    	tip.getElement('.tip-text').set('html', element.get('tags'));
												    }
												});

											  }
										}).send();
									 	$('get-token').addEvent('click', function(e) {
									 		GM_deleteValue('oauth_token');
									 		GM_deleteValue('oauth_token_secret');
									 		google_data.helper.oAuthGetRequestToken();
									 	});
									 	$('get-data').addEvent('click', function(e) {
									 		getClickPath()
									 	});
									 	if (window.location.href.contains('http://www.alexabreu.com/context/oauth')) {
											var tmp = window.location.search.substring(1);
											var qs = tmp.parseQueryString(false, false);
											
											google_data.helper.oAuthGetAccessToken(qs.oauth_token, qs.oauth_verifier);

										}
									 }
							  }).send();

});

function getSTWThumbnail(url, container) {
	console.log(stw.url + '?url=' + encodeURIComponent(url));
	var alchemy_request = new Request.HTML({url : stw.url, 
						 data : 'url='+ encodeURIComponent(url),
						 method : 'get',
						 onSuccess : function (responseTree, responseElements, responseHTML, responseJavaScript) {
						 	if (responseHTML != '' & responseHTML.contains('.jpg') ) {
						 		container.adopt(new Element('img', {'class' : 'thumbnail', 'src' : responseHTML}));
						 	}
						 	else {
						 		container.adopt(new Element('img', {'class' : 'thumbnail', 'src' : 'http://www.alexabreu.com/context/images/texture.png'}));
						 	}
						 },
						 onFailure : function (xhr) {
								container.adopt(new Element('img', {'class' : 'thumbnail', 'src' : 'http://www.alexabreu.com/context/images/texture.png'}));
						 }
				  }).send();
}

function getAlchemyCategory(url, container) {
	var alchemy_request = new Request.HTML({url : alchemy.category, 
						 data : 'apikey='+alchemy.apikey+'&url='+ encodeURIComponent(url),
						 method : 'post',
						 onSuccess : function (responseTree, responseElements, responseHTML, responseJavaScript) {
						 	console.log(responseElements[0]);
						 	handleAlchemyCategory(responseElements[0], container);
						 },
						 onFailure : function (xhr) {
						 	container.set('text', 'no category');
						 }
				  }).send();
}

function handleAlchemyCategory(xml, container) {
	var category_node = xml.getElementsByTagName('category');
	var score_node = xml.getElementsByTagName('score');
	if ($defined(category_node[0]) && $defined(score_node[0])) {
		var category = category_node[0].innerHTML;
		var score = score_node[0].innerHTML;
		if ($defined(category) && category.toLocaleLowerCase() != 'unknown') {
			container.set('text', category.replace('_', ', '));
		}
		else {
			container.set('text', 'miscellaneous');
		}
	}
}

						  
function getDeliciousTags(url, container, tooltip) {
	var delicious_request = new Request.HTML({url : delicious.url_tags, 
											  data : 'url=' + encodeURIComponent(url),
											  method : 'get',
											  onSuccess : function (responseTree, responseElements, responseHTML, responseJavaScript) {
											 	console.log(responseHTML);
											 	var json = eval(responseHTML);
											 	handleDeliciousRequest(json, container, tooltip);
											  }		  
									  	}).send();
}

function handleDeliciousRequest(json, container, tooltip) {
	if (json.length > 0) {
		tags = [];
		json.each(function(json_object, index) {
			//console.log(json_object.top_tags);	
			$each(json_object.top_tags, function(count, tag) {
				//console.log(tag);
				tags.push({'name' : tag, 'count' : count});
			});
			
			tags.sort(function (a, b) {
				return a.count - b.count;
			});
			
			
			
			console.log('these are the tags: ');
			console.log(tags);
			
			var temp = new Element('div');
			
			tags.each(function(t, index){
				
				var wrapper = new Element('div', {'class' : 'tag-wrapper c' + (index + 1)});
				var tag = new Element('div', {'class' : 'tag', 'text' : t.name});
				var count = new Element('span', {'class' : 'count', 'text' : t.count});
				wrapper.adopt(count,tag);
				
				if (!tooltip) {
					wrapper.inject(container, 'after');
				}
				else {
					temp.adopt(wrapper);
				}
				
			});
			
			container.set('tags', temp.get('html'));
			
		});
	}
	else {
		console.log('no tags found!');
	}
}

function toggle_interface() {
	if ( $defined($('interface')) ) {
		if ( $('interface').getStyle('width').toInt() >= 275) {
			console.log('closing');
			console.log($('interface').getStyle('width'));
			interface_toggle_animation.start({'width' : 0})
		}
		else {
			console.log('opening');
			console.log($('interface').getStyle('width'));
			interface_toggle_animation.start({'width' : 275});
		}
	console.log(interface_toggle_animation);
	}	
}

