// ==UserScript==
// @name          Flickr Photo Favorers
// @version       1.0
// @description	  Adding a widget box to display the favorers of current photo
// @namespace     http://webdev.yuan.cc/
// @include       http://flickr.com/photos/*
// @include       http://www.flickr.com/photos/*

// Author: .CK ( http://www.flickr.com/photos/ckyuan/ )
// Web site: http://webdev.yuan.cc/
//
// v1.0	08/08/2007	initial release
//
// ==/UserScript==

(function() {

var re = /http:\/\/(www\.)?flickr\.com\/photos\/[^\/]+\/\d+/;
if( ! re.test(document.location) ) return;

if(unsafeWindow) w = unsafeWindow;
else w = window;

var global_photos = w.global_photos;
var global_nsid = w.global_nsid;
var photo_id = w.page_photo_id;
var headers = { 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/Flickr Favorites Photostream', 'Accept': 'application/atom+xml,application/xml,text/xml' }

function _gt(e) { return document.getElementsByTagName(e); }
function _gi(e) { return document.getElementById(e); }
function _ce(e) { return document.createElement(e); }
function _ct(e) { return document.createTextNode(e); }

function sign(params) {

    params.api_key = w.global_magisterLudi;
    params.auth_hash = w.global_auth_hash;
    params.auth_token = w.global_auth_token;

    var _11=[], _12='';
    for(var p in params) {
        params[p]=params[p];
        _11.push(p);
        _12+="&"+p+"="+w.escape_utf8(params[p]);
    }
    _11.sort();
    var cal=w.global_flickr_secret;
    if(cal!="") {
        for(var i=0;i<_11.length;i++) cal+=_11[i]+params[_11[i]];
        cal=w.md5_calcMD5(cal);
        _12="api_sig="+cal+_12;
    }
    return _12;
}

function showFavorers(page,pages,total) {
	var str = '<div style="width:234px;background:#f3f3f3;border:1px #e3e3e3 solid;padding:3px;margin:0px 0px 5px 0px">';
	str += '<h3 class="contextTitleOpen"><strong>Favorers</strong></h3>';
	var j = (total>page*45) ? page*45 : total;
	GM_log('j=' + j);
	for(var i=(page-1)*45; i<j; i++) {
		str += '<a href="/photos/'+favorers[i].nsid+'/" title="' +favorers[i].username+ '"><img class="rightSideContactChanger" style="margin:0px 2px 2px 0px" src="http://flickr.com//buddyicons/' +favorers[i].nsid+ '.jpg" alt="view photos" width="24" height="24" /></a>';
	}
	if(page==1 && pages>1) 
		str += '<div style="text-align:right"><a href="javascript:;" class="Plain" onClick="readFavorers(2)"><small>Next</small></a></div>';
	if(page==pages && page>1) 
		str += '<div style="text-align:right"><a href="javascript:;" class="Plain" onClick="readFavorers('+(page-1)+')"><small>Back</small></a></div>';
	if(page>1 && page<pages) {
		str += '<div style="text-align:right">';
		str += '<a href="javascript:;" class="Plain" onClick="readFavorers('+(page-1)+')"><small>Back</small></a> ';
		str += '<a href="javascript:;" class="Plain" onClick="readFavorers('+(page+1)+')"><small>Next</small></a></div>';
	}
	fdiv.innerHTML = str + '</div>';
	if( !_gi('favorers_box') ) cdiv.parentNode.insertBefore(fdiv, cdiv.previousSibling.previousSibling);
}

var cdiv = _gi('otherContexts_div');
var fdiv = _ce('div');
fdiv.id = 'favorers_box';
fdiv.className = cdiv.className;
var favorers = new Array();
var page,pages,total;

w.readFavorers = function(p) {
	if( favorers.length > (p-1)*45 ) {
		showFavorers(p,pages,total);
		return;
	}
	var url = 'http://www.flickr.com/services/rest/?' + sign({
		method: 'flickr.photos.getFavorites',
		photo_id: photo_id,
		per_page: 45,
		page: p
	});

	GM_xmlhttpRequest({
		method: 'GET', url: url, headers: headers,
		onload: function(responseDetails) {
			var parser = new w.DOMParser();
			var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
//			GM_log(responseDetails.responseText);
			var stat = dom.getElementsByTagName('rsp')[0].getAttribute('stat');
			if( stat == 'ok' ) {
				pages = 1*dom.getElementsByTagName('photo')[0].getAttribute('pages');
				page = 1*dom.getElementsByTagName('photo')[0].getAttribute('page');
				total = 1*dom.getElementsByTagName('photo')[0].getAttribute('total');
				var persons = dom.getElementsByTagName('person');
				if(total==0) return;

				for(var i=0;i<persons.length;i++) {
					var index = (page-1)*45+i;
					favorers[index] = new Object();
					favorers[index].nsid = persons[i].getAttribute('nsid');
					favorers[index].username = persons[i].getAttribute('username');
					favorers[index].favedate = persons[i].getAttribute('favedate');
				}
				GM_log(favorers.length);
				showFavorers(page,pages,total);
			}
		}
	});
}

w.readFavorers(1);
})();


