// JavaScript Document
//'http://ajax.kuraredesign-kunden.de:80/infx/return_result.php';
//ar flightContainer = '';
var flightRequestor = false;
var PERF_DEBUG = false;

function RequestDataObject()
{
  this.requestData=new Array();
}

RequestDataObject.prototype.clone=function()
{
  var theArray=new Array();
  var theCloneString='';
  for (var theName in this.requestData)
  {
    theArray[theName]=this.requestData[theName];
    theCloneString+=theName+':'+theArray[theName]+';';
  }
  //alert("RequestDataObject cloned: "+theCloneString);
  var theData=new RequestDataObject();
  theData.requestData=theArray;
  return theData;
}
    
    
RequestDataObject.prototype.setData=function(aKey,aValue)
{
  this.requestData[aKey]=aValue;
}

RequestDataObject.prototype.getData=function(aKey)
{
  if (this.requestData[aKey])
    return this.requestData[aKey];
  else
    return '';
}


function workOnHTTPResponse()
{
  if(flightRequestor != null)
    flightRequestor.readResponse(flightRequestor.httpRequest);
  else
    alert ("Initialization uncomplete: flightRequestor not set!");
}


// JavaScript Document
//'http://ajax.kuraredesign-kunden.de:80/infx/return_result.php';
//ar flightContainer = '';
var flightRequestor = false;

function searchAirport(aElementName)
{
  var theInput = document.getElementById(aElementName);
  if (theInput == null)
  {
    alert("No element with id "+aElementName+" found");
    return;
  }
  var theOutPut = document.getElementById('startOutput');
  if (theInput == null)
  {
    alert("No element with id "+'startOutput'+" found");
    return;
  }
  theOutPut.value = theInput.value +"-BLA";
}


function init(anUrl, 
			aFlightContainer, 
			aMaxPrice, 
			aDepartureTime,
			aReturnTime,
			aDeparture,
			aDestination,
			aDepartureDate,
			aReturnDate)
{
	var startDateTemp = getDefaultStartDateFormatted();
	var endDateTemp = getDefaultEndDateFormatted();
   var theRequestors = new Array();
   var theDestRequestor= new FlightRequestor();
   var theNotifier = new MouseWaitNotifier();
   // Destination Requestor & Departure - necessary
   theDestRequestor.set('flightContainer',aFlightContainer);   
   theDestRequestor.set('name','destinationFlightRequestor');   
   theDestRequestor.set('startTime','00:00');
   theDestRequestor.set('endTime','23:59');
   theDestRequestor.set('defaultURL',anUrl);  
   // Destination Requestor & Departure - optional
   if (aMaxPrice && aMaxPrice != '') {
   		theDestRequestor.set('maxPrice',aMaxPrice);
   } else {
   		theDestRequestor.set('maxPrice',1000);
   }
   if (aDepartureDate && aDepartureDate != '') 
   {
   		theDestRequestor.set('startDate',aDepartureDate);
   } else {
   		theDestRequestor.set('startDate',startDateTemp);
   }
   if (aReturnDate && aReturnDate != '')
   {
   		theDestRequestor.set('endDate',aReturnDate);
   } else {
   		theDestRequestor.set('endDate',endDateTemp);
   }
   //
   theDestRequestor.addListener(theNotifier);   
   var theHandlerFactory = new ResponseHandlerFactory();
   theDestRequestor.setResponseHandler(theHandlerFactory.createResponseHandler(theDestRequestor));   
   window.destinationFlightRequestor=theDestRequestor;
   // Clone
   var theDepartureReq=theDestRequestor.clone();
   // Destination - optional // Departure Requestor - optional 
   if (aDestination && aDestination != '') 
   {
   		theDestRequestor.set('fromIataCode', aDestination);
		theDepartureReq.set('toIataCode', aDestination);
   }
   	if (aDeparture && aDeparture != '') 
   	{
   		theDestRequestor.set('toIataCode', aDeparture);
		theDepartureReq.set('fromIataCode', aDeparture);
	}
   // Departure Requestor - necessary      
   theDepartureReq.set('name','departureFlightRequestor');  
   theDepartureReq.setResponseHandler(theHandlerFactory.createResponseHandler(theDepartureReq));   
   theDepartureReq.addListener(theNotifier);
   
   window.departureFlightRequestor=theDepartureReq;
   
   var theTopDestinationReq=theDestRequestor.clone();
   theTopDestinationReq.set('name','topDestinationFlightRequestor');
   theTopDestinationReq.setResponseHandler(theHandlerFactory.createResponseHandler(theTopDestinationReq));
   theTopDestinationReq.addListener(theNotifier);
   window.topDestinationFlightRequestor=theTopDestinationReq;
   theRequestors['departureFlightRequestor']=theDepartureReq;
   theRequestors['destinationFlightRequestor']=theDestRequestor;
   theRequestors['topDestinationFlightRequestor']=theTopDestinationReq;
   
   return theRequestors;
}

