function ZoekSelectie()
{
	this.aArrangementen= []; 	// Arrangementen array
	
	this.aReisSoort	   = [];	// ReisSoorten array
	this.aBestemmingen = [];	// Landen array
	this.aRegios	   = [];	// Regios array
	this.aReisDuur	   = [];	// Reisduur array
	
	// Elementen van Arrangementen array element:
	var iReisSoort= 0;
	var iLand	  = 1;
	var iRegio	  = 2;
	var iReisDuur = 3;
	
	this.DefaultValue_ReisSoort= 0;					
	this.DefaultValue_Bestemming= 0;			
	this.DefaultValue_Regio= 0;
	this.DefaultValue_ReisDuur= 0;
	
	// ZoekSelectieIDs
	this.SelCrit_ReisSoort  = 0;
	this.SelCrit_Bestemming = 1;
	this.SelCrit_Regio	    = 2;
	this.SelCrit_ReisDuur   = 3;
	
	var aSelCrit_ID;
	var aSelCritValues;			//	array van (ingevulde) selectie-criteria value
	var aSelectedArrang; 		//	index-array van geselecteerde mogelijkheden
	
	this.initialize= function initialize()
	{
		this.setSelCritItems();
		this.setSelCritValues_2Default();
		this.setAllSelCritOptions();
		for (var i= 0;i< aSelCrit_ID.length;i++)
			this.SetValue(aSelCrit_ID[i], this.SelCrit_DefaultValue(aSelCrit_ID[i]));
		this.Check();
	}
	
	this.reset = function reset() {
		this.initialize();
	}
	
	this.setSelCritItems = function setSelCritItems()
	{
		// Bepaal aSelCrit_ID array
		aSelCrit_ID= [];
		if (document.getElementById('reissoort')!= null)
			aSelCrit_ID.push(this.SelCrit_ReisSoort);
		if (document.getElementById('land')!= null)
			aSelCrit_ID.push(this.SelCrit_Bestemming);
		if (document.getElementById('regio')!= null)
			aSelCrit_ID.push(this.SelCrit_Regio);
		if (document.getElementById('reisduur')!= null)
			aSelCrit_ID.push(this.SelCrit_ReisDuur);
	}
	
	this.Check = function Check() 
	{
		this.setSelCritValues_2Input();					
		this.setAllSelCritOptions();		
		for (var i= 0;i< aSelCrit_ID.length;i++)
		{		
			this.SetValue(aSelCrit_ID[i], aSelCritValues[aSelCrit_ID[i]]);
		}
	}

	this.setAllSelCritOptions = function setAllSelCritOptions() {
		for (var i= 0;i< aSelCrit_ID.length;i++) {					//	Per selectie criterium (aSelCrit_ID[i])
			this.SelectArrang(aSelCrit_ID[i]);			//	-	Maak lijst van arrangementen o.b.v. alle -behalve iSelCritID- selectiecreria.
			this.SetSelCritOptions(aSelCrit_ID[i]);		//	-	Zet resulterende option mogelijkheden voor iSelCritID
		};
	}

	this.SetValue = function SetValue(iSelCritID, Value) {
		var oControl= this.SelCrit_Control(iSelCritID);
		for (i=0; i< oControl.length; i++) 
		{
			//console.log(oControl[i]);
			if (oControl[i].value== Value) {
				oControl.selectedIndex= i;
			};
		}
	}
	
	this.SetSelCritOptions = function SetSelCritOptions(iSelCritID) 
	{
		var aValues= this.GetSelCritOptionValues(iSelCritID);
		var aDescrArray= this.SelCrit_DescriptionArray(iSelCritID);
		
		var aOptions= new Array();
		
		var aGeneralValues= new Array(-1, 0);
		for (v=0;v < aGeneralValues.length;v++)
			if (this.ArrayFind(aValues, aGeneralValues[v])== -1)
				if (aDescrArray[aGeneralValues[v]])
					aOptions.push(new Array(aDescrArray[aGeneralValues[v]], aGeneralValues[v]));
				
		for (v in aValues) {			
			if (aDescrArray[aValues[v]]!= undefined)
				aOptions.push(new Array(aDescrArray[aValues[v]], aValues[v]));
		};
		if (iSelCritID != this.SelCrit_ReisDuur)
			aOptions.sort(OptionsSort);
		var oControl= this.SelCrit_Control(iSelCritID);
		this.SetOptionProp(oControl, aOptions);
	}
	
	function OptionsSort(a, b) {
		var retVal;
		var aCmp= ((a[1]<2)?("a"+a[1]):("z"))+a[0];
		var bCmp= ((b[1]<2)?("a"+b[1]):("z"))+b[0];
		if (aCmp< bCmp)
			retVal= -1;
		else
			if (aCmp> bCmp) 
				retVal= 1 ;
			else
				retVal= 0;
		return(retVal);
	} 
	
	this.GetSelCritOptionValues = function GetSelCritOptionValues(iSelCrit_ID) {
		var aValues= new Array();
		//for (var r in aSelectedArrang) {
		for (var r= 0;r< aSelectedArrang.length;r++) 
		{
			var iArrangRecord= aSelectedArrang[r];
			var iArrangField= this.SelCrit_ArrangField(iSelCrit_ID);			
			var ArrangField_Value= this.aArrangementen[iArrangRecord][iArrangField];			
			if (this.isArray(ArrangField_Value)) {
				for (var i=0; i < ArrangField_Value.length;i++) {
					aValues.push(ArrangField_Value[i]);
				};
			}
			else {
				aValues.push(ArrangField_Value);
			};
		};
		return(this.UniqueValues(aValues));
	}
	
	this.UniqueValues = function UniqueValues(anArray) {
		var secondArray= new Array();
		for (var i=0; i<anArray.length; i++) 
		    secondArray[anArray[i]]=anArray[i];
	    return(secondArray);
    }
	
	this.SelectArrang = function SelectArrang(iSelCritID) {
		aSelectedArrang= new Array();
		for (var iArrang_Record in this.aArrangementen) 
		{
			var bSelected= true;
			var i= 0;
			while ((i< aSelCrit_ID.length) && bSelected) 
			{
				if (aSelCrit_ID[i]!= iSelCritID) 
				{
					var iArrangField= this.SelCrit_ArrangField(aSelCrit_ID[i]);
					var ArrangField_Value= this.aArrangementen[iArrang_Record][iArrangField];
					var SelCrit_Value= aSelCritValues[aSelCrit_ID[i]];
					bSelected= this.TestArrangField(aSelCrit_ID[i], ArrangField_Value, SelCrit_Value);
					
					if (false)
						alert("SelectArrang, a.h.v. "+ this.SelCrit_InputName(iSelCritID)+
							", record: "+iArrang_Record+
							", test "+this.SelCrit_InputName(aSelCrit_ID[i])+ " ("+ArrangField_Value+" == "+SelCrit_Value+") => "+((true)?("JA"):("NEE")));
				};
				i+= 1;
			};
			if (bSelected) {
				aSelectedArrang.push(iArrang_Record);
			};
		};
	}

	this.TestArrangField = function TestArrangField(iSelCritID, ArrangField_Value, SelCrit_Value) {
		var bOK= true;
		if (this.EenBetekentAlles(iSelCritID) && (ArrangField_Value== 1 || SelCrit_Value== 1)) {
			bOK= true;
		}
		else {				
			var isValue;
			/*if (this.AlfaNumeriekeKey(iSelCritID))
				isValue= (typeof(SelCrit_Value)== "string" && SelCrit_Value.length> 0);
			else*/
				isValue= (SelCrit_Value> 0);
				
			if (isValue) {
				if (this.isArray(ArrangField_Value)) {
					bOK= (ArrangField_Value.indexOf(SelCrit_Value)!= -1);
				}
				else {
					bOK= (ArrangField_Value == SelCrit_Value);
				};
			};
		};
		return(bOK);
	}
	
	this.isArray = function isArray(obj) {
		var bIs;
		if (typeof(obj)== "string")
			bIs= false;
		else
			bIs= (typeof(obj.length)=="undefined")?(false):(true);
		return(bIs);
	}
	
	this.EenBetekentAlles = function EenBetekentAlles(iSelCritID) {
		var bOK= false;	//	(iSelCritID== Arrang_Regio);
		return(bOK);
	}

	this.setSelCritValues_2Input = function setSelCritValues_2Input() 
	{
		aSelCritValues= [];
		for (var i= 0;i< aSelCrit_ID.length;i++)
		{
			var iSelCritID= aSelCrit_ID[i];
			var oControl= this.SelCrit_Control(iSelCritID);
			var iValue= oControl.options[oControl.selectedIndex].value;
			/*if (!this.AlfaNumeriekeKey(iSelCritID) || oControl.selectedIndex== 0)
				iValue= parseInt(iValue);*/
			aSelCritValues[iSelCritID]= iValue;
		};
	}

	this.SetSelCritValues_2Default = function SetSelCritValues_2Default() {
		aSelCritValues= new Array();
		for (var i= 0;i< aSelCrit_ID.length;i++)
			aSelCritValues[aSelCrit_ID[i]]= this.SelCrit_DefaultValue(aSelCrit_ID[i]);
	}
	
	this.setSelCritValues_2Default = function setSelCritValues_2Default() 
	{
		aSelCritValues= [];
		for (var i= 0;i< aSelCrit_ID.length;i++)
			aSelCritValues[aSelCrit_ID[i]]= this.SelCrit_DefaultValue(aSelCrit_ID[i]);
	}

	this.SelCrit_Control = function SelCrit_Control(iSelCrit_ID) 
	{
		var oControl;
		switch (iSelCrit_ID) {
			case this.SelCrit_ReisSoort:	oControl= document.zoekselectie.reissoort;break;
			case this.SelCrit_Bestemming:	oControl= document.zoekselectie.land; 	  break;
			case this.SelCrit_Regio:		oControl= document.zoekselectie.regio; 	  break;
			case this.SelCrit_ReisDuur:		oControl= document.zoekselectie.reisduur; break;
			
		};
		return(oControl);
	}
			
	this.SelCrit_InputName = function SelCrit_InputName(iSelCrit_ID) {
		var sName= "";
		switch (iSelCrit_ID) {
			case this.SelCrit_ReisSoort: 	sName= "reissoort"; break;
			case this.SelCrit_Bestemming:	sName= "land"; break;
			case this.SelCrit_Regio:		sName= "regio"; break;
			case this.SelCrit_ReisDuur:		sName= "reisduur"; break;			
		};
		return(sName);
	}

	this.SelCrit_ArrangField = function SelCrit_ArrangField(iSelCrit_ID) {
		var iField;
		switch (iSelCrit_ID) {
			case this.SelCrit_ReisSoort: 	iField= iReisSoort; break;
			case this.SelCrit_Bestemming:	iField= iLand; break;
			case this.SelCrit_Regio:		iField= iRegio; break;
			case this.SelCrit_ReisDuur:		iField= iReisDuur; break;			
		};
		return(iField);
	}
	
	this.SelCrit_DefaultValue = function SelCrit_DefaultValue(iSelCrit_ID) 
	{
		var iValue;
		switch (iSelCrit_ID) {
			case this.SelCrit_ReisSoort:	iValue= this.DefaultValue_ReisSoort; break;
			case this.SelCrit_Bestemming:	iValue= this.DefaultValue_Bestemming; break;
			case this.SelCrit_Regio:		iValue= this.DefaultValue_Regio; break;
			case this.SelCrit_ReisDuur:		iValue= this.DefaultValue_ReisDuur; break;			
		};
		return(iValue);
	}
	
	this.SelCrit_DescriptionArray = function SelCrit_DescriptionArray(iSelCrit_ID) 
	{
		var aArray1;
		switch (iSelCrit_ID) {
			case this.SelCrit_ReisSoort:	aArray1= this.aReisSoort; break;
			case this.SelCrit_Bestemming:	aArray1= this.aBestemmingen; break;
			case this.SelCrit_Regio:		aArray1= this.aRegios; break;
			case this.SelCrit_ReisDuur:		aArray1= this.aReisDuur; break;			
		};
		
		var aArray2= new Array();
		for (v= 0;v< aArray1.length;v++) {
			aArray2[aArray1[v][0]]= aArray1[v][1];
		};
		return(aArray2);
	}

	this.SetOptionProp = function SetOptionProp(oSelect, aValues) {
		var oldValue= oSelect[oSelect.selectedIndex].value;
		for (loop=0; loop < aValues.length; loop++) {
			if ((loop+1)> oSelect.options.length) {
				opt= new Option('text', 'value');
				oSelect[oSelect.options.length]= opt;
			};
			oSelect.options[loop].text = aValues[loop][0];
			oSelect.options[loop].value= aValues[loop][1];
			if (oSelect.options[loop].value== oldValue)
				oSelect.selectedIndex= loop;
		};
		if (oSelect.options.length > aValues.length) {
			loop = oSelect.options.length - 1;
			while (loop >= aValues.length) {
				oSelect.options[loop]= null;
				loop -= 1;
			};
		};
	}

	this.ArrayFind = function ArrayFind(aArray, Value) {
		for (var keys in aArray) {
			if (aArray[keys] == Value) {
				return keys;
				break;
			};
		};
		return -1;
	}
}
