// ==UserScript==
// @name ROBO Sticky
// @author ROBO Design
// @namespace http://www.robodesign.ro
// @version 1.0.7
// @description Add sticky-notes to HTML and XHTML pages.
// @date 2005-11-15
// License: http://creativecommons.org/licenses/by-nc-sa/2.0/
// ==/UserScript==

/*
	Creative License Attribution-NonCommercial-ShareAlike 2.0 
		http://creativecommons.org/licenses/by-nc-sa/2.0/ 

 	This User JavaScript is based on another UserJS made by Antonio Orlando and Brian McAllister.
		http://digilander.libero.it/odnalro/coding/sticky_notes/

	To check for updates and to read more about this User JavaScript go to:
		http://www.robodesign.ro/opera/userjs/stickies

	Thanks to Mark Wilton-Jones (TarquinWJ) for suggestions, help and testing.
		http://www.howtocreate.co.uk
*/

/* ONLY EDIT THE CONFIGURATION SECTION (unless you really know what you are doing) */

document.addEventListener('load', function ()
{
	if(window.ujs_stickies)
		return false;

	window.ujs_stickies = new (function() 
{
	var manager = this;

	/**************
	<Configuration>
	**************/

	/* Allow double click on the page to create a new sticky? */
	manager.post_2click = true;

	/* Allow one click to edit the content? If false, double click is required. */
	manager.edit_1click = false;

	/* In editing mode: allow one click outside of the sticky to save. */
	manager.click_to_save = true;

	/* Confirm sticky removal */
	manager.remove_confirm = true;

	/* Allow XHTML in sticky content.
	   Values: 1 - always ; 2 - never ; 3 - configurable per sticky */
	manager.allow_xhtml = 3;

	/* Default minimized state for stickies.
	   Values: 1 - always minimized ; 2 - never minimized ; 3 - remember last time for each sticky */
	manager.minimize_stickies = 3;

	/* Minimize/restore the sticky on double-click on the title. */
	manager.minimize_2click = true;

	/* Allow parameters in URL
	   If this is true:
		   /index.php?page=a
		   /index.php?page=b
	   ... will be considered two unique pages.
	   If false, both pages are treated as: /index.php (identical). */
	manager.params_in_url = true;

	/* If you allow parameters in URL, you can also specify which parameters to remove from the URL (these can contain random values)
	   You must seperate each parameter with a vertical bar. */
	manager.remove_params_in_url = 'tmp|sessionid|sessid|temp|phpsessid|jsessionid|aspsessionid|cfid|cftoken';

	/* Turbo mode. If this is enabled, then there won't be any check for size and position constrains while resizing and dragging. */
	manager.turbo_mode = false;

	/* Show (or not) "nice" background image. Disable for faster rendering in Opera. */
	manager.bgrImage = true;

	/* Minimum X and Y position for all stickies. */
	manager.min_x = 5;
	manager.min_y = 5;

	/* Minimum and maximum width and height for all stickies. */
	manager.max_width = 600;
	manager.max_height = 400;
	manager.min_width = 250;
	manager.min_height = 130;

	/* Background color of the sticky. */
	manager.bgrColor = '#ffef59';

	/* Title background color. */
	manager.ttlBgrColor = '#ffef59';

	/* Title height (only allowed in pixels). */
	manager.ttlHeight = 14;

	/* Resize handler color, width and height (in pixels). */
	manager.resizerColor = '#ddcd37';
	manager.resizer_w = 8;
	manager.resizer_h = 8;

	/* Border color. */
	manager.borderColor = '#990';

	/* Close button color. */
	manager.closeColor = '#f00';

	/* Font size/line-height and family for sticky text. */
	manager.cssFont = '11px/11px sans-serif';

	/* Text color. */
	manager.textColor = '#000';

	/* Content padding (pixels). */
	manager.contentPadding = 5;

	// To further customize the sticky appearence just scroll to the end of this document to directly edit the CSS.

	// Messages
	manager.messages = new Array(
		// 0 The default content of a new sticky
		'Novo lembrete.',

		// 1 Confirmation message when trying to delete a sticky
		'Tem certeza que deseja excluir este lembrete?',

		// 2
		'Lembrete postado. ',

		// 3 Tool tip message shown over the drag area
		'Clique e arraste para mudar a posicao do lembrete.',

		// 4 Tool tip for the resizer
		'Clique e arraste para mudar as dimensoes do lembrete.',

		// 5 The tool tip for delete button
		'Excluir este lembrete.',

		// 6 The delete button
		'X',

		// 7 The "Allow XHTML" checkbox label
		'XHTML',

		// 8 The "Per domain" checkbox label
		'Dominio',

		// 9 The Save button
		'[ Salvar ]',

		// 10 The tool tip for Save button
		'Clique para sair do modo de edicao.',

		// 11 The tool tip of the entire sticky, when only one click is required
		'. Clique para editar o conteudo do lembrete.',

		// 12 .. or when a double-click is required to edit the sticky content
		'. De um clique duplo para editar o conteudo do lembrete.',

		// 13 Tool tip for the "Allow XHTML" checkbox
		'Permitir codigos XHTML no conteudo do lembrete.',

		// 14 Tool tip for the "Per domain" checkbox
		'Mostrar este lembrete em todas as paginas deste dominio.',

		// 15 Tool tip for the title input
		'Clique para editar o titulo deste lembrete.',

		// 16 The Minimize button
		'-',

		// 17 The tool tip for Minimize button
		'Clique para minimizar este lembrete.',

		// 18 The Maximize/Restore button
		'+',

		// 19 The tool tip for Maximize/Restore button
		'Clique para restaurar e mostrar o lembrete inteiro.',

		// 20 The "Fixed positioning" button
		'F',

		// 21 The tool tip for "Fixed positioning" button
		'Clique para tornar este lembrete fixo. Isso fara com que o lembrete se mova junto com a pagina caso voce role ela para cima ou para baixo.',

		// 22 The "Absolute positioning" button
		'A',

		// 23 The tool tip for "Absolute positioning" button
		'Clique para deixar este lembrete em uma posicao unica em relacao a pagina. Isso lhe permite posicionar o lembrete em um mesmo lugar, independente da rolagem.',

		// 24 The error message when the initialization failed
		'Voce nao pode adicionar um lembrete nesse documento. Inicializacao falhou. Provavelmente o documento que voce esta visualizando nao eh (X)HTML.',

		// 25 The error message when the user tries to use fixed positioning in Opera 8
		'A Posicao Fixada não funciona adequadamente no Opera 8 . Por favor, atualize para Opera 9.',

		// 26 Part of the tool tip when the sticky is not minimized and not in editing mode. This informs the user s/he can double-click to minimize the sticky.
		'De um clique duplo para minimizar o lembrete.',

		// 27 Part of the tool tip when the sticky is minimized and not in editing mode. This informs the user s/he can double-click to restore the sticky.
		'De um clique duplo para restaurar o lembrete.',

		// 28 The tool tip of the textarea in editing mode.
		'Clique para editar o conteudo deste lembrete.'
	);

	/***************
	</Configuration>
	***************/

	manager.z = 0;
	manager.init_failed = false;
	manager.bag = new Array();
	manager.sub_x = manager.sub_y = 5;

	manager.DOM3LS_parser = document.implementation.createLSParser(document.implementation.MODE_SYNCHRONOUS, 'http://www.w3.org/TR/REC-xml');
	manager.DOM3LS_input = document.implementation.createLSInput();

	// regular expression for the niceURL function
	manager.niceURLre = new RegExp('(\\?|&)(' + manager.remove_params_in_url + ')=([^&]*)&?', 'ig');

	// call this function to post a sticky
	manager.post = function (e)
	{
		if(manager.init_failed)
		{
			alert(manager.messages[24]);
			return;
		}

		if(document.getSelection())
			return false;

		if(e)
		{
			if(e.target)
			{
				if(manager.isTargetSticky(e.target))
					return false;

				var targetTag = e.target.tagName;
				if(targetTag)
				{
					targetTag = targetTag.toLowerCase();
					if(targetTag == 'input' || targetTag == 'a' || targetTag == 'textarea'
					 || targetTag == 'img' || targetTag == 'label' || targetTag == 'button'
					 || targetTag == 'select')
						return false;
				}
			}
			e.preventDefault();
		}

		if(e && e.clientX)
			var x = window.pageXOffset+e.clientX;
		else
			var x = 100 + Math.floor(Math.random()*501);

		if(e && e.clientY)
			var y = window.pageYOffset+e.clientY;
		else
			var y = window.pageYOffset + 100 + Math.floor(Math.random()*201);

		var date = new Date();
		var params = new Array(x, y, manager.min_width, manager.min_height, document.URL, 0, date.toUTCString(), 0, 0, 0);

		manager.bag.push(new manager.sticky(manager.bag.length, date.getTime(), manager.messages[0], params));

		return true;
	}

	manager.init = function ()
	{
		var dochead = document.getElementsByTagName('head')[0];

		// check if the page is (X)HTML
		if(!document.body || !document.getElementsByTagName("html"))
			manager.init_failed = true;

		if(!dochead && !manager.init_failed)
		{
			// thanks to Mark Wilton-Jones (TarquinWJ)
			// http://www.howtocreate.co.uk

			var allBodyParts = document.body.getElementsByTagName('*');
			var nrBodyParts = allBodyParts.length;

			// empty documents
			if(!nrBodyParts)
				manager.init_failed = true;
			else
				var firstTagName = document.body.firstChild.tagName;

			if(firstTagName)
				firstTagName = firstTagName.toLowerCase();

			// text documents and plugins
			if(nrBodyParts == 1 && (firstTagName == 'pre' || firstTagName == 'embed'))
				manager.init_failed = true;

			// images
			if(nrBodyParts == 5 && firstTagName == 'table' && allBodyParts[4].tagName && allBodyParts[4].tagName.toLowerCase() == 'img')
				manager.init_failed = true;

			if(!manager.init_failed)
				dochead = document.body;
		}

		if(manager.init_failed)
			return false;

		// add the CSS
		if(!document.getElementById('ujs_sticky_css'))
		{
			var css_txt_node = document.createTextNode(manager.css);
			var style_elem = document.createElement("style");
			style_elem.type = "text/css";
			style_elem.id = "ujs_sticky_css";
			style_elem.appendChild(css_txt_node);
			dochead.appendChild(style_elem);
		}

		// if the user wants to double-click anywhere on the page just to post a sticky
		if(manager.post_2click)
			document.documentElement.addEventListener('dblclick', manager.post, false);

		// get ready to read the stickies
		var cname, tmp, content, cvalue, time, params, cookie, cookies = document.cookie.split(';');
		var nr_cookies = cookies.length;
		for(var i=0; i < nr_cookies; i++)
		{
			cookie = manager.trim(cookies[i]);
			tmp = cookie.indexOf('=');

			// get the cookie name
			cname = manager.trim(cookie.substr(0, tmp));

			// check if it's something for this script
			if(cname.indexOf('ujs_sticky_') != 0)
				continue;

			// get the time when the sticky was posted
			time = parseInt(cname.substr(11));

			// if it's not a number, then this is a bogus cookie
			if(isNaN(time))
				continue;

			// get the value of the cookie
			cvalue = unescape(cookie.substr(tmp+1));
			tmp = cvalue.indexOf("]");

			// get the [p,a,r,a,m,e,t,er,s]
			params = cvalue.substr(1, tmp-1).split("\n");

			// unescape the URL
			params[4] = unescape(params[4]);

			// if the cookie is not for the entire domain and if the URL doesn't match the current URL
			// just skip the sticky
			if(params[5] != 1 && manager.niceURL(params[4]) != manager.url)
				continue;

			// get the content of the sticky
			content = cvalue.substr(tmp+1);

			// parse the numbers from the sticky
			params[0] = parseInt(params[0]);
			params[1] = parseInt(params[1]);
			params[2] = parseInt(params[2]);
			params[3] = parseInt(params[3]);
			params[6] = unescape(params[6]);
			params[8] = parseInt(params[8]);
			params[9] = parseInt(params[9]);

			// force the Allow XHTML setting based on user configuration
			if(manager.allow_xhtml == 1)
				params[7] = 1;
			else if(manager.allow_xhtml == 2)
				params[7] = 0;

			// force minimization based on user configuration
			if(manager.minimize_stickies == 1)
				params[8] = 1;
			else if(manager.minimize_stickies == 2)
				params[8] = 0;

			// add the sticky
			manager.bag.push(new manager.sticky(manager.bag.length, time, content, params));
		}
	}

	// generally used function :)
	manager.trim = function (s)
	{
		return s.replace(/^\s+/, '').replace(/\s+$/, '');
	}

	// function to do a small clean-up in the URL
	manager.niceURL = function (url)
	{
		if(url)
			var pos = url.indexOf("?");
		else
			return url;

		// eliminate the parameters, if the user wants so
		if(pos != -1)
		{
			// all parameters
			if(!manager.params_in_url)
				return url.substr(0, pos);

			// only some parameters
			url = url.replace(manager.niceURLre, '\\1');
		}

		// eliminate the #fragment identifier
		pos = url.lastIndexOf("#");
		if(pos != -1)
			return url.substr(0, pos);

		return url;
	}

	// function to create a cookie
	manager.createCookie = function (name, value, days)
	{
		if (days)
		{
			var date = new Date();
			date.setTime(date.getTime()+days*24*60*60*1000);
			var expires = "; expires="+date.toGMTString();
		} else var expires = "";
		document.cookie = name+"="+escape(value)+expires+"; path=/";
	}

	// function that adds a string to a node
	// if html = true, then the string is treated as XHTML code
	// parsing of the string is done with DOM 3 Load and Save and it doesn't make use of .innerHTML
	manager.stringToNode = function (str, toNode, html)
	{
		if (html)
		{
			// differences between strict mode and quirks mode
			if(document.compatMode == 'CSS1Compat')
				str = str.replace(/\n/g, "<br />");
				
			// I use error handling because if the string is not valid XHTML the DOM 3 LS parser will throw an exception
			try
			{
				manager.DOM3LS_input.stringData = '<div xmlns="http://www.w3.org/1999/xhtml">'+str+'</div>';
				var doc = manager.DOM3LS_parser.parse(manager.DOM3LS_input);
				doc = doc.documentElement;
				var nodes = doc.childNodes.length;
				for(var i=0; i<nodes; i++)
					toNode.appendChild(document.importNode(doc.childNodes.item(i), true));
				return true;
			} catch (err)
			{
				if(document.compatMode == 'CSS1Compat')
					str = str.replace(/\<br \/\>/g, "\n");
			}
		}

		// just insert the string AS IS
		var linesArray = str.split("\n");
		var lines = linesArray.length;
		for(var i=0; i<lines; i++)
		{
			toNode.appendChild(document.createTextNode(manager.trim(linesArray[i])));
			toNode.appendChild(document.createElement('br'));
		}

		return true;
	}

	// check if target is a sticky
	manager.isTargetSticky = function (target)
	{
		if(target && target.className && target.className.indexOf("ujs_sticky") == 0)
			return true;
		else
		{
			// loop through the DOM
			if(target && target.parentNode)
				return manager.isTargetSticky(target.parentNode);
			else
				return false;
		}
	}

	// the sticky object
	manager.sticky = function (bag_id, time, content, params)
	{
		var obj = this;
		obj.bag_id = bag_id;
		obj.date = new Date(time);
		obj.time = time;
		obj.x = params[0];
		obj.y = params[1];
		obj.width = params[2];
		obj.height = params[3];
		obj.url = params[4];
		obj.minimized = params[8];
		obj.fixedpos = params[9];
		obj.editMode = false;
		obj._mx = 0;
		obj._my = 0;

		// don't allow fixed positioning on Opera 8, it goes mad :)
		if(opera && opera.version() < 9)
			obj.fixedpos = 0;

		// the sticky parent node
		obj.node = document.createElement("div");
		obj.node.className = 'ujs_sticky';
		obj.node.id = "ujs_sticky_" + obj.time;
		obj.node.style.left = obj.x + 'px !important';
		obj.node.style.top = obj.y + 'px !important';
		obj.node.title = manager.messages[2] + obj.date.toUTCString();
		document.body.appendChild(obj.node);

		// the minimize button
		obj.minimizeLink = document.createElement("a");
		obj.minimizeLink.className = 'ujs_sticky_minimize';
		obj.minimizeLink.appendChild(document.createTextNode(manager.messages[(16+obj.minimized*2)]));
		obj.minimizeLink.title = manager.messages[(17+obj.minimized*2)];
		obj.node.appendChild(obj.minimizeLink);

		// the link for changing type of positioning: fixed or absolute
		obj.positionLink = document.createElement("a");
		obj.positionLink.className = 'ujs_sticky_position';
		obj.positionLink.appendChild(document.createTextNode(manager.messages[(20+obj.fixedpos*2)]));
		obj.positionLink.title = manager.messages[(21+obj.fixedpos*2)];
		obj.node.appendChild(obj.positionLink);

		// the Remove Sticky link
		obj.removeLink = document.createElement("a");
		obj.removeLink.className = 'ujs_sticky_remove';
		obj.removeLink.appendChild(document.createTextNode(manager.messages[6]));
		obj.removeLink.title = manager.messages[5];
		obj.node.appendChild(obj.removeLink);

		// the title bar
		obj.titleBar = document.createElement("div");
		obj.titleBar.className = 'ujs_sticky_titlebar';
		obj.titleBar.title = manager.messages[3];
		obj.titleBar.appendChild(document.createTextNode(params[6]));
		obj.node.appendChild(obj.titleBar);

		// the resize handler
		obj.resize = document.createElement("div");
		obj.resize.className = 'ujs_sticky_resize';
		obj.resize.title = manager.messages[4];
		obj.node.appendChild(obj.resize);

		// the sticky content
		obj.content = document.createElement("div");
		obj.content.title = obj.node.title;
		obj.content.className = 'ujs_sticky_content';

		if(manager.edit_1click)
			obj.content.title  += manager.messages[11];
		else
			obj.content.title  += manager.messages[12];

		manager.stringToNode(content, obj.content, params[7] == 1 ? true : false);
		obj.node.appendChild(obj.content);

		// a group which holds all the stuff for edit mode
		obj.editGroup = document.createElement("div");
		obj.editGroup.className = "ujs_sticky_editgroup";
		obj.editGroup.style.display = 'none !important';
		obj.node.appendChild(obj.editGroup);

		// the title input
		obj.titleInput = document.createElement("input");
		obj.titleInput.className = 'ujs_sticky_titleinput';
		obj.titleInput.title = manager.messages[15];
		obj.titleInput.type = "text";
		obj.titleInput.value = params[6];
		obj.editGroup.appendChild(obj.titleInput);

		// the text area
		obj.textarea = document.createElement("textarea");
		obj.textarea.value = content;
		obj.textarea.title = manager.messages[28];
		obj.editGroup.appendChild(obj.textarea);

		// the XHTML checkbox :)
		obj.xhtmlInput = document.createElement('input');
		obj.xhtmlInput.type = 'checkbox';
		obj.xhtmlInput.id = "ujs_sticky_h" + obj.time;
		obj.xhtmlInput.checked = params[7] == 1 ? true : false;
		obj.editGroup.appendChild(obj.xhtmlInput);

		// if the user wants to force (no) XHTML, then I simply hide the checkbox and I don't add the label
		if(manager.allow_xhtml == 1 || manager.allow_xhtml == 2)
			obj.xhtmlInput.style.display = 'none !important';
		else
		{
			// add the label for the "Allow XHTML" checkbox
			var tmp = document.createElement('label');
			tmp.title = manager.messages[13];
			tmp.setAttribute('for', obj.xhtmlInput.id);
			tmp.appendChild(document.createTextNode(manager.messages[7]));
			obj.editGroup.appendChild(tmp);
		}

		// Per domain checkbox
		obj.domainInput = document.createElement('input');
		obj.domainInput.type = 'checkbox';
		obj.domainInput.id = "ujs_sticky_d" + obj.time;
		obj.domainInput.checked = params[5] == 1 ? true : false;
		obj.editGroup.appendChild(obj.domainInput);

		// label for Per domain checkbox
		var tmp = document.createElement('label');
		tmp.setAttribute('for', obj.domainInput.id);
		tmp.title = manager.messages[14];
		tmp.appendChild(document.createTextNode(manager.messages[8]));
		obj.editGroup.appendChild(tmp);

		// the Save button
		obj.saveLink = document.createElement("a");
		obj.saveLink.appendChild(document.createTextNode(manager.messages[9]));
		obj.saveLink.title = manager.messages[10];
		obj.saveLink.className = 'ujs_sticky_save';
		obj.saveLink.id = 'ujs_sticky_s'+obj.time;
		obj.editGroup.appendChild(obj.saveLink);

		// fixed positioning :)
		if(obj.fixedpos == 1)
			obj.node.style.position = 'fixed !important';

		// minimize the sticky, if needed
		if(obj.minimized == 1)
		{
			obj.resize.style.display = 'none !important';
			obj.content.style.display = 'none !important';
		}

		if(manager.minimize_2click)
			obj.titleBar.title += " " + manager.messages[(26+obj.minimized)];

		// the function which starts the editing mode
		obj.startEdit = function(e)
		{
			// if the clicked target is a link, don't start editing
			if(e && e.target && e.target.tagName && e.target.tagName.toLowerCase() == 'a')
				return;

			// check if the user clicked the scroll bars (if the content has scrollbars
			// if s/he did so, then don't start editing
			if(e && e.clientX)
			{
				var scroll_w = obj.content.offsetWidth-obj.content.clientWidth;
				var max_x = obj.x+obj.content.offsetWidth-window.pageXOffset;
				var min_x = max_x-scroll_w;
				if(scroll_w > 0 && e.clientX >= min_x && e.clientX <= max_x)
					return;
			}
			if(e && e.clientY)
			{
				var scroll_h = obj.content.offsetHeight-obj.content.clientHeight-1;
				var max_y = obj.y+obj.content.offsetHeight+manager.ttlHeight-window.pageYOffset;
				var min_y = max_y-scroll_h;
				if(scroll_h > 0 && e.clientY >= min_y && e.clientY <= max_y)
					return;
			}

			obj.editMode = true;

			if(manager.click_to_save)
				document.documentElement.addEventListener('click', obj.stopEdit, false);

			if(obj.textarea.value == manager.messages[0] || manager.trim(obj.textarea.value) == '')
				obj.textarea.value = '';

			// bring to top
			obj.node.style.zIndex = ++manager.z;

			// visual stuff
			obj.editGroup.style.display = 'block !important';
			obj.content.style.display = 'none !important';
			obj.titleBar.style.display = 'none !important';

			obj.textarea.focus();

			e.preventDefault();
		}

		// the function that stops editing and saves
		obj.stopEdit = function(e)
		{
			if(!obj.editMode)
				return false;

			// don't stop editing if the clicked target is a sticky
			// except for the case when the target is the Save button of this specific sticky
			if(e && e.target && e.target.id != obj.saveLink.id && manager.isTargetSticky(e.target))
				return false;

			if(e)
				e.preventDefault();

			if(manager.click_to_save)
				document.documentElement.removeEventListener('click', obj.stopEdit, false);

			// content cleanup
			obj.textarea.value = manager.trim(obj.textarea.value);
			if(obj.textarea.value == '')
				obj.textarea.value = manager.messages[0];
			obj.textarea.value.replace("\r", '');

			// title cleanup
			obj.titleInput.value = manager.trim(obj.titleInput.value);
			if(obj.titleInput.value == '')
				obj.titleInput.value = obj.date.toUTCString();

			// visual stuff
			obj.editGroup.style.display = 'none !important';
			obj.content.style.display = 'block !important';
			obj.titleBar.style.display = 'block !important';

			// update the sticky content and title
			obj.titleBar.removeChild(obj.titleBar.firstChild);
			obj.titleBar.appendChild(document.createTextNode(obj.titleInput.value));

			while(obj.content.hasChildNodes())
				obj.content.removeChild(obj.content.childNodes.item(0));
			manager.stringToNode(obj.textarea.value, obj.content, obj.xhtmlInput.checked);

			obj.editMode = false;

			obj.save();

			return true;
		}

		// the function that saves the sticky in a cookie
		obj.save = function()
		{
			if(obj.deleted)
				return false;
			manager.createCookie(
				'ujs_sticky_' + obj.time,
				'[' +
					obj.x + "\n" +
					obj.y + "\n" +
					obj.width + "\n" +
					obj.height + "\n" +
					escape(obj.url) + "\n"+
					(obj.domainInput.checked ? "1" : "0") + "\n" +
					escape(obj.titleInput.value) + "\n" +
					(obj.xhtmlInput.checked ? "1" : "0") + "\n" +
					obj.minimized + "\n" +
					obj.fixedpos +
				']' +
				obj.textarea.value,
				3650
			);
		}

		// the function that starts the drag
		obj.startDrag = function(e)
		{
			obj._mx = e.clientX;
			obj._my = e.clientY;
			obj._px = window.pageXOffset;
			obj._py = window.pageYOffset;

			// bring to top
			obj.node.style.zIndex = ++manager.z;

			document.addEventListener('mousemove', obj.trackDrag, false);
			document.addEventListener('mouseup', obj.stopDrag, false);

			e.preventDefault();
			obj.redraw();
		}

		// keep tracking while dragging
		obj.trackDrag = function(e)
		{
			// update position
			obj.x += e.clientX - obj._mx;
			obj.y += e.clientY - obj._my;

			// store the new position for comparision after redraw (in case it's out of bounds)
			if(!manager.turbo_mode)
				var ox = obj.x, oy = obj.y;

			obj.redraw(1);

			// if not in turbo mode, make some checks, to try to keep the mouse in sync with the sticky
			if(!manager.turbo_mode)
			{
				// if the position calculated by this function has been accepted, then update mouse position
				if(obj.x == ox)
					obj._mx = e.clientX;
				if(obj.y == oy)
					obj._my = e.clientY;

				// page scrolling
				var px = window.pageXOffset, py = window.pageYOffset;

				// in case of scrolling
				if(px != obj._px)
				{
					if(px < obj._px)
						obj._mx -= px-obj._px;
					else
						obj._mx += obj._px-px;
					obj._px = px;
				}
	
				if(py != obj._py)
				{
					if(py < obj._py)
						obj._my -= py-obj._py;
					else
						obj._my += obj._py-py;
					obj._py = py;
				}
			} else
			{
				obj._mx = e.clientX;
				obj._my = e.clientY;
			}
		}

		obj.stopDrag = function(e)
		{
			document.removeEventListener('mousemove', obj.trackDrag, false);
			document.removeEventListener('mouseup', obj.stopDrag, false);
			obj.redraw();
			obj.save();
		}
		obj.startResize = function(e)
		{
			// stop editing, if needed
			obj.stopEdit();

			obj._mx = e.clientX;
			obj._my = e.clientY;
			obj._px = window.pageXOffset;
			obj._py = window.pageYOffset;

			// bring to top
			obj.node.style.zIndex = ++manager.z;

			document.addEventListener('mousemove', obj.trackResize, false);
			document.addEventListener('mouseup', obj.stopResize, false);

			e.preventDefault();
			obj.redraw();
		}
		obj.trackResize = function(e)
		{
			obj.width += e.clientX - obj._mx;
			obj.height += e.clientY - obj._my;

			// store the new size for comparision after redraw (in case it's out of bounds)
			if(!manager.turbo_mode)
				var ow = obj.width, oh = obj.height;

			obj.redraw(2);

			// if not in turbo mode, make some checks, to try to keep the mouse in sync with the sticky
			if(!manager.turbo_mode)
			{
				// if the size calculated by this function has been accepted, then update mouse position
				if(obj.width == ow)
					obj._mx = e.clientX;
				if(obj.height == oh)
					obj._my = e.clientY;

				// page scrolling
				var px = window.pageXOffset, py = window.pageYOffset;

				// in case of scrolling
				if(px != obj._px)
				{
					if(px < obj._px)
						obj._mx -= px-obj._px;
					else
						obj._mx += obj._px-px;
					obj._px = px;
				}
	
				if(py != obj._py)
				{
					if(py < obj._py)
						obj._my -= py-obj._py;
					else
						obj._my += obj._py-py;
					obj._py = py;
				}
			} else
			{
				obj._mx = e.clientX;
				obj._my = e.clientY;
			}
		}
		obj.stopResize = function(e)
		{
			document.removeEventListener('mousemove', obj.trackResize, false);
			document.removeEventListener('mouseup', obj.stopResize, false);
			obj.redraw();
			obj.save();
		}

		// Redraw the sticky
		// The function makes sure the sticky won't be too small, too big or out of the view
		obj.redraw = function(fast)
		{
			// update the sticky node without any checks while dragging and resizing
			// only if allowed by user
			if(fast && manager.turbo_mode)
			{
				if(fast == 1)
				{
					obj.node.style.left = obj.x + 'px !important';
					obj.node.style.top = obj.y + 'px !important';
				} else
				{
					obj.content.style.width = obj.width + 'px !important';
					obj.content.style.height = obj.height + 'px !important';
				}
				return true;
			}
			
			// if no need to be fast, then update max_x and max_y
			if(!fast)
			{
				// i need to know the full width and height of the entire page
				// due to a bug in Opera, scroll/offset Width is not reporting the full width

				if(document.compatMode == 'CSS1Compat')
				{
					manager.max_x = document.body.offsetWidth;
					manager.max_y = document.body.offsetHeight;
				} else
				{
					manager.max_x = document.documentElement.scrollWidth;
					manager.max_y = document.documentElement.scrollHeight;
				}

				// the page might be smaller than the full window
				if(manager.max_x < window.innerWidth || obj.fixedpos == 1)
					manager.max_x = window.innerWidth;
				if(manager.max_y < window.innerHeight || obj.fixedpos == 1)
					manager.max_y = window.innerHeight;

				// substract scroll bars and the width/height of the resize handler
				manager.max_x -= window.innerWidth-document.body.clientWidth+manager.resizer_w+manager.sub_x+manager.contentPadding*2;
				manager.max_y -= window.innerHeight-document.body.clientHeight+manager.resizer_h+manager.sub_y+manager.contentPadding*2;
			}

			// check width
			if(obj.width < manager.min_width)
				obj.width = manager.min_width;
			if(obj.width > manager.max_width)
				obj.width = manager.max_width;

			// check height
			if(obj.height < manager.min_height)
				obj.height = manager.min_height;
			if(obj.height > manager.max_height)
				obj.height = manager.max_height;

			// check positioning
			if(obj.x < manager.min_x)
				obj.x = manager.min_x;
			if(obj.y < manager.min_y)
				obj.y = manager.min_y;

			// check if it won't be outside the view
			var sumx = obj.x+obj.width;
			if(sumx > manager.max_x)
			{
				// making the sticky smaller
				if(obj.width > manager.min_width)
				{
					obj.width -= sumx-manager.max_x;
					if(obj.width < manager.min_width)
						obj.width = manager.min_width;
				}

				// if it's not enough, move the sticky
				sumx = obj.x+obj.width;
				if(sumx > manager.max_x)
					obj.x -= sumx-manager.max_x;
			}
			
			// like above, but for Y :)
			var sumy = obj.y+obj.height+manager.ttlHeight;
			if(sumy > manager.max_y)
			{
				if(obj.height > manager.min_height)
				{
					obj.height -= sumy-manager.max_y;
					if(obj.height < manager.min_height)
						obj.height = manager.min_height;
				}
				sumy = obj.y+obj.height+manager.ttlHeight;
				if(sumy > manager.max_y)
					obj.y -= sumy-manager.max_y;
			}

			// finally update the sticky node
			if(fast != 1 || obj.minimized != 1)
			{
				// update obj.content only if *not* redrawing while dragging *and* the sticky is minimized
				// because it's useless and would only slow down the dragging
				obj.content.style.width = obj.width + 'px !important';
				obj.content.style.height = obj.height + 'px !important';
			}

			// if minimized, we gotta set the width of the node
			if(obj.minimized == 1)
			{
				if(document.compatMode == 'CSS1Compat' || (opera && opera.version() >= 9))
					obj.node.style.width = (obj.width+manager.contentPadding*2) + 'px !important';
				else
					obj.node.style.width = obj.width + 'px !important';
			}

			// update .x and .y position of the sticky only while *not* resizing
			if(fast != 2)
			{
				obj.node.style.left = obj.x + 'px !important';
				obj.node.style.top = obj.y + 'px !important';
			}

			// update the textarea size only if in 'slow mode'
			if(!fast)
			{
				obj.textarea.style.width = obj.width + 'px !important';
				obj.textarea.style.height = obj.height + 'px !important';
			}
		}

		obj.remove = function(e)
		{
			obj.stopEdit();

			// bring to top
			obj.node.style.zIndex = ++manager.z;

			// ask for confirmation, if the user wants so, or directly remove it if the sticky has no content
			if(obj.textarea.value != manager.messages[0] && manager.trim(obj.textarea.value) != '' && manager.remove_confirm && !confirm(manager.messages[1]))
				return false;

			// remove the sticky from the document
			document.body.removeChild(obj.node);

			// tell this sticky it has been deleted :), sometimes the sticky can kick back due to other event listeners that do save()
			obj.deleted = true;

			// remove the sticky cookie
			manager.createCookie('ujs_sticky_' + obj.time, "", -1);

			// delete the sticky object
			delete manager.bag[obj.bag_id];
		}

		// the function that switches from/to minimize
		obj.switchMinimize = function ()
		{
			obj.stopEdit();
			if(obj.minimized == 1)
			{
				obj.minimized = 0;
				obj.content.style.display = 'block !important';
				obj.resize.style.display = 'block !important';
				obj.node.style.width = 'auto !important';
			} else
			{
				obj.minimized = 1;
				obj.content.style.display = 'none !important';
				obj.resize.style.display = 'none !important';
			}

			// bring to top
			obj.node.style.zIndex = ++manager.z;

			// update the tool tip of the sticky title (in view mode, not editing mode)
			if(manager.minimize_2click)
				obj.titleBar.title = manager.messages[3] + " " + manager.messages[(26+obj.minimized)];

			// update the link
			obj.minimizeLink.removeChild(obj.minimizeLink.firstChild);
			obj.minimizeLink.appendChild(document.createTextNode(manager.messages[(16+obj.minimized*2)]));
			obj.minimizeLink.title = manager.messages[(17+obj.minimized*2)];

			obj.redraw();
			obj.save();
		}

		// the function that switches from/to absolute or fixed positioning
		obj.changePosition = function ()
		{
			// this is not allowed in Opera 8, due to many bugs
			if(opera && opera.version() < 9)
			{
				alert(manager.messages[25]);
				return false;
			}

			obj.stopEdit();
			if(obj.fixedpos == 1)
			{
				obj.fixedpos = 0;
				obj.node.style.position = 'absolute !important';
				obj.x += window.pageXOffset;
				obj.y += window.pageYOffset;
			} else
			{
				obj.fixedpos = 1;
				obj.node.style.position = 'fixed !important';
				obj.x -= window.pageXOffset;
				obj.y -= window.pageYOffset;
			}

			// bring to top
			obj.node.style.zIndex = ++manager.z;

			// update the link
			obj.positionLink.removeChild(obj.positionLink.firstChild);
			obj.positionLink.appendChild(document.createTextNode(manager.messages[(20+obj.fixedpos*2)]));
			obj.positionLink.title = manager.messages[(21+obj.fixedpos*2)];

			obj.redraw();
			obj.save();
		}

		// add all the required event listeners
		obj.minimizeLink.addEventListener('click', obj.switchMinimize, false);
		obj.positionLink.addEventListener('click', obj.changePosition, false);
		obj.removeLink.addEventListener('click', obj.remove, false);
		obj.titleBar.addEventListener('mousedown', obj.startDrag, false);
		if(manager.minimize_2click)
			obj.titleBar.addEventListener('dblclick', obj.switchMinimize, false);
		if(manager.edit_1click)
			obj.content.addEventListener('click', obj.startEdit, false);
		else
			obj.content.addEventListener('dblclick', obj.startEdit, false);
		obj.saveLink.addEventListener('click', obj.stopEdit, false);

		if(manager.allow_xhtml == 3)
			obj.xhtmlInput.addEventListener('change', obj.save, false);

		obj.domainInput.addEventListener('change', obj.save, false);
		obj.textarea.addEventListener('blur', obj.save, false);
		obj.resize.addEventListener('mousedown', obj.startResize, false);

		obj.redraw();

		// bring to top
		obj.node.style.zIndex = ++manager.z;

		return obj;
	}
	
	manager.url = manager.niceURL(document.URL);

	manager.css = ".ujs_sticky " +
"{ " +
"	display:block !important; " +
"	color:" + manager.textColor + " !important; " +
"	position:absolute !important; " +
"	font-weight:normal !important; " +
"	border:1px solid " + manager.borderColor + " !important; " +
"	background:" + manager.bgrColor;
	if(manager.bgrImage)
	{
		manager.css +=
		  " url('data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%01%2C%00%00"
		+ "%01%2C%08%06%00%00%00y%7D%8Eu%00%00%00%04gAMA%00%00%C4v%9D%D5%A6%0E%00%0"
		+ "0%00%20cHRM%00%00o%40%00%00r%87%00%00%F6%18%00%00%84%CE%00%00y%16%00%00%"
		+ "E8m%00%00%3C%8B%00%00%1BW%BE%03s%EB%00%00%00%09pHYs%00%00.%23%00%00.%23%"
		+ "01x%A5%3Fv%00%00%09%01IDATx%DA%ED%DD%CB%AE%DB0%0CEQ7%A3%B6%FF%FF%BDI%A7E"
		+ "P%A0%81%23J%7C%AC%03%EC%E1%BD%B1%E5%E8%84%A4(%F9%F1z%BD~%22%8C_%03%F9%FD"
		+ "%C6%C41%F0%DD%0F%E2q%5D%D7%0F%8C%E2%11%CC%E9%CFCc%1E%17%11Q%11%F9%85%9A%"
		+ "17%3D%B9g%94%8E%B0%0CD%9F%89j%5C%8C%95%94%90%88HJ%E8W%5C%84%E0yA%84ED%22"
		+ "%2C%00Pt%C7%7FR%8A%8E%FDZ%19W%F6%A4qRB%22%22)!b%23%27%D7%09)!%B6%AF(Mk%1"
		+ "C%D5%BF%25%25%24%22%92%12BD%60%0C%20%2541a%AC%18%16%E6N%1C%C7%C40%3F5%2C"
		+ "%22%225%2C%91Y%B5%23Zv_%83HIJ%08%E6%E7%DA!%25%24%22%F2%0BU%24%92%D08j%AC"
		+ "%20%25%94%9A%C0w%86a%E1%D4%2Fv%86I%91%ED%F3%1F%03%EE%99a%C1%CA%E1u%F65_%"
		+ "A2%1B0%2C%A9B%99%09m%5C%60%95%90%88%AC%12BD%E7%DA!%25%C4%D7%13U%5B%03%F3"
		+ "cX%00%C0%B0%B0%9Awu%BA%97%EB%C3%FB%A3F5%2C%EA%A3U%93%FE%EE%FF%3EaF%10a%E1p-"
		+ "j%E2%2B%AF%AA%DC%B3%DA%17%C3%C2%E1%15%B3%EE%7DXL%86a%81%D1%B9v0%2C%00%60"
		+ "XC%7F%FD%2B%EC7%EC%B6%F1X%24hk%0E%11ik%E0%DA%15~%8D%BB%9D%B1%9E%F5%0Cy%9"
		+ "1%92%94%10%05R%91N%AB%84L%86a%01%00%C3%82%82%B0b6%14%DD%89H%D1%1Dg%8E%3E"
		+ "%D1F%91%7BK%94%A8OJ%88d%06%12%7D%A6%7B%27%83%04%C3B%F3H%89%F1%80a%0Dk%3B"
		+ "%D0%D60s%AC%18%16%000%2Ch%0D%D0%D6%00%86%C5%40%92%5C%7B%86m7%9E%0D%C3B%1"
		+ "0%FFR%E5k%FFD%91c%F5%E9%E7Q%D1%3E%2C%3A%AB%BB%93i%E5%84%CEh%9A%95%8D%1C%"
		+ "22%2C%00%0C%CB%20%E8%81%EA%7F%A6%BB%5E0%86%05Ebc%00%86%85%D8I%B8%FB%20%B"
		+ "EJ%D7%EE%BB%C6%B0%C04%99%05%18%16%CE%9F%181%F1%3A%E1%3C%2C%22%A2%CF%FA%B"
		+ "08%B7%14%CDXAJ%882%DBT%B45%F4%7B%A6%0C%0B~%FD%87%D5%94%98%11%C3b%3C%1B%0"
		+ "B%D0%2B%DF%B5%97%E1%C4%D1%E8w%09Z%05eX%00%C0%B0Do%DA%1A%A2%A3Q0%2C%A8%D5"
		+ "0%140%2C%26cL%8C%15%C3%02%D2%EC%25%04%C3%22%22%D2%E9%8E%9C%A9O%86%D7%5Be"
		+ "mk%80%94%10%1A%40mb%C6%3A%C3%02V6%80F~%5Et%5BC%95%B3%BC%D4%B0%E8%98%3EyP"
		+ "%2B%FF%FF%89kX5%0E%2B%D9%7D%0D%19%EEYJ(%5D%DA%F2kYy%23%B0%0D%DF%22%2C%86"
		+ "%C5%E8%B6%17%CF%5D%3B%E3aX%00%C0%B0Dp%A7N%8C8%FDy%22%20%86%05K%F5%F0%9C%"
		+ "19%16rL%A6%8C%91Yt%5B%03%B45%10%11%C5%C9%2F%12%B2n%05%02%A4%84%18%D9%D6%"
		+ "00%86%85%E6%0D%99%9D%F6%12%3A%06%87a%A1Q3%A9%F14%9E%0C%0B%B6%1A1%0B0%2CH"
		+ "%B5%B450%2C%40%AA%05%86eBg%9A%A8%95%CD%A2%CA%F81d%86%85F%A9%A4%D4%0E%3A%"
		+ "DD%89H%A7%3B%EA%F4e%19%2B%E3%27%25%84.%F6%03%AB%84%BA%E1%C1%B0%06%D6%8F2"
		+ "%AE%ECe%3D%B7%8B%D11%2C%00Pt%27%22Ew%14%A9%3Bu%3B%18o%F7A%83%EAaRB%A8%89"
		+ "x%CE%C6%83a%C1%E4%05%18%96T2%BC%85%C0%BB%04%C1%B0%98%D3%ED%BE%A8%EEm%0D%"
		+ "DF%8C%95%EF%9AUB%22%22%AB%84%00%A4%84h%DER%A0%AD%A1Vk%05%A4%84D%24%25%04"
		+ "%00)!%92%B6Hd%3C%AD%01%0C%0B%D0%17%055%2C%22%225%AC%A1%11%8F%C8%C5%B8H%0"
		+ "9Q%FAD%80%BB%FF%BB%CAK(2%B4%80%80aA%FD%C88%40%0D%8B%88%D4%B0%00%C7%CB%40"
		+ "J%88Z%7DX%19%8F%97%81%94%90%88HJ%88%9C%91%C5%84%82%B7%88NJ%08%00RB%22%92"
		+ "%12ba%9As%BA%F9%F2%9Bk%A8%DA8Z%7D%DC!%25%D4%F8%B8%B1~%94%B1%F3%5C%C3%A9%"
		+ "94%90%88HJ%88%5E%11%A3%88%04%22%2C%22%12a%C1%89%0E%3B%22%A5%0C%91%99%C8O"
		+ "%D1%1D%26%8Eg%03)!%11%91_%0C%94%EF%C3%82%08%8B%88H%84%05%1D%D7%EE%19%22%"
		+ "2C%22%12a%A1_%FD(%BA%3D!2%E2%A9%BC%AD%08%22%2C%22%12a%A1B%7FN%F7%0D%BD%D"
		+ "D%EEOmM%E3(%18%08%A4%84DDRB%00%10a%11%D1%90%08%8B%88HJ%88%D2%2BL%D3%3E%C"
		+ "F%5C%90%12%12%11I%09%89HJ%88%01%E9%A4%CF%83%94%90%88HJHD%F4%97a%BD%D0%9A"
		+ "%E7%1B%3E%0Fe%11a%11%91%94%90%88HJ(%AD%93%DA%D5%1DSH%09%89HJHD%24%25%04%"
		+ "00)!%11%89%B0%80%E5Ej%05o%DC%8E%B0%0CD%CD%09%D7%DD%40%BA%DD%1F%93%96%12%"
		+ "12%91%94%10%9D%B7%D3DG.%9F%905J%11%01%89%B0%88%88DX%B8%17%F1%B8g%88%B0%8"
		+ "8%88DXp%2C%0D%20%C2%22%22%11%16%F4%E7x6%D08j%E2%5Cg%5B%1Dv%B7%27d%B8gH%0"
		+ "9%89%88%A4%84%C8%19%F9%89d%20%C2%22%22%11%16%FAo%E8%AD%BC%BD%25%C3%3D%8B"
		+ "%18EXDD%22%ACi%5BDV%5EC%95%C6%D1n%E3%0Em%0D%00%18%16%26mS%99P%07%12%15%A"
		+ "9a%11%11%A9a%A1%C6%EA%5B%D6%D5L%88%B0%88%88DXP%7F%03%14%DD%9B%A7l%DDR-"
		+ "%E3%C0%B0%0CB%A3I%18%D9%DFT%A5%0F%CB%89%0E%0C%0BE%8C%CE%043.%8A%EEDD%8A%"
		+ "EEPG%13%F1%40J%88M%06%12%F9%22U%A6%06)!%11I%09%01%40J84%F5%CA%B0T%9F%B1%"
		+ "AD!C%0B%88T%95a%01%80%1A%16%11%A9a%A1H*%99%B5%15!%FA%7FI%ED%A4%84h%D2%8A"
		+ "0%F1x%19%E6%C4%B0%00%A75%80a%99%BC%F0%9C%C1%B0%06%A4v%DA%1A%9C%D6%60%95%"
		+ "90%88%C8*!%00H%09%D5D%02%FEW%95%B6%06%B5(%86%85%E6%F5%B0N%A75%A8%3B1%2C%"
		+ "244%22%13%D3%F8)%BA%13%11)%BACo%91%FA%11%A4%84%A5%EAG%19%D2%10%AF%F9%9A%"
		+ "F1%9C%19%16%18%F2eo%1F%18%16%8A%A6Z%91%AB%84RI0%2C%94%89xDa%60XR-"
		+ "%E3i%3C%19%16%A4ZRW0%2C%94%EF%86%D7%C5%0E%86%05%AD%1C%D0%E9ND%A4%D3%1D%A"
		+ "9%DB%1A2%9E%9E%90%F5%A0AH%09%F5%40%C1s%06%C3RS%9A%B7J%A8f%C6%B0%00%80a%8"
		+ "9%80%EA%B4%06%B8v%11%9CUB%22%22%AB%84%BD%F6%B9e%FDU%AF%DCA%EE%19J%09%114"
		+ "%E9%2B%B55%EC%9E%E0%91c%C5d%18%16%000%2C%D8%FC%0C%86%85f%B5%B5%EE%AB%84%"
		+ "D28%86%058%B6%05%0C%0BV%9D%8C%15%18%16%CAOh%26%03%865%D0Pv%FF%DD%EE%A2%F"
		+ "B%AA%BFc%88%3A%DD%89%88t%BA%03%90%12%22I%CD%252%CDY%D9Rp%F7%F3%B2%B65%D8"
		+ "%20%CD%B00%EC%CB%DD%F9%5E%18%0F%C3%B2O%D0%C4l%B7%E1%DBw%9Fa%C1%AF%BF%B1b"
		+ "X%06%C1%9E%C0%99m%0D%60X%10%A5%88x%C0%B0%98EN%B3%D8%BD%97%90i2%2C%83%C0%"
		+ "D8%8C%01t%BA%13%11%E9tW(%D7%D6%A0%87LJ%08%00%0C%0BG%23%90%95%DB%7Cv%16%E"
		+ "BWFE%EAZ%0C%0B%8A%C4%EDO%1Cet%0C%0B%26!%03%01%C3%02%C0%B0%90%20B%B8%5B%A"
		+ "Fz%16%8E%5C%8C%15%18%16%DA%ED%25%04%C3%02%E3%B9%5D%60_%F5w%8C%0E%0C%AB%8"
		+ "8YT%5E%AA%AF%7C%DE%97%13%23l%CD!%22Z%23%11%96%A8O%5B%03%A4%84%00%C0%B0p%"
		+ "B2%15%C0%BD%80a1%99%D0WWe%D8%EF%B7%F3%7FW%1Fw(%BA%13%91%A2%3B%A6%B7%19d%"
		+ "D8%FC%EC%B5iRB%00%60X%F0%EB%2Fr%01%C3b%3C%ED%DE%20%E3%0D9%60XE%26a%86%C9"
		+ "5q%F3%B3%D3K%AD%12%12%11Y%25%C4%DE_%FFg0%EA%5C%90%12%02%60X%A8%139u%8F6V"
		+ "%BE%15%C8w%8DaAk%80k%87%A2%3B%11)%BAc%60%D4%E0U%F5%22%3A)!JO%A6U%AB%7D%1"
		+ "9%F7%1B2%1E%86%85%04%05%EF%8CQ%C9%84%A8%88%192%2Ci%1C%7Cg%C0%B0%A6Ef%DA%"
		+ "1A%8C%95UB%22%22%AB%84%90%9AH%AB%20%25d2_%AE%08%9E%B8G%2B%87%90%12%12%91"
		+ "%94%10%F3%D2%B1%8C%A75x%86RB%988%C6%0A%0C%0B%26%A61%80%1A%16%11%A9a%A1%F"
		+ "E%0A%A0%C6Q%D1%9A%08%8B%88H%84%85S%AB%7D%AE%13%8A%EE(%93%C6%3D%0F3u%DC%C"
		+ "1%B0%00%A8a%11%11%A9aY%ED%B3Z%E5yA%84ED%22%2C4%8B%10%8C%15%14%DD%D1%EE%8"
		+ "8%16%F7%0C)!%11%91%94%10%27%8E%89q%2C%0D%A4%84%B8M%B4v%7F%5E%06M%BC%E7c%"
		+ "11%16%CD%FA%223m%A8a%11%11%A9aY%5E%87g%08%11%16%11%89%B0%E0%17%DB%B3%81%"
		+ "08%8B%88DX%5C%DByX0%EE%FA%B0%10%9C%9Ah%B446RB%22%A2%CC)!%11%91%1A%16F%EE"
		+ "%25%9Cp%F6%3B%A4%84DDRB%22%92%12%02%C0%5E%FE%00q%7F0%08%7D*%FA%FE%00%00%"
		+ "00%00IEND%AEB%60%82')";
	}
	manager.css += " !important; " +
"	margin:0 !important; " +
"	padding:0 !important; " +
"	width:auto !important; " +
"	height:auto !important; " +
"	font: " + manager.cssFont + " !important; " +
"	text-align:left !important; " +
"} " +
".ujs_sticky_resize " +
"{ " +
"	border:1px solid " + manager.borderColor + " !important; " +
"	background:" + manager.resizerColor + " !important; " +
"	display:block !important; " +
"	position:absolute !important; " +
"	right:-" + (manager.resizer_w+2) + "px !important; " +
"	bottom:-" + (manager.resizer_h+2) + "px !important; " +
"	width:" + manager.resizer_w + "px !important; " +
"	height:" + manager.resizer_h + "px !important; " +
"	cursor:se-resize !important; " +
"} " +
".ujs_sticky_titlebar " +
"{ " +
"	font: " + manager.cssFont + " !important; " +
"	color:" + manager.textColor + " !important; " +
"	display:block !important; " +
"	height:" + manager.ttlHeight + "px !important; " +
"	width:100% !important; " +
"	background:" + manager.ttlBgrColor + " !important; " +
"	margin:0 !important; " +
"	padding:0 !important; " +
"	text-align:center !important; " +
"	cursor:move !important; " +
"} " +
".ujs_sticky_titleinput " +
"{ " +
"	font: " + manager.cssFont + " !important; " +
"	color:" + manager.textColor + " !important; " +
"	display:block !important; " +
"	height:" + manager.ttlHeight + "px !important; " +
"	width:100% !important; " +
"	background:" + manager.ttlBgrColor + " !important; " +
"	border:0 !important; " +
"	padding:0 !important; " +
"	margin:0 !important; " +
"	text-align:center !important; " +
"} " +
".ujs_sticky_remove " +
"{ " +
"	position:absolute !important; " +
"	top:0 !important; " +
"	left:4px !important; " +
"	cursor:hand !important; " +
"	text-decoration:none !important; " +
"	color:" + manager.closeColor + " !important; " +
"	background:transparent !important; " +
"} " +
".ujs_sticky_position " +
"{ " +
"	position:absolute !important; " +
"	top:0 !important; " +
"	right:4px !important; " +
"	cursor:hand !important; " +
"	text-decoration:none !important; " +
"	color:" + manager.textColor + " !important; " +
"	background:transparent !important; " +
"} " +
".ujs_sticky_minimize " +
"{ " +
"	position:absolute !important; " +
"	top:0 !important; " +
"	right:16px !important; " +
"	cursor:hand !important; " +
"	text-decoration:none !important; " +
"	color:" + manager.textColor + " !important; " +
"	background:transparent !important; " +
"} " +
".ujs_sticky_editgroup textarea " +
"{ " +
"	font: " + manager.cssFont + " !important; " +
"	padding:5px !important; " +
"	margin:0 0 2px 0 !important; " +
"	border:0 !important; " +
"	color:" + manager.textColor + " !important; " +
"	background:transparent !important; " +
"	display:block !important; " +
"	border:1px solid " + manager.borderColor + " !important; " +
"	border-left:0 !important; " +
"	border-right:0 !important; " +
"	overflow:auto !important; " +
"} " +
".ujs_sticky_content " +
"{ " +
"	display:block; " +
"	font: " + manager.cssFont + " !important; " +
"	color:" + manager.textColor + " !important; " +
"	padding:" + manager.contentPadding + "px !important; " +
"	border:0 !important; " +
"	margin:0 !important; " +
"	background:transparent !important; " +
"	border-top:1px solid " + manager.borderColor + " !important; " +
"	overflow:auto !important; " +
"} " +
".ujs_sticky_content a" +
"{ " +
"	color:" + manager.textColor + " !important; " +
"	background:transparent !important; " +
"	font-weight:normal !important; " +
"	text-decoration:underline !important; " +
"} " +
".ujs_sticky_editgroup " +
"{ " +
"	color:" + manager.textColor + " !important; " +
"	font: " + manager.cssFont + " !important; " +
"} " +
".ujs_sticky_editgroup label, .ujs_sticky_editgroup input[type=checkbox] " +
"{ " +
"	cursor:hand !important; " +
"} " +
".ujs_sticky_save " +
"{ " +
"	position:absolute !important; " +
"	cursor:hand !important; " +
"	background:transparent !important; " +
"	color:" + manager.textColor + " !important; " +
"	right:5px !important; " +
"	text-decoration:none !important; " +
"} ";

	// initialize the stickies
	manager.init();
})();}, false);
