function el(id)
{
	return document.getElementById(id);
}

function setCookie(name, value, expires, path, domain, secure) {
  var curCookie = name + "=" + escape(value) +
      ((expires) ? "; expires=" + expires.toGMTString() : "") +
      ((path) ? "; path=" + path : "") +
      ((domain) ? "; domain=" + domain : "") +
      ((secure) ? "; secure" : "");
  document.cookie = curCookie;
}

// name - name of the desired cookie
// * return string containing value of specified cookie or null if cookie does not exist
function getCookie(name) {
  var dc = document.cookie;
  var prefix = name + "=";
  var begin = dc.indexOf("; " + prefix);
  if (begin == -1) {
    begin = dc.indexOf(prefix);
    if (begin != 0) return null;
  } else
    begin += 2;
  var end = document.cookie.indexOf(";", begin);
  if (end == -1)
    end = dc.length;
  return unescape(dc.substring(begin + prefix.length, end));
}

function firstTimeInSession(AName)
{
  AName = 'sft_' + AName;
  var firstTime = !getCookie(AName, 1);
  if (firstTime)
    setCookie(AName, 1);
  return firstTime;
}

function getPlatformInfoArray()
{
  return {
    'dc': document.defaultCharset,
    'l':   navigator.language,
    'bl':  navigator.browserLanguage,
    'sl':  navigator.systemLanguage,
    'ul':  navigator.userLanguage,

    'sx': screen.width,
    'sy': screen.height,
    'sc': screen.colorDepth
    }
}

function arrayToHTMLAttributesSimple(AArray, ATagName)
{
  var result = '';
  for (var i in AArray)
    result += (result ? ' ' : '') + i + '="' + (AArray[i] ? AArray[i] : '') + '"';
  if (ATagName)
    result = '<' + ATagName + (result ? ' ' + result : '') + '>';
  return result;
}

function logPlatformInfo()
{
  setCookie('pi', arrayToHTMLAttributesSimple(getPlatformInfoArray(), 'pi'));
}


function SetSelectorInstance(name)
{
	function msg(id)
	{
		alert(setSelector.locales[id]);
	}
	this.msg = msg;

	function onKeyDown(e, el)
	{
    if (el.selectedIndex < 0)
		  return;

    if (e.keyCode == 32) {
		  if (el == this.selSel)
		    this.onRemove();
			else if (el == this.selAll)
		    this.onAdd();
    } else if (el == this.selSel && e.keyCode == 38 && e.altKey)
		  this.onUp();
    else if (el == this.selSel && e.keyCode == 40 && e.altKey)
		  this.onDown();
		else
		  return true;

	  //

		return false;
  }
	this.onKeyDown = onKeyDown;

	function onAdd()
	{
		var el = this.selAll;
		var i = el.selectedIndex;
		if (i < 0) {
			this.msg('selectItem');
			return;
		}

		var value = el.options[i].value;
		var text = el.options[i].text;

		var exists = false;
		for (var j = 0; j < this.selSel.length; j++)
			if (this.selSel.options[j].value == value) {
				exists = true;
				break;
			}
		if (exists)
		  return;

		// selectMenuAddItem(targetElement, text, value);
    this.selSel.options[this.selSel.options.length] = new Option(text, value);
	}
	this.onAdd = onAdd;

	function onRemove()
	{
		var el = this.selSel;
		var i = el.selectedIndex;
		if (i < 0)
			this.msg('selectItem');
		else
			el.options[i] = null;

		if (i < el.options.length)
			el.selectedIndex = i;
		else
			el.selectedIndex = el.options.length - 1;
	}
	this.onRemove = onRemove;

	function onUp()
	{
		var el = this.selSel;
		var i = el.selectedIndex;
		if (i < 0)
			this.msg('selectItem');
		else
			if (i > 0) {
				var o1 = el.options[i - 1];
				var o2 = el.options[i];
				el.options[i - 1] = new Option(o2.text, o2.value);
				el.selectedIndex = i - 1;
				el.options[i] = o1;
			}
	}
	this.onUp = onUp;

	function onDown()
	{
		var el = this.selSel;
		var i = el.selectedIndex;
		if (i < 0)
			this.msg('selectItem');
		else
			var size = el.options.length;

			if (i < size - 1) {
				var o1 = el.options[i + 1];
				var o2 = el.options[i];
				el.options[i + 1] = new Option(o2.text, o2.value);
				el.selectedIndex = i + 1;
				el.options[i] = o1;
			}
	}
	this.onDown = onDown;

	function onSubmit()

	{
		var el = this.selSel;
		var s = '';
		var l = el.options.length;
		for (var i = 0; i < l; i++)
			s += (i > 0 ? ',' : '') + el.options[i].value;

		this.inHidden.value = s;

		return (this.oldOnSubmit ? this.oldOnSubmit() : true);
  }
  this.onSubmit = onSubmit;

  this.name = name;

	this.inHidden = document.getElementById(name + '_hidden');
	this.selSel = document.getElementById(name + '_sel');
	this.selAll = document.getElementById(name + '_all');
	this.elAdd = document.getElementById(name + '_add');
	this.elRemove = document.getElementById(name + '_remove');
	this.elUp = document.getElementById(name + '_up');
	this.elDown = document.getElementById(name + '_down');

	// if (!this.inHidden || !this.selSel || !this.selAll)

	var instance = this;
	this.selSel.ondblclick = function() {instance.onRemove();};
	this.selSel.onfocus = function() {instance.selAll.selectedIndex = -1;};
	this.selSel.onkeydown = function(e) {return instance.onKeyDown(e ? e : event, this);};
	this.selAll.ondblclick = function() {instance.onAdd();};
	this.selAll.onfocus = function() {instance.selSel.selectedIndex = -1;};
	this.selAll.onkeydown = function(e) {instance.onKeyDown(e ? e : event, this);};
	if (this.elAdd)
	  this.elAdd.onclick = function() {instance.onAdd();};
	if (this.elRemove)
	  this.elRemove.onclick = function() {instance.onRemove();};
	if (this.elUp)

	  this.elUp.onclick = function() {instance.onUp();};
	if (this.elDown)
    this.elDown.onclick = function() {instance.onDown();};

	this.oldOnSubmit = this.selSel.form.onsubmit;

	this.selSel.form.onsubmit = function() {return instance.onSubmit(this);};
}

function SetSelector()
{
	function init(name)
	{
		this.instances[name] = new SetSelectorInstance(name);
	}
	this.init = init;

	this.locales = {'selectItem': 'Please, select an item first'};

	this.instances = {};
}
setSelector = new SetSelector();

