/*

Add blog post trackbacks to PLoS One papers

*/

// ==UserScript==
// @name			Postgenomic / PLoS One mashup
// @namespace		http://www.postgenomic.com/userscripts
// @description		Adds blog post trackbacks to papers on PLoS One
// @include			http://www.plosone.org/*
// ==/UserScript==

// Get current date
var d = new Date();
var curr_date = d.getDate();
var stored_date=0;
var stored_date= GM_getValue("postgenomics_data_date", 0);

// Check for new DOIs in Postgenomic only once per day
// So if the current date != the date in the cache, refresh the cache
if ( (stored_date != curr_date) || (!GM_getValue("postgenomics_json_list",0)) ) {
	get_ids();
	GM_setValue("postgenomics_data_date", curr_date); // in JSON format
} else {
	eval(GM_getValue("postgenomics_json_list",0));
}

function process_api_results(obj) {
	GM_log("Got data, starting Postgenomic greasemonkey script.");
	
	var dois = new Array();
	var pmids = new Array();
	// ignore OAI ids for now
	
	dois = obj.doi_id; // an array of doi => paper_id
	pmids = obj.pubmed_id; // an array of PMID => paper_id	
	
	evaluate_page(dois, pmids);
}

function process_posts(obj) {
	var header = document.getElementById("GM_postgenomic");
	
	for (var i=0; i < obj.length; i++) {
		var title = obj[i].title;
		var blog_name = obj[i].blog_name;
		var pubdate = obj[i].pubdate;
		var link = obj[i].url;
		
		var post = document.createElement('li');
		post.innerHTML = '<a style="text-indent: 0px;" href="' + link + '">' + blog_name + '</a>';
		header.appendChild(post);
	}
}

function find(pattern, subject) {
	var reg = new RegExp(pattern, "i")
	var match = reg.exec(subject);
	return match; // returns an array (potentially empty)
}

function found_paper(paper_id) {
	var comments = document.createElement('li');
	comments.innerHTML = 'Trackbacks from Postgenomic:';
	comments.id = "GM_postgenomic";
	var list = document.getElementById("dcCount");
	
	list.appendChild(comments);
	//list.parentNode.insertBefore(comments, list);
	
	get_posts(paper_id);
		
}

function evaluate_page(dois, pmids) {
	GM_log("Evaluate page is running.");
	
	// first check the page URL
	var page_url = unescape(location.href);
	// articleURI=info:doi/10.1371/journal.pone.0000170&
	var match = find("info:doi\/([^\&]*)", page_url);
	
	if (match) {
		var doi_id = match[1];
		if (dois[doi_id]) {
			found_paper(dois[doi_id]);
			GM_log("Found doi_id " + doi_id + " and it's in the index.");
			return;
		} else {
			GM_log("Found doi id " + doi_id + " but it isn't in the Postgenomic index.");
		}		
	} else {
		GM_log("Didn't find a match");
	}
	
	return;
}

// this function retrieves details of posts that cite a particular paper_id
function get_posts(paper_id){
	GM_log("Requesting posts");
	var request_url = "http://www.postgenomic.com/api.php?type=post&citing_paper=" + paper_id + "&format=json&callback=process_posts&about=fnl_pubmed_trackbacks";
	GM_log(request_url);
	GM_xmlhttpRequest({
		method: 'GET',
		url: request_url,
		headers: {
			'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
			'Accept': 'application/xml,text/html',
		},
		onload: function(responseDetails) {
			var response_status=responseDetails.status;
			var response_text=null;
			if (response_status==200){
				GM_log("Posts request: response ok");
				response_text=responseDetails.responseText;
				eval(response_text);
			}
		}
	});
}

// this function retrieves details of papers in the Postgenomic index in JSON format.
function get_ids(){
	GM_log("Requesting IDs");
	GM_xmlhttpRequest({
		method: 'GET',
		url: "http://www.postgenomic.com/api.php?type=paper&ids_only=1&callback=process_api_results&about=fnl_pubmed_trackbacks",
		headers: {
			'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey',
			'Accept': 'application/xml,text/html',
		},
		onload: function(responseDetails) {
			var response_status=responseDetails.status;
			var response_text=null;
			if (response_status==200){
				GM_log("IDs request: response ok");
				response_text=responseDetails.responseText;
			
				GM_setValue("postgenomics_json_list", response_text);
				eval(response_text);
			}
		}
	});
}