var activeLayer = 0;
var layerHeight = 0;

/* Should be constant, but IE does not like that... */
var SMILEYS = 0x1;
var URL = 0x2;
var IMG = 0x4;
var VIDEO = 0x8;

function trim(value) {
  	value = value.replace(/^\s+/,'');
    	value = value.replace(/\s+$/,'');
	return value;
}


function addSmiley(smiley_text) {
	var cache = document.gb_form.gb_text.value;
	this.smiley_text = smiley_text;
	document.gb_form.gb_text.value = cache + smiley_text;
	document.gb_form.gb_text.focus();
}

function setBBCode(bbcode) {
	if (activeLayer != 0) {
		return;
	}
	insertStartCode("[" + bbcode + "]");
	insertEndCode("[/" + bbcode + "]");
}

function setCursorPosition(position) { 
	var field = document.getElementById('gb_text');
	if (field.setSelectionRange) { 
	   	field.focus(); 
     		field.setSelectionRange(position, position); 
      	} else if (field.createTextRange) { 
        	var range = field.createTextRange(); 
	  	range.collapse(true); 
	    	range.moveEnd('character', position); 
	      	range.moveStart('character', position); 
	        range.select(); 
	}
}

function getCaretPosition(node) {
	var disabled = node.disabled;
	node.disabled = false;
	node.focus(); 
 	if(node.selectionStart) return node.selectionStart;
	else if(!document.selection) return 0;
	var c = "\001";
	var sel	= document.selection.createRange();
	var dul	= sel.duplicate();
	var len	= 0;
	sel.text	= c;
	dul.moveToElementText(node);
	len = (dul.text.indexOf(c));
	sel.moveStart('character',-1);
	sel.text	= "";
	if (len < 0) {
		len = 0;
	}
	node.disabled = disabled;
	return len;
}

function insertStartCode(myValue) {
	var myField = document.gb_form.gb_text;
	var cursorPos = 0;
        if (document.selection) {
                myField.focus();
                sel = document.selection.createRange();
                sel.text = myValue;
        } else if (myField.selectionStart || myField.selectionStart == '0') {
                var startPos = myField.selectionStart;
                var endPos = myField.selectionEnd;
                myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
		cursorPos = startPos + myValue.length;
		setCursorPosition(cursorPos);
        } else {
                myField.value += myValue;
        }
	document.gb_form.gb_text.focus();
}

function insertEndCode(myValue) {
	var myField = document.gb_form.gb_text;
	var cursorPos = 0;
        if (document.selection) {
                myField.focus();
		cursorPos = getCaretPosition(myField);
		//Started with a BBCode but the cursor was not moved yet..
		if (cursorPos == 0) {
			cursorPos = myField.value.length;
		}
                sel = document.selection.createRange();
                sel.text = myValue;
        } else if (myField.selectionStart || myField.selectionStart == '0') {
                var startPos = myField.selectionStart;
                var endPos = myField.selectionEnd;
                myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
		cursorPos = startPos;
        } else {
                myField.value += myValue;
		cursorPos = myField.value.length;
        }
	document.gb_form.gb_text.focus();
	setCursorPosition(cursorPos);
}

function insertSmileyAtCursor(myValue) {
	insertAtCursor(myValue);
	showSmileys();
}

function insertAtPosition(myValue, position) {
	myValue = " " + myValue + " ";
	var myField = document.getElementById("gb_text");
	myField.disabled = false;
	if (myField.setSelectionRange) { 
	   	myField.focus(); 
     		myField.setSelectionRange(position, position); 
      	} else if (myField.createTextRange) { 
        	var range = myField.createTextRange(); 
	  	range.collapse(true); 
	    	range.moveEnd('character', position); 
	      	range.moveStart('character', position); 
	        range.select();
	}
        if (document.selection) {
		//IE hack!
                myField.focus();
                sel = document.selection.createRange();
                sel.text = myValue;
        } else if (myField.selectionStart || myField.selectionStart == '0') {
                var startPos = myField.selectionStart;
                var endPos = myField.selectionEnd;
                myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
        } else {
                myField.value += myValue;
        }
	//IE hack!
	myField.focus();
}

function insertAtCursor(myValue) {
	myValue = " " + myValue + " ";
	var myField = document.getElementById("gb_text");
        if (document.selection) {
		//IE hack!
		myField.disabled = false;
                myField.focus();
                sel = document.selection.createRange();
                sel.text = myValue;
		myField.disabled = true;
        } else if (myField.selectionStart || myField.selectionStart == '0') {
                var startPos = myField.selectionStart;
                var endPos = myField.selectionEnd;
                myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length);
		setCursorPosition(endPos + myValue.length);
        } else {
                myField.value += myValue;
        }
	if (myField.disabled == false) {
		myField.focus();
	}
}

