var sortitems = 1;

// bewegt einen Eintrag von einer Selectbox in eine andere Selectbox
// fbox: Quelle, z.B. document.form.select1
// tbox: Ziel, z.B. document.form.select2
// benötigt die Funktionen BumpUp(box) und SortD(box)
function move(fbox,tbox)
{
	if (typeof(fbox) != 'object')
		fbox = eval(fbox);
	if (typeof(box) != 'object')
		tbox = eval(tbox);			
	var new_Index = "";
	for(var i=0; i<fbox.options.length; i++)
	{
		if(fbox.options[i].selected && fbox.options[i].value != "" && fbox.options[i].value != "0")
		{
			// check ob Eintrag in tbox schon vorhanden
			for(var j=0; j<tbox.options.length; j++)
			{
				if (tbox.options[j].value == fbox.options[i].value && tbox.options[j].text == fbox.options[i].text)
					return;
			}			
			var no = new Option();
			no.value = fbox.options[i].value;
			no.text = fbox.options[i].text;
			no.title = fbox.options[i].title;
			tbox.options[tbox.options.length] = no;
			new_Index=no.value + ';' + new_Index;
			fbox.options[i].value = "HAUWECH";
			fbox.options[i].text = "";
			fbox.options[i].title = "";
		}
   	}
	BumpUp(fbox);
	//if (sortitems) SortD(tbox);
	if (sortitems) sortList(tbox,false);
}

function moveJQ(fbox,tbox)
{
	
	
	// wozu ???
	if (typeof(fbox) != 'object')
		fbox = (fbox);
	if (typeof(box) != 'object')
		tbox = eval(tbox);
	// Ende wozu ???
	
	var $fbox = $j(fbox);
	var $tbox = $j(tbox);

	var new_Index = "";
	$fbox.find('option:selected').each(function(){
		if(this.value != "" && this.value != "0")
		{
			if(0 < $tbox.find("option[value='"+this.value+"']:contains('"+this.text+"')").length)
			{ 
				return;
			}
			else
			{
				$tbox.append('<option value="'+this.value+'" title="'+this.title+'">'+this.text+'</option>');
				//new_Index=no.value + ';' + new_Index;
				this.value = "HAUWECH";
				this.text = "";
				this.title = "";			
			}
		}
	});
	BumpUp(fbox);
	if(sortitems) sortList(tbox,false);
}

// löscht leere Einträge in einer Selectbox
// box: Selectbox object, z.B. document.form.select
function BumpUp(box) 
{
	if (typeof(box) != 'object')
		box = eval(box);	
	
	for(var i=0; i<box.options.length; i++)
	{
		if(box.options[i].value == "HAUWECH") 
		{
			for(var j=i; j<box.options.length-1; j++)
			{
				box.options[j].value = box.options[j+1].value;
				box.options[j].text = box.options[j+1].text;
				box.options[j].title = box.options[j+1].title;
			}
			var ln = i;
			break;
		}
	}
	if(ln < box.options.length)
	{
		box.options.length -= 1;
		BumpUp(box);
	}
	
}

// sortiert Einträge einer Selectbox alphabetisch
// box: Selectbox object, z.B. document.form.select
function SortD(box) 
{
	if (typeof(box) != 'object')
		box = eval(box);	
	var temp_opts = new Array();
	var temp = new Object();
	for(var i=0; i<box.options.length; i++)
	{
		temp_opts[i] = box.options[i];
	}
	for(var x=0; x<temp_opts.length-1; x++) 
	{
		for(var y=(x+1); y<temp_opts.length; y++) 
		{
			if(temp_opts[x].text > temp_opts[y].text) 
			{
				temp = temp_opts[x].text;
				tempval = temp_opts[x].value;
				temptitle = temp_opts[x].title;
				temp_opts[x].text = temp_opts[y].text;
				temp_opts[x].value = temp_opts[y].value;
				temp_opts[x].title = temp_opts[y].title;
				temp_opts[y].text = temp;
				temp_opts[y].value = tempval;
				temp_opts[y].title = temptitle;
			}
		}
	}
	for(var i=0; i<box.options.length; i++) 
	{
		box.options[i].value = temp_opts[i].value;
		box.options[i].text = temp_opts[i].text;
		box.options[i].title = temp_opts[i].title;
   	}
}

// fügt neues Eintrag in eine Selectbox ein
// box: Selectbox object, z.B. document.form.select
// newItem: Array[0] = value; Array[1] = text, z.B. item = new Array("1","First")
function addItem(box,newItem)
{
	if (typeof(box) != 'object')
		box = eval(box);	
	var no = new Option();
	no.value = newItem[0];
	no.text = newItem[1];
	no.title = newItem[2];
	box.options[box.options.length] = no;
	//if (sortitems) SortD(box);
	if (sortitems) sortList(box,false);
}

