function CloseAllWindows()
{
	CloseFileBox();
	CloseLinkBox();
	CloseColorBox();
	document.getElementById('showImage').style.display = 'none';	
}


function CloseFileBox()
{
	document.getElementById('btnAddFile').style.display = 'none';
	dAddImageBox.style.display = 'none';
	dFileBox.style.display = 'none';
	document.getElementById('showImage').style.display = 'none';
}

function ShowUploadDialog(dObject)
{
	document.getElementById('btnAddFile').style.display = 'inline';
	dFileBox.style.display = 'block';
}

function CloseLinkBox()
{
	dLinkUrl.value   = 'http://';
	dLinkTitle.value = '';
	dLinkRel.checked = true;
	dLinkBox.style.display = 'none';
}

var tbSize = 300;
function IncreaseTbSize()
{
	if(tbSize < 1000)
	{
		tbSize += 100;
		dTextarea.style.height = tbSize + 'px';
	}
}

function DecreaseTbSize()
{
	if(tbSize > 200)
	{
		tbSize -= 100;
		dTextarea.style.height = tbSize + 'px';
	}
}

var dAddBoxTimeout = null;
var dAddElement    = null;
function OpenAddBox(dObject)
{
	var dElement = GetElement(dObject);
	if(dElement.tagName != 'OPTION')
	{
		if(dElement.id != 'addBox' && dElement.id != 'btnAddBBCode')
		{
			var pos = GetBoxCoordinates(dObject);
			dAddBox.style.left = pos[0] + 'px';
			dAddBox.style.top  = (pos[1] + 23) + 'px';
			dAddElement = dElement;
		}
		dAddBoxTimeout = clearTimeout(dAddBoxTimeout);
		dAddBox.style.display = 'block';
	}
}

function SetAddBoxTimeOut()
{
	dAddBoxTimeout = setTimeout("CloseAddBox()", 250);
}

function CloseAddBox()
{
	dAddBox.style.display = 'none'
}

function OpenLinkBox(dObject)
{
	CloseAllWindows();
	var pos = GetBoxCoordinates(dObject);
	dLinkBox.style.left = (pos[0] -  1) + 'px';
	dLinkBox.style.top  = (pos[1] + 24) + 'px';
	dLinkBox.style.display = 'block';
}

function OpenFileBox(dObject)
{
	CloseAllWindows();
	var pos = GetBoxCoordinates(dObject);
	dAddImageBox.style.left = (pos[0] -  1) + 'px';
	dAddImageBox.style.top  = (pos[1] + 24) + 'px';
	dAddImageBox.style.display = 'block';
}

function CloseColorBox()
{
	dColorBox.style.display = 'none';	
}

function OpenColorBox(dObject)
{
	CloseAllWindows();
	var pos = GetBoxCoordinates(dObject);
	dColorBox.style.left = (pos[0] -  1) + 'px';
	dColorBox.style.top  = (pos[1] + 24) + 'px';
	dColorBox.style.display = 'block';
}

function AddLink()
{
	var url      = dLinkUrl.value;
	var	urlTitle = dLinkTitle.value;

	if(url == null || url == '' || url == 'undefined' || url == 'http://')
	{
		return;
	}
	
	if(urlTitle == null || urlTitle == '' || urlTitle == 'undefined')
	{
		urlTitle = url;
	}
	
	var rel = (dLinkRel.checked == true) ? 'external' : 'internal';
	var urlLink = '[url='+url+' rel=' + rel + ']'+urlTitle+'[/url]';
	if (document.selection) // IE
	{
		dTextarea.focus();
		sel = document.selection.createRange();
		sel.text = sel.text + urlLink;
		dTextarea.focus();
	}
	else if (dTextarea.selectionStart || dTextarea.selectionStart == '0') // Mozilla, Netscape
	{
		var startPos   = dTextarea.selectionStart;
		var endPos     = dTextarea.selectionEnd;
		dTextarea.value = dTextarea.value.substring(0, endPos)
		+ urlLink + dTextarea.value.substring(endPos, dTextarea.value.length);

		dTextarea.selectionStart = endPos;
		dTextarea.selectionEnd   = endPos + urlLink.length;
		dTextarea.focus();
	}
	else // Others
	{
		dTextarea.value += urlLink;
	}
	CloseLinkBox();
}

