
/*  Helper JavaScript for the syntax highlighter files */

var lastRequest = {};

function ShowResults (show)
{
	var display = show ? "" : "none";
	var resultDiv = document.getElementById ("resultDiv");
	resultDiv.style.display = display;
	if (show) {
		resultDiv.scrollIntoView (true);
	}
}

function URLEncode (text) {

	var encoded = text.replace (/%/g, "%25");
	encoded = encoded.replace (/&/g, "%26");
	encoded = encoded.replace (/=/g, "%3D");
	encoded = encoded.replace (/\+/g, "%2B");

/*
	encoded = encoded.replace (/'/g, "%27");	
	encoded = encoded.replace (/"/g, "%22");
	encoded = encoded.replace (/</g, "%3C");
	encoded = encoded.replace (/>/g, "%3E");
*/
	return encoded;
}

var isTabDown = false;
function CheckChar (event, textarea) {
	var key = event.keyCode;
	if (key) {
		if (key == 9) {
			isTabDown = true;
			if (event.shiftKey) {
				return false;
			}
			if (textarea.selectionStart !== undefined) {
				var selectionStart = textarea.selectionStart;
				var selectionEnd = textarea.selectionEnd;
				var contents = textarea.value;
				textarea.value = contents.substring (0, selectionStart) + "\t" + contents.substring(selectionEnd);
				textarea.selectionStart = selectionStart + 1;
				textarea.selectionEnd = selectionStart + 1;
			} else if (document.selection) {
				var range = document.selection.createRange ();
				range.text = "\t";
				range.select ();
			}
			return false;
		}
	}
	return true;
}

function onTabPressed () {
	if (isTabDown) {
		return false;
	}
	return true;
}

var httpRequest = null;
function OnHighlight (form, lang)
{
	ShowResults (false);
	var source = document.getElementById ("sourceInput").value;
	if (source.length == 0) {
		alert ("Please specify your source code to highlight!");
		return false;
	}

	if (!httpRequest) {
		httpRequest = Dottoro.CreateHTTPRequestObject ();	// defined in xml.js
	}
	if (!httpRequest) {
		alert ("Sorry, this service is not available for your browser!");
		return false;
	}

	lastRequest.compress = document.getElementById ("compressCBox").checked;
	lastRequest.lineNumbers = document.getElementById ("lineNumbersCBox").checked;

	lastRequest.helpLinks = false;
	var helpLinksCBox = document.getElementById ("helpLinksCBox");
	if (helpLinksCBox) {
		lastRequest.helpLinks = helpLinksCBox.checked;
	}
	
	lastRequest.nofollow = document.getElementById ("nofollowCBox").checked;

	lastRequest.tabSize = 0;
	if (document.getElementById ("replaceTabsCBox").checked) {
		lastRequest.tabSize = document.getElementById ("tabSizeInput").value;
	}
	lastRequest.viewPlainButton = "";
	if (document.getElementById ("viewPlainButtonCBox").checked) {
		lastRequest.viewPlainButton = document.getElementById ("viewPlainButtonTitleInput").value;
	}
	lastRequest.copyButton = "";
	if (document.getElementById ("copyButtonCBox").checked) {
		lastRequest.copyButton = document.getElementById ("copyButtonTitleInput").value;
	}
	lastRequest.printButton = "";
	if (document.getElementById ("printButtonCBox").checked) {
		lastRequest.printButton = document.getElementById ("printButtonTitleInput").value;
	}
	
	lastRequest.source = source;

	var requestContent = "lang=" + lang;
	requestContent += "&compress=" + (lastRequest.compress ? "true" : "false");
	requestContent += "&lineNumbers=" + (lastRequest.lineNumbers ? "true" : "false");
	requestContent += "&nofollow=" + (lastRequest.nofollow ? "true" : "false");
	requestContent += "&helpLinks=" + (lastRequest.helpLinks ? "true" : "false");
	requestContent += "&tabSize=" + lastRequest.tabSize;
	requestContent += "&viewPlainButton=" + URLEncode (lastRequest.viewPlainButton);
	requestContent += "&copyButton=" + URLEncode (lastRequest.copyButton);
	requestContent += "&printButton=" + URLEncode (lastRequest.printButton);
	requestContent += "&source=" + URLEncode (lastRequest.source);
	
	httpRequest.open ("POST", "doHighlight.php", true);	// async
	httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
	httpRequest.onreadystatechange = OnHighlightStateChange;
	httpRequest.send (requestContent);

	return false;			
}

