/**
 * @author {Alexander Liessmann, Allgaeu Infoservice}
 */
var _FORMUPDATERURL				= 'formcheck.php';
var _RUNURI               = 'display.php'

var _OPTIONCLASS					= 'select';
var _SELECTTEXTCLASS			= 'selectText';

var _COUNTRYID						= 'country';
var _COUNTRYSELECTID			= 'countrySelect';
var _COUNTRYINPUTID				= 'country_sel';
var _COUNTRYSELECTTEXT		= 'W&auml;hlen Sie ein Land aus!';

var _REGIONID							= 'region';
var _REGIONSELECTID				= 'regionSelect';
var _REGIONINPUTID				= 'region_sel';
var _REGIONSELECTTEXT			= 'W&auml;hlen Sie eine Region aus!';

var _CITYID								= 'city';
var _CITYSELECTID					= 'citySelect';
var _CITYINPUTID					= 'city_sel';
var _CITYSELECTTEXT				= 'W&auml;hlen Sie einen Ort aus!';

var _PRESELECTIONID				= 1

var _SEPERATOR						= '_';
var _CALLSEPERATOR				= '|';


/*******************************
 * Nothing to change beyond here
 *******************************/

var _UNDEFINED;
var jSelected = { _COUNTRYID: false, _REGIONID: false, _CITYID: false };
var oCurrentOpenedBox = false;


/**
 * Init-Function: Called when HTML-Document is loaded
 */
function initDropdown()
{
	requestData(0, _COUNTRYSELECTTEXT, _COUNTRYSELECTID, _COUNTRYINPUTID, _COUNTRYID);
	
	new PeriodicalExecuter(function(pe) {
		try 
		{
			if ( $(_COUNTRYSELECTID) )
			{
				throw true;
			}
			else
			{
				throw false;
			}
		}
		catch (e)
		{
			if ( e == true )
			{
				selectItem($(_COUNTRYSELECTID + _SEPERATOR + _PRESELECTIONID), true);
				pe.stop();
			}
		}
	}, 0.5);
}

/**
 * Manage Fold-In and -Out of the Dropdown lists
 * 
 * @param 	HTMLObject 		Container with the Elementlist
 */
function dropList(oBox)
{
	if ( oBox == _UNDEFINED )
		return;

	if ( oCurrentOpenedBox !== false )
	{
		showItems(oCurrentOpenedBox);
	}

	showItems(oBox);
}

/**
 * Fold-In and Fold-Out of an Element
 * 
 * @param 	HTMLObject 		Container with the Elementlist
 */
function showItems(oBox)
{
	if ( oBox.visible() )
	{
  	Effect.BlindUp(oBox, { duration: 0.5 });
		oCurrentOpenedBox = false;
  }
	else
	{
		Effect.BlindDown(oBox, { duration: 0.5 });
		oCurrentOpenedBox = oBox;
	}
}



/**
 * Function is called when a Item from the Dropdown list is clicked
 * 
 * @param 	HTMLObject 		Clicked item
 * @param		Bool					Fold Function active?
 */
function selectItem(oItem, bDontShowItems)
{
	var oBox = oItem.up('div');

	if ( bDontShowItems != true )
	{
		showItems(oBox);
	}

  var oSelectedDisplay = oBox.previous('.' + _SELECTTEXTCLASS).down('span');
	var sSelectedText = oItem.firstChild.data;
	oSelectedDisplay.update(sSelectedText);

	var sItemId = oItem.readAttribute('id');
	var asParams = sItemId.split(_SEPERATOR);
	var sCurrentAction = oItem.up('div',1).readAttribute('id');

	switch ( sCurrentAction )
	{
		case _COUNTRYID:
			if ( jSelected._REGIONID === false )
			{
				requestData(asParams[1], _REGIONSELECTTEXT, _REGIONSELECTID, _REGIONINPUTID, _REGIONID);
				jSelected._REGIONID = true;
			}
			else
			{

				removePrevious(_REGIONSELECTID);
				jSelected._REGIONID = false;
				
				if (jSelected._CITYID == true) {
					removePrevious(_CITYSELECTID);
					jSelected._CITYID = false;
				}

				requestData(asParams[1], _REGIONSELECTTEXT, _REGIONSELECTID, _REGIONINPUTID, _REGIONID);
				jSelected._REGIONID = true;
			}

			$(_COUNTRYINPUTID).writeAttribute({'value': asParams[1]});
			break;
			
		case _REGIONID:
			if ( jSelected._CITYID === false )
			{
				requestData(asParams[1], _CITYSELECTTEXT, _CITYSELECTID, _CITYINPUTID, _CITYID);
				jSelected._CITYID = true;
			}
			else
			{
				removePrevious(_CITYSELECTID);
				jSelected._CITYID = false;
				
				requestData(asParams[1], _CITYSELECTTEXT, _CITYSELECTID, _CITYINPUTID, _CITYID);
				jSelected._CITYID = true;
			}
			
			$(_REGIONINPUTID).writeAttribute({'value': asParams[1]});
			break;
			
		case _CITYID:
			$(_CITYINPUTID).writeAttribute({'value': asParams[1]});
			break;
			
		default:
			break;
	}
}

