UTX keys in add/edit/post/comment

By kingoleg Last update May 9, 2008 — Installed 58 times. Daily Installs: 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
// UTX keys in add/edit/post/comment
// version 2.0 beta
// 2005-05-26
// Copyright (c) 2005, Oleg Marchuk <kingoleg@mail.ru>
// Copyright (c) 2006, Paul Tomashevskyi (v2.3)
// Copyright (c) 2006, Oleg Marchuk <kingoleg@mail.ru>
// Released under the GPL license
// http://www.gnu.org/copyleft/gpl.html
// ==UserScript==
// @name          UTX keys in add/edit/post/comment
// @namespace     http://kingoleg.livejournal.com/
// @description   Add key short cut fot utx link.
// @include       http://*.livejournal.com/update.bml
// @include       http://*.livejournal.com/*/*mode=reply*
// @include       http://*.livejournal.com/*/*/*mode=reply*
// @include       http://*.livejournal.com/editjournal.bml*
// ==/UserScript==


var utx_user = 'kingoleg';
var utx_id;

(function(){
	// TODO: seek by url
	var utx_tags = new Array();
	var element;
	
	function keydown(event) {
		var Key = event.keyCode;
		if (Key==0) Key = event.charCode;
		if (!event.altKey) return;
		if (Key!=78) return; //N

		var utx_marker;

		element = this;
		if (!element.id) {
			element.id='commenttext';
		}
     	utx_id=element.id;	

		element.focus(); 
		var sel_start = element.selectionStart;
		var sel_end = element.selectionEnd;
		if (sel_start == sel_end) {
			//utx_marker = prompt("Enter UTX tag");
			chooseMarker();
		} else {
			utx_marker = element.value.slice(sel_start, sel_end);
			markerize(utx_marker);
		}

	}

	function markerize(utx_marker){
		element.focus(); 
		var sel_start = element.selectionStart;
		var sel_end = element.selectionEnd;
		
		element.value = element.value.slice(0,sel_start)+element.value.slice(sel_end);

		var utx_text = '<a href="http://utx.ambience.ru/users/'+utx_user+'/'+utx_marker+'/"><img src="http://utx.ambience.ru/img/'+utx_user+'/'+utx_marker+'/" hspace="3" vspace="3" alt="'+utx_marker+'" title="'+utx_marker+'" border="0" height="5" width="30" style="background-color:#c00;"></a>';
		MozillaInsertText(element, utx_text, sel_start);
		element.selectionStart = sel_start;
		element.selectionEnd = sel_start+utx_text.length;
		element.focus(); 
	}

	function markerize2(element, utx_marker){
		element.focus(); 
		var sel_start = element.selectionStart;
		var sel_end = element.selectionEnd;
		
		element.value = element.value.slice(0,sel_start)+element.value.slice(sel_end);

		var utx_text = '<a href="http://utx.ambience.ru/users/'+utx_user+'/'+utx_marker+'/"><img src="http://utx.ambience.ru/img/'+utx_user+'/'+utx_marker+'/" hspace="3" vspace="3" alt="'+utx_marker+'" title="'+utx_marker+'" border="0" height="5" width="30" style="background-color:#c00;"></a>';
		MozillaInsertText(element, utx_text, sel_start);
		element.selectionStart = sel_start;
		element.selectionEnd = sel_start+utx_text.length;
		element.focus(); 
	}


	function chooseMarker() {
		//Choose
		var utx_marker;
		var win = window.open('about:blank', 'utx', "location=no,menubar=no,resizable=no,scrollbars=yes,width=300,height=200");
		var doc = win.document;
		
		doc.element = element;
		win.markerize2 = markerize2;

		doc.open();
		doc.write("<html>");
		doc.write("<head>");
		doc.write("<title>Utx tags of "+utx_user+"</title>");
		doc.write("<script>");
		doc.write("function marker(utx_marker){");
		doc.write("var utx_id='"+utx_id+"';");
		doc.write("var utx_user = '"+utx_user+"';");
		doc.write("var txt = opener.document.getElementById(utx_id);");
		doc.write("var sel_start=txt.selectionStart; ");
		doc.write("var sel_end=txt.selectionEnd; ");
		doc.write("var utx_text = '<a href=\"http://utx.ambience.ru/users/'+utx_user+'/'+utx_marker+'/\"><img src=\"http://utx.ambience.ru/img/'+utx_user+'/'+utx_marker+'/\" hspace=\"3\" vspace=\"3\" alt=\"'+utx_marker+'\" title=\"'+utx_marker+'\" border=\"0\" height=\"5\" width=\"30\" style=\"background-color:#c00;\"></a>';");
		doc.write("txt.value=txt.value.slice(0,sel_start)+utx_text+txt.value.slice(sel_end);");
		doc.write("close();");
		doc.write("}");
		doc.write("</script>");
		doc.write("</head>");
		
		doc.write("<body>");
		doc.write("<table>");
		for(var i=0;i<utx_tags.length;i++) {
			doc.write("<tr><td>");
			doc.write("<a href='#' onclick='marker(\""+utx_tags[i]['tag']+"\");return false;'>"+utx_tags[i]['tag']+"</a>");
			doc.write("</td></tr>");
		}
		doc.write("<table>");
		doc.write("</body></html>");
		doc.close();

		doc.element = element;
		win.markerize2 = markerize2;

		//markerize(utx_marker);
	}

	function dd(o) {
		var win = window.open('about:blank');
		var doc = win.document;
		doc.open();
		doc.write("<html><head><title></title></head><body>");
		doc.write("<table width='100%' border='1'>");
		doc.write("<tr><th colspan='3'>"+o+"</th></tr>");
		doc.write("<tr><th>");
		doc.write("attr");
		doc.write("</th><th>");
		doc.write("as attr");
		doc.write("</th><th>");
		doc.write("as function");
		doc.write("</th><tr>");
		for(var attr in o) {
			if (isNumber(attr)) {
				continue;
			}
			doc.write("<tr><td>");
			doc.write(attr);
			doc.write("</td><td>");
			try {
				doc.write("as attr : "+eval("o."+attr));
			} catch(e) {
				doc.write(e+"\n"+attr+" is not attribute");
			}
			doc.write("</td><td>");
			try {
				doc.write(eval("o."+attr+"()"));
			} catch(e) {
				doc.write(e+"\n"+"as function : "+attr+" is not function");
			}
			doc.write("</td></tr>");
		}
		doc.write("<table>");

		doc.write("<textarea cols='75' rows='50'>");
		for(var attr in o) {
			doc.write('user_pref("capability.policy.livejournal.Element.'+attr+'", "allAccess");'+"\n");
		}
		doc.write("</textarea>");

		doc.write("</body></html>");

		doc.close();
	}

	function getTagsFromUtx(element) {
		// make the xmlhttprequest and create the object once it returns

		GM_xmlhttpRequest({
				method: 'GET',
				url: 'http://utx.ambience.ru/api/1.0/tags?user='+utx_user,
				headers: {
					'User-agent': 'utx greasemonkey script (kingoleg@mail.ru)',
					'Accept': 'text/xml',
				},

			onreadystatechange: function(http) {
				if (4 == http.readyState && 200 == http.status) {
					var xmlText=http.responseText;
					//var parser = new XPCNativeWrapper(window, "DOMParser").DOMParser();
					var parser=new unsafeWindow.DOMParser();
					var xmlDoc=parser.parseFromString(xmlText,"application/xml");
					var tags = xmlDoc.getElementsByTagName('tag');

					for(var i=0;i<tags.length;i++) {
						var tag = tags[i];
						var tagName = tag.getAttribute('tag');
						var tagSupertag = tag.getAttribute('supertag');
						var tagCount = tag.getAttribute('count');

						utx_tags[i] = new Array();
						utx_tags[i]['tag'] = tagName;
						utx_tags[i]['supertag'] = tagSupertag;
						utx_tags[i]['count'] = tagCount;
					}
				}
			}
		});
	}

	function MozillaInsertText(element, text, pos) {
		element.value = element.value.slice(0,pos)+text+element.value.slice(pos);
	}

	//find edit
	var textareas = document.getElementsByTagName('textarea');
	var len = textareas.length;
	for(var i=0;i<len;i++) {
		//bind keyDown
		var textarea = textareas[i];
		textarea.addEventListener('keydown', keydown, false);
		if (i==0) {
			getTagsFromUtx(textarea);
		}
	}

	window.markerize = markerize;
})();