
var formItems = new Array();
var leftOptions = new Array();
var selectedOptionSet = new Array();
var translations = new Array();

function newOpt(inText,inValue) {
	var myOpt = new Option(inText,inValue)
	return myOpt
}

function SelectTextSort( obj, opt ) {
/*  var Left  = 0, Right = obj.options.length-1, top = 1;
  var lStack = new Array(), rStack = new Array();
      lStack[top] = Left; rStack[top] = Right;
  while (top!=0) {
    Left  =  lStack[top]; Right =  rStack[top]; top--;
    while (Left < Right) {
      var i = Left, j = Right, n = Left+Right;
      var k = Math.floor(n / 2)
      var x = obj.options[k].text;
      while (i <= j) {
        while (obj.options[i].text < x) { i++ }
        while (obj.options[j].text > x) { j-- }
        if (i <= j) {
          var i1= (obj.options[i].selected == true ) ? true : false
          var j1= (obj.options[j].selected == true ) ? true : false
          var q1 = obj.options[j].text;
          var q2 = obj.options[j].value;
          obj.options[j].text  = obj.options[i].text;
          obj.options[j].value = obj.options[i].value;
          obj.options[i].text  = q1;
          obj.options[i].value = q2;
          obj.options[i].selected = (j1&opt) ? true : false
          obj.options[j].selected = (i1&opt) ? true : false
          i++; j--
        }
      }
      if ((j - Left) < (Right - i)) {
        if (i < Right) { top++; lStack[top] = i; rStack[top] = Right }
        Right = j;
      }
      else {
        if (Left < j) { top++; lStack[top] = Left; rStack[top] = j }
        Left = i;
      }
    }
  }
*/
  return true
}

function setData2Values (fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	rightobj = formItems[fieldname]["RightObj"];
	resultobj = formItems[fieldname]["ResultObj"];
	selectortype = formItems[fieldname]["SelectorType"];
	resultobj.value = '';
	if (selectortype == 'SingleSelection')
		resultobj.value = leftobj.value;
	else {
		for (i=0; i<rightobj.length; i++) {
			if (resultobj.value != '')
				resultobj.value += '|';
			resultobj.value += rightobj.options[i].value;
		}
	}
}

function moveLeft(fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	rightobj = formItems[fieldname]["RightObj"];
	resultobj = formItems[fieldname]["ResultObj"];
	onupdatefunction = formItems[fieldname]["OnUpdateFunction"];
	validatefunction = formItems[fieldname]["ValidateFunction"];
	irremovableItems = formItems[fieldname]["IrremovableItems"];
	irremovableText = '';
	for (i=rightobj.length-1; i>=0; i--) {
		if (rightobj.options[i].selected == true) {
			irremovable = false;
			for (j=irremovableItems.length-1; j>=0; j--) {
				if (rightobj.options[i].value == irremovableItems[j]) {
					irremovable = true;
					irremovableText = irremovableText + '\n' + rightobj.options[i].text;
					rightobj.options[i].selected = false;
				}
			}
			if (irremovable == false) { 
				if (leftOptions[fieldname][selectedOptionSet[fieldname]][rightobj.options[i].text] != null)
					leftobj.options[leftobj.length] = newOpt(rightobj.options[i].text, rightobj.options[i].value);
				rightobj.options[i] = null;
			}
		}
	}
	if (irremovableText != '')
		alert(translations['OBJECTSELECTOR_IRREMOVABLETEXT'] + irremovableText);
	SelectTextSort(leftobj, true);
	setData2Values(fieldname);
	if (onupdatefunction != null)
		onupdatefunction(rightobj.length);
	setValidate(fieldname);
}

function moveAllLeft(fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	rightobj = formItems[fieldname]["RightObj"];
	resultobj = formItems[fieldname]["ResultObj"];
	onupdatefunction = formItems[fieldname]["OnUpdateFunction"];
	validatefunction = formItems[fieldname]["ValidateFunction"];
	for (i=rightobj.length-1; i>=0; i--) {
		if (leftOptions[fieldname][selectedOptionSet[fieldname]][rightobj.options[i].text] != null)			
			leftobj.options[leftobj.length] = newOpt(rightobj.options[i].text, rightobj.options[i].value);
		rightobj.options[i] = null;
	}
	SelectTextSort(leftobj, true);
	setData2Values(fieldname);
	if (onupdatefunction != null)
		onupdatefunction(rightobj.length);
	setValidate(fieldname);
}

function moveRight(fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	rightobj = formItems[fieldname]["RightObj"];
	resultobj = formItems[fieldname]["ResultObj"];
	onupdatefunction = formItems[fieldname]["OnUpdateFunction"];
	validatefunction = formItems[fieldname]["ValidateFunction"];
	for (i=leftobj.length-1; i>=0; i--) {
		if (leftobj.options[i].selected == true) {
			rightobj.options[rightobj.length] = newOpt(leftobj.options[i].text, leftobj.options[i].value); 
			leftobj.options[i] = null; 
		} 
	}
	SelectTextSort(rightobj, true);
	setData2Values(fieldname);	
	if (onupdatefunction != null)
		onupdatefunction(rightobj.length);
	setValidate(fieldname);
}