/**
 * Removes a previously generated Dropdown list
 * 
 * @param 	String 		Id of the Item to remove
 */
function removePrevious(sItemId)
{
  //$(sItemId).previous().previous().remove();
	$(sItemId).previous().remove();
  $(sItemId).up().hide();
	$(sItemId).remove();
}

/**
 * Ajax Call and List generation
 * 
 * @param 	String 		Parameter for dataId
 * @param 	String 		Text, displayed as first Item in the Selectbox
 * @param 	String 		Value of the Id of the Selectbox
 * @param 	String 		Id of the Element into which the Box will be rendered and Parameter for grab
 */
function requestData(sParam, sSelectText, sSelectBoxId, sInputId, sTargetId)
{
	new Ajax.Request(_FORMUPDATERURL, {
		method: 'post',
		parameters: 'grab=' + sTargetId + '&dataId=' + sParam,
	  onSuccess: function(transport)
		{
			generateList(transport, sSelectText, sSelectBoxId, sInputId, sTargetId)
		}
	});
}

/**
 * Generates the Dropdown list and inserts it into the Document
 * 
 * @param 	Object		 transport
 * @param 	String		 Text, displayed as first Item in the Selectbox
 * @param 	String		 Value of the Id of the Selectbox
 * @param 	String		 Id of the Element into which the Box will be rendered
 */
function generateList(transport, sSelectText, sSelectBoxId, sInputId, sTargetId)
{
	var oSelectBox = new Element('div', {
		id: sSelectBoxId
	});

	oSelectBox.hide();
	
	/*var oInputField = new Element('input', {
		id: sInputId,
		name: sInputId,
		type: 'hidden',
		value: ''
	});*/

	var asData = transport.responseText.split(_CALLSEPERATOR);

	asData.each(function(sData)
	{
		var jData = sData.evalJSON(true);
		
		var oLink = new Element('span', {
			id: sSelectBoxId + _SEPERATOR + jData.key,
			'class': _OPTIONCLASS
		});

		oLink.update(jData.label);

		Event.observe(oLink, 'click', function(event)
		{
			selectItem(Event.element(event));
		});

    Event.observe(oLink, 'mouseover', function(event)
		{
			Event.element(event).addClassName('over');
		});
    
    Event.observe(oLink, 'mouseout', function(event)
		{
			Event.element(event).removeClassName('over');
		});
    
		oSelectBox.insert(oLink);
	});
	//$(sTargetId).insert(oInputField);
	$(sTargetId).insert(generateFirstItem(sSelectText));
	$(sTargetId).insert(oSelectBox);
  $(sTargetId).show();
}

/**
 * Generates the first Item of a Dropdown list
 * 
 * @param 	String 		Text, displayed as first Item in the Selectbox
 */
function generateFirstItem(sSelectText)
{
	var oSelTextContainer = new Element('span').update(sSelectText);
	
	var oSelectText = new Element('span', {
		'class': _SELECTTEXTCLASS
	}).update(oSelTextContainer);
	
	Event.observe(oSelectText, 'click', function(event)
	{
		oItem = Event.element(event);
		oBox = oItem.next('div');
		dropList(oBox);
	});
	
	return oSelectText;
}

/**
 * Call the Init-Function when the page is ready loaded
 */
Event.observe(window, 'load', initDropdown);