function OnHighlightStateChange () {
	if (httpRequest.readyState == 4) {
		var error_message = "The service is temporary unavailable. Please try it later.";
		if (httpRequest.status == 200 || httpRequest.status == 304) {
			var response = httpRequest.responseText;
			if (response) {
				if (response.substring (0, 6) == "Error:") {
					error_message = response;
				}
				else {
					var sep = response.indexOf (":");
					if (sep >= 0) {
						lastRequest.requestID = response.substring (0, sep);
						response = response.substring (sep+1);
					}
					else {
						lastRequest.requestID = "";
					}
					OnHighlightReady (response);
					return;
				}
			}
		}
		alert (error_message);
	}
}

function OnHighlightReady (response)
{
	var outputHTML = document.getElementById ("outputHTML");
	var outputText = document.getElementById ("outputText");
	
	if (lastRequest.compress) {
		outputHTML.innerHTML = Dottoro.HighLighter.UnpackSource (response);
	}
	else {
		outputHTML.innerHTML = response;
	}

	var dimMessage = "";
	var dims = GetDimensions (outputHTML.innerHTML);
	if (dims["width"] > 880 || dims["height"] > 600) {
		var pres = outputHTML.getElementsByTagName ("pre");
		if (pres.length > 0) {
			var codeContainer = pres[0].parentNode;
			while (codeContainer && codeContainer.tagName.toLowerCase () != "div") {
				codeContainer = codeContainer.parentNode;
			}
			if (codeContainer) {
				codeContainer.style.overflow = "auto";
				if (dims["width"] > 880) {
					codeContainer.style.width = "880px";
					if (codeContainer.style.overflowX !== undefined) {
						codeContainer.style.overflowX = "scroll";
					}
					dimMessage += "wider";
				}
				if (dims["height"] > 600) {
					codeContainer.style.height = "600px";
					if (dimMessage != "") {
						dimMessage += " and ";
					}
					dimMessage += "higher";
				}
				dimMessage = "The highlighted code probably will be " + dimMessage + " on your site. Please see the <a href='/services/highlighter/docs/themes.php'>Examples of Customization</a> page that describes how to modify the dimensions of it.";
			}
		}
	}

	outputText.value = response;

	var dimMessageDiv = document.getElementById ("dimMessageDiv");
	dimMessageDiv.innerHTML = dimMessage;

	ShowResults (true);
	
/*			if (typeof (XMLSerializer) != "undefined") {
		var serializer = new XMLSerializer();
		output.value = serializer.serializeToString(response);
	}
	else {
		output.value = response.xml;
	}*/
}

function GetDimensions (source) {
	var tmpOutput = document.createElement ("div");
	tmpOutput.style.position = "absolute";
	tmpOutput.style.left = "10000px";
	tmpOutput.style.top = "10000px";
	tmpOutput.innerHTML = source;
	document.body.appendChild (tmpOutput);

	var dims = {width: tmpOutput.offsetWidth, height: tmpOutput.offsetHeight};
	document.body.removeChild (tmpOutput);

	return dims;
}

function OnReplaceTabsChanged () {
	var isChecked = document.getElementById ("replaceTabsCBox").checked;
	document.getElementById ("tabSize_Group").style.display = isChecked ? "" : "none";
}

function OnViewPlainButtonChanged () {
	var isChecked = document.getElementById ("viewPlainButtonCBox").checked;
	document.getElementById ("viewPlainButtonTitle_Group").style.display = isChecked ? "" : "none";
}

function OnCopyButtonChanged () {
	var isChecked = document.getElementById ("copyButtonCBox").checked;
	document.getElementById ("copyButtonTitle_Group").style.display = isChecked ? "" : "none";
}

function OnPrintButtonChanged () {
	var isChecked = document.getElementById ("printButtonCBox").checked;
	document.getElementById ("printButtonTitle_Group").style.display = isChecked ? "" : "none";
}

function SendBug ()
{
	lastRequest.requestID
	lastRequest.source

	var requestContent = "requestID=" + lastRequest.requestID;
	requestContent += "&source=" + URLEncode (lastRequest.source);
	
	httpRequest.open ("POST", "bugReport.php", true);	// async
	httpRequest.onreadystatechange = null;	// no wait for response
	httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	httpRequest.send (requestContent);

	alert ("Thanks for your help.");
}