// ==UserScript==
// @name          Invite photos to the group
// @version       1.0
// @description	  This script let you add a comment with a group link to invite that photo to a selected group.
// @namespace     http://webdev.yuan.cc/
// @include       http://flickr.com/photos/*
// @include       http://www.flickr.com/photos/*

// v1.0	01/17/06	initial release
//
// Author: .CK ( http://www.flickr.com/photos/ckyuan/ )
// Web site: http://webdev.yuan.cc/
//           http://flickr.tw/
//
// ==/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;

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 loadGroups() {

    sel_group.style.display = 'block';

    var params = {
	method: 'flickr.people.getPublicGroups',
	user_id: w.global_nsid
    };

    var url = 'http://www.flickr.com/services/rest/?' + sign(params);
    var headers = { 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey/Invite photos to group', 'Accept': 'application/atom+xml,application/xml,text/xml' };
    GM_xmlhttpRequest({
	method: 'GET', url: url, headers: headers,
	onload: function(responseDetails) {
	    var parser = new w.DOMParser();
	    var dom = parser.parseFromString(responseDetails.responseText, "application/xml");
	    var stat = dom.getElementsByTagName('rsp')[0].getAttribute('stat');
	    if( stat == 'ok' ) {
		var g = dom.getElementsByTagName('group');
		var str = '<option>Select group to invite...</option>';
		var _g = new Array();
		var adminonly = GM_getValue('adminonly',false);
		for(var i=0;i<g.length;i++) {
		    nsid = g[i].getAttribute('nsid');
		    name = g[i].getAttribute('name');
		    admin = (g[i].getAttribute('admin') == '1') ? true : false;
		    eighteenplus = g[i].getAttribute('eighteenplus');
		    if(!adminonly || admin) {
			name = name.substr(0,40) + ((name.length>40)?'...':'');
			groups[name] = nsid;
			_g.push(name);
		    }
		}
		_g.sort();
		for(var i=0;i<_g.length;i++) 
		    str += '<option value="' +groups[_g[i]]+ '" text="' +_g[i]+ '">'+_g[i]+'</option>';
		
		select.innerHTML = str;
		select.addEventListener('change', addComment, true);
	    }
	}
    });
}

function addComment() {

    var s = _gi('invited_group');
    var nsid  = s.value;
    var name = s.options[s.selectedIndex].text;
    var link = '<a href="http://flickr.com/groups/' +nsid+ '/">'+name+'</a>';
    var text = GM_getValue('invite_text', 'Nice photo! Welcome to share this photo with {GROUP_LINK} group.');
    text = text.replace(/{GROUP_LINK}/, link);
//    textarea.value += text;
    textarea.value = textarea.value.substr(0,textarea.selectionStart) + text + textarea.value.substr(textarea.selectionStart);
}

var discuss = _gi('DiscussPhoto');
if( !discuss) return;

var groups = new Array();
var h3 = discuss.getElementsByTagName('h3');
var add_comment = discuss.getElementsByTagName('h3')[h3.length-1];
var textarea = discuss.getElementsByTagName('textarea')[0];

var invite = _ce('span');
var invite_a = _ce('a');
invite.appendChild(_ct(' ( '));
invite.appendChild(invite_a);
invite_a.innerHTML = 'Invite to group';
invite_a.href = 'javascript:;';
invite_a.addEventListener('click', loadGroups, true);
invite.appendChild(_ct(' )'));

var sel_group = _ce('div');
var select = _ce('select');
var template = _ce('a');
var adminonly = _ce('input');

sel_group.style.display = 'none';
select.id = 'invited_group';
select.innerHTML = '<option>Loading groups...</option>';
adminonly.type = 'checkbox';
adminonly.checked = (GM_getValue('adminonly',false)) ? true : false;
adminonly.addEventListener('change', function() {
    if( adminonly.checked ) GM_setValue('adminonly', true);
    else GM_setValue('adminonly', false);
    select.innerHTML = '<option>Loading groups...</option>';
    loadGroups();
}, true);

template.href = 'javascript:;';
template.innerHTML = 'Change invitation template';
template.addEventListener('click', function() { 
    var msg = prompt('Enter the invitation message', GM_getValue('invite_text', 'Nice photo! Welcome to share this photo with {GROUP_LINK} group.') );
    GM_setValue('invite_text',msg);
}, true);

sel_group.appendChild(select);
sel_group.appendChild(_ct(' '));
sel_group.appendChild(adminonly);
sel_group.appendChild(_ct(' administered only'));
sel_group.appendChild(_ce('br'));
sel_group.appendChild(template);


add_comment.appendChild(invite);
add_comment.parentNode.insertBefore(sel_group, add_comment.nextSibling);

return;


})();
