/* --------------------------------------------------- Globals support ---------------------------------------------------- */

var globals = new Object;



/* ------------------------------------------------- Modastrings support -------------------------------------------------- */

var modastrings = new Object();

modastrings.strings = new Array();

modastrings.set = function(module, id, value)
{
  key = module + "_" + id;
  modastrings.strings[key] = value;
};

modastrings.get = function(module, id)
{
  key = module + "_" + id;
  if (!modastrings.strings[key])
  {
    return key;
  }
  else
    return modastrings.strings[key];
};


/* ----------------------------------------------------- Ajax support ----------------------------------------------------- */

function GetRequestObject()
{
  var result = null;
  try
  {
    // Firefox, Opera 8.0+, Safari
    result = new XMLHttpRequest();
  }
  catch (e)
  {
    // Internet Explorer
    try
    {
      result = new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e)
    {
      result = new ActiveXObject("Microsoft.XMLHTTP");
    }
  }
  if (result == null)
  {
    alert ("Your browser does not support AJAX!");
    return;
  }
  return result;
}

function ExecuteScript(jscode)
{ 
  if (jscode == undefined) return;
  with (window)
  {
    if (window.execScript)
      window.execScript(jscode);    
    else
      window.eval(jscode);
  }
}


function IncludeURL(url, elementid, postdata, evalScripts, addToInnnerHTML)
{
  var req = GetRequestObject();
  if (!evalScripts) evalScripts = true;
  if (!addToInnnerHTML) addToInnnerHTML = false;

	img = "<div class='loading'><img src='themes/image/loading.gif' alt='loading' /></div>";
	if (addToInnnerHTML)
	  document.getElementById(elementid).innerHTML += img;
	else
	  document.getElementById(elementid).innerHTML = img;
  req.onreadystatechange = function()
  {
    if (req.readyState == 4)
    {
    	if (addToInnnerHTML)
	      document.getElementById(elementid).innerHTML += req.responseText;
    	else
	      document.getElementById(elementid).innerHTML = req.responseText;
      //evaluate scripts here
//      if (evalScripts)
      {
	      scripts = document.getElementById(elementid).getElementsByTagName("script");
	      for (i in scripts)
	      {
	      	if (scripts[i] != undefined)
	      	{
	      	  try
	      	  {
              if ((scripts[i].innerHTML != undefined) && (Trim(scripts[i].innerHTML) != ""))
                ExecuteScript(scripts[i].innerHTML);
  		      }
  		      catch (error)
  		      {
  		        alert("An error occured: " + error + "\n\n'" + scripts[i].innerHTML + "'");
  		      }
		      }
	      }
	    }
    }
  }

  if (postdata == undefined)
  {
  	if (url.indexOf("?") == -1) url += "?";
	  req.open("GET", url + "&fillobjectid=" + elementid, true);
	  req.send(null);
	}
	else
	{
	  req.open("POST", url, true);
	 	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.send(postdata + "&fillobjectid=" + elementid);
	}
  return false;
}

function GetXMLTree(url, callback, postdata)
{
  var req = GetRequestObject();

  req.onreadystatechange = function()
  {
    if ((this.readyState == 4) && (callback != undefined))
    	callback(req);
	}

  if (postdata == undefined)
  {
	  req.open("GET", url, true);
		alert(navigator.userAgent);
		req.setRequestHeader("User-Agent", navigator.userAgent);
	  req.send(null);
	}
	else
	{
  	alert("POST");
	  req.open("POST", url, true);
		req.setRequestHeader("User-Agent", navigator.userAgent);
	 	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
		req.send(postdata);
	}
  return false;
}

function SendFormAsAjax(form, fillobjectid, evalScripts, addToInnnerHTML)
{
	if (fillobjectid == undefined)
		fillobjectid = "lightbox_ajax_data";
	postdata = "";
	for (i in form.elements)
	{
		obj = form.elements[i];
		if ((obj != undefined) && (obj.nodeName != undefined))
		{
			tag = obj.nodeName;
			if ((tag == "INPUT") || (tag == "SELECT") || (tag == "TEXTAREA"))
			{
				postdata += "&" + obj.name + "=" + URLEncode(obj.value);
			}
		}
	}
	url = form.action;
	if (form.method == "get")
	{
	 	if (url.indexOf("?") == -1) url += "?";
		IncludeURL(url + postdata, fillobjectid, null, evalScripts, addToInnnerHTML);
	}
	else
	{
		IncludeURL(url, fillobjectid, postdata, evalScripts, addToInnnerHTML);
	}
}

function SendAJAXRequest(url, postdata, async)
{
  var req = GetRequestObject();
  var result = "";

  if (async == undefined) async = true;

  if (req == null)
  {
    alert ("Your browser does not support AJAX!");
    return;
  }

  req.open("POST", url, async);
 	req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  req.send(postdata);
  return req.responseText;
}

function timeoutRequest(req)
{
}

function LoadExternalJSScript(url)
{
  scriptObj = document.createElement("script");
	scriptObj.setAttribute("type","text/javascript");
	scriptObj.setAttribute("src", url);
	document.getElementsByTagName("head")[0].appendChild(scriptObj);
}

function LoadExternalCSS(url)
{
  linkObj = document.createElement("link");
	linkObj.setAttribute("rel","stylesheet");
	linkObj.setAttribute("type","text/css");
	linkObj.setAttribute("href", url);
	document.getElementsByTagName("head")[0].appendChild(linkObj);
}

/* --------------------------------------------------- Datatype support --------------------------------------------------- */

var decimalChar = ",";//(1/2).toString().charAt(1);
var seperatorChar = ".";//(decimalChar == ".") ? "," : ".";

function Trim(s)
{
  while ((s.substring(0, 1) == " ") || (s.substring(0, 1) == "\n") || (s.substring(0, 1) == "\r") || (s.substring(0, 1) == "\t"))
    s = s.substring(1, s.length);
  while ((s.substring(s.length - 1, s.length) == " ") || (s.substring(s.length - 1, s.length) == "\n") || (s.substring(0, 1) == "\r") || (s.substring(s.length - 1, s.length) == "\t"))
    s = s.substring(0, s.length - 1);
  return s;
}

function StripLastNewLines(s)
{
  while ((s.substring(s.length - 1, s.length) == "\n") || (s.substring(s.length - 1, s.length) == "\r"))
    s = s.substring(0, s.length - 1);
  return s;
}

function URLEncode(str)
{
  var result = escape(str);
  result = result.replace("+", "%2B");
  result = result.replace("/", "%2F");
  return result;
}