function showWindowBBCode(Location) {
	sizeX = 500;
	sizeY = 500;
	posX = ((screen.availWidth/2)-(sizeX/2));
	posY = ((screen.availHeight/2)-(sizeY/2));
	options = "height=" + sizeY + ",width=" + sizeX + ",toolbar=0,menubar=0,directories=0,scrollbars=0,left="+posX+",top="+posY;
	window.open(Location, "BBCode", options);
}

function disableAddButton() {
       document.gb_form.addmessage.disabled = true;
       document.gb_form.addmessage.style.color = "#999999";
}

function hideCurrentLayer() {
	var layerHeight = 0;
	var layerBlock = document.getElementById("layerblock");
	var gb_text = document.getElementById("gb_text");
	var i = 0;
	var timeout = 0;
	document.getElementById("urlblock").style.display = "none";
	document.getElementById("smileyblock").style.display = "none";
	document.getElementById("imgblock").style.display = "none";
	document.getElementById("videoblock").style.display = "none";
	layerHeight = parseInt(layerBlock.style.height.substr(0, layerBlock.style.height.length-2));
	while (layerHeight > 0) {
		window.setTimeout('document.getElementById("layerblock").style.height = ' + layerHeight + ' + "px"', i*10);
                       i++;
                       layerHeight -= 10;
	}
	i += 2;
	window.setTimeout('document.getElementById("layerblock").style.display = "none";', i*10);
	timeout = i*10;
	gb_text.disabled = false;
	gb_text.style.background = "#FFFFFF";
	gb_text.focus();
	return timeout;
}

function showSmileys(height) {
	var timeout = 0;
	if (height > 200) {
		document.getElementById("smileyblock").style.height = "195px";
		height = 200;
	}

	if (activeLayer != 0) {
		timeout = hideCurrentLayer();
		if (activeLayer != SMILEYS) {
			activeLayer = 0;
			window.setTimeout('showSmileysBlock(' + height + ')', timeout);
		} else {
			activeLayer = 0;
		}
	} else {
		showSmileysBlock(height);
	}
}

function showSmileysBlock(height) {
	var tmpsize = 0;
	var i = 0;
	var layerBlock = document.getElementById("layerblock");
	var gb_text = document.getElementById("gb_text");
	if (activeLayer == SMILEYS) { //Can be removed...
		tmpsize = parseInt(layerBlock.style.height.substring(0, layerBlock.style.height.length-2));
		document.getElementById("urlblock").style.display = "none";
		document.getElementById("smileyblock").style.display = "none";
		layerBlock.innerHTML = "";
		while (tmpsize > 0) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize -= 10;
		}
		i += 2;
		window.setTimeout('document.getElementById("layerblock").style.display = "none";', i*10);

		//smileyBlock.style.display = "none";
		activeLayer = 0;
		gb_text.disabled = false;
		gb_text.style.background = "#FFFFFF";
		gb_text.focus();
	} else {
		gb_text.disabled = true;
		gb_text.style.background = "#C9C9C9";
		var textfield = gb_text;
		var xpos = getXPos(textfield) + 1;
		var ypos = getYPos(textfield) + 1;
		//alert("X: " + xpos + "Y: " + ypos);
		//alert("Width: " + textfield.offsetWidth);
		layerBlock.innerHTML = "";
		layerBlock.style.display = "block";
		layerBlock.style.top = ypos +  "px";	
		layerBlock.style.left = xpos + "px";
		layerBlock.style.height = 0 + "px";
		while (tmpsize < height) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize += 10;
		}
		activeLayer = SMILEYS;
		//i += 2;
		//window.setTimeout('document.getElementById("layerblock").innerHTML = document.getElementById("smileyblock").innerHTML', i*10);
		i += 8;
		//window.setTimeout('document.getElementById("layerblock").innerHTML = document.getElementById("urlblock").innerHTML', i*10);
		// clone the "hiddenContent" element and assign it to the "newContent" variable
		newContent = document.getElementById("smileyblock").cloneNode(true);
		// clear the contents of your destination element.
		so_clearInnerHTML(document.getElementById("layerblock"));
		// append the cloned element to the destination element
		document.getElementById("layerblock").appendChild(newContent);
		window.setTimeout('document.getElementById("smileyblock").style.display = "block";', i*10);
		//window.setTimeout('document.getElementById("smileyblock").innerHTML = \'' + aCode + '\';', i*10);
	}
}

