// ==UserScript==
// @name	deviantART Refer Comment
// @namespace	http://www.valentindavid.com/
// @description Auto comment the place where you come from
// @version     0.8
// @identifier	http://www.valentindavid.com/dl/deviantrefercomment.user.js
// @date        2009-01-05
// @creator     Valentin David  <valentin.david@gmail.com>
// @include http://*deviantart.com/*
// ==/UserScript==

// Based on the idea of Flickr Refer Comment script available on:
// http://6v8.gamboni.org/Flickr-Add-referer-into-comments.html

(function () {

    var SCRIPT = {
	name: "deviantART Refer Comment",
	namespace: "http://www.valentindavid.com/",
	description: "auto comment the place where you come from",
	identifier: "http://www.valentindavid.com/dl/deviantrefercomment.user.js",
	version: "0.8",
	date: (new Date(2009, 5, 1)).valueOf()
    };

    var DeviantReferComment = function() {this.put = false; this.commentToInsert = ""; this.init();}

    DeviantReferComment.prototype = {

	decodeutf: function(str) {
	    var ret = "";
	    for (var i = 0; i < str.length; ) {
		var b = str.charCodeAt(i);
		if (b < 128) {
		    ret += String.fromCharCode(b);
		    i++;
		} else if (b < 192) {
		    ret += "?";
		    i++;
		} else {
		    var s = str.charCodeAt(i+1);
		    if ((b > 191) && (b < 224)) {
			ret += String.fromCharCode(((b & 31) << 6) | (s & 63));
			i++;
			i++;
		    }
		    else {
			var t = str.charCodeAt(i+2);
			if ((b > 223) && (b < 240)) {
			    ret += String.fromCharCode(((b & 15) << 12)
						       | ((s & 63) << 6)
						       | (t & 63));
			    i += 3;
			}
			else {
			    var u = str.charCodeAt(i+3);
			    ret += String.fromCharCode(((b & 7) << 18)
						       | ((s & 63) << 12)
						       | ((t & 63) << 6)
						       | (y & 63));
			    i += 4;
			}
		    }
		}
	    }
	    return ret;
	},

	init: function() {
	    var replies = document.getElementsByTagName("a");
	    for (var i = 0; i < replies.length; i++) {
		if (replies.item(i).className == "replybutton") {
		    var me = this;
		    function replacement(event) {
			me.putComment();
			return true;
		    }
		    replies.item(i).addEventListener("click", replacement, false);
		}
	    }

	    var referrer = document.referrer;
	    if(referrer) {
		if (referrer.indexOf("http://www.deviantart.com/print/") >= 0) {
		    this.insertComment("Seen on deviantART's print pages.", referrer);
		}
		else if ((referrer.indexOf("http://www.deviantart.com/") >= 0) ||
		    (referrer.indexOf("http://browse.deviantart.com/") >= 0)) {
		    this.insertComment("Seen on deviantART's browsing pages.", referrer);
		} else if (referrer.indexOf("facebook.com/profile.php") >= 0) {
		    this.insertComment("Seen on a Facebook profile.", referrer);
		} else if (/^http(s)?:\/\/([a-z]+\.)?google\./.test(referrer)) {
		    var match = /q=([^&]*)/.exec(referrer);
		    if (match[1]) {
			var request = this.decodeutf(unescape(match[1].replace(/\+/g, " ")));
			this.insertComment("Seen on Google looking for \""+request+"\".", referrer);
		    } else {
			this.insertComment("Seen on Google.", referrer);
		    }
		} else if (referrer.indexOf("http://my.deviantart.com/devwatch/") >= 0) {
		    this.insertComment("Seen on my deviantWATCH.");
		} else if (referrer.indexOf("http://my.deviantart.com/messages/") >= 0) {
		    this.insertComment("Seen on my deviantART messages.");
		} else if (referrer.indexOf("http://search.deviantart.com/") >= 0) {
		    var match = /q=([^&]*)/.exec(referrer);
		    if (match[1]) {
			var request = unescape(match[1].replace(/\+/g, " "));
			this.insertComment("Seen on deviantART search looking for \""+request+"\".", referrer);
		    } else {
			this.insertComment("Seen on deviantART search.", referrer);
		    }
		} else if (referrer.indexOf("http://forum.deviantart.com/") >= 0) {
		    this.insertComment("Seen on deviantART's forum.", referrer);
		} else if (referrer.indexOf("http://today.deviantart.com/") >= 0) {
		    this.insertComment("Seen on deviantART today's pages.", referrer);
		} else if (referrer.indexOf("http://shop.deviantart.com/") >= 0) {
		    this.insertComment("Seen on deviantART shop's pages.", referrer);
		} else if (referrer.indexOf("http://news.deviantart.com/") >= 0) {
		    this.insertComment("Seen on deviantART news' pages.", referrer);
		} else if (referrer.indexOf("http://chat.deviantart.com/") >= 0) {
		    if (referrer.indexOf("/chat/") >= 0) {
			var chan = referrer.substr(referrer.lastIndexOf("/")+1);
			this.insertComment("Seen on #"+chan+".", referrer);
		    }
		    else
			this.insertComment("Seen on deviant chat.", referrer);
		} else if (referrer.indexOf(".deviantart.com/") >= 0) {
		    var user = referrer.replace(/http:\/\/([a-z0-9]*)\.deviantart\.com\/.*/, "$1");
		    var httpRequest = new XMLHttpRequest();
		    var me = this;
		    GM_xmlhttpRequest({
			    method: 'GET',
			    url: 'http://' + user + '.deviantart.com/',
			    onload: function(response){
				var start = response.responseText.indexOf("<title>");
				var end = response.responseText.indexOf("</title>");
				var title = response.responseText.substr(start + 7, end - start - 7);
				var match = /<h1>(.)<a class="u"/.exec(response.responseText);
				var sign = match[1];
				var str = title;
				user = sign + str.substr(0, str.indexOf(" on deviantART"));
				if (referrer.indexOf("/favourites/") >= 0) {
				    me.insertComment("Seen on " + user + "'s favourites.", referrer);
				}
				else if (referrer.indexOf("/journal/") >= 0) {
				    me.insertComment("Seen on " + user + "'s journal.", referrer);
				}
				else if (referrer.indexOf("/art/") >= 0) {
				    me.insertComment("Seen on " + user + "'s gallery.", referrer);
				}
				else if (referrer.indexOf("/stats/gallery/") >= 0) {
				    me.insertComment("Seen on " + user + "'s gallery statistics page.", referrer);
				}
				else if (referrer.indexOf("/gallery/") >= 0) {
				    me.insertComment("Seen on " + user + "'s gallery.", referrer);
				}
				else if (/\.deviantart\.com\/$/.test(referrer)) {
				    me.insertComment("Seen on " + user + "'s profile page.", referrer);
				}
				else {
				    this.insertComment("FIXME: Seen on " + referrer, referrer);
				}
			    }
		     });
		}
		else if (referrer.indexOf("http://www.nettby.no/user/") >= 0) {
		    this.insertComment("Seen on a NettBy profile.", referrer);
		}
		else {
		    this.insertComment("FIXME: Seen on " + referrer, referrer);
		}
	    }
	},

	putComment: function() {
            if (this.commentToInsert == "")
		return ;

	    var texts = document.getElementsByTagName("textarea");
	    var html = this.commentToInsert;
            this.put = true;

	    for (var i = 0; i < texts.length; i++) {
		if (texts.item(i).id == "commentbody") {
		    if (texts.item(i).value.indexOf(html) < 0)
			texts.item(i).value += html;
		    texts.item(i).selectionStart = texts.item(i).selectionEnd = 0;
		}
	    }
	},

	insertComment: function(comment, url) {
	    var html = comment;
	    if(url)
		html = '<a href="'+url+'" title="Seen on...">'+comment+'</a>';
	    html = "\n\n-- \n<i>"+html+"</i>";
            html += ' (<a href="http://www.valentindavid.com/soft/deviant">?</a>)';
	    this.commentToInsert = html;
            if (!this.put)
              this.putComment();
	}
    };

    try {
        var deviantgp = new DeviantReferComment();
	window.addEventListener("load", function () {
		try {
		    win.UserScriptUpdates.requestAutomaticUpdates(SCRIPT);
		} catch (ex) {}
		deviantgp.putComment();
	    }, false);
    } catch (ex) {}
})();