function MouseWaitNotifier()
{

}

MouseWaitNotifier.prototype.requestPerformed=function(anEvent)
{
  if (anEvent.action=='STARTED')
  {
    document.body.style.cursor='wait';
  }
  else (anEvent.action=='END')
  {
    document.body.style.cursor='default';
  }
}

// ---------- FlightRequestor - ------------------------------------------

function FlightRequestor() {
 this.requestProcessor = new RequestProcessor();
 this.requestDataObject=new RequestDataObject();
 this.httpRequest = false;
 
 this.checkStatus=checkStatus;
 this.xml=null;
 this.listener=new Array();
 return this;
} 
/**
 * Entfernt die Eingaben des Benutzers
 * @author Markus Hanses
 */
FlightRequestor.prototype.resetRequestor=function()
{
	this.setFromIataCode('');
	this.setToIataCode('');
	this.setDepartureLocation('');
	this.setDestinationLocation('');
	this.setDayTolerance('15');
	this.setMaxPrice('10000');
	this.setStartTime('00:00');
	this.setEndTime('23:59');
	var startDate = getDefaultStartDateFormatted();
	var endDate = getDefaultEndDateFormatted();
	this.setStartDate(startDate);	
	this.setEndDate(endDate);
}

FlightRequestor.prototype.set=function(aKey, aValue)
{
  this.requestDataObject.setData(aKey, aValue);
}

FlightRequestor.prototype.get=function(aKey, aValue)
{
  return this.requestDataObject.getData(aKey);
}

FlightRequestor.prototype.clone=function()
{
 var theClone = new FlightRequestor();
 theClone.requestDataObject=this.requestDataObject.clone();
 
 return theClone;
}

FlightRequestor.prototype.addResponseEventListener=function(aListener)
{  
  this.requestProcessor.addResponseEventListener(aListener);
}


/*
Sends a message to the specified url as POST request.
*/
FlightRequestor.prototype.sendRequest=function(anURL, aMessage) {
  
  this.notifyListener(new RequestEvent(this,'STARTED'));
  
  this.requestProcessor.sendRequest(anURL,aMessage);  
}

FlightRequestor.prototype.setResponseHandler=function(aResponseHandler)
{
  this.requestProcessor.setResponseHandler(aResponseHandler);
}

FlightRequestor.prototype.setAirportLoader=function(aLoader)
{
  
}


FlightRequestor.prototype.responseReceived=function(aValue)
{  
  this.notifyListener(new RequestEvent(this,aValue));
}

FlightRequestor.prototype.notifyListener=function(anEvent)
{
  for (var i = 0; i< this.listener.length;i++)
  {
    this.listener[i].requestPerformed(anEvent);
  }
}



FlightRequestor.prototype.addListener=function(aListener)
{
  this.listener[this.listener.length]=aListener;
}


FlightRequestor.prototype.callUrl=function(anUrl)
{
  
  	var theFromIata=this.get('fromIataCode');
  	var theToIata=this.get('toIataCode');
 
  	if(!theFromIata)
	{
	theFromIata='';
	}
	  
	if(!theToIata)
	{
		theToIata='';
	}
  
	var theRequest = 'sessionID='+sessionID+
	  '&maxprice='+this.get('maxPrice')+
	  '&startdate='+this.replaceNull(this.get('startDate'))+
	  '&enddate='+this.replaceNull(this.get('endDate'))+
	  '&starttime='+this.replaceNull(this.get('startTime'))+
	  '&endtime='+this.replaceNull(this.get('endTime'))+
	  '&departureradius='+this.replaceNull(this.get('departureRadius'))+
	  '&destinationtemperature='+this.replaceNull(this.get('destinationTemperature'))+
	  '&departurelocation='+this.replaceNull(this.get('departureLocation'))+
	  '&destinationlocation='+this.replaceNull(this.get('destinationLocation'))+
	  '&fromiatacode='+this.replaceNull(theFromIata)+
	  '&toiatacode='+this.replaceNull(theToIata)+
	  '&displaytype='+this.replaceNull(this.get('displayType'))+
	  '&offerid='+this.replaceNull(this.get('offerid'))+
	  '&daytolerance='+this.replaceNull(this.get('dayTolerance'));
	  
  	this.sendRequest(anUrl,theRequest);
}