function so_clearInnerHTML(obj) {
	// perform a shallow clone on obj
	nObj = obj.cloneNode(false);
	// insert the cloned object into the DOM before the original one
	obj.parentNode.insertBefore(nObj,obj);
	// remove the original object
	obj.parentNode.removeChild(obj);
}

function showUrlForm() {
	var timeout = 0;
	if (activeLayer != 0) {
		timeout = hideCurrentLayer();
		if (activeLayer != URL) {
			activeLayer = 0;
			window.setTimeout('showUrlBlock()', timeout);
		} else {
			activeLayer = 0;
		}
	} else {
		showUrlBlock();
	}
}


var _urlPos = 0;
function showUrlBlock() {
	var tmpsize = 0;
	var i = 0;
	var layerBlock = document.getElementById("layerblock");
	var text = document.getElementById("gb_text");
	var height = 135;
	if (activeLayer == URL) {
		tmpsize = parseInt(layerBlock.style.height.substring(0, layerBlock.style.height.length-2));
		layerBlock.innerHTML = "";
		document.getElementById("urlblock").style.display = "none";
		while (tmpsize > 0) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize -= 10;
		}
		i += 2;
		window.setTimeout('document.getElementById("layerblock").style.display = "none";', i*10);

		//smileyBlock.style.display = "none";
		activeLayer = 0;
		text.disabled = false;
		text.style.background = "#FFFFFF";
		text.focus();
	} else {
		text.disabled = true;
		text.style.background = "#C9C9C9";
		var xpos = getXPos(text) + 1;
		var ypos = getYPos(text) + 1;
		_urlPos = getCaretPosition(text);
		text.disabled = true;
		//alert("X: " + xpos + "Y: " + ypos);
		//alert("Width: " + textfield.offsetWidth);
		layerBlock.innerHTML = "";
		layerBlock.style.display = "block";
		layerBlock.style.top = ypos +  "px";	
		layerBlock.style.left = xpos + "px";
		layerBlock.style.height = 0 + "px";
		while (tmpsize < height) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize += 10;
		}
		activeLayer = URL;
		i += 8;
		//window.setTimeout('document.getElementById("layerblock").innerHTML = document.getElementById("urlblock").innerHTML', i*10);
		// clone the "hiddenContent" element and assign it to the "newContent" variable
		newContent = document.getElementById("urlblock").cloneNode(true);
		// clear the contents of your destination element.
		so_clearInnerHTML(document.getElementById("layerblock"));
		// append the cloned element to the destination element
		document.getElementById("layerblock").appendChild(newContent);
		window.setTimeout('document.getElementById("urlblock").style.display = "block";', i*10);
		//window.setTimeout('document.getElementById("smileyblock").innerHTML = \'' + aCode + '\';', i*10);
	}
}

function showImgForm() {
	var timeout = 0;
	if (activeLayer != 0) {
		timeout = hideCurrentLayer();
		if (activeLayer != IMG) {
			activeLayer = 0;
			window.setTimeout('showImgBlock()', timeout);
		} else {
			activeLayer = 0;
		}
	} else {
		showImgBlock();
	}
}

var _imgPos = 0;
function showImgBlock() {
	var tmpsize = 0;
	var i = 0;
	var layerBlock = document.getElementById("layerblock");
	var text = document.getElementById("gb_text");
	var height = 105;
	if (activeLayer == IMG) {
		tmpsize = parseInt(layerBlock.style.height.substring(0, layerBlock.style.height.length-2));
		layerBlock.innerHTML = "";
		document.getElementById("imgblock").style.display = "none";
		while (tmpsize > 0) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize -= 10;
		}
		i += 2;
		window.setTimeout('document.getElementById("layerblock").style.display = "none";', i*10);

		//smileyBlock.style.display = "none";
		text.disabled = false;
		text.style.background = "#FFFFFF";
		text.focus();
		activeLayer = 0;
	} else {
		text.disabled = true;
		text.style.background = "#C9C9C9";
		var xpos = getXPos(text) + 1;
		var ypos = getYPos(text) + 1;
		_imgPos = getCaretPosition(text);
		text.disabled = true;
		//alert("X: " + xpos + "Y: " + ypos);
		//alert("Width: " + textfield.offsetWidth);
		layerBlock.innerHTML = "";
		layerBlock.style.display = "block";
		layerBlock.style.top = ypos +  "px";	
		layerBlock.style.left = xpos + "px";
		layerBlock.style.height = 0 + "px";
		while (tmpsize < height) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize += 10;
		}
		i += 8;
		//window.setTimeout('document.getElementById("layerblock").innerHTML = document.getElementById("urlblock").innerHTML', i*10);
		// clone the "hiddenContent" element and assign it to the "newContent" variable
		newContent = document.getElementById("imgblock").cloneNode(true);
		// clear the contents of your destination element.
		so_clearInnerHTML(document.getElementById("layerblock"));
		// append the cloned element to the destination element
		document.getElementById("layerblock").appendChild(newContent);
		window.setTimeout('document.getElementById("imgblock").style.display = "block";', i*10);
		//window.setTimeout('document.getElementById("smileyblock").innerHTML = \'' + aCode + '\';', i*10);
		activeLayer = IMG;
	}
}