function GetPattern(dClass)
{
	return new RegExp('(^| )' + dClass + '( |$)');
}

function GetColorTags(dObject)
{
	var dElement = GetElement(dObject);
	if(dElement == null)
		return;
		
	var pattern = GetPattern('color');
	if(dElement.className && pattern.test(dElement.className))
	{
		var begTag = '[color=' + dElement.title + ']';
		var endTag = '[/color]';
		AddBBCode(begTag, endTag);
		CloseColorBox();
	}
}

function GetAddTags()
{
	if(dAddElement != null)
	{
		var begTag, endTag;
		switch(dAddElement.id)
		{
			case 'header':
				begTag = '[h'  + dAddElement.value + ']';
				endTag = '[/h' + dAddElement.value + ']';
				break;
			case 'fontFamily':
				begTag = '[font=' + dAddElement.value + ']';
				endTag = '[/font]';
				break;
			case 'fontSize':
				begTag = '[size=' + dAddElement.value + ']';
				endTag = '[/size]';
				break;
			default:
				break;	
		}
		AddBBCode(begTag, endTag);
		CloseAddBox();
	}
}

function GetTags(dObject)
{
	var dElement = GetElement(dObject);
	if(dElement == null)
		return;
	
	var begTag, endTag;
	switch(dElement.id)
	{
		case 'bold':
			begTag = '[b]';
			endTag = '[/b]';
			break;
		case 'italic':
			begTag = '[i]';
			endTag = '[/i]';
			break;
		case 'underline':
			begTag = '[u]';
			endTag = '[/u]';
			break;
		case 'paragraph':
			begTag = '[p]';
			endTag = '[/p]';
			break;
		case 'h1':
			begTag = '[h1]';
			endTag = '[/h1]';
			break;
		case 'h2':
			begTag = '[h2]';
			endTag = '[/h2]';
			break;
		case 'h3':
			begTag = '[h3]';
			endTag = '[/h3]';
			break;
		case 'olist':
			begTag = '[olist]';
			endTag = '[/olist]';
			break;
		case 'ulist':
			begTag = '[ulist]';
			endTag = '[/ulist]';
			break;
		case 'fontFamily':
			begTag = '[font=' + dElement.value + ']';
			endTag = '[/font]';
			break;
		case 'fontSize':
			begTag = '[size=' + dElement.value + ']';
			endTag = '[/size]';
			break;
		default:
			begTag = '';
			endTag = '';
	}
	AddBBCode(begTag, endTag);
}

function AddBBCode(begTag, endTag)
{
	if (document.selection)
	{
		dTextarea.focus();
		sel = document.selection.createRange();
		sel.text = begTag+sel.text+endTag;
		dTextarea.focus();
	}
	else if (dTextarea.selectionStart || dTextarea.selectionStart == '0')
	{
		var startPos, endPos, selection;
		with(dTextarea)
		{
			startPos  = selectionStart;
			endPos    = selectionEnd;
			selection = value.substring(selectionStart, selectionEnd)
			value 	  = value.substring(0, startPos) 					
			 		  + begTag  
			 		  + selection
			 		  + endTag 
			 		  + value.substring(endPos, value.length);
			
			selectionStart = selectionEnd = startPos + begTag.length + selection.length;
			focus();
		}
	}
	else
	{
		dTextarea.value += begTag + endTag;
	}	
}

function GetBoxCoordinates(dObject)
{
	var posX, posY;
	var dElement = GetElement(dObject);
	if(dElement != null)
	{
		posX = FindPosX(dElement);
		posY = FindPosY(dElement);
	}
	else
	{
		posX = dObject.clientX;
		posY = dObject.clientY;		
	}
	return Array(posX, posY);	
}

function FindPosX(dElement)
{
	var curleft = 0;
	if(dElement.offsetParent)
	{
		do
		{
			curleft += dElement.offsetLeft;
		}
		while (dElement = dElement.offsetParent);
	}
	return curleft;
}

function FindPosY(dElement)
{
	var curtop = 0;
	if(dElement.offsetParent)
	{
		do
		{
			curtop += dElement.offsetTop;
		}
		while (dElement = dElement.offsetParent);
	}
	return curtop;
}

