/*  HTMLEd JavaScript editor, version 0.5
 *  (c) 2008 Sergey Lee
 *
 *  HTMLEd is a simple non-visual (not WYSIWYG) html editor.
 *  For details and version updates, see my web site: http://blog.itemz.ru/
 *
/*--------------------------------------------------------------------------*/

function HTMLEd()
{
	//высота тулбара
	this.toolHeight = 20;
	
	this.baseURL = '';
	
	//в каком мы браузере
	this.isIE = /*@cc_on!@*/false;
	
	//список активных редакторов
	this.instance = new Array();
	
	
//------------------------------------------------------
	
	/**
	*	Функция вставляет тег в позицию курсора или вокруг выделения
	*	
	*	@param instanse - номер редактора
	*	@param tag - имя тега
	*	@param paired - является ли он парным
	**/
	this.insertTag = function(instance, tag, paired)
	{
		if(paired) {
			var first = '<' + tag + '>';
			var second = '</'+tag+'>';
		}
		else{
			var first = '';
			var second = '<'+tag+' />';
		}
		
		switch(tag){
			case 'a':
			var href = prompt('Введите URL ссылки', 'http://');
			if(!href) return;
			first = '<a href="'+href+'">';
			break;

			case 'img':
			var href = prompt('Введите URL изображения', 'http://');
			if(!href) return;
			second = '<img src="'+href+'" />';
			break;

			case 'ol':
			first = '<ol>\n\t<li>';
			second = '</li>\n</ol>';
			break;
			
			case 'ul':
			first = '<ul>\n\t<li>';
			second = '</li>\n</ul>';
			break;
		}
		
//		var obj = document.getElementById(instance);
		var obj = this.getInstance(instance);
		if(!obj) return false;
		
		obj.focus();
		var scroll = obj.scrollTop;
		
		if(this.isIE){
			var s = document.selection.createRange(); 
			s.text = first + s.text + second;
			s.select();
		}
		else
		{
			var start = obj.selectionStart;
			var end = obj.selectionEnd;
			var text = obj.value.substr(start,end-start);
			
			obj.value = obj.value.substr(0,start) + first + text + second + obj.value.substr(end);
			obj.setSelectionRange(end,end);
		}
		
		obj.scrollTop = scroll;
	}
	
	/**
	*	Возвращает объект активного окна редактора
	*
	**/
	this.getInstance = function(id)
	{
		if( this.instance[id] ) return this.instance[id];
		
		return false;
	}
	
	/**
	*	Выводит тулбар для указанного объекта
	**/
	this.showToolbar = function(instance)
	{
		var obj = this.instance[instance];
		
		//get coords
		var obj2 = obj;
		var x = y = 0;
		while(obj2) {
			x += obj2.offsetLeft;
			y += obj2.offsetTop;
			obj2 = obj2.offsetParent;
		}
		
		//create toolbar
		var tBar = document.createElement('div');
		tBar.style.height = this.toolHeight + 'px';
		tBar.style.width = obj.offsetWidth + (this.isIE ? 0 : -2) + 'px';
		tBar.className = 'HTMLEdToolbar';
//		tBar.style.left = x + 'px';
		tBar.style.top = y + 'px';
		var buttons = '';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'b\', 1)" title="Bold"><img src="'+this.baseURL+'/img/bold.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'i\', 1)" title="Italic"><img src="'+this.baseURL+'/img/italic.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'u\', 1)" title="Underline"><img src="'+this.baseURL+'/img/underline.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'strike\', 1)" title="Strike"><img src="'+this.baseURL+'/img/strike.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<img src="'+this.baseURL+'/img/separator.gif" style="margin:0 5px;">';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'ol\', 1)" title="Ordered List"><img src="'+this.baseURL+'/img/numlist.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'ul\', 1)" title="Un-ordered list"><img src="'+this.baseURL+'/img/bullist.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<img src="'+this.baseURL+'/img/separator.gif" style="margin:0 5px;">';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'a\', 1)" title="Link to"><img src="'+this.baseURL+'/img/link.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'img\')" title="Image"><img src="'+this.baseURL+'/img/image.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		buttons += '<img src="'+this.baseURL+'/img/separator.gif" style="margin:0 5px;">';
		buttons += '<a href="javascript:HTMLEd.insertTag('+instance+',\'cut\', 1)" title="Cut mark"><img src="'+this.baseURL+'/img/cut.gif"'+(this.isIE ? ' onmouseover="this.className=\'selected\'" onmouseout="this.className=\'\'"' : '')+'></a>';
		
		tBar.innerHTML = buttons;
		
//		obj.style.paddingTop = this.toolHeight + 'px';
		obj.style.height = obj.offsetHeight - this.toolHeight + 'px';
//		obj.style.marginTop = this.toolHeight + 'px';
//		obj.parentNode.appendChild(tBar);
		obj.style.marginTop = '-' + this.getStyle(obj, 'marginTop');
		obj.parentNode.insertBefore(tBar, obj);
	}
	
	/**
	*	подключает необходимый для работы css
	**/
	this.includeTheme = function()
	{
		var s = document.getElementsByTagName('script');
		var end = s.length;
		for(var i=0; i,end; i++)
		{
			var src = s[i].src;
			if(src && src.indexOf("htmled.js") != -1){
				src = src.substring(0, src.lastIndexOf('/'));
				break;
			}
		}
		if(!src) return;
		
		this.baseURL = src;
		var t = document.createElement('link');
		t.href = src + '/htmled.css';
		t.rel = 'stylesheet';
		t.type = 'text/css';
		document.getElementsByTagName('head')[0].appendChild(t);
	}
	
	/**
	*	включает радактор для заданных элементов textarea
	*	если список не задан, то для всех
	**/
	this.enable = function(areas)
	{
		var tx = document.getElementsByTagName('textarea');
		var tx_end = tx.length;
		if(!tx_end) return;
		
		if(!areas){
			//enable for all
			
			for(var i=0; i<tx_end; i++)
			{
				this.instance[i] = tx[i];
			}
		}
		else{
			//enable selected
			var regexp = /[\s]*,[\s]*/;
			var l = areas.split(regexp);
			var end = l.length;
			if(!end) return;
			
			var count = this.instance.length;
			for(var i=0; i<end; i++)
			{
				for(var j=0; j<tx_end; j++){
					if(tx[j].name == l[i]) {
						this.instance[count] = tx[j];
						count++;
					}
				}
			}
		}
		
		//show toolbar
		this.includeTheme();
		var end = this.instance.length;
		if(!end) return;
		for(var i=0; i<end; i++)
		{
			this.showToolbar(i);
		}
	}
	
	/**
	* Получение вычисленного значения стиля
	* elem - элемент, для которого необходимо получить значение
	* name - имя запрашиваемого стиля
	*/
	this.getStyle = function(elem, name) {
	       // Если необходимое свойство содержится в аттрибуте style[]
	       // тогда, оно является текущим
	       if (elem.style[name])
	              return elem.style[name];
	
	
	      // Вычисляем значение стиля используя метод IE
	      else if (elem.currentStyle)
	              return elem.currentStyle[name];
	
	
	      // или W3C метод, если таковой имеется
	      else if (document.defaultView && document.defaultView.getComputedStyle) {
	              name = name.replace(/([A-Z])/g,"-$1");
	              name = name.toLowerCase();
	
	
	              var s = document.defaultView.getComputedStyle(elem,"");
	              return s && s.getPropertyValue(name);
	      } else
	             return null;
	}
}


//create HTMLEd object
var HTMLEd = new HTMLEd();