function showVideoForm() {
	var timeout = 0;
	if (activeLayer != 0) {
		timeout = hideCurrentLayer();
		if (activeLayer != VIDEO) {
			activeLayer = 0;
			window.setTimeout('showVideoBlock()', timeout);
		} else {
			activeLayer = 0;
		}
	} else {
		showVideoBlock();
	}
}

var _videoPos = 0;
function showVideoBlock() {
	var tmpsize = 0;
	var i = 0;
	var layerBlock = document.getElementById("layerblock");
	var text = document.getElementById("gb_text");
	var height = 105;
	if (activeLayer == VIDEO) {
		tmpsize = parseInt(layerBlock.style.height.substring(0, layerBlock.style.height.length-2));
		layerBlock.innerHTML = "";
		document.getElementById("videoblock").style.display = "none";
		while (tmpsize > 0) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize -= 10;
		}
		i += 2;
		window.setTimeout('document.getElementById("layerblock").style.display = "none";', i*10);

		//smileyBlock.style.display = "none";
		text.disabled = false;
		text.style.background = "#FFFFFF";
		text.focus();
		activeLayer = 0;
	} else {
		text.disabled = true;
		text.style.background = "#C9C9C9";
		var xpos = getXPos(text) + 1;
		var ypos = getYPos(text) + 1;
		_videoPos = getCaretPosition(text);
		text.disabled = true;
		//alert("X: " + xpos + "Y: " + ypos);
		//alert("Width: " + textfield.offsetWidth);
		layerBlock.innerHTML = "";
		layerBlock.style.display = "block";
		layerBlock.style.top = ypos +  "px";	
		layerBlock.style.left = xpos + "px";
		layerBlock.style.height = 0 + "px";
		while (tmpsize < height) {
			window.setTimeout('document.getElementById("layerblock").style.height = ' + tmpsize + ' + "px"', i*10);
			i++;
			tmpsize += 10;
		}
		i += 8;
		//window.setTimeout('document.getElementById("layerblock").innerHTML = document.getElementById("urlblock").innerHTML', i*10);
		// clone the "hiddenContent" element and assign it to the "newContent" variable
		newContent = document.getElementById("videoblock").cloneNode(true);
		// clear the contents of your destination element.
		so_clearInnerHTML(document.getElementById("layerblock"));
		// append the cloned element to the destination element
		document.getElementById("layerblock").appendChild(newContent);
		window.setTimeout('document.getElementById("videoblock").style.display = "block";', i*10);
		//window.setTimeout('document.getElementById("smileyblock").innerHTML = \'' + aCode + '\';', i*10);
		activeLayer = VIDEO;
	}
}

