
	var PreloadImage = Class.create();
	PreloadImage.prototype = {
		initialize: function(parent, target)
		{
			this.target = target;
			this.parent = parent;
			this.eventLoad = this.loadHandler.bindAsEventListener(this);
		},
		
		preload: function(url)
		{
			this.tempImg = new Image();
			Event.observe(this.tempImg, "load", this.eventLoad, true);
			this.tempImg.src = url;
		},
		
		loadHandler: function(event)
		{
			if (!$(this.target))
			{
				new Insertion.Before(this.parent, '<img src="" alt="" id="' + this.target + '" />');
			}
			$(this.target).src = this.tempImg.src;
		}
	};
	
	var Smile = Class.create();
	Smile.prototype = {
		initialize: function(parent, textarea_id)
		{
			this.parent = $(parent);
			this.textarea_id = textarea_id;
			this.eventClick = this.clickAction.bindAsEventListener(this);
			this.addEvent();
		},
		
		addEvent: function()
		{
			var images = this.parent.getElementsByTagName('IMG');
			for(var i=0; i<images.length; i++)
			{
				Event.observe(images[i], "click", this.eventClick);
			}
		},
		
		clickAction: function(event)
		{			
			insertAtCaret($(this.textarea_id), Event.element(event).alt);
		}
	};
	
	var YouTube = Class.create();
	YouTube.prototype = {
		initialize: function(target, data, textarea_id)
		{
			this.target = $(target);
			this.textarea = $(textarea_id);
			this.data = $(data);
			this.eventClick = this.clickAction.bindAsEventListener(this);
			this.addEvent();
		},
		
		addEvent: function()
		{
			Event.observe(this.target, "click", this.eventClick);
		},
		
		clickAction: function(event)
		{
			// take data from input
			if (this.data.value && this.data.value != "")
			{
				var result = parseUri(this.data.value);
				if (typeof result.queryKey.v != "undefined")
				{
					this.insertYuotubeText(result.queryKey.v);
				}
			}
		},
		
		insertYuotubeText: function(key)
		{
			var final_text = ":youtube|"+key+":";
			insertAtCaret(this.textarea, final_text);
			this.data.value = "";
		}
	};
	
	function insertAtCaret(obj, text) 
	{
		if(document.selection) {
			obj.focus();
			var orig = obj.value.replace(/\r\n/g, "\n");
			var range = document.selection.createRange();

			if(range.parentElement() != obj) {
				return false;
			}

			range.text = text;
			
			var actual = tmp = obj.value.replace(/\r\n/g, "\n");

			for(var diff = 0; diff < orig.length; diff++) {
				if(orig.charAt(diff) != actual.charAt(diff)) break;
			}

			for(var index = 0, start = 0; 
				tmp.match(text) 
					&& (tmp = tmp.replace(text, "")) 
					&& index <= diff; 
				index = start + text.length
			) {
				start = actual.indexOf(text, index);
			}
		} else if(obj.selectionStart) {
			var start = obj.selectionStart;
			var end   = obj.selectionEnd;

			obj.value = obj.value.substr(0, start) 
				+ text 
				+ obj.value.substr(end, obj.value.length);
		}
		
		if(start != null) {
			setCaretTo(obj, start + text.length);
		} else {
			obj.value += text;
		}
	}  
	
	function setCaretTo(obj, pos) {
		if(obj.createTextRange) {
			var range = obj.createTextRange();
			range.move('character', pos);
			range.select();
		} else if(obj.selectionStart) {
			obj.focus();
			obj.setSelectionRange(pos, pos);
		}
	}
	
	function clearText(object)
	{
		if(typeof object != "undefined" && typeof object.value != "undefined")
		{
			if (object.value == "write to me")
			{
				object.value = "";
			}
		}
	}
	
	function toggleCheckboxes(input)
	{
		var parent_table = Element.up(input, 'table.default_table');
		if (parent_table)
		{
			state = input.checked;
			var checkboxes = parent_table.getElementsByClassName('check');
			for(var i=0; i<checkboxes.length; i++)
			{
				if (checkboxes[i].checked != state)
				{
					checkboxes[i].checked = state;
				}
			}
		}		
	}
	
	function changeFormAction(form, action)
	{
		var form = $(form);		
		if (form)
		{
			form.action = action;
			return true;
		}
		else
		{
			return false;
		}
	}
	
	/*
		parseUri 1.2.1
		(c) 2007 Steven Levithan <stevenlevithan.com>
		MIT License
	*/

	function parseUri (str) {
		var	o   = parseUri.options,
			m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
			uri = {},
			i   = 14;

		while (i--) uri[o.key[i]] = m[i] || "";

		uri[o.q.name] = {};
		uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
			if ($1) uri[o.q.name][$1] = $2;
		});

		return uri;
	};

	parseUri.options = {
		strictMode: false,
		key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
		q:   {
			name:   "queryKey",
			parser: /(?:^|&)([^&=]*)=?([^&]*)/g
		},
		parser: {
			strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
			loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/
		}
	};
	