FlightRequestor.prototype.replaceNull=function(aValue)
{
  if (aValue==null)
   return '';
  return aValue;
}


FlightRequestor.prototype.callFlights=function()
{
  this.callUrl(this.get('defaultURL'));
}

FlightRequestor.prototype.setFromIataCode=function(aCode)
{
  this.set('fromIataCode',aCode);
}

FlightRequestor.prototype.setToIataCode=function(aCode)
{
  this.set('toIataCode',aCode);
}

FlightRequestor.prototype.setDepartureLocation=function(aLocation)
{
  this.set('departureLocation',aLocation);
}

FlightRequestor.prototype.setDestinationLocation=function(aLocation)
{
  this.set('destinationLocation',aLocation);
}

FlightRequestor.prototype.getDepartureLocation=function()
{
  return this.get('departureLocation');
}

FlightRequestor.prototype.getDestinationLocation=function()
{
  return this.get('destinationLocation');
}


FlightRequestor.prototype.setDepartureRadius=function(aRadius)
{
  this.set('departureRadius',aRadius);
}

FlightRequestor.prototype.setDestinationTemperature=function(aTemperature)
{
  this.set('destinationTemperature',aTemperature);
}

FlightRequestor.prototype.setDayTolerance=function(aValue)
{
  this.set('dayTolerance',aValue);
}

FlightRequestor.prototype.getDayTolerance=function()
{
  return this.get('dayTolerance');
}

FlightRequestor.prototype.setMaxPrice=function(aPrice)
{
  this.set('maxPrice',aPrice);
}

FlightRequestor.prototype.getMaxPrice=function()
{
  return this.get('maxPrice');
}

/**
 * Setzt die Uhrzeit.
 * @author Markus Hanses
 * @param {Object} aTime
 */
FlightRequestor.prototype.setStartTime=function(aTime)
{
  this.set('startTime',aTime);
}
/**
 * Holt die Uhrzeit.
 * @author Markus Hanses
 */
FlightRequestor.prototype.getStartTime=function()
{
  return this.get('startTime');
}
/**
 * Setzt die Uhrzeit.
 * @author Markus Hanses
 * @param {Object} aTime
 */
FlightRequestor.prototype.setEndTime=function(aTime)
{
  this.set('endTime',aTime);
}
/**
 * Gibt die Uhrzeit aus.
 * @author Markus Hanses
 */
FlightRequestor.prototype.getEndTime=function()
{
  return this.get('endTime');
}

/**Zap calendar adaption*/
FlightRequestor.prototype.setStartDate=function(aStartDate) {
  //if (cal.dateClicked)
   //alert("Selected Start Date: "+theStartDate);
   this.set('startDate',aStartDate);
}

FlightRequestor.prototype.setEndDate=function(aEndDate) {
   //if (cal.dateClicked)
   //var theEndDate = aEndDate.date.print("%d.%m.%Y");
   //alert("Selected End Date: "+theEndDate);
   this.set('endDate', aEndDate);
} 

FlightRequestor.prototype.checkIsNull=function(aFieldId, aValue)
{
  if ((aValue == null) || (aValue == '')){
    alert("Field "+aFieldId+" content is not set!");
    return true;
  }
  else{
    return false;
  }
}

function checkStatus(aHttpRequest){
  if (aHttpRequest.status == 200) {
    return true;
} else {
    
    return false;
    // die Anfrage enthielt Fehler;
    // die Antwort war z.B. 404 (nicht gefunden)
    // oder 500 (interner Server-Fehler)
}
}



function RequestEvent(aRequestor, aState)
{
  this.action=aState; //optional action = STARTED, RECEIVED
  this.source=aRequestor;
}



// --------- Response Event --------------------------------------

function ResponseEvent (aRequestor, aResponse)
{
  this.requestor = aRequestor;
  this.response = aResponse;
}

// ----------------- Response Event Dispatcher ---------------------

function ResponseEventDispatcher()
{
  this.responseReceived = dispatchResponseReceived;
  this.containerList = new Array();
  this.addFlightContainer=addFlightContainer;
}

function dispatchResponseReceived(aResponseEvent)
{
  var i;
  var theDom = aResponseEvent.response;
  //alert(theDom);
  var theModel = new ApplicationOfferModel(theDom);
  
  for(i=0;i<this.containerList.length;i++)
  {
    if (!this.containerList[i].setFlightContent)
    {
      GetValues(this.containerList[i]);
    }
    else
      this.containerList[i].setFlightContent(theModel);
  }
}

function addFlightContainer(aContainer)
{
  var theCount = this.containerList.length;
  this.containerList[theCount] = aContainer;
}

//----------------------------------- Debug option -----------------------------------
function GetValues(obj)
{
var res = '';
res += 'Objekt: '+obj+'\n\n';
for(temp in obj)
{
res += temp +': '+obj[temp]+'\n';
}
alert(res);
}


//----------------------------- SliderWrapper -----------------------------

function SliderWrapper(aSlider)
{
	this.slider = aSlider;
	//alert("Slider set: "+this.slider);
}

SliderWrapper.prototype.setFlightContent=function(aModel,aType)
{
	var theMaxPrice = aModel.getHighestPrice();
	//alert("Max Price Received: "+theMaxPrice);
	if(theMaxPrice != null && theMaxPrice > 0)
	{
		theMaxPrice = new Number(theMaxPrice);
		theMaxPrice+=10;
		this.slider.n_maxValue=theMaxPrice.toString();
		//alert("Max Price set to "+theMaxPrice);
	}
	//else alert("Max Price not set to "+theMaxPrice);
}





//----------------------------------- Point ----------------------------------------

function Point(aWidth, aHeight)
{
  this.width=aWidth;
  this.height=aHeight;
}

Point.prototype.getWidth=function()
{
  return this.width;
}

Point.prototype.getHeight=function()
{
  return this.height;
}
// ----------------- Person counter ----------------------


function PersonCounter (aAdultField, aChildField, aKidsField)
{
 this.adults=document.getElementById(aAdultField);
 this.children=document.getElementById(aChildField);
 this.kidField=document.getElementById(aKidsField);
 this.listener = new Array();
 this.id = 'counter_'+aAdultField+'_';
 window[this.id]=this;
 this.addActions();
}

PersonCounter.prototype.valueChanged=function()
{
  var theAdult=this.adults.value;
  var theChild = this.children.value;
  var theKid = this.kidField.value;  
  var theEvent = new CountChangeEvent(theAdult, theChild, theKid);
  this.notifyListener(theEvent);
}

PersonCounter.prototype.addActions=function()
{
  
  var theHandler = this;
  this.adults.onkeyup =function()
  {
    theHandler.valueChanged();
  }
  this.children.onkeyup =function()
  {
    theHandler.valueChanged();
  }
  this.kidField.onkeyup =function()
  {
    theHandler.valueChanged();
  }
  return this;
}

PersonCounter.prototype.addCountListener=function(aListener)
{
  this.listener[this.listener.length]=aListener;
}

PersonCounter.prototype.notifyListener=function(anEvent)
{
  //alert("Count for person changed: "+anEvent.toString());
  for (var i=0; i<this.listener.length; i++)
  {
    this.listener[i].countChanged(anEvent);
  }
}


PersonCounter.prototype.addCountListener=function(aListener)
{
  this.listener[this.listener.length]=aListener;
}


function CountChangeEvent(aAdult, aChild, aKid)
{
  this.adults = aAdult;
  this.childs= aChild;
  this.kids= aKid;  
}

CountChangeEvent.prototype.getAdults=function()
{
  return this.adults;
}

CountChangeEvent.prototype.getChildren=function()
{
  return this.childs;
}

CountChangeEvent.prototype.getKids=function()
{
  return this.kids;
}

CountChangeEvent.prototype.toString=function()
{
  return 'CountChangeEvent: '+this.adults+' - '+this.childs+' - '+this.kids;
}
