// ==UserScript==
// @nom ROBOsticky (note)
// @auteur ROBO Design
// @traduction Maulkin (http://my.opera.com/Mystik/)
// @site http://www.robodesign.ro
// @version 1.0.7
// @description Ajoute des notes aux pages HTML et XHTML.
// @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/ 

 	Cet "User JavaScript" est basé sur un autre UserJS créé par Antonio Orlando et Brian McAllister.
		http://digilander.libero.it/odnalro/coding/sticky_notes/

	Pour vérifier les mises à jour et pour en savoir plus sur cet UserJS, visitez:
		http://www.robodesign.ro/opera/userjs/stickies

	Merci à Mark Wilton-Jones (TarquinWJ) pour ses suggestions, son aide et ses tests.
		http://www.howtocreate.co.uk
*/

/* EDITEZ SEULEMENT LA SECTION CONFIGURATION (à part si vous savez vraiment ce que vous faites) */

document.addEventListener('load', function ()
{
	if(window.ujs_stickies)
		return false;

	window.ujs_stickies = new (function() 
{
	var manager = this;

	/**************
	<Configuration>
	**************/

	/* Permettre au double click de créer une nouvelle note? */
	manager.post_2click = true;

	/* Permettre l'édition du contenu de la note avec un click? Si non [false], le double click sera nécessaire. */
	manager.edit_1click = true;

	/* En mode édition: permettre la sauvegarde de la note en cliquant ailleurs. */
	manager.click_to_save = true;

	/* Confirmer la suppression d'une note */
	manager.remove_confirm = true;

	/* Permettre du XHTML dans le contenu de la note.
	   Valeurs: 1 - toujours ; 2 - jamais ; 3 - configurable sur chaque note */
	manager.allow_xhtml = 3;

	/* Minimiser la note par défaut.
	   Valeurs: 1 - toujours minimisé ; 2 - jamais minimisé ; 3 - se rappeler du dernier choix pour chaque note */
	manager.minimize_stickies = 3;

	/* Minimiser/rétablir la note en effectuant un double clic sur le titre. */
	manager.minimize_2click = true;

	/* Permettre les paramètres dans les URL
	   si c'est vrai:
		   /index.php?page=a
		   /index.php?page=b
	   ... seront considérées comme deux pages différentes.
	   si c'est faux, les deux pages seront considérées comme: /index.php (identiques). */
	manager.params_in_url = true;

	/* Si vous permettez les paramètres dans les URL, vous pouvez aussi spécifier quels paramètres enlever de l'URL (celles-ci peuvent contenir des valeurs aléatoires)
	   Vous devez obligatoirement séparer chaque paramètre avec une barre verticale. */
	manager.remove_params_in_url = 'tmp|sessionid|sessid|temp|phpsessid|jsessionid|aspsessionid|cfid|cftoken';

	/* Mode Turbo. Si cette option est activée, il n'y aura aucune vérification de taille et de position pendant le déplacement ou le changement de taille. */
	manager.turbo_mode = false;

	/* Montrer (ou non) une "jolie" image d'arrière-plan. Désactivez pour accélerer le rendu d'Opera. */
	manager.bgrImage = true;

	/* Position minimum X et Y pour toutes les notes. */
	manager.min_x = 5;
	manager.min_y = 5;

	/* Longueur et largeur minimum et maximum pour toutes les notes. */
	manager.max_width = 600;
	manager.max_height = 400;
	manager.min_width = 250;
	manager.min_height = 130;

	/* Couleur d'arrière plan des notes. */
	manager.bgrColor = '#ffef59';

	/* Couleur d'arrière-plan du titre. */
	manager.ttlBgrColor = '#ffef59';

	/* Hauteur du titre (seulement permises en pixels). */
	manager.ttlHeight = 14;

	/* Changer la taille, la couleur, la largeur et la hauteur (en pixels) du gestionnaire. */
	manager.resizerColor = '#ddcd37';
	manager.resizer_w = 8;
	manager.resizer_h = 8;

	/* Couleur de la bordure. */
	manager.borderColor = '#990';

	/* Couleur du bouton de fermeture. */
	manager.closeColor = '#f00';

	/* Taille/ligne-hauteur et famille de la police du texte de la note. */
	manager.cssFont = '11px/11px sans-serif';

	/* Couleur du texte. */
	manager.textColor = '#000';

	/* Content padding (en pixels). */
	manager.contentPadding = 5;

	// Pour personnaliser d'avantage l'apparence des notes, allez simplement en bas de ce document pour éditer le CSS.

	// Messages
	manager.messages = new Array(
		// 0 Le contenu par défaut d'une nouvelle note
		'Nouvelle note.',

		// 1 Message de confirmation lorsque l'on supprime une note
		'Voulez-vous supprimer définitivement cette note?',

		// 2
		'Note transmise ',

		// 3 Message d'aide montré lorsque l'on survole l'aire permettant de faire glisser la note
		'Cliquer et faire glisser la note pour la repositionner.',

		// 4 Message d'aide pour le redimensionnement
		'Cliquez et tirez pour redimensionner la note.',

		// 5 Message d'aide pour le bouton de suppression
		'Supprimer cette note.',

		// 6 Le bouton de suppression
		'X',

		// 7 Affichage à côté de la case d'option "permettre XHTML"
		'XHTML',

		// 8 Affichage à côté de la case d'option "par nom de domaine"
		'Domaine',

		// 9 Le bouton de sauvergarde
		'[ Sauver ]',

		// 10 Message d'aide pour le bouton de sauvegarde
		'Cliquer pour sortir du mode d\'édition.',

		// 11 Message d'aide général pour la note, quand un seul clic est requis
		'. Cliquer pour éditer le contenu de la note.',

		// 12 .. ou quand un double clic est requis pour éditer la note
		'. Double-cliquer pour éditer le contenu de la note.',

		// 13 Message d'aide pour la case d'option XHTML
		'Permettre le code XHTML dans la note.',

		// 14 Message d'aide pour la case d'option "Par domaine"
		'Montrer cette note sur toutes les pages de ce domaine.',

		// 15 Message d'aide de l'entrée du texte
		'Cliquer ici pour diter le titre de cette note.',

		// 16 Le bouton Minimiser
		'M',

		// 17 Message d'aide du bouton de minimisation
		'Cliquer pour minimiser la note.',

		// 18 Le bouton Agrandir/Restaurer
		'R',

		// 19 Message d'aide pour le bouton Agrandir/Restaurer
		'Cliquer pour restaurer et montrer la note.',

		// 20 Le bouton de "Positionnement Fixe"
		'F',

		// 21 Message d'aide pour le bouton de "Positionnement Fixe"
		'Cliquer pour que la note utilise le positionnement fixe. Ceci vous permettra de positionner la note en fonction de votre fenêtre, indépendamment du défilement de la page.',

		// 22 Le bouton de "Positionnement Absolu" 
		'A',

		// 23 Message d'aide pour le bouton de "Positionnement Absolu"
		'Cliquer pour que la note utilise le positionnement absolu. Ceci vous permettra de positionner la note en fonction du contenu de la page.',

		// 24 Le message d'erreur lorsque l'initialisation échoue
		'Vous ne pouvez pas ajouter une note à ce document. Le démarrage a échoué. Vous visualisez probablement un document qui n\'est pas du (X)HTML.',

		// 25 Message d'erreur lorsque l'utilisateur tente d'utiliser le positionnement fixe avec Opera 8 
		'Le positionnement fixe ne fonctionne pas correctement sous Opera 8. Veuillez installer Opera 9 pour utiliser cette fonction.',

		// 26 Partie du message d'aide lorsque la note n'est pas minimisée sans être en mode d'édition. Ceci informe l'utilisateur qu'il peut double-cliquer pour minimiser la note .
		'Double-cliquer pour minimiser la note.',

		// 27 Partie du message d'aide lorsque la note est minimisée sans être en mode d'édition. Ceci informe l'utilisateur qu'il peut double-cliquer pour restaurer la note.
		'Double-cliquer pour restaurer la note.',

		// 28 Message d'aide en mode d'édition.
		'Cliquer ici pour éditer le contenu de la note.'
	);

	/***************
	</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);
