﻿// when development is over, set this to false
var DebugMode = true;

// used in GoogleMapsEditor.js
mapsLoadedStatus = 0;

// please define these constants somewhere in your code

// DefaultMessageElementId - messages can be displayed on page in some element, but if you don't define this, they will be displayed in a message box with the alert() function

var SecondsToWait = 5;

function GoBack(afterSeconds)
{
	var SecondsLeft = FindElemById('SecondsLeft');
	var message = "";
	if (afterSeconds == 0)
	{
		message = 'Redirecting back now!';
		document.title = message;
		WriteTextInElement(SecondsLeft, message);
		
		history.back();
	}
	else
	{
		message = 'Redirecting back in ' + afterSeconds + ' seconds.';
		document.title = message;
		WriteTextInElement(SecondsLeft, message);
		
		afterSeconds = afterSeconds - 1;
		setTimeout('GoBack(' + afterSeconds + ');', 1000); 
	}
}

// This is a wrapper around the document.getElementById function
// If element is not found, a debug error message is displayed.
// TODO: If getElementById is not defined, try another way.
function FindElemById(id)
{
	var elem;
	if (id && id.length && id.length > 0)
	{
		elem = document.getElementById(id);
		if (!elem)
		{
			ShowDebugMessage('Element [' + id + '] could not be found within the current document.');
		}
	}
	else
	{
		ShowDebugMessage('ID not specified.');
	}
	return elem;
}

function ShowMessage(message)
{
	ShowMessageInElement(message, DefaultMessageElementId);
}

function ShowMessageInElement(message, divId)
{
	var div = FindElemById(divId);
	
	if (div && div.nodeType == 1)
	{
		WriteTextInElement(div, message, true);
	}
	else
	{
		alert(message);
	}
}

// Shows a debug message, only if DebugMode = true 
// (that global variable can probably be overridden on a page level, to allow debugging only certain pages)
function ShowDebugMessage(message)
{
	if (DebugMode)
	{
		alert(message);
	}
}

function WriteTextInElement(elem, text, overwrite)
{
	if (overwrite != false && overwrite != true)
	{
		overwrite = true;
	}
	if (overwrite)
	{
		DeleteTextNodeChildren(elem);
	}
	AddTextNode(elem, text);
}

function AddTextNode(elem, text)
{
	if (elem && elem.nodeType == 1)
	{
		var t = document.createTextNode(text);
		elem.appendChild(t);
	}
	else
	{
		ShowDebugMessage('Cannot add a text node to the node. The node is not defined or it\'s nodeType is not element. The node is: [' + elem + ']');
	}
}

function DeleteTextNodeChildren(elem)
{
	if (elem && elem.nodeType == 1)
	{
		var textNodeChildFound = true;
		while (elem.hasChildNodes() && textNodeChildFound)
		{
			textNodeChildFound = false;
			for (var i=0; i<elem.childNodes.length; i++)
			{
				if (elem.childNodes[i].nodeType == 3)
				{
					elem.removeChild(elem.childNodes[i]);
					textNodeChildFound = true;
				}
			}
		}
	}
	else
	{
		ShowDebugMessage('Cannot delete child text nodes of the node. The node is not defined or it\'s nodeType is not element. The node is: [' + elem + ']');
	}
}

function confirm_delete(message, disable)
{
	if (disable)
	{
		return true;
	}
	else
	{
		if (!message)
		{
			message = "Please confirm the delete operation.";
		}
		
		if (confirm(message) == true)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
}

function BlockEnabled(parameterBlockId, status, checkbox)
{
	var block = FindElemById(parameterBlockId);
	if (block)
	{
		if (status == false)
		{
			//block.className += " Disabled";
			SetDisableForAllChildren(block.childNodes, 'disabled', checkbox);
		}
		else
		{
			//block.className = block.className.replace("Disabled", "");
			SetDisableForAllChildren(block.childNodes, '', checkbox);
		}
	}
}

function SetDisableForAllChildren(elements, disabledValue, excludedControl)
{
	for (var i=0; i<elements.length; i++)
	{
		if (elements[i].nodeType == 1 && elements[i].nodeName != 'OPTION')
		{
			if ((elements[i].nodeName == 'INPUT' || elements[i].nodeName == 'SELECT') && (!excludedControl || elements[i].id != excludedControl.id))
			{
				elements[i].disabled = disabledValue;
			}
			if (elements[i].childNodes.length > 0)
			{
				SetDisableForAllChildren(elements[i].childNodes, disabledValue, excludedControl);
			}
		}
	}
}

function showStartCalendarStateBlock(blockID, checkboxID)
{
	var block = FindElemById(blockID);
	var checkbox = FindElemById(checkboxID);
	if (block && checkbox)
	{
		if (checkbox.checked == false)
		{
			block.className += " Hidden";
		}
		else
		{
			block.className = block.className.replace("Hidden", "");
		}
	}
}

function capLock(e, divCapsLockWarning)
{
	
	var kc = e.keyCode ? e.keyCode : e.which;
	var sk = e.shiftKey ? e.shiftKey : ((kc == 16) ? true : false);
	var warning = document.getElementById(divCapsLockWarning);
	DeleteTextNodeChildren(warning);
	warning.style.display = "none";
	if (((kc >= 65 && kc <= 90) && !sk)||((kc >= 97 && kc <= 122) && sk))
	{
		AddTextNode(warning, 'Caps Lock is on.');
		warning.style.display = "block";
	}
}

function SetSelVal(sel, val)
{
	for (var i=0; i< sel.options.length; i++)
	{
		if (sel.options[i].value == val)
		{
			sel.selectedIndex = i;
		}
	}
}

function unloadGoogle()
{
	if (mapsLoadedStatus && mapsLoadedStatus == 1 && google && google.maps && google.maps.Unload)
	{
		google.maps.Unload();
	}
}

// http://www.tek-tips.com/faqs.cfm?fid=6620
String.prototype.startsWith = function(str) {return (this.match('^'+str)==str)};
String.prototype.endsWith = function(str) {return (this.match(str+'$')==str)};
String.prototype.trim = function(){return (this.replace(/^[\s\xA0]+/, '').replace(/[\s\xA0]+$/, ''))}