// löscht den gegebenen Eintrag einer Selectbox
// box: Selectbox object, z.B. document.form.select
// removeValue: String value)
// doBumpUp: bool führt die Funktion doBumpUp aus
function deleteItem(box,removeValue,doBumpUp) 
{
	if (typeof(box) != 'object')
		box = eval(box);
	// wenn doBumpUp nicht gesetzt ist, dann Standard true
	if(typeof(doBumpUp) == 'undefined')
		var doBumpUp = true
	
	for(var i=0; i<box.options.length; i++)
	{
		if (box.options[i].value == removeValue)
		{
			box.options[i].value = "HAUWECH";
			box.options[i].text = "";
			box.options[i].title = "";
		}
		//break;
	}
	
	if(doBumpUp)
		BumpUp(box);
}

// markiert alle Items einer Selectbox
function selectAllItems(box)
{
	if (typeof(box) != 'object')
		box = eval(box);
	for(var i=0; i<box.options.length; i++)
	{
		box.options[i].selected = true;
	}
}

// ein und ausblenden von gebietseingeschränkten Anliegen 
function setAnliegenliste(ele,anliegenaryid,anliegeneingeschraenktaryid,lockFirstEntry) {

	//debugger;
	if (typeof(oldCaseGebietseinschraenkung) == "undefined")
		oldCaseGebietseinschraenkung = new Object();
	
	var id = ele.id;
	
	selectAnliegen = $(anliegenaryid);
	selectAnliegenEingeschraenkt = $(anliegeneingeschraenktaryid);
	
	if(typeof(oldCaseGebietseinschraenkung[id]) == 'undefined')
		oldCaseGebietseinschraenkung[id] = 1;
	if(typeof(lockFirstEntry) == 'undefined')
		var lockFirstEntry = true;
	
	switch(ele.value) {
	 case "1":
		 /* gebietseingeschränkte Anliegen sind ausgeblendet*/
		 //war vorher "nur gebietseingeschränkte Anliegen sind sichtbar" - case 3 gewählt, so müssen die Listen nur getauscht werden
		 if(oldCaseGebietseinschraenkung[id] == 3) {
		 	tauscheListen(selectAnliegen,selectAnliegenEingeschraenkt,lockFirstEntry);
		 } else { 
		 //war vorher "gebietseingeschränkte Anliegen sind mit eingeblendet" - case 2 gewählt, so müssen die gebietseingeschränkten Anliegen entfernt werden
			 for(var i=0;i<selectAnliegen.options.length;i++) {
			 	if(isGEAnliegen(selectAnliegen.options[i].value)) {
			 		deleteItem(selectAnliegen,selectAnliegen.options[i].value,false);
			 	}
			 }
			 BumpUp(selectAnliegen);
		 }
	 break;
	 
	 case "2":
		 /* gebietseingeschränkte Anliegen sind mit eingeblendet*/
		 //war vorher "nur gebietseingeschränkte Anliegen sind sichtbar" - case 3 gewählt, so müssen zuerst die Listen getauscht werden
		 if(oldCaseGebietseinschraenkung[id] == 3) {
		 	tauscheListen(selectAnliegen,selectAnliegenEingeschraenkt,lockFirstEntry);
		 } 
		 // ist sortitems = 1 so wird bei jedem AddItem die Liste neu sortiert, das wird hier aber nicht benötigt
		 var oldsortitems = sortitems;
		 sortitems = 0;
		 for(var i=0;i<selectAnliegenEingeschraenkt.options.length;i++) {
		 	addItem(selectAnliegen,new Array(selectAnliegenEingeschraenkt.options[i].value,selectAnliegenEingeschraenkt.options[i].text,selectAnliegenEingeschraenkt.options[i].title));
		 }
		 sortitems = oldsortitems;
		 
		 sortList(selectAnliegen,lockFirstEntry);
		 
		 selectAnliegen.selectedIndex = 0;
		 
	 break;
	 
	 case "3":
	 /* nur gebietseingeschränkte Anliegen sind sichtbar*/
	 //war vorher "gebietseingeschränkte Anliegen sind mit eingeblendet" - case 2 gewählt, so müssen zunächst die gebietseingeschränkten Anliegen entfernt werden
	 	
			 for(var i=0;i<selectAnliegen.options.length;i++) {
			 	if(isGEAnliegen(selectAnliegen.options[i].value)) {
			 		deleteItem(selectAnliegen,selectAnliegen.options[i].value,false);
			 	}
			 }
			 BumpUp(selectAnliegen);	 	
	 	
		tauscheListen(selectAnliegen,selectAnliegenEingeschraenkt,lockFirstEntry);
	 break;
	}
	//Für die nächste Auswahl merken (ist besser zur Handhabung der beiden Listen ;-))
	oldCaseGebietseinschraenkung[id] = ele.value;
}