function OnEnter(dObject)
{
	var currentKey = (navigator.appName.indexOf("Netscape") != -1) ? dObject.which : dObject.keyCode;
	if(currentKey == 13 && (dObject.shiftKey || dObject.ctrlKey))
	{
		if (document.selection)
		{
			dTextarea.focus();
			sel = document.selection.createRange();
			sel.text = sel.text + "[br /]\n";
			dTextarea.focus();
		}
		else if (dTextarea.selectionStart || dTextarea.selectionStart == '0')
		{
			var startPos, endPos;
			with(dTextarea)
			{
				startPos = selectionStart;
				endPos   = selectionEnd;
				value 	 = value.substring(0, startPos)
					  	 + value.substring(selectionStart, selectionEnd)
					  	 + "[br /]\n"
					  	 + value.substring(endPos, value.length);
					  
				selectionStart = startPos + 7;
				selectionEnd   = endPos   + 7;
				focus();
			}
		}
		else
		{
			dTextarea.value += "[br /]\n";
		}
		StopDefault(dObject);
	}	
}

// function DisableSelection(dObject)
// {
// 	var dElement = GetElement(dObject);
// 	if(dElement != null && dElement != dTextarea)
// 	{
// 		StopDefault(dObject);
// 	}
// }

function UploadFile(dObject)
{
	StopDefault(dObject);
	
	if(dFileDesc.value == '' || dFileFile.value == '')
	{
		return;	
	}
	CloseFileBox();

	var iframe = document.createElement('iframe');
	iframe.id = 'uploadFrame';
	iframe.name = 'uploadFrame';

	document.getElementById('iframe').appendChild(iframe);	
	document.getElementById('fileUploadForm').target = 'uploadFrame';
	document.getElementById('fileUploadForm').submit();
}

function DeleteFile(dObject)
{
	var dElement = GetElement(dObject);
	if(dElement == null)
		return;

	var xmlhttp	    = GetXMLHttpRequest();
	var serverPage  = '/php/blog/deleteFile.php';
	var queryString = 'id=' + encodeURIComponent(dElement.alt);

	xmlhttp.open('post', serverPage, true);
	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
	xmlhttp.onreadystatechange = function()
	{
		if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
		{
			ShowIframeMessage(xmlhttp.responseText);
		}
	}
	xmlhttp.send(queryString);
}

function ShowIframeMessage(message)
{
	document.getElementById('iframeMessage').innerHTML = message;
	document.getElementById('iframeMessage').style.display = 'block';
	setTimeout('RemoveIframe()', 1500);
	UpdateImageList();
}

function RemoveIframe()
{
	document.getElementById('iframeMessage').style.display = 'none';
	document.getElementById('iframeMessage').innerHTML = '';
	document.getElementById('iframe').innerHTML = '';
}

function GetImgTags(dObject)
{
	var dElement = GetElement(dObject);
	if(dElement == null)
		return;
		
	var begTag = '[img=' + dElement.alt + ']';
	var endTag = '[/img]';
	AddBBCode(begTag, endTag);
	CloseAllWindows();
}

function ShowImage(dObject)
{
	var dElement = GetElement(dObject);
	if(dElement == null)
		return;

	var x = FindPosX(dAddImageBox);
	var y = FindPosY(dAddImageBox);
	
	var showImg = document.getElementById('showImage');
	
	showImg.style.left = (x - 210) + 'px';
	showImg.style.top  =  y + 'px';
	
	showImg.innerHTML = 'Showing image number: ' + dElement.alt;
	showImg.style.display = 'block';
}

function ImgListeners(dClass, dSet, dWhat)
{
	var arr     = document.getElementsByTagName('img');
	var pattern = GetPattern(dClass);
	for(var i = 0; i < arr.length; i++)
	{
		if(arr[i].className && pattern.test(arr[i].className))
		{
			if(dSet)
			{
				switch(dWhat)
				{
					case 0:
						SetListener(arr[i], 'click', GetImgTags);
						SetListener(arr[i], 'mouseover', ShowImage);
						break;
					case 1:
						SetListener(arr[i], 'click', DeleteFile);
						SetListener(arr[i], 'mouseover', ShowImage);
						break;
					default:
						break;
				}
			}
			else
			{
				switch(dWhat)
				{
					case 0:
						UnsetListener(arr[i], 'click', GetImgTags);
						UnsetListener(arr[i], 'mouseover', ShowImage);
						break;
					case 1:
						UnsetListener(arr[i], 'click', DeleteFile);
						UnsetListener(arr[i], 'mouseover', ShowImage);
						break;
					default:
						break;
				}
			}
		}	
	}
}