function AddSlashes(s)
{
  s = s.replace(/\'/g,'\\\'');
  s = s.replace(/\"/g,'\\"');
  s = s.replace(/\\/g,'\\\\');
  s = s.replace(/\0/g,'\\0');
  return s;
}

function StripSlashes(s)
{
  s = s.replace(/\\'/g,'\'');
  s = s.replace(/\\"/g,'"');
  s = s.replace(/\\\\/g,'\\');
  s = s.replace(/\\0/g,'\0');
  return s;
}

function StrPad(str, length, chr)
{
	while (str.length < length)
		str = chr + str;
	return str;
}

function StrToNumber(s)
{
	s = s.replace(seperatorChar, "");
	if (decimalChar != ".")
		return Number(s.replace(decimalChar, "."));
	else
		return Number(s);
}

function NumberToStr(n)
{
	if (decimalChar == ".")
		return n;
	else
	{
		s = new String(n);
		return s.replace(".", decimalChar);
	}
}

function SecondsToTimeStr(sec)
{
	return Math.floor(sec / 60) + ":" + StrPad((sec % 60).toString(), 2, "0");
}

//------------------------------------------------------------------------------

function GetAddr(domain, username)
{
  return username + "@" + domain;
}

function DisplayAddr(id, domain, username, title)
{
  addr = GetAddr(domain, username);
  if (title != "")
    document.getElementById(id).innerHTML = title;
  else
    document.getElementById(id).innerHTML = addr;
  document.getElementById(id).href = "mailto:" + addr;
}

function StripTags(str)
{
  return str.replace(/<(\S+).*>(.*)<\/\1>/, "");
}

function IsArray(obj)
{
//	Source: http://www.bram.us/2008/02/01/javascript-isarray-check-if-an-elementobject-is-an-array/
  return obj.constructor == Array;
}


/* ---------------------------------------------------- Forms support ----------------------------------------------------- */

var lightbox_dbfiles_folderid = 0;
var lightbox_dbfiles_filter = "";
var lightbox_dbfiles_dbfilesbox = "false";
var lightbox_dbfiles_showproperties = "true";
var lightbox_dbfiles_callback = undefined;

function LightboxDBFilesOpenFolder(folderid)
{
	if (folderid < 0)	folderid = lightbox_dbfiles_folderid;
	else lightbox_dbfiles_folderid = folderid;
	
  if (document.getElementById("lightbox_ajax").style.display == "block")
    action = "updatelist";
  else
    action = "selectfile";

  var url = "/ajax/dbfiles/" + action + "?";
  url += "&showproperties=" + lightbox_dbfiles_showproperties;
  url += "&dbfilesbox=" + lightbox_dbfiles_dbfilesbox;
  url += "&filter=" + lightbox_dbfiles_filter;
  url += "&folderid=" + folderid;

  if (lightbox_dbfiles_callback != undefined)
  	url += "&callback=" + lightbox_dbfiles_callback;

	if (action == "updatelist")
		IncludeURL(url, "dbfiles_selectfile_filecontainer");
	else
	{
    document.getElementById("lightbox_ajax_data").innerHTML = ""; //force clear element;
		ShowElement("lightbox_ajax");
		IncludeURL(url, "lightbox_ajax_data");
	}
}

function LightboxDBFilesSetUploadFolder(targetid, uploadform)
{
  document.getElementById("lightbox_folderfilelist").innerHTML = "<div class='loading'><img src='themes/image/loading.gif' alt='loading' /></div>";
  document.getElementById("folderid").value = lightbox_dbfiles_folderid;
}

//---------------------------------------------------------------------------------------------------------

function CheckInput(event, editbox, charlist)
{
	var keynum;
	var keychar;
	var numcheck;

	if (window.event) keynum = event.keyCode;
	else if (event.which) keynum = event.which;

	keychar = String.fromCharCode(keynum);
	result = (charlist.indexOf(keychar) == -1);

	if (!result)
	{
		oldColor = editbox.style.backgroundColor;
		editbox.style.backgroundColor = "#FFCCCC";
		setTimeout('document.getElementById("' + editbox.id + '").style.backgroundColor = "' + oldColor + '";', 100);
	}
	return result;
}

function ToggleAllCheckboxesInForm(formid)
{
	form = document.getElementById(formid);
	for (var i=0; i < form.length; i++)
	{
		if (form.elements[i].type == "checkbox")
		{
			if (form.elements[i].checked)
				form.elements[i].checked = "";//(form.elements[i].checked  == "false");
			else
				form.elements[i].checked = "checked";//(form.elements[i].checked  == "false");
		}
	}
}

function ValidateFormIds(strIds, errorMsg)
{
  ids = strIds.split(";");
  if (ids[ids.length - 1] == "") ids.pop();
  fields = new Array();
  for (i = 0; i < ids.length; i++)
  {
    active = true;
    title = "";
    value = "";
    isRadioGroup = false;

    if (ids[i].search(/radiogroup_/) == 0)
    {
      isRadioGroup = true;
      id = ids[i].substr(11);
      ids[i] = id + "_0";

      j = 0;
      radio = document.getElementById(id + "_0");
      while (radio)
      {
        if (radio.checked) value = radio.value;
        j++;
        radio = document.getElementById(id + "_" + j);
      }
    }

    obj = document.getElementById(ids[i]);
    if (!isRadioGroup) value = obj.value;

    parentObj = obj;
    while (parentObj != document)
    {
      if (parentObj.style.display == "none")
        active = false;
      parentObj = parentObj.parentNode;
    }

    if ((active) && (Trim(value) == ""))
      fields.push(obj.title);
  }


  if (fields.length > 0)
  {
    str = "";
    for (i = 0; i < fields.length; i++)
      str += "- " + StripTags(fields[i]) + "\n";
    alert(errorMsg + str);
    return false;
  }
  else
    return true;
}

function OnComboChangeUserOption(combo)
{
	if (combo.value == "%userdefined%")
	{
		onLightBoxPrompt_CallBack = function (value)
		{
			var newOption = document.createElement("option");
			newOption.text = value;
			newOption.value = value;

			try
			{
				combo.add(newOption, null); // standards compliant
			}
			catch(ex)
			{
				combo.add(newOption); // IE only
			}
			combo.value = value;
		}

		onLightBoxDataCancel_CallBack = function ()
		{
			combo.selectedIndex = 0;
		}

		LightBoxPrompt("Extra", "");
	}
}

//-------------------------------------------------------------------------------

function KeyValue_UpdateNewObject(obj, index)
{
  if ((obj.tagName == "DIV") || (obj.tagName == "TR") || (obj.tagName == "INPUT") || (obj.tagName == "SELECT") || (obj.tagName == "TEXTAREA"))
  {
    count = obj.attributes.length;
  	for (var i = 0; i < count; i++)
  	{
      key = obj.attributes[i].nodeName;
      value = obj.attributes[i].nodeValue;
      obj.setAttribute(key, value.replace("kv-template", index));
    }
  }
  
	children = obj.childNodes;
	for (var i = 0; i < obj.childNodes.length; i++)
    if (obj.childNodes[i].tagName != "TEXT")
      KeyValue_UpdateNewObject(obj.childNodes[i], index);
}

function KeyValue_AddRow(kvId)
{
  index = parseInt(document.getElementById(kvId + "_counter").value);
  document.getElementById(kvId + "_counter").value = ++index;
  
	var newObj = document.getElementById(kvId + "_kv-template").cloneNode(true);
	KeyValue_UpdateNewObject(newObj, index);
	newObj.style.display = "table-row";	
	document.getElementById(kvId + "_table").appendChild(newObj);
  return index;
}

function KeyValue_DeleteRow(rowObj, hintid)
{
  HideElement("hint_" + hintid);
  rowObj.parentNode.removeChild(rowObj);
}

function OnSortBoxOptionChange(idbase, idcount, changedObj)
{
  var shouldBeSum = 0;
  var realSum = 0;
  for (i = 1; i <= idcount; i++)
  {
  	shouldBeSum += i;
  	realSum += parseInt(document.getElementById(idbase + i).value);
  }

  newValue = parseInt(changedObj.value);
  oldValue = newValue + (shouldBeSum - realSum);

  for (i = 1; i <= idcount; i++)
  {
  	if (((idbase + i) != changedObj.id) &&
  			(document.getElementById(idbase + i).value == newValue))
  		document.getElementById(idbase + i).value = oldValue;
  }

}

//-------------------------------------------------------------------------------

function GetCaretPos(textarea)
{
	var result = {start: 0, end: 0, caret: 0};

	if (navigator.appVersion.indexOf("MSIE")!=-1)
	{
		if (textarea.tagName.toLowerCase() == "textarea")
		{
			var range1 = document.selection.createRange();
			var range2 = range1.duplicate();
			var offset = textarea.value.length - (StripLastNewLines(textarea.value)).length;

			range2.moveToElementText(textarea);
			range2.setEndPoint('StartToEnd', range1);
			result.end = textarea.value.length - range2.text.length - offset;

			range2.setEndPoint('StartToStart', range1);
			result.start = textarea.value.length - range2.text.length - offset;
			result.caret = result.end;
		}
		else
		{
			var range1 = document.selection.createRange();
			var range2 = range1.duplicate();
			result.start = 0 - range2.moveStart('character', -100000);
			result.end = result.start + range1.text.length;
			result.caret = result.end;
		}
	}
	else
	{
		result.start = textarea.selectionStart;
    result.end = textarea.selectionEnd;
		result.caret = result.end;
	}
	if (result.start < 0)
	 result = {start: 0, end: 0, caret: 0};
	return result;
}

function SetCaretPos(textarea, caretInfo)
{
	if (textarea.setSelectionRange)
	{
		textarea.focus();
		textarea.setSelectionRange(caretInfo.start, caretInfo.end);
	}
	else if (textarea.createTextRange)
	{
		var range = textarea.createTextRange();
		range.collapse(true);
		range.moveEnd('character', caretInfo.end);
		range.moveStart('character', caretInfo.start);
		range.select();
	}
}

//-------------------------------------------------------------------------------


var enhmemoid = "";
var enhmemofolderid = 0;
var enhmemo_caret_info = {start:0, end:0, caret:0};

function EnhWindowParams(resizable, width, height)
{
  //resizable = "yes"; //Uncomment for debugging
  return "toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=" + resizable + ", copyhistory=no, width=" + width + ", height=" + height;
}

function OnEnhMemoBlur(Memo)
{
	enhmemo_caret_info = GetCaretPos(Memo);
}

function OnEnhMemoFocus(Memo)
{
	SetCaretPos(Memo, enhmemo_caret_info);
}

function EnhMemoSetText(id, text, newLineTag)
{
	var memo = document.getElementById(id);
	var info = enhmemo_caret_info;
  var crossPos = text.indexOf("¤");
  var leftCode = text.substr(0, crossPos);
  var scrollTop = memo.scrollTop

  if (crossPos > 0)
	  var rightCode = text.substring(crossPos + 1, text.length);
	else
	  var rightCode = text;
	  
	if (info.end == 0)
		memo.value = leftCode + rightCode + memo.value;
	else if (info.start == memo.value.length)
		memo.value = memo.value + leftCode + rightCode;
	else
	{
		var leftText = memo.value.substring(0, info.start);
		var rightText = memo.value.substring(info.end, memo.value.length);

		if (crossPos > 0)
		{
			var middleText = memo.value.substring(info.start, info.end);
			if (newLineTag != "")
				middleText = middleText.replace(/\n/g, newLineTag).replace(/\r/g,"");
			var newText = leftCode + middleText + rightCode;
		}
		else
			var newText = leftCode + rightCode;

		memo.value = leftText + newText + rightText;
		info.end = (info.start + newText.length);
		memo.focus();
		SetCaretPos(memo, info);
	}
	memo.scrollTop = scrollTop;
}

function EnhMemoGetSelection(id)
{
	var memo = document.getElementById(id);
	var info = enhmemo_caret_info;
	return memo.value.substring(info.start, info.end);
}

function EnhMemoSelectionToBold(id)
{
	EnhMemoSetText(id, "[b]¤[/b]", "");
}

function EnhMemoSelectionToUnderline(id)
{
	EnhMemoSetText(id, "[u]¤[/u]", "");
}

function EnhMemoSelectionToItalic(id)
{
	EnhMemoSetText(id, "[i]¤[/i]", "");
}

function EnhMemoSelectionToUnorderedList(id)
{
	EnhMemoSetText(id, "[bullets]\n¤[/bullets]", "");
}

function EnhMemoSelectionToOrderedList(id)
{
	EnhMemoSetText(id, "[list]\n¤[/list]", "");
}

function EnhMemoInsertModaImage(id)
{
  enhmemoid = id;
	if (isMSIE6OrLess())
	{
	  var url = "?action=enhancedmemo-modaimg&filter=bmp;wmf;jpeg;jpg;gif;png;";
	  var moda = window.open(url, "enhmodaimg", EnhWindowParams("yes", 780, 550));
	  moda.opener = self;
	  moda.focus();
	}
	else
	{
		lightbox_dbfiles_dbfilesbox = "false";
		lightbox_dbfiles_showproperties = "true";
		lightbox_dbfiles_filter = "bmp;wmf;jpeg;jpg;gif;png;";
		lightbox_dbfiles_callback = undefined;
	  LightboxDBFilesOpenFolder();
	}
}

function EnhMemoInserModaImageSelectFile(fileid)
{
	if (document.getElementById("dbfiles_selectfile_admincontainer") != undefined)
	{
		tag = "modaimg";
		align = document.getElementById("dbfiles_selectfile_position").value;
		if ((align == "left") || (align == "right")) tag += "-" + align;

		if (document.getElementById("dbfiles_selectfile_popup").checked)
			tag += "-large";

		attrib = "";
		width = document.getElementById("dbfiles_selectfile_width").value;
		if (width > 0) attrib = " width=" + width;

		text = "[" + tag + attrib + "]" + fileid + "[/" + tag + "]";
		if (align == "center")
			text = "[center]" + text + "[/center]";
	}
	else
		text = "[modaimg-left]" + fileid + "[/modaimg-left]";
	EnhMemoSetText(enhmemoid, text, "");
	HideElement("lightbox_ajax");
}

function EnhMemoInsertGoogleImage(id)
{
  var url = "?action=enhancedmemo-googleimg";
  var moda = window.open(url, "enhgoogleimg", EnhWindowParams("yes", 780, 550));
  moda.opener = self;
  enhmemoid = id;
  moda.focus();
}

function EnhMemoInsertImageLink(id)
{
 	onLightBoxPrompt_CallBack = function (url)
	{
	  EnhMemoSetText(id, "[img]" + url + "[/img]", "");
	}
	onLightBoxDataCancel_CallBack = function ()
	{
		document.getElementById(id).focus();
	}
  LightBoxPrompt(modastrings.get("enhmemo", "url"), "http://");
}

function EnhMemoInsertEmail(id)
{
	var selText = EnhMemoGetSelection(id);
	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	var emailDefault = "";
	var nameDefault = "";

	if (filter.test(Trim(selText)))
		emailDefault = Trim(selText);
	else
		nameDefault = selText;

	onLightBoxPrompt_CallBack = function (email)
	{
		onLightBoxPrompt_CallBack = function (name)
		{
			if (name == "")
				EnhMemoSetText(id, "[email]" + email + "[/email]", "");
			else
				EnhMemoSetText(id, "[email=" + email + "]" + name + "[/email]", "");
		}
	  LightBoxPrompt(modastrings.get("enhmemo", "name_optional"), nameDefault);
		return true;
	}
  LightBoxPrompt(modastrings.get("enhmemo", "email"), emailDefault);
	return false;
}

function EnhMemoInsertLink(id)
{
	var selText = Trim(EnhMemoGetSelection(id));
	var urlDefault = "http://";
	var nameDefault = "";

	spacePos = selText.indexOf(" ");
	protPos = selText.indexOf("://");
	wwwPos = selText.indexOf("www.");

	if ((spacePos == -1) && ((protPos < 10) && (protPos >=0) || ((wwwPos < 10) && (wwwPos >=0))))
	{
		urlDefault = selText;
		if (protPos == -1)
			urlDefault = "http://" + urlDefault;
	}
	else
		nameDefault = selText;

	onLightBoxPrompt_CallBack = function (url)
	{
		onLightBoxPrompt_CallBack = function (desc)
		{
			if (desc == "")
				EnhMemoSetText(id, "[url]" + url + "[/url]", "");
			else
				EnhMemoSetText(id, "[url=" + url + "]" + desc + "[/url]", "");
		}
	  LightBoxPrompt(modastrings.get("enhmemo", "description_optional"), nameDefault);
		return true;
	}
  LightBoxPrompt(modastrings.get("enhmemo", "url"), urlDefault);
	return false;
}

function EnhMemoModaLink(id)
{
  var url = "?action=enhancedmemo-modalink";
  var moda = window.open(url, "enhmodalink", EnhWindowParams("no", 500, 230));
  moda.opener = self;
  enhmemoid = id;
  moda.focus();
}

function EnhMemoEmoticons(id)
{
  enhmemoid = id;
	url = "ajax/core/enhmemo-emoticons";
	ToggleShowElement("lightbox_ajax");
	IncludeURL(url, "lightbox_ajax_data");
}

function EnhMemoYouTube(id)
{
	onLightBoxPrompt_CallBack = function (url)
	{
		EnhMemoSetText(id, "[youtube]" + url + "[/youtube]", "");
	}
  LightBoxPrompt(modastrings.get("enhmemo", "youtube_url"), Trim(EnhMemoGetSelection(id)));
	return true;
}

function EnhMemoAddFromOpener(text)
{
  opener.EnhMemoSetText(opener.enhmemoid, " " + text + " ", "");
  opener.focus();
}

function EnhMemoPreview(id)
{
	var Memo = document.getElementById(id);
	url = "ajax/core/enhmemo-preview";
	postdata = "text=" + URLEncode(Memo.value);
	ToggleShowElement("lightbox_ajax");
	IncludeURL(url, "lightbox_ajax_data", postdata);
}

function EnhMemoHelp(id)
{
	url = "ajax/core/enhmemo-help";
	ToggleShowElement("lightbox_ajax");
	IncludeURL(url, "lightbox_ajax_data");

//  var url = "?action=enhancedmemo-help";
//  var moda = window.open(url, "enhhelp", EnhWindowParams("yes", 500, 550));
//  moda.focus();
}

//-------------------------------------------------------------------------------

function CacheInput(obj)
{
	postvars = "key=" + obj.name;
	postvars += "&value=" + URLEncode(obj.value);
	SendAJAXRequest("ajax/core/cacheinput", postvars);
}

//-------------------------------------------------------------------------------


var imageboxid = "";

function DBFilesBoxLoad(id)
{
  imageid = document.getElementById(id).value;
  imgObj = document.getElementById(id + "_image");
  if (imageid == undefined) imageid = 0;
  imgObj.style.backgroundImage = "url(\"?module=dbfiles&action=downloadthumb&fileid=" + imageid + "\")";
}

function DBFilesBoxClick(id, filter)
{
  imageboxid = id;
	if (isMSIE6OrLess())
	{
	  var url = "?action=enhancedmemo-modaimg&dbfilesbox=true" + "&filter=" + filter;
	  var moda = window.open(url, "enhmodaimg", EnhWindowParams("yes", 780, 550));
	  moda.opener = self;
	  moda.focus();
	}
	else
	{
		lightbox_dbfiles_filter = filter;
		lightbox_dbfiles_dbfilesbox = "true";
		lightbox_dbfiles_showproperties = "false";
		lightbox_dbfiles_callback = undefined;
	  LightboxDBFilesOpenFolder("");
	}
}

function DBFilesBoxSetImage(imageid)
{
  obj = document.getElementById(imageboxid);
  if (imageid > 0)
    obj.value = imageid;
  else
    obj.value = "";

	if (isMSIE6OrLess())
		window.focus();
	else
		HideElement("lightbox_ajax");

  DBFilesBoxLoad(imageboxid);
}

function DBFilesImageBoxReturn(imageid)
{
  opener.DBFilesBoxSetImage(imageid);
}


function OnFileBoxChange(id)
{
	document.getElementById(id + "_text").innerHTML = document.getElementById(id).value;
}


//-------------------------------------------------------------------------------

function OnTimeBoxHoursKey(event, id)
{
	var key;

	if (window.event) key = String.fromCharCode(event.keyCode);
	else if (event.which) key = String.fromCharCode(event.which);

	if ((key == ":") || (key == "."))
		document.getElementById(id + "_minutes").focus();
}

function OnTimeBoxChange(id)
{
	hours = document.getElementById(id + "_hours").value;
	minutes = document.getElementById(id + "_minutes").value;
	timeStr = hours + ":" + minutes;
	if ((hours == "") || (minutes == "")) timeStr = "";
	document.getElementById(id).value = timeStr;
}

//-------------------------------------------------------------------------------

function OnDateBoxChange(id)
{
	year = document.getElementById(id + "_year").value;
	month = document.getElementById(id + "_month").value;
	day = document.getElementById(id + "_day").value;
	dateStr = year + "-" + month + "-" + day;
	if ((year == "") || (month == "") || (day == "")) dateStr = "";
	document.getElementById(id).value = dateStr;
}

//-------------------------------------------------------------------------------



/* --------------------------------------------------- Htmldom support ---------------------------------------------------- */

function ModaPrompt(title, defvalue)
{
  if (navigator.appVersion.indexOf("MSIE 7.") != -1)
  {
		url = "?specialaction=prompt";
		url += "&title=" + encodeURI(title);
		url += "&defaultvalue=" + encodeURI(defvalue)
		return window.showModalDialog(url, title, "dialogWidth:400px; dialogHeight:150px;");
  }
	else
		return prompt(title, defvalue);
}


function SetTitle(str)
{
  if (str != "")
    document.title = globals.prefix_title + " - " + str;
  else
    document.title = globals.title;
}


function Goto(url)
{
  window.location = url;
}

function AddBookmark(title, url)
{
  if (window.sidebar)
    window.sidebar.addPanel(title, url, "");
  else
  if (document.all)
    window.external.AddFavorite(url, title);
  else if ((window.opera) && (window.print))
    return true;
}

function SetNodeTitle()
{
  valTitle = document.getElementById("values_title");
  valModule = document.getElementById("values_module");

  if (valTitle.value == "")
    count = 1;
  else
  {
    count = 0;
    for (i = 0; i < valModule.length; i++)
      if (valModule.options[i].text == valTitle.value) count++;
  }
  if (count > 0)
    valTitle.value = valModule.options[valModule.selectedIndex].text;
}

function HintFollowMouse(elemid, event)
{

	var IE6 = isMSIE6OrLess();

	if (!IE6)
	{
		obj = document.getElementById(elemid);
		if (!event) event = window.event;

		xpos = event.clientX;
		ypos = event.clientY;

		xpos -= Math.round(obj.offsetWidth / 2);
		ypos -= Math.round(obj.offsetHeight + 15);

 		obj.style.left = xpos + "px";
		obj.style.top = ypos + "px";
	}
}

function ScrollToElement(elem)
//Inspired by http://radio.javaranch.com/pascarello/2005/01/09/1105293729000.html
{
  var x = 0;
  var y = 0;

  while(elem != null)
  {
    x += elem.offsetLeft;
    y += elem.offsetTop;
    elem = elem.offsetParent;
  }
	window.scrollTo(x, y);
}


function GalleryOpen(folderid, fileid)
{
  var url = "?module=dbfiles&action=showgalleryitem&folderid=" + folderid + "&fileid=" + fileid;
  var moda = window.open(url, "enhmodaimg", EnhWindowParams("yes", 900, 700));
  moda.focus();
}

/* Fix for IE 'click to activate' */
function WriteSWF(id, content)
{
  document.getElementById(id).innerHTML = content;
}

function isMSIE6OrLess()
{
	if (/MSIE (\d+\.\d+);/.test(navigator.userAgent))
	 	return (new Number(RegExp.$1) < 7)
	else
		return false;
}

function ElementIsVisible(obj)
{
	if (obj == document) return true;
  else if (obj.style.display == "none") return false;
  else return ElementIsVisible(obj.parentNode);
}

function SetElementHTML(id, html)
{
	document.getElementById(id).innerHTML = html;
}

function InitHeaderClick()
{
	obj = document.getElementById("header");
	if (obj)
	{
		obj.style.cursor = "pointer";
		obj.onclick = function ()
		{
			Goto(globals.baseurl);
		}
	}
}

function OnPagesDateClick(id, url, weekTitle, dayShortTitles)
{
	onLightBoxDataOk_CallBack = function()
	{
    newDate = datepicker.getDateString();
    if (newDate != document.getElementById(id).value)
      Goto(globals.baseurl + "/" + url + newDate);
	}

	datepicker.initialize(document.getElementById(id).value, false, weekTitle, dayShortTitles);
	ShowElement("lightbox_datepicker");
}

function TouchHandler(event)
{
  var touches = event.changedTouches;
  var first = touches[0];
  var type = "";
  switch(event.type)
  {
    case "touchstart": type = "mousedown"; break;
    case "touchmove":  type="mousemove"; break;
    case "touchend":   type="mouseup"; break;
    default: return;
  }
  var simulatedEvent = document.createEvent("MouseEvent");
  simulatedEvent.initMouseEvent(type, true, true, window, 1,
                            first.screenX, first.screenY,
                            first.clientX, first.clientY, false,
                            false, false, false, 0/*left*/, null);
  first.target.dispatchEvent(simulatedEvent);
  event.preventDefault();
}

function InitTouchesHandlers()
{
  document.addEventListener("touchstart", touchHandler, true);
  document.addEventListener("touchmove", touchHandler, true);
  document.addEventListener("touchend", touchHandler, true);
  document.addEventListener("touchcancel", touchHandler, true);
}

/* ---------------------------------------------------- Rights support ---------------------------------------------------- */

var currentRightsCombo = null;

function SetRightsCheckBoxes(enabledmask)
{
	var rights = document.getElementById("values_rights_advanced_custom").value;
	var mask = 1;
	for (var i = 0; i < 16; i++)
	{
		objid = "rights_checkbox_" + i;
		document.getElementById(objid).checked = (rights & mask);
		document.getElementById(objid).disabled = !(enabledmask & mask);
		mask = mask << 1;
	}
	for (i = 1; i < 25; i += 5) //iterate through 'reserved rights' column
	{
		if (enabledmask & 0x8888 > 0)
			document.getElementById("rightsmanager_cell_" + i).style.visibility = "hidden";
		else
			document.getElementById("rightsmanager_cell_" + i).style.visibility = "visible";
	}
}

function GetRightsCheckBoxes()
{
	var rights = 0;
	var mask = 1;
	for (var i = 0; i < 16; i++)
	{
		objid = "rights_checkbox_" + i;
		if (document.getElementById(objid).checked)
			rights = (rights | mask);
		mask = mask << 1;
	}
	document.getElementById("values_rights_advanced_custom").value = rights;
}

function CheckVisibilityRightsGroupBox(rights)
{
	if (rights == "")
		rights = document.getElementById("values_rights_advanced").value;
	else if (rights == "%userdefined%")
		rights = document.getElementById("values_rights_advanced_custom").value;
		
  if (document.getElementById("formelement_values_groupid") != undefined)
  	SetShowElement("formelement_values_groupid", ((rights & 0x0F00) > 0));
}

function onAdvancedRightsComboChange(combo, elemid, enabledmask, reservedTitle)
{
	if (combo.value == "%userdefined%")
	{	
		if (reservedTitle != "")
			document.getElementById("rightsmanager_cell_1").innerHTML = reservedTitle;
		SetRightsCheckBoxes(enabledmask);
		onLightBoxDataOk_CallBack = function()
		{
			GetRightsCheckBoxes();
			CheckVisibilityRightsGroupBox("%userdefined%");
		};
		ShowElement("lightbox_rightsmanager");
	}
	else
		CheckVisibilityRightsGroupBox(combo.value);
}


/* ---------------------------------------------------- Style support ----------------------------------------------------- */

function ShowElement(id)
{
	obj = document.getElementById(id);
  obj.style.display = "block";
	obj.disabled = false;
}

function HideElement(id)
{
	obj = document.getElementById(id);
  obj.style.display = "none";
	obj.disabled = true;
}

function SetShowElement(id, show)
{
  if (show)
    ShowElement(id);
  else
    HideElement(id);
}

function ToggleShowElement(id)
{
  SetShowElement(id, (document.getElementById(id).style.display != "block"));
  return (document.getElementById(id).style.display == "block");
}

function ToggleShowExpandableSection(obj, id)
{
  if (document.getElementById(id).style.display != "none")
  {
    HideElement(id);
    obj.className = "expandable_section";
  }
  else
  {
    ShowElement(id);
    obj.className = "expandable_section expandable_section_expand";
  }
}

function HideAllShowOne(prefix, showid, count)
{
  for (i = 0; i < count; i++)
    HideElement(prefix + i);
  ShowElement(prefix + showid);
}

function ShowSubmenu(obj)
{
  if (obj.style.zIndex == "")  obj.style.zIndex = "0";
  objs = obj.getElementsByTagName("div");
  for (i = 0; i < objs.length; i++)
    objs[i].style.zIndex = parseInt(obj.style.zIndex) + 100 + i;
  if (objs[0])
    objs[0].style.display = "block";
}

function HideSubmenu(obj)
{
  objs = obj.getElementsByTagName("div");
  if (objs[0]) objs[0].style.display = "none";
}


function ToggleClassName(elemid, style1, style2)
{
  obj = document.getElementById(elemid);
  if (obj.className == style1)
    obj.className = style2;
  else
    obj.className = style1;
}

function ExecuteTransition(objid, type, styleName, unit, start, end, currentMsecs, totalMsecs, callback, prefix, roundNumber)
{
	var fps = 25;
	if (prefix == undefined) prefix = "";
	if (roundNumber == undefined) roundNumber = false;
	if (currentMsecs >= 0)
	{
		obj = document.getElementById(objid);

		if (type == "smooth")
			currentVar = start + ((end - start) * Math.sin((Math.PI / 2 / totalMsecs) * currentMsecs));
		else
			currentVar = start + (((end - start) / totalMsecs) * currentMsecs);
		if (roundNumber)
			currentVar = Math.floor(currentVar);
		ExecuteScript("document.getElementById('" + objid + "').style." + styleName + " = '" + prefix + currentVar + unit + "';");
	}
	
	if (currentMsecs >= totalMsecs)
	{
    ExecuteScript("document.getElementById('" + objid + "').style." + styleName + " = '" + prefix + end + unit + "';");
    if ((callback != undefined) && (Trim(callback) != ""))
    {
      try
      {
    		ExecuteScript(callback);
      }
      catch(error)
      {
        document.title = "Error: " + error + "\n\n'" + callback + "'";
      }
    }
  }
	else if (currentMsecs < totalMsecs)
	{
		currentMsecs += (1000/fps);
		setTimeout("ExecuteTransition('" + objid + "', '" + type + "', '" + styleName + "', '" + unit + "', " + start + ", " + end + ", " + currentMsecs + ", " + totalMsecs + ", '" + callback + "', '" + prefix + "', " + roundNumber + ")", (1000/fps));
	}
}

function SetTransition(objid, type, styleName, start, end, msecs)
{
	ExecuteTransition(objid, type, styleName, "px", start, end, 0, msecs);
}

function ShowSystemMessage()
{
  var callback = "setTimeout(\"HideSystemMessage()\", 2000)";
  if ((navigator.appName == "Microsoft Internet Explorer") && (navigator.appVersion < "9"))
    ExecuteTransition("system_message", "smooth", "filter", ")", 0, 100, 0, 1000, callback, "alpha(opacity=", true);
  else
    ExecuteTransition("system_message", "smooth", "opacity", "", 0, 1, 0, 1000, callback);
}

function HideSystemMessage()
{
  var callback = "HideElement(\"system_message\")";
  if ((navigator.appName == "Microsoft Internet Explorer") && (navigator.appVersion < "9"))
    ExecuteTransition("system_message", "smooth", "filter", ")", 100, 0, 0, 1000, callback, "alpha(opacity=", true);
  else
    ExecuteTransition("system_message", "smooth", "opacity", "", 1, 0, 0, 1000, callback);
}

/* ---------------------------------------------------- Theme support ----------------------------------------------------- */

var colorboxid = "";

function ThemesColorPickerShow(id)
{
  var url = "?action=enhancedmemo-webcolors";
  var moda = window.open(url, "enhmodaimg", EnhWindowParams("no", globals.popup_width, 453));
  moda.opener = self;
  colorboxid = id;
  moda.focus();
}

function ThemesColorPickerSetColor(color)
{
  obj = document.getElementById(colorboxid);
  obj.value = color;

  obj = document.getElementById(colorboxid + "_sample");
  obj.style.backgroundColor = color;

  window.focus();
}

function ThemesColorPickerReturn(color)
{
  opener.ThemesColorPickerSetColor(color);
}

function EnableCSSStyle(id)
{
  checkObj = document.getElementById("enabled_" + id);
  forminput = document.getElementById(id).parentNode;
  if (checkObj.checked)
    forminput.style.display = "block";
  else
    forminput.style.display = "none";
}

/* -------------------------------------------------- Shortkeys support --------------------------------------------------- */

var shortkeys = new Object();

shortkeys.currentset = "";
shortkeys.sets = new Array();


shortkeys.registerKey = function (setname, thiskey, thisevalcode, extraKeys)
{
	if (shortkeys.sets[setname] == undefined)
		shortkeys.sets[setname] = new Array();
	
	if (!extraKeys) extraKeys = new Array();
	if (!extraKeys.altKey) extraKeys.altKey = false;
	if (!extraKeys.ctrlKey) extraKeys.ctrlKey = false;
	if (!extraKeys.shiftKey) extraKeys.shiftKey = false;

	var item = { key: thiskey.toLowerCase(),
			    		 evalcode: thisevalcode,
					     extra: extraKeys };
	
	shortkeys.sets[setname].push(item);
};

shortkeys.clearKeys = function (setname)
{
	if (shortkeys.sets[setname] != undefined)
		shortkeys.sets[setname] = new Array();
};

shortkeys.activate = function (setname)
{
	shortkeys.currentset = setname;
};

shortkeys.deactivate = function ()
{
	shortkeys.currentset = "";
}

shortkeys.execute = function (event)
{
	if ((shortkeys.currentset != "") && (shortkeys.sets[shortkeys.currentset] != "undefined"))
	{	
		if (!event) event = window.event
		if (event.keyCode) code = event.keyCode;
		else if (event.which) code = event.which;
		else return;
	
		chr = String.fromCharCode(code).toLowerCase();
		keys = shortkeys.sets[shortkeys.currentset];		
		for (var i in keys)
		{
			if ((keys[i].key == chr) &&
					(keys[i].extra.altKey == event.altKey) &&
					(keys[i].extra.ctrlKey == event.ctrlKey) &&
					(keys[i].extra.shiftKey == event.shiftKey))
			{
				eval(keys[i].evalcode);
				return false;
			}
		}
	}
};

window.onkeydown = shortkeys.execute;



/* --------------------------------------------------- Cookies support ---------------------------------------------------- */

var cookies = new Object();

cookies.get = function (key)
{
	var cache = document.cookie.split(";");
	for (i = 0; i < cache.length; i++)
	{
		var keyval = cache[i].split("=");
		if (key == Trim(keyval[0]))
			return unescape(keyval[1]);
	}
	return null;
};

cookies.set = function (key, value, seconds)
{
	if (seconds != undefined)
	{
		var date = new Date();
		date.setTime(date.getTime() + (seconds * 1000));
		var expires = "; expires=" + date.toGMTString();
	}
	else
		var expires = "";
	document.cookie = key + "=" + escape(value) + expires + "; path=/";
};

cookies.unset = function (key)
{
	cookies.set(key, "", -1);
};

/* -------------------------------------------------- Validator support --------------------------------------------------- */

var validator = new Object(); 

validator.validations = new Array();
validator.messages = new Array();
validator.invalidFields = new Array();
validator.lastMessage = "";
	
validator.addMessage = function(type, msg)
{
	this.messages[type] = msg;
};
	
validator.addValidation = function(objid, type, params)
{
	if (validator.validations[objid] == undefined)
		validator.validations[objid] = new Array();
	validator.validations[objid].push(new Array(type, params));
};

validator.validateForm = function(form)
{
	try
	{
		this.invalidFields = new Array();
		result = true;
		for (i in form.elements)
		{
			obj = form.elements[i];
			if ((obj != undefined) && (obj.nodeName != undefined))
			{
				tag = obj.nodeName;
				if (((tag == "INPUT") && (obj.type != "hidden") && (obj.type != "submit")) ||
						(tag == "SELECT") ||
						(tag == "TEXTAREA"))
				{
					if (ElementIsVisible(obj))
						this.validate(obj, this.onCompleteFormInputValidation);
				}
			}
		}

		if (this.invalidFields.length > 0)
		{
			err = this.messages["invalid_fields_in_form"];
			for (i in this.invalidFields)
				err += "\n- " + this.invalidFields[i];
			alert(err);
			return false;
		}
		return true;
	}
	catch (err)
	{
		alert("Javascript error: " + err);
		return false;
	}	
	
};

validator.onCompleteFormInputValidation = function (valid, obj, type, params, msg)
{
	/* Used when validating the complete form */
	if (!valid)
	{
		validator.invalidFields.push(obj.title);
		validator.onInputValidation(valid, obj, type, params, msg);
	}
};	

validator.onInputValidation = function (valid, obj, type, params, msg)
{
	/* Used when validating a single input element */
	formElement = document.getElementById("formelement_" + obj.id);
	
	if ((formElement == undefined) || (formElement.firstChild == undefined))
		return;
		
	errorid = "formvalidation_message_" + obj.id;
	errorObj = document.getElementById(errorid);
	if (errorObj != undefined)
		errorObj.parentNode.removeChild(errorObj);

	if (!valid)
	{
		hintid = "hint_validation_" + type.toLowerCase();
		mouseevents = "onmouseover='SetElementHTML(\"" + hintid + "\", \"" + msg + "\"); ShowElement(\"" + hintid + "\"); HintFollowMouse(\"" + hintid + "\", event);'";
		mouseevents += "onmousemove='HintFollowMouse(\"" + hintid + "\", event)' ";
		mouseevents += "onmouseout='HideElement(\"" + hintid + "\")'";
		htmlMsg = "<div class='formvalidation_message' id='" + errorid + "' " + mouseevents + "></div>";
		formElement.firstChild.innerHTML = htmlMsg + formElement.firstChild.innerHTML;
	}
};


validator.validate = function(obj, callback)
{
	if (this.validations[obj.id] == undefined)
		return true;
	
	if (callback == undefined)
		callback = this.onInputValidation;

	for (i in this.validations[obj.id])
	{
		type = this.validations[obj.id][i][0];
		params = this.validations[obj.id][i][1];						
		if ((obj.value != "") || (type == "isRequired"))
		{
			this.errorMessage = "";
			if (!this[type](obj, params))
			{
				msg = this.errorMessage;
				if (this.errorMessage == "")
					msg = this.messages[type];
				callback(false, obj, type, params, msg);
				return false;
			}
			else
				callback(true, obj, type, params);
		}
	}
	return true;
};

validator.isRequired = function (obj, params)
{
	if ((obj.nodeName == "INPUT") && (obj.type == "checkbox"))
		return obj.checked;
	else
		return (obj.value != "");
};

validator.isNumeric = function (obj, params)
{
	s = obj.value;
	if (params.decimalChar != ".")
		s = s.replace(params.decimalChar, ".");

	return !isNaN(s);
};

validator.isEmail = function (obj, params)
{
	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	return filter.test(obj.value);
};

validator.isBetween = function (obj, params)
{
	if (!this.isNumeric(obj, params))
	{
		this.errorMessage = this.messages["isNumeric"];
		return false;
	}
  val = parseInt(obj.value);
  if ((val < parseInt(params.min)) || (val > parseInt(params.max))) 
	{
		this.errorMessage = this.messages["isBetween"];
		this.errorMessage = this.errorMessage.replace(/%min%/, params.min);
		this.errorMessage = this.errorMessage.replace(/%max%/, params.max);
		return false;
	}
	else
		return true;
}

validator.isUnique = function (obj, params)
{
	return true;//-----------
	
	url = "ajax/" + params.module + "/" + params.action + "?" + params.keyname + "=" + URLEncode(obj.value);
	result = (GetServerInfo(url) != "true");
	if (!result)
	{
		this.errorMessage = this.messages["isUnique"];
		this.errorMessage = this.errorMessage.replace(/%name%/, params.keytitle.toLowerCase());
		return false;
	}
	else
		return true;
};

validator.isDate = function (obj, params)
{
	sepChar = params.sepChar;
	if (sepChar == undefined) sepChar = "-";
	dateArr = obj.value.split(sepChar);
	maskArr = params.mask.split(sepChar);
	if (dateArr.length != maskArr.length) return false;
	
	var day, month, year;
	for (i in maskArr)
	{
		if (maskArr[i][0] == "d") day = parseInt(dateArr[i]);
		else if (maskArr[i][0] == "m") month = parseInt(dateArr[i]);
		else if (maskArr[i][0] == "y") year = parseInt(dateArr[i]);
	}
	if (year < 100) year += 2000;
	
	if ((isNaN(day)) || isNaN(month) || isNaN(year))
		return false;

	testDate = new Date();
	testDate.setDay(day);
	testDate.setMonth(month);
	testDate.setFullYear(year);
	if ((testDate.getDay() != day) || (testDate.getMonth() != month) || (testDate.getFullYear() != year))
	{
		alert(day + "-" + month + "-" + year);
		alert(testDate.getDay() + "-" + testDate.getMonth() + "-" + testDate.getYear());
		return false;
	}
	
	for (i in dateArr)
		dateArr[i] = StrPad(dateArr[i], maskArr[i].length, "0");
	obj.valle = dateArr[0] + sepChar + dateArr[1] + sepChar + dateArr[2];
	return true;
};

validator.isTime = function (obj, params)
{
//	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	//return filter.test(obj.value);
};

validator.isDateTime = function (obj, params)
{
//	return ((this.isDate(obj, [ "mask" : params.dateMask ])) && (this.isDate(obj, [ "mask" : params.timeMask ])))
};


/* ----------------------------------------------------- Tags support ----------------------------------------------------- */

function GetTags(id, url)
{
  IncludeURL(url, "tags_tags_" + id);
  document.getElementById("tags_add_" + id).style.display = "block";
  document.getElementById("tags_addform_" + id).style.display = "none";
}

function AddTags(id)
{
  tags = document.getElementById("tags_addtags_" + id).value;
  url = "?action=addtags&webitemid=" + id + "&tags=" + tags;
  GetTags(id, url);
}

function DeleteTags(id, tag)
{
  GetTags(id, "?action=deletetags&webitemid=" + id + "&tags=" + tag);
}

function OnTagMouseOver(event, tagElem)
{
  if ((event.shiftKey) && (event.ctrlKey) && (event.altKey))
    tagElem.style.textDecoration = "line-through";
  else
    tagElem.style.textDecoration = "none";
}

function OnTagMouseOut(event, tagElem)
{
  tagElem.style.textDecoration = "none";
}

function OnTagClick(tagElem, id)
{
  if (tagElem.style.textDecoration == "line-through")
  {
    DeleteTags(id, tagElem.innerHTML);
    return false;
  }
  else
    return true;
}

/* --------------------------------------------------- Lightbox support --------------------------------------------------- */

var onLightBoxDataOk_CallBack = null;
var onLightBoxDataCancel_CallBack = null;
var onLightBoxPrompt_CallBack = null;

function OnLightBoxDataOk(elemid)
{

	if (onLightBoxDataOk_CallBack)
	{
		if (!onLightBoxDataOk_CallBack())
		{
			onLightBoxDataOk_CallBack = null;
			HideElement(elemid);
		}
	}
	else
		HideElement(elemid);
}

function OnLightBoxDataCancel(elemid)
{
	if (onLightBoxDataCancel_CallBack)
	{
		if (!onLightBoxDataCancel_CallBack())
		{
			onLightBoxDataCancel_CallBack = null;
			HideElement(elemid);
		}
	}
	else
		HideElement(elemid);
}

function OnLightBoxPromptKeyPress(event)
{
	if (event.which)
		var charCode = event.which;
	else
		var charCode = event.keyCode;
	if(charCode == "13")
	{
		OnLightBoxDataOk("lightbox_prompt");
		return false;
	}
	return true;
}

function LightBoxPrompt(title, defvalue)
{
	onLightBoxDataOk_CallBack = function()
	{
		var newValue = document.getElementById("lightbox_prompt_value").value;
		if (!onLightBoxPrompt_CallBack(newValue))
		{
			onLightBoxPrompt_CallBack = null;
			return false;
		}
		else
			return true;
	}

	if (isMSIE6OrLess())
	{
		var newValue = prompt(title, defvalue);
		if (newValue == undefined) return;
		onLightBoxPrompt_CallBack(newValue);
	}
	else
	{
		document.getElementById("lightbox_prompt_title").innerHTML = title;
		document.getElementById("lightbox_prompt_value").value = defvalue;
		ShowElement("lightbox_prompt");
		document.getElementById("lightbox_prompt_value").focus();
	}
}

function LightBoxShowDatePicker(id, includeTime, weekTitle, dayShortTitles)
{
	onLightBoxDataOk_CallBack = function()
	{
		document.getElementById(id).value = datepicker.getDateString();
		return false;
	}

	datepicker.initialize(document.getElementById(id).value, includeTime, weekTitle, dayShortTitles);
	ShowElement("lightbox_datepicker");
}

/* -------------------------------- LightBox Gallery -------------------------------- */

var LBGImageUrls = new Array();
var LBGImageSetnames = new Array();
var LBGImageDescriptions = new Array();

var LBGCurrentImages = new Array();

var LBGCurrentImage = 0;
var LightBoxGalleryOldWindow;
var LBGCurrentSet = "";

var LBGPlaying = false;
var LBGLoopImages = false;

var ie6window = undefined;


function LightBoxGalleryRegisterImage(url, setname, description)
{
  var i = LBGCurrentImage++;
  LBGImageUrls[i] = url;
  LBGImageSetnames[i] = setname;
  LBGImageDescriptions[i] = description;
}

function LightBoxGalleryOpen(setname, current)
{
  LightBoxGalleryPrepareSet(setname);
  LBGCurrentImage = current;
	LightBoxSetButtonState();

  shortkeys.clearKeys("lightbox_gallery");
  shortkeys.registerKey("lightbox_gallery", String.fromCharCode(37) /* left arrow  */, "LightBoxGalleryPrevious();");
  shortkeys.registerKey("lightbox_gallery", String.fromCharCode(32) /*    space    */, "LightBoxGalleryTogglePlayPause();");
  shortkeys.registerKey("lightbox_gallery", String.fromCharCode(32) /*    space    */, "LightBoxGalleryTogglePlayPause();");
  shortkeys.registerKey("lightbox_gallery", String.fromCharCode(39) /* right arrow */, "LightBoxGalleryNext();");
  shortkeys.registerKey("lightbox_gallery", String.fromCharCode(27) /*   escape    */, "LightBoxGalleryClose();");
  shortkeys.activate("lightbox_gallery");

  if (isMSIE6OrLess())
  {
    id = LBGCurrentImages[current];
    url = LBGImageUrls[id];
    ie6window = window.open("?action=ie6imagebox&imgurl=" + url, "ie6window", EnhWindowParams("yes", 800, 600));
  }
  else
  {
    SetShowElement("lightbox_gallery_control_previous", (LBGCurrentImages.length > 1));
    SetShowElement("lightbox_gallery_control_play", (LBGCurrentImages.length > 1));
    SetShowElement("lightbox_gallery_control_next", (LBGCurrentImages.length > 1));
    SetShowElement("lightbox_gallery_progress", (LBGCurrentImages.length > 1));
    SetShowElement("lightbox_gallery_splitter_1", (LBGCurrentImages.length > 1));
    SetShowElement("lightbox_gallery_splitter_2", (LBGCurrentImages.length > 1));

    if (LBGCurrentImages.length > 1)
    {
    	document.getElementById("lightbox_gallery_controls").style.marginLeft = "-140px";
    	document.getElementById("lightbox_gallery_control_close").style.marginLeft = "0px";
      document.getElementById("lightbox_gallery_progress_current").innerHTML = LBGCurrentImage + 1;
      document.getElementById("lightbox_gallery_progress_total").innerHTML = LBGCurrentImages.length;
		}
    else
    {
    	document.getElementById("lightbox_gallery_controls").style.marginLeft = "-38px";
    	document.getElementById("lightbox_gallery_control_close").style.marginLeft = "0px";
    }

    LightBoxGalleryShow(false);
    ShowElement("lightbox_gallery");
  }
}

function LightBoxGalleryPrepareSet(setname)
{
  LBGCurrentImages = new Array(); //clearing the array;
  result = 0;
  for (i = 0; i < LBGImageSetnames.length; i++)
    if (LBGImageSetnames[i] == setname)
      LBGCurrentImages.push(i);
  return result;
}

function LightBoxGalleryShow(byTimer)
{
  id = LBGCurrentImages[LBGCurrentImage];
  url = LBGImageUrls[id];
  description = LBGImageDescriptions[id];

  img = new Image();
  img.onload = function()
  {
    if (isMSIE6OrLess())
    {
      ie6window.document.getElementById("ie6imagebox_image").src = url;
      if (!LBGLoopImages)
      {
        if (LBGCurrentImage == 0)
          ie6window.document.getElementById("ie6imagebox_control_previous").style.visibility = "hidden";
        else
          ie6window.document.getElementById("ie6imagebox_control_previous").style.visibility = "visible";

        if (LBGCurrentImage == LBGCurrentImages.length - 1)
          ie6window.document.getElementById("ie6imagebox_control_next").style.visibility = "hidden";
        else
          ie6window.document.getElementById("ie6imagebox_control_next").style.visibility = "visible";
      }
    }
    else
    {
      HideElement("lightbox_gallery_loading");
      document.getElementById("lightbox_gallery_image").style.backgroundImage = "url('" + url + "')";
      document.getElementById("lightbox_gallery_progress_current").innerHTML = LBGCurrentImage + 1;
      document.getElementById("lightbox_gallery_description").innerHTML = description;
      SetShowElement("lightbox_gallery_description", (Trim(description) != ""))
      LightBoxSetButtonState();
    }
    if (LBGPlaying)
      setTimeout("LightBoxGalleryNext(true)", 5000);

  }
  if (isMSIE6OrLess())
    ie6window.document.getElementById("loading_container").style.visibility = "visible";
  else
    ShowElement("lightbox_gallery_loading");
  img.src = url;
}

function LightBoxSetButtonState()
{
  if ((LBGCurrentImage == 0) && (!LBGLoopImages))
    document.getElementById("lightbox_gallery_control_previous").className = "lightbox_gallery_control lightbox_gallery_control_disabled";
  else
    document.getElementById("lightbox_gallery_control_previous").className = "lightbox_gallery_control";

	if ((LBGCurrentImage == LBGCurrentImages.length - 1) && (!LBGLoopImages))
  {
    document.getElementById("lightbox_gallery_control_play").className = "lightbox_gallery_control lightbox_gallery_control_disabled";
    document.getElementById("lightbox_gallery_control_next").className = "lightbox_gallery_control lightbox_gallery_control_disabled";
	  if (LBGPlaying) LightBoxGalleryPause();
  }
  else
  {
    document.getElementById("lightbox_gallery_control_play").className = "lightbox_gallery_control";
    document.getElementById("lightbox_gallery_control_next").className = "lightbox_gallery_control";
  }
}

function LightBoxGalleryNext(byTimer)
{
  if ((!LBGPlaying) && (byTimer)) return;
  if ((LBGCurrentImage == LBGCurrentImages.length - 1) && (!LBGLoopImages)) return;

  LBGCurrentImage = ((LBGCurrentImage + LBGCurrentImages.length + 1) % LBGCurrentImages.length);
  LightBoxGalleryShow();
}

function LightBoxGalleryPrevious()
{
  if ((LBGCurrentImage == 0) && (!LBGLoopImages)) return;

  LBGCurrentImage = ((LBGCurrentImage + LBGCurrentImages.length - 1) % LBGCurrentImages.length);
  LightBoxGalleryShow();
}

function LightBoxGalleryPlay()
{
  if ((LBGCurrentImage == LBGCurrentImages.length - 1) && (!LBGLoopImages))
  	return;
  HideElement("lightbox_gallery_control_play");
  ShowElement("lightbox_gallery_control_pause");
  LBGPlaying = true;
  LightBoxGalleryNext(true);
}

function LightBoxGalleryPause()
{
  HideElement("lightbox_gallery_control_pause");
  ShowElement("lightbox_gallery_control_play");
  LBGPlaying = false;
}

function LightBoxGalleryTogglePlayPause()
{
	if (LBGPlaying)
		LightBoxGalleryPause();
	else
		LightBoxGalleryPlay();
}

function LightBoxGalleryClose()
{
  LightBoxGalleryPause();
  shortkeys.deactivate();
  HideElement("lightbox_gallery");
}

/* ------------------------------------------------- Dragdropper support -------------------------------------------------- */

var dragdropper = new Object();

dragdropper.draggables = new Array();
dragdropper.ajaxurls = new Array();
dragdropper.draggable = "";
dragdropper.state = "idle";
dragdropper.container = undefined;
dragdropper.currenttarget = undefined;

dragdropper.origtarget = undefined;
dragdropper.orignextsibling = undefined;
dragdropper.origmousemove = undefined;
dragdropper.origmouseup = undefined;
dragdropper.origkeypress = undefined;
dragdropper.origpaddings = Array();

dragdropper.initialize = function()
{
	this.container = document.getElementById("dragdropper_container");
	this.helper = document.getElementById("dragdropper_helper");
};

dragdropper.register = function (objid, targets, handlerid, ajaxurl)
{
	obj = document.getElementById(objid);
	if (targets == undefined) targets = new Array(obj.parentNode.id);
	this.draggables[objid] = targets;
	this.ajaxurls[objid] = ajaxurl;

	if ((handlerid == undefined) || (handlerid == "")) handlerid = objid;
	handler = document.getElementById(handlerid);
	handler.style.cursor = "move";
	handler.onmousedown = this.startdragging;
};

dragdropper.startdragging = function (event)
{
	if (this != dragdropper) return dragdropper.startdragging(event);
	if (event == undefined) event = window.event;

	if (event.target != undefined)
		obj = event.target;
	else
		obj = event.srcElement;

	while ((obj != null) && (dragdropper.draggables[obj.id] == undefined))
		obj = obj.parentNode;
	this.draggable = obj;
	if (this.draggable == undefined)	return;
	this.currenttarget = this.draggable.parentNode;
	this.state = "startdragging";
	this.origmousemove = document.onmousemove;
	this.origmouseup = document.onmouseup;
	this.origkeypress = document.onkeypress;
	document.onmousemove = this.keepdragging;
	document.onmouseup = this.stopdragging;
	document.onkeypress = this.abortdragging;
	return false;
};

dragdropper.keepdragging = function (event)
{
	if (this != dragdropper) return dragdropper.keepdragging(event);

	if ((this.state != "startdragging") &&
			(this.container.childNodes.length == 0)) return; //not dragging

	if (this.container.childNodes.length == 0) //not dragging yet
		dragdropper.fillcontainer();

	if (event == undefined) event = window.event;
	this.selecttarget(event);
	this.followmouse(event);
	this.movehelper(event);

	return false;
};

dragdropper.fillcontainer = function()
{
	this.state = "dragging";
	for (i in this.draggables[this.draggable.id])
	{
		targetid = this.draggables[this.draggable.id][i];
		target = document.getElementById(targetid);
		this.origpaddings[targetid] = target.style.paddingBottom;
	}
	this.helper.style.height = this.draggable.offsetHeight + "px";
	this.helper.style.width = this.currenttarget.offsetWidth + "px";
	this.helper.style.margin = this.draggable.style.margin;
	this.helper.style.backgroundColor = this.draggable.style.backgroundColor;
	this.helper.style.borderColor = this.draggable.style.borderColor;
	if (this.helper.style.borderColor == "") this.helper.style.border = "1px dashed silver";
	this.origtarget = this.currenttarget;
	this.orignextsibling = this.draggable.nextSibling;
	this.draggable.style.margin = "";
	this.container.style.display = "block";
	this.container.style.width = this.draggable.offsetWidth + "px";
	this.container.style.height = this.draggable.offsetHeight + "px";
	this.container.appendChild(this.draggable);
};

dragdropper.selecttarget = function (event)
{
	xmousepos = event.clientX;
	if (window.pageXOffset)
		xmousepos += window.pageXOffset;
	else if (document.body.parentElement)
		xmousepos += document.body.parentElement.scrollLeft;

	ymousepos = event.clientY;
	if (window.pageYOffset)
		ymousepos += window.pageYOffset;
	else if (document.body.parentElement)
		ymousepos += document.body.parentElement.scrollTop;

	xtargetpos = 0;
	ytargetpos = 0;
	for (i in this.draggables[this.draggable.id])
	{
		targetid = this.draggables[this.draggable.id][i];
		target = document.getElementById(targetid);
		target.style.paddingBottom = this.helper.offsetHeight + "px";
		if (targetid != this.currenttarget.id)
		{
			xtargetpos = this.getoffset("left", target);
			ytargetpos = this.getoffset("top", target);
			if ((xmousepos >= xtargetpos) && (xmousepos <= xtargetpos + target.offsetWidth) &&
					(ymousepos >= ytargetpos) && (ymousepos <= ytargetpos + target.offsetHeight))
			{
 				this.currenttarget = target;
				this.helper.style.width = (this.currenttarget.offsetWidth - 2) + "px";
			}
		}
	}
};

dragdropper.followmouse = function (event)
{
	xpos = event.clientX + this.getscroll("left");
	ypos = event.clientY + this.getscroll("top");

	this.container.style.left = xpos + "px";
	this.container.style.top = ypos + "px";
};

dragdropper.movehelper = function (event)
{
	this.helper.style.display = "block";
	beforeObj = this.getbeforeobject(event);
	if (beforeObj != undefined)
		this.currenttarget.insertBefore(this.helper, beforeObj);
	else
		this.currenttarget.appendChild(this.helper);
};

dragdropper.getoffset = function (type, node)
{
	result = 0;
	while (node != undefined)
	{
		if (type == "left")
			result += node.offsetLeft;
		else
			result += node.offsetTop;
		node = node.offsetParent;
	}
	return result;
};

dragdropper.getbeforeobject = function (event)
{
	xpos = event.clientX + this.getscroll("left");
	ypos = event.clientY + this.getscroll("top");

	var result = undefined;
	i = this.currenttarget.childNodes.length - 1;
	while (i >= 0)
	{
		node = this.currenttarget.childNodes[i];
		if (ypos < ((this.getoffset("top", node)) + (node.offsetHeight / 2)))
			result = node;
		i--;
	}
	return result;
};

dragdropper.stopdragging = function (event)
{
	if (this != dragdropper) return dragdropper.stopdragging(event);

	if (this.container.childNodes.length == 0) return;
	if (event == undefined) event = window.event;

	beforeObj = this.getbeforeobject(event);
	if (beforeObj != undefined)
		this.currenttarget.insertBefore(this.draggable, beforeObj);
	else
		this.currenttarget.appendChild(this.draggable);
	this.restorestate();
	this.sendorder();
};

dragdropper.abortdragging = function (event)
{
	if (this != dragdropper) return dragdropper.abortdragging(event);
	if (this.container.childNodes.length == 0) return;
	if (event == undefined) event = window.event;
	if (event.keyCode == 27) //escape character
	{
		if (this.orignextsibling != undefined)
			this.origtarget.insertBefore(this.draggable, this.orignextsibling);
		else
			this.origtarget.appendChild(this.draggable);
		this.restorestate();
	}
}

dragdropper.restorestate = function ()
{
	for (i in this.draggables[this.draggable.id])
	{
		targetid = this.draggables[this.draggable.id][i];
		target = document.getElementById(targetid);
		target.style.paddingBottom = this.origpaddings[targetid];
	}
	this.state = "idle";
	this.draggable.style.margin = this.helper.style.margin;
	this.container.style.display = "none";
	this.helper.style.display = "none";
	document.onmousemove = this.origmousemove;
	document.onmouseup = this.origmouseup;
	document.onkeypress = this.origkeypress;
};

dragdropper.getscroll = function (type)
{
	if (type == "left")
	{
	  if (document.all == undefined) return window.pageXOffset;
  	else if (document.documentElement != undefined) return document.documentElement.scrollLeft;
	  else return document.body.scrollLeft;
	}
	else
	{
	  if (document.all == undefined) return window.pageYOffset;
  	else if (document.documentElement != undefined) return document.documentElement.scrollTop;
  	else return document.body.scrollTop;
  }
};

dragdropper.sorter = function (a, b)
{
	aval = dragdropper.getoffset("top", a);
	bval = dragdropper.getoffset("top", b);

	if (aval == bval)
	{
		aval = dragdropper.getoffset("left", a);
		bval = dragdropper.getoffset("left", b);
	}
	return aval - bval;
}

dragdropper.sendorder = function ()
{
	ajaxurl = this.ajaxurls[this.draggable.id];
	if ((ajaxurl == undefined) || (ajaxurl == "")) return;

	s = "";
	for (i in this.draggables[this.draggable.id])
	{
		targetid = this.draggables[this.draggable.id][i];
		target = document.getElementById(targetid);

		s += targetid + ":";
		children = new Array();
		for (j in target.childNodes)
			if ((target.childNodes[j] != undefined) && (this.draggables[(target.childNodes[j].id)] != undefined))
				children.push(target.childNodes[j]);
		children.sort(this.sorter);
		for (j in children)
			s += children[j].id + ",";
		s += "\n";
	}
	result = SendAJAXRequest(ajaxurl, "data=" + URLEncode(s), false);
	if (result != "true")
		alert(result);
};


/* ---------------------------------------------------- Slider support ---------------------------------------------------- */

var slider = new Object();

slider.state = "idle";
slider.select = null;
slider.marker = null;
slider.bar = null;
slider.timers = new Array();
slider.type = "horizontal";
slider.value = 0;

slider.initialize = function (objid, value)
{
  marker = document.getElementById("slider_" + objid + "_marker");
  marker.style.display = "block";
  slider.setIndex(objid, value);
  marker.onmousedown = function (event) { slider.startDrag(objid, event); };
  marker.onselectstart = function (event) { return false; };
};

slider.initObjects = function (objid)
{
  slider.select = document.getElementById(objid);
  slider.bar = document.getElementById("slider_" + objid + "_bar");
  slider.marker = document.getElementById("slider_" + objid + "_marker");
  slider.hint = document.getElementById("hint_slider_" + objid);
};

slider.startDrag = function (objid, event)
{
  slider.initObjects(objid);
  slider.clearTimer(objid);

  slider.origmousemove = document.onmousemove;
	slider.origmouseup = document.onmouseup;
	document.onmousemove = slider.move;
	document.onmouseup = slider.stopDrag;
  slider.move(event);
};

slider.setIndex = function (objid, value)
{
  slider.initObjects(objid);  
	slider.positionMarker(false);    
};

slider.move = function (event)
{
  if (!slider.marker) return;
  if (slider.type == "horizontal")
    slider.value = slider.moveHorizontal(event);
};

slider.moveHorizontal = function (event)
{
	xmousepos = event.clientX;
	if (window.pageXOffset)
		xmousepos += window.pageXOffset;
	else if (document.body.parentElement)
		xmousepos += document.body.parentElement.scrollLeft;

  newX = xmousepos;
  parentLeft = slider.getOffset(slider.bar);
  parentWidth = slider.bar.offsetWidth;

  if (newX < parentLeft)
     newX = parentLeft;
  else if (newX > (parentLeft + parentWidth))
    newX = (parentLeft + parentWidth);

  if (slider.select)
  {
    count = slider.select.options.length;
    slider.select.selectedIndex = Math.round(((count - 1) / parentWidth) * (newX - parentLeft));
  }
  else
    result = (100 / parentWidth) * (newX - parentLeft);

	slider.positionMarker(true);

  return result;
};

slider.positionMarker = function (showHint)
{
  parentLeft = slider.getOffset(slider.bar);
  parentWidth = slider.bar.offsetWidth;
  if (slider.select)
    newX = parentLeft + ((parentWidth / (slider.select.options.length - 1)) * slider.select.selectedIndex);
  else
    newX = parentLeft + ((parentWidth / 100) * value);

  slider.marker.style.left = (newX - Math.round(slider.marker.offsetWidth / 2)) + "px";
  if (slider.hint)
  {
    slider.hint.childNodes[3].innerHTML = slider.select.options[slider.select.selectedIndex].text;
	  slider.hint.style.top = (slider.marker.offsetTop - 20) + "px";
  	if (showHint)
		  slider.hint.style.display = "block";
  	slider.hint.style.left = (newX - (slider.hint.offsetWidth / 2)) + "px";
 	}
  else
    slider.hint.childNodes[3].innerHTML = result + "%";
};

slider.getOffset = function (node)
{
	result = 0;
	while (node != undefined)
	{
		if (slider.type == "horizontal")
			result += node.offsetLeft;
		else
			result += node.offsetTop;
		node = node.offsetParent;
	}
	return result;
};


slider.stopDrag = function (event)
{
  slider.hint.style.display = "none";
  slider.marker = null;
	document.onmousemove = this.origmousemove;
	document.onmouseup = this.origmouseup;

  return false;
};

slider.clearTimer = function (objid)
{
  if ((slider.timers[objid]) && (slider.timers[objid] != ""))
  {
  	clearTimeout(slider.timers[objid]);
  	slider.timers[objid] = "";
  }	
};


slider.decrease = function (objid)
{
  slider.initObjects(objid);
  slider.clearTimer(objid);
  
	if (slider.select.selectedIndex > 0)
	{
		slider.select.selectedIndex--;
		slider.positionMarker(true);
		slider.timers[objid] = setTimeout("HideElement(\"hint_slider_" + objid + "\")", 1000);
	}	
};

slider.increase = function (objid)
{
  slider.initObjects(objid);
  slider.clearTimer(objid);
	if (slider.select.selectedIndex < (slider.select.options.length - 1))
	{
		slider.select.selectedIndex++;
		slider.positionMarker(true);
		slider.timers[objid] = setTimeout("HideElement(\"hint_slider_" + objid + "\")", 1000);
	}	
};



/* ------------------------------------------------ Dynamiclistbox support ------------------------------------------------ */

dynamiclistbox = new Object();

dynamiclistbox.currentval = undefined;
dynamiclistbox.index = -1;
dynamiclistbox.ajaxurl = "";
dynamiclistbox.timeout = undefined;
dynamiclistbox.allowUserValue = false;

dynamiclistbox.items = undefined;
dynamiclistbox.lastval = new Object();
dynamiclistbox.emptyval = new Object();

dynamiclistbox.listbox = undefined;
dynamiclistbox.hiddenbox = undefined;
dynamiclistbox.editbox = undefined;

dynamiclistbox.prepare = function (id, url)
{
  if (url.indexOf("?") == -1) url += "?";
  this.ajaxurl = url;
  
  this.hiddenbox = document.getElementById(id);
  this.editbox = document.getElementById(id + "_title");
  this.listbox = document.getElementById(id + "_dynamiclist");

  this.lastval.key = this.hiddenbox.value;
  this.lastval.value = this.editbox.value;

  this.emptyval.key = "";
  this.emptyval.value = "";
  
  dynamiclistbox.allowUserValue = false;
};

dynamiclistbox.consolidate = function ()
{
  if ((this.currentval != undefined) && (this.currentval.value != undefined))
  {
    this.lastval.key = this.currentval.key;
    this.lastval.value = this.currentval.value;
    
    this.hiddenbox.value = this.lastval.key;
  	
    if (this.editbox.value != "")
    {
  	  var ta = document.createElement("textarea");
  	  ta.innerHTML = this.lastval.value;
  	  this.editbox.value = Trim(StripTags(ta.value));
  	  //ta.parentNode.removeChild(ta);
    }
    else
    	this.editbox.value = Trim(StripTags(this.lastval.value));
  }
  else if (this.allowUserValue)
  {
    this.hiddenbox.value = this.editbox.value;
  }
  else
  {
    this.hiddenbox.value = this.lastval.key;
   	this.editbox.value = Trim(StripTags(this.lastval.value));
  }  
  
  
  this.index = -1;
  setTimeout("HideElement(\"" + this.listbox.id + "\");", 200);
};

dynamiclistbox.navigate = function (event) 
{
	if (event == undefined) event = window.event;
  var chr = event.keyCode;
  var result = true;
  if (this.listbox.style.display == "block")
  {
  	result = false;
  	if ((chr == 13) || ((chr == 9) && (!this.allowUserValue)))
	    this.select(this.index);
	  else if ((chr == 27) || (chr == 9))
	    this.consolidate();
	  else if ((chr == 38) || (chr == 40))
	  {
	    if ((chr == 38) && (this.index > 0)) this.index--;
	    else if ((chr == 40) && (this.index < (this.items.length - 1))) this.index++;
	    this.repaint();
	  }   
	  else
	    result = true;
	}
  return result;
};

dynamiclistbox.repaint = function ()
{
  var divitems = this.listbox.getElementsByTagName("div");
  for (i in divitems)
  {
    if ((divitems[i] != undefined) && (divitems[i].nodeName == "DIV"))
    {
      divitems[i].style.backgroundColor = this.editbox.style.backgroundColor;
      divitems[i].style.color = this.editbox.style.color;
    }
	}
	
  if (this.index >= 0)
  {
    divitems[this.index].style.backgroundColor = "navy";
    divitems[this.index].style.color = "white";
    if ((divitems[this.index].offsetTop > 100) || (this.listbox.scrollTop != 0))
    	this.listbox.scrollTop = divitems[this.index].offsetTop - 100;
	}
	else
		this.listbox.scrollTop = 0;
};

dynamiclistbox.fill = function(objstr)
{
  this.listbox.style.display = "block";
  this.index = -1;
  this.items = eval(objstr);
  this.listbox.innerHTML = "";
  for (i in this.items)
  {
    events = "onclick='dynamiclistbox.select(" + i + ");' ";
    this.listbox.innerHTML += "<div class='dynamiclistbox_item' " + events + ">" + this.items[i].value + "</div>";
    i++;
  }
  if (this.items.length == 1)
    this.currentval = this.items[i];
};

dynamiclistbox.refresh = function (event)
{
  this.currentval = undefined;
  var chr = event.keyCode;
  clearTimeout(dynamiclistbox.timeout);
  if ((chr != 8) && ((chr < 65) || (chr > 90)))
    return;

  if (this.editbox.value == "")
  {
    this.currentval = this.emptyval;
    this.consolidate();
    return;
  }
  dynamiclistbox.timeout = setTimeout("dynamiclistbox.getlistdata()", 500);
};

dynamiclistbox.getlistdata = function()
{
  var req = GetRequestObject();
  req.onreadystatechange = function()
  {
    if (this.readyState == 4)
    	dynamiclistbox.fill(this.responseText);
  }
  req.open("GET", this.ajaxurl + "&keywords=" + Trim(URLEncode(this.editbox.value)), true);
  req.send(null);
};

dynamiclistbox.select = function (index)
{
  this.currentval = this.items[index];
  this.consolidate();
};

/* -------------------------------------------------- Googlemaps support -------------------------------------------------- */

var GoogleMapsCurrentInfoWindow = undefined;
var GoogleMapsMaps = new Array();
var GoogleMapsMarkers = new Array();
var GoogleMapsLoadStack = 0;
var GoogleMapsMarkers = new Array();
var GoogleMapsAutoZoom = false;

function GoogleMapsInitialize(objid, gmZoom, markerFile)
{
  GoogleMapsAutoZoom = (gmZoom == 0);
  if (gmZoom == 0) gmZoom = 8;
  var myOptions =
  {
    zoom: gmZoom,
    mapTypeId: google.maps.MapTypeId.ROADMAP
  };
  GoogleMapsMaps[objid] = new google.maps.Map(document.getElementById(objid), myOptions);
  GoogleMapsMarkers[objid] = new Array();
}

function GoogleMapsAddMarker(objid, latitude, longitude, title, icon)
{
	map = GoogleMapsMaps[objid];
	position = new google.maps.LatLng(latitude, longitude);
	var marker = new google.maps.Marker({ map: map, position: position, icon: icon });
	GoogleMapsMarkers[objid].push(marker);
	
	google.maps.event.addListener(marker, "click", function()
	{
	  if (GoogleMapsCurrentInfoWindow) GoogleMapsCurrentInfoWindow.close();
	  GoogleMapsCurrentInfoWindow = new google.maps.InfoWindow({content: title});
		GoogleMapsCurrentInfoWindow.open(map, marker);
	});          
	GoogleMapsAutoCenter(objid);
}

function GoogleMapsAddMarkerByGeocode(objid, address, title)
{
	if (GoogleMapsLoadStack > 0)
	{		
		setTimeout("GoogleMapsAddMarkerByGeocode(\"" + objid + "\", \"" + address + "\", \"" + title + "\")", 1500);
		return;
	}
	GoogleMapsLoadStack++;
	geocoder = new google.maps.Geocoder();
	geocoder.geocode(
		{ 'address': address },
		function (results, status)
		{
     	GoogleMapsLoadStack--;
			if (status == google.maps.GeocoderStatus.OK)
			{
      	if (status != google.maps.GeocoderStatus.ZERO_RESULTS)
      		GoogleMapsAddMarker(objid, results[0].geometry.location.lat(), results[0].geometry.location.lng(), title);
        else
        	alert("Unknown address: " + address);
      }
      else
      {
        alert("Geocode was not successful for the following reason: " + status + "\n\nKeywords: " + address);
      }
    });
}

function GoogleMapsAutoCenter(objid)
{
	var bounds = new google.maps.LatLngBounds();
  for (var i = 0; i < GoogleMapsMarkers[objid].length; i++)
  	bounds.extend(GoogleMapsMarkers[objid][i].getPosition());
  GoogleMapsMaps[objid].setCenter(bounds.getCenter());
  if (GoogleMapsAutoZoom)
    GoogleMapsMaps[objid].fitBounds(bounds);
}


/* -------------------------------------------------- Datepicker support -------------------------------------------------- */

Date.prototype.getISOWeek = function ()
{
		//Source: http://techblog.procurios.nl/k/n618/news/view/33796/14863/Calculate-ISO-8601-week-and-year-in-javascript.html
    var target  = new Date(this.valueOf());
    var dayNr   = (this.getDay() + 6) % 7;
    target.setDate(target.getDate() - dayNr + 3);
    var jan4    = new Date(target.getFullYear(), 0, 4);
		var jan4DayNr = (jan4.getDay() + 6) % 7;
		jan4.setDate(jan4.getDate() - jan4DayNr + 3);
    var dayDiff = (target - jan4) / 86400000;
    var weekNr = 1 + Math.floor(dayDiff / 7);
    return weekNr;
}

Date.prototype.getISOWeekYear = function ()
{
	//Source: http://techblog.procurios.nl/k/n618/news/view/33796/14863/Calculate-ISO-8601-week-and-year-in-javascript.html
  var target  = new Date(this.valueOf());
  target.setDate(target.getDate() - ((this.getDay() + 6) % 7) + 3);
  return target.getFullYear();
}

Date.prototype.toISODateString = function ()
{
	return this.getFullYear() + "-" + StrPad((this.getMonth() + 1).toString(), 2, "0") + "-" + StrPad(this.getDate().toString(), 2, "0");
}

Date.prototype.toISODateTimeString = function ()
{
	return this.toISODateString() + " " + StrPad(this.getHours().toString(), 2, "0") + ":" + StrPad(this.getMinutes().toString(), 2, "0");
}

/*------------------------------------------------------------------------------------------------*/

var datepicker = new Object();

datepicker.selectedDate = new Date();
datepicker.weekTitle = "Wk";
datepicker.dayShortTitles = [ "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" ];
datepicker.includeTime = false;

datepicker.initialize = function(dateStr, includeTime, weekTitle, dayShortTitles)
{
	SetShowElement("datepicker_time_control", includeTime);
	this.includeTime = includeTime;
	this.weekTitle = weekTitle;
	this.dayShortTitles = dayShortTitles;
	
 	this.selectedDate = new Date(dateStr.replace("-", "/")); /* Weird!! IE only accepts YYYY/MM/DD, instead of the ISO standard YYYY-MM-DD */    
 	
 	test = this.selectedDate.toISODateTimeString();
 	if (test.search(/NaN/i) >= 0)
 	  this.selectedDate = new Date();
 	
	this.setYear(this.selectedDate.getFullYear());
	this.setMonth(this.selectedDate.getMonth() + 1);
	this.setHours(this.selectedDate.getHours());
	this.setMinutes(this.selectedDate.getMinutes());
	this.refreshDays();
};

datepicker.getDateString = function()
{
	if (datepicker.includeTime)
		return datepicker.selectedDate.toISODateTimeString();
	else
		return datepicker.selectedDate.toISODateString();
};

datepicker.getYear = function()
{
	return parseInt(document.getElementById("datepicker_year").value);
};

datepicker.setYear = function(year)
{
  if (year < 1900) year = 1900;
	document.getElementById("datepicker_year").value = year;
};

datepicker.getMonth = function()
{
	return parseInt(document.getElementById("datepicker_month").value);
};

datepicker.setMonth = function(month)
{
	document.getElementById("datepicker_month").value = month;
};

datepicker.getHours = function()
{
	return parseInt(document.getElementById("datepicker_hours").value);
};

datepicker.setHours = function(hours)
{
	document.getElementById("datepicker_hours").value = hours;
};

datepicker.getMinutes = function()
{
	return parseInt(document.getElementById("datepicker_minutes").value);
};

datepicker.setMinutes = function(minutes)
{
	document.getElementById("datepicker_minutes").value = minutes;
};

datepicker.resetYear = function(direction)
{
	this.setYear(this.getYear() + direction);
	this.refreshDays();
};

datepicker.resetMonth = function(direction)
{
	this.setMonth(((((this.getMonth() - 1) - direction) + 12) % 12) + 1);
	if ((this.getMonth() == 1) && (direction == -1))
		this.resetYear(1);
	else if ((this.getMonth() == 12)  && (direction == 1))
		this.resetYear(-1);
	else
		this.refreshDays();
};

datepicker.refreshDays = function()
{
	today = new Date();
	year = this.getYear();
	month = this.getMonth();

	daysObj = document.getElementById("datepicker_day_control");
	var curdate = new Date(year, month - 1, 0, 12, 0, 0); //Uses noon, because 0:00 in combination with daylight savings gives trouble
	curdate.setTime(curdate.getTime() - ((curdate.getDay() - 1) * 60 * 60 * 24 * 1000));

	var result = "<table cellpadding='0' cellspacing='0' border='0'>";
	result += "<tr>";
	for (i = 0; i < 8; i++)
	{
		if (i == 0)
			result += "<td>" + this.weekTitle + "</td>";
		else
			result += "<td>" + this.dayShortTitles[i - 1] + "</td>";
	}
	result += "</tr>\n";
	for (y = 0; ((curdate.getDate() > 7) || (y < 2)); y++)
	{
		result += "<tr>";
		for (x = 0; x < 8;  x++)
		{
			if (x == 0)
				result += "<td class='datepicker_weeknumber'>" + curdate.getISOWeek() + "</td>";
			else
			{
				if ((y == 0) && (curdate.getDate() > 15)) cssClass = "datepicker_day_prior_month";
				else if ((y > 2) && (curdate.getDate() < 15)) cssClass = "datepicker_day_next_month";
				else cssClass = "datepicker_day_normal";


				if (curdate.toISODateString() == today.toISODateString())
					cssClass += " datepicker_day_today";
				if (curdate.toISODateString() == this.selectedDate.toISODateString())
					cssClass += " datepicker_day_selected";

				var onclick = "datepicker.selectDay(\"" + curdate.toISODateString() + "\")";
				result += "<td class='" + cssClass + "' onclick='" + onclick + "'>" + curdate.getDate() + "</td>";
				curdate.setTime(curdate.getTime() + (60 * 60 * 24 * 1000));
			}
		}
		result += "</tr>\n";
	}
	result += "</table>";

	daysObj.innerHTML = result;
};


datepicker.selectDay = function(dateStr)
{
  var year = dateStr.substr(0, 4);
  var month = dateStr.substr(5, 2);
  if (month[0] == "0")
    month = dateStr.substr(6, 1);
  month = parseInt(month) - 1;
  var date = dateStr.substr(8, 2);

  datepicker.selectedDate.setYear(year);
	datepicker.selectedDate.setMonth(month);
	datepicker.selectedDate.setDate(date);
	if (this.includeTime)
		datepicker.selectedDate.setHours(document.getElementById("datepicker_hours").value);
	else
		datepicker.selectedDate.setHours(0);

	if (this.includeTime)
		datepicker.selectedDate.setMinutes(document.getElementById("datepicker_minutes").value);
	else
		datepicker.selectedDate.setMinutes(0);

	OnLightBoxDataOk("lightbox_datepicker");
}

/* ------------------------------------------------- Socialmedia support -------------------------------------------------- */

var socialmedia = new Object();

socialmedia.services = new Array();
socialmedia.embeds = new Array();

socialmedia.AddService = function (service, link, embed)
{
  socialmedia.services[service] = link;
  socialmedia.embeds[service] = embed;
};

socialmedia.ShareOnService = function (service)
{
  var shareUrl = socialmedia.services[service];
  shareUrl = shareUrl.replace(/%url%/g, encodeURIComponent(location.href));
  shareUrl = shareUrl.replace(/%title%/g, encodeURIComponent(document.title));
  window.open(shareUrl);
};

/* ------------------------------------------------ Elementrotator support ------------------------------------------------ */

function elementRotator(id, transitionTime, subTagName)
{

  this.initialize = function(id, transitionTime, subTagName)
  {
    if (subTagName == undefined) subTagName = "div";
    if (transitionTime == undefined) transitionTime = 1000;

    this.parent = document.getElementById(id);
    this.oldElement = undefined;
    this.index = 0;
    this.transitionTime = transitionTime;
    this.subTagName = subTagName;

    this.children = new Array();
    for (var i = 0; i < this.parent.childNodes.length; i++)
      if (this.parent.childNodes[i].nodeName.toLowerCase() == "div")
        this.children.push(this.parent.childNodes[i]);
  };

  this.showElement = function (i)
  {
		i %= this.children.length;
    if (this.index == i) return;

    currentElement = this.children[this.index];
    this.index = i;
    newElement = this.children[this.index];

    newElement.style.display = "block";
    
    callback = "obj = document.getElementById(\"" + currentElement.id + "\"); obj.style.display = \"none\"; ";

    if ((navigator.appName == "Microsoft Internet Explorer") && (navigator.appVersion < "9"))
    {
      ExecuteTransition(currentElement.id, "smooth", "filter", ")", 100, 0, 0, this.transitionTime, callback, "alpha(opacity=", true);
      ExecuteTransition(newElement.id, "smooth", "filter", ")", 0, 100, 0, this.transitionTime, false, "alpha(opacity=", true);
    }
    else
    {
      ExecuteTransition(currentElement.id, "smooth", "opacity", "", 1, 0, 0, this.transitionTime, callback);
      ExecuteTransition(newElement.id, "smooth", "opacity", "", 0, 1, 0, this.transitionTime);
    }
  };

  this.next = function()
  {
    this.showElement(this.index + 1);
  };

  this.previous = function()
  {
    this.showElement((this.index + this.children.length) - 1);
  };

  this.initialize(id, transitionTime, subTagName);

}

/* ----------------------------------------------- Elementscroller support ------------------------------------------------ */

function elementScroller(id, speed, direction, margin, subTagName)
{

  this.initialize = function(id, speed, direction, margin, subTagName)
  {
    if (speed == undefined) speed = 2;
    if (direction == undefined) direction = "horizontal";
    if (margin == undefined) margin = 10;
    if (subTagName == undefined) subTagName = "div";

    this.parent = document.getElementById(id);
    this.speed = (speed / 5);
    this.direction = direction;
    this.subTagName = subTagName;
    this.pause = false;
    this.margin = margin;

    document.title = "";
    this.children = new Array();
    this.places = new Array();
    var left = 0;
    for (var i = 0; i < this.parent.childNodes.length; i++)
    {
      if (this.parent.childNodes[i].nodeName.toLowerCase() == "div")
      {
        var child = this.parent.childNodes[i];
        child.style.marginLeft = left + "px";
        child.style.display = "block";
        this.children.push(child);
        this.places.push(left);
        left += (child.offsetWidth + this.margin);
      }
    }
    this.totalSize = left;
  };

  this.scroll = function ()
  {
    if (this.pause) return;
    for (var i = 0; i < this.children.length; i++)
    {
      child = this.children[i];
      if (this.direction == "horizontal")
      {
        this.places[i] -= this.speed;
        if (this.places[i] < (0 - this.margin - child.offsetWidth))
        {
          if (this.totalSize > this.parent.scrollWidth)
            this.places[i] += this.totalSize + this.margin;
          else
            this.places[i] = this.parent.scrollWidth + this.margin;
        }
        child.style.marginLeft = this.places[i] + "px";
      }
    }
  }


  this.initialize(id, speed, direction, margin, subTagName);

}