function checkVideo(obj) {
	var location = document.getElementById('videolocation');
	var button = document.getElementById('videobutton');
	var cancel = document.getElementById('videocancel');
	var enableButton = true;
	var type = 0;
	var input = "";
	var tmp;
	var YOUTUBE_VIDEO = 0x1;
	var GOOGLE_VIDEO = 0x2;
	var YAHOO_VIDEO = 0x4;
	var MYSPACE_VIDEO = 0x8;
	var ONETWOTHREE_VIDEO = 0x10;
	var UNKNOWN_VIDEO = 0x20;

	if (obj == cancel) {
		showVideoForm();
	}

	location.value = trim(location.value);
	if (location.value.substr(0, 7) == "http://") {
		location.value = location.value.substr(7, location.value.length);
	}
	if (location.value.length == 0) {
		location.style.background = "#FFFFCC";
		enableButton = false;
	} else {
		if (location.value.match(/[a-zA-Z]{2,4}\.youtube\.[a-zA-Z]{2,4}\/watch\?v=.*$/)) {
			type = YOUTUBE_VIDEO;
			input += "[youtube]";
			input += location.value.replace(/[a-zA-Z]{2,4}\.youtube\.[a-zA-Z]{2,4}\/watch\?v=/, "");
			input += "[/youtube]";
		} else if (location.value.match(/video\.google\.[a-zA-Z]{2,4}\/videoplay\?docid=.*$/)) {
			type = GOOGLE_VIDEO;
			input += "[googlevideo]";
			tmp = location.value.replace(/video\.google\.[a-zA-Z]{2,4}\/videoplay\?docid=/, "");
			input += tmp.replace(/&.*$/, "");
			input += "[/googlevideo]";
		} else if (location.value.match(/video\.yahoo\.com\/watch\/[0-9]+\/[0-9]+$/)) {
			type = YAHOO_VIDEO;
			input += "[yahoovideo]";
			input += location.value.replace(/video\.yahoo\.com\/watch\//, "");
			input += "[/yahoovideo]";
		} else if (location.value.match(/vids\.myspace\.com\/index\.cfm\?fuseaction=vids\.individual&videoid=[0-9]+$/)) {
			type = MYSPACE_VIDEO;
			input += "[myspacevideo]";
			input += location.value.replace(/vids\.myspace\.com\/index\.cfm\?fuseaction=vids\.individual&videoid=/, "");
			input += "[/myspacevideo]";
		} else if (location.value.match(/www\.123video\.nl\/playvideos.asp\?MovieID=[0-9]+$/)) {
			type = ONETWOTHREE_VIDEO;
			input += "[123video]";
			input += location.value.replace(/www\.123video\.nl\/playvideos.asp\?MovieID=/, "");
			input += "[/123video]";
		} else {
			type = UNKNOWN_VIDEO;
		}
	}
	if (enableButton) {
		button.focus();
	} else {
		if (obj == cancel) {
			location.disabled = false;
			return false;
		} else {
			location.focus();
		}
	}
	if (obj == button && enableButton) {
		setCursorPosition(_videoPos);
		insertAtPosition(input, _videoPos);
		showVideoForm();
	}
	return false;
}

function checkImg(obj) {
	var location = document.getElementById('imglocation');
	var button = document.getElementById('imgbutton');
	var cancel = document.getElementById('imgcancel');
	var enableButton = true;

	if (obj == cancel) {
		showImgForm();
	}

	if (location.value.substr(0, 7) == "http://") {
		location.value = location.value.substr(7, location.value.length);
	}
	if (location.value.length == 0) {
		location.style.background = "#FFFFCC";
		enableButton = false;
	}
	if (enableButton) {
		button.focus();
	} else {
		if (obj == cancel) {
			location.disabled = false;
			return false;
		} else {
			location.focus();
		}
	}
	if (obj == button && enableButton) {
		setCursorPosition(_imgPos);
		insertAtPosition("[img]http://" + location.value + "[/img]", _imgPos);
		showImgForm();
	}
	return false;
}

function checkUrl(obj) {
	var location = document.getElementById('urllocation');
	var description = document.getElementById('urldescription');
	var button = document.getElementById('urlbutton');
	var cancel = document.getElementById('urlcancel');
	var enableButton = true;

	if (obj == cancel) {
		showUrlForm();
	}

	if (location.value.substr(0, 7) == "http://") {
		location.value = location.value.substr(7, location.value.length);
	}
	if (location.value.length == 0) {
		location.style.background = "#FFFFCC";
		enableButton = false;
	}
	if (description.value.length == 0) {
		if (obj != location) {
			description.style.background = "#FFFFCC";
		}
		enableButton = false;
	}
	if (enableButton) {
		button.focus();
	} else {
		if (obj == location) {
			description.focus();
		} else if (obj == cancel) {
			location.disabled = false;
			return false;
		} else {
			location.focus();
		}
	}
	if (obj == button && enableButton) {
		setCursorPosition(_urlPos);
		insertAtPosition("[url=http://" + location.value + "]" + description.value + "[/url]", _urlPos);
		showUrlForm();
	}
	return false;
}

function getXPos(obj) {
	var curleft = 0;
	if(obj.offsetParent) {
        	while(1) {
			curleft += obj.offsetLeft;
          		if(!obj.offsetParent)
		            break;
          		obj = obj.offsetParent;
		}
       	} else if(obj.x) {
        		curleft += obj.x;
	}
    	return curleft;
  }

function getYPos(obj) {
	var curtop = 0;
    	if (obj.offsetParent) {   
		while(1) {
	        	curtop += obj.offsetTop;
          		if(!obj.offsetParent)
            			break;
	          	obj = obj.offsetParent;
		}
    	} else if(obj.y) {
	        curtop += obj.y;
  	}
    	return curtop;
}