function selectOptionSet(fieldname, setnumber) {
	
	leftobj = formItems[fieldname]["LeftObj"];
	rightobj = formItems[fieldname]["RightObj"];
	selectortype = formItems[fieldname]["SelectorType"];
	onupdatefunction = formItems[fieldname]["OnUpdateFunction"];

	selectedOptionSet[fieldname] = setnumber;
	for (i=leftobj.length-1; i>=0; i--)
		leftobj.options[i] = null;
	for (var item in leftOptions[fieldname][setnumber]) {
		found = false
		if (selectortype != 'SingleSelection') {
			for (i=rightobj.length-1; i>=0; i--)
				if (rightobj.options[i].value == leftOptions[fieldname][setnumber][item])  {
					found = true;
					break;
				}
		}
		if (!found)
			leftobj.options[leftobj.length] = newOpt(item, leftOptions[fieldname][setnumber][item]);
	}
	SelectTextSort(leftobj, true);
	if (selectortype == 'SingleSelection') {
		setData2Values(fieldname);
		if (onupdatefunction != null)
			onupdatefunction(leftobj.value);
	}
}

function setLeftOption(fieldname, itemoptions, leftobj, rightobj, resultobj, onupdatefunction, selectortype, groupobj) {
	formItems[fieldname] = new Array();
	formItems[fieldname]["LeftObj"] = leftobj;
	formItems[fieldname]["RightObj"] = rightobj;
	formItems[fieldname]["ResultObj"] = resultobj;
	formItems[fieldname]["OnUpdateFunction"] = onupdatefunction;
	formItems[fieldname]["SelectorType"] = selectortype;
	formItems[fieldname]["GroupObj"] = groupobj;
	formItems[fieldname]["IrremovableItems"] = new Array();
	
	leftOptions[fieldname] = itemoptions;
	selectOptionSet(fieldname, 0);	
	setData2Values(fieldname);	

	if (selectortype == 'SingleSelection' && onupdatefunction != null)
		onupdatefunction(leftobj.value);

}

function setValidate(fieldname) {
	resultobj = formItems[fieldname]["ResultObj"];
	rightobj = formItems[fieldname]["RightObj"];
	if (rightobj.length > 0 || formItems[fieldname]["ValidatorText"] == '' || formItems[fieldname]["ValidatorText"] == null)
		rightobj.alt = '';		
	else
		rightobj.alt = 'selectm|1|*|'+formItems[fieldname]["ValidatorText"];
}

function callOnUpdateFunction(fieldname) {
	onupdatefunction = formItems[fieldname]["OnUpdateFunction"];
	if (onupdatefunction != null)
		onupdatefunction(rightobj.length);	
}

function checkAgents(fieldname, agents) {
	rightobj = formItems[fieldname]["RightObj"];
	for (i=rightobj.length-1; i>=0; i--) {
		for (j=agents.length-1; j>=0; j--)
			if(rightobj.options[i].value == agents[j]){
				return true;
			}		
	}
	return false;
}

function getLanguagesIDs(fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	for (var i=leftobj.length-1; i>=0; i--) {
		hideLanguageColumn(leftobj.options[i].value);
	}
	rightobj = formItems[fieldname]["RightObj"];
	for (var i=rightobj.length-1; i>=0; i--) {
		showLanguageColumn(rightobj.options[i].value);
	}
}
function setValidatorText(fieldname, validatortext) {
	formItems[fieldname]["ValidatorText"] = validatortext;
	setValidate(fieldname);
}

function disableValidation(fieldname) {
	formItems[fieldname]["RightObj"].alt = '';
}

function enableValidation(fieldname) {
	setValidate(fieldname);
}

function getSelectedItems(fieldname) {
	result = new Array();
	rightobj = formItems[fieldname]["RightObj"];
	for (i=rightobj.length-1; i>=0; i--)
		result[rightobj.options[i].value] = rightobj.options[i].text;
	return result;
}

function getSelectedValues(fieldname) {
	result = new Array();
	rightobj = formItems[fieldname]["RightObj"];
	for (i=rightobj.length-1; i>=0; i--)
		result[result.length] = rightobj.options[i].value;
	return result;
}

function setSelectorType(fieldname, selectorType) {
	formItems[fieldname]["SelectorType"] = selectorType;
}

function selectSingleSelectionOption(fieldname, value) {
	leftobj = formItems[fieldname]["LeftObj"];
	groupobj = formItems[fieldname]["GroupObj"];
	for (var keyitem in leftOptions[fieldname]) {
		index = 0;
		for( var item in leftOptions[fieldname][keyitem]) {
			if (leftOptions[fieldname][keyitem][item] == value) {
				selectOptionSet(fieldname, keyitem);
				groupobj.selectedIndex = keyitem;
				leftobj.selectedIndex = index;
				singleSelectionChanged(fieldname);
				return true;
			}
			index = index + 1;
		}
	}
	return false;
}

function singleSelectionChanged(fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	onupdatefunction = formItems[fieldname]["OnUpdateFunction"];
	
	setData2Values(fieldname);
	if (onupdatefunction != null)
		onupdatefunction(leftobj.value);

}

function setIrremovableItems(fieldname, arr) {
	formItems[fieldname]["IrremovableItems"] = arr;
}

function objectSelectorSetTranslations(string_id, string) {
	translations[string_id] = string;
}

function lockSelector(fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	rightobj = formItems[fieldname]["RightObj"];
	leftobj.disabled = true;
	rightobj.disabled = true;
}

function unlockSelector(fieldname) {
	leftobj = formItems[fieldname]["LeftObj"];
	rightobj = formItems[fieldname]["RightObj"];
	leftobj.disabled = false;
	rightobj.disabled = false;
}

