function SelectBox( aCountryName, aCityName )
{
	/**
	 * Private attributes
	 */
	var countryButton = dojoWrapper.getById("school_selector_country");
	var cityButton = dojoWrapper.getById("school_selector_city");
	var schoolButton = dojoWrapper.getById("school_selector_school");
	
	var firstSelectBox = dojoWrapper.getById("first_select_box");
	var secondSelectBox = dojoWrapper.getById("second_select_box");
	var schoolSelectBox = dojoWrapper.getById("school_select_box");
	
	var countryButtonSpan = dojoWrapper.getById("school_selector_country_span");
	var cityButtonSpan = dojoWrapper.getById("school_selector_city_span");
	var schoolButtonSpan = dojoWrapper.getById("school_selector_school_span");
	
	var countrySelectElement = dojoWrapper.getById("id_price_calculator_select_country");
	var citySelectElement = dojoWrapper.getById("id_price_calculator_select_city");
	var schoolSelectElement = dojoWrapper.getById("id_price_calculator_select_school");
	
	var typeField = dojoWrapper.getById("select1_type");
	var dataField = dojoWrapper.getById("select1_data");
	
	var countrySelectElement = dojoWrapper.getById("id_price_calculator_select_country");
	var citySelectElement = dojoWrapper.getById("id_price_calculator_select_city");
	var schoolSelectElement = dojoWrapper.getById("id_price_calculator_select_school");
	
	
	var schoolSelector = dojoWrapper.getById ( "id_div_school_selector" );
	var schoolSelectorBanner = dojoWrapper.getById ( "id_div_school_selector_banner");
	
	var schoolDemonstrator = dojoWrapper.getById ( "id_div_school_demonstrator" );
	
	var sidebarLinks = dojoWrapper.getById ( "sidebar_links" );
	var schoolImages = dojoWrapper.getById ( "id_school_info_images" );
	
	
	
	/**
	 * Private functions
	 */
	/*
	 * Helper functions
	 */
	function activateButton (aId)
	{
		dojoWrapper.addClass(aId, "active");
		dojoWrapper.removeClass(aId, "inactive");
	}
	
	function deactivateButton (aId)
	{
		dojoWrapper.addClass(aId, "inactive");
		dojoWrapper.removeClass(aId, "active");
	}
	
	function hideElement (aId)
	{
	
		// Hide element
		dojoWrapper.setStyle(aId, "display", "none");
	}
	
	function displayElement (aId)
	{
		// Hide element
		dojoWrapper.setStyle(aId, "display", "block");
	}
	
	
	/*
	 * Enabler functions
	 */
	function enableCountryButton ()
	{
		// Disable the buttons below
		disableCityButton();
		
		// Enable cursor change on hover & opacity
		activateButton(countryButton);
		
		// Connect to the corresponding displayer function
		dojoWrapper.connect(countryButton, "onclick", function()
		{
			displayFirstSelectChoices()
		});
	}
	
	function enableCityButton ()
	{
		// Disable the buttons below & opacity
		disableSchoolButton();
		
		// Enable cursor change on hover
		activateButton(cityButton);
		
		
		// Connect to the corresponding displayer function
		dojoWrapper.connect(cityButton, "onclick", function()
		{
			displaySecondSelectChoices()
		});
		
	}
	
	function enableSchoolButton()
	{
	
		// Enable cursor change on hover & opacity
		activateButton(schoolButton);
		
		
		// Connect to the corresponding displayer function
		dojoWrapper.connect(schoolButton, "onclick", function()
		{
			displaySchoolSelectChoices()
		});
		
	}
	
	/*
	 * Disabler functions
	 */
	function disableCountryButton ()
	{
		// Disable cursor change on hover & opacity 
		deactivateButton(countryButton);
		
		// Set standard text
		countryButtonSpan.innerHTML = gettext ( "Country / Preference" );
		
		// Remove any content of the corresponding select element
		countrySelectElement.value = ''; 
		
		// Disable lower buttons
		disableCityButton();
	}
	
	function disableCityButton ()
	{
		// Disable cursor change on hover & opacity 
		deactivateButton(cityButton);
		
		// Remove any content of the corresponding select element
		citySelectElement.value = ''; 
		
		// Set standard text
		cityButtonSpan.innerHTML = gettext ( "City / Preference" );
		
		//Disable lower button
		disableSchoolButton();
	}
	
	function disableSchoolButton ()
	{
		// Disable lower buttons
		a_price_calculator.disable_obj_children(a_price_calculator.school_select_box);
		// Disable cursor change on hover & opacity 
		deactivateButton(schoolButton);
		
		// Remove any content of schoolSelectElement
		schoolSelectElement.value = '';
		
		// Set standard text
		schoolButtonSpan.innerHTML = gettext ( "School" );
	}
	
	/*
	 * Displayer functions
	 */
	function displayFirstSelectChoices ()
	{
		
		// Disable any remnants from previous schools displayed
		dojoWrapper.setStyle ( sidebarLinks, "display", "none");
		dojoWrapper.setStyle ( schoolImages, "display", "none");
		
		// Set standard text
		countryButtonSpan.innerHTML = gettext ( "Country / Preference" );
		
		// Disable the buttons below
		disableCityButton();
		
		
		// Hide any unnecesary element that could be left
		hideElement( schoolDemonstrator );
		hideElement( secondSelectBox );
		hideElement( schoolSelectBox );
		
		// Display first select choice pan
		displayElement( firstSelectBox );
		
		// Recalculate borders
		globalClass.setBorderHeight ();
	}
	
	function displaySecondSelectChoices ()
	{		
		// Disable any remnants from previous schools displayed
		dojoWrapper.setStyle ( sidebarLinks, "display", "none");
		dojoWrapper.setStyle ( schoolImages, "display", "none");
		
		
		// Disable the buttons below
		disableSchoolButton();
		
		// Hide any unnecesary element that could be left
		hideElement( schoolDemonstrator );
		hideElement( firstSelectBox );
		hideElement( schoolSelectBox );
		
		// Display first select choice pan
		displayElement( secondSelectBox );
		
		// Recalculate borders
		globalClass.setBorderHeight ();
	}
	
	function displaySchoolSelectChoices ()
	{
		
		// Recalculate borders
		globalClass.setBorderHeight ();
		
		// Disable any remnants from previous schools displayed
		dojoWrapper.setStyle ( sidebarLinks, "display", "none");
		dojoWrapper.setStyle ( schoolImages, "display", "none");
		
		// Hide any unnecesary element that could be left
		hideElement(schoolDemonstrator);
		hideElement(firstSelectBox);
		hideElement(secondSelectBox);
		
		// Display first select choice pan
		displayElement(schoolSelectBox);
		
		// Recalculate borders
		globalClass.setBorderHeight ();
	}
	
	function setSecondSelectChoices (aType, aData)
	{
	
		var content = new Object();
		content[aType] = aData;
		
		var url = "/" + PCALC_URL_PREFIX + "fetch_second_select_box/";
		var agent = function(aData, aArgs)
		{
			if (typeof aData == "error") 
			{
				console.warn("error!", aArgs);
			}
			else 
			{
				// Insert the response into page
				secondSelectBox.innerHTML = aData.responseCode;
				
				var secondSelectBoxTitleLink = dojoWrapper.getById ( "second_select_box_title_link" );
				
				// Fill second selectBox
				secondSelectBoxTitleLink.innerHTML = gettext ( "Schulen" ) +  " (" + countryButtonSpan.innerHTML + ") " + gettext ( "anzeigen" );
			
				// Recalculate borders
				globalClass.setBorderHeight ();
			}
		}
		
		var handleAs = "json-comment-optional";	
		
		dojoWrapper.ajaxRequestPost ( url, content, agent, handleAs );
	}
	
	function setSchoolSelectChoices (aFirstType, aFirstData, aSecondType, aSecondData)
	{
		var content = new Object();
		content[aFirstType] = aFirstData;
		content[aSecondType] = aSecondData;
		
		var url = "/" + PCALC_URL_PREFIX + "fetch_school_select_box/";
		var agent = function(aData, aArgs)
		{
			if (typeof aData == "error") 
			{
				console.warn("error!", aArgs);
			}
			else 
			{
				if ( aData.noSchoolSelected != undefined )
				{
					schoolSelectBox.innerHTML = aData.noSchoolSelected.responseCode;
				}
				else if (aData.onlySchool != undefined) 
				{
					// Write it into the button
					schoolButtonSpan.innerHTML = aData.onlySchool.name;
					
					
					// Start price calculator
					var country = aData.onlySchool.countryId;
					var city = aData.onlySchool.cityId;
					var school = aData.onlySchool.schoolId;
					a_price_calculator.set_country(country);
					
					if (citySelectElement.value == '') 
					{
						a_price_calculator.set_city(city);
					}
					
					if (schoolSelectElement.value == '') 
					{
						a_price_calculator.set_school(school);
					}
					
					
					
					// Hide school select box and display school demonstrator
					hideElement(schoolSelectBox);
					displayElement(schoolDemonstrator);
					
					
				}
				else if (aData.responseCode != undefined) 
				{
					// Insert the response into page
					schoolSelectBox.innerHTML = aData.responseCode;
				}
				else
				{
					console.warn("error!", aData);
				}
				
				// Recalculate borders
				globalClass.setBorderHeight ();

			}
		}
		
		var handleAs = "json-comment-optional";
		
		dojoWrapper.ajaxRequestPost ( url, content, agent, handleAs );
	}
	
	
	
	
	/**
	 * Public functions
	 */
	this.displayFirstSelectChoices= function ()
	{

		
		
		// Just a wrapper
		displayFirstSelectChoices ();
	}
	
	this.firstElementSelected = function(aType, aData, aCaption)
	{
		// Write decision into button
		countryButtonSpan.innerHTML = aCaption;
		
		// Save the data to hidden fields
		typeField.value = aType;
		dataField.value = aData;
		
		// Activate city button
		enableCityButton();
		
		// Hide first select button
		hideElement("first_select_box");
		
		// Display second select_box
		displayElement("second_select_box");
		
		// Display loading message
		secondSelectBox.innerHTML = gettext("<h2>Wird geladen...</h2>");
		
		// Set the content for the second selector box ( via AJAX )
		setSecondSelectChoices(aType, aData);
	}
	
	this.secondElementSelected = function(aSecondType, aSecondData, aCaption)
	{
		// Write decision into button
		cityButtonSpan.innerHTML = aCaption;
		
		// Get data from first select box decision
		var firstType = typeField.value;
		var firstData = dataField.value;
		
		// Make second type distinguishable
		if (firstType == "preference" && aSecondType == "preference") 
		{
			aSecondType = aSecondType + "2";
		}
		// Activate city button
		enableSchoolButton();
		
		// Hide second select box
		hideElement(secondSelectBox);
		
		// Display school select_box
		displayElement(schoolSelectBox);
		
		// Display loading message
		schoolSelectBox.innerHTML = gettext("<h2>Wird geladen...</h2>");
		
		// Set the content for the second selector box ( via AJAX )
		setSchoolSelectChoices(firstType, firstData, aSecondType, aSecondData);
	}
	
	this.schoolElementSelected = function ( aSchoolId, aCountryId, aCityId, aCaption )
	{
		// Write decision into button
		schoolButtonSpan.innerHTML = aCaption;
		
		// Hide school select box
		hideElement(schoolSelectBox);
		
		// Start price calculator
		a_price_calculator.set_country(aCountryId);
		
		if ( citySelectElement.value == '' )
		{
			a_price_calculator.set_city ( aCityId );
		}
		
		if ( schoolSelectElement.value == '' )
		{
			a_price_calculator.set_school ( aSchoolId );
		}
	}
	
	this.displaySchoolSelector  = function ()
	{
		dojoWrapper.setStyle ( schoolSelectorBanner, "display", "none" );
		dojoWrapper.setStyle ( schoolSelector, "display", "block" );
		enableCountryButton ();
	}
	
	this.init = function()
	{
		// Set School selector "choose school" if a school is already selected
		
		if ( schoolSelectElement.value != null && schoolSelectElement.value != "null" && schoolSelectElement.value != "" )
		{
			dojoWrapper.setStyle (schoolSelectorBanner, "display", "block");
		}
		else
		{
			dojoWrapper.setStyle (schoolSelector, "display", "block");			
			
			if ( countrySelectElement.value != null && countrySelectElement.value != "null" && countrySelectElement.value != "" )
			{
				if ( citySelectElement.value != null && citySelectElement.value != "null" && citySelectElement.value != "")
				{
					typeField.value = "country";
					dataField.value = countrySelectElement.value;
					this.secondElementSelected ( "city", citySelectElement.value, aCityName );
				}
				else
				{
					this.firstElementSelected ( "country", countrySelectElement.value, aCountryName );
				}
			}
			else
			{
				dojoWrapper.addOnLoad(enableCountryButton);
				dojoWrapper.setStyle (firstSelectBox, "display", "block");	
				
			}
		}		
	}
	
	
	// Initialize the class
	this.init ();
}