function isGEAnliegen(anliegenId) {
	//return selectAnliegenEingeschraenkt.options.indexOf(anliegenId) != -1;
	for(var j=0;j<selectAnliegenEingeschraenkt.options.length;j++) {
		if(selectAnliegenEingeschraenkt.options[j].value == anliegenId)
			return true;
	}
	return false;
}

// sortList arbeitet schneller als SortD
// @param HTMLObject box  --> die zu sortierende Selectbox
// @param bool lockFirstEntry   --> bei true wird der erste Eintrag nicht mit sortiert
function sortList(box,lockFirstEntry) {
	var tmpArray = new Array();
	
	for(var i=0;i<box.length;i++) {
		// Der erste Eintrag kann bspw.  "--- bitte wählen ---" sein, und sollte nicht mit berücksichtigt werden
		if(i==0 && lockFirstEntry) {
			var tmpBitteWaehlen	= box.options[i];	
		} else {
			tmpArray.push(box.options[i]);
		}
	}
	
	tmpArray.sort(Optionsort);

	while(box.hasChildNodes()) {
		box.removeChild(box.firstChild);
	}
	if(lockFirstEntry)
		box.appendChild(tmpBitteWaehlen);
	
	for(var i=0;i<tmpArray.length;i++) {
		box.appendChild(tmpArray[i]);
	}
	
}


// sortiert zwei option-tags anhand ihres Textes (nicht value!) alphabetisch von a-z
function Optionsort(a,b) {
	var atext = a.text.toLowerCase();
	atext = atext.replace(/ä/g,"ae");
	atext = atext.replace(/ö/g,"oe");
	atext = atext.replace(/ü/g,"ue");
	atext = atext.replace(/ß/g,"s");
	
	var btext = b.text.toLowerCase();
	btext = btext.replace(/ä/g,"ae");
	btext = btext.replace(/ö/g,"oe");
	btext = btext.replace(/ü/g,"ue");
	btext = btext.replace(/ß/g,"s");	
	
	return(atext==btext)?0:(atext>btext)?1:-1;
}

// tauscheListen vertauscht die options der beiden Listen 
// @param HTMLObject boxAnliegen  --> die zu tauschende Selectbox
// @param HTMLObject boxGeAnliegen  --> die zweite zu tauschende Selectbox
// @param bool lockFirstEntry   --> bei true wird der erste Eintrag der ersten Box nicht mit getauscht
function tauscheListen(boxAnliegen,boxGeAnliegen,lockFirstEntry) {
	//debugger;
	var tmpGeAnliegen = new Array();
	boxAnliegen.selectedIndex = 0;
	boxGeAnliegen.selectedIndex = 0;
	
	//die Elemente der zweiten Liste werden zwischengespeichert
	for(var i=0;i<boxGeAnliegen.length;i++) 
		tmpGeAnliegen.push(boxGeAnliegen.options[i]);
	
	//die zweite Liste leeren
	while(boxGeAnliegen.hasChildNodes()) 
		boxGeAnliegen.removeChild(boxGeAnliegen.firstChild);
	
	//die Elemente der ersten Liste werden übertragen 
	var child = boxAnliegen.firstChild;
	
	var isFirst = true;
	while(child != null) {
		// wir benötigen nur option-tag Knoten 
		if(child.nodeName.toLowerCase() != 'option') {
			child = child.nextSibling;
			continue;
		}
		// Der erste Eintrag kann bspw.  "--- bitte wählen ---" sein, und sollte nicht mit berücksichtigt werden
		if(isFirst && lockFirstEntry) {
			isFirst = false;
			var tmpBitteWaehlen	= child;
			child = child.nextSibling;
		} else {
			var tmpChild = child;
			child = child.nextSibling;
			boxGeAnliegen.appendChild(tmpChild);
		}
	} 
	
	//die erste Liste leeren
	while(boxAnliegen.hasChildNodes()) 
		boxAnliegen.removeChild(boxAnliegen.firstChild);
	
	//die erste Liste mit den gespeicherten Elementen füllen
	if(lockFirstEntry)
		boxAnliegen.appendChild(tmpBitteWaehlen);
	for(var i=0;i<tmpGeAnliegen.length;i++)
		boxAnliegen.appendChild(tmpGeAnliegen[i]);
	
	//Fertig :-)
	boxAnliegen.selectedIndex = 0;
}