from XPLMMenus import *
from XPLMNavigation import *
from XPWidgetDefs import *
from XPWidgets import *
from XPStandardWidgets import *
from XPLMProcessing import *
from XPLMDataAccess import *
from XPLMUtilities import *
from httplib import *
from xml.dom import minidom
from re import *
from math import *
import urllib2
import hashlib
import os
import sys
from urllib import urlopen



ACEngine=[]

class engine:
	def __init__(self,cht,runtime,chtDamage,mixDamage,engineNumber):
		self.defaultcht=cht
		self.runtime=runtime
		self.chtDamage=chtDamage
		self.mixtureDamage=mixDamage
		self.engineNumber=engineNumber
		self.numberOfEngines=XPLMGetDatai(XPLMFindDataRef("sim/aircraft/engine/acf_num_engines"))
	
	def clearEng(self):
		self.runtime=0
		self.chtDamage=0
		self.mixtureDamage=0
	
	def currentRPM(self):
		_currentRPM=[]
		XPLMGetDatavf(XPLMFindDataRef("sim/flightmodel/engine/ENGN_N2_"), _currentRPM, 0, self.numberOfEngines)
		return _currentRPM[self.engineNumber]
	
	def currentCHT(self):
		_currentCHT=[]
		XPLMGetDatavf(XPLMFindDataRef("sim/flightmodel/engine/ENGN_CHT_c"), _currentCHT, 0, self.numberOfEngines)
		return _currentCHT[self.engineNumber]
	
	def currentMIX(self):
		_currentMIX=[]
		XPLMGetDatavf(XPLMFindDataRef("sim/flightmodel/engine/ENGN_mixt"), _currentMIX, 0, self.numberOfEngines)
		return _currentMIX[self.engineNumber]*100
	
	def planeALT(self):
		_planeALT=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/position/y_agl"))
		return _planeALT*float(3.33)
	
	def feed(self,sec,rpm,mix,cht,altitude):
		if rpm>0:
			self.runtime+=sec
		if self.defaultcht>0:
			_diff=abs(cht-self.defaultcht)/float(sec)
			if _diff>0:
				self.chtDamage+=_diff
		self.defaultcht=cht
		if (mix > 95 and altitude > 1000):
			self.mixtureDamage += sec
	
	def getData(self):
		return "&mixture"+str(self.engineNumber+1)+"="+str(self.mixtureDamage)+"&heat"+str(self.engineNumber+1)+"="+str(self.chtDamage)+"&time"+str(self.engineNumber+1)+"="+str(self.runtime)
	

class PythonInterface:
    
	def XPluginStart(self):
		self.Name = "X-Economy"
		self.Sig =  "ksgy.Python.XFSEconomy"
		self.Desc = "X-Economy - plugin for FSEconomy (www.fseconomy.com)"
		self.VERSION="1.4.1"
		self.MenuItem1 = 0
		self.flying = 0
		self.flightTime = 0
		self.rentalTick = 0
		self.leaseTime = 0
		self.CurrentTimeCaption=""
		self.LeaseCaption = 0
		self.Arrived = 0
		self.CurrentAircraft=""
		self.isTacho = 0
		self.FuelTanks=[]
		self.stPayload=0
		self.stEq=0
		self.gsCheat=0
		self.globalX=0
		self.globalY=0
		self.checkfuel1=0
		self.checkfuel2=0
		self.checkfuel3=0
		Item = XPLMAppendMenuItem(XPLMFindPluginsMenu(), "X-Economy", 0, 1)
		self.XFSEMenuHandlerCB = self.XFSEMenuHandler
		self.Id = XPLMCreateMenu(self, "X-Economy" , XPLMFindPluginsMenu(), Item, self.XFSEMenuHandlerCB,	0)
		XPLMAppendMenuItem(self.Id, "Open X-Economy", 1, 1)
		exec(self.getACList())
		self.checkACStateCB = self.checkACState
		XPLMRegisterFlightLoopCallback(self, self.checkACStateCB, 1.0, 0)
		return self.Name, self.Sig, self.Desc

	def XPluginStop(self):
		if (self.MenuItem1 == 1):
			XPDestroyWidget(self, self.XFSEWidget, 1)
			self.MenuItem1 = 0

		XPLMDestroyMenu(self, self.Id)
		XPLMUnregisterFlightLoopCallback(self, self.checkACStateCB, 0)
		pass

	def XPluginEnable(self):
		return 1

	def XPluginDisable(self):
		pass

	def XPluginReceiveMessage(self, inFromWho, inMessage, inParam):
		pass

	def XFSEMenuHandler(self, inMenuRef, inItemRef):
		# If menu selected create our widget dialog
		if (inItemRef == 1):
			if (self.MenuItem1 == 0):
				self.CreateXFSEWidget(221, 640, 480, 490)
				self.MenuItem1 = 1
			else:
				if(not XPIsWidgetVisible(self.XFSEWidget)):
					XPShowWidget(self.XFSEWidget)
		pass
  
	def XFSEpost(self, query):
							
		f1 = open(os.path.join('Resources','plugins','PythonScripts','PI_xfse_141.py'), 'rb')
		filemd5sum = hashlib.md5(f1.read()).hexdigest()
		f1.close()
		stuff = urlopen('http://x-plane.indexf1.hu/xfse/x-economy.php?md5sum='+filemd5sum+'&'+query).read()
		dom = minidom.parseString(stuff)
		return dom
		pass

	def getACList(self):
		try:
			response = urllib2.urlopen('http://x-plane.indexf1.hu/xfse/aclist.txt')
			html = response.read()
			return html
		except URLError, e:
			print e.code
			print e.read()
		pass
	
	def checkACState(self, elapsedMe, elapsedSim, counter, refcon):
		_timecompression=XPLMGetDatai(XPLMFindDataRef("sim/time/sim_speed"))
		if _timecompression==0:
			_timecompression=1
		_groundcompression=XPLMGetDatai(XPLMFindDataRef("sim/time/ground_speed"))
		XPLMSetDatai(XPLMFindDataRef("sim/time/ground_speed"),1)
		_totalcompression=1/float(_timecompression)
		if self.flying==1:
			#fuel change check
			_fuel1=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel1"))
			_fuel2=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel2"))
			_fuel3=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel3"))
			
			if((_fuel1>self.checkfuel1 or _fuel2>self.checkfuel2 or _fuel3>self.checkfuel3) and self.checkfuel1 > 0):
			     self.cancelFlight("Fuel seem filling while you're flying, flight cancelled.","")
			
			self.checkfuel1=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel1"))
			self.checkfuel2=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel2"))
			self.checkfuel3=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel3"))
			
			if _groundcompression>1:
				self.gsCheat+=1
			
			if self.gsCheat>10:
				self.cancelFlight("You tried to use gound speed compression too much, but it's disabled.","Possibly it's a cheat, your flight was cancelled.")
			
			isBrake=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/controls/parkbrake"))
			airspeed=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/position/indicated_airspeed"))
			
			if XPLMGetDataf(XPLMFindDataRef("sim/time/total_flight_time_sec"))<float(5) and airspeed<float(10):
				self.cancelFlight("Aircraft changed or plane repositioned. Your flight was cancelled.","")

			# lease time calc
			if self.leaseTime>0: 
				self.leaseTime=int(self.leaseTime)-1
			if self.LeaseCaption:
				_leasehours=self.leaseTime/3600
				_leasemins=(self.leaseTime-_leasehours*3600)/60
				
				XPSetWidgetDescriptor(self.LeaseCaption, "Lease time left: "+str(_leasehours)+" hours "+str(_leasemins)+" mins" )
	
			# current flight time
			if((isBrake<float(1.0) and ACEngine[0].currentRPM()>float(10.0)) or (airspeed>30 and ACEngine[0].currentRPM()>float(10.0))):
				self.flightTime=int(self.flightTime)+1
				if self.CurrentTimeCaption:
					_currhours=self.flightTime/3600
					_currmins=(self.flightTime-_currhours*3600)/60
					XPSetWidgetDescriptor(self.CurrentTimeCaption, "Current flight time: "+str(_currhours)+" hours "+str(_currmins)+" mins")
				# engine feed only when flying: pre-heat recommended on ground
				for iengfeed in range(len(ACEngine)):
					#sec,rpm,mix,cht,altitude):
					ACEngine[iengfeed].feed(1,ACEngine[iengfeed].currentRPM(),ACEngine[iengfeed].currentMIX(),ACEngine[iengfeed].currentCHT(),ACEngine[iengfeed].planeALT())
					
			# arrive
			else:
				if(self.flightTime>60 and ACEngine[0].currentRPM()<float(5.0) and ACEngine[0].planeALT()<50):
					self.arrive()
			
			if self.isTacho==1:
				self.rentalTick+=(ACEngine[0].currentRPM()/float(3600.0))

			if(self.stEq=="0"):
				self.disableAP()
				self.disableGPS()
				self.disableIFR()
				
			if(self.stEq=="1"):
				self.disableAP()
				self.disableGPS()
				
			if(self.stEq=="2"):
				self.disableAP()
				self.disableIFR()
				
			if(self.stEq=="4"):
				self.disableGPS()
				self.disableIFR()
				
			if(self.stEq=="3"):
				self.disableAP()
				
			if(self.stEq=="5"):
				self.disableGPS()
				
			if(self.stEq=="6"):
				self.disableIFR()
			
			XPLMSetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fixed"),float(self.stPayload))

		return float(_totalcompression)
			
	def disableGPS(self):
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_gps"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_g_gps1"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_g_gps2"),6)
		pass
	
	def disableAP(self):
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_g_otto"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_otto"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_fdir"),6)
		pass
	
	def disableIFR(self):
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_g_gs1"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_g_gs2"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_g_navrad1"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_g_navrad2"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_gls"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_dme"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_adf1"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_adf2"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_nav1"),6)
		XPLMSetDatai(XPLMFindDataRef("sim/operation/failures/rel_nav2"),6)
		pass

	def arrive(self):
		if self.Arrived==0:
			self.Arrived=1
			if self.leaseTime>0:
				_PlaneLatdr = XPLMFindDataRef("sim/flightmodel/position/latitude")
				_PlaneLondr = XPLMFindDataRef("sim/flightmodel/position/longitude")
				_lat = XPLMGetDataf(_PlaneLatdr)
				_lon = XPLMGetDataf(_PlaneLondr)
				_fuel1=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel1"))
				_fuel2=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel2"))
				_fuel3=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel3"))
				_totalfuel=(_fuel1+_fuel2+_fuel3)/float(2.68735)
				_iFuel=0
				_actfueltanks=float(0)
				for _iFuel in range(len(self.FuelTanks)):
					if self.FuelTanks[_iFuel]==1:
						_actfueltanks=_actfueltanks+1
				_iFuel=0
				_fuelarray=[]
				_eachfuel=_totalfuel/float(_actfueltanks) # thx no2 jck :)
				for _iFuel in range(len(self.FuelTanks)):
					if self.FuelTanks[_iFuel]==0:
						_fuelarray.append(0)
					else:
						_fuelarray.append(_eachfuel)
				_c=_fuelarray[0]
				_lm=_fuelarray[1]
				_la=_fuelarray[2]
				_let=_fuelarray[3]
				_rm=_fuelarray[4]
				_ra=_fuelarray[5]
				_rt=_fuelarray[6]
				_c2=_fuelarray[7]
				_c3=_fuelarray[8]
				_x1=_fuelarray[9]
				_x2=_fuelarray[10]
				_engineStr=""
				for _ieng in range(len(ACEngine)):
					_engineStr=_engineStr+str(ACEngine[_ieng].getData())
				
				if self.isTacho==1:
					_finishflight=self.XFSEpost("user="+self.userstr+"&pass="+self.passstr+"&action=arrive&rentalTick="+str(int(self.rentalTick))+"&lat="+str(_lat)+"&lon="+str(_lon)+"&c="+str(_c)+"&lm="+str(_lm)+"&la="+str(_la)+"&let="+str(_let)+"&rm="+str(_rm)+"&ra="+str(_ra)+"&rt="+str(_rt)+"&c2="+str(_c2)+"&c3="+str(_c3)+"&x1="+str(_x1)+"&x2="+str(_x2)+_engineStr)
				else:
					_finishflight=self.XFSEpost("user="+self.userstr+"&pass="+self.passstr+"&action=arrive&rentalTime="+str(self.flightTime)+"&lat="+str(_lat)+"&lon="+str(_lon)+"&c="+str(_c)+"&lm="+str(_lm)+"&la="+str(_la)+"&let="+str(_let)+"&rm="+str(_rm)+"&ra="+str(_ra)+"&rt="+str(_rt)+"&c2="+str(_c2)+"&c3="+str(_c3)+"&x1="+str(_x1)+"&x2="+str(_x2)+_engineStr)
					
				if len(_finishflight.getElementsByTagName('result'))>0:
						_err=_finishflight.getElementsByTagName('result')[0].firstChild.data
						_errA=_err.split('|')
						for ierr in range(len(_errA)):
							if _errA[ierr]>80:
								_terrA=_errA[ierr].split('.')
								XPSetWidgetDescriptor(self.ErrorCaption[ierr], _terrA[0])
								XPSetWidgetDescriptor(self.ErrorCaption[ierr+1], _terrA[1].lstrip())
							else:
								XPSetWidgetDescriptor(self.ErrorCaption[ierr], _errA[ierr])
						
						XPSetWidgetProperty(self.StartFlyButton, xpProperty_Enabled, 1)
						XPSetWidgetProperty(self.CancelFlyButton, xpProperty_Enabled, 0)
				
			else:
				self.cancelFlight("Lease time is over. Your flight was cancelled, sorry, you have to re-fly this trip.","")
			self.flightTime=0
		pass
    
	def cancelFlight(self,message,message2):
		self.flying=0
		
		cancelflight=self.XFSEpost("user="+self.userstr+"&pass="+self.passstr+"&action=cancel")
		if (cancelflight.getElementsByTagName('response')[0].firstChild.nodeName=="ok"):
			XPSetWidgetProperty(self.StartFlyButton, xpProperty_Enabled, 1)
			XPSetWidgetProperty(self.CancelFlyButton, xpProperty_Enabled, 0)
			XPSetWidgetDescriptor(self.ErrorCaption[0], message)
			XPSetWidgetDescriptor(self.ErrorCaption[1], message2)

	def addAssignment(self,aIndex,aFrom,aTo,aCargo):
		_baseY1=(aIndex+1)*18+120
		_baseY2=(aIndex+1)*28+120
		oLeft=[]
		oTop=[]
		oRight=[]
		oBottom=[]
		XPGetWidgetGeometry(self.XFSEWidget,oLeft,oTop,oRight,oBottom)
		y=oTop[0]
		x=oLeft[0]
		_offset=10
		self.FromCaption.append(XPCreateWidget(x+20, 	y-_baseY1+_offset*aIndex, x+50, 	y-_baseY2+_offset*aIndex,1, "From: -", 0, self.XFSEWidget,xpWidgetClass_Caption))
		self.ToCaption.append(XPCreateWidget(x+140, 	y-_baseY1+_offset*aIndex, x+170, 	y-_baseY2+_offset*aIndex,1, "To: -", 0, self.XFSEWidget,xpWidgetClass_Caption))
		self.CargoCaption.append(XPCreateWidget(x+210, 	y-_baseY1+_offset*aIndex, x+240,	y-_baseY2+_offset*aIndex,1, "Cargo: -", 0, self.XFSEWidget,xpWidgetClass_Caption))
		XPSetWidgetDescriptor(self.FromCaption[aIndex], str(aFrom))
		XPSetWidgetDescriptor(self.ToCaption[aIndex], str(aTo))
		XPSetWidgetDescriptor(self.CargoCaption[aIndex], str(aCargo))
		
		if(aIndex>4):
			# set scrollbar
			XPSetWidgetProperty(self.XFSEScrollbar,xpProperty_ScrollBarMin, 0)
			XPSetWidgetProperty(self.XFSEScrollbar,xpProperty_ScrollBarMax, aIndex+1)
			XPSetWidgetProperty(self.XFSEScrollbar,xpProperty_ScrollBarSliderPosition, aIndex+1)
		
			#TODO hide the invisible assignemnts
			#XPHideWidget(self.CargoCaption[aIndex])
		#print self.FromCaption[aIndex]
    
	def CreateXFSEWidget(self, x, y, w, h):
		#read ini file
		try:
			_INIfile=open(os.path.join('Resources','plugins','PythonScripts','x-economy.ini'), 'r')
			_userINI=_INIfile.readline()
			_userINI=_userINI.replace('\n','')
			_passINI=_INIfile.readline()
			_INIfile.close()
		except IOError, (errno, strerror):
			_userINI=""
			_passINI=""
        
		self.globalX=x
		self.globalY=y
		x2 = x + w
		y2 = y - h
		Buffer = "X-Economy v"+str(self.VERSION)+" (V8 Final)"

		# Create the Main Widget window
		self.XFSEWidget = XPCreateWidget(x, y, x2, y2, 1, Buffer, 1,	0, xpWidgetClass_MainWindow)
		
		

		# Add Close Box decorations to the Main Widget
		XPSetWidgetProperty(self.XFSEWidget, xpProperty_MainWindowHasCloseBoxes, 1)

		# Create the Sub Widget1 window
		XFSEWindow1 = XPCreateWidget(x+10, y-30, x2-10, y2+200,
							1,		# Visible
							"",		# desc
							0,		# root
							self.XFSEWidget,
							xpWidgetClass_SubWindow)

		# Set the style to sub window
		XPSetWidgetProperty(XFSEWindow1, xpProperty_SubWindowType, xpSubWindowStyle_SubWindow)
		

		# Create the Sub Widget2 window
		XFSEWindow2 = XPCreateWidget(x+10, y-100, x2-10, y2+10,
							1,		# Visible
							"",		# desc
							0,		# root
							self.XFSEWidget,
							xpWidgetClass_SubWindow)

		# Set the style to sub window
		XPSetWidgetProperty(XFSEWindow2, xpProperty_SubWindowType, xpSubWindowStyle_SubWindow)

		XFSEWindow3 = XPCreateWidget(x+15, y-130, x2-35, y2+150,
							1,		# Visible
							"",		# desc
							0,		# root
							self.XFSEWidget,
							xpWidgetClass_SubWindow)

		# Set the style to sub window
		XPSetWidgetProperty(XFSEWindow2, xpProperty_SubWindowType, xpSubWindowStyle_SubWindow)

		# Login user caption
		LoginUserCaption = XPCreateWidget(x+20, y-40, x+50, y-60,1, "Username:", 0, self.XFSEWidget,xpWidgetClass_Caption)
			
		# Login user field
		self.LoginUserEdit = XPCreateWidget(x+80, y-40, x+160, y-60,1, _userINI, 0, self.XFSEWidget,xpWidgetClass_TextField)
		XPSetWidgetProperty(self.LoginUserEdit, xpProperty_TextFieldType, xpTextEntryField)
		XPSetWidgetProperty(self.LoginUserEdit, xpProperty_Enabled, 1)
		
		# Login pass caption
		LoginPassCaption = XPCreateWidget(x+20, y-60, x+50, y-80,1, "Password:", 0, self.XFSEWidget,xpWidgetClass_Caption)

		# Login user field
		self.LoginPassEdit = XPCreateWidget(x+80, y-60, x+160, y-80,1, _passINI, 0, self.XFSEWidget,xpWidgetClass_TextField)
		XPSetWidgetProperty(self.LoginPassEdit, xpProperty_TextFieldType, xpTextEntryField)
		XPSetWidgetProperty(self.LoginPassEdit, xpProperty_Enabled, 1)
		XPSetWidgetProperty(self.LoginPassEdit, xpProperty_PasswordMode, 1)

		# Login button
		self.LoginButton = XPCreateWidget(x+180, y-40, x+260, y-60,1, "Log in", 0, self.XFSEWidget,xpWidgetClass_Button)
		XPSetWidgetProperty(self.LoginButton, xpProperty_ButtonType, xpPushButton)

		# Server response text
		self.ServerResponseCaption = XPCreateWidget(x+180, y-60, x+260, y-80,1, "You're not logged in", 0, self.XFSEWidget,xpWidgetClass_Caption)

		# Assignments text
		self.AssignmentListCaption = XPCreateWidget(x+20, y-105, x+50, y-125,1, "Assignment info:", 0, self.XFSEWidget,xpWidgetClass_Caption)

		# Error text
		self.ErrorCaption=[]
		self.ErrorCaption.append(XPCreateWidget(x+20, y-410, x+50, y-430,1, "", 0, self.XFSEWidget,xpWidgetClass_Caption))
		# Error2 text
		self.ErrorCaption.append(XPCreateWidget(x+20, y-420, x+50, y-440,1, "", 0, self.XFSEWidget,xpWidgetClass_Caption))
		# Error3 text
		self.ErrorCaption.append(XPCreateWidget(x+20, y-430, x+50, y-450,1, "", 0, self.XFSEWidget,xpWidgetClass_Caption))

		# From
		self.FromCaption=[]
		#self.FromCaption.append(XPCreateWidget(x+20, y-120, x+50, y-140,1, "From: -", 0, self.XFSEWidget,xpWidgetClass_Caption))
		
		# To
		self.ToCaption=[]
		#self.ToCaption.append(XPCreateWidget(x+140, y-120, x+170, y-140,1, "To: -", 0, self.XFSEWidget,xpWidgetClass_Caption))

		# Cargo
		self.CargoCaption=[]
		#self.CargoCaption.append(XPCreateWidget(x+210, y-120, x+240, y-140,1, "Cargo: -", 0, self.XFSEWidget,xpWidgetClass_Caption))

		# Comment
		#self.CommentCaption=[]
		#self.CommentCaption.append(XPCreateWidget(x+20, y-140, x+50, y-160,1, "Comment: -", 0, self.XFSEWidget,xpWidgetClass_Caption))

		# AC reg
		self.ACRegCaption = XPCreateWidget(x+20, y-340, x+50, y-360,1, "Aircraft registration: -", 0, self.XFSEWidget,xpWidgetClass_Caption)

		# Lease expires
		self.LeaseCaption = XPCreateWidget(x+20, y-360, x+50, y-380,1, "Lease time: -", 0, self.XFSEWidget,xpWidgetClass_Caption)

		# Current flight time
		self.CurrentTimeCaption = XPCreateWidget(x+20, y-330, x+50, y-450,1, "Current flight time: -", 0, self.XFSEWidget,xpWidgetClass_Caption)

		# set up engines
		self.NumberOfEngines=XPLMGetDatai(XPLMFindDataRef("sim/aircraft/engine/acf_num_engines"))
		_OAT=XPLMGetDataf(XPLMFindDataRef("sim/weather/temperature_ambient_c"))
		
		for ieng in range(self.NumberOfEngines):
			ACEngine.append(engine(_OAT,0,0,0,ieng))
			#print ACEngine[ieng].currentRPM()

		# Start fly button
		self.StartFlyButton = XPCreateWidget(x+360, y-40, x+450, y-60,
						1, "Start flying", 0, self.XFSEWidget,
						xpWidgetClass_Button)
		XPSetWidgetProperty(self.StartFlyButton, xpProperty_ButtonType, xpPushButton)
		XPSetWidgetProperty(self.StartFlyButton, xpProperty_Enabled, 0)

		# cancel fly button
		self.CancelFlyButton = XPCreateWidget(x+360, y-60, x+450, y-80,
						1, "Cancel flight", 0, self.XFSEWidget,
						xpWidgetClass_Button)
		XPSetWidgetProperty(self.CancelFlyButton, xpProperty_ButtonType, xpPushButton)
		XPSetWidgetProperty(self.CancelFlyButton, xpProperty_Enabled, 0)

		# Register our widget handler
		self.XFSEHandlerCB = self.XFSEHandler
		XPAddWidgetCallback(self, self.XFSEWidget, self.XFSEHandlerCB)
		
		#scrollbar
		self.XFSEScrollbar = XPCreateWidget(x+445, y-130, x2-10, y2+150, 1, "", 0,	self.XFSEWidget, xpWidgetClass_ScrollBar)
		XPSetWidgetProperty(self.XFSEScrollbar,xpProperty_ScrollBarMin, 0)
		pass

        def XFSEHandler(self, inMessage, inWidget,    inParam1, inParam2):
			if (inMessage == xpMessage_CloseButtonPushed):
				if (self.MenuItem1 == 1):
					XPHideWidget(self.XFSEWidget)
					return 1
			
			if(inMessage == xpMsg_ScrollBarSliderPositionChanged):
				if (inParam1 == self.XFSEScrollbar):
					_max_assignment = int(XPGetWidgetProperty(self.XFSEScrollbar,xpProperty_ScrollBarMax,0))
					_scrpos = _max_assignment - int(XPGetWidgetProperty(self.XFSEScrollbar,xpProperty_ScrollBarSliderPosition,0))
					#print str(_scrpos)
					#TODO scrolling 
					
					#XPHideWidget(self.FromCaption[_scrpos])
					#print str(scrpos) + " ---"
					
				
			if (inMessage == xpMsg_PushButtonPressed):
				if (inParam1 == self.LoginButton):
					Buffer = []
					XPGetWidgetDescriptor(self.LoginUserEdit,Buffer,256)
					XPGetWidgetDescriptor(self.LoginPassEdit,Buffer,256)
					self.userstr=Buffer[0]
					self.passstr=Buffer[1]
					logincheck=self.XFSEpost("user="+self.userstr+"&pass="+self.passstr+"&action=accountCheck")
					
					if (logincheck.getElementsByTagName('response')[0].firstChild.nodeName=="ok"):
						XPSetWidgetDescriptor(self.ServerResponseCaption, "Logged in!")
						XPSetWidgetProperty(self.LoginButton, xpProperty_Enabled, 0)
						XPSetWidgetProperty(self.StartFlyButton, xpProperty_Enabled, 1)
					else:
						if(logincheck.getElementsByTagName('response')[0].firstChild.nodeName=="notok"):
							XPSetWidgetDescriptor(self.ServerResponseCaption, "New version available, see below...")
							XPSetWidgetDescriptor(self.ErrorCaption[0], "!!! New version is available: v"+str(logincheck.getElementsByTagName('notok')[0].firstChild.data))
							XPSetWidgetDescriptor(self.ErrorCaption[1], "!!! Please download the latest client from http://x-plane.indexf1.hu")

						else:
							XPSetWidgetDescriptor(self.ServerResponseCaption, "Invalid account!")
					
					logincheck.unlink()
					return 1

				if (inParam1 == self.StartFlyButton):
					_INIFileW=open(os.path.join('Resources','plugins','PythonScripts','x-economy.ini'), 'w')
					_INIFileW.write(self.userstr+'\n'+self.passstr)
					_INIFileW.close()
					ByteVals = []
					XPLMGetDatab(XPLMFindDataRef("sim/aircraft/view/acf_descrip"), ByteVals, 0, 500)
					_stmp1=ByteVals[0].replace(" ","")
					_stmp2=_stmp1.replace("-","")

					#destroy captions
					for idestroy in range(len(self.FromCaption)):
						XPDestroyWidget(self,self.FromCaption[idestroy],1)
						XPDestroyWidget(self,self.ToCaption[idestroy],1)
						XPDestroyWidget(self,self.CargoCaption[idestroy],1)

					self.FromCaption=[]
					self.ToCaption=[]
					self.CargoCaption=[]

					#print _stmp2
					for ACitem in range(len(self.ACList)):
						if _stmp2.find(self.RefACList[ACitem])>-1:
							self.CurrentAircraft=self.ACList[ACitem].replace(" ","%20")
					if self.CurrentAircraft=="":
						XPSetWidgetDescriptor(self.ErrorCaption[0], "Unknown aircraft: "+str(ByteVals[0])+". If you're sure this is an FSE compatible aircraft, please edit")
						XPSetWidgetDescriptor(self.ErrorCaption[1], "plane's description in Plane Maker, eg.: King Air B200. If you're not sure, or it's a new")
						XPSetWidgetDescriptor(self.ErrorCaption[2], "plane to FSE, plese email to templates@fseconomy.com including the plane specs.")
					else:
						PlaneLatdr = XPLMFindDataRef("sim/flightmodel/position/latitude")
						PlaneLondr = XPLMFindDataRef("sim/flightmodel/position/longitude")
						Lat = XPLMGetDataf(PlaneLatdr)
						Lon = XPLMGetDataf(PlaneLondr)
						startFlight=self.XFSEpost("user="+self.userstr+"&pass="+self.passstr+"&action=startFlight&lat="+str(Lat)+"&lon="+str(Lon)+"&aircraft="+self.CurrentAircraft)
						if startFlight.getElementsByTagName('response')[0].firstChild.nodeName=="error":
							#print startFlight.getElementsByTagName('error')[0].firstChild.data
							XPSetWidgetDescriptor(self.ErrorCaption[0], startFlight.getElementsByTagName('error')[0].firstChild.data)
							XPSetWidgetDescriptor(self.ErrorCaption[1], "")
							XPSetWidgetDescriptor(self.ErrorCaption[2], "")
						else:

							XPSetWidgetDescriptor(self.ErrorCaption[0], "")
							XPSetWidgetDescriptor(self.ErrorCaption[1], "")
							XPSetWidgetDescriptor(self.ErrorCaption[2], "")
							stFrom="-"
							stTo="-"
							stCargo="-"
							
							for iAssignment in range(len(startFlight.getElementsByTagName('assignment'))):
								self.addAssignment(iAssignment,str(startFlight.getElementsByTagName('from')[iAssignment].firstChild.data),str(startFlight.getElementsByTagName('to')[iAssignment].firstChild.data),str(startFlight.getElementsByTagName('cargo')[iAssignment].firstChild.data))
							
							"""
							if len(startFlight.getElementsByTagName('from'))>0:
								stFrom=startFlight.getElementsByTagName('from')[0].firstChild.data
							if len(startFlight.getElementsByTagName('to'))>0:
								stTo=startFlight.getElementsByTagName('to')[0].firstChild.data
							if len(startFlight.getElementsByTagName('cargo'))>0:
								stCargo=startFlight.getElementsByTagName('cargo')[0].firstChild.data
							"""

							Accounting=startFlight.getElementsByTagName('accounting')[0].firstChild.data
							if Accounting=="tacho":
								self.isTacho=1
							
							self.stEq=startFlight.getElementsByTagName('equipment')[0].firstChild.data
														
							if(self.stEq=="0"):
								stEquipment=" (VFR)"
							if(self.stEq=="1"):
								stEquipment=" (IFR)"
							if(self.stEq=="2"):
								stEquipment=" (GPS)"
							if(self.stEq=="4"):
								stEquipment=" (AP)"
							if(self.stEq=="3"):
								stEquipment=" (IFR, GPS)"
							if(self.stEq=="5"):
								stEquipment=" (AP, IFR)"
							if(self.stEq=="6"):
								stEquipment=" (AP, GPS)"
							if(self.stEq=="7"):
								stEquipment=" (IFR, AP, GPS)"
							
							stACReg=startFlight.getElementsByTagName('registration')[0].firstChild.data
							stLE=startFlight.getElementsByTagName('leaseExpires')[0].firstChild.data
							XPSetWidgetDescriptor(self.ACRegCaption, "Aircraft registration: "+str(stACReg)+str(stEquipment))
							self.leaseTime = 0
							self.leaseTime=int(stLE)
							XPSetWidgetDescriptor(self.LeaseCaption, "Lease time: "+str(int(stLE)/3600)+" hours")
							
							# set weight and fuel
							self.stPayload=startFlight.getElementsByTagName('payloadWeight')[0].firstChild.data
							stFuel=startFlight.getElementsByTagName('fuel')[0].firstChild.data
							XPLMSetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fixed"),float(self.stPayload))
							astFuel=stFuel.split(' ')
							self.FuelTanks=[]
							
							totalFuel=float(0)
							for iFuel in range(len(astFuel)-1):
								totalFuel+=float(astFuel[iFuel])
								
								if float(astFuel[iFuel])>float(0):
									self.FuelTanks.append(1)
								else:
									self.FuelTanks.append(0)
							
							currentFuel=totalFuel*float(2.68735)/float(2)
							XPLMSetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel1"),currentFuel)
							XPLMSetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel2"),currentFuel)
							XPLMSetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel3"),float(0))
							
							self.checkfuel1=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel1"))
							self.checkfuel2=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel2"))
							self.checkfuel3=XPLMGetDataf(XPLMFindDataRef("sim/flightmodel/weight/m_fuel3"))
							
							
							XPSetWidgetProperty(self.StartFlyButton, xpProperty_Enabled, 0)
							XPSetWidgetProperty(self.CancelFlyButton, xpProperty_Enabled, 1)
							
							self.Arrived=0
							self.flightTime = 0
							self.flying=1 # start flight query
							self.rentalTick = 0
							self.gsCheat = 0
							
							for iengclear in range(len(ACEngine)):
								ACEngine[iengclear].clearEng()
							
						startFlight.unlink()
						return 1
				
				if (inParam1 == self.CancelFlyButton):
					self.cancelFlight("Flight cancelled.","")
										
			return 0
	pass