function UpdateImageList()
{
	var xmlhttp	   = GetXMLHttpRequest();
	var serverPage = '/php/blog/imageList.php';
	
	ImgListeners('insert_user_image', false, 0);
	ImgListeners('delete_user_image', false, 1);

	xmlhttp.open('post', serverPage, true);
	xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
	xmlhttp.onreadystatechange = function()
	{
		if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
		{
			if(xmlhttp.responseText != '')
			{
				dImageList.innerHTML = xmlhttp.responseText;
				ImgListeners('insert_user_image', true, 0);
				ImgListeners('delete_user_image', true, 1);
			}
		}
	}
	xmlhttp.send(null);
}

var dTextarea, dColorBox, dAddBox, dColorBtnClose, dLinkBox, dLinkBtnClose, dLinkBtnAdd, dLinkUrl, dLinkTitle, dAddBtnAdd, dLinkRel, dFileBtnAdd, dFileBtnClose, dFileBox, dFileDesc, dFileFile, dAddImageBox, dImageList;

function Init()
{
	var errors = 0;
	with(document)
	{
 		if(getElementById('linkURL')) 	    { dLinkUrl 	     = getElementById('linkURL'); 	    } else { errors++; }
 		if(getElementById('linkTitle'))     { dLinkTitle     = getElementById('linkTitle'); 	} else { errors++; }
 		if(getElementById('btnAddLink'))    { dLinkBtnAdd    = getElementById('btnAddLink');    } else { errors++; }
 		if(getElementById('btnCloseLink'))  { dLinkBtnClose  = getElementById('btnCloseLink');  } else { errors++; }
 		if(getElementById('addLink')) 	    { dLinkBox 	     = getElementById('addLink'); 	    } else { errors++; }
 		if(getElementById('linkRel'))		{ dLinkRel		 = getElementById('linkRel');		} else { errors++; }
 		if(getElementById('content')) 	    { dTextarea 	 = getElementById('content'); 	    } else { errors++; }
 		if(getElementById('addColor')) 	    { dColorBox 	 = getElementById('addColor'); 	    } else { errors++; }
 		if(getElementById('btnCloseColor')) { dColorBtnClose = getElementById('btnCloseColor'); } else { errors++; }
 		if(getElementById('addBox')) 		{ dAddBox 		 = getElementById('addBox'); 		} else { errors++; }
 		if(getElementById('btnAddBBCode'))  { dAddBtnAdd	 = getElementById('btnAddBBCode');  } else { errors++; }
  		if(getElementById('btnAddFile'))    { dFileBtnAdd    = getElementById('btnAddFile');    } else { errors++; }
 		if(getElementById('btnCloseFile'))  { dFileBtnClose  = getElementById('btnCloseFile');  } else { errors++; }
 		if(getElementById('addImage')) 		{ dAddImageBox 	 = getElementById('addImage');		} else { errors++; }
 		if(getElementById('uploadFileBox')) { dFileBox 	     = getElementById('uploadFileBox');	} else { errors++; }
 		if(getElementById('filedesc'))  	{ dFileDesc 	 = getElementById('filedesc');  	} else { errors++; }
 		if(getElementById('file'))    		{ dFileFile 	 = getElementById('file'); 			} else { errors++; }
 		if(getElementById('imageList'))		{ dImageList	 = getElementById('imageList');		} else { errors++; }
	}
	
	if(errors > 0)
	{
		//document.body.innerHTML = "<p>An error occured, try refreshing the page or visit it with another browser!</p>";
	}
	else
	{
		/**
		 * Set some additional listeners
		 */
		SetListener(dLinkBtnAdd,    'click', AddLink);
		SetListener(dLinkBtnClose,  'click', CloseLinkBox);
		SetListener(dColorBtnClose, 'click', CloseColorBox);
		
		SetListener(dFileBtnAdd,    'click', UploadFile);
		SetListener(dFileBtnClose,  'click', CloseFileBox);
		
		SetListener(dTextarea, 'click', CloseAllWindows);
	 
	 	// Disable context menus, won't work i Opera
		//SetListener(document, 'contextmenu', StopDefault);
		
// 		// Disable selection
// 		SetListener(document, 'selectstart', DisableSelection);
// 		SetListener(document, 'mousedown', 	 DisableSelection);
		
		// Enable break rows on shift/ctrl + enter
		SetListener(document, 'keydown', OnEnter);
		
		with(document)
		{
			if(getElementById('paragraph'))   	 { SetListener(getElementById('paragraph'),  	 'click',  	  GetTags); 	 	 }
			if(getElementById('italic')) 	 	 { SetListener(getElementById('italic'), 	 	 'click',  	  GetTags); 	 	 }
			if(getElementById('bold')) 		 	 { SetListener(getElementById('bold'), 		 	 'click', 	  GetTags); 	 	 }
			if(getElementById('underline'))  	 { SetListener(getElementById('underline'),  	 'click',  	  GetTags); 	 	 }
			if(getElementById('ulist')) 	 	 { SetListener(getElementById('ulist'), 	 	 'click',  	  GetTags); 	 	 }
			if(getElementById('olist')) 	 	 { SetListener(getElementById('olist'), 	 	 'click', 	  GetTags); 	 	 }
			if(getElementById('h1')) 	 	 	 { SetListener(getElementById('h1'), 	 	 	 'click', 	  GetTags); 	 	 }
			if(getElementById('h2')) 	 	 	 { SetListener(getElementById('h2'), 	 	 	 'click', 	  GetTags); 	 	 }
			if(getElementById('h3')) 	 	 	 { SetListener(getElementById('h3'), 	 	 	 'click', 	  GetTags); 	 	 }
			if(getElementById('fontFamily')) 	 { SetListener(getElementById('fontFamily'), 	 'change', 	  GetTags); 	 	 }
			if(getElementById('fontSize')) 	 	 { SetListener(getElementById('fontSize'), 	 	 'change', 	  GetTags); 	 	 }
			if(getElementById('fileUploadForm')) { SetListener(getElementById('fileUploadForm'), 'submit', 	  UploadFile)		 }
			if(getElementById('fontFamily')) 	 { SetListener(getElementById('fontFamily'), 	 'mouseover', OpenAddBox); 	 	 }
			if(getElementById('fontSize')) 	 	 { SetListener(getElementById('fontSize'), 	 	 'mouseover', OpenAddBox); 	 	 }
			if(getElementById('link'))		 	 { SetListener(getElementById('link'), 		 	 'click', 	  OpenLinkBox);  	 }
			if(getElementById('image'))		 	 { SetListener(getElementById('image'), 	 	 'click', 	  OpenFileBox);  	 }
			if(getElementById('uploadFile'))	 { SetListener(getElementById('uploadFile'),	 'click',	  ShowUploadDialog); }
			if(getElementById('fontColor'))  	 { SetListener(getElementById('fontColor'),  	 'click', 	  OpenColorBox); 	 }
			if(getElementById('fontFamily')) 	 { SetListener(getElementById('fontFamily'), 	 'mouseout',  SetAddBoxTimeOut); }
			if(getElementById('fontSize')) 	 	 { SetListener(getElementById('fontSize'), 	 	 'mouseout',  SetAddBoxTimeOut); }
			if(getElementById('increase'))   	 { SetListener(getElementById('increase'),   	 'click',  	  IncreaseTbSize);   }
			if(getElementById('decrease')) 	 	 { SetListener(getElementById('decrease'), 	 	 'click',  	  DecreaseTbSize);   }
		
			SetListener(dAddBox, 	'mouseover', OpenAddBox);
			SetListener(dAddBox, 	'mouseout',  CloseAddBox);
			SetListener(dAddBtnAdd, 'click',  	 GetAddTags);
			
			var pattern = GetPattern('color');
			var spanArr = getElementsByTagName('span');
			for(var i = 0; i < spanArr.length; i++)
			{
				if(spanArr[i].className && pattern.test(spanArr[i].className))
				{
					SetListener(spanArr[i], 	 'click', GetColorTags);
				}	
			}
		}
		UpdateImageList();
	}
}
SetListener(window, 'load', Init);