From b99193ba68f947802245a288940e54904ecbee61 Mon Sep 17 00:00:00 2001 From: Triatmoko Date: Fri, 18 Nov 2011 13:23:49 +0100 Subject: final version --- Code/Server-Code/ClientClass.py | 0 Code/Server-Code/ControllerClass.py | 59 +- Code/Server-Code/DbClass.py | 15 +- Code/Server-Code/GSMHandler.py | 103 +- Code/Server-Code/LogFileClass.py | 0 Code/Server-Code/PingClass.py | 0 Code/Server-Code/SIPHandler.py | 138 +- Code/Server-Code/SSHTunnelBoxClass.py | 0 Code/Server-Code/ServerClass.py | 0 Code/Server-Code/gsmselftest.py | 81 +- Code/Server-Code/handler.txt | 1 + Code/Server-Code/help.txt | 1 + Code/Server-Code/initTestClass.py | 3 + Code/Server-Code/startSoftware.py | 10 +- Code/Server-Code/truthtableClass.py | 80 +- Code/Server-Code/usbDetectClass.py | 0 Under-Testing/Box1-Code/GSMClass.py | 303 - Under-Testing/Box1-Code/LogFileClass.py | 21 - Under-Testing/Box1-Code/READ ME.txt | 19 - Under-Testing/Box1-Code/ServerClass.py | 162 - Under-Testing/Box1-Code/serverHandler.py | 341 -- Under-Testing/Box2-Code/GSMClass.py | 303 - Under-Testing/Box2-Code/LogFileClass.py | 21 - Under-Testing/Box2-Code/READ ME.txt | 20 - Under-Testing/Box2-Code/ServerClass.py | 162 - Under-Testing/Box2-Code/serverHandler.py | 344 -- Under-Testing/ReadMe.txt | 61 - Under-Testing/Server-Code-New/.DS_Store | Bin 6148 -> 0 bytes Under-Testing/Server-Code-New/._.DS_Store | Bin 4096 -> 0 bytes Under-Testing/Server-Code-New/._handler.txt | Bin 4096 -> 0 bytes Under-Testing/Server-Code-New/ClientClass.py | 123 - Under-Testing/Server-Code-New/ControllerClass.py | 361 -- Under-Testing/Server-Code-New/DbClass.py | 445 -- Under-Testing/Server-Code-New/GSMClass.py | 310 -- Under-Testing/Server-Code-New/GSMHandler.py | 372 -- Under-Testing/Server-Code-New/LogFileClass.py | 21 - Under-Testing/Server-Code-New/PingClass.py | 28 - Under-Testing/Server-Code-New/READ ME.txt | 55 - Under-Testing/Server-Code-New/SIPHandler.py | 272 - Under-Testing/Server-Code-New/SSHTunnelBoxClass.py | 44 - Under-Testing/Server-Code-New/ServerClass.py | 152 - Under-Testing/Server-Code-New/WebsiteCommClass.py | 162 - Under-Testing/Server-Code-New/gsmselftest.py | 795 --- Under-Testing/Server-Code-New/handler.txt | 1 - Under-Testing/Server-Code-New/help.txt | 18 - Under-Testing/Server-Code-New/initTestClass.py | 122 - Under-Testing/Server-Code-New/startSoftware.py | 21 - Under-Testing/Server-Code-New/truthtableClass.py | 233 - Under-Testing/Server-Code-New/usbDetectClass.py | 96 - Under-Testing/Website/Images/AutoIcon.png | Bin 6470 -> 0 bytes Under-Testing/Website/Images/BackGround.jpg | Bin 156368 -> 0 bytes Under-Testing/Website/Images/BackgroundLogin.png | Bin 88100 -> 0 bytes Under-Testing/Website/Images/CheckAllButton.png | Bin 5425 -> 0 bytes Under-Testing/Website/Images/ChooseIcon.png | Bin 12477 -> 0 bytes Under-Testing/Website/Images/GSMTestButton.png | Bin 5563 -> 0 bytes Under-Testing/Website/Images/ManualIcon.png | Bin 6787 -> 0 bytes Under-Testing/Website/Images/MobilePhone.png | Bin 45698 -> 0 bytes Under-Testing/Website/Images/MobilePhoneIcon.png | Bin 13814 -> 0 bytes Under-Testing/Website/Images/SIPTestButton.png | Bin 5300 -> 0 bytes Under-Testing/Website/Images/SmartIcon.png | Bin 11983 -> 0 bytes Under-Testing/Website/Images/SubmitButton.png | Bin 5364 -> 0 bytes Under-Testing/Website/Images/UncheckButton.png | Bin 5575 -> 0 bytes Under-Testing/Website/Images/border1.png | Bin 2950 -> 0 bytes Under-Testing/Website/TaskTest.html | 453 -- Under-Testing/Website/about.html | 49 - Under-Testing/Website/class/pBarcode128.class.php | 184 - Under-Testing/Website/class/pBarcode39.class.php | 200 - Under-Testing/Website/class/pBubble.class.php | 283 - Under-Testing/Website/class/pCache.class.php | 280 - Under-Testing/Website/class/pData.class.php | 723 --- Under-Testing/Website/class/pDraw.class.php | 5799 -------------------- Under-Testing/Website/class/pImage.class.php | 343 -- Under-Testing/Website/class/pIndicator.class.php | 241 - Under-Testing/Website/class/pPie.class.php | 1493 ----- Under-Testing/Website/class/pRadar.class.php | 669 --- Under-Testing/Website/class/pScatter.class.php | 954 ---- Under-Testing/Website/class/pSplit.class.php | 131 - Under-Testing/Website/class/pSpring.class.php | 868 --- Under-Testing/Website/class/pStock.class.php | 216 - Under-Testing/Website/class/pSurface.class.php | 315 -- Under-Testing/Website/css/Critical.png | Bin 4795 -> 0 bytes Under-Testing/Website/css/Help.png | Bin 4907 -> 0 bytes Under-Testing/Website/css/Info.png | Bin 4600 -> 0 bytes Under-Testing/Website/css/Warning.png | Bin 3467 -> 0 bytes Under-Testing/Website/css/chk_off.png | Bin 655 -> 0 bytes Under-Testing/Website/css/chk_on.png | Bin 537 -> 0 bytes Under-Testing/Website/css/formCSS.css | 46 - Under-Testing/Website/css/info_rhombus.png | Bin 1816 -> 0 bytes Under-Testing/Website/css/information.png | Bin 2112 -> 0 bytes Under-Testing/Website/css/link.gif | Bin 836 -> 0 bytes Under-Testing/Website/css/tableCSS.css | 147 - Under-Testing/Website/css/tooltip.css | 33 - Under-Testing/Website/css/visitedLink.gif | Bin 838 -> 0 bytes Under-Testing/Website/delayedLoading.js | 228 - Under-Testing/Website/devconf.php | 130 - Under-Testing/Website/devconfig.php | 67 - Under-Testing/Website/devconfigAuto.php | 66 - Under-Testing/Website/devconfigManual.php | 56 - Under-Testing/Website/fonts/Bedizen.ttf | Bin 42912 -> 0 bytes Under-Testing/Website/fonts/Forgotte.ttf | Bin 42148 -> 0 bytes Under-Testing/Website/fonts/GeosansLight.ttf | Bin 60072 -> 0 bytes Under-Testing/Website/fonts/MankSans.ttf | Bin 58492 -> 0 bytes Under-Testing/Website/fonts/Silkscreen.ttf | Bin 16172 -> 0 bytes Under-Testing/Website/fonts/advent_light.ttf | Bin 45768 -> 0 bytes Under-Testing/Website/fonts/calibri.ttf | Bin 811052 -> 0 bytes Under-Testing/Website/fonts/pf_arma_five.ttf | Bin 21936 -> 0 bytes Under-Testing/Website/fonts/verdana.ttf | Bin 189144 -> 0 bytes Under-Testing/Website/icons/blackberry_dunno.png | Bin 1922 -> 0 bytes Under-Testing/Website/icons/blackberry_fail.png | Bin 1954 -> 0 bytes Under-Testing/Website/icons/blackberry_work.png | Bin 1988 -> 0 bytes Under-Testing/Website/icons/box_dunno.png | Bin 1255 -> 0 bytes Under-Testing/Website/icons/box_fail.png | Bin 1407 -> 0 bytes Under-Testing/Website/icons/box_work.png | Bin 1420 -> 0 bytes Under-Testing/Website/icons/server_dunno.png | Bin 1410 -> 0 bytes Under-Testing/Website/icons/server_fail.png | Bin 1497 -> 0 bytes Under-Testing/Website/icons/server_work.png | Bin 1480 -> 0 bytes Under-Testing/Website/icons/sip_dunno.png | Bin 1494 -> 0 bytes Under-Testing/Website/icons/sip_fail.png | Bin 1621 -> 0 bytes Under-Testing/Website/icons/sip_work.png | Bin 1591 -> 0 bytes Under-Testing/Website/icons/telephone_dunno.png | Bin 1798 -> 0 bytes Under-Testing/Website/icons/telephone_fail.png | Bin 1871 -> 0 bytes Under-Testing/Website/icons/telephone_work.png | Bin 1883 -> 0 bytes Under-Testing/Website/icons/uni-network_dunno.png | Bin 3126 -> 0 bytes Under-Testing/Website/icons/uni-network_fail.png | Bin 3202 -> 0 bytes Under-Testing/Website/icons/uni-network_work.png | Bin 3198 -> 0 bytes Under-Testing/Website/index.php | 49 - Under-Testing/Website/insertData.php | 69 - Under-Testing/Website/insertdevice.php | 28 - Under-Testing/Website/loader.gif | Bin 10819 -> 0 bytes Under-Testing/Website/main.php | 63 - Under-Testing/Website/mutexFunctions.php | 36 - Under-Testing/Website/mutexSmartTest.php | 1012 ---- Under-Testing/Website/mutexTry.php | 995 ---- Under-Testing/Website/networkResult.php | 309 -- Under-Testing/Website/post.php | 516 -- Under-Testing/Website/report.pdf | Bin 5056503 -> 0 bytes Under-Testing/Website/testCase.php | 244 - Under-Testing/Website/wait.gif | Bin 2545 -> 0 bytes Website/mutexSmartTest.php | 92 +- Website/mutexSmartTest.php_old | 951 ---- Website/mutexTry.php | 436 +- Website/mutexTry.php_old | 966 ---- 142 files changed, 636 insertions(+), 24983 deletions(-) mode change 100755 => 100644 Code/Server-Code/ClientClass.py mode change 100755 => 100644 Code/Server-Code/ControllerClass.py mode change 100755 => 100644 Code/Server-Code/DbClass.py mode change 100755 => 100644 Code/Server-Code/LogFileClass.py mode change 100755 => 100644 Code/Server-Code/PingClass.py mode change 100755 => 100644 Code/Server-Code/SIPHandler.py mode change 100755 => 100644 Code/Server-Code/SSHTunnelBoxClass.py mode change 100755 => 100644 Code/Server-Code/ServerClass.py mode change 100755 => 100644 Code/Server-Code/gsmselftest.py create mode 100644 Code/Server-Code/handler.txt mode change 100755 => 100644 Code/Server-Code/help.txt mode change 100755 => 100644 Code/Server-Code/initTestClass.py mode change 100755 => 100644 Code/Server-Code/startSoftware.py mode change 100755 => 100644 Code/Server-Code/truthtableClass.py mode change 100755 => 100644 Code/Server-Code/usbDetectClass.py delete mode 100644 Under-Testing/Box1-Code/GSMClass.py delete mode 100644 Under-Testing/Box1-Code/LogFileClass.py delete mode 100644 Under-Testing/Box1-Code/READ ME.txt delete mode 100644 Under-Testing/Box1-Code/ServerClass.py delete mode 100644 Under-Testing/Box1-Code/serverHandler.py delete mode 100644 Under-Testing/Box2-Code/GSMClass.py delete mode 100644 Under-Testing/Box2-Code/LogFileClass.py delete mode 100644 Under-Testing/Box2-Code/READ ME.txt delete mode 100644 Under-Testing/Box2-Code/ServerClass.py delete mode 100644 Under-Testing/Box2-Code/serverHandler.py delete mode 100644 Under-Testing/ReadMe.txt delete mode 100644 Under-Testing/Server-Code-New/.DS_Store delete mode 100644 Under-Testing/Server-Code-New/._.DS_Store delete mode 100644 Under-Testing/Server-Code-New/._handler.txt delete mode 100644 Under-Testing/Server-Code-New/ClientClass.py delete mode 100644 Under-Testing/Server-Code-New/ControllerClass.py delete mode 100644 Under-Testing/Server-Code-New/DbClass.py delete mode 100644 Under-Testing/Server-Code-New/GSMClass.py delete mode 100644 Under-Testing/Server-Code-New/GSMHandler.py delete mode 100644 Under-Testing/Server-Code-New/LogFileClass.py delete mode 100644 Under-Testing/Server-Code-New/PingClass.py delete mode 100644 Under-Testing/Server-Code-New/READ ME.txt delete mode 100644 Under-Testing/Server-Code-New/SIPHandler.py delete mode 100644 Under-Testing/Server-Code-New/SSHTunnelBoxClass.py delete mode 100644 Under-Testing/Server-Code-New/ServerClass.py delete mode 100644 Under-Testing/Server-Code-New/WebsiteCommClass.py delete mode 100644 Under-Testing/Server-Code-New/gsmselftest.py delete mode 100644 Under-Testing/Server-Code-New/handler.txt delete mode 100644 Under-Testing/Server-Code-New/help.txt delete mode 100644 Under-Testing/Server-Code-New/initTestClass.py delete mode 100644 Under-Testing/Server-Code-New/startSoftware.py delete mode 100644 Under-Testing/Server-Code-New/truthtableClass.py delete mode 100644 Under-Testing/Server-Code-New/usbDetectClass.py delete mode 100644 Under-Testing/Website/Images/AutoIcon.png delete mode 100644 Under-Testing/Website/Images/BackGround.jpg delete mode 100644 Under-Testing/Website/Images/BackgroundLogin.png delete mode 100644 Under-Testing/Website/Images/CheckAllButton.png delete mode 100644 Under-Testing/Website/Images/ChooseIcon.png delete mode 100644 Under-Testing/Website/Images/GSMTestButton.png delete mode 100644 Under-Testing/Website/Images/ManualIcon.png delete mode 100644 Under-Testing/Website/Images/MobilePhone.png delete mode 100644 Under-Testing/Website/Images/MobilePhoneIcon.png delete mode 100644 Under-Testing/Website/Images/SIPTestButton.png delete mode 100644 Under-Testing/Website/Images/SmartIcon.png delete mode 100644 Under-Testing/Website/Images/SubmitButton.png delete mode 100644 Under-Testing/Website/Images/UncheckButton.png delete mode 100644 Under-Testing/Website/Images/border1.png delete mode 100644 Under-Testing/Website/TaskTest.html delete mode 100644 Under-Testing/Website/about.html delete mode 100644 Under-Testing/Website/class/pBarcode128.class.php delete mode 100644 Under-Testing/Website/class/pBarcode39.class.php delete mode 100644 Under-Testing/Website/class/pBubble.class.php delete mode 100644 Under-Testing/Website/class/pCache.class.php delete mode 100644 Under-Testing/Website/class/pData.class.php delete mode 100644 Under-Testing/Website/class/pDraw.class.php delete mode 100644 Under-Testing/Website/class/pImage.class.php delete mode 100644 Under-Testing/Website/class/pIndicator.class.php delete mode 100644 Under-Testing/Website/class/pPie.class.php delete mode 100644 Under-Testing/Website/class/pRadar.class.php delete mode 100644 Under-Testing/Website/class/pScatter.class.php delete mode 100644 Under-Testing/Website/class/pSplit.class.php delete mode 100644 Under-Testing/Website/class/pSpring.class.php delete mode 100644 Under-Testing/Website/class/pStock.class.php delete mode 100644 Under-Testing/Website/class/pSurface.class.php delete mode 100644 Under-Testing/Website/css/Critical.png delete mode 100644 Under-Testing/Website/css/Help.png delete mode 100644 Under-Testing/Website/css/Info.png delete mode 100644 Under-Testing/Website/css/Warning.png delete mode 100755 Under-Testing/Website/css/chk_off.png delete mode 100755 Under-Testing/Website/css/chk_on.png delete mode 100644 Under-Testing/Website/css/formCSS.css delete mode 100644 Under-Testing/Website/css/info_rhombus.png delete mode 100644 Under-Testing/Website/css/information.png delete mode 100644 Under-Testing/Website/css/link.gif delete mode 100644 Under-Testing/Website/css/tableCSS.css delete mode 100644 Under-Testing/Website/css/tooltip.css delete mode 100644 Under-Testing/Website/css/visitedLink.gif delete mode 100644 Under-Testing/Website/delayedLoading.js delete mode 100644 Under-Testing/Website/devconf.php delete mode 100644 Under-Testing/Website/devconfig.php delete mode 100644 Under-Testing/Website/devconfigAuto.php delete mode 100644 Under-Testing/Website/devconfigManual.php delete mode 100644 Under-Testing/Website/fonts/Bedizen.ttf delete mode 100644 Under-Testing/Website/fonts/Forgotte.ttf delete mode 100644 Under-Testing/Website/fonts/GeosansLight.ttf delete mode 100644 Under-Testing/Website/fonts/MankSans.ttf delete mode 100644 Under-Testing/Website/fonts/Silkscreen.ttf delete mode 100644 Under-Testing/Website/fonts/advent_light.ttf delete mode 100644 Under-Testing/Website/fonts/calibri.ttf delete mode 100644 Under-Testing/Website/fonts/pf_arma_five.ttf delete mode 100644 Under-Testing/Website/fonts/verdana.ttf delete mode 100644 Under-Testing/Website/icons/blackberry_dunno.png delete mode 100644 Under-Testing/Website/icons/blackberry_fail.png delete mode 100644 Under-Testing/Website/icons/blackberry_work.png delete mode 100644 Under-Testing/Website/icons/box_dunno.png delete mode 100644 Under-Testing/Website/icons/box_fail.png delete mode 100644 Under-Testing/Website/icons/box_work.png delete mode 100644 Under-Testing/Website/icons/server_dunno.png delete mode 100644 Under-Testing/Website/icons/server_fail.png delete mode 100644 Under-Testing/Website/icons/server_work.png delete mode 100644 Under-Testing/Website/icons/sip_dunno.png delete mode 100644 Under-Testing/Website/icons/sip_fail.png delete mode 100644 Under-Testing/Website/icons/sip_work.png delete mode 100644 Under-Testing/Website/icons/telephone_dunno.png delete mode 100644 Under-Testing/Website/icons/telephone_fail.png delete mode 100644 Under-Testing/Website/icons/telephone_work.png delete mode 100644 Under-Testing/Website/icons/uni-network_dunno.png delete mode 100644 Under-Testing/Website/icons/uni-network_fail.png delete mode 100644 Under-Testing/Website/icons/uni-network_work.png delete mode 100644 Under-Testing/Website/index.php delete mode 100644 Under-Testing/Website/insertData.php delete mode 100644 Under-Testing/Website/insertdevice.php delete mode 100644 Under-Testing/Website/loader.gif delete mode 100644 Under-Testing/Website/main.php delete mode 100644 Under-Testing/Website/mutexFunctions.php delete mode 100644 Under-Testing/Website/mutexSmartTest.php delete mode 100644 Under-Testing/Website/mutexTry.php delete mode 100644 Under-Testing/Website/networkResult.php delete mode 100644 Under-Testing/Website/post.php delete mode 100644 Under-Testing/Website/report.pdf delete mode 100644 Under-Testing/Website/testCase.php delete mode 100644 Under-Testing/Website/wait.gif delete mode 100644 Website/mutexSmartTest.php_old delete mode 100755 Website/mutexTry.php_old diff --git a/Code/Server-Code/ClientClass.py b/Code/Server-Code/ClientClass.py old mode 100755 new mode 100644 diff --git a/Code/Server-Code/ControllerClass.py b/Code/Server-Code/ControllerClass.py old mode 100755 new mode 100644 index 4f4cef5..4ed0d9d --- a/Code/Server-Code/ControllerClass.py +++ b/Code/Server-Code/ControllerClass.py @@ -4,6 +4,7 @@ import subprocess import SSHTunnelBoxClass import ClientClass import random +import csv import LogFileClass logger = LogFileClass.Logging('TestProcessLog.log') @@ -46,6 +47,7 @@ class controller: sleep(2) self.callerGreeting() + logger.logEvent('Status Handler Connection :'+self.connected) if self.connected == 'OK': self.caller.sendData('CALLER|'+self.destNo) @@ -65,8 +67,9 @@ class controller: else: #waiting 2 seconds if doesnt use ssh connection until handler ready sleep(2) - self.receiverGreeting() - + self.receiverGreeting() + + logger.logEvent('Status Handler Connection :'+self.connected) if self.connected == 'OK': self.receiver.sendData('RECEIVER') @@ -105,7 +108,6 @@ class controller: self.caller.sendData('TERMINATE CONNECTION') self.caller.closeConnection() - self.initCancelTest() #can connect to handler but device caller not ready to do the test. elif self.connected == 'DEVICE NOT READY': @@ -118,6 +120,14 @@ class controller: self.testResult = 999 logger.logEvent('999 General Handler Error: Could not connect to Caller handler') + def writeToFile(self, AccountInfo): + try: + with open('handler.txt', 'w') as F: + writer = csv.writer(F) + writer.writerow([AccountInfo]) + F.close() + except ValueError: + print "can't write to file" def initCancelTest(self): #close SSH connection when using gsmBox and destination doesnt respond. to make sure SSH connection are terminate @@ -134,16 +144,19 @@ class controller: self.resultCaller = self.caller.receiveData(20) #print 'result '+self.resultCaller+'--'+self.resultDest if self.resultCaller == 'DEVICE NOT READY': + logger.logEvent('Task :'+self.callFrom+' - '+self.dest) logger.logEvent('Caller DEVICE NOT READY') self.testResult = 801 self.initTerminate() elif self.dest == 'DEVICE NOT READY': + logger.logEvent('Task :'+self.callFrom+' - '+self.dest) logger.logEvent('Caller DEVICE NOT READY') self.testResult = 802 self.initTerminate() elif self.resultCaller == 'CALL OK' and self.resultDest =='CALL OK': + logger.logEvent('Task :'+self.callFrom+' - '+self.dest) logger.logEvent('Test Succeed') self.testResult = 200 self.initTerminate() @@ -151,17 +164,20 @@ class controller: #build specially only for Eplus card. since they use prepaid card. if self.dest == 'GSMExt.Eplus': if self.resultCaller == 'CALL OK' and self.resultDest <> 'TIME OUT': + logger.logEvent('Task :'+self.callFrom+' - '+self.dest) logger.logEvent('Test Failed - Eplus No credit on Eplus') self.testResult = 402 self.initTerminate() else: logger.logEvent('Test Failed') + logger.logEvent('Task :'+self.callFrom+' - '+self.dest) self.testResult = 486 self.initTerminate() else: #one or both of the handler send un success test. assign failed to this test if self.resultCaller <> 'CALL OK' or self.resultDest <> 'CALL OK': + logger.logEvent('Task :'+self.callFrom+' - '+self.dest) logger.logEvent('Test Failed') self.testResult = 486 self.initTerminate() @@ -172,7 +188,7 @@ class controller: self.receiver.sendData('RECEIVE START') self.caller.sendData('CALL START') - def initAccount(self, account): + def initAccount(self, account, handler, PortName, portCom): accConf = account self.username = accConf[0:accConf.find(':')] @@ -183,6 +199,9 @@ class controller: newLine = line[line.find(':')+1:] self.server = newLine[0:newLine.find(':')] + textFile = 'Account:'+str(self.username)+':'+str(self.password)+':'+str(self.server)+':'+str(handler)+':'+str(PortName)+':'+str(portCom) + self.writeToFile(textFile) + # define the caller configuration such as port name and port caller. def initCaller(self): logger.logEvent('init Caller') @@ -191,12 +210,15 @@ class controller: if self.callFrom[0:4] == 'GSMR': if self.callFrom =="GSMRZ1": + self.initAccount(self.accCaller,self.callFrom, self.callPortName,self.portCaller) self.initGSM(self.portCaller, self.callPortName, self.callFrom) else: - self.initAccount(self.accCaller) + self.initAccount(self.accCaller, self.callFrom, self.callPortName,self.portCaller) #open SSH tunneling + self.boxCaller = SSHTunnelBoxClass.SSHTunneling(self.portCaller, 50008, self.server, self.username, self.password) status = self.boxCaller.startTunneling() + logger.logEvent('SSH Status :'+str(status)) #check whether the SSH tunneling succes or not, 0 is failed! if status!= 0: @@ -204,11 +226,14 @@ class controller: else: self.continues = 0 elif self.callFrom[0:4] == 'GSME': + self.initAccount(self.accCaller,self.callFrom, self.callPortName,self.portCaller) self.initGSM(self.portCaller, self.callPortName, self.callFrom) else: #open the SIP handler - subprocess.Popen(args=["gnome-terminal", '--command=python SIPHandler.py '+self.accCaller+ ' ' +str(self.portCaller)]) + self.initAccount(self.accCaller,self.callFrom, self.callPortName,self.portCaller) + script = 'SIPHandler.py' + subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # define the destination configuration such as port name and port caller. def initReceiver(self): @@ -218,25 +243,31 @@ class controller: if self.dest[0:4] == 'GSMR': if self.dest =="GSMRZ1": + self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) self.initGSM(self.portDest, self.destPortName, self.dest) else: - self.initAccount(self.accDest) + self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) #open SSH tunneling + self.boxDest = SSHTunnelBoxClass.SSHTunneling(self.portDest, 50008, self.server, self.username, self.password) status = self.boxDest.startTunneling() #check whether the SSH tunneling succes or not, 0 is failed! + logger.logEvent('SSH Status :'+str(status)) if status!= 0: self.continues = 1 else: self.continues = 0 elif self.dest[0:4] == 'GSME': - self.initGSM(self.portDest, self.destPortName, self.dest) + self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) + self.initGSM(self.portDest, self.destPortName, self.dest) else: - self.portDest = 50100 - subprocess.Popen(args=['gnome-terminal', '--command=python SIPHandler.py '+self.accDest+ ' ' +str(self.portDest)]) + #self.portDest = 50100 + self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) + script = 'SIPHandler.py' + subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # send terminate message to Handlers def initTerminate(self): @@ -263,7 +294,7 @@ class controller: #open connection to the Handler self.caller = ClientClass.Connection('localhost',self.portCaller) self.caller.connect() - + if self.caller.connected == 1: #connection establish and send hallo message to handler logger.logEvent('Connected to Caller Handler') @@ -290,10 +321,11 @@ class controller: def receiverGreeting(self): # send greeting message to the destination handler logger.logEvent('Receiver Greeting') self.connected = None + #open connection to the Handler self.receiver = ClientClass.Connection('localhost', self.portDest) self.receiver.connect() - + if self.receiver.connected == 1: #connection establish and send hallo message to handler logger.logEvent('Connected to Receiver Handler') @@ -321,7 +353,8 @@ class controller: def initGSM(self, portCommunication, portDevice, handler): #open GSM Handler logger.logEvent('Init GSM') - subprocess.Popen(args=["gnome-terminal", '--command=python GSMHandler.py '+str(portCommunication)+ ' ' +str(portDevice)+' '+str(handler)]) + script = 'GSMHandler.py' + subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) diff --git a/Code/Server-Code/DbClass.py b/Code/Server-Code/DbClass.py old mode 100755 new mode 100644 index a53987f..d937eb1 --- a/Code/Server-Code/DbClass.py +++ b/Code/Server-Code/DbClass.py @@ -4,8 +4,8 @@ import string class DBMySQLConnection: def __init__(self): #initialize at the start all the user parameters - self.usern = "selftest" - self.passw = "selftest" + self.usern = "root" + self.passw = "" self.host = "localhost" self.db = "gsmselftesting" self.connectionCreated = 0 @@ -19,7 +19,7 @@ class DBMySQLConnection: def connectDB(self): try: - #try the connection + #try to connect self.datBaseConn=MySQLdb.connect(self.host,self.usern, self.passw,self.db) self.datBaseConn.paramstyle = 'format' self.cur = self.datBaseConn.cursor() #make the cursor, used for sending queries @@ -115,7 +115,7 @@ class DBMySQLConnection: return 2 #the table doesn't exist if debugMode == 1: print str(e) - return 3 #some error happened 07667929147--Fitri + return 3 #some error happened else: return 0 #I am not connected def deviceList(self): # taking all device list and put it in the list @@ -171,6 +171,13 @@ class DBMySQLConnection: def updateGSMDevice(self, deviceName, newPortName, newNumber): if self.connectionCreated == 1: try: + try: + #delete old device portName which assign to this port, to prevent double port address in the table. + stmt = "UPDATE DeviceAddressTable SET portName = 'missing' WHERE portName = '"+newPortName+"'" + self.cur.execute(stmt) + except ValueError: + print "Error execute query" + stmt = "UPDATE DeviceAddressTable SET portName = '"+ newPortName + "', number = '"+ newNumber+ "' WHERE deviceName = '" + deviceName+ "'" self.cur.execute(stmt) return 1 diff --git a/Code/Server-Code/GSMHandler.py b/Code/Server-Code/GSMHandler.py index cf9a2b4..1379fe9 100644 --- a/Code/Server-Code/GSMHandler.py +++ b/Code/Server-Code/GSMHandler.py @@ -4,34 +4,55 @@ import LogFileClass from time import sleep import sys import setproctitle - +import csv +global sipServer, username, password, handler global portListen global portAddress - - -if len(sys.argv) <> 4: - print "Error given command" - sys.exit(2) - - -handler = sys.argv[3] -portAddress = sys.argv[2] -portListen = int(sys.argv[1]) +global nameOfLogFile def initLogfile(): global nameOfLogFile nameOfLogFile = str(handler)+' handler.log' +def writeToFile(): + try: + string = '--' + with open('handler.txt', 'w') as F: + writer = csv.writer(F) + writer.writerow([string]) + F.close() + except ValueError: + print "can't write to file" + +def openFile(): + global sipServer, username, password, handler + global portListen + global portAddress + + #String format: 'Account:username:password:server:handler:PortName:portCaller + File = open('handler.txt') + reader = csv.reader(File, delimiter=':') + for row in reader: + if str(row[0]) == 'Account': + handler = str(row[4]) + portAddress = str(row[5]) + portListen = int(row[6]) + File.close() + writeToFile() + baudRate = 19200 +#Taking account information +openFile() + +#start Logging initLogfile() logger = LogFileClass.Logging(nameOfLogFile) +logger.logEvent('') errorCount = 0 -logger.logEvent('') - whileCounter =0 #define global varibales @@ -42,8 +63,10 @@ lastState = 0 resetState = 0 deviceError = 0 + + def initSystem(): - print 'init system' + global handlerSocket global gsmDevice @@ -58,20 +81,23 @@ def initSystem(): lastState = 0 #variable used to know numberToCall = '000' #number to call resetState = 0 - + handlerSocket = ServerClass.ServerHandler(portListen) logger.logEvent('LISTEN ON PORT: '+str(portListen)) anyConnection = handlerSocket.openSocket() - #add this if you need it - gsmDevice = GSMClass.serialPort(portAddress, baudRate, 15) - initDevice = gsmDevice.portInit(5) + + try : + logger.logEvent('Trying connect to the device') + gsmDevice = GSMClass.serialPort(portAddress, baudRate, 15) + initDevice = gsmDevice.portInit(5) + logger.logEvent('init device ' + str(initDevice)) + + except ValueError: + logger.logEvent('Failure when trying connect to device') + ######################################################## - #add nice formating to the log file :) - print 'any connection ' + str(anyConnection) - print 'initDevice ' + str(initDevice) - if initDevice!= 1: deviceError = 1 else: @@ -82,7 +108,7 @@ def initSystem(): logger.logEvent('CONNECTION ESTABLISHED AND DEVICE WORKING: ' + str(handlerSocket.connectedTo())) return 1 - elif anyConnection == 1 and initDevice != 0: + elif anyConnection == 1 and initDevice != 1: logger.logEvent('$connection established but device not working: ' + str(handlerSocket.connectedTo())) resetState = 1 return 2 @@ -90,7 +116,10 @@ def initSystem(): logger.logEvent('$no connection') logger.logEvent('$else case in init system' + str(anyConnection) + ' ' + str(initDevice) + ' ') resetState = 1 - return 0 + + return 0 + + def receiveMessage(timeout): @@ -221,12 +250,10 @@ def receiveStart(): callSuccess = 'CALL OK' else: callSuccess = 'CALL NOT OK' - - - - sendMessage = handlerSocket.sendData(callSuccess) if deviceError==0: - tryHangUp = gsmDevice.hangUp() + tryHangUp = gsmDevice.hangUp() + sendMessage = handlerSocket.sendData(callSuccess) + return sendMessage ############################ @@ -280,10 +307,12 @@ def callStart(numberToCall): else: callSuccess = 'CALL NOT OK' - handResponse = handlerSocket.sendData(callSuccess) - if deviceError==0: - tryHangUp = gsmDevice.hangUp() + try: + tryHangUp = gsmDevice.hangUp() + except ValueError: + print 'Error when try hangup the call' + handResponse = handlerSocket.sendData(callSuccess) return handResponse ######################### @@ -313,7 +342,7 @@ def other(): setproctitle.setproctitle('GSM Handler') -while 1: +try: test = initSystem() if test == 1: @@ -328,10 +357,16 @@ while 1: print 'initialized system but device not working' logger.logEvent('initialized system but device not working') handlerSocket.sendData('DEVICE NOT READY') + elif test ==0: print 'nobody can connect, reboot board, restart cellphone' logger.logEvent('nobody can connect, reboot board, restart cellphone') - + + logger.closeLogging() del handlerSocket del gsmDevice +except ValueError: + logger.logEvent('Could not start the handler') + logger.closeLogging() + diff --git a/Code/Server-Code/LogFileClass.py b/Code/Server-Code/LogFileClass.py old mode 100755 new mode 100644 diff --git a/Code/Server-Code/PingClass.py b/Code/Server-Code/PingClass.py old mode 100755 new mode 100644 diff --git a/Code/Server-Code/SIPHandler.py b/Code/Server-Code/SIPHandler.py old mode 100755 new mode 100644 index e446e1a..eb5302c --- a/Code/Server-Code/SIPHandler.py +++ b/Code/Server-Code/SIPHandler.py @@ -5,6 +5,7 @@ import ServerClass import LogFileClass import setproctitle from time import sleep +import csv def log_cb(level, str, len): @@ -13,23 +14,22 @@ def log_cb(level, str, len): # Receive events from incoming Call class Account(pj.AccountCallback): + def __init__(self, account=None): + pj.AccountCallback.__init__(self, account) + def on_incoming_call(self, call): global current_call - print 'Incoming Call' + #print 'Incoming Call' current_call = call call_cb = Calling(current_call) current_call.set_callback(call_cb) - logger.logEvent(current_call) + logger.logEvent('Incoming Call') call.answer(200) - logger.logEvent("Answer call") - print 'Answer Call' - if current_call <> None: - logger.logEvent("Hangup call") - print 'Hangup Call' - call.hangup() + + sleep(2) logger.logEvent('CALL OK') @@ -44,20 +44,23 @@ class Calling(pj.CallCallback): if self.call.info().state <> pj.CallState.DISCONNECTED: if self.call.info().state_text == "CONNECTING": - print 'Call Connecting' logger.logEvent("Call Connecting") - logger.logEvent('200') + try: + logger.logEvent('Try to hangup the call') + self.call.hangup() + logger.logEvent('Hangup OK') + except ValueError: + logger.logEvent('hangup failed, waiting destination hangup the call') + server.sendData('CALL OK') if self.call.info().last_reason == "Busy Here": - print 'Number busy or offline' logger.logEvent('Number busy or Offline') server.sendData('CALL NOT OK') logger.logEvent('CALL NOT OK') if self.call.info().state == pj.CallState.DISCONNECTED: logger.logEvent('Call Disconnected') - print 'Call Discont' current_call = None #function to make a call @@ -68,19 +71,41 @@ def make_call(uri): return acc.make_call(uri, cb) except pj.Error, e: - print "408 " + str(e) - logger.logEvent('408') + logger.logEvent('Error when trying to call, 408') + server.sendData('CALL NOT OK') return None +def writeToFile(): + try: + string = '--' + with open('handler.txt', 'w') as F: + writer = csv.writer(F) + writer.writerow([string]) + F.close() + except ValueError: + print "can't write to file" + +def openFile(): + global sipServer, username, password, ip, portadd + global port + + #file format: 'Account:username:password:server:handler:PortName:portCommunication + File = open('handler.txt') + reader = csv.reader(File, delimiter=':') + for row in reader: + if str(row[0]) == 'Account': + username = str(row[1]) + password = str(row[2]) + sipServer = str(row[3]) + port = int(row[6]) + File.close() + writeToFile() + #send greeting message to the controller def greeting(): - global server - global status - global port - port = sys.argv[2] + global server server = None - status = None # create socket communication object server = ServerClass.ServerHandler(port) @@ -88,15 +113,15 @@ def greeting(): conn = server.openSocket() if server.connected == 1: - #connection to the controller esatablish + #connection to the controller establish + logger.logEvent('Connection Establish') if server.receiveData(25) == 'HELLO HANDLER': - print 'GREETING' server.sendData('HELLO CONTROLLER') - status = 'OK' + return 1 else: - status = 'NOT OK' logger.logEvent('Cant connect to Controller') - sys.exit(1) + del server + return 0 def initLogFile(sipServer): @@ -104,15 +129,15 @@ def initLogFile(sipServer): if sipServer == '132.230.4.8': nameOfLogFile = 'SIP handler.log' - print '--SIP Asterisk--' + #print '--SIP Asterisk--' elif sipServer == 'sipgate.de': nameOfLogFile = 'Landline handler.log' - print '--Landline--' + #print '--Landline--' elif sipServer == '132.230.252.228': nameOfLogFile = 'University SIP handler.log' - print '--university tephone network--' + #print '--university tephone network--' logger = LogFileClass.Logging(nameOfLogFile) @@ -127,7 +152,6 @@ def initState(): if message == 'RECEIVER': state = 'RECEIVER' - elif message[0:6] == 'CALLER': state = 'CALLER' no = message[7:] @@ -137,30 +161,13 @@ def initState(): num = no[7:] else: num = no - print 'INIT STATE', state - -def initHandler(): - global sipServer - global username - global password - - - accConf = sys.argv[1] - username = accConf[0:accConf.find(':')] - - line = accConf[accConf.find(':')+1:] - password = line[0:line.find(':')] - - newLine = line[line.find(':')+1:] - sipServer = newLine[0:newLine.find(':')] - lib = pj.Lib() stop = False print 'INIT SYSTEM' -initHandler() +openFile() setproctitle.setproctitle('SIP Handler') initLogFile(sipServer) @@ -176,9 +183,9 @@ while stop <> True: lib.start() lib.set_null_snd_dev() - greeting() - - + if greeting() != 1: + lib.destroy() + break try: initState() acc_cfg = pj.AccountConfig(str(sipServer),str(username),str(password)) @@ -201,7 +208,7 @@ while stop <> True: print data logger.logEvent(data) - #shutting down message + #get shutting down message if data == 'TERMINATE CONNECTION': print data logger.logEvent('Terminate') @@ -218,13 +225,12 @@ while stop <> True: #start the call if data == 'CALL START': - print data + #print data if num <> '': sleep(3) logger.logEvent(data) logger.logEvent('Make a call to: ' + num) number = "sip:"+num+"@"+sipServer - print number make_call(number) else: logger.logEvent('No number to call') @@ -232,7 +238,7 @@ while stop <> True: #shutting down message if data == 'TERMINATE CONNECTION': - print data + #print data stop = True logger.logEvent('Terminate') break @@ -240,21 +246,27 @@ while stop <> True: else: logger.logEvent('Unknow Message') server.sendData('Unknow Message') - server.closeConnection() - sys.exit(0.5) + break else: logger.logEvent("488 Not Acceptable Here") - lib.destroy() + server.sendData('DEVICE NOT READY') + break - except ValueError: - print "401 Unauthorized " + str(e) + except ValueError: logger.logEvent("401 Unauthorized ") + break logger.logEvent("Goodbye") -acc.delete() -lib.destroy() -server.closeConnection() -lib = None -acc = None +logger.closeLogging() +# trying to clean everything before shutting down +try: + acc.delete() + lib.destroy() + lib = None + acc = None + server.closeConnection() + del server +except ValueError: + message = 'trying failure' diff --git a/Code/Server-Code/SSHTunnelBoxClass.py b/Code/Server-Code/SSHTunnelBoxClass.py old mode 100755 new mode 100644 diff --git a/Code/Server-Code/ServerClass.py b/Code/Server-Code/ServerClass.py old mode 100755 new mode 100644 diff --git a/Code/Server-Code/gsmselftest.py b/Code/Server-Code/gsmselftest.py old mode 100755 new mode 100644 index 61d4246..082b19f --- a/Code/Server-Code/gsmselftest.py +++ b/Code/Server-Code/gsmselftest.py @@ -11,6 +11,9 @@ import WebsiteCommClass import signal import random from time import sleep +import setproctitle + +setproctitle.setproctitle('Controller Software') class bcolors: HEADER = '\033[95m' @@ -76,7 +79,22 @@ def initDB(): # function for connection database db.connectDB() dbStatus = db.connectDB() if dbStatus == 1: - print 'Lock the mutex: ' + str(db.lockMutex(600)) + db.lockMutex(600) + +def initNagiosString(x): + + initResult = truthtableClass.trueTable(x) + initResult.initNagiosResult() + + if int(initResult.FAILED) != 0: + print "GSM CRITICAL - Number of test "+str(initResult.testMount)+'; Failure '+str(initResult.FAILED)+'; Unknown '+str(initResult.handlerError) + elif int(initResult.handlerError) != 0: + print "GSM WARNING - Number of test "+str(initResult.testMount)+'; Failure '+str(initResult.FAILED)+'; Unknown '+str(initResult.handlerError) + elif int(initResult.FAILED) == 0 and int(initResult.handlerError) == 0: + print "GSM OK - Number of test "+str(initResult.testMount)+'; Failure '+str(initResult.FAILED)+'; Unknown '+str(initResult.handlerError) + else: + + print "unknown error" def initTrueTable(x): @@ -86,7 +104,6 @@ def initTrueTable(x): print '\n' openBSC = None asterikServer = None - finalResult = list() for x in initResult.nanoBts: name = x[0] @@ -136,7 +153,7 @@ def initTrueTable(x): def errorCodes(callFrom, callTo, result): message = '|' + str(callFrom) + '|' + str(callTo) + '|' + str(result) + '|' + str(db.errorCode(result)) - print message + sendResultWebsite(message) # function to search in the list @@ -151,7 +168,7 @@ def isThere(keyword,lists): def testDest(callFrom, callTo, tried): - makeTest.initTest(callFrom,callTo)#xxxx + makeTest.initTest(callFrom,callTo) db.insertTask(taskNum,callFrom,callTo) smartResultList.append([callFrom,callTo, makeTest.result,tried]) taskID = db.maxTaskID() @@ -192,8 +209,7 @@ def smartTest(): testDest(callFrom, callTo, 1) gsmRZList.remove(callTo) destList.remove(callTo) - - + for callFrom in gsmRZList: i = random.randint(0, len(destList)-1) #Check whether the caller and dest are same @@ -228,10 +244,11 @@ def smartTest(): #checking unsuccess call, to make sure that destination are really unreachable for dest in smartResultList: #check unsuccess call and did the test have already tried, 2 means has been check - if int(dest[2]) == 486 or int(dest[2]) == 999 or int(dest[2]) == 998 or int(dest[2]) == 801 or int(dest[2]) == 802: + if int(dest[2]) == 486 or int(dest[2]) == 999 or int(dest[2]) == 998 or int(dest[2]) == 801 or int(dest[2]) == 802: + if int(dest[3]) != 2 and dest[1] != 'sip': testDestination = True - founds = False + testFromRZ = False testCaller = True # make sure that destination have not tested by another part and give success result. for test in smartResultList: @@ -242,28 +259,24 @@ def smartTest(): if int(test[2]) == 200: testCaller = False #if destination have not tested by other part. try to test from RZ GSM - if int(test[2]) == 200: + if int(test[2]) == 200 and testFromRZ != True: for caller in cpgsmRZList: if caller == test[0] or caller == test[1]: callFrom = caller - founds = True + testFromRZ = True - if dest[0] != 'sip': - founds = False - if testDestination == True: - if founds != True: + if testFromRZ != True: callFrom = 'sip' callTo = dest[1] - if dest[0] != 'sip': - testDest(callFrom, callTo, 2) - rem.append(dest) + testDest(callFrom, callTo, 2) + rem.append(dest) #check unsuccess call because caller handler having problem #destination handler having problem, we should make test also to the caller if int(dest[2]) == 998 or int(dest[2]) == 802 or int(dest[2]) == 486: if testCaller == True: - if founds != True: + if testFromRZ != True: callFrom = 'sip' callTo = dest[0] testDest(callFrom, callTo, 2) @@ -272,10 +285,15 @@ def smartTest(): caller = dest[0] # to test nanobts if the test come from RZ GSM but fehler if caller[0:5] == 'GSMRZ' and int(dest[3]) != 2 and dest[1] != 'sip': + repeatTest = True + for test in smartResultList: + if test[1] == caller or test[0] == caller: + repeatTest = False if int(dest[2]) == 486 or int(dest[2]) == 402: - callFrom = 'sip' - testDest(callFrom, dest[0], 2) - rem.append(dest) + if repeatTest == True: + callFrom = 'sip' + testDest(callFrom, dest[0], 2) + rem.append(dest) # test to make sure nanoBTS working or not. sice probably that nanotbts seems error but actually not. for RZ in cpgsmRZList: @@ -321,18 +339,25 @@ def smartTest(): return smartResultList def doSmartTest(status): - global taskNum + global taskNum, printMessage global WebStatus initDB() taskNum = db.maxTaskNo() global makeTest if status == True: WebStatus = True + else: WebStatus = False + makeTest = initTestClass.initTesting() result = smartTest() - initTrueTable(result) + if status == 'NAGIOS': + initNagiosString(result) + + elif status == False: + initTrueTable(result) + if status == True: sendFinishMessage() @@ -643,8 +668,6 @@ def closeFunction(dbConn,serverSocket): if len(sys.argv) > 1: command = sys.argv[1] - - print ' ' if command == '--all': resultsList = list() @@ -674,6 +697,14 @@ if len(sys.argv) > 1: db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) doSmartTest(False) + elif command == '--nagios': + initDB() + resultsList = list() + allPing() + taskNo = db.maxTaskNo() + db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) + doSmartTest('NAGIOS') + elif command == '--devconf': updateDevice() diff --git a/Code/Server-Code/handler.txt b/Code/Server-Code/handler.txt new file mode 100644 index 0000000..45b50ac --- /dev/null +++ b/Code/Server-Code/handler.txt @@ -0,0 +1 @@ +-- diff --git a/Code/Server-Code/help.txt b/Code/Server-Code/help.txt old mode 100755 new mode 100644 index 5491f26..1a3b843 --- a/Code/Server-Code/help.txt +++ b/Code/Server-Code/help.txt @@ -11,6 +11,7 @@ Options and arguments (and corresponding environment variables): --incoming : To check incoming calls from Landline --smart : To test only important points in the network and to identify the problems --devconf : To configure the USB device on the server +--nagios : Execute smart test but only for Nagios plugin example : ./gsmselftest.py --devconf ./gsmselftest.py --smart diff --git a/Code/Server-Code/initTestClass.py b/Code/Server-Code/initTestClass.py old mode 100755 new mode 100644 index b3414e2..568f840 --- a/Code/Server-Code/initTestClass.py +++ b/Code/Server-Code/initTestClass.py @@ -79,6 +79,8 @@ class initTesting: self.initaccount(dest,callTo) if self.status == 1: + #string = 'Account:username:password:server:ipaddress:portaddress:portnumber' + callPortName = caller[0] accCaller = caller[2]+':'+caller[3]+':'+caller[4]+':' @@ -91,6 +93,7 @@ class initTesting: makeTest.FuncTest() self.result = str(makeTest.testResult) + else: self.result = 100 else: diff --git a/Code/Server-Code/startSoftware.py b/Code/Server-Code/startSoftware.py old mode 100755 new mode 100644 index 18863be..b2beb58 --- a/Code/Server-Code/startSoftware.py +++ b/Code/Server-Code/startSoftware.py @@ -1,7 +1,9 @@ #! /usr/bin/env python import ServerClass -import subprocess +import subprocess +import setproctitle +setproctitle.setproctitle('Start Software') while 1: # try connect to website server = ServerClass.ServerHandler(34600) @@ -9,7 +11,11 @@ while 1: test = server.receiveData(2) if test == 'START APP': print 'start' - subprocess.Popen(args=['gnome-terminal','--command= python gsmselftest.py']) + try: + script = 'gsmselftest.py' + subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + except ValueError: + print " - can't start controller software -" server.closeConnection() del server diff --git a/Code/Server-Code/truthtableClass.py b/Code/Server-Code/truthtableClass.py old mode 100755 new mode 100644 index 0d7a633..c45ab4d --- a/Code/Server-Code/truthtableClass.py +++ b/Code/Server-Code/truthtableClass.py @@ -9,6 +9,11 @@ class trueTable: self.incomingRZ = None self.openBSC = None self.nanoBTS = None + self.deviceStatus = list() + self.testMount = len(resultsList) + self.OK = 0 + self.FAILED = 0 + self.handlerError = 0 def initDB(self): # function for connect to database @@ -27,6 +32,64 @@ class trueTable: self.found = True return self.found + def findStatusInList(self,key): + + if len(self.deviceStatus) == 0: + update = False + else: + update = False + for item in self.deviceStatus: + if key == item[0] and str(item[1]) != 'OK': + update = True + return update + + def initNagiosResult(self): + self.initDB() + deviceLists = self.db.deviceList() + self.db.closeDBConn() + + for items in deviceLists: + device = items[0] + for result in self.resultsList: + if device == result[0] or device == result[1]: + if int(result[2]) == 200: + if self.findStatusInList(device) == True: + try: + self.deviceStatus.remove([device,'NOT OK']) + except: + try: + self.deviceStatus.remove([device,'UNKNOWN']) + except: + continue + self.deviceStatus.append([device,'OK']) + else: + self.deviceStatus.append([device,'OK']) + + elif int(result[2]) == 486: + found = False + for item in self.deviceStatus: + if device == item[0]: + if str(item[1]) != 'OK' or str(item[1]) == 'OK': + found = True + if found == False: + self.deviceStatus.append([device,'NOT OK']) + else: + found = False + for item in self.deviceStatus: + if device == item[0]: + if str(item[1]) != 'OK' or str(item[1]) == 'OK': + found = True + if found == False: + self.deviceStatus.append([device,'UNKNOWN']) + for status in self.deviceStatus: + + if status[1] == 'OK': + self.OK = self.OK+1 + elif status[1] == 'NOT OK': + self.FAILED = self.FAILED+1 + else: + self.handlerError = self.handlerError+1 + def initTrueTable(self): global btsName self.initDB() @@ -39,7 +102,7 @@ class trueTable: if device[0:5] == 'GSMEx' or device == 'landline': externalRZList.append(device) # fetch into the list self.db.closeDBConn() - lists = self.resultsList + lists = self.resultsList self.nanoBts = list() gsmResultList = list() @@ -113,25 +176,16 @@ class trueTable: if found != True: self.nanoBts.append([btsName,False]) - elif str(result) == '801' and key == call: + elif (str(result) == '801' or str(result) == '999') and key == call: self.lookingBTSname(key) if self.found != True: self.nanoBts.append([key,result]) - elif str(result) == '802'and key == dest: - self.lookingBTSname(key) - if self.found != True: - self.nanoBts.append([key,result]) - - if str(result) == '998' and key == dest: + elif (str(result) == '802' or str(result) == '998') and key == dest: self.lookingBTSname(key) if self.found != True: self.nanoBts.append([key,result]) - - if str(result) == '999' and key == call: - self.lookingBTSname(key) - if self.found != True: - self.nanoBts.append([key,result]) + j = j+1 elif j == i: stop = True diff --git a/Code/Server-Code/usbDetectClass.py b/Code/Server-Code/usbDetectClass.py old mode 100755 new mode 100644 diff --git a/Under-Testing/Box1-Code/GSMClass.py b/Under-Testing/Box1-Code/GSMClass.py deleted file mode 100644 index d89f652..0000000 --- a/Under-Testing/Box1-Code/GSMClass.py +++ /dev/null @@ -1,303 +0,0 @@ -from serial import * #serial port library -import string -import sys -import signal - -class TimeoutException(Exception): - pass - -class serialPort(): - - def __init__(self, portAddress, baudRate, timeout): - self.portAddress = portAddress - self.portExist = 0 - self.ser = 0 - self.baudRate = baudRate - self.signalStrength = 0 - - self.timer = timeout - self.timer1 = timeout - self.start = 0 - - self.debugMode = 0 - - def portInit(self, timeout1): - portName = self.portAddress[-4:] - portExist = os.popen('dmesg | grep ' + portName).read() - self.timer = timeout1 - if portExist == '': - return 0 - else: - try: - self.ser = Serial( - port=self.portAddress, - baudrate=self.baudRate, - bytesize=EIGHTBITS, - parity=PARITY_NONE, - stopbits=STOPBITS_ONE - ) - self.ser.flushOutput() #clean the output buffer from the serial port - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT\r') - - received = self.__receiveData() - self.start=1 - if received == 'OK': - self.portExist = 1 - return 1 #cellphone is OK, receives commands - elif received == 'TIMEOUT': - return 'TIMEOUT' - else: - return 2 #cellphone has an error - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - - self.portExist = 3 - return 3 - - def callNumber(self,numberToCall): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('ATD'+str(numberToCall)+';\r') - if self.__receiveData() == 'OK': - return 1 - else: - return 4 - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - - return 3 - else: - return 0 - - - def hangUp(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CHUP\r') - received = self.__receiveData() - if received == 'OK': - return 1 - elif received == 'ERROR': - return 2 #other side hang up the call - else: - return 4 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - - def closePort(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.close() - return 1 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def getSignalQuality(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CSQ\r') - if self.__receiveData() == 'OK': - if self.__receiveData == 'SIGNAL': - return 1 - else: - return 4 - else: - return 2 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - - else: - return 0 - - def receiveCall(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - if self.__receiveData() == 'RING': - self.ser.write('ATA\r') - if self.__receiveData()=='OK': - return 1 - else: - return 4 - else: - return 2 - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def currentCall(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CLCC\r') - received = self.__receiveData() - if received == 'OK': - return 2 #not yet in a call - elif received == 'ACTIVE': - return 1 #in a call - elif received == 'HELD': - return 5 #held call - elif received == 'DIALING': - return 6 #dialing - elif received == 'ALERTING': - return 7 #alerting the call - elif received == 'INCOMING': - return 8 #incoming call - elif received == 'WAITING': - return 9 #waiting for a call - - else: - return received #in some other state - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def __receiveData(self): - def timeout_handler(signum, frame): - raise TimeoutException() - if self.start == 0: - self.timer = 5 - else: - self.timer = self.timer1 - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(self.timer) - - bufferData = '' - lines = '' - line = '' - - try: - while True: - bufferData = bufferData + self.ser.read(self.ser.inWaiting()) #read the serial port and add it to the buffer variable - if '\n' in bufferData: #if a new line character is found in the buffer then the cellphone has sent something - lines = bufferData.split('\n') #parse the buffer variable with the new line character - last_received = lines.pop(0) #put into last_received variable the first content from lines (FIFO) - - bufferData = '\n'.join(lines) #add a new line to the buffer variable - - last_received=last_received.split('\n') #parse the last received value with new lines - line = last_received[0].replace(chr(13), '') #remove \r from the first parsed value in last_received and return me a nicely parsed value :) - if self.debugMode == 1: - if len(line) > 0: - print line - - if line == 'OK': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'OK' - - elif line == 'ERROR': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ERROR' - - elif line[0:11] == '+CME ERROR:': - if self.debugMode == 1: - print 'ERROR:', line - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ERROR' - - elif line == 'RING': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'RING' - - elif line[0:5] == '+CSQ:': - space = int(string.find(line,' '))+1 #find the (space) sign - coma = int(string.find(line,',')) #find the , (coma) sign - self.signalStrength = (int(line[space:coma])*2)-113 - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'SIGNAL' - - elif line == 'NO CARRIER': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'NO CARRIER' - - elif line == 'BUSY': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'BUSY' - - elif line[0:6] == '+CLCC:': - - if line[11:12] == '0': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ACTIVE' - elif line[11:12] == '1': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'HELD' - elif line[11:12] == '2': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'DIALING' - elif line[11:12] == '3': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ALERTING' - elif line[11:12] == '4': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'INCOMING' - elif line[11:12] == '5': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'WAITING' - - except TimeoutException: - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'TIMEOUT' - - except Exception, e: - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - print 'NO GOOD' - print e - return 3 diff --git a/Under-Testing/Box1-Code/LogFileClass.py b/Under-Testing/Box1-Code/LogFileClass.py deleted file mode 100644 index cb152f4..0000000 --- a/Under-Testing/Box1-Code/LogFileClass.py +++ /dev/null @@ -1,21 +0,0 @@ -import string -import datetime - -class Logging: - - def __init__(self, logFileName): - self.writeToFile = open(logFileName, 'a') - self.justStarted = 1 - - def logEvent(self, event): - now = str(datetime.datetime.now()) - if self.justStarted == 1: - self.writeToFile.write('\n\n------------------STARTED THE LOGGING '+ now + ' ------------------\n') - self.justStarted = 0 - else: - self.writeToFile.write('On: '+ now + '\t' + 'Event: ' +str(event) + '\n') - - def closeLogging(self): - now = str(datetime.datetime.now()) - self.writeToFile.write('------------------FINISHED THE LOGGING '+ now + ' ------------------') - self.writeToFile.close() diff --git a/Under-Testing/Box1-Code/READ ME.txt b/Under-Testing/Box1-Code/READ ME.txt deleted file mode 100644 index 65be275..0000000 --- a/Under-Testing/Box1-Code/READ ME.txt +++ /dev/null @@ -1,19 +0,0 @@ - -Class files: - - - ServerClass.py - This class file is used by handlers as socket communication class to communicate with the controller. - - - GSMClass.py - This class file is used by GSM Handlers to control and talk to the mobile devices. - - - LogFileClass.py - This class is used to make the log files. - -Handler files: - - - serverHandler.py - -How to start the server Handler: - - you can use SSH connection to the box and type: - - $ sudo python serverHandler.py $ diff --git a/Under-Testing/Box1-Code/ServerClass.py b/Under-Testing/Box1-Code/ServerClass.py deleted file mode 100644 index 088a2ae..0000000 --- a/Under-Testing/Box1-Code/ServerClass.py +++ /dev/null @@ -1,162 +0,0 @@ -import socket -import sys -import os -import string -import signal -import fcntl -import struct - -class TimeoutException(Exception): - pass - -class ServerHandler: - - def __init__(self,p): - self.port = p - ifname = 'eth0' #define here the interface you want to find the ip address - - #code for getting our public addresss so I can make the SSH tunneling work - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - publicAddress = socket.inet_ntoa(fcntl.ioctl( - s.fileno(),0x8915, # SIOCGIFADDR - struct.pack('256s', ifname[:15]))[20:24]) - - self.host = publicAddress #None #'127.0.0.1' #symbolic name meaning all available interfaces - self.s = None - self.connected = 0 - self.address = "127.0.0.1" #address of the main controller - self.onceConnected = 0 - self.error = 'No error' - - self.debugMode = 0 - - def openSocket(self): - self.error = 'No error' - for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, - socket.SOCK_STREAM, 0, socket.AI_PASSIVE): - af, socktype, proto, canonname, sa = res - - try: - self.s = socket.socket(af, socktype, proto) - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets - except socket.error, msg: - self.s = None - self.connected = 0 - self.error = str(msg) - continue - - try: - self.s.bind(sa) - self.s.listen(1) - except socket.error, msg: - self.s.close() - self.s = None - self.connected = 0 - self.error = str(msg) - continue - break - - if self.s is None: - self.connected = 0 - return 0 - else: #accept the connection - self.connection, self.address = self.s.accept() - self.connected = 1 - self.onceConnected = 1 - return 1 - - def connectedTo(self): - return self.address - - def receiveData(self, timeout): - if self.connected == 1: - - def timeout_handler(signum, frame): - raise TimeoutException() - - try: - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(timeout) #start the timeout alarm, for timeout seconds - - data = self.connection.recv(1024) - - #stop the timeout function - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if not data: - self.connected = 0 - return 'NO DATA' - else: - return data - - except TimeoutException: - #timeout happened - signal.signal(signal.SIGALRM, old_handler) - - return 'TIMEOUT' - - except Exception, e: - #stop the timeout timer - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connected = 0 - if error[0:11] == '[Errno 104]': - return 3 #the other side reset the connection,[Errno 104] Connection reset by peer - - return 2 - else: - return 0 - - def sendData(self, data): - if self.connected == 1: - try: - self.connection.send(data) - return 1 - - except Exception, e: - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connecected = 0 - return 2 - else: - return 0 - - def closeConnection(self): - if self.onceConnected == 1: - try: - self.connected = 0 - SHUT_RDWR = 2 - self.connection.shutdown(SHUT_RDWR) - self.connection.close() - return 1 - except Exception, e: - self.connected = 0 - error = str(e) - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - if error[0:11] == '[Errno 107]': - return 3 #the other side closed the connection before us [Errno 107] Transport endpoint is not connected - return 2 - else: - return 0 - - def killPort(self): - killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read() - killResult = killResult.replace('\n','') - print killResult - if killResult!='': - print killResult - killPort = os.popen("kill -9 " + killResult).read() - return 1 - return 0 diff --git a/Under-Testing/Box1-Code/serverHandler.py b/Under-Testing/Box1-Code/serverHandler.py deleted file mode 100644 index accfc1d..0000000 --- a/Under-Testing/Box1-Code/serverHandler.py +++ /dev/null @@ -1,341 +0,0 @@ -import ServerClass -import GSMClass -import LogFileClass -import sys -import os -from time import sleep -def restart_program(): - """Restarts the current program. - Note: this function does not return. Any cleanup action (like - saving data) must be done before calling this function.""" - python = sys.executable - os.execl(python, python, * sys.argv) - -################################ -################################ -######SET THESE PARAMETERS###### -################################ -portListen = 50008 #port number of handler -nameOfLogFile = 'handler.log' #name of the log file -portAddress = '/dev/ttyUSB0' -baudRate = 19200 -################################ -################################ -################################ - -#create the log file class -logger = LogFileClass.Logging(nameOfLogFile) -#use this variable as the error counter -errorCount = 0 -#start logging all events -logger.logEvent('') -#counter how many time we were in the while loop -whileCounter =0 - -#define global varibales -global lastState -global resetState -global deviceError -lastState = 0 -resetState = 0 -deviceError = 0 - -def initSystem(): - print 'init system' - - global handlerSocket - global gsmDevice - global initTalkVar - global lastState - global initDevice - global numberToCall - global resetState - global deviceError - - initTalkVar = 0 #variable used to know if we initialized the start talk - lastState = 0 #variable used to know - numberToCall = '000' #number to call - resetState = 0 - - handlerSocket = ServerClass.ServerHandler(portListen) - logger.logEvent('LISTEN ON PORT: '+str(portListen)) - anyConnection = handlerSocket.openSocket() - #add this if you need it - gsmDevice = GSMClass.serialPort(portAddress, baudRate, 15) - initDevice = gsmDevice.portInit(5) - ######################################################## - - #add nice formating to the log file :) - - print 'any connection ' + str(anyConnection) - print 'initDevice ' + str(initDevice) - - if initDevice!= 1: - deviceError = 1 - else: - deviceError = 0 - - - if anyConnection == 1 and initDevice == 1: - logger.logEvent('CONNECTION ESTABLISHED AND DEVICE WORKING: ' + str(handlerSocket.connectedTo())) - return 1 - - elif anyConnection == 1 and initDevice != 0: - logger.logEvent('$connection established but device not working: ' + str(handlerSocket.connectedTo())) - return 2 - else: - logger.logEvent('$no connection') - logger.logEvent('$else case in init system' + str(anyConnection) + ' ' + str(initDevice) + ' ') - resetState = 1 - return 0 - -def receiveMessage(timeout): - - message = str(handlerSocket.receiveData(timeout)) - print 'I RECEIVED THE FOLLOWING MESSAGE' + message - if message == 'NO DATA': - print 'try to close the connection' + str(handlerSocket.closeConnection()) - global resetState - resetState = 1 - return 1 - if message != '0' and message !='NO DATA': - print 'in receive message', message, lastState - - if message == 'HELLO HANDLER' and lastState == 0: - outcome = initTalk() - if outcome == 1: - logger.logEvent('TALK INITIALIZATION SENT') - else: - logger.logEvent('$talk initialization not sent: ' + str(outcome)) - - elif message == 'RECEIVER' and lastState == 1: - outcome = initReceiver() - if outcome == 1: - logger.logEvent('RECEIVER READY SENT') - else: - logger.logEvent('$receiver ready not sent: ' + str(outcome)) - return 7 - - elif message == 'RECEIVE START' and lastState == 2: - outcome = receiveStart() - print 'outcome ' + str(outcome) - if outcome == 1: - logger.logEvent('RECEIVE STATUS REPORTED') - return 2 - else: - logger.logEvent('$receive status not reported: ' + str(outcome)) - return 3 - - elif message[0:6] == 'CALLER' and lastState == 1: - outcome = initCaller() - - global numberToCall - numberToCall = message[7:] - if outcome == 1: - logger.logEvent('CALLER READY SENT') - else: - logger.logEvent('$caller ready not sent: ' + str(outcome)) - return 6 - - elif message == 'CALL START' and lastState == 4: - outcome = callStart(numberToCall) - print 'outcome ' + str(outcome) - if outcome == 1: - logger.logEvent('CALLER STATUS SENT') - return 4 - else: - logger.logEvent('$caller status not sent: ' + str(outcome)) - return 5 - - elif message == 'TERMINATE CONNECTION' and (lastState == 5 or lastState == 3): - outcome = terminateConnection() - if outcome == 1: - logger.logEvent('TERMINATED THE CONNECTION AFTER TEST') - else: - logger.logEvent('$connection could not be terminated after the test: ' + str(outcome)) - - elif message == 'TERMINATE CONNECTION': - outcome = terminateConnection() - if outcome == 1: - logger.logEvent('TERMINATED THE CONNECTION IN MIDDLE. IN STATE: ' + str(lastState) ) - else: - logger.logEvent('$connection could not be terminated in middle: ' + str(outcome) + ' in state: ' + str(lastState)) - else: - print message - outcome = other() - logger.logEvent('other appeared') - - return 1 - -########INIT TALK PART######## -def initTalk(): - print 'init talk' - #initialize the talk between handler and controller - global lastState - test = gsmDevice.portInit(2) - if test != 1: - test = gsmDevice.portInit(2) - if test != 1: - sendMessage = handlerSocket.sendData('DEVICE NOT READY') - else: - lastState = 1 - sendMessage = handlerSocket.sendData('HELLO CONTROLLER') - else: - lastState = 1 - sendMessage = handlerSocket.sendData('HELLO CONTROLLER') - return sendMessage -############################## - - -########RECEIVE PART######## -def initReceiver(): - print 'initReceiver' - - #init function to initialize the receiver - global lastState - lastState = 2 - sendMessage = handlerSocket.sendData('RECEIVER READY') - return sendMessage - -def receiveStart(): - print 'receiveStart' - - #wait for a call and report if you received it and it was successfull or not - global lastState - global deviceError - lastState = 3 - if deviceError == 0: - receiveCall = gsmDevice.receiveCall() - if receiveCall == 'TIMEOUT': - deviceError = 1 - print 'device error in RECEIVE' - else: - receiveCall = 0 - - if deviceError == 0: - if receiveCall == 1: - callSuccess = 'CALL OK' - else: - callSuccess = 'CALL NOT OK' - - - - sendMessage = handlerSocket.sendData(callSuccess) - if deviceError==0: - tryHangUp = gsmDevice.hangUp() - return sendMessage -############################ - - -########CALL PART######## -def initCaller(): - print 'initCaller1' - - #initialize caller here - global lastState - lastState = 4 - sendMessage = handlerSocket.sendData('CALLER READY') - return sendMessage - -def callStart(numberToCall): - print 'initCaller2' - - #call the number here - global lastState - global deviceError - lastState = 5 - - callSuccess = 'CALL NOT OK' - - if deviceError==0: - tryCall = gsmDevice.callNumber(numberToCall) - if tryCall == 'TIMEOUT': - deviceError = 1 - print 'device error in CALL' - else: - tryCall=0 - - - if tryCall != 1: - callSuccess = 'CALL NOT OK' - else: - print 'try call result'+ str(tryCall) - if tryCall != 'TIMEOUT': - sleep(2) - activeCall = gsmDevice.currentCall() - counter = 0 - while(activeCall!=1): - sleep(1) - activeCall = gsmDevice.currentCall() - if counter == 10: - break - counter += 1 - - if activeCall == 1: - callSuccess = 'CALL OK' - else: - callSuccess = 'CALL NOT OK' - - handResponse = handlerSocket.sendData(callSuccess) - - if deviceError==0: - tryHangUp = gsmDevice.hangUp() - - return handResponse -######################### - - -########TERMINATE PART######## -def terminateConnection(): - print 'terminate connection' - global resetState - close = handlerSocket.closeConnection() - resetState = 1 - return close -############################## - -########TERMINATE PART######## -def other(): - print 'other' - global lastState - global resetState - - close = handlerSocket.closeConnection() - lastState = 8 - resetState = 1 - return 1 -############################## - - - -while 1: - - test = initSystem() - if test == 1: - print 'initialized system' - receivedMessage = 0 - while receivedMessage < 8 and resetState!= 1: - if receivedMessage == 4 or receivedMessage == 5 or receivedMessage == 2 or receivedMessage == 3: - receivedMessage = receiveMessage(20) - else: - receivedMessage = receiveMessage(30) - elif test ==2: - print 'initialized system but device not working' - logger.logEvent('initialized system but device not working') - receivedMessage = 0 - while receivedMessage < 4 and resetState!= 1: - handlerSocket.sendData('DEVICE NOT READY') - if receivedMessage == 4 or receivedMessage == 5 or receivedMessage == 2 or receivedMessage == 3: - receivedMessage = receiveMessage(20) - else: - receivedMessage = receiveMessage(30) - - elif test ==0: - print 'nobody can connect, reboot board, restart cellphone' - logger.logEvent('nobody can connect, reboot board, restart cellphone') - logger.closeLogging(); - del handlerSocket - del gsmDevice - del logger - restart_program() - diff --git a/Under-Testing/Box2-Code/GSMClass.py b/Under-Testing/Box2-Code/GSMClass.py deleted file mode 100644 index 126446e..0000000 --- a/Under-Testing/Box2-Code/GSMClass.py +++ /dev/null @@ -1,303 +0,0 @@ -from serial import * #serial port library -import string -import sys -import signal - -class TimeoutException(Exception): - pass - -class serialPort(): - - def __init__(self, portAddress, baudRate, timeout): - self.portAddress = portAddress - self.portExist = 0 - self.ser = 0 - self.baudRate = baudRate - self.signalStrength = 0 - - self.timer = timeout - self.timer1 = timeout - self.start = 0 - - self.debugMode = 0 - - def portInit(self, timeout1): - portName = self.portAddress[-4:] - portExist = os.popen('dmesg | grep ' + portName).read() - self.timer = timeout1 - if portExist == '': - return 0 - else: - try: - self.ser = Serial( - port=self.portAddress, - baudrate=self.baudRate, - bytesize=EIGHTBITS, - parity=PARITY_NONE, - stopbits=STOPBITS_ONE - ) - self.ser.flushOutput() #clean the output buffer from the serial port - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT\r') - - received = self.__receiveData() - self.start=1 - if received == 'OK': - self.portExist = 1 - return 1 #cellphone is OK, receives commands - elif received == 'TIMEOUT': - return 'TIMEOUT' - else: - return 2 #cellphone has an error - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - - self.portExist = 3 - return 3 - - def callNumber(self,numberToCall): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('ATD'+str(numberToCall)+';\r') - if self.__receiveData() == 'OK': - return 1 - else: - return 4 - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - - return 3 - else: - return 0 - - - def hangUp(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CHUP\r') - received = self.__receiveData() - if received == 'OK': - return 1 - elif received == 'ERROR': - return 2 #other side hang up the call - else: - return 4 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - - def closePort(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.close() - return 1 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def getSignalQuality(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CSQ\r') - if self.__receiveData() == 'OK': - if self.__receiveData == 'SIGNAL': - return 1 - else: - return 4 - else: - return 2 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - - else: - return 0 - - def receiveCall(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - if self.__receiveData() == 'RING': - self.ser.write('ATA\r') - if self.__receiveData()=='OK': - return 1 - else: - return 4 - else: - return 2 - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def currentCall(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CLCC\r') - received = self.__receiveData() - if received == 'OK': - return 2 #not yet in a call - elif received == 'ACTIVE': - return 1 #in a call - elif received == 'HELD': - return 5 #held call - elif received == 'DIALING': - return 6 #dialing - elif received == 'ALERTING': - return 7 #alerting the call - elif received == 'INCOMING': - return 8 #incoming call - elif received == 'WAITING': - return 9 #waiting for a call - - else: - return received #in some other state - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def __receiveData(self): - def timeout_handler(signum, frame): - raise TimeoutException() - if self.start == 0: - self.timer = 5 - else: - self.timer = self.timer1 - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(self.timer) - - bufferData = '' - lines = '' - line = '' - - try: - while True: - bufferData = bufferData + self.ser.read(self.ser.inWaiting()) #read the serial port and add it to the buffer variable - if '\n' in bufferData: #if a new line character is found in the buffer then the cellphone has sent something - lines = bufferData.split('\n') #parse the buffer variable with the new line character - last_received = lines.pop(0) #put into last_received variable the first content from lines (FIFO) - - bufferData = '\n'.join(lines) #add a new line to the buffer variable - - last_received=last_received.split('\n') #parse the last received value with new lines - line = last_received[0].replace(chr(13), '') #remove \r from the first parsed value in last_received and return me a nicely parsed value :) - if self.debugMode == 1: - if len(line) > 0: - print line - - if line == 'OK': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'OK' - - elif line == 'ERROR': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ERROR' - - elif line[0:11] == '+CME ERROR:': - if self.debugMode == 1: - print 'ERROR:', line - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ERROR' - - elif line == 'RING': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'RING' - - elif line[0:5] == '+CSQ:': #+CSQ: - space = int(string.find(line,' '))+1 #find the (space) sign - coma = int(string.find(line,',')) #find the , (coma) sign - self.signalStrength = (int(line[space:coma])*2)-113 - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'SIGNAL' - - elif line == 'NO CARRIER': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'NO CARRIER' - - elif line == 'BUSY': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'BUSY' - - elif line[0:6] == '+CLCC:': - - if line[11:12] == '0': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ACTIVE' - elif line[11:12] == '1': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'HELD' - elif line[11:12] == '2': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'DIALING' - elif line[11:12] == '3': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ALERTING' - elif line[11:12] == '4': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'INCOMING' - elif line[11:12] == '5': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'WAITING' - - except TimeoutException: - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'TIMEOUT' - - except Exception, e: - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - print 'NO GOOD' - print e - return 3 diff --git a/Under-Testing/Box2-Code/LogFileClass.py b/Under-Testing/Box2-Code/LogFileClass.py deleted file mode 100644 index cb152f4..0000000 --- a/Under-Testing/Box2-Code/LogFileClass.py +++ /dev/null @@ -1,21 +0,0 @@ -import string -import datetime - -class Logging: - - def __init__(self, logFileName): - self.writeToFile = open(logFileName, 'a') - self.justStarted = 1 - - def logEvent(self, event): - now = str(datetime.datetime.now()) - if self.justStarted == 1: - self.writeToFile.write('\n\n------------------STARTED THE LOGGING '+ now + ' ------------------\n') - self.justStarted = 0 - else: - self.writeToFile.write('On: '+ now + '\t' + 'Event: ' +str(event) + '\n') - - def closeLogging(self): - now = str(datetime.datetime.now()) - self.writeToFile.write('------------------FINISHED THE LOGGING '+ now + ' ------------------') - self.writeToFile.close() diff --git a/Under-Testing/Box2-Code/READ ME.txt b/Under-Testing/Box2-Code/READ ME.txt deleted file mode 100644 index 654b1f2..0000000 --- a/Under-Testing/Box2-Code/READ ME.txt +++ /dev/null @@ -1,20 +0,0 @@ - -Class files: - - - ServerClass.py - This class file is used by handlers as socket communication class to communicate with the controller. - - - GSMClass.py - This class file is used by GSM Handlers to control and talk to the mobile devices. - - - LogFileClass.py - This class is used to make the log files. - -Handler files: - - - serverHandler.py - -How to start the server Handler: - - you can use SSH connection to the box and type: - - $ sudo python serverHandler.py $ - diff --git a/Under-Testing/Box2-Code/ServerClass.py b/Under-Testing/Box2-Code/ServerClass.py deleted file mode 100644 index 088a2ae..0000000 --- a/Under-Testing/Box2-Code/ServerClass.py +++ /dev/null @@ -1,162 +0,0 @@ -import socket -import sys -import os -import string -import signal -import fcntl -import struct - -class TimeoutException(Exception): - pass - -class ServerHandler: - - def __init__(self,p): - self.port = p - ifname = 'eth0' #define here the interface you want to find the ip address - - #code for getting our public addresss so I can make the SSH tunneling work - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - publicAddress = socket.inet_ntoa(fcntl.ioctl( - s.fileno(),0x8915, # SIOCGIFADDR - struct.pack('256s', ifname[:15]))[20:24]) - - self.host = publicAddress #None #'127.0.0.1' #symbolic name meaning all available interfaces - self.s = None - self.connected = 0 - self.address = "127.0.0.1" #address of the main controller - self.onceConnected = 0 - self.error = 'No error' - - self.debugMode = 0 - - def openSocket(self): - self.error = 'No error' - for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, - socket.SOCK_STREAM, 0, socket.AI_PASSIVE): - af, socktype, proto, canonname, sa = res - - try: - self.s = socket.socket(af, socktype, proto) - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets - except socket.error, msg: - self.s = None - self.connected = 0 - self.error = str(msg) - continue - - try: - self.s.bind(sa) - self.s.listen(1) - except socket.error, msg: - self.s.close() - self.s = None - self.connected = 0 - self.error = str(msg) - continue - break - - if self.s is None: - self.connected = 0 - return 0 - else: #accept the connection - self.connection, self.address = self.s.accept() - self.connected = 1 - self.onceConnected = 1 - return 1 - - def connectedTo(self): - return self.address - - def receiveData(self, timeout): - if self.connected == 1: - - def timeout_handler(signum, frame): - raise TimeoutException() - - try: - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(timeout) #start the timeout alarm, for timeout seconds - - data = self.connection.recv(1024) - - #stop the timeout function - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if not data: - self.connected = 0 - return 'NO DATA' - else: - return data - - except TimeoutException: - #timeout happened - signal.signal(signal.SIGALRM, old_handler) - - return 'TIMEOUT' - - except Exception, e: - #stop the timeout timer - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connected = 0 - if error[0:11] == '[Errno 104]': - return 3 #the other side reset the connection,[Errno 104] Connection reset by peer - - return 2 - else: - return 0 - - def sendData(self, data): - if self.connected == 1: - try: - self.connection.send(data) - return 1 - - except Exception, e: - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connecected = 0 - return 2 - else: - return 0 - - def closeConnection(self): - if self.onceConnected == 1: - try: - self.connected = 0 - SHUT_RDWR = 2 - self.connection.shutdown(SHUT_RDWR) - self.connection.close() - return 1 - except Exception, e: - self.connected = 0 - error = str(e) - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - if error[0:11] == '[Errno 107]': - return 3 #the other side closed the connection before us [Errno 107] Transport endpoint is not connected - return 2 - else: - return 0 - - def killPort(self): - killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read() - killResult = killResult.replace('\n','') - print killResult - if killResult!='': - print killResult - killPort = os.popen("kill -9 " + killResult).read() - return 1 - return 0 diff --git a/Under-Testing/Box2-Code/serverHandler.py b/Under-Testing/Box2-Code/serverHandler.py deleted file mode 100644 index 37cab37..0000000 --- a/Under-Testing/Box2-Code/serverHandler.py +++ /dev/null @@ -1,344 +0,0 @@ -import ServerClass -import GSMClass -import LogFileClass -import sys -import os -from time import sleep -def restart_program(): - """Restarts the current program. - Note: this function does not return. Any cleanup action (like - saving data) must be done before calling this function.""" - python = sys.executable - os.execl(python, python, * sys.argv) - - -################################ -################################ -######SET THESE PARAMETERS###### -################################ -portListen = 50008 #port number of handler -nameOfLogFile = 'handler.log' #name of the log file -portAddress = '/dev/ttyUSB0' -baudRate = 19200 -################################ -################################ -################################ - -#create the log file class -logger = LogFileClass.Logging(nameOfLogFile) -#use this variable as the error counter -errorCount = 0 -#start logging all events -logger.logEvent('') -#counter how many time we were in the while loop -whileCounter =0 - -#define global varibales -global lastState -global resetState -global deviceError -lastState = 0 -resetState = 0 -deviceError = 0 - -def initSystem(): - print 'init system' - - global handlerSocket - global gsmDevice - global initTalkVar - global lastState - global initDevice - global numberToCall - global resetState - global deviceError - - initTalkVar = 0 #variable used to know if we initialized the start talk - lastState = 0 #variable used to know - numberToCall = '000' #number to call - resetState = 0 - - handlerSocket = ServerClass.ServerHandler(portListen) - logger.logEvent('LISTEN ON PORT: '+str(portListen)) - anyConnection = handlerSocket.openSocket() - #add this if you need it - gsmDevice = GSMClass.serialPort(portAddress, baudRate, 15) - initDevice = gsmDevice.portInit(5) - ######################################################## - - #add nice formating to the log file :) - - print 'any connection ' + str(anyConnection) - print 'initDevice ' + str(initDevice) - - if initDevice!= 1: - deviceError = 1 - else: - deviceError = 0 - - - if anyConnection == 1 and initDevice == 1: - logger.logEvent('CONNECTION ESTABLISHED AND DEVICE WORKING: ' + str(handlerSocket.connectedTo())) - return 1 - - elif anyConnection == 1 and initDevice != 0: - logger.logEvent('$connection established but device not working: ' + str(handlerSocket.connectedTo())) - return 2 - else: - logger.logEvent('$no connection') - logger.logEvent('$else case in init system' + str(anyConnection) + ' ' + str(initDevice) + ' ') - resetState = 1 - return 0 - -def receiveMessage(timeout): - - message = str(handlerSocket.receiveData(timeout)) - print 'I RECEIVED THE FOLLOWING MESSAGE' + message - if message == 'NO DATA': - print 'try to close the connection' + str(handlerSocket.closeConnection()) - global resetState - resetState = 1 - return 1 - if message != '0' and message !='NO DATA': - print 'in receive message', message, lastState - - if message == 'HELLO HANDLER' and lastState == 0: - outcome = initTalk() - if outcome == 1: - logger.logEvent('TALK INITIALIZATION SENT') - else: - logger.logEvent('$talk initialization not sent: ' + str(outcome)) - - elif message == 'RECEIVER' and lastState == 1: - outcome = initReceiver() - if outcome == 1: - logger.logEvent('RECEIVER READY SENT') - else: - logger.logEvent('$receiver ready not sent: ' + str(outcome)) - return 7 - - elif message == 'RECEIVE START' and lastState == 2: - outcome = receiveStart() - print 'outcome ' + str(outcome) - if outcome == 1: - logger.logEvent('RECEIVE STATUS REPORTED') - return 2 - else: - logger.logEvent('$receive status not reported: ' + str(outcome)) - return 3 - - elif message[0:6] == 'CALLER' and lastState == 1: - outcome = initCaller() - - global numberToCall - numberToCall = message[7:] - if outcome == 1: - logger.logEvent('CALLER READY SENT') - else: - logger.logEvent('$caller ready not sent: ' + str(outcome)) - return 6 - - elif message == 'CALL START' and lastState == 4: - outcome = callStart(numberToCall) - print 'outcome ' + str(outcome) - if outcome == 1: - logger.logEvent('CALLER STATUS SENT') - return 4 - else: - logger.logEvent('$caller status not sent: ' + str(outcome)) - return 5 - - elif message == 'TERMINATE CONNECTION' and (lastState == 5 or lastState == 3): - outcome = terminateConnection() - if outcome == 1: - logger.logEvent('TERMINATED THE CONNECTION AFTER TEST') - else: - logger.logEvent('$connection could not be terminated after the test: ' + str(outcome)) - - elif message == 'TERMINATE CONNECTION': - outcome = terminateConnection() - if outcome == 1: - logger.logEvent('TERMINATED THE CONNECTION IN MIDDLE. IN STATE: ' + str(lastState) ) - else: - logger.logEvent('$connection could not be terminated in middle: ' + str(outcome) + ' in state: ' + str(lastState)) - else: - print message - outcome = other() - logger.logEvent('other appeared') - - return 1 - -########INIT TALK PART######## -def initTalk(): - print 'init talk' - #initialize the talk between handler and controller - global lastState - test = gsmDevice.portInit(2) - if test != 1: - test = gsmDevice.portInit(2) - if test != 1: - sendMessage = handlerSocket.sendData('DEVICE NOT READY') - else: - lastState = 1 - sendMessage = handlerSocket.sendData('HELLO CONTROLLER') - else: - lastState = 1 - sendMessage = handlerSocket.sendData('HELLO CONTROLLER') - return sendMessage -############################## - - -########RECEIVE PART######## -def initReceiver(): - print 'initReceiver' - - #init function to initialize the receiver - global lastState - lastState = 2 - sendMessage = handlerSocket.sendData('RECEIVER READY') - return sendMessage - -def receiveStart(): - print 'receiveStart' - - #wait for a call and report if you received it and it was successfull or not - global lastState - global deviceError - lastState = 3 - if deviceError == 0: - receiveCall = gsmDevice.receiveCall() - if receiveCall == 'TIMEOUT': - deviceError = 1 - print 'device error in RECEIVE' - else: - receiveCall = 0 - - if deviceError == 0: - if receiveCall == 1: - callSuccess = 'CALL OK' - else: - callSuccess = 'CALL NOT OK' - - - - sendMessage = handlerSocket.sendData(callSuccess) - if deviceError==0: - tryHangUp = gsmDevice.hangUp() - return sendMessage -############################ - - -########CALL PART######## -def initCaller(): - print 'initCaller1' - - #initialize caller here - global lastState - lastState = 4 - sendMessage = handlerSocket.sendData('CALLER READY') - return sendMessage - -def callStart(numberToCall): - print 'initCaller2' - - #call the number here - global lastState - global deviceError - lastState = 5 - - callSuccess = 'CALL NOT OK' - - if deviceError==0: - tryCall = gsmDevice.callNumber(numberToCall) - if tryCall == 'TIMEOUT': - deviceError = 1 - print 'device error in CALL' - else: - tryCall=0 - - - if tryCall != 1: - callSuccess = 'CALL NOT OK' - else: - print 'try call result'+ str(tryCall) - if tryCall != 'TIMEOUT': - sleep(2) - activeCall = gsmDevice.currentCall() - counter = 0 - while(activeCall!=1): - sleep(1) - activeCall = gsmDevice.currentCall() - if counter == 10: - break - counter += 1 - - if activeCall == 1: - callSuccess = 'CALL OK' - else: - callSuccess = 'CALL NOT OK' - - handResponse = handlerSocket.sendData(callSuccess) - - if deviceError==0: - tryHangUp = gsmDevice.hangUp() - - return handResponse -######################### - - -########TERMINATE PART######## -def terminateConnection(): - print 'terminate connection' - global resetState - close = handlerSocket.closeConnection() - resetState = 1 - return close -############################## - -########TERMINATE PART######## -def other(): - print 'other' - global lastState - global resetState - - close = handlerSocket.closeConnection() - lastState = 8 - resetState = 1 - return 1 -############################## - - - -while 1: - - test = initSystem() - if test == 1: - print 'initialized system' - receivedMessage = 0 - while receivedMessage < 8 and resetState!= 1: - if receivedMessage == 4 or receivedMessage == 5 or receivedMessage == 2 or receivedMessage == 3: - receivedMessage = receiveMessage(20) - else: - receivedMessage = receiveMessage(30) - elif test ==2: - print 'initialized system but device not working' - logger.logEvent('initialized system but device not working') - receivedMessage = 0 - print 'reset state: ', resetState - while receivedMessage < 4 and resetState!= 1: - handlerSocket.sendData('DEVICE NOT READY') - print 'I AM IN THIS WHILE LOOP' - - if receivedMessage == 4 or receivedMessage == 5 or receivedMessage == 2 or receivedMessage == 3: - receivedMessage = receiveMessage(20) - else: - receivedMessage = receiveMessage(30) - - elif test ==0: - print 'nobody can connect, reboot board, restart cellphone' - logger.logEvent('nobody can connect, reboot board, restart cellphone') - logger.closeLogging() - del logger - del handlerSocket - del gsmDevice - restart_program() diff --git a/Under-Testing/ReadMe.txt b/Under-Testing/ReadMe.txt deleted file mode 100644 index 065326e..0000000 --- a/Under-Testing/ReadMe.txt +++ /dev/null @@ -1,61 +0,0 @@ - -How to install the software on a new system: -(More infromation and details can be found in the report, in chapter 9 (Employing the test Software system) and chapter 7.1 (Encryption on the communication chanels) - -1. You need to install the required libraries which are used by the software: - (http://lab.ks.uni-freiburg.de/projects/gsm-selftest/wiki/Library_req) - - 1.a. PJSIP Library. - - First you need to have The Utilities Packets and compilers, e.g. make, gcc, and binutils. - - Second you need to have the Python development package, to build the C extension. "python2.4-dev or python2.5-dev". The name depends on the installed version of python on the system. (we suggest python 2.7) - - Third, dowload the required library package for PJSIP. http://www.pjsip.org/download.htm - - Using Python build script: - 1. Build the PJSIP libraries first with the usual "./configure && make dep && make" commands. - 2. Go to pjsip-apps/src/python directory. - 3. Run "sudo python ./setup.py install" or just "sudo make" - 4. $ cd your-pjsip-root-dir - 5. $ ./configure && make dep && make - 6. $ cd pjsip-apps/src/python - 7. $ sudo make - - Test the installation of the library by typing: - $ python - > import pjsua - > ^Z - $ - - If you don't get any error message while importing the library, you are done. - - 1.b. Setproctile library - - You need to install "easy_install" first: - $ sudo apt-get install python-setuptools - - - Now install setproctile using the following command: - $ sudo easy_install setproctitle - - 1.c. Install socket library for python: - - $ sudo apt-get install python-serial - - 1.d. Installing PhpMyAdmin: - - $ sudo apt-get install phpmyadmin - - 1.e. Install MySQL Server: - - $ sudo apt-get install mysql-server - - 1.f. Install MySQLDB library for python: - - $ sudo apt-get install python-mysqldb - -2. Configuration of the SSH to make a virtual tunnel with the GSMBoxes. - Tutorials how to configure the SSH tunneling are in the report, chapter 7.1 or you can see it on the given link which we used as well: - http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/ - - - The software communicates with the Beagle box using the port number 7884. If you have some problems on the beagle board and need to reinstall the system, please make sure that the SSH port is 7884. - -3. Configuring HTTPS and .htaccess on the server. You can find the tutorials how to configure HTTPS and .htaccess in the report, section 7.2. - -4. The username and password for MySQL. - The default username and password are stored in these files: initTestClass.py, GsmSelfTest.py, UsbDetectClass.py and truthtableClass.py in the initDB() function. You need to edit your login information for the database in these files. - -5. To start the software testing, you need first to start manually startSoftware.py: - - $ python startSoftware.py - - - diff --git a/Under-Testing/Server-Code-New/.DS_Store b/Under-Testing/Server-Code-New/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/Under-Testing/Server-Code-New/.DS_Store and /dev/null differ diff --git a/Under-Testing/Server-Code-New/._.DS_Store b/Under-Testing/Server-Code-New/._.DS_Store deleted file mode 100644 index 941570a..0000000 Binary files a/Under-Testing/Server-Code-New/._.DS_Store and /dev/null differ diff --git a/Under-Testing/Server-Code-New/._handler.txt b/Under-Testing/Server-Code-New/._handler.txt deleted file mode 100644 index a322a67..0000000 Binary files a/Under-Testing/Server-Code-New/._handler.txt and /dev/null differ diff --git a/Under-Testing/Server-Code-New/ClientClass.py b/Under-Testing/Server-Code-New/ClientClass.py deleted file mode 100644 index 46c3b00..0000000 --- a/Under-Testing/Server-Code-New/ClientClass.py +++ /dev/null @@ -1,123 +0,0 @@ -import socket -import sys -import os -import string -import signal - -class TimeoutException(Exception): - pass - -class Connection: - def __init__(self, h, p): - self.host = h - self.port = p - self.s = None - self.connected = 0 - - self.debugMode = 0 - - def connect(self): - self.s = None - - for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM): - af, socktype, proto, canonname, sa = res - try: - self.s = socket.socket(af, socktype, proto) - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets - except socket.error, msg: - self.s = None - self.connected = 0 - continue - try: - self.s.connect(sa) - except socket.error, msg: - self.s.close() - self.connected = 0 - self.s = None - continue - break - if self.s is None: - self.connected = 0 - return 0 #couldn't connect to the server - else: - self.connected = 1 - return 1 #successfully connected to the server - - def sendData(self, data): - if self.connected == 1: - try: - self.s.send(data) - return 1 - except Exception, e: - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connected = 0 - return 2 - - else: - return 0 - - def receiveData(self, timeout): - if self.connected == 1: - - def timeout_handler(signum, frame): - raise TimeoutException() - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(timeout) #start the timeout alarm, for timeout seconds - try: - data = self.s.recv(1024) - - #stop the timeout function - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - return data - - - except TimeoutException: - #timeout happened - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'TIMEOUT' - - except Exception, e: - - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - error = str(e) - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connected = 0 - if error[0:11] == '[Errno 104]': - return 3 #the other side reset the connection,[Errno 104] Connection reset by peer - - return 2 - else: - return 0 - - def closeConnection(self): - if self.connected == 1: - try: - self.connected = 0 - SHUT_RDWR = 2 - self.s.shutdown(SHUT_RDWR) - self.s.close() - return 1 - except Exception, e: - self.connected = 0 - error = str(e) - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - if error[0:11] == '[Errno 107]': - return 3 #the other side closed the connection before us, [Errno 107] Transport endpoint is not connected - return 2 - else: - return 0 diff --git a/Under-Testing/Server-Code-New/ControllerClass.py b/Under-Testing/Server-Code-New/ControllerClass.py deleted file mode 100644 index 4ed0d9d..0000000 --- a/Under-Testing/Server-Code-New/ControllerClass.py +++ /dev/null @@ -1,361 +0,0 @@ -import sys -import os -import subprocess -import SSHTunnelBoxClass -import ClientClass -import random -import csv - -import LogFileClass -logger = LogFileClass.Logging('TestProcessLog.log') - -from time import sleep - - -class controller: - - def __init__(self, callFrom, callPortName, accCaller, callTo, destPortName, destNo, accDest): - - self.callFrom = callFrom - self.dest = callTo - self.destNo = destNo - self.accDest = accDest - self.accCaller = accCaller - self.callPortName = callPortName - self.destPortName = destPortName - self.portCaller = None - self.portDest = None - self.resultCaller = None - self.resultDest = None - self.testResult = None - - def FuncTest(self): - - logger.logEvent(' -- -X- --') - - self.initCaller() - - if self.callFrom =="GSMRZ3" or self.callFrom =="GSMRZ2": # wait until ssh connection establish - if self.continues == 1: - #putting 6 seconds sleep to prevent unsuccess login using SSH since we have problem with duration time loging into beagle board - sleep(6) - self.callerGreeting() - else: - self.connected = 'NOT OK' - else: - #waiting 2 seconds if doesnt use ssh connection until handler ready - sleep(2) - self.callerGreeting() - - logger.logEvent('Status Handler Connection :'+self.connected) - if self.connected == 'OK': - - self.caller.sendData('CALLER|'+self.destNo) - callerHandler = self.caller.receiveData(25) - #waiting ready message from caller - - if callerHandler == "CALLER READY": - logger.logEvent('Caller handler : Ready') - self.initReceiver() - if self.dest =="GSMRZ3" or self.dest =="GSMRZ2": # wait until ssh connection establish - if self.continues == 1: - #putting 6 seconds sleep to prevent unsuccess login using SSH since we have problem with duration time loging into beagle board - sleep(6) - self.receiverGreeting() - else: - self.connected = 'NOT OK' - else: - #waiting 2 seconds if doesnt use ssh connection until handler ready - sleep(2) - self.receiverGreeting() - - logger.logEvent('Status Handler Connection :'+self.connected) - if self.connected == 'OK': - - self.receiver.sendData('RECEIVER') - destHandler = self.receiver.receiveData(25) - #waiting ready message from destination - - if destHandler == 'RECEIVER READY': - logger.logEvent('Receiver handler : Ready') - self.startCall() - self.waitingFeedback() - - #Device destination having error after handler ready to receive call. - elif destHandler == 'DEVICE NOT READY': - self.testResult == 802 - logger.logEvent('802 General Device Error: Destination device no respond timeout') - self.initTerminate() - else: - self.testResult = 604 - logger.logEvent('604 General Handler Error: Destination handler no respond timeout') - self.initTerminate() - - #can connect to handler but device destination not ready to do the test. - elif self.connected == 'DEVICE NOT READY': - self.testResult = 802 - logger.logEvent('802 General Device Error: Destination device no respond timeout') - self.initTerminate() - else: - logger.logEvent('998 General Handler Error: Could not connect Destination handler') - self.testResult = 998 - self.caller.sendData('TERMINATE CONNECTION') - self.caller.closeConnection() - self.initCancelTest() - else: - self.testResult = 605 - logger.logEvent('605 General Handler Error: caller handler no respond timeout') - - self.caller.sendData('TERMINATE CONNECTION') - self.caller.closeConnection() - - #can connect to handler but device caller not ready to do the test. - elif self.connected == 'DEVICE NOT READY': - self.testResult = 801 - self.caller.sendData('TERMINATE CONNECTION') - self.caller.closeConnection() - logger.logEvent('802 General Device Error: Caller device no respond timeout') - self.initCancelTest() - else: - self.testResult = 999 - logger.logEvent('999 General Handler Error: Could not connect to Caller handler') - - def writeToFile(self, AccountInfo): - try: - with open('handler.txt', 'w') as F: - writer = csv.writer(F) - writer.writerow([AccountInfo]) - F.close() - except ValueError: - print "can't write to file" - - def initCancelTest(self): - #close SSH connection when using gsmBox and destination doesnt respond. to make sure SSH connection are terminate - logger.logEvent('init Cancel test') - if self.callFrom[0:5] == 'GSMRZ': - if self.callFrom != 'GSMRZ1': - # close SSH tunneling - self.boxCaller.killTunneling() - - # waiting results state - def waitingFeedback(self): - logger.logEvent('Waiting Feedback') - self.resultDest = self.receiver.receiveData(20) - self.resultCaller = self.caller.receiveData(20) - #print 'result '+self.resultCaller+'--'+self.resultDest - if self.resultCaller == 'DEVICE NOT READY': - logger.logEvent('Task :'+self.callFrom+' - '+self.dest) - logger.logEvent('Caller DEVICE NOT READY') - self.testResult = 801 - self.initTerminate() - - elif self.dest == 'DEVICE NOT READY': - logger.logEvent('Task :'+self.callFrom+' - '+self.dest) - logger.logEvent('Caller DEVICE NOT READY') - self.testResult = 802 - self.initTerminate() - - elif self.resultCaller == 'CALL OK' and self.resultDest =='CALL OK': - logger.logEvent('Task :'+self.callFrom+' - '+self.dest) - logger.logEvent('Test Succeed') - self.testResult = 200 - self.initTerminate() - else: - #build specially only for Eplus card. since they use prepaid card. - if self.dest == 'GSMExt.Eplus': - if self.resultCaller == 'CALL OK' and self.resultDest <> 'TIME OUT': - logger.logEvent('Task :'+self.callFrom+' - '+self.dest) - logger.logEvent('Test Failed - Eplus No credit on Eplus') - self.testResult = 402 - self.initTerminate() - else: - logger.logEvent('Test Failed') - logger.logEvent('Task :'+self.callFrom+' - '+self.dest) - self.testResult = 486 - self.initTerminate() - - else: - #one or both of the handler send un success test. assign failed to this test - if self.resultCaller <> 'CALL OK' or self.resultDest <> 'CALL OK': - logger.logEvent('Task :'+self.callFrom+' - '+self.dest) - logger.logEvent('Test Failed') - self.testResult = 486 - self.initTerminate() - - #send start call message to caller - def startCall(self): - logger.logEvent('Start Call') - self.receiver.sendData('RECEIVE START') - self.caller.sendData('CALL START') - - def initAccount(self, account, handler, PortName, portCom): - - accConf = account - self.username = accConf[0:accConf.find(':')] - - line = accConf[accConf.find(':')+1:] - self.password = line[0:line.find(':')] - - newLine = line[line.find(':')+1:] - self.server = newLine[0:newLine.find(':')] - - textFile = 'Account:'+str(self.username)+':'+str(self.password)+':'+str(self.server)+':'+str(handler)+':'+str(PortName)+':'+str(portCom) - self.writeToFile(textFile) - - # define the caller configuration such as port name and port caller. - def initCaller(self): - logger.logEvent('init Caller') - logger.logEvent(self.callFrom) - self.portCaller = random.randint(30000,60000) - - if self.callFrom[0:4] == 'GSMR': - if self.callFrom =="GSMRZ1": - self.initAccount(self.accCaller,self.callFrom, self.callPortName,self.portCaller) - self.initGSM(self.portCaller, self.callPortName, self.callFrom) - else: - self.initAccount(self.accCaller, self.callFrom, self.callPortName,self.portCaller) - #open SSH tunneling - - self.boxCaller = SSHTunnelBoxClass.SSHTunneling(self.portCaller, 50008, self.server, self.username, self.password) - status = self.boxCaller.startTunneling() - logger.logEvent('SSH Status :'+str(status)) - - #check whether the SSH tunneling succes or not, 0 is failed! - if status!= 0: - self.continues = 1 - else: - self.continues = 0 - elif self.callFrom[0:4] == 'GSME': - self.initAccount(self.accCaller,self.callFrom, self.callPortName,self.portCaller) - self.initGSM(self.portCaller, self.callPortName, self.callFrom) - - else: - #open the SIP handler - self.initAccount(self.accCaller,self.callFrom, self.callPortName,self.portCaller) - script = 'SIPHandler.py' - subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - # define the destination configuration such as port name and port caller. - def initReceiver(self): - logger.logEvent('init Receiver') - logger.logEvent(self.dest) - self.portDest = random.randint(30000,60000) - - if self.dest[0:4] == 'GSMR': - if self.dest =="GSMRZ1": - self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) - self.initGSM(self.portDest, self.destPortName, self.dest) - else: - self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) - #open SSH tunneling - - self.boxDest = SSHTunnelBoxClass.SSHTunneling(self.portDest, 50008, self.server, self.username, self.password) - status = self.boxDest.startTunneling() - - #check whether the SSH tunneling succes or not, 0 is failed! - logger.logEvent('SSH Status :'+str(status)) - if status!= 0: - self.continues = 1 - else: - self.continues = 0 - - elif self.dest[0:4] == 'GSME': - self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) - self.initGSM(self.portDest, self.destPortName, self.dest) - - else: - #self.portDest = 50100 - self.initAccount(self.accDest, self.dest, self.destPortName,self.portDest) - script = 'SIPHandler.py' - subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - # send terminate message to Handlers - def initTerminate(self): - logger.logEvent('TERMINATE CONNECTION') - self.caller.sendData('TERMINATE CONNECTION') - self.receiver.sendData('TERMINATE CONNECTION') - - if self.callFrom[0:5] == 'GSMRZ': - if self.callFrom != 'GSMRZ1': - # close SSH tunneling - self.boxCaller.killTunneling() - if self.dest[0:5] == 'GSMRZ': - if self.dest != 'GSMRZ1': - # close SSH tunneling - self.boxDest.killTunneling() - - #close port communication - self.receiver.closeConnection() - self.caller.closeConnection() - - def callerGreeting(self): # send greeting message to the caller handler - logger.logEvent('Caller Greeting') - self.connected = None - #open connection to the Handler - self.caller = ClientClass.Connection('localhost',self.portCaller) - self.caller.connect() - - if self.caller.connected == 1: - #connection establish and send hallo message to handler - logger.logEvent('Connected to Caller Handler') - self.caller.sendData('HELLO HANDLER') - #waiting handler respond - message = self.caller.receiveData(20) - - if message == 'HELLO CONTROLLER': - # caller handler send hello message - logger.logEvent('Caller Handler respond') - self.connected = 'OK' - elif message == 'DEVICE NOT READY': - # the handler found the device not ready to making test. - logger.logEvent('Connect to Caller but device doesnt work') - self.connected = 'DEVICE NOT READY' - else: - logger.logEvent('Cannt connect to Caller') - self.connected = 'NOT OK' - else: - #can't connect to caller handler - logger.logEvent('Cannt connect to Caller') - self.connected = 'NOT OK' - - def receiverGreeting(self): # send greeting message to the destination handler - logger.logEvent('Receiver Greeting') - self.connected = None - - #open connection to the Handler - self.receiver = ClientClass.Connection('localhost', self.portDest) - self.receiver.connect() - - if self.receiver.connected == 1: - #connection establish and send hallo message to handler - logger.logEvent('Connected to Receiver Handler') - self.receiver.sendData('HELLO HANDLER') - #waiting handler respond - message = self.receiver.receiveData(20) - - # destination handler send hello message - if message == 'HELLO CONTROLLER': - logger.logEvent('Receiver Handler respond') - self.connected = 'OK' - - # the handler found the device not ready to making test. - elif message == 'DEVICE NOT READY': - logger.logEvent('Connect to Caller but device doesnt work') - self.connected = 'DEVICE NOT READY' - else: - logger.logEvent('receiver handler not respond') - self.connected = 'NOT OK' - else: - #can't connect to destintaion handler - logger.logEvent('Cannt connect to Receiver') - self.connected = 'NOT OK' - - def initGSM(self, portCommunication, portDevice, handler): - #open GSM Handler - logger.logEvent('Init GSM') - script = 'GSMHandler.py' - subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - - - diff --git a/Under-Testing/Server-Code-New/DbClass.py b/Under-Testing/Server-Code-New/DbClass.py deleted file mode 100644 index d937eb1..0000000 --- a/Under-Testing/Server-Code-New/DbClass.py +++ /dev/null @@ -1,445 +0,0 @@ -import MySQLdb -import string - -class DBMySQLConnection: - def __init__(self): - #initialize at the start all the user parameters - self.usern = "root" - self.passw = "" - self.host = "localhost" - self.db = "gsmselftesting" - self.connectionCreated = 0 - self.tasksList = list() - self.callerLists = list() - self.errCode = None - self.deviceUpdate = None - self.lockSet = 0 - global debugMode - debugMode = 0 - - def connectDB(self): - try: - #try to connect - self.datBaseConn=MySQLdb.connect(self.host,self.usern, self.passw,self.db) - self.datBaseConn.paramstyle = 'format' - self.cur = self.datBaseConn.cursor() #make the cursor, used for sending queries - self.connectionCreated = 1 #use it as an indicator that the connection was created - return 1 - - except MySQLdb.Error, e: - #if we have an error then try to catch it - error=str(e) - if error[1:5] == '1045': - #wrong username or password - return 0 - elif error[1:5] == '2002': - #can't connect to mysql, mysql shutdown or wrong host - return 2 - else: - if debugMode == 1: - print error - return 3 - - def closeDBConn(self): - #close the connection to the database here - if self.connectionCreated == 1: - try: - #close the cursor and then the connection to the DB - self.cur.close() - self.datBaseConn.close() - return 1 - except MySQLdb.Error, e: - #in case of an error - if debugMode == 1: - error = str(e) - print error - return 3 - else: - #I never really had a connection - return 0 - - def anyTasksToDo(self): - #see are there any jobs to be executed and make a list out of it - if self.connectionCreated == 1: - try: - self.cur.execute("SELECT * FROM TempTaskTable") - output = self.cur.fetchall() #get the mysql response - #parse the output from the mysql by creating a list - #with lists where each attribue(column) gets independent - #element of the list - for record in output: - columns = list() - for entry in record: - columns.append(str(entry)) - #columns.append(str(0)) - self.tasksList.append(columns) - - if not self.tasksList: - return 0 - else: - return 1 - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1146': - return 2 #the table doesn't exist - if debugMode == 1: - print str(e) - return 3 - else: - return 0 - - def cleanTasksList(self): - if self.connectionCreated == 1: - del self.tasksList[:] - return 1 - else: - return 0 - - - def deviceAddress(self,deviceName): - if self.connectionCreated == 1: - try: - successful = self.cur.execute("SELECT `portName`,`number`, `username`, `password`, `server` FROM DeviceAddressTable where `deviceName`=%s", deviceName) - output = self.cur.fetchall() - deviceAddr = '' - for record in output: - columns = list() - for entry in record: - columns.append(str(entry)) - deviceAddr = columns - - return deviceAddr - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1146': - return 2 #the table doesn't exist - if debugMode == 1: - print str(e) - return 3 #some error happened - else: - return 0 #I am not connected - def deviceList(self): # taking all device list and put it in the list - deviceLists = list() - if self.connectionCreated == 1: - try: - tuple = self.cur.execute("SELECT `deviceName` FROM DeviceAddressTable") - output = self.cur.fetchall() - - for record in output: - columns = list() - for entry in record: - columns.append(str(entry)) - deviceLists.append(columns) - return deviceLists - -#return deviceAddr - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1146': - return 2 #the table doesn't exist - if debugMode == 1: - print str(e) - return 3 #some error happened - else: - print 'not conn' - return 0 #I am not connected - - def GSMPrefix(self): - if self.connectionCreated == 1: - try: - successful = self.cur.execute("SELECT * FROM GSMPrefix") - output = self.cur.fetchall() #get the mysql response - GSMListPrefix = list() - for record in output: - columns = list() - for entry in record: - columns.append(str(entry)) - GSMListPrefix.append(columns) - - return GSMListPrefix - - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1146': - return 2 #the table doesn't exist - if debugMode == 1: - print str(e) - return 3 #some error happened - else: - return 0 #I am not connected - - def updateGSMDevice(self, deviceName, newPortName, newNumber): - if self.connectionCreated == 1: - try: - try: - #delete old device portName which assign to this port, to prevent double port address in the table. - stmt = "UPDATE DeviceAddressTable SET portName = 'missing' WHERE portName = '"+newPortName+"'" - self.cur.execute(stmt) - except ValueError: - print "Error execute query" - - stmt = "UPDATE DeviceAddressTable SET portName = '"+ newPortName + "', number = '"+ newNumber+ "' WHERE deviceName = '" + deviceName+ "'" - self.cur.execute(stmt) - return 1 - - except MySQLdb.Error, e: - if debugMode == 1: - print str(e) - return 3 - else: - return 0 - - def updatePingResult(self, taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2): - if self.connectionCreated == 1: - try: - successful = self.cur.execute("INSERT INTO PingResultTable(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) VALUES ('%i', '%i','%i', '%i','%i','%i')"%( int(taskNo),int(sipServer), int(sipGate), int(unisip), int(gsmBox1), int(gsmBox2))) - - output = self.cur.fetchone() - - if debugMode == 1: - print output - if successful == 0: - return 1 #ping table updated - else: - return 4 #the taskNo didn't exist - - - except MySQLdb.Error, e: - if debugMode == 1: - print str(e) - return 3 - else: - return 0 - - def deleteTempTask(self, taskID): - if self.connectionCreated == 1: - try: - successful = self.cur.execute("DELETE FROM TempTaskTable WHERE taskID=%i"%(int(taskID))) - output = self.cur.fetchone() - - if debugMode == 1: - print output - - if successful == 1: - return 1 #deleted it - else: - return 4 #that taskID didn't exist or something else - except MySQLdb.Error, e: - if debugMode == 1: - print str(e) - return 3 - - else: - return 0 - - def addResult(self, taskID, result): - if self.connectionCreated == 1: - try: - successful = self.cur.execute("INSERT INTO ResultTable(taskID, result) VALUES ('%i', '%i')"%(int(taskID), int(result))) - output = self.cur.fetchone() - - if debugMode == 1: - print output - if successful == 1: - return 1 #successfully added the result - else: - return 4 #hmmm - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1062': - return 2 #duplicate entry for the key - if debugMode == 1: - print str(e) - return 3 - else: - return 0 - - - def errorCode(self,code): - if self.connectionCreated == 1: - try: - successful = self.cur.execute("SELECT description FROM ErrorCodeTable where `respondCode`=%s", code) - data = self.cur.fetchone() - self.errCode = data[0] - return self.errCode - - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1146': - return 2 #the table doesn't exist - if debugMode == 1: - print str(e) - return 3 #some error happened - else: - return 0 #I am not connected - - def lockMutex(self, seconds): - if self.connectionCreated == 1: - try: - successful = self.cur.execute("SELECT IS_FREE_LOCK('SoftwareStarted')") - output = self.cur.fetchone() - if output[0] == 1: - #resource is free which means software is not started yet - successful = self.cur.execute("SELECT GET_LOCK('SoftwareStarted', %i)"%(int(seconds))) - - output1 = self.cur.fetchone() - if output1[0] == 1: - #I got the lock now - self.lockSet = 1 - return 1 - elif output1[0] == 0: - return 7 #if the attempt timed out (for example, because another client has previously locked the name) - else: - return 6 # if an error occurred (such as running out of memory or the thread was killed with - elif output[0] ==0: - return 4 #software is already running and somebody has allocated the mutex - else: - #means some not so good bug - return 5 # if an error occurs (such as an incorrect argument). - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1062': - return 2 #duplicate entry for the key - if debugMode == 1: - print str(e) - return 3 - else: - return 0 - - def maxTaskNo(self): - if self.connectionCreated == 1: - try: - succ = self.cur.execute("SELECT max(taskNo) FROM TaskTable") - taskNo = self.cur.fetchone() - self.taskNo = taskNo[0] - if self.taskNo == None or self.taskNo == '0' or self.taskNo == '' or self.taskNo == 0: - self.taskNo = 1 - else: - self.taskNo = int(self.taskNo) +1 - return self.taskNo - - except MySQLdb.Error, e: - error = str(e) - message = 'error' - if debugMode == 1: - print str(e) - if error[1:5] == '1062': - return message #duplicate entry for the key - - return message - else: - return 0 - - def maxTaskID(self): - if self.connectionCreated == 1: - try: - succ = self.cur.execute("SELECT max(taskID) FROM TaskTable") - taskID = self.cur.fetchone() - self.taskID = taskID[0] - if self.taskID == None or self.taskID == '0' or self.taskID == '' or self.taskID == 0: - self.taskID = 1 - return self.taskID - - except MySQLdb.Error, e: - error = str(e) - message = 'error' - if debugMode == 1: - print str(e) - if error[1:5] == '1062': - return message #duplicate entry for the key - - return message - else: - return 0 - - def insertTask(self, taskNo, fromDevice, toDevice): - if self.connectionCreated == 1: - try: - newQuery = ("INSERT INTO `TaskTable` (`taskNo`,`from`,`to`) VALUES ('"+str(taskNo)+"','" +str(fromDevice)+ "', '"+str(toDevice)+"')") - successful = self.cur.execute(newQuery) - output = self.cur.fetchone() - - return 1 - - if debugMode == 1: - print output - - except MySQLdb.Error, e: - error = str(e) - if debugMode == 1: - print str(e) - if error[1:5] == '1062': - return 2 #duplicate entry for the key - return 3 - else: - return 0 - def insertTaskIn2(self, fromDevice, toDevice, taskNo): - if self.connectionCreated == 1: - try: - #we used here a transaction since I want the mysql to execute a few commands and tell me was it successful rather than to execute some and there happens a mistake and one part is updated and the other isn't - newQuery = "START TRANSACTION; INSERT INTO `TaskTable` (`taskNo`, `from`, `to`) VALUES ('" + str(taskNo) + "', '" + str(fromDevice) + "', '" + str(toDevice) +"'); SELECT @taskID := LAST_INSERT_ID(); INSERT INTO `TempTaskTable` (`taskID`, `taskNo`, `from`, `to`) VALUES (@taskID, '" + str(taskNo) + "', '" + str(fromDevice) + "', '"+ str(toDevice) + "'); COMMIT;" - - successful = self.cur.execute(newQuery) - output = self.cur.fetchone() - while self.cur.nextset() is not None: pass - - return 1 - - if debugMode == 1: - print output - - except MySQLdb.Error, e: - error = str(e) - if debugMode == 1: - print str(e) - if error[1:5] == '1062': - return 2 #duplicate entry for the key - return 3 - else: - return 0 - def releaseMutex(self): - if self.connectionCreated == 1: - try: - if self.lockSet == 1: - successful = self.cur.execute("SELECT IS_FREE_LOCK('SoftwareStarted')") - output = self.cur.fetchone() - if output[0] == 1: - #the lock seems to be free - self.lockSet = 0 - return 4 - - elif output[0] == 0: - - #try to release the lock - successful = self.cur.execute("SELECT RELEASE_LOCK('SoftwareStarted')") - output1 = self.cur.fetchone() - self.lockSet = 0 - if output1[0] == 1: - #the lock was released successfully - return 1 - - elif output1[0] == 0: - # if the lock was not established by this thread (in which case the lock is not released) - return 5 - else: - # and NULL if the named lock did not exist. The lock does not exist if it was never obtained by a call to GET_LOCK() or if it has previously been released. - return 6 - else: - #some serious problem - #and NULL if an error occurs (such as an incorrect argument). - return 5 - - else: - return 7 #the lock wasn't set - - except MySQLdb.Error, e: - error = str(e) - if error[1:5] == '1062': - return 2 #duplicate entry for the key - if debugMode == 1: - print str(e) - return 3 - else: - return 0 - - diff --git a/Under-Testing/Server-Code-New/GSMClass.py b/Under-Testing/Server-Code-New/GSMClass.py deleted file mode 100644 index b932ab5..0000000 --- a/Under-Testing/Server-Code-New/GSMClass.py +++ /dev/null @@ -1,310 +0,0 @@ -from serial import * #serial port library -import string -import sys -import signal - -class TimeoutException(Exception): - pass - -class serialPort(): - - def __init__(self, portAddress, baudRate, timeout): - self.portAddress = portAddress - self.portExist = 0 - self.ser = 0 - self.baudRate = baudRate - self.signalStrength = 0 - #self.callerConnected = -1 - self.timer = timeout - self.timer1 = timeout - self.start = 0 - - self.debugMode = 0 - - def portInit(self, timeout1): - portName = self.portAddress[-4:] - portExist = os.popen('dmesg | grep ' + portName).read() - self.timer = timeout1 - if portExist == '': - return 0 - else: - try: - self.ser = Serial( - port=self.portAddress, - baudrate=self.baudRate, - bytesize=EIGHTBITS, - parity=PARITY_NONE, - stopbits=STOPBITS_ONE - #timeout=0, - #writeTimeout=0 - #xonxoff=0, - #rtscts=0 - #interCharTimeout=None - #I didn't need to set these variables :) - ) - self.ser.flushOutput() #clean the output buffer from the serial port - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT\r') - - received = self.__receiveData() - self.start=1 - if received == 'OK': - self.portExist = 1 - return 1 #cellphone is OK, receives commands - elif received == 'TIMEOUT': - return 'TIMEOUT' - else: - return 2 #cellphone has an error - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - - self.portExist = 3 - return 3 - - def callNumber(self,numberToCall): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('ATD'+str(numberToCall)+';\r') - if self.__receiveData() == 'OK': - return 1 - else: - return 4 - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - - return 3 - else: - return 0 - - - def hangUp(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CHUP\r') - received = self.__receiveData() - if received == 'OK': - return 1 - elif received == 'ERROR': - return 2 #other side hang up the call - else: - return 4 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - - def closePort(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.close() - return 1 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def getSignalQuality(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CSQ\r') - if self.__receiveData() == 'OK': - if self.__receiveData == 'SIGNAL': - return 1 - else: - return 4 - else: - return 2 - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - - else: - return 0 - - def receiveCall(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - if self.__receiveData() == 'RING': - self.ser.write('ATA\r') - if self.__receiveData()=='OK': - return 1 - else: - return 4 - else: - return 2 - - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def currentCall(self): - if self.portExist == 1: - try: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CLCC\r') - received = self.__receiveData() - if received == 'OK': - return 2 #not yet in a call - elif received == 'ACTIVE': - return 1 #in a call - elif received == 'HELD': - return 5 #held call - elif received == 'DIALING': - return 6 #dialing - elif received == 'ALERTING': - return 7 #alerting the call - elif received == 'INCOMING': - return 8 #incoming call - elif received == 'WAITING': - return 9 #waiting for a call - - else: - return received #in some other state - except Exception, e: - import traceback - if self.debugMode == 1: - print e - print traceback.format_exc() - return 3 - else: - return 0 - - def __receiveData(self): - def timeout_handler(signum, frame): - raise TimeoutException() - if self.start == 0: - self.timer = 5 - else: - self.timer = self.timer1 - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(self.timer) - - bufferData = '' - lines = '' - line = '' - - try: - while True: - bufferData = bufferData + self.ser.read(self.ser.inWaiting()) #read the serial port and add it to the buffer variable - if '\n' in bufferData: #if a new line character is found in the buffer then the cellphone has sent something - lines = bufferData.split('\n') #parse the buffer variable with the new line character - last_received = lines.pop(0) #put into last_received variable the first content from lines (FIFO) - - bufferData = '\n'.join(lines) #add a new line to the buffer variable - - last_received=last_received.split('\n') #parse the last received value with new lines - line = last_received[0].replace(chr(13), '') #remove \r from the first parsed value in last_received and return me a nicely parsed value :) - if self.debugMode == 1: - if len(line) > 0: - print line - - if line == 'OK': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'OK' - - elif line == 'ERROR': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ERROR' - - elif line[0:11] == '+CME ERROR:': - if self.debugMode == 1: - print 'ERROR:', line - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ERROR' - - elif line == 'RING': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'RING' - - elif line[0:5] == '+CSQ:': #+CSQ: - space = int(string.find(line,' '))+1 #find the (space) sign - coma = int(string.find(line,',')) #find the , (coma) sign - self.signalStrength = (int(line[space:coma])*2)-113 - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'SIGNAL' - - elif line == 'NO CARRIER': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'NO CARRIER' - - elif line == 'BUSY': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'BUSY' - - elif line[0:6] == '+CLCC:': - #+CLCC: 1,0, - #self.ser.flushInput() - if line[11:12] == '0': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ACTIVE' - elif line[11:12] == '1': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'HELD' - elif line[11:12] == '2': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'DIALING' - elif line[11:12] == '3': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'ALERTING' - elif line[11:12] == '4': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'INCOMING' - elif line[11:12] == '5': - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'WAITING' - - except TimeoutException: - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'TIMEOUT' - - except Exception, e: - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - print 'NO GOOD' - print e - return 3 diff --git a/Under-Testing/Server-Code-New/GSMHandler.py b/Under-Testing/Server-Code-New/GSMHandler.py deleted file mode 100644 index 1379fe9..0000000 --- a/Under-Testing/Server-Code-New/GSMHandler.py +++ /dev/null @@ -1,372 +0,0 @@ -import ServerClass -import GSMClass -import LogFileClass -from time import sleep -import sys -import setproctitle -import csv -global sipServer, username, password, handler -global portListen -global portAddress -global nameOfLogFile - -def initLogfile(): - global nameOfLogFile - - nameOfLogFile = str(handler)+' handler.log' - -def writeToFile(): - try: - string = '--' - with open('handler.txt', 'w') as F: - writer = csv.writer(F) - writer.writerow([string]) - F.close() - except ValueError: - print "can't write to file" - -def openFile(): - global sipServer, username, password, handler - global portListen - global portAddress - - #String format: 'Account:username:password:server:handler:PortName:portCaller - File = open('handler.txt') - reader = csv.reader(File, delimiter=':') - for row in reader: - if str(row[0]) == 'Account': - handler = str(row[4]) - portAddress = str(row[5]) - portListen = int(row[6]) - File.close() - writeToFile() - -baudRate = 19200 - -#Taking account information -openFile() - -#start Logging -initLogfile() -logger = LogFileClass.Logging(nameOfLogFile) -logger.logEvent('') - -errorCount = 0 - -whileCounter =0 - -#define global varibales -global lastState -global resetState -global deviceError -lastState = 0 -resetState = 0 -deviceError = 0 - - - -def initSystem(): - - - global handlerSocket - global gsmDevice - global initTalkVar - global lastState - global initDevice - global numberToCall - global resetState - global deviceError - - initTalkVar = 0 #variable used to know if we initialized the start talk - lastState = 0 #variable used to know - numberToCall = '000' #number to call - resetState = 0 - - handlerSocket = ServerClass.ServerHandler(portListen) - logger.logEvent('LISTEN ON PORT: '+str(portListen)) - anyConnection = handlerSocket.openSocket() - - try : - logger.logEvent('Trying connect to the device') - gsmDevice = GSMClass.serialPort(portAddress, baudRate, 15) - initDevice = gsmDevice.portInit(5) - logger.logEvent('init device ' + str(initDevice)) - - except ValueError: - logger.logEvent('Failure when trying connect to device') - - ######################################################## - - - if initDevice!= 1: - deviceError = 1 - else: - deviceError = 0 - - - if anyConnection == 1 and initDevice == 1: - logger.logEvent('CONNECTION ESTABLISHED AND DEVICE WORKING: ' + str(handlerSocket.connectedTo())) - return 1 - - elif anyConnection == 1 and initDevice != 1: - logger.logEvent('$connection established but device not working: ' + str(handlerSocket.connectedTo())) - resetState = 1 - return 2 - else: - logger.logEvent('$no connection') - logger.logEvent('$else case in init system' + str(anyConnection) + ' ' + str(initDevice) + ' ') - resetState = 1 - - return 0 - - - -def receiveMessage(timeout): - - message = str(handlerSocket.receiveData(timeout)) - print 'I RECEIVED THE FOLLOWING MESSAGE' + message - if message == 'NO DATA': - print 'try to close the connection' + str(handlerSocket.closeConnection()) - global resetState - resetState = 1 - return 1 - if message != '0' and message !='NO DATA': - print 'in receive message', message, lastState - - if message == 'HELLO HANDLER' and lastState == 0: - outcome = initTalk() - if outcome == 1: - logger.logEvent('TALK INITIALIZATION SENT') - else: - logger.logEvent('$talk initialization not sent: ' + str(outcome)) - - elif message == 'RECEIVER' and lastState == 1: - outcome = initReceiver() - if outcome == 1: - logger.logEvent('RECEIVER READY SENT') - else: - logger.logEvent('$receiver ready not sent: ' + str(outcome)) - return 7 - - elif message == 'RECEIVE START' and lastState == 2: - outcome = receiveStart() - print 'outcome ' + str(outcome) - if outcome == 1: - logger.logEvent('RECEIVE STATUS REPORTED') - return 2 - else: - logger.logEvent('$receive status not reported: ' + str(outcome)) - return 3 - - elif message[0:6] == 'CALLER' and lastState == 1: - outcome = initCaller() - - global numberToCall - numberToCall = message[7:] - if outcome == 1: - logger.logEvent('CALLER READY SENT') - else: - logger.logEvent('$caller ready not sent: ' + str(outcome)) - return 6 - - elif message == 'CALL START' and lastState == 4: - outcome = callStart(numberToCall) - print 'outcome ' + str(outcome) - if outcome == 1: - logger.logEvent('CALLER STATUS SENT') - return 4 - else: - logger.logEvent('$caller status not sent: ' + str(outcome)) - return 5 - - elif message == 'TERMINATE CONNECTION' and (lastState == 5 or lastState == 3): - outcome = terminateConnection() - if outcome == 1: - logger.logEvent('TERMINATED THE CONNECTION AFTER TEST') - else: - logger.logEvent('$connection could not be terminated after the test: ' + str(outcome)) - - elif message == 'TERMINATE CONNECTION': - outcome = terminateConnection() - if outcome == 1: - logger.logEvent('TERMINATED THE CONNECTION IN MIDDLE. IN STATE: ' + str(lastState) ) - else: - logger.logEvent('$connection could not be terminated in middle: ' + str(outcome) + ' in state: ' + str(lastState)) - else: - print message - outcome = other() - logger.logEvent('other appeared') - - return 1 - #return 0 - -########INIT TALK PART######## -def initTalk(): - print 'init talk' - #initialize the talk between handler and controller - global lastState - test = gsmDevice.portInit(2) - if test != 1: - test = gsmDevice.portInit(2) - if test != 1: - sendMessage = handlerSocket.sendData('DEVICE NOT READY') - else: - lastState = 1 - sendMessage = handlerSocket.sendData('HELLO CONTROLLER') - else: - lastState = 1 - sendMessage = handlerSocket.sendData('HELLO CONTROLLER') - return sendMessage -############################## - - -########RECEIVE PART######## -def initReceiver(): - print 'initReceiver' - - #init function to initialize the receiver - global lastState - lastState = 2 - sendMessage = handlerSocket.sendData('RECEIVER READY') - return sendMessage - -def receiveStart(): - print 'receiveStart' - - #wait for a call and report if you received it and it was successfull or not - global lastState - global deviceError - lastState = 3 - if deviceError == 0: - receiveCall = gsmDevice.receiveCall() - if receiveCall == 'TIMEOUT': - deviceError = 1 - print 'device error in RECEIVE' - else: - receiveCall = 0 - - if deviceError == 0: - if receiveCall == 1: - callSuccess = 'CALL OK' - else: - callSuccess = 'CALL NOT OK' - if deviceError==0: - tryHangUp = gsmDevice.hangUp() - sendMessage = handlerSocket.sendData(callSuccess) - - return sendMessage -############################ - - -########CALL PART######## -def initCaller(): - print 'initCaller1' - - #initialize caller here - global lastState - lastState = 4 - sendMessage = handlerSocket.sendData('CALLER READY') - return sendMessage - -def callStart(numberToCall): - print 'initCaller2' - - #call the number here - global lastState - global deviceError - lastState = 5 - - callSuccess = 'CALL NOT OK' - - if deviceError==0: - tryCall = gsmDevice.callNumber(numberToCall) - if tryCall == 'TIMEOUT': - deviceError = 1 - print 'device error in CALL' - else: - tryCall=0 - - - if tryCall != 1: - callSuccess = 'CALL NOT OK' - else: - print 'try call result'+ str(tryCall) - if tryCall != 'TIMEOUT': - sleep(2) - activeCall = gsmDevice.currentCall() - counter = 0 - while(activeCall!=1): - sleep(1) - activeCall = gsmDevice.currentCall() - if counter == 10: - break - counter += 1 - - if activeCall == 1: - callSuccess = 'CALL OK' - else: - callSuccess = 'CALL NOT OK' - - if deviceError==0: - try: - tryHangUp = gsmDevice.hangUp() - except ValueError: - print 'Error when try hangup the call' - handResponse = handlerSocket.sendData(callSuccess) - - return handResponse -######################### - - -########TERMINATE PART######## -def terminateConnection(): - print 'terminate connection' - global resetState - close = handlerSocket.closeConnection() - resetState = 1 - sys.exit(0.5) - return close -############################## - -########TERMINATE PART######## -def other(): - print 'other' - global lastState - global resetState - - close = handlerSocket.closeConnection() - lastState = 8 - resetState = 1 - return 1 -############################## - -setproctitle.setproctitle('GSM Handler') - -try: - - test = initSystem() - if test == 1: - print 'initialized system' - receivedMessage = 0 - while receivedMessage < 8 and resetState!= 1: - if receivedMessage == 4 or receivedMessage == 5 or receivedMessage == 2 or receivedMessage == 3: - receivedMessage = receiveMessage(20) - else: - receivedMessage = receiveMessage(30) - elif test ==2: - print 'initialized system but device not working' - logger.logEvent('initialized system but device not working') - handlerSocket.sendData('DEVICE NOT READY') - - - elif test ==0: - print 'nobody can connect, reboot board, restart cellphone' - logger.logEvent('nobody can connect, reboot board, restart cellphone') - - logger.closeLogging() - del handlerSocket - del gsmDevice -except ValueError: - logger.logEvent('Could not start the handler') - logger.closeLogging() - diff --git a/Under-Testing/Server-Code-New/LogFileClass.py b/Under-Testing/Server-Code-New/LogFileClass.py deleted file mode 100644 index cb152f4..0000000 --- a/Under-Testing/Server-Code-New/LogFileClass.py +++ /dev/null @@ -1,21 +0,0 @@ -import string -import datetime - -class Logging: - - def __init__(self, logFileName): - self.writeToFile = open(logFileName, 'a') - self.justStarted = 1 - - def logEvent(self, event): - now = str(datetime.datetime.now()) - if self.justStarted == 1: - self.writeToFile.write('\n\n------------------STARTED THE LOGGING '+ now + ' ------------------\n') - self.justStarted = 0 - else: - self.writeToFile.write('On: '+ now + '\t' + 'Event: ' +str(event) + '\n') - - def closeLogging(self): - now = str(datetime.datetime.now()) - self.writeToFile.write('------------------FINISHED THE LOGGING '+ now + ' ------------------') - self.writeToFile.close() diff --git a/Under-Testing/Server-Code-New/PingClass.py b/Under-Testing/Server-Code-New/PingClass.py deleted file mode 100644 index e13b32b..0000000 --- a/Under-Testing/Server-Code-New/PingClass.py +++ /dev/null @@ -1,28 +0,0 @@ -import subprocess -import string - -class Ping: - - def __init__(self, pingAddress): - self.pingAddress = pingAddress - - def ping(self,numberTries): - tried = 1 - while numberTries >= tried: - tried += 1 - #the parameter c 1 means only one ping to be sent, parameter W 3 means how many seconds the time out should be, 3 seconds - ping_cmd = subprocess.Popen(['ping', self.pingAddress, '-c', '1', '-W', '2'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT).communicate()[0] - - pingAlive = int(string.find(ping_cmd, '1 received')) - unknownHost = int(string.find(ping_cmd, 'unknown host')) - - - if pingAlive != -1: - break - - if unknownHost != -1: - return 2 #unknown host - if pingAlive != -1: - return 1 #ping works fine - else: - return 0 #no ping response diff --git a/Under-Testing/Server-Code-New/READ ME.txt b/Under-Testing/Server-Code-New/READ ME.txt deleted file mode 100644 index 0e2ff54..0000000 --- a/Under-Testing/Server-Code-New/READ ME.txt +++ /dev/null @@ -1,55 +0,0 @@ - -Class files: - - - ClientClass.py - This class file is used by the controller as socket communication class to communicate with the Handlers. - - - ServerClass.py - This class file is used by handlers as socket communication class to communicate with the controller. - - - GSMClass.py - This class file is used by GSM Handlers to control and talk to the mobile devices. - - - PingClass.py - This class file is used to ping GSMBoxes and servers in the system. - - - truthtableClass.py - This class file is used by the controller to find out how many nanoBTS's are installed in the University tecommunication network and it finds out the working (or not working) state of the University telecommunication network. - - - ControllerClass.py - This class file is used by the software to assign the tasks and start the handlers. - - - initTestClass.py - This class is used by the software to parse information from database class and to send the right device information to the controller class. - - - SSHTunnelBoxClass.py - This class is used by the software to communicate with the GSMBoxes (using SSH tunnel port forwarding). - - - usbDetectClass.py - This class is used to identify the right mobile device, port address and phone number. - - - DbClass.py - This class is used to fetch information from the database. - - - LogFileClass.py - This class is used to make the log files. - - - WebsiteCommClass.py - This class is used by the controller to communicate with the Website. - -Handler files: - - - GSMHandler.py - - SIPHandler.py - -Main Software: - - - startSoftware.py - This script file should be run manually after you login on the server machine. This script file is used to receive the message from the website and then it tries to start the controller software (main test software). - - - gsmselftest.py - This is the main software which is controlling the handlers, it also assigns tasks for the tests. - -Help file: - - help.txt - That file is used to find out more information about how to use the software manually using the terminal. diff --git a/Under-Testing/Server-Code-New/SIPHandler.py b/Under-Testing/Server-Code-New/SIPHandler.py deleted file mode 100644 index eb5302c..0000000 --- a/Under-Testing/Server-Code-New/SIPHandler.py +++ /dev/null @@ -1,272 +0,0 @@ -import sys -import string -import pjsua as pj -import ServerClass -import LogFileClass -import setproctitle -from time import sleep -import csv - -def log_cb(level, str, len): - - print "" - -# Receive events from incoming Call -class Account(pj.AccountCallback): - - def __init__(self, account=None): - pj.AccountCallback.__init__(self, account) - - def on_incoming_call(self, call): - global current_call - - #print 'Incoming Call' - current_call = call - call_cb = Calling(current_call) - current_call.set_callback(call_cb) - - logger.logEvent('Incoming Call') - - call.answer(200) - - sleep(2) - - logger.logEvent('CALL OK') - -#creating object for calling -class Calling(pj.CallCallback): - - def __init__(self, call=None): - pj.CallCallback.__init__(self, call) - - def on_state(self): - global current_call - - if self.call.info().state <> pj.CallState.DISCONNECTED: - if self.call.info().state_text == "CONNECTING": - logger.logEvent("Call Connecting") - try: - logger.logEvent('Try to hangup the call') - self.call.hangup() - logger.logEvent('Hangup OK') - except ValueError: - logger.logEvent('hangup failed, waiting destination hangup the call') - - server.sendData('CALL OK') - - if self.call.info().last_reason == "Busy Here": - logger.logEvent('Number busy or Offline') - server.sendData('CALL NOT OK') - logger.logEvent('CALL NOT OK') - - if self.call.info().state == pj.CallState.DISCONNECTED: - logger.logEvent('Call Disconnected') - current_call = None - -#function to make a call -def make_call(uri): - - try: - cb=Calling() - return acc.make_call(uri, cb) - - except pj.Error, e: - logger.logEvent('Error when trying to call, 408') - server.sendData('CALL NOT OK') - return None - -def writeToFile(): - try: - string = '--' - with open('handler.txt', 'w') as F: - writer = csv.writer(F) - writer.writerow([string]) - F.close() - except ValueError: - print "can't write to file" - -def openFile(): - global sipServer, username, password, ip, portadd - global port - - #file format: 'Account:username:password:server:handler:PortName:portCommunication - File = open('handler.txt') - reader = csv.reader(File, delimiter=':') - for row in reader: - if str(row[0]) == 'Account': - username = str(row[1]) - password = str(row[2]) - sipServer = str(row[3]) - port = int(row[6]) - File.close() - writeToFile() - -#send greeting message to the controller -def greeting(): - - global server - server = None - - # create socket communication object - server = ServerClass.ServerHandler(port) - logger.logEvent('try to Connect to Controller') - conn = server.openSocket() - - if server.connected == 1: - #connection to the controller establish - logger.logEvent('Connection Establish') - if server.receiveData(25) == 'HELLO HANDLER': - server.sendData('HELLO CONTROLLER') - return 1 - else: - logger.logEvent('Cant connect to Controller') - del server - return 0 - -def initLogFile(sipServer): - - global logger - - if sipServer == '132.230.4.8': - nameOfLogFile = 'SIP handler.log' - #print '--SIP Asterisk--' - - elif sipServer == 'sipgate.de': - nameOfLogFile = 'Landline handler.log' - #print '--Landline--' - - elif sipServer == '132.230.252.228': - nameOfLogFile = 'University SIP handler.log' - #print '--university tephone network--' - - logger = LogFileClass.Logging(nameOfLogFile) - -def initState(): - global message - global state - global num - - logger.logEvent('init state') - message = server.receiveData(30) - - if message == 'RECEIVER': - state = 'RECEIVER' - - elif message[0:6] == 'CALLER': - state = 'CALLER' - no = message[7:] - - # need special handle for calling from unisip account - if sipServer == '132.230.252.228': - num = no[7:] - else: - num = no - -lib = pj.Lib() -stop = False - -print 'INIT SYSTEM' - -openFile() -setproctitle.setproctitle('SIP Handler') -initLogFile(sipServer) - -logger.logEvent('') - -while stop <> True: - - acc_cfg = None - - lib.init(log_cfg = pj.LogConfig(level=1, callback=log_cb)) - transport = lib.create_transport(pj.TransportType.UDP, pj.TransportConfig(0)) - - lib.start() - lib.set_null_snd_dev() - - if greeting() != 1: - lib.destroy() - break - try: - initState() - acc_cfg = pj.AccountConfig(str(sipServer),str(username),str(password)) - logger.logEvent('Register Account to SIP server') - acc = lib.create_account(acc_cfg, cb=Account()) - - if acc.info().reg_status < 700: - - # being receiver state - if state =='RECEIVER': - logger.logEvent(acc.info().reg_status) - server.sendData('RECEIVER READY') - logger.logEvent('Receiver Handler Ready') - - #waiting state - while 1: - - data = server.receiveData(1) - if data == 'RECEIVE START': - print data - logger.logEvent(data) - - #get shutting down message - if data == 'TERMINATE CONNECTION': - print data - logger.logEvent('Terminate') - stop = True - break - #being caller state - elif state =='CALLER': - logger.logEvent(acc.info().reg_status) - server.sendData('CALLER READY') - logger.logEvent('Caller Handler Ready') - - while 1: - data = server.receiveData(1) - - #start the call - if data == 'CALL START': - #print data - if num <> '': - sleep(3) - logger.logEvent(data) - logger.logEvent('Make a call to: ' + num) - number = "sip:"+num+"@"+sipServer - make_call(number) - else: - logger.logEvent('No number to call') - logger.logEvent('CALL NOT OK') - - #shutting down message - if data == 'TERMINATE CONNECTION': - #print data - stop = True - logger.logEvent('Terminate') - break - - else: - logger.logEvent('Unknow Message') - server.sendData('Unknow Message') - break - - else: - logger.logEvent("488 Not Acceptable Here") - server.sendData('DEVICE NOT READY') - break - - except ValueError: - logger.logEvent("401 Unauthorized ") - break - -logger.logEvent("Goodbye") -logger.closeLogging() -# trying to clean everything before shutting down -try: - acc.delete() - lib.destroy() - lib = None - acc = None - server.closeConnection() - del server -except ValueError: - message = 'trying failure' - diff --git a/Under-Testing/Server-Code-New/SSHTunnelBoxClass.py b/Under-Testing/Server-Code-New/SSHTunnelBoxClass.py deleted file mode 100644 index 1b76d0b..0000000 --- a/Under-Testing/Server-Code-New/SSHTunnelBoxClass.py +++ /dev/null @@ -1,44 +0,0 @@ -#Here is a tutorial how to generate and copy your RSA SSH public key :) -#>>> http://www.thegeekstuff.com/2008/11/3-steps-to-perform-ssh-login-without-password-using-ssh-keygen-ssh-copy-id/ -import subprocess -from time import sleep - -class SSHTunneling: - - def __init__(self, localPort, remotePort, remoteServer, username, password): - self.lPort = localPort - self.rPort = remotePort - self.rServer = remoteServer - - self.usern = username - self.passw = password - - self.__tunnelStarted = 0 - self.__sshTunnel = 1 - - def startTunneling(self): - if self.__tunnelStarted == 0: - command = str(self.lPort) + ':' + self.rServer + ':' + str(self.rPort) - uad = self.usern + '@' + self.rServer - - try: - self.__sshTunnel = subprocess.Popen(['ssh','-p','7884','-N', '-L', command, uad], stdin=subprocess.PIPE, stdout=subprocess.PIPE) - sleep(2) - self.__tunnelStarted = 1 - return 1 - except Exception, e: - error = str(e) - return 0 - - def killTunneling(self): - if self.__tunnelStarted == 1: - try: - self.__sshTunnel.kill() - self.__tunnelStarted = 0 - return 1 - - except Exception, e: - error = str(e) - return 0 - - diff --git a/Under-Testing/Server-Code-New/ServerClass.py b/Under-Testing/Server-Code-New/ServerClass.py deleted file mode 100644 index 93c2f8e..0000000 --- a/Under-Testing/Server-Code-New/ServerClass.py +++ /dev/null @@ -1,152 +0,0 @@ -import socket -import sys -import os -import string -import signal - -class TimeoutException(Exception): - pass - -class ServerHandler: - - def __init__(self,p): - self.port = p - self.host = None #symbolic name meaning all available interfaces - self.s = None - self.connected = 0 - self.address = "127.0.0.1" #address of the main controller - self.onceConnected = 0 - self.error = 'No error' - - self.debugMode = 0 - - def openSocket(self): - self.error = 'No error' - for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, - socket.SOCK_STREAM, 0, socket.AI_PASSIVE): - af, socktype, proto, canonname, sa = res - - try: - self.s = socket.socket(af, socktype, proto) - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets - except socket.error, msg: - self.s = None - self.connected = 0 - self.error = str(msg) - continue - - try: - self.s.bind(sa) - self.s.listen(1) - except socket.error, msg: - self.s.close() - self.s = None - self.connected = 0 - self.error = str(msg) - continue - break - - if self.s is None: - self.connected = 0 - return 0 - else: #accept the connection - self.connection, self.address = self.s.accept() - self.connected = 1 - self.onceConnected = 1 - return 1 - - def connectedTo(self): - return self.address - - def receiveData(self, timeout): - if self.connected == 1: - - def timeout_handler(signum, frame): - raise TimeoutException() - - try: - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(timeout) #start the timeout alarm, for timeout seconds - - data = self.connection.recv(1024) - - #stop the timeout function - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if not data: - self.connected = 0 - return 'NO DATA' - else: - return data - - except TimeoutException: - #timeout happened - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'TIMEOUT' - - except Exception, e: - #stop the timeout timer - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connected = 0 - if error[0:11] == '[Errno 104]': - return 3 #the other side reset the connection,[Errno 104] Connection reset by peer - - return 2 - else: - return 0 - - def sendData(self, data): - if self.connected == 1: - try: - self.connection.send(data) - return 1 - - except Exception, e: - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connecected = 0 - return 2 - else: - return 0 - - def closeConnection(self): - if self.onceConnected == 1: - try: - self.connected = 0 - SHUT_RDWR = 2 - self.connection.shutdown(SHUT_RDWR) - self.connection.close() - return 1 - except Exception, e: - self.connected = 0 - error = str(e) - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - if error[0:11] == '[Errno 107]': - return 3 #the other side closed the connection before us [Errno 107] Transport endpoint is not connected - return 2 - else: - return 0 - - def killPort(self): - killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read() - killResult = killResult.replace('\n','') - print killResult - if killResult!='': - print killResult - killPort = os.popen("kill -9 " + killResult).read() - return 1 - return 0 diff --git a/Under-Testing/Server-Code-New/WebsiteCommClass.py b/Under-Testing/Server-Code-New/WebsiteCommClass.py deleted file mode 100644 index 206411e..0000000 --- a/Under-Testing/Server-Code-New/WebsiteCommClass.py +++ /dev/null @@ -1,162 +0,0 @@ -import socket -import sys -import os -import string -import signal - -class TimeoutException(Exception): - pass - -class ServerHandlerSoftware: - - def __init__(self,p): - self.port = p - self.host = None #symbolic name meaning all available interfaces - self.s = None - self.connected = 0 - self.address = "127.0.0.1" #address of the main controller - self.onceConnected = 0 - self.error = 'No error' - - self.debugMode = 0 - - def openSocket(self, timeoutVar): - self.error = 'No error' - for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, - socket.SOCK_STREAM, 0, socket.AI_PASSIVE): - af, socktype, proto, canonname, sa = res - - - try: - - self.s = socket.socket(af, socktype, proto) - self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #this resolves the bug with live packets - self.s.settimeout(timeoutVar) - - except socket.error, msg: - self.s = None - self.connected = 0 - self.error = str(msg) - continue - - try: - self.s.bind(sa) - self.s.listen(1) - - except socket.error, msg: - self.s.close() - self.s = None - self.connected = 0 - self.error = str(msg) - continue - - break - - if self.s is None: - self.connected = 0 - return 0 - else: #accept the connection - try: - self.connection, self.address = self.s.accept() - self.s.settimeout(0) - self.connected = 1 - self.onceConnected = 1 - return 1 - except socket.timeout: - return 'TIMEOUT' - - def connectedTo(self): - return self.address - - def receiveData(self, timeout): - if self.connected == 1: - - def timeout_handler(signum, frame): - raise TimeoutException() - - try: - - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(timeout) #start the timeout alarm, for timeout seconds - - data = self.connection.recv(1024) - - #stop the timeout function - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if not data: - self.connected = 0 - return 'NO DATA' - else: - return data - - except TimeoutException: - #timeout happened - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - return 'TIMEOUT' - - except Exception, e: - #stop the timeout timer - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connected = 0 - if error[0:11] == '[Errno 104]': - return 3 #the other side reset the connection,[Errno 104] Connection reset by peer - - return 2 - else: - return 0 - - def sendData(self, data): - if self.connected == 1: - try: - self.connection.send(data) - return 1 - - except Exception, e: - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - self.connecected = 0 - return 2 - else: - return 0 - - def closeConnection(self): - if self.onceConnected == 1: - try: - self.connected = 0 - SHUT_RDWR = 2 - self.connection.shutdown(SHUT_RDWR) - self.connection.close() - return 1 - except Exception, e: - self.connected = 0 - error = str(e) - if self.debugMode == 1: - import traceback - print traceback.format_exc() - print e - if error[0:11] == '[Errno 107]': - return 3 #the other side closed the connection before us [Errno 107] Transport endpoint is not connected - return 2 - else: - return 0 - - def killPort(self): - killResult = os.popen('lsof -i tcp:' + str(self.port) + ' | grep "python " | awk -F" " ' + "'{print $2}'").read() - killResult = killResult.replace('\n','') - print killResult - if killResult!='': - print killResult - killPort = os.popen("kill -9 " + killResult).read() - return 1 - return 0 diff --git a/Under-Testing/Server-Code-New/gsmselftest.py b/Under-Testing/Server-Code-New/gsmselftest.py deleted file mode 100644 index 082b19f..0000000 --- a/Under-Testing/Server-Code-New/gsmselftest.py +++ /dev/null @@ -1,795 +0,0 @@ -#! /usr/bin/env python -from serial import * #serial port library -import sys -import ControllerClass -import DbClass -import PingClass -import truthtableClass -import initTestClass -import usbDetectClass -import WebsiteCommClass -import signal -import random -from time import sleep -import setproctitle - -setproctitle.setproctitle('Controller Software') - -class bcolors: - HEADER = '\033[95m' - OKBLUE = '\033[94m' - OKGREEN = '\033[92m' - WARNING = '\033[93m' - FAIL = '\033[91m' - ENDC = '\033[0m' - - def disable(self): - self.HEADER = '' - self.OKBLUE = '' - self.OKGREEN = '' - self.WARNING = '' - self.FAIL = '' - self.ENDC = '' -class TimeoutException(Exception): - pass - -global resultsList -resultsList = list() -global taskNo -dbStatus = None -global caller -global callee - -def timeout_handler(signum, frame): - raise TimeoutException() - -def allPing(): #ping all existing devices - - global sipGate - global sipServer - global unisip - global gsmBox1 - global gsmBox2 - - serverAdd = db.deviceAddress(str('landline')) - server = PingClass.Ping(str(serverAdd[4])) - sipGate = server.ping(1) - - serverAdd = db.deviceAddress(str('sip')) - server = PingClass.Ping(str(serverAdd[4])) - sipServer = server.ping(1) - - serverAdd = db.deviceAddress(str('unisip')) - server = PingClass.Ping(str(serverAdd[4])) - unisip = server.ping(1) - - serverAdd = db.deviceAddress(str('GSMRZ2')) - server = PingClass.Ping(str(serverAdd[4])) - gsmBox1 = server.ping(1) - - serverAdd = db.deviceAddress(str('GSMRZ3')) - server = PingClass.Ping(str(serverAdd[4])) - gsmBox2 = server.ping(1) - -def initDB(): # function for connection database - global dbStatus - global db - if dbStatus != 1: - db = DbClass.DBMySQLConnection() - db.connectDB() - dbStatus = db.connectDB() - if dbStatus == 1: - db.lockMutex(600) - -def initNagiosString(x): - - initResult = truthtableClass.trueTable(x) - initResult.initNagiosResult() - - if int(initResult.FAILED) != 0: - print "GSM CRITICAL - Number of test "+str(initResult.testMount)+'; Failure '+str(initResult.FAILED)+'; Unknown '+str(initResult.handlerError) - elif int(initResult.handlerError) != 0: - print "GSM WARNING - Number of test "+str(initResult.testMount)+'; Failure '+str(initResult.FAILED)+'; Unknown '+str(initResult.handlerError) - elif int(initResult.FAILED) == 0 and int(initResult.handlerError) == 0: - print "GSM OK - Number of test "+str(initResult.testMount)+'; Failure '+str(initResult.FAILED)+'; Unknown '+str(initResult.handlerError) - else: - - print "unknown error" - -def initTrueTable(x): - - initResult = truthtableClass.trueTable(x) - initResult.initTrueTable() - - print '\n' - openBSC = None - asterikServer = None - for x in initResult.nanoBts: - - name = x[0] - if x[1] == True: - openBSC = True - asterikServer = True - print bcolors.OKGREEN +name+ ' Working'+ bcolors.ENDC - - else: - if int(x[1]) == 486: - print bcolors.FAIL+name+ ' not Working' + bcolors.ENDC - elif int(x[1]) == 200: - print bcolors.OKGREEN +name+ ' Working' - asterikServer = True - elif int(x[1]) == 402: - print bcolors.WARNING +name+ ' not Working need top up the credit' - asterikServer = True - elif int(x[1]) == 998 or int(x[1]) == 999: - print bcolors.FAIL+name+ ' not Working, handler error'+ bcolors.ENDC - elif int(x[1]) == 801 or int(x[1]) == 802: - print bcolors.FAIL+name+ ' Device Error, Check the device'+ bcolors.ENDC - else: - print bcolors.OKGREEN +name+ ' not Working'+ bcolors.ENDC - - print '' - if openBSC != None: - if openBSC == True: - print bcolors.OKGREEN +'openBSC working'+ bcolors.ENDC - else: - print bcolors.FAIL+'openBSC doesnt work'+ bcolors.ENDC - print '' - - if initResult.asteriskServer == True or asterikServer == True: - print bcolors.OKGREEN +'asterik server is working'+ bcolors.ENDC - print '' - - if initResult.outGoingRZ == True: - print bcolors.OKGREEN +'Outgoing call from RZ is working'+ bcolors.ENDC - elif initResult.outGoingRZ == False: - print bcolors.FAIL+'Outgoing call from RZ is not working'+ bcolors.ENDC - - if initResult.incomingRZ == True: - print bcolors.OKGREEN +'incoming call from outside RZ to GSM RZ is working'+ bcolors.ENDC - elif initResult.incomingRZ == False: - print bcolors.FAIL+'incoming call from outside RZ to GSM RZ is not working'+ bcolors.ENDC - print '\n' - -def errorCodes(callFrom, callTo, result): - message = '|' + str(callFrom) + '|' + str(callTo) + '|' + str(result) + '|' + str(db.errorCode(result)) - - sendResultWebsite(message) - - # function to search in the list -def isThere(keyword,lists): - x = 0 - for item in lists: - - if item == keyword: - return 1 - else: - x = x+1 - -def testDest(callFrom, callTo, tried): - - makeTest.initTest(callFrom,callTo) - db.insertTask(taskNum,callFrom,callTo) - smartResultList.append([callFrom,callTo, makeTest.result,tried]) - taskID = db.maxTaskID() - db.addResult(taskID, makeTest.result) - if WebStatus == True: - errorCodes(callFrom, callTo, makeTest.result) - -def smartTest(): - global smartResultList - smartResultList = list() - deviceLists = db.deviceList() - gsmList = list() - gsmRZList = list() - sipList = list() - destList = list() - rem = list() - item = list() - - cpgsmRZList = list() - - for lists in deviceLists: #define category of the device - device = lists[0] - if device[0:5] == 'GSMRZ': - gsmRZList.append(device) - cpgsmRZList.append(device) - elif device[0:5] == 'GSMEx': - gsmList.append(device) - else: - sipList.append(device) - - if device[0:5] == 'GSMRZ' or device[0:5] == 'GSMEx' or device == 'sip': - destList.append(device) - - #first test from university telphone network to random GSM RZ avaliable - i = random.randint(0, len(gsmRZList)-1) - callTo = gsmRZList[i] - callFrom = 'unisip' - testDest(callFrom, callTo, 1) - gsmRZList.remove(callTo) - destList.remove(callTo) - - - for callFrom in gsmRZList: - i = random.randint(0, len(destList)-1) #Check whether the caller and dest are same - callTo = destList[i] - if callFrom == callTo: #Check whether the caller and dest are same - if i == 0: - i = i+1 # if it in the first list, change to be the second list else, just back on step. - else: - i = i-1 - callTo = destList[i] - - destList.remove(callTo) - destList.remove(callFrom) - gsmRZList.remove(callFrom) - testDest(callFrom, callTo, 1) - - - # test incoming call from outside rz network to gsm rz - i = random.randint(0, len(gsmRZList)-1) # - callTo = gsmRZList[i] - callFrom = 'landline' - - if isThere(callTo,destList) == 1: # Checking whether caller at gsmrz list in the destination list, if yes delete it. - destList.remove(callTo) - testDest(callFrom, callTo, 1) - - for callTo in destList: - callFrom = 'sip' - if callFrom != callTo: - testDest(callFrom, callTo, 1) - - #checking unsuccess call, to make sure that destination are really unreachable - for dest in smartResultList: - #check unsuccess call and did the test have already tried, 2 means has been check - if int(dest[2]) == 486 or int(dest[2]) == 999 or int(dest[2]) == 998 or int(dest[2]) == 801 or int(dest[2]) == 802: - - if int(dest[3]) != 2 and dest[1] != 'sip': - testDestination = True - testFromRZ = False - testCaller = True - # make sure that destination have not tested by another part and give success result. - for test in smartResultList: - if test[1] == dest[1] or test[0] == dest[1]: - if int(test[2]) == 200: - testDestination = False - if test[1] == dest[0] or test[0] == dest[0]: - if int(test[2]) == 200: - testCaller = False - #if destination have not tested by other part. try to test from RZ GSM - if int(test[2]) == 200 and testFromRZ != True: - for caller in cpgsmRZList: - if caller == test[0] or caller == test[1]: - callFrom = caller - testFromRZ = True - - if testDestination == True: - if testFromRZ != True: - callFrom = 'sip' - callTo = dest[1] - testDest(callFrom, callTo, 2) - rem.append(dest) - - #check unsuccess call because caller handler having problem - #destination handler having problem, we should make test also to the caller - if int(dest[2]) == 998 or int(dest[2]) == 802 or int(dest[2]) == 486: - if testCaller == True: - if testFromRZ != True: - callFrom = 'sip' - callTo = dest[0] - testDest(callFrom, callTo, 2) - rem.append(dest) - - - caller = dest[0] # to test nanobts if the test come from RZ GSM but fehler - if caller[0:5] == 'GSMRZ' and int(dest[3]) != 2 and dest[1] != 'sip': - repeatTest = True - for test in smartResultList: - if test[1] == caller or test[0] == caller: - repeatTest = False - if int(dest[2]) == 486 or int(dest[2]) == 402: - if repeatTest == True: - callFrom = 'sip' - testDest(callFrom, dest[0], 2) - rem.append(dest) - - # test to make sure nanoBTS working or not. sice probably that nanotbts seems error but actually not. - for RZ in cpgsmRZList: - repeat = False - for gsmrzResult in smartResultList: - if gsmrzResult[0] == RZ or gsmrzResult[1] == RZ: - if int(gsmrzResult[2]) == 486 or int(gsmrzResult[2]) == 801 or int(gsmrzResult[2]) == 802: - repeat = True - From = gsmrzResult[0] - To = gsmrzResult[1] - result = gsmrzResult[2] - if int(gsmrzResult[2]) == 200: - repeat = False - if gsmrzResult[1] == RZ and int(gsmrzResult[2]) == 998: - try: - cpgsmRZList.remove(RZ) - except ValueError: - message = 'Error' - if gsmrzResult[0] == RZ and int(gsmrzResult[2]) == 999: - try: - cpgsmRZList.remove(RZ) - except ValueError: - message = 'Error' - - if len(cpgsmRZList) > 1: - if repeat == True: - i = random.randint(0, len(cpgsmRZList)-1) # - if i == 0: - x = i+1 - else: - x = i-1 - testDest(cpgsmRZList[x], cpgsmRZList[i], 2) - item = '['+str(From)+','+str(callTo)+','+str(result)+','+str(1)+']' - rem.append(item) - - for remov in rem: - for x in smartResultList: - if x == remov: - try: - smartResultList.remove(x) - except ValueError: - message = 'Error' - return smartResultList - -def doSmartTest(status): - global taskNum, printMessage - global WebStatus - initDB() - taskNum = db.maxTaskNo() - global makeTest - if status == True: - WebStatus = True - - else: - WebStatus = False - - makeTest = initTestClass.initTesting() - result = smartTest() - if status == 'NAGIOS': - initNagiosString(result) - - elif status == False: - initTrueTable(result) - - if status == True: - sendFinishMessage() - - -def doSipTest(): - destList = ['landline', 'unisip'] - doTest = initTestClass.initTesting() - for callTo in destList: - - callFrom = 'sip' - doTest.initTest(callFrom,callTo) - resultsList.append([callFrom, callTo, doTest.result]) - initTrueTable(resultsList) -def doIncomingTest(): #incoming call to RZ network - - destList = ['GSMRZ1','unisip', 'GSMRZ2','GSMRZ3'] - doTest = initTestClass.initTesting() - for callTo in destList: - callFrom = 'landline' - doTest.initTest(callFrom,callTo) - resultsList.append([callFrom, callTo, doTest.result]) - initTrueTable(resultsList) - -def doGsmrzTest(): - - destList = ['GSMRZ1','GSMRZ2', 'GSMRZ3'] - callList = ['sip'] - doTest = initTestClass.initTesting() - - for callFrom in callList: - for callTo in destList: - doTest.initTest(callFrom,callTo) - resultsList.append([callFrom, callTo, doTest.result]) - initTrueTable(resultsList) - -def doGsmExtTest(): - - destList = ['GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm'] - callList = ['sip'] - - doTest = initTestClass.initTesting() - - for callFrom in callList: - for callTo in destList: - doTest.initTest(callFrom,callTo) - resultsList.append([callFrom, callTo, doTest.result]) - initTrueTable(resultsList) - -def doAllTest(): - - doSipTest() - doIncomingTest() - doGsmrzTest() - doGsmExtTest() - - -def sendResultWebsite(message): - if server.sendData(message+ chr(10)) == 1: - print 'data sent successfully' - test = server.receiveData(5) - if test == 'TIMEOUT': - closeFunction(db,server) - sys.exit(2) - if test == 'CONTINUE': - print 'continue' - -def sendFinishMessage(): - if server.connected == 1: - server.sendData('TEST DONE\n') - test = server.receiveData(5) - if test == 'TIMEOUT': - closeFunction(db,server) - if test == 'DISCONNECT': - close = server.closeConnection() - if close == 1: - print 'Closed connection successfully' - - print 'release mutex says ', db.releaseMutex() - -def withDB(x): - - initDB() - - if x == False: - deviceLists = db.deviceList() - callerFound = False - calleeFound = False - for device in deviceLists: - if caller == device[0]: - callerFound = True - break - - for device in deviceLists: - if callee == device[0]: - calleeFound = True - break - if callerFound != True or calleeFound != True: - if callerFound != True: - print 'No device with name', caller - db.closeDBConn() - sys.exit(1) - if calleeFound != True: - print 'No device with name', callee - db.closeDBConn() - sys.exit(1) - if callerFound == True and calleeFound == True: - taskNumber = db.maxTaskNo() - db.insertTaskIn2(caller, callee, taskNumber) - resultsList = list() - if dbStatus == 1: # Checking connection to database - if db.anyTasksToDo() == 1: # Checking task on the table - - allPing() - i=0 - makeTest = initTestClass.initTesting() - - for item in db.tasksList: - - taskID = item[0] - taskNo = item[1] - callFrom = item[2] - callTo = item[3] - - if i == 0: - db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) - print '\n' - print 'Task ID :', taskID - print 'Calling From :', callFrom - print 'To :', callTo - - - makeTest.initTest(callFrom,callTo) - - db.addResult(taskID, makeTest.result) - - resultsList.append([callFrom, callTo, makeTest.result]) - - db.errorCode(makeTest.result) - - if int(makeTest.result) == 200: - print bcolors.OKGREEN +'Result : ' +str(makeTest.result)+ ' ' +db.errCode + bcolors.ENDC - else: - print bcolors.FAIL+'Result : ' +str(makeTest.result)+ ' ' +db.errCode + bcolors.ENDC - - if x == True: # if x = True means that this function call by website - - message = '|' + str(callFrom) + '|' + str(callTo) + '|' + str(makeTest.result) + '|' + str(db.errCode) - sendResultWebsite(message) # send result to website - - db.deleteTempTask(taskID) - i = i+1 - - db.cleanTasksList() - - if x == True: - sendFinishMessage() #send finish message to website and close the connection - - print '\n' - - initTrueTable(resultsList) # fetch result list and make adjustment about the result - db.closeDBConn() - else: - print bcolors.FAIL+"--- No job at all ---" + bcolors.ENDC - db.closeDBConn() - else: - print bcolors.FAIL+'Cant connect to database'+ bcolors.ENDC - sys.exit(1) - -def findPort(portName): # take information in existing usb port - global connect - global prefix - global num - global IMEI - global portClass - sleep(0.5) - portLog = os.popen('dmesg | grep \'pl2303 converter now attached to '+portName+'\'').read() - sleep(0.5) - if portLog != '': - connect = 1 - portClass = usbDetectClass.serialPort(portName) - portClass.findNumber() - portClass.findIMEI() - IMEI = portClass.IMEI - num = portClass.number - number = portClass.number - prefix = number[0:4] - else: - connect = 0 - -def initDevice(deviceName): - print 'Device Name :',deviceName - print ' Device IMEI : ', - imei = sys.stdin.readline().rstrip("\r\n") - print 'Phone number : ', - number = sys.stdin.readline().rstrip("\r\n") - print 'Port Name : /dev/', - portName = sys.stdin.readline().rstrip("\r\n") - print '' - - if imei == '' or portName == '': - print bcolors.FAIL+' == cant save device configuration, please fill IMEI / port name of the device =='+ bcolors.ENDC - else: - findPort(portName) - if connect == 1: - if str(IMEI) != str(imei) and str(num) != str(number): - print bcolors.FAIL+'== error, device not found =='+ bcolors.ENDC - elif str(IMEI) == str(imei): - portClass.initUpdate(deviceName, portName, number) - print bcolors.OKGREEN +'== Device succeced added =='+ bcolors.ENDC - elif str(num) == str(number) and str(IMEI) != str(imei): - portClass.initUpdate(deviceName, portName, number) - print bcolors.WARNING+'== Device succeced added, but have different IMEI =='+ bcolors.ENDC - else: - print bcolors.FAIL+'== error, no device connected =='+ bcolors.ENDC - -def autoUpdateDevice(status): - initDB() - GSMListPrefix = list() - GSMListPrefix = db.GSMPrefix() - i = 0 - x = 0 - count = 0 - while i !=10: - portName ='ttyUSB'+str(i) #checking usb connection - - i=i+1 - old_handler = signal.signal(signal.SIGALRM, timeout_handler) - signal.alarm(15) - try: - findPort(portName) - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - if connect == 1: - for listNum in GSMListPrefix: - if prefix == listNum[1]: - print 'Device Name :',listNum[0] - print 'IMEI :',IMEI - print 'Phone Number :',num - print 'Port Name : /dev/'+portName - x=x+1 - newPortName = '/dev/'+portName - portClass.initUpdate(listNum[0], newPortName, num) - print '\n' - except TimeoutException: - signal.signal(signal.SIGALRM, old_handler) - signal.alarm(0) - count = count + 1 - message = "Timeout" - if status == True: - sendFinishMessage() - else: - - print '== FINISH ==' - print 'Found '+str(x)+' devices' - -def updateDevice(): #update port name list of device on DB - quit = False - while quit != True: - print '' - print "Mobile device configuration" - print "Menu: a = automatic device configuration, m = Manual configuration, q = quit : ", - input = sys.stdin.readline().rstrip("\r\n") - print '' - if input == 'm': # manual configuration - - while True: - print '' - print "Mobile device name: " - print " 1. GSM O2" - print " 2. GSM Vodafone" - print " 3. GSM Eplus" - print " 4. GSM T-Mobile" - print " 5. GSM RZ 1" - print " 6. Back to menu" - print "" - print "your choise : ", - input = sys.stdin.readline().rstrip("\r\n") - - if input == '6': - break - elif input == '1': - initDevice('GSMExt.O2') - elif input == '2': - initDevice('GSMExt.Voda') - elif input == '3': - initDevice('GSMExt.Eplus') - elif input == '4': - initDevice('GSMExt.Tm') - elif input == '5': - initDevice('GSMRZ1') - else: - print 'please choose between 1-6' - - if input == 'a': #automatic configuration - autoUpdateDevice(False) - - if input == "q": - break - sys.exit() - -def closeFunction(dbConn,serverSocket): - print 'Release the mutex: ' + str(dbConn.releaseMutex()) - print 'Close the DB Connection: ' + str(dbConn.closeDBConn()) - del dbConn - del serverSocket - sys.exit() - -if len(sys.argv) > 1: - - command = sys.argv[1] - - if command == '--all': - resultsList = list() - doAllTest() - - elif command == '--sip': - resultsList = list() - doSipTest() - - elif command == '--gsmrz': - resultsList = list() - doGsmrzTest() - - elif command == '--gsmext': - resultsList = list() - doGsmExtTest() - - elif command == '--incoming': - resultsList = list() - doIncomingTest() - - elif command == '--smart': - initDB() - resultsList = list() - allPing() - taskNo = db.maxTaskNo() - db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) - doSmartTest(False) - - elif command == '--nagios': - initDB() - resultsList = list() - allPing() - taskNo = db.maxTaskNo() - db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) - doSmartTest('NAGIOS') - - elif command == '--devconf': - updateDevice() - - elif command == '--db': - if len(sys.argv) > 2: - try: - caller = sys.argv[2] - callee = sys.argv[3] - - except ValueError: - print "Error given caller and destination. Type '--help' for more information." - else: - print "Error given caller and destination. Type '--help' for more information." - sys.exit() - resultsList = list() - withDB(False) - - elif command == '--help': - file = open('help.txt', 'r') - print file.read() - - else: - print "command not found, Type '--help' for more information." - print '\n' -else: - global server - global tried - - - initDB() # should put db condition - server = WebsiteCommClass.ServerHandlerSoftware(34500) #define the port - tried = server.openSocket(10) - - if tried == 'TIMEOUT': - closeFunction(db,server) - - test = server.receiveData(10) - if test == 'TIMEOUT': - closeFunction(db,server) - - if test == 'START TEST': - server.sendData('CONFIRM\n') - print 'TEST STARTED' - withDB(True) - - if test == 'SMART TEST': - allPing() - taskNo = db.maxTaskNo() - db.updatePingResult(taskNo, sipServer, sipGate, unisip, gsmBox1, gsmBox2) - server.sendData('CONFIRM\n') - print 'SMART TEST STARTED' - resultsList = list() - doSmartTest(True) - - if test == 'UPDATE DEVICE': - server.sendData('CONFIRM\n') - print 'UPDATE DEVICE STARTED' - autoUpdateDevice(True) - else: - sys.exit('WE DIDN\'T RECEIVE THE CONFIRMATION') - - db.closeDBConn() - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Under-Testing/Server-Code-New/handler.txt b/Under-Testing/Server-Code-New/handler.txt deleted file mode 100644 index 45b50ac..0000000 --- a/Under-Testing/Server-Code-New/handler.txt +++ /dev/null @@ -1 +0,0 @@ --- diff --git a/Under-Testing/Server-Code-New/help.txt b/Under-Testing/Server-Code-New/help.txt deleted file mode 100644 index 1a3b843..0000000 --- a/Under-Testing/Server-Code-New/help.txt +++ /dev/null @@ -1,18 +0,0 @@ - -Usage: ./gsmselftest.py [option] - -Options and arguments (and corresponding environment variables): - ---db [caller] [callee] : To execute the test case given by defining the caller and callee ---all : To execute all test cases ---sip : To execute SIP test cases ---gsmrz : To check whether GSM RZ network has problems or not ---gsmext : To check whether GSM BOX modem has problems or not ---incoming : To check incoming calls from Landline ---smart : To test only important points in the network and to identify the problems ---devconf : To configure the USB device on the server ---nagios : Execute smart test but only for Nagios plugin - - example : ./gsmselftest.py --devconf - ./gsmselftest.py --smart - ./gsmselftest.py --db sip GSMRZ1 diff --git a/Under-Testing/Server-Code-New/initTestClass.py b/Under-Testing/Server-Code-New/initTestClass.py deleted file mode 100644 index 568f840..0000000 --- a/Under-Testing/Server-Code-New/initTestClass.py +++ /dev/null @@ -1,122 +0,0 @@ -import sys -import subprocess, signal -import os -import ControllerClass -import DbClass -import PingClass -import random -from time import sleep - -class initTesting: - - def __init__(self): - self.messageList = list() - - def pings(self,IP): - - server = PingClass.Ping(IP) - self.serverStatus = server.ping(2) - return self.serverStatus - - def initDB(self): - - self.db = DbClass.DBMySQLConnection() - self.db.connectDB() - self.dbStatus = self.db.connectDB() - - def initaccount(self,account,handler): - if handler == 'sip' or handler == 'unisip' or handler == 'landline': - if account[1] != '' or account[2] != '' or account[3] != '' or account[4] != '': - # checking available sip account, is there enough information about the account such as username, password,server - self.status = 1 - else: - self.status = 0 - else: - if account[0] != '' or account[1] != '': - self.status = 1 - else: - self.status = 0 - - - #kill process to make sure, that the handler is Terminate incase handler having problem receiving terminate message from controller - def killProc(self): - # define process name of the Handler - procNameDest = 'GSM Handler' - procNameCall = 'SIP Handler' - - p = subprocess.Popen(['ps', '-A'], stdout=subprocess.PIPE) - out, err = p.communicate() - - #search process name and kill it. - for line in out.splitlines(): - if procNameDest in line: - pid = int(line.split(None, 1)[0]) - os.kill(pid, signal.SIGKILL) - for line in out.splitlines(): - if procNameCall in line: - pid = int(line.split(None, 1)[0]) - os.kill(pid, signal.SIGKILL) - - - def initTest(self, callFrom, callTo): - - self.initDB() # open database connection - - if self.dbStatus != 0: # if connection to db establish, do the test - - #fetch device account detail from database - dest = self.db.deviceAddress(str(callTo)) - caller = self.db.deviceAddress(str(callFrom)) - - # check that the caller server allive or not - if self.pings(caller[4]) <> 0: - - # check that the destination server allive or not - if self.pings(dest[4]) <> 0: - - self.initaccount(caller,callFrom) - if self.status == 1: - self.initaccount(dest,callTo) - - if self.status == 1: - #string = 'Account:username:password:server:ipaddress:portaddress:portnumber' - - callPortName = caller[0] - accCaller = caller[2]+':'+caller[3]+':'+caller[4]+':' - - destPortName = dest[0] - destNo = dest[1] - accDest = dest[2]+':'+dest[3]+':'+dest[4]+':' - - # create controller class object and send the handler information - makeTest = ControllerClass.controller(callFrom, callPortName, accCaller, callTo, destPortName, destNo, accDest) - makeTest.FuncTest() - - self.result = str(makeTest.testResult) - - else: - self.result = 100 - else: - self.result = 100 - - sleep(2) - #make sure the handler have been terminated - self.killProc() # kill all the handler - - self.db.closeDBConn() #close db connection - sleep(1) - else: - #destintaion server die - self.result = 501 - else: - #caller server die - self.result = 500 - self.db.closeDBConn() - else: - self.result = 333 - - return self.result - - - - diff --git a/Under-Testing/Server-Code-New/startSoftware.py b/Under-Testing/Server-Code-New/startSoftware.py deleted file mode 100644 index b2beb58..0000000 --- a/Under-Testing/Server-Code-New/startSoftware.py +++ /dev/null @@ -1,21 +0,0 @@ -#! /usr/bin/env python -import ServerClass -import subprocess -import setproctitle - -setproctitle.setproctitle('Start Software') -while 1: - # try connect to website - server = ServerClass.ServerHandler(34600) - tried = server.openSocket() - test = server.receiveData(2) - if test == 'START APP': - print 'start' - try: - script = 'gsmselftest.py' - subprocess.Popen(['python',script], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - except ValueError: - print " - can't start controller software -" - server.closeConnection() - del server - diff --git a/Under-Testing/Server-Code-New/truthtableClass.py b/Under-Testing/Server-Code-New/truthtableClass.py deleted file mode 100644 index c45ab4d..0000000 --- a/Under-Testing/Server-Code-New/truthtableClass.py +++ /dev/null @@ -1,233 +0,0 @@ -import DbClass - -class trueTable: - def __init__(self, resultsList): - - self.resultsList = resultsList - self.outGoingRZ = None - self.asteriskServer = None - self.incomingRZ = None - self.openBSC = None - self.nanoBTS = None - self.deviceStatus = list() - self.testMount = len(resultsList) - self.OK = 0 - self.FAILED = 0 - self.handlerError = 0 - - def initDB(self): - # function for connect to database - self.db = DbClass.DBMySQLConnection() - self.db.connectDB() - self.dbStatus = self.db.connectDB() - - def lookingBTSname(self, btsname): - if len(self.nanoBts) == 0: - self.found = False - else: - found = False - for y in self.nanoBts: #find the existing nanoBts result - name = y[0] - if name == btsName: - self.found = True - return self.found - - def findStatusInList(self,key): - - if len(self.deviceStatus) == 0: - update = False - else: - update = False - for item in self.deviceStatus: - if key == item[0] and str(item[1]) != 'OK': - update = True - return update - - def initNagiosResult(self): - self.initDB() - deviceLists = self.db.deviceList() - self.db.closeDBConn() - - for items in deviceLists: - device = items[0] - for result in self.resultsList: - if device == result[0] or device == result[1]: - if int(result[2]) == 200: - if self.findStatusInList(device) == True: - try: - self.deviceStatus.remove([device,'NOT OK']) - except: - try: - self.deviceStatus.remove([device,'UNKNOWN']) - except: - continue - self.deviceStatus.append([device,'OK']) - else: - self.deviceStatus.append([device,'OK']) - - elif int(result[2]) == 486: - found = False - for item in self.deviceStatus: - if device == item[0]: - if str(item[1]) != 'OK' or str(item[1]) == 'OK': - found = True - if found == False: - self.deviceStatus.append([device,'NOT OK']) - else: - found = False - for item in self.deviceStatus: - if device == item[0]: - if str(item[1]) != 'OK' or str(item[1]) == 'OK': - found = True - if found == False: - self.deviceStatus.append([device,'UNKNOWN']) - for status in self.deviceStatus: - - if status[1] == 'OK': - self.OK = self.OK+1 - elif status[1] == 'NOT OK': - self.FAILED = self.FAILED+1 - else: - self.handlerError = self.handlerError+1 - - def initTrueTable(self): - global btsName - self.initDB() - deviceLists = self.db.deviceList() #fetch device list from database - externalRZList = list() - - for devLists in deviceLists: #define category of the external devices - device = devLists[0] - - if device[0:5] == 'GSMEx' or device == 'landline': - externalRZList.append(device) # fetch into the list - self.db.closeDBConn() - lists = self.resultsList - self.nanoBts = list() - gsmResultList = list() - - i= 1 - for w in lists: - call=w[0] - dest=w[1] - - - if call[0:5]=='GSMRZ': - if i <= int(call[5:]): - i = int(call[5:]) - if dest[0:5]=='GSMRZ': - - if i <= int(dest[5:]): - i = int(dest[5:]) - i = i+1 - - for x in lists: # to find nanoBts, asterik server and open BSC status regarding result test for GSM RZ - call=x[0] - dest=x[1] - result=x[2] - stop = False - j=1 - - if call[0:5]=='GSMRZ' or dest[0:5]=='GSMRZ': - while stop != True: - if j != i: - key = 'GSMRZ'+str(j) - if key == call or key == dest: - - btsName = 'nanoBts '+str(j) - if result == '200': - - btsName = 'nanoBts '+str(j) - self.asteriskServer = True #set status of asterik server as working - self.lookingBTSname(btsName) - if self.found != True: - #if doesnt found the nanoBts, add the result to the list, otherwise just ignoring - try: - self.nanoBts.remove(btsName) - except ValueError: - message = 'Error' - - self.nanoBts.append([btsName,True]) - - if key == call: - for z in externalRZList:# find the result for outgoing call from GSM RZ to external RZ network - if dest == z: - self.outGoingRZ = True #set status as working for outgoing RZ - if key == dest: - for z in externalRZList: - if call == z: - self.incomingRZ = True # find the result for imcoming call to GSM RZ from external RZ network - elif result == '486': - found = False - if key == call: - for z in externalRZList: - if dest == z and self.outGoingRZ != True: - self.outGoingRZ = False - if key == dest: - for z in externalRZList: - if call == z and self.incomingRZ != True: - self.incomingRZ = False - if self.nanoBts == '': - self.nanoBts.append([btsName,False]) - for y in self.nanoBts: #find the existing nanoBts result - name = y[0] - if name == btsName and y[1] == True: - found = True - if found != True: - self.nanoBts.append([btsName,False]) - - elif (str(result) == '801' or str(result) == '999') and key == call: - self.lookingBTSname(key) - if self.found != True: - self.nanoBts.append([key,result]) - - elif (str(result) == '802' or str(result) == '998') and key == dest: - self.lookingBTSname(key) - if self.found != True: - self.nanoBts.append([key,result]) - - j = j+1 - elif j == i: - stop = True - - if call[0:5]=='GSMEx': # looking for calling from GSMexternal - found = False - if len(self.nanoBts) == 0: - self.nanoBts.append([call,result]) - found = False - else: - for y in self.nanoBts: #find the existing result for GSM external in the list - name = y[0] - if name == call: - if int(result) == 200: - if int(y[1]) == 486 or int(y[1]) == 999 or int(y[1]) == 998 or int(y[1]) == 801: - self.nanoBts.remove(y) - else: - found = True - if found != True: - self.nanoBts.append([call,result]) - - if dest[0:5]=='GSMEx': # looking for destination call to GSMexternal - found = False - if len(self.nanoBts) == 0: - self.nanoBts.append([dest,result]) - found = False - else: - - for y in self.nanoBts: - name = y[0] - if name == dest: - if int(result) == 200: - if int(y[1]) == 486 or int(y[1]) == 999 or int(y[1]) == 998 or int(y[1]) == 402 or int(y[1]) == 802: - self.nanoBts.remove(y) - else: - found = True - if found != True: - self.nanoBts.append([dest,result]) - - - for device in externalRZList: - if device == dest and int(result) == 200: - self.outGoingRZ = True - - diff --git a/Under-Testing/Server-Code-New/usbDetectClass.py b/Under-Testing/Server-Code-New/usbDetectClass.py deleted file mode 100644 index d64e328..0000000 --- a/Under-Testing/Server-Code-New/usbDetectClass.py +++ /dev/null @@ -1,96 +0,0 @@ -from serial import * #serial port library -import sys -from time import sleep -import DbClass - - -class serialPort: - - def __init__(self, portAddress): - self.portAddress = portAddress - self.portExist = 0 - self.IMEI = None - self.number = None - #self.updateStatus = None - - def initDB(self): - self.db = DbClass.DBMySQLConnection() - self.db.connectDB() - self.dbStatus = self.db.connectDB() - - def initUpdate(self, deviceName, newPortName, newNumber): - self.initDB() - - if self.dbStatus != 0: - self.db.updateGSMDevice(deviceName, newPortName, newNumber) - else: - print 'No connection to database' - - def portInit(self): - self.portExist = 0 - try: - self.ser = Serial( - port='/dev/'+self.portAddress, - baudrate=19200, - bytesize=EIGHTBITS, - parity=PARITY_NONE, - stopbits=STOPBITS_ONE) - self.ser.open() - self.ser.isOpen() - self.portExist = 1 - - except Exception, e: - return 0 - - def isInteger(self, x): - try: - int(x) - return True - except: - return False - - def findIMEI(self): - self.portInit() - if self.portExist == 1: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+GSN\r') - sleep(0.5) - result = self.ser.read(25) - if result != '': - self.IMEI = result[result.find('3'):15+result.find('3')] - else: - self.IMEI = 'IMEI not found' - return self.IMEI - - else: - self.IMEI = 'port not found' - return 0 - - def findNumber(self): - self.portInit() - - if self.portExist == 1: - self.ser.flushInput() #clean the input buffer for serial port - self.ser.write('AT+CNUM\r') - sleep(0.5) - readNum = self.ser.read(35) - self.ser.close() - firstQuote = readNum.find('"') - cutString = readNum [firstQuote:] - secondQuote = cutString.find(',') - number = cutString[1:secondQuote-1] - - if number != '': - if number.find('+') == 0: - number = '0'+number[3:len(number)] - elif int(number[0:1]) == 4: - number = '0'+number[2:len(number)] - self.number = number - else: - self.number = 'number not found' - - return self.number - - else: - self.number = 'port not found' - return 0 diff --git a/Under-Testing/Website/Images/AutoIcon.png b/Under-Testing/Website/Images/AutoIcon.png deleted file mode 100644 index 5ff782f..0000000 Binary files a/Under-Testing/Website/Images/AutoIcon.png and /dev/null differ diff --git a/Under-Testing/Website/Images/BackGround.jpg b/Under-Testing/Website/Images/BackGround.jpg deleted file mode 100644 index 25aa515..0000000 Binary files a/Under-Testing/Website/Images/BackGround.jpg and /dev/null differ diff --git a/Under-Testing/Website/Images/BackgroundLogin.png b/Under-Testing/Website/Images/BackgroundLogin.png deleted file mode 100644 index 0608425..0000000 Binary files a/Under-Testing/Website/Images/BackgroundLogin.png and /dev/null differ diff --git a/Under-Testing/Website/Images/CheckAllButton.png b/Under-Testing/Website/Images/CheckAllButton.png deleted file mode 100644 index 95882f5..0000000 Binary files a/Under-Testing/Website/Images/CheckAllButton.png and /dev/null differ diff --git a/Under-Testing/Website/Images/ChooseIcon.png b/Under-Testing/Website/Images/ChooseIcon.png deleted file mode 100644 index 53ac136..0000000 Binary files a/Under-Testing/Website/Images/ChooseIcon.png and /dev/null differ diff --git a/Under-Testing/Website/Images/GSMTestButton.png b/Under-Testing/Website/Images/GSMTestButton.png deleted file mode 100644 index a663494..0000000 Binary files a/Under-Testing/Website/Images/GSMTestButton.png and /dev/null differ diff --git a/Under-Testing/Website/Images/ManualIcon.png b/Under-Testing/Website/Images/ManualIcon.png deleted file mode 100644 index 222f446..0000000 Binary files a/Under-Testing/Website/Images/ManualIcon.png and /dev/null differ diff --git a/Under-Testing/Website/Images/MobilePhone.png b/Under-Testing/Website/Images/MobilePhone.png deleted file mode 100644 index e3f9fc8..0000000 Binary files a/Under-Testing/Website/Images/MobilePhone.png and /dev/null differ diff --git a/Under-Testing/Website/Images/MobilePhoneIcon.png b/Under-Testing/Website/Images/MobilePhoneIcon.png deleted file mode 100644 index c369145..0000000 Binary files a/Under-Testing/Website/Images/MobilePhoneIcon.png and /dev/null differ diff --git a/Under-Testing/Website/Images/SIPTestButton.png b/Under-Testing/Website/Images/SIPTestButton.png deleted file mode 100644 index bbb2408..0000000 Binary files a/Under-Testing/Website/Images/SIPTestButton.png and /dev/null differ diff --git a/Under-Testing/Website/Images/SmartIcon.png b/Under-Testing/Website/Images/SmartIcon.png deleted file mode 100644 index dcfae0a..0000000 Binary files a/Under-Testing/Website/Images/SmartIcon.png and /dev/null differ diff --git a/Under-Testing/Website/Images/SubmitButton.png b/Under-Testing/Website/Images/SubmitButton.png deleted file mode 100644 index 904c8b0..0000000 Binary files a/Under-Testing/Website/Images/SubmitButton.png and /dev/null differ diff --git a/Under-Testing/Website/Images/UncheckButton.png b/Under-Testing/Website/Images/UncheckButton.png deleted file mode 100644 index 464ee2c..0000000 Binary files a/Under-Testing/Website/Images/UncheckButton.png and /dev/null differ diff --git a/Under-Testing/Website/Images/border1.png b/Under-Testing/Website/Images/border1.png deleted file mode 100644 index 09ea911..0000000 Binary files a/Under-Testing/Website/Images/border1.png and /dev/null differ diff --git a/Under-Testing/Website/TaskTest.html b/Under-Testing/Website/TaskTest.html deleted file mode 100644 index 67c154b..0000000 --- a/Under-Testing/Website/TaskTest.html +++ /dev/null @@ -1,453 +0,0 @@ - - - - - GSM selftest Software - - - - - - - - - - - - - - - - - - - - - - - - -
HOMEAbout UsHelp
-
-
-
- -
- -
-
- -
- - - -
-
-
- -
-
-
-
- -
-
-
-
-
- -
-
-
-
- -
- -
- -
-
- -
-
- -
-
- -
-
-
-
- -
-
-
-
- - -
-
-
- -
- -
- - - -
Albert-Ludwig University of Freiburg 2011
- - - ---> - - diff --git a/Under-Testing/Website/about.html b/Under-Testing/Website/about.html deleted file mode 100644 index bd6e2c4..0000000 --- a/Under-Testing/Website/about.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - GSM selftest Software - - - - - -
- - - - - - - - - - - - -
HOMEAbout UsHelp
- - - -
The objective of the software is the design and implementation of a monitoring and test system for the RZ-GSM network. The Software will testing the connection between caller and destination then provide information about the test including the part may having problem.
-
-Here is an example:
-I like to test the GSM RZ network and the connection to SIP. Thus I have to connect a mobile phone to the test system to control the phone over AT commands to call the SIP end point. The sip endpoint is running on the test system as well. If everything works, the SIP end point is ringing and the test system can pickup the call then the software will provide information about status of nanoBTS, OpenBSC and Asterisk Server all in perfect condition.
-
-Information Regarding the test Result:
-You can find detail information about the test result on the test result page after submit selected test. The test information will be provide in two type, by table and picture. In Table side, you can find the detail information about your test such as caller, destination, respond message and description about respond message. on the right hand side, you will find picture which descript about the test using picture. We make theree different kind of coloring in every part of the network. Red sign mean that the part having problem or doesnt work, Yellow sign mean that the part have not tested and Green sign mean that the part is fully working. On the picture side also store information about status of the handler which are controling some part of the network such as GSM RZ 1 and GSM RZ 2.
-
- - - - - - - -
Albert-Ludwig University of Freiburg 2011
- - -
- - - diff --git a/Under-Testing/Website/class/pBarcode128.class.php b/Under-Testing/Website/class/pBarcode128.class.php deleted file mode 100644 index 07f5db8..0000000 --- a/Under-Testing/Website/class/pBarcode128.class.php +++ /dev/null @@ -1,184 +0,0 @@ -Codes = ""; - $this->Reverse = ""; - - $FileHandle = @fopen($BasePath."data/128B.db", "r"); - - if (!$FileHandle) { die("Cannot find barcode database (".$BasePath."128B.db)."); } - - while (!feof($FileHandle)) - { - $Buffer = fgets($FileHandle,4096); - $Buffer = str_replace(chr(10),"",$Buffer); - $Buffer = str_replace(chr(13),"",$Buffer); - $Values = preg_split("/;/",$Buffer); - - $this->Codes[$Values[1]]["ID"] = $Values[0]; - $this->Codes[$Values[1]]["Code"] = $Values[2]; - $this->Reverse[$Values[0]]["Code"] = $Values[2]; - $this->Reverse[$Values[0]]["Asc"] = $Values[1]; - } - fclose($FileHandle); - } - - /* Return the projected size of a barcode */ - function getSize($TextString,$Format="") - { - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE; - $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5; - $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : 12; - $Height = isset($Format["Height"]) ? $Format["Height"] : 30; - - $TextString = $this->encode128($TextString); - $BarcodeLength = strlen($this->Result); - - if ( $DrawArea ) { $WOffset = 20; } else { $WOffset = 0; } - if ( $ShowLegend ) { $HOffset = $FontSize+$LegendOffset+$WOffset; } else { $HOffset = 0; } - - $X1 = cos($Angle * PI / 180) * ($WOffset+$BarcodeLength); - $Y1 = sin($Angle * PI / 180) * ($WOffset+$BarcodeLength); - - $X2 = $X1 + cos(($Angle+90) * PI / 180) * ($HOffset+$Height); - $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * ($HOffset+$Height); - - - $AreaWidth = max(abs($X1),abs($X2)); - $AreaHeight = max(abs($Y1),abs($Y2)); - - return(array("Width"=>$AreaWidth,"Height"=>$AreaHeight)); - } - - function encode128($Value,$Format="") - { - $this->Result = "11010010000"; - $this->CRC = 104; - $TextString = ""; - - for($i=1;$i<=strlen($Value);$i++) - { - $CharCode = ord($this->mid($Value,$i,1)); - if ( isset($this->Codes[$CharCode]) ) - { - $this->Result = $this->Result.$this->Codes[$CharCode]["Code"]; - $this->CRC = $this->CRC + $i*$this->Codes[$CharCode]["ID"]; - $TextString = $TextString.chr($CharCode); - } - } - $this->CRC = $this->CRC - floor($this->CRC/103)*103; - - $this->Result = $this->Result.$this->Reverse[$this->CRC]["Code"]; - $this->Result = $this->Result."1100011101011"; - - return($TextString); - } - - /* Create the encoded string */ - function draw($Object,$Value,$X,$Y,$Format="") - { - $this->pChartObject = $Object; - - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Height = isset($Format["Height"]) ? $Format["Height"] : 30; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE; - $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5; - $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE; - $AreaR = isset($Format["AreaR"]) ? $Format["AreaR"] : 255; - $AreaG = isset($Format["AreaG"]) ? $Format["AreaG"] : 255; - $AreaB = isset($Format["AreaB"]) ? $Format["AreaB"] : 255; - $AreaBorderR = isset($Format["AreaBorderR"]) ? $Format["AreaBorderR"] : $AreaR; - $AreaBorderG = isset($Format["AreaBorderG"]) ? $Format["AreaBorderG"] : $AreaG; - $AreaBorderB = isset($Format["AreaBorderB"]) ? $Format["AreaBorderB"] : $AreaB; - - $TextString = $this->encode128($Value); - - if ( $DrawArea ) - { - $X1 = $X + cos(($Angle-135) * PI / 180) * 10; - $Y1 = $Y + sin(($Angle-135) * PI / 180) * 10; - - $X2 = $X1 + cos($Angle * PI / 180) * (strlen($this->Result)+20); - $Y2 = $Y1 + sin($Angle * PI / 180) * (strlen($this->Result)+20); - - if ( $ShowLegend ) - { - $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10); - $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10); - } - else - { - $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+20); - $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+20); - } - - $X4 = $X3 + cos(($Angle+180) * PI / 180) * (strlen($this->Result)+20); - $Y4 = $Y3 + sin(($Angle+180) * PI / 180) * (strlen($this->Result)+20); - - $Polygon = array($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4); - $Settings = array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"BorderR"=>$AreaBorderR,"BorderG"=>$AreaBorderG,"BorderB"=>$AreaBorderB); - $this->pChartObject->drawPolygon($Polygon,$Settings); - } - - for($i=1;$i<=strlen($this->Result);$i++) - { - if ( $this->mid($this->Result,$i,1) == 1 ) - { - $X1 = $X + cos($Angle * PI / 180) * $i; - $Y1 = $Y + sin($Angle * PI / 180) * $i; - $X2 = $X1 + cos(($Angle+90) * PI / 180) * $Height; - $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * $Height; - - $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Settings); - } - } - - if ( $ShowLegend ) - { - $X1 = $X + cos($Angle * PI / 180) * (strlen($this->Result)/2); - $Y1 = $Y + sin($Angle * PI / 180) * (strlen($this->Result)/2); - - $LegendX = $X1 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset); - $LegendY = $Y1 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset); - - $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Angle"=>-$Angle,"Align"=>TEXT_ALIGN_TOPMIDDLE); - $this->pChartObject->drawText($LegendX,$LegendY,$TextString,$Settings); - } - } - - function left($value,$NbChar) { return substr($value,0,$NbChar); } - function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); } - function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pBarcode39.class.php b/Under-Testing/Website/class/pBarcode39.class.php deleted file mode 100644 index 8d57b71..0000000 --- a/Under-Testing/Website/class/pBarcode39.class.php +++ /dev/null @@ -1,200 +0,0 @@ -MOD43 = $EnableMOD43; - $this->Codes = ""; - $this->Reverse = ""; - - $FileHandle = @fopen($BasePath."data/39.db", "r"); - - if (!$FileHandle) { die("Cannot find barcode database (".$BasePath."data/39.db)."); } - - while (!feof($FileHandle)) - { - $Buffer = fgets($FileHandle,4096); - $Buffer = str_replace(chr(10),"",$Buffer); - $Buffer = str_replace(chr(13),"",$Buffer); - $Values = preg_split("/;/",$Buffer); - - $this->Codes[$Values[0]] = $Values[1]; - } - fclose($FileHandle); - } - - /* Return the projected size of a barcode */ - function getSize($TextString,$Format="") - { - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE; - $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5; - $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : 12; - $Height = isset($Format["Height"]) ? $Format["Height"] : 30; - - $TextString = $this->encode39($TextString); - $BarcodeLength = strlen($this->Result); - - if ( $DrawArea ) { $WOffset = 20; } else { $WOffset = 0; } - if ( $ShowLegend ) { $HOffset = $FontSize+$LegendOffset+$WOffset; } else { $HOffset = 0; } - - $X1 = cos($Angle * PI / 180) * ($WOffset+$BarcodeLength); - $Y1 = sin($Angle * PI / 180) * ($WOffset+$BarcodeLength); - - $X2 = $X1 + cos(($Angle+90) * PI / 180) * ($HOffset+$Height); - $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * ($HOffset+$Height); - - - $AreaWidth = max(abs($X1),abs($X2)); - $AreaHeight = max(abs($Y1),abs($Y2)); - - return(array("Width"=>$AreaWidth,"Height"=>$AreaHeight)); - } - - /* Create the encoded string */ - function encode39($Value) - { - $this->Result = "100101101101"."0"; - $TextString = ""; - for($i=1;$i<=strlen($Value);$i++) - { - $CharCode = ord($this->mid($Value,$i,1)); - if ( $CharCode >= 97 && $CharCode <= 122 ) { $CharCode = $CharCode - 32; } - - if ( isset($this->Codes[chr($CharCode)]) ) - { - $this->Result = $this->Result.$this->Codes[chr($CharCode)]."0"; - $TextString = $TextString.chr($CharCode); - } - } - - if ( $this->MOD43 ) - { - $Checksum = $this->checksum($TextString); - $this->Result = $this->Result.$this->Codes[$Checksum]."0"; - } - - $this->Result = $this->Result."100101101101"; - $TextString = "*".$TextString."*"; - - return($TextString); - } - - /* Create the encoded string */ - function draw($Object,$Value,$X,$Y,$Format="") - { - $this->pChartObject = $Object; - - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Height = isset($Format["Height"]) ? $Format["Height"] : 30; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $ShowLegend = isset($Format["ShowLegend"]) ? $Format["ShowLegend"] : FALSE; - $LegendOffset = isset($Format["LegendOffset"]) ? $Format["LegendOffset"] : 5; - $DrawArea = isset($Format["DrawArea"]) ? $Format["DrawArea"] : FALSE; - $AreaR = isset($Format["AreaR"]) ? $Format["AreaR"] : 255; - $AreaG = isset($Format["AreaG"]) ? $Format["AreaG"] : 255; - $AreaB = isset($Format["AreaB"]) ? $Format["AreaB"] : 255; - $AreaBorderR = isset($Format["AreaBorderR"]) ? $Format["AreaBorderR"] : $AreaR; - $AreaBorderG = isset($Format["AreaBorderG"]) ? $Format["AreaBorderG"] : $AreaG; - $AreaBorderB = isset($Format["AreaBorderB"]) ? $Format["AreaBorderB"] : $AreaB; - - $TextString = $this->encode39($Value); - - if ( $DrawArea ) - { - $X1 = $X + cos(($Angle-135) * PI / 180) * 10; - $Y1 = $Y + sin(($Angle-135) * PI / 180) * 10; - - $X2 = $X1 + cos($Angle * PI / 180) * (strlen($this->Result)+20); - $Y2 = $Y1 + sin($Angle * PI / 180) * (strlen($this->Result)+20); - - if ( $ShowLegend ) - { - $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10); - $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset+$this->pChartObject->FontSize+10); - } - else - { - $X3 = $X2 + cos(($Angle+90) * PI / 180) * ($Height+20); - $Y3 = $Y2 + sin(($Angle+90) * PI / 180) * ($Height+20); - } - - $X4 = $X3 + cos(($Angle+180) * PI / 180) * (strlen($this->Result)+20); - $Y4 = $Y3 + sin(($Angle+180) * PI / 180) * (strlen($this->Result)+20); - - $Polygon = array($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4); - $Settings = array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"BorderR"=>$AreaBorderR,"BorderG"=>$AreaBorderG,"BorderB"=>$AreaBorderB); - $this->pChartObject->drawPolygon($Polygon,$Settings); - } - - for($i=1;$i<=strlen($this->Result);$i++) - { - if ( $this->mid($this->Result,$i,1) == 1 ) - { - $X1 = $X + cos($Angle * PI / 180) * $i; - $Y1 = $Y + sin($Angle * PI / 180) * $i; - $X2 = $X1 + cos(($Angle+90) * PI / 180) * $Height; - $Y2 = $Y1 + sin(($Angle+90) * PI / 180) * $Height; - - $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Settings); - } - } - - if ( $ShowLegend ) - { - $X1 = $X + cos($Angle * PI / 180) * (strlen($this->Result)/2); - $Y1 = $Y + sin($Angle * PI / 180) * (strlen($this->Result)/2); - - $LegendX = $X1 + cos(($Angle+90) * PI / 180) * ($Height+$LegendOffset); - $LegendY = $Y1 + sin(($Angle+90) * PI / 180) * ($Height+$LegendOffset); - - $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Angle"=>-$Angle,"Align"=>TEXT_ALIGN_TOPMIDDLE); - $this->pChartObject->drawText($LegendX,$LegendY,$TextString,$Settings); - } - } - - function checksum( $string ) - { - $checksum = 0; - $length = strlen( $string ); - $charset = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%'; - - for( $i=0; $i < $length; ++$i ) - $checksum += strpos( $charset, $string[$i] ); - - return substr( $charset, ($checksum % 43), 1 ); - } - - function left($value,$NbChar) { return substr($value,0,$NbChar); } - function right($value,$NbChar) { return substr($value,strlen($value)-$NbChar,$NbChar); } - function mid($value,$Depart,$NbChar) { return substr($value,$Depart-1,$NbChar); } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pBubble.class.php b/Under-Testing/Website/class/pBubble.class.php deleted file mode 100644 index 483a1f3..0000000 --- a/Under-Testing/Website/class/pBubble.class.php +++ /dev/null @@ -1,283 +0,0 @@ -pChartObject = $pChartObject; - $this->pDataObject = $pDataObject; - } - - /* Prepare the scale */ - function bubbleScale($DataSeries,$WeightSeries) - { - if ( !is_array($DataSeries) ) { $DataSeries = array($DataSeries); } - if ( !is_array($WeightSeries) ) { $WeightSeries = array($WeightSeries); } - - /* Parse each data series to find the new min & max boundaries to scale */ - $NewPositiveSerie = ""; $NewNegativeSerie = ""; $MaxValues = 0; $LastPositive = 0; $LastNegative = 0; - foreach($DataSeries as $Key => $SerieName) - { - $SerieWeightName = $WeightSeries[$Key]; - - $this->pDataObject->setSerieDrawable($SerieWeightName,FALSE); - - if ( count($this->pDataObject->Data["Series"][$SerieName]["Data"]) > $MaxValues ) { $MaxValues = count($this->pDataObject->Data["Series"][$SerieName]["Data"]); } - - foreach($this->pDataObject->Data["Series"][$SerieName]["Data"] as $Key => $Value) - { - if ( $Value >= 0 ) - { - $BubbleBounds = $Value + $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key]; - - if ( !isset($NewPositiveSerie[$Key]) ) - { $NewPositiveSerie[$Key] = $BubbleBounds; } - elseif ( $NewPositiveSerie[$Key] < $BubbleBounds ) - { $NewPositiveSerie[$Key] = $BubbleBounds; } - - $LastPositive = $BubbleBounds; - } - else - { - $BubbleBounds = $Value - $this->pDataObject->Data["Series"][$SerieWeightName]["Data"][$Key]; - - if ( !isset($NewNegativeSerie[$Key]) ) - { $NewNegativeSerie[$Key] = $BubbleBounds; } - elseif ( $NewNegativeSerie[$Key] > $BubbleBounds ) - { $NewNegativeSerie[$Key] = $BubbleBounds; } - - $LastNegative = $BubbleBounds; - } - } - } - - /* Check for missing values and all the fake positive serie */ - if ( $NewPositiveSerie != "" ) - { - for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewPositiveSerie[$i])) { $NewPositiveSerie[$i] = $LastPositive; } } - - $this->pDataObject->addPoints($NewPositiveSerie,"BubbleFakePositiveSerie"); - } - - /* Check for missing values and all the fake negative serie */ - if ( $NewNegativeSerie != "" ) - { - for ($i=0; $i<$MaxValues; $i++) { if (!isset($NewNegativeSerie[$i])) { $NewNegativeSerie[$i] = $LastNegative; } } - - $this->pDataObject->addPoints($NewNegativeSerie,"BubbleFakeNegativeSerie"); - } - } - - function resetSeriesColors() - { - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - $ID = 0; - foreach($Data["Series"] as $SerieName => $SeriesParameters) - { - if ( $SeriesParameters["isDrawable"] ) - { - $this->pDataObject->Data["Series"][$SerieName]["Color"]["R"] = $Palette[$ID]["R"]; - $this->pDataObject->Data["Series"][$SerieName]["Color"]["G"] = $Palette[$ID]["G"]; - $this->pDataObject->Data["Series"][$SerieName]["Color"]["B"] = $Palette[$ID]["B"]; - $this->pDataObject->Data["Series"][$SerieName]["Color"]["Alpha"] = $Palette[$ID]["Alpha"]; - $ID++; - } - } - } - - /* Prepare the scale */ - function drawBubbleChart($DataSeries,$WeightSeries,$Format="") - { - $ForceAlpha = isset($Format["ForceAlpha"]) ? $Format["ForceAlpha"] : VOID; - $DrawBorder = isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE; - $DrawSquare = isset($Format["DrawSquare"]) ? $Format["DrawSquare"] : FALSE; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 0; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 0; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 0; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - if ( !is_array($DataSeries) ) { $DataSeries = array($DataSeries); } - if ( !is_array($WeightSeries) ) { $WeightSeries = array($WeightSeries); } - - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - if ( isset($Data["Series"]["BubbleFakePositiveSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakePositiveSerie",FALSE); } - if ( isset($Data["Series"]["BubbleFakeNegativeSerie"] ) ) { $this->pDataObject->setSerieDrawable("BubbleFakeNegativeSerie",FALSE); } - - $this->resetSeriesColors(); - - list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings(); - - foreach($DataSeries as $Key => $SerieName) - { - $AxisID = $Data["Series"][$SerieName]["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Data["Series"][$SerieName]["Description"])) { $SerieDescription = $Data["Series"][$SerieName]["Description"]; } else { $SerieDescription = $SerieName; } - - $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; - - $X = $this->pChartObject->GraphAreaX1 + $XMargin; - $Y = $this->pChartObject->GraphAreaY1 + $XMargin; - - $Color = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"]); - - if ( $ForceAlpha != VOID ) { $Color["Alpha"]=$ForceAlpha; } - - if ( $DrawBorder ) - { - $Color["BorderAlpha"] = $BorderAlpha; - - if ( $Surrounding != NULL ) - { $Color["BorderR"] = $Palette[$Key]["R"]+$Surrounding; $Color["BorderG"] = $Palette[$Key]["G"]+$Surrounding; $Color["BorderB"] = $Palette[$Key]["B"]+$Surrounding; } - else - { $Color["BorderR"] = $BorderR; $Color["BorderG"] = $BorderG; $Color["BorderB"] = $BorderB; } - - if ( $ForceAlpha != VOID ) { $Color["BorderAlpha"] = $ForceAlpha/2; } - } - - foreach($Data["Series"][$SerieName]["Data"] as $iKey => $Point) - { - $Weight = $Point + $Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]; - - $PosArray = $this->pChartObject->scaleComputeY($Point,array("AxisID"=>$AxisID)); - $WeightArray = $this->pChartObject->scaleComputeY($Weight,array("AxisID"=>$AxisID)); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; } - $Y = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2); - - if ( $DrawSquare ) - { - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("RECT",floor($X-$CircleRadius).",".floor($Y-$CircleRadius).",".floor($X+$CircleRadius).",".floor($Y+$CircleRadius),$this->pChartObject->toHTMLColor($Palette[$Key]["R"],$Palette[$Key]["G"],$Palette[$Key]["B"]),$SerieDescription,$Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]); } - $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color); - } - else - { - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".floor($CircleRadius),$this->pChartObject->toHTMLColor($Palette[$Key]["R"],$Palette[$Key]["G"],$Palette[$Key]["B"]),$SerieDescription,$Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]); } - $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color); - } - - $X = $X + $XStep; - } - elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; } - $X = floor($PosArray); $CircleRadius = floor(abs($PosArray - $WeightArray)/2); - - if ( $DrawSquare ) - { - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("RECT",floor($X-$CircleRadius).",".floor($Y-$CircleRadius).",".floor($X+$CircleRadius).",".floor($Y+$CircleRadius),$this->pChartObject->toHTMLColor($Palette[$Key]["R"],$Palette[$Key]["G"],$Palette[$Key]["B"]),$SerieDescription,$Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]); } - $this->pChartObject->drawFilledRectangle($X-$CircleRadius,$Y-$CircleRadius,$X+$CircleRadius,$Y+$CircleRadius,$Color); - } - else - { - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".floor($CircleRadius),$this->pChartObject->toHTMLColor($Palette[$Key]["R"],$Palette[$Key]["G"],$Palette[$Key]["B"]),$SerieDescription,$Data["Series"][$WeightSeries[$Key]]["Data"][$iKey]); } - $this->pChartObject->drawFilledCircle($X,$Y,$CircleRadius,$Color); - } - - $Y = $Y + $XStep; - } - } - } - } - - function writeBubbleLabel($SerieName,$SerieWeightName,$Points,$Format="") - { - $OverrideTitle = isset($Format["OverrideTitle"]) ? $Format["OverrideTitle"] : NULL; - $DrawPoint = isset($Format["DrawPoint"]) ? $Format["DrawPoint"] : LABEL_POINT_BOX; - - if ( !is_array($Points) ) { $Point = $Points; $Points = ""; $Points[] = $Point; } - - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - if ( !isset($Data["Series"][$SerieName]) || !isset($Data["Series"][$SerieWeightName]) ) - return(0); - - list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings(); - - $AxisID = $Data["Series"][$SerieName]["Axis"]; - $AxisMode = $Data["Axis"][$AxisID]["Display"]; - $AxisFormat = $Data["Axis"][$AxisID]["Format"]; - $AxisUnit = $Data["Axis"][$AxisID]["Unit"]; - $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; - - $X = $this->pChartObject->GraphAreaX1 + $XMargin; - $Y = $this->pChartObject->GraphAreaY1 + $XMargin; - - $Color = array("R"=>$Data["Series"][$SerieName]["Color"]["R"],"G"=>$Data["Series"][$SerieName]["Color"]["G"],"B"=>$Data["Series"][$SerieName]["Color"]["B"],"Alpha"=>$Data["Series"][$SerieName]["Color"]["Alpha"]); - - foreach($Points as $Key => $Point) - { - $Value = $Data["Series"][$SerieName]["Data"][$Point]; - $PosArray = $this->pChartObject->scaleComputeY($Value,array("AxisID"=>$AxisID)); - - if ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Point]) ) - $Abscissa = $Data["Series"][$Data["Abscissa"]]["Data"][$Point]." : "; - else - $Abscissa = ""; - - $Value = $this->pChartObject->scaleFormat($Value,$AxisMode,$AxisFormat,$AxisUnit); - $Weight = $Data["Series"][$SerieWeightName]["Data"][$Point]; - $Caption = $Abscissa.$Value." / ".$Weight; - - if ( isset($Data["Series"][$SerieName]["Description"]) ) - $Description = $Data["Series"][$SerieName]["Description"]; - else - $Description = "No description"; - - $Series = ""; - $Series[] = array("Format"=>$Color,"Caption"=>$Caption); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; } - - $X = floor($X + $Point * $XStep); - $Y = floor($PosArray); - } - else - { - if ( $XDivs == 0 ) { $YStep = 0; } else { $YStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; } - - $X = floor($PosArray); - $Y = floor($Y + $Point * $YStep); - } - - if ( $DrawPoint == LABEL_POINT_CIRCLE ) - $this->pChartObject->drawFilledCircle($X,$Y,3,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - elseif ( $DrawPoint == LABEL_POINT_BOX ) - $this->pChartObject->drawFilledRectangle($X-2,$Y-2,$X+2,$Y+2,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - - $this->pChartObject->drawLabelBox($X,$Y-3,$Description,$Series,$Format); - } - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pCache.class.php b/Under-Testing/Website/class/pCache.class.php deleted file mode 100644 index 07d1d4e..0000000 --- a/Under-Testing/Website/class/pCache.class.php +++ /dev/null @@ -1,280 +0,0 @@ -CacheFolder = $CacheFolder; - $this->CacheIndex = $CacheIndex; - $this->CacheDB = $CacheDB; - - if (!file_exists($this->CacheFolder."/".$this->CacheIndex)) { touch($this->CacheFolder."/".$this->CacheIndex); } - if (!file_exists($this->CacheFolder."/".$this->CacheDB)) { touch($this->CacheFolder."/".$this->CacheDB); } - } - - /* Flush the cache contents */ - function flush() - { - if (file_exists($this->CacheFolder."/".$this->CacheIndex)) { unlink($this->CacheFolder."/".$this->CacheIndex); touch($this->CacheFolder."/".$this->CacheIndex); } - if (file_exists($this->CacheFolder."/".$this->CacheDB)) { unlink($this->CacheFolder."/".$this->CacheDB); touch($this->CacheFolder."/".$this->CacheDB); } - } - - /* Return the MD5 of the data array to clearly identify the chart */ - function getHash($Data,$Marker="") - { return(md5($Marker.serialize($Data->Data))); } - - /* Write the generated picture to the cache */ - function writeToCache($ID,$pChartObject) - { - /* Compute the paths */ - $TemporaryFile = $this->CacheFolder."/tmp_".rand(0,1000).".png"; - $Database = $this->CacheFolder."/".$this->CacheDB; - $Index = $this->CacheFolder."/".$this->CacheIndex; - - /* Flush the picture to a temporary file */ - imagepng($pChartObject->Picture ,$TemporaryFile); - - /* Retrieve the files size */ - $PictureSize = filesize($TemporaryFile); - $DBSize = filesize($Database); - - /* Save the index */ - $Handle = fopen($Index,"a"); - fwrite($Handle, $ID.",".$DBSize.",".$PictureSize.",".time().",0 \r\n"); - fclose($Handle); - - /* Get the picture raw contents */ - $Handle = fopen($TemporaryFile,"r"); - $Raw = fread($Handle,$PictureSize); - fclose($Handle); - - /* Save the picture in the solid database file */ - $Handle = fopen($Database,"a"); - fwrite($Handle, $Raw); - fclose($Handle); - - /* Remove temporary file */ - unlink($TemporaryFile); - } - - /* Remove object older than the specified TS */ - function removeOlderThan($Expiry) - { $this->dbRemoval(array("Expiry"=>$Expiry)); } - - /* Remove an object from the cache */ - function remove($ID) - { $this->dbRemoval(array("Name"=>$ID)); } - - /* Remove with specified criterias */ - function dbRemoval($Settings) - { - $ID = isset($Settings["Name"]) ? $Settings["Name"] : NULL; - $Expiry = isset($Settings["Expiry"]) ? $Settings["Expiry"] : -(24*60*60); - $TS = time()-$Expiry; - - /* Compute the paths */ - $Database = $this->CacheFolder."/".$this->CacheDB; - $Index = $this->CacheFolder."/".$this->CacheIndex; - $DatabaseTemp = $this->CacheFolder."/".$this->CacheDB.".tmp"; - $IndexTemp = $this->CacheFolder."/".$this->CacheIndex.".tmp"; - - /* Single file removal */ - if ( $ID != NULL ) - { - /* Retrieve object informations */ - $Object = $this->isInCache($ID,TRUE); - - /* If it's not in the cache DB, go away */ - if ( !$Object ) { return(0); } - } - - /* Create the temporary files */ - if (!file_exists($DatabaseTemp)) { touch($DatabaseTemp); } - if (!file_exists($IndexTemp)) { touch($IndexTemp); } - - /* Open the file handles */ - $IndexHandle = @fopen($Index, "r"); - $IndexTempHandle = @fopen($IndexTemp, "w"); - $DBHandle = @fopen($Database, "r"); - $DBTempHandle = @fopen($DatabaseTemp, "w"); - - /* Remove the selected ID from the database */ - while (!feof($IndexHandle)) - { - $Entry = fgets($IndexHandle, 4096); - $Entry = str_replace("\r","",$Entry); - $Entry = str_replace("\n","",$Entry); - $Settings = preg_split("/,/",$Entry); - - if ( $Entry != "" ) - { - $PicID = $Settings[0]; - $DBPos = $Settings[1]; - $PicSize = $Settings[2]; - $GeneratedTS = $Settings[3]; - $Hits = $Settings[4]; - - if ( $Settings[0] != $ID && $GeneratedTS > $TS) - { - $CurrentPos = ftell($DBTempHandle); - fwrite($IndexTempHandle, $PicID.",".$CurrentPos.",".$PicSize.",".$GeneratedTS.",".$Hits."\r\n"); - - fseek($DBHandle,$DBPos); - $Picture = fread($DBHandle,$PicSize); - fwrite($DBTempHandle,$Picture); - } - } - } - - /* Close the handles */ - fclose($IndexHandle); - fclose($IndexTempHandle); - fclose($DBHandle); - fclose($DBTempHandle); - - /* Remove the prod files */ - unlink($Database); - unlink($Index); - - /* Swap the temp & prod DB */ - rename($DatabaseTemp,$Database); - rename($IndexTemp,$Index); - } - - function isInCache($ID,$Verbose=FALSE,$UpdateHitsCount=FALSE) - { - /* Compute the paths */ - $Index = $this->CacheFolder."/".$this->CacheIndex; - - /* Search the picture in the index file */ - $Handle = @fopen($Index, "r"); - while (!feof($Handle)) - { - $IndexPos = ftell($Handle); - $Entry = fgets($Handle, 4096); - if ( $Entry != "" ) - { - $Settings = preg_split("/,/",$Entry); - $PicID = $Settings[0]; - if ( $PicID == $ID ) - { - fclose($Handle); - - $DBPos = $Settings[1]; - $PicSize = $Settings[2]; - $GeneratedTS = $Settings[3]; - $Hits = intval($Settings[4]); - - if ( $UpdateHitsCount ) - { - $Hits++; - if ( strlen($Hits) < 7 ) { $Hits = $Hits.str_repeat(" ",7-strlen($Hits)); } - - $Handle = @fopen($Index, "r+"); - fseek($Handle,$IndexPos); - fwrite($Handle, $PicID.",".$DBPos.",".$PicSize.",".$GeneratedTS.",".$Hits."\r\n"); - fclose($Handle); - } - - if ($Verbose) - { return(array("DBPos"=>$DBPos,"PicSize"=>$PicSize,"GeneratedTS"=>$GeneratedTS,"Hits"=>$Hits)); } - else - { return(TRUE); } - } - } - } - fclose($Handle); - - /* Picture isn't in the cache */ - return(FALSE); - } - - /* Automatic output method based on the calling interface */ - function autoOutput($ID,$Destination="output.png") - { - if (php_sapi_name() == "cli") - $this->saveFromCache($ID,$Destination); - else - $this->strokeFromCache($ID); - } - - function strokeFromCache($ID) - { - /* Get the raw picture from the cache */ - $Picture = $this->getFromCache($ID); - - /* Do we have a hit? */ - if ( $Picture == NULL ) { return(FALSE); } - - header('Content-type: image/png'); - echo $Picture; - - return(TRUE); - } - - function saveFromCache($ID,$Destination) - { - /* Get the raw picture from the cache */ - $Picture = $this->getFromCache($ID); - - /* Do we have a hit? */ - if ( $Picture == NULL ) { return(FALSE); } - - /* Flush the picture to a file */ - $Handle = fopen($Destination,"w"); - fwrite($Handle,$Picture); - fclose($Handle); - - /* All went fine */ - return(TRUE); - } - - function getFromCache($ID) - { - /* Compute the path */ - $Database = $this->CacheFolder."/".$this->CacheDB; - - /* Lookup for the picture in the cache */ - $CacheInfo = $this->isInCache($ID,TRUE,TRUE); - - /* Not in the cache */ - if (!$CacheInfo) { return(NULL); } - - /* Get the database extended information */ - $DBPos = $CacheInfo["DBPos"]; - $PicSize = $CacheInfo["PicSize"]; - - /* Extract the picture from the solid cache file */ - $Handle = @fopen($Database, "r"); - fseek($Handle,$DBPos); - $Picture = fread($Handle,$PicSize); - fclose($Handle); - - /* Return back the raw picture data */ - return($Picture); - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pData.class.php b/Under-Testing/Website/class/pData.class.php deleted file mode 100644 index 9cfbc3f..0000000 --- a/Under-Testing/Website/class/pData.class.php +++ /dev/null @@ -1,723 +0,0 @@ -array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100), - "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100), - "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100), - "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100), - "4"=>array("R"=>176,"G"=>46,"B"=>224,"Alpha"=>100), - "5"=>array("R"=>224,"G"=>46,"B"=>117,"Alpha"=>100), - "6"=>array("R"=>92,"G"=>224,"B"=>46,"Alpha"=>100), - "7"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100)); - - /* Class creator */ - function pData() - { - $this->Data = ""; - $this->Data["XAxisDisplay"] = AXIS_FORMAT_DEFAULT; - $this->Data["XAxisFormat"] = NULL; - $this->Data["XAxisName"] = NULL; - $this->Data["XAxisUnit"] = NULL; - $this->Data["Abscissa"] = NULL; - $this->Data["Axis"][0]["Display"] = AXIS_FORMAT_DEFAULT; - $this->Data["Axis"][0]["Position"] = AXIS_POSITION_LEFT; - $this->Data["Axis"][0]["Identity"] = AXIS_Y; - } - - /* Add a single point or an array to the given serie */ - function addPoints($Values,$SerieName="Serie1") - { - if (!isset($this->Data["Series"][$SerieName])) - $this->initialise($SerieName); - - if ( is_array($Values) ) - { - foreach($Values as $Key => $Value) - { $this->Data["Series"][$SerieName]["Data"][] = $Value; } - } - else - $this->Data["Series"][$SerieName]["Data"][] = $Values; - - if ( $Values != VOID ) - { - $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - } - } - - /* Strip VOID values */ - function stripVOID($Values) - { $Result = array(); foreach($Values as $Key => $Value) { if ( $Value != VOID ) { $Result[] = $Value; } } return($Result); } - - /* Return the number of values contained in a given serie */ - function getSerieCount($Serie) - { if (isset($this->Data["Series"][$Serie]["Data"])) { return(sizeof($this->Data["Series"][$Serie]["Data"])); } else { return(0); } } - - /* Remove a serie from the pData object */ - function removeSerie($Series) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie])) { unset($this->Data["Series"][$Serie]); } } - } - - /* Return a value from given serie & index */ - function getValueAt($Serie,$Index=0) - { if (isset($this->Data["Series"][$Serie]["Data"][$Index])) { return($this->Data["Series"][$Serie]["Data"][$Index]); } else { return(NULL); } } - - /* Return the values array */ - function getValues($Serie) - { if (isset($this->Data["Series"][$Serie]["Data"])) { return($this->Data["Series"][$Serie]["Data"]); } else { return(NULL); } } - - /* Reverse the values in the given serie */ - function reverseSerie($Series) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]["Data"])) { $this->Data["Series"][$Serie]["Data"] = array_reverse($this->Data["Series"][$Serie]["Data"]); } } - } - - /* Return the sum of the serie values */ - function getSum($Serie) - { if (isset($this->Data["Series"][$Serie])) { return(array_sum($this->Data["Series"][$Serie]["Data"])); } else { return(NULL); } } - - /* Return the max value of a given serie */ - function getMax($Serie) - { if (isset($this->Data["Series"][$Serie]["Max"])) { return($this->Data["Series"][$Serie]["Max"]); } else { return(NULL); } } - - /* Return the min value of a given serie */ - function getMin($Serie) - { if (isset($this->Data["Series"][$Serie]["Min"])) { return($this->Data["Series"][$Serie]["Min"]); } else { return(NULL); } } - - /* Set the description of a given serie */ - function setSerieShape($Series,$Shape=SERIE_SHAPE_FILLEDCIRCLE) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Shape"] = $Shape; } } - } - - /* Set the description of a given serie */ - function setSerieDescription($Series,$Description="My serie") - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Description"] = $Description; } } - } - - /* Set a serie as "drawable" while calling a rendering function */ - function setSerieDrawable($Series,$Drawable=TRUE) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["isDrawable"] = $Drawable; } } - } - - /* Set the icon associated to a given serie */ - function setSeriePicture($Series,$Picture=NULL) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if (isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Picture"] = $Picture; } } - } - - /* Set the name of the X Axis */ - function setXAxisName($Name) - { $this->Data["XAxisName"] = $Name; } - - /* Set the display mode of the X Axis */ - function setXAxisDisplay($Mode,$Format=NULL) - { $this->Data["XAxisDisplay"] = $Mode; $this->Data["XAxisFormat"] = $Format; } - - /* Set the unit that will be displayed on the X axis */ - function setXAxisUnit($Unit) - { $this->Data["XAxisUnit"] = $Unit; } - - /* Set the serie that will be used as abscissa */ - function setAbscissa($Serie) - { if (isset($this->Data["Series"][$Serie])) { $this->Data["Abscissa"] = $Serie; } } - - /* Set the name of the abscissa axis */ - function setAbscissaName($Name) - { $this->Data["AbscissaName"] = $Name; } - - /* Create a scatter group specifyin X and Y data series */ - function setScatterSerie($SerieX,$SerieY,$ID=0) - { if (isset($this->Data["Series"][$SerieX]) && isset($this->Data["Series"][$SerieY]) ) { $this->initScatterSerie($ID); $this->Data["ScatterSeries"][$ID]["X"] = $SerieX; $this->Data["ScatterSeries"][$ID]["Y"] = $SerieY; } } - - /* Set the shape of a given sctatter serie */ - function setScatterSerieShape($ID,$Shape=SERIE_SHAPE_FILLEDCIRCLE) - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Shape"] = $Shape; } } - - /* Set the description of a given scatter serie */ - function setScatterSerieDescription($ID,$Description="My serie") - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Description"] = $Description; } } - - /* Set the icon associated to a given scatter serie */ - function setScatterSeriePicture($ID,$Picture=NULL) - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Picture"] = $Picture; } } - - /* Set a scatter serie as "drawable" while calling a rendering function */ - function setScatterSerieDrawable($ID ,$Drawable=TRUE) - { if (isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["isDrawable"] = $Drawable; } } - - /* Define if a scatter serie should be draw with ticks */ - function setScatterSerieTicks($ID,$Width=0) - { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Ticks"] = $Width; } } - - /* Define if a scatter serie should be draw with a special weight */ - function setScatterSerieWeight($ID,$Weight=0) - { if ( isset($this->Data["ScatterSeries"][$ID]) ) { $this->Data["ScatterSeries"][$ID]["Weight"] = $Weight; } } - - /* Associate a color to a scatter serie */ - function setScatterSerieColor($ID,$Format) - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( isset($this->Data["ScatterSeries"][$ID]) ) - { - $this->Data["ScatterSeries"][$ID]["Color"]["R"] = $R; - $this->Data["ScatterSeries"][$ID]["Color"]["G"] = $G; - $this->Data["ScatterSeries"][$ID]["Color"]["B"] = $B; - $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = $Alpha; - } - } - - /* Compute the series limits for an individual and global point of view */ - function limits() - { - $GlobalMin = ABSOLUTE_MAX; - $GlobalMax = ABSOLUTE_MIN; - - foreach($this->Data["Series"] as $Key => $Value) - { - if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"] == TRUE) - { - if ( $GlobalMin > $this->Data["Series"][$Key]["Min"] ) { $GlobalMin = $this->Data["Series"][$Key]["Min"]; } - if ( $GlobalMax < $this->Data["Series"][$Key]["Max"] ) { $GlobalMax = $this->Data["Series"][$Key]["Max"]; } - } - } - $this->Data["Min"] = $GlobalMin; - $this->Data["Max"] = $GlobalMax; - - return(array($GlobalMin,$GlobalMax)); - } - - /* Mark all series as drawable */ - function drawAll() - { foreach($this->Data["Series"] as $Key => $Value) { if ( $this->Data["Abscissa"] != $Key ) { $this->Data["Series"][$Key]["isDrawable"]=TRUE; } } } - - /* Return the average value of the given serie */ - function getSerieAverage($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - return(array_sum($SerieData)/sizeof($SerieData)); - } - else - return(NULL); - } - - /* Return the geometric mean of the given serie */ - function getGeometricMean($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - $Seriesum = 1; foreach($SerieData as $Key => $Value) { $Seriesum = $Seriesum * $Value; } - return(pow($Seriesum,1/sizeof($SerieData))); - } - else - return(NULL); - } - - /* Return the harmonic mean of the given serie */ - function getHarmonicMean($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - $Seriesum = 0; foreach($SerieData as $Key => $Value) { $Seriesum = $Seriesum + 1/$Value; } - return(sizeof($SerieData)/$Seriesum); - } - else - return(NULL); - } - - /* Return the standard deviation of the given serie */ - function getStandardDeviation($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $Average = $this->getSerieAverage($Serie); - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - - $DeviationSum = 0; - foreach($SerieData as $Key => $Value) - $DeviationSum = $DeviationSum + ($Value-$Average)*($Value-$Average); - - $Deviation = sqrt($DeviationSum/count($SerieData)); - - return($Deviation); - } - else - return(NULL); - } - - /* Return the Coefficient of variation of the given serie */ - function getCoefficientOfVariation($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $Average = $this->getSerieAverage($Serie); - $StandardDeviation = $this->getStandardDeviation($Serie); - - if ( $StandardDeviation != 0 ) - return($StandardDeviation/$Average); - else - return(NULL); - } - else - return(NULL); - } - - /* Return the median value of the given serie */ - function getSerieMedian($Serie) - { - if ( isset($this->Data["Series"][$Serie]) ) - { - $SerieData = $this->stripVOID($this->Data["Series"][$Serie]["Data"]); - sort($SerieData); - $SerieCenter = floor(sizeof($SerieData)/2); - - if ( isset($SerieData[$SerieCenter]) ) - return($SerieData[$SerieCenter]); - else - return(NULL); - } - else - return(NULL); - } - - /* Return the x th percentil of the given serie */ - function getSeriePercentile($Serie="Serie1",$Percentil=95) - { - if (!isset($this->Data["Series"][$Serie]["Data"])) { return(NULL); } - - $Values = count($this->Data["Series"][$Serie]["Data"])-1; - if ( $Values < 0 ) { $Values = 0; } - - $PercentilID = floor(($Values/100)*$Percentil+.5); - $SortedValues = $this->Data["Series"][$Serie]["Data"]; - sort($SortedValues); - - if ( is_numeric($SortedValues[$PercentilID]) ) - return($SortedValues[$PercentilID]); - else - return(NULL); - } - - /* Add random values to a given serie */ - function addRandomValues($SerieName="Serie1",$Options="") - { - $Values = isset($Options["Values"]) ? $Options["Values"] : 20; - $Min = isset($Options["Min"]) ? $Options["Min"] : 0; - $Max = isset($Options["Max"]) ? $Options["Max"] : 100; - $withFloat = isset($Options["withFloat"]) ? $Options["withFloat"] : FALSE; - - for ($i=0;$i<=$Values;$i++) - { - if ( $withFloat ) { $Value = rand($Min*100,$Max*100)/100; } else { $Value = rand($Min,$Max); } - $this->addPoints($Value,$SerieName); - } - } - - /* Test if we have valid data */ - function containsData() - { - if (!isset($this->Data["Series"])) { return(FALSE); } - - $Result = FALSE; - foreach($this->Data["Series"] as $Key => $Value) - { if ( $this->Data["Abscissa"] != $Key && $this->Data["Series"][$Key]["isDrawable"]==TRUE) { $Result=TRUE; } } - return($Result); - } - - /* Set the display mode of an Axis */ - function setAxisDisplay($AxisID,$Mode=AXIS_FORMAT_DEFAULT,$Format=NULL) - { - if ( isset($this->Data["Axis"][$AxisID] ) ) - { - $this->Data["Axis"][$AxisID]["Display"] = $Mode; - if ( $Format != NULL ) { $this->Data["Axis"][$AxisID]["Format"] = $Format; } - } - } - - /* Set the position of an Axis */ - function setAxisPosition($AxisID,$Position=AXIS_POSITION_LEFT) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Position"] = $Position; } } - - /* Associate an unit to an axis */ - function setAxisUnit($AxisID,$Unit) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Unit"] = $Unit; } } - - /* Associate a name to an axis */ - function setAxisName($AxisID,$Name) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Name"] = $Name; } } - - /* Associate a color to an axis */ - function setAxisColor($AxisID,$Format) - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( isset($this->Data["Axis"][$AxisID] ) ) - { - $this->Data["Axis"][$AxisID]["Color"]["R"] = $R; - $this->Data["Axis"][$AxisID]["Color"]["G"] = $G; - $this->Data["Axis"][$AxisID]["Color"]["B"] = $B; - $this->Data["Axis"][$AxisID]["Color"]["Alpha"] = $Alpha; - } - } - - - /* Design an axis as X or Y member */ - function setAxisXY($AxisID,$Identity=AXIS_Y) - { if ( isset($this->Data["Axis"][$AxisID] ) ) { $this->Data["Axis"][$AxisID]["Identity"] = $Identity; } } - - /* Associate one data serie with one axis */ - function setSerieOnAxis($Series,$AxisID) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) - { - $PreviousAxis = $this->Data["Series"][$Serie]["Axis"]; - - /* Create missing axis */ - if ( !isset($this->Data["Axis"][$AxisID] ) ) - { $this->Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; $this->Data["Axis"][$AxisID]["Identity"] = AXIS_Y;} - - $this->Data["Series"][$Serie]["Axis"] = $AxisID; - - /* Cleanup unused axis */ - $Found = FALSE; - foreach($this->Data["Series"] as $SerieName => $Values) { if ( $Values["Axis"] == $PreviousAxis ) { $Found = TRUE; } } - if (!$Found) { unset($this->Data["Axis"][$PreviousAxis]); } - } - } - - /* Define if a serie should be draw with ticks */ - function setSerieTicks($Series,$Width=0) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Ticks"] = $Width; } } - } - - /* Define if a serie should be draw with a special weight */ - function setSerieWeight($Series,$Weight=0) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - foreach($Series as $Key => $Serie) { if ( isset($this->Data["Series"][$Serie]) ) { $this->Data["Series"][$Serie]["Weight"] = $Weight; } } - } - - /* Returns the palette of the given serie */ - function getSeriePalette($Serie) - { - if ( !isset($this->Data["Series"][$Serie]) ) { return(NULL); } - - $Result = ""; - $Result["R"] = $this->Data["Series"][$Serie]["Color"]["R"]; - $Result["G"] = $this->Data["Series"][$Serie]["Color"]["G"]; - $Result["B"] = $this->Data["Series"][$Serie]["Color"]["B"]; - $Result["Alpha"] = $this->Data["Series"][$Serie]["Color"]["Alpha"]; - - return($Result); - } - - /* Set the color of one serie */ - function setPalette($Series,$Format=NULL) - { - if ( !is_array($Series) ) { $Series = $this->convertToArray($Series); } - - foreach($Series as $Key => $Serie) - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( isset($this->Data["Series"][$Serie]) ) - { - $OldR = $this->Data["Series"][$Serie]["Color"]["R"]; $OldG = $this->Data["Series"][$Serie]["Color"]["G"]; $OldB = $this->Data["Series"][$Serie]["Color"]["B"]; - $this->Data["Series"][$Serie]["Color"]["R"] = $R; - $this->Data["Series"][$Serie]["Color"]["G"] = $G; - $this->Data["Series"][$Serie]["Color"]["B"] = $B; - $this->Data["Series"][$Serie]["Color"]["Alpha"] = $Alpha; - - /* Do reverse processing on the internal palette array */ - foreach ($this->Palette as $Key => $Value) - { if ($Value["R"] == $OldR && $Value["G"] == $OldG && $Value["B"] == $OldB) { $this->Palette[$Key]["R"] = $R; $this->Palette[$Key]["G"] = $G; $this->Palette[$Key]["B"] = $B; $this->Palette[$Key]["Alpha"] = $Alpha;} } - } - } - } - - /* Load a palette file */ - function loadPalette($FileName,$Overwrite=FALSE) - { - if ( !file_exists($FileName) ) { return(-1); } - if ( $Overwrite ) { $this->Palette = ""; } - - $fileHandle = @fopen($FileName, "r"); - if (!$fileHandle) { return(-1); } - while (!feof($fileHandle)) - { - $buffer = fgets($fileHandle, 4096); - if ( preg_match("/,/",$buffer) ) - { - list($R,$G,$B,$Alpha) = preg_split("/,/",$buffer); - if ( $this->Palette == "" ) { $ID = 0; } else { $ID = count($this->Palette); } - $this->Palette[$ID] = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - } - } - fclose($fileHandle); - - /* Apply changes to current series */ - $ID = 0; - if ( isset($this->Data["Series"])) - { - foreach($this->Data["Series"] as $Key => $Value) - { - if ( !isset($this->Palette[$ID]) ) - $this->Data["Series"][$Key]["Color"] = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>0); - else - $this->Data["Series"][$Key]["Color"] = $this->Palette[$ID]; - $ID++; - } - } - } - - /* Initialise a given scatter serie */ - function initScatterSerie($ID) - { - if ( isset($this->Data["ScatterSeries"][$ID]) ) { return(0); } - - $this->Data["ScatterSeries"][$ID]["Description"] = "Scatter ".$ID; - $this->Data["ScatterSeries"][$ID]["isDrawable"] = TRUE; - $this->Data["ScatterSeries"][$ID]["Picture"] = NULL; - $this->Data["ScatterSeries"][$ID]["Ticks"] = 0; - $this->Data["ScatterSeries"][$ID]["Weight"] = 0; - - if ( isset($this->Palette[$ID]) ) - $this->Data["ScatterSeries"][$ID]["Color"] = $this->Palette[$ID]; - else - { - $this->Data["ScatterSeries"][$ID]["Color"]["R"] = rand(0,255); - $this->Data["ScatterSeries"][$ID]["Color"]["G"] = rand(0,255); - $this->Data["ScatterSeries"][$ID]["Color"]["B"] = rand(0,255); - $this->Data["ScatterSeries"][$ID]["Color"]["Alpha"] = 100; - } - } - - /* Initialise a given serie */ - function initialise($Serie) - { - if ( isset($this->Data["Series"]) ) { $ID = count($this->Data["Series"]); } else { $ID = 0; } - - $this->Data["Series"][$Serie]["Description"] = $Serie; - $this->Data["Series"][$Serie]["isDrawable"] = TRUE; - $this->Data["Series"][$Serie]["Picture"] = NULL; - $this->Data["Series"][$Serie]["Max"] = NULL; - $this->Data["Series"][$Serie]["Min"] = NULL; - $this->Data["Series"][$Serie]["Axis"] = 0; - $this->Data["Series"][$Serie]["Ticks"] = 0; - $this->Data["Series"][$Serie]["Weight"] = 0; - $this->Data["Series"][$Serie]["Shape"] = SERIE_SHAPE_FILLEDCIRCLE; - - if ( isset($this->Palette[$ID]) ) - $this->Data["Series"][$Serie]["Color"] = $this->Palette[$ID]; - else - { - $this->Data["Series"][$Serie]["Color"]["R"] = rand(0,255); - $this->Data["Series"][$Serie]["Color"]["G"] = rand(0,255); - $this->Data["Series"][$Serie]["Color"]["B"] = rand(0,255); - $this->Data["Series"][$Serie]["Color"]["Alpha"] = 100; - } - } - - function normalize($NormalizationFactor=100,$UnitChange=NULL,$Round=1) - { - $Abscissa = $this->Data["Abscissa"]; - - $SelectedSeries = ""; - $MaxVal = 0; - foreach($this->Data["Axis"] as $AxisID => $Axis) - { - if ( $UnitChange != NULL ) { $this->Data["Axis"][$AxisID]["Unit"] = $UnitChange; } - - foreach($this->Data["Series"] as $SerieName => $Serie) - { - if ($Serie["Axis"] == $AxisID && $Serie["isDrawable"] == TRUE && $SerieName != $Abscissa) - { - $SelectedSeries[$SerieName] = $SerieName; - - if ( count($Serie["Data"] ) > $MaxVal ) { $MaxVal = count($Serie["Data"]); } - } - } - } - - for($i=0;$i<=$MaxVal-1;$i++) - { - $Factor = 0; - foreach ($SelectedSeries as $Key => $SerieName ) - { - $Value = $this->Data["Series"][$SerieName]["Data"][$i]; - if ( $Value != VOID ) - $Factor = $Factor + abs($Value); - } - - if ( $Factor != 0 ) - { - $Factor = $NormalizationFactor / $Factor; - - foreach ($SelectedSeries as $Key => $SerieName ) - { - $Value = $this->Data["Series"][$SerieName]["Data"][$i]; - - if ( $Value != VOID && $Factor != $NormalizationFactor ) - $this->Data["Series"][$SerieName]["Data"][$i] = round(abs($Value)*$Factor,$Round); - elseif ( $Value == VOID || $Value == 0 ) - $this->Data["Series"][$SerieName]["Data"][$i] = VOID; - elseif ( $Factor == $NormalizationFactor ) - $this->Data["Series"][$SerieName]["Data"][$i] = $NormalizationFactor; - } - } - } - - foreach ($SelectedSeries as $Key => $SerieName ) - { - $this->Data["Series"][$SerieName]["Max"] = max($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - $this->Data["Series"][$SerieName]["Min"] = min($this->stripVOID($this->Data["Series"][$SerieName]["Data"])); - } - } - - /* Load data from a CSV (or similar) data source */ - function importFromCSV($FileName,$Options="") - { - $Delimiter = isset($Options["Delimiter"]) ? $Options["Delimiter"] : ","; - $GotHeader = isset($Options["GotHeader"]) ? $Options["GotHeader"] : FALSE; - $SkipColumns = isset($Options["SkipColumns"]) ? $Options["SkipColumns"] : array(-1); - $DefaultSerieName = isset($Options["DefaultSerieName"]) ? $Options["DefaultSerieName"] : "Serie"; - - $Handle = @fopen($FileName,"r"); - if ($Handle) - { - $HeaderParsed = FALSE; $SerieNames = ""; - while (!feof($Handle)) - { - $Buffer = fgets($Handle, 4096); - $Buffer = str_replace(chr(10),"",$Buffer); - $Buffer = str_replace(chr(13),"",$Buffer); - $Values = preg_split("/".$Delimiter."/",$Buffer); - - if ( $Buffer != "" ) - { - if ( $GotHeader && !$HeaderParsed ) - { - foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $Name; } } - $HeaderParsed = TRUE; - } - else - { - if ($SerieNames == "" ) { foreach($Values as $Key => $Name) { if ( !in_array($Key,$SkipColumns) ) { $SerieNames[$Key] = $DefaultSerieName.$Key; } } } - foreach($Values as $Key => $Value) { if ( !in_array($Key,$SkipColumns) ) { $this->addPoints($Value,$SerieNames[$Key]); } } - } - } - } - fclose($Handle); - } - } - - /* Return the data & configuration of the series */ - function getData() - { return($this->Data); } - - /* Save a palette element */ - function savePalette($ID,$Color) - { $this->Palette[$ID] = $Color; } - - /* Return the palette of the series */ - function getPalette() - { return($this->Palette); } - - /* Called by the scaling algorithm to save the config */ - function saveAxisConfig($Axis) { $this->Data["Axis"]=$Axis; } - - /* Save the Y Margin if set */ - function saveYMargin($Value) { $this->Data["YMargin"]=$Value; } - - /* Save extended configuration to the pData object */ - function saveExtendedData($Tag,$Values) { $this->Data["Extended"][$Tag]=$Values; } - - /* Called by the scaling algorithm to save the orientation of the scale */ - function saveOrientation($Orientation) { $this->Data["Orientation"]=$Orientation; } - - /* Convert a string to a single elements array */ - function convertToArray($Value) - { $Values = ""; $Values[] = $Value; return($Values); } - - /* Class string wrapper */ - function __toString() - { return("pData object."); } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pDraw.class.php b/Under-Testing/Website/class/pDraw.class.php deleted file mode 100644 index 85e408e..0000000 --- a/Under-Testing/Website/class/pDraw.class.php +++ /dev/null @@ -1,5799 +0,0 @@ -DataSet->getData(); - - foreach($Data["Series"] as $SerieName => $Serie) - { if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) { $Results++; } } - - return($Results); - } - - /* Fix box coordinates */ - function fixBoxCoordinates($Xa,$Ya,$Xb,$Yb) - { - $X1 = min($Xa,$Xb); $Y1 = min($Ya,$Yb); - $X2 = max($Xa,$Xb); $Y2 = max($Ya,$Yb); - - return(array($X1,$Y1,$X2,$Y2)); - } - - /* Draw a polygon */ - function drawPolygon($Points,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $NoFill = isset($Format["NoFill"]) ? $Format["NoFill"] : FALSE; - $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BorderAlpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $Alpha / 2; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $SkipX = isset($Format["SkipX"]) ? $Format["SkipX"] : OUT_OF_SIGHT; - $SkipY = isset($Format["SkipY"]) ? $Format["SkipY"] : OUT_OF_SIGHT; - - /* Calling the ImageFilledPolygon() function over the $Points array will round it */ - $Backup = $Points; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - - if ( $SkipX != OUT_OF_SIGHT ) { $SkipX = floor($SkipX); } - if ( $SkipY != OUT_OF_SIGHT ) { $SkipY = floor($SkipY); } - - $RestoreShadow = $this->Shadow; - if ( !$NoFill ) - { - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - for($i=0;$i<=count($Points)-1;$i=$i+2) - { $Shadow[] = $Points[$i] + $this->ShadowX; $Shadow[] = $Points[$i+1] + $this->ShadowY; } - $this->drawPolygon($Shadow,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"NoBorder"=>TRUE)); - } - - $FillColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - - if ( count($Points) >= 6 ) - { ImageFilledPolygon($this->Picture,$Points,count($Points)/2,$FillColor); } - } - - if ( !$NoBorder ) - { - $Points = $Backup; - - if ( $NoFill ) - $BorderSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - else - $BorderSettings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha); - - for($i=0;$i<=count($Points)-1;$i=$i+2) - { - if ( isset($Points[$i+2]) ) - { - if ( !($Points[$i] == $Points[$i+2] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[$i+3] && $Points[$i+1] == $SkipY ) ) - $this->drawLine($Points[$i],$Points[$i+1],$Points[$i+2],$Points[$i+3],$BorderSettings); - } - else - { - if ( !($Points[$i] == $Points[0] && $Points[$i] == $SkipX ) && !($Points[$i+1] == $Points[1] && $Points[$i+1] == $SkipY ) ) - $this->drawLine($Points[$i],$Points[$i+1],$Points[0],$Points[1],$BorderSettings); - } - } - } - - $this->Shadow = $RestoreShadow; - } - - /* Apply AALias correction to the rounded box boundaries */ - function offsetCorrection($Value,$Mode) - { - $Value = round($Value,1); - - if ( $Value == 0 && $Mode == 1 ) { return(.9); } - if ( $Value == 0 ) { return(0); } - - if ( $Mode == 1) - { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.9); }; if ( $Value == .2 ) { return(.8); }; if ( $Value == .3 ) { return(.8); }; if ( $Value == .4 ) { return(.7); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.6); }; if ( $Value == .9 ) { return(.9); }; } - - if ( $Mode == 2) - { if ( $Value == 1 ) { return(.9); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.5); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.8); }; if ( $Value == .9 ) { return(.9); }; } - - if ( $Mode == 3) - { if ( $Value == 1 ) { return(.1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.4); }; if ( $Value == .5 ) { return(.9); }; if ( $Value == .6 ) { return(.6); }; if ( $Value == .7 ) { return(.7); }; if ( $Value == .8 ) { return(.4); }; if ( $Value == .9 ) { return(.5); }; } - - if ( $Mode == 4) - { if ( $Value == 1 ) { return(-1); }; if ( $Value == .1 ) { return(.1); }; if ( $Value == .2 ) { return(.2); }; if ( $Value == .3 ) { return(.3); }; if ( $Value == .4 ) { return(.1); }; if ( $Value == .5 ) { return(-.1); }; if ( $Value == .6 ) { return(.8); }; if ( $Value == .7 ) { return(.1); }; if ( $Value == .8 ) { return(.1); }; if ( $Value == .9 ) { return(.1); }; } - } - - /* Draw a rectangle with rounded corners */ - function drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2); - - if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1))/2); } - if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1))/2); } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE); - - if ( $Radius <= 0 ) { $this->drawRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); } - - if ( $this->Antialias ) - { - $this->drawLine($X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color); - $this->drawLine($X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color); - $this->drawLine($X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color); - $this->drawLine($X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color); - } - else - { - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imageline($this->Picture,$X1+$Radius,$Y1,$X2-$Radius,$Y1,$Color); - imageline($this->Picture,$X2,$Y1+$Radius,$X2,$Y2-$Radius,$Color); - imageline($this->Picture,$X2-$Radius,$Y2,$X1+$Radius,$Y2,$Color); - imageline($this->Picture,$X1,$Y1+$Radius,$X1,$Y2-$Radius,$Color); - } - - $Step = 360 / (2 * PI * $Radius); - for($i=0;$i<=90;$i=$i+$Step) - { - $X = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius; - $Y = sin(($i+180)*PI/180) * $Radius + $Y1 + $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $X = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius; - $Y = sin(($i+90)*PI/180) * $Radius + $Y2 - $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $X = cos($i*PI/180) * $Radius + $X2 - $Radius; - $Y = sin($i*PI/180) * $Radius + $Y2 - $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $X = cos(($i+270)*PI/180) * $Radius + $X2 - $Radius; - $Y = sin(($i+270)*PI/180) * $Radius + $Y1 + $Radius; - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - } - - /* Draw a rectangle with rounded corners */ - function drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - - /* Temporary fix for AA issue */ - $Y1 = floor($Y1); $Y2 = floor($Y2); $X1 = floor($X1); $X2 = floor($X2); - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; } - - list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2); - - if ( $X2 - $X1 < $Radius*2 ) { $Radius = floor((($X2-$X1))/4); } - if ( $Y2 - $Y1 < $Radius*2 ) { $Radius = floor((($Y2-$Y1))/4); } - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE); - - if ( $Radius <= 0 ) { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); return(0); } - - $YTop = $Y1+$Radius; - $YBottom = $Y2-$Radius; - - $Step = 360 / (2 * PI * $Radius); - $Positions = ""; $Radius--; $MinY = ""; $MaxY = ""; - for($i=0;$i<=90;$i=$i+$Step) - { - $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius; - $Yp = floor(sin(($i+180)*PI/180) * $Radius + $YTop); - if ( $MinY == "" || $Yp > $MinY ) { $MinY = $Yp; } - - if ( $Xp2 >= floor($X2) ) { $Xp2--; } - $Xp1++; - - if ( !isset($Positions[$Yp]) ) - { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; } - else - { $Positions[$Yp]["X1"] = ($Positions[$Yp]["X1"]+$Xp1)/2; $Positions[$Yp]["X2"] = ($Positions[$Yp]["X2"]+$Xp2)/2; } - - $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius; - $Yp = floor(sin(($i+90)*PI/180) * $Radius + $YBottom); - if ( $MaxY == "" || $Yp < $MaxY ) { $MaxY = $Yp; } - - if ( $Xp2 >= floor($X2) ) { $Xp2--; } - $Xp1++; - - if ( !isset($Positions[$Yp]) ) - { $Positions[$Yp]["X1"] = $Xp1; $Positions[$Yp]["X2"] = $Xp2; } - else - { $Positions[$Yp]["X1"] = ($Positions[$Yp]["X1"]+$Xp1)/2; $Positions[$Yp]["X2"] = ($Positions[$Yp]["X2"]+$Xp2)/2; } - } - - $ManualColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - foreach($Positions as $Yp => $Bounds) - { - $X1 = $Bounds["X1"]; $X1Dec = $this->getFirstDecimal($X1); if ( $X1Dec != 0 ) { $X1 = floor($X1)+1; } - $X2 = $Bounds["X2"]; $X2Dec = $this->getFirstDecimal($X2); if ( $X2Dec != 0 ) { $X2 = floor($X2)-1; } - imageline($this->Picture,$X1,$Yp,$X2,$Yp,$ManualColor); - } - $this->drawFilledRectangle($X1,$MinY+1,floor($X2),$MaxY-1,$Color); - - $Radius++; - $this->drawRoundedRectangle($X1,$Y1,$X2+1,$Y2-1,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - $this->Shadow = $RestoreShadow; - } - - /* Draw a rectangle with rounded corners */ - function drawRoundedFilledRectangle_deprecated($X1,$Y1,$X2,$Y2,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $BorderR == -1 ) { $BorderR = $R; $BorderG = $G; $BorderB = $B; } - - list($X1,$Y1,$X2,$Y2) = $this->fixBoxCoordinates($X1,$Y1,$X2,$Y2); - - if ( $X2 - $X1 < $Radius ) { $Radius = floor((($X2-$X1)+2)/2); } - if ( $Y2 - $Y1 < $Radius ) { $Radius = floor((($Y2-$Y1)+2)/2); } - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawRoundedFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - if ( $this->getFirstDecimal($X2) >= 5 ) { $XOffset2 = 1; } else { $XOffset2 = 0; } - if ( $this->getFirstDecimal($X1) <= 5 ) { $XOffset1 = 1; } else { $XOffset1 = 0; } - - if ( !$this->Antialias ) { $XOffset1 = 1; $XOffset2 = 1; } - - $YTop = floor($Y1+$Radius); - $YBottom = floor($Y2-$Radius); - - $this->drawFilledRectangle($X1-$XOffset1,$YTop,$X2+$XOffset2,$YBottom,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"NoBorder"=>TRUE)); - - $Step = 360 / (2 * PI * $Radius); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - $Color2 = $this->allocateColor($this->Picture,255,0,0,$Alpha); - $Drawn = ""; - - if ( $Alpha < 100 ) { $Drawn[$YTop] = FALSE; } - if ( $Alpha < 100 ) { $Drawn[$YBottom] = TRUE; } - - for($i=0;$i<=90;$i=$i+$Step) - { - $Xp1 = cos(($i+180)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos(((90-$i)+270)*PI/180) * $Radius + $X2 - $Radius; - $Yp = sin(($i+180)*PI/180) * $Radius + $YTop; - - if ( $this->getFirstDecimal($Xp1) > 5 ) { $XOffset1 = 1; } else { $XOffset1 = 0; } - if ( $this->getFirstDecimal($Xp2) > 5 ) { $XOffset2 = 1; } else { $XOffset2 = 0; } - if ( $this->getFirstDecimal($Yp) > 5 ) { $YOffset = 1; } else { $YOffset = 0; } - - if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 ) - imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color); - - $Drawn[$Yp+$YOffset] = $Xp2; - - $Xp1 = cos(($i+90)*PI/180) * $Radius + $X1 + $Radius; - $Xp2 = cos((90-$i)*PI/180) * $Radius + $X2 - $Radius; - $Yp = sin(($i+90)*PI/180) * $Radius + $YBottom; - - if ( $this->getFirstDecimal($Xp1) > 7 ) { $XOffset1 = 1; } else { $XOffset1 = 0; } - if ( $this->getFirstDecimal($Xp2) > 7 ) { $XOffset2 = 1; } else { $XOffset2 = 0; } - if ( $this->getFirstDecimal($Yp) > 5 ) { $YOffset = 1; } else { $YOffset = 0; } - - if ( !isset($Drawn[$Yp+$YOffset]) || $Alpha == 100 ) - imageline($this->Picture,$Xp1+$XOffset1,$Yp+$YOffset,$Xp2+$XOffset2,$Yp+$YOffset,$Color); - - $Drawn[$Yp+$YOffset] = $Xp2; - } - - $this->drawRoundedRectangle($X1,$Y1,$X2,$Y2,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - $this->Shadow = $RestoreShadow; - } - - /* Draw a rectangle */ - function drawRectangle($X1,$Y1,$X2,$Y2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE; - - if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); } - if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); } - - if ( $this->Antialias ) - { - if ( $NoAngle ) - { - $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2,$Y1+1,$X2,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X1,$Y1+1,$X1,$Y2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - else - { - $this->drawLine($X1+1,$Y1,$X2-1,$Y1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2,$Y1,$X2,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X2-1,$Y2,$X1+1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - $this->drawLine($X1,$Y1,$X1,$Y2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - } - else - { - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imagerectangle($this->Picture,$X1,$Y1,$X2,$Y2,$Color); - } - } - - /* Draw a filled rectangle */ - function drawFilledRectangle($X1,$Y1,$X2,$Y2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : NULL; - $Dash = isset($Format["Dash"]) ? $Format["Dash"] : FALSE; - $DashStep = isset($Format["DashStep"]) ? $Format["DashStep"] : 4; - $DashR = isset($Format["DashR"]) ? $Format["DashR"] : 0; - $DashG = isset($Format["DashG"]) ? $Format["DashG"] : 0; - $DashB = isset($Format["DashB"]) ? $Format["DashB"] : 0; - $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - - if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); } - if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); } - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawFilledRectangle($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle)); - } - - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - if ( $NoAngle ) - { - imagefilledrectangle($this->Picture,ceil($X1)+1,ceil($Y1),floor($X2)-1,floor($Y2),$Color); - imageline($this->Picture,ceil($X1),ceil($Y1)+1,ceil($X1),floor($Y2)-1,$Color); - imageline($this->Picture,floor($X2),ceil($Y1)+1,floor($X2),floor($Y2)-1,$Color); - } - else - imagefilledrectangle($this->Picture,ceil($X1),ceil($Y1),floor($X2),floor($Y2),$Color); - - if ( $Dash ) - { - if ( $BorderR != -1 ) { $iX1=$X1+1; $iY1=$Y1+1; $iX2=$X2-1; $iY2=$Y2-1; } else { $iX1=$X1; $iY1=$Y1; $iX2=$X2; $iY2=$Y2; } - - $Color = $this->allocateColor($this->Picture,$DashR,$DashG,$DashB,$Alpha); - $Y=$iY1-$DashStep; - for($X=$iX1; $X<=$iX2+($iY2-$iY1); $X=$X+$DashStep) - { - $Y=$Y+$DashStep; - if ( $X > $iX2 ) { $Xa = $X-($X-$iX2); $Ya = $iY1+($X-$iX2); } else { $Xa = $X; $Ya = $iY1; } - if ( $Y > $iY2 ) { $Xb = $iX1+($Y-$iY2); $Yb = $Y-($Y-$iY2); } else { $Xb = $iX1; $Yb = $Y; } - imageline($this->Picture,$Xa,$Ya,$Xb,$Yb,$Color); - } - } - - if ( $this->Antialias && !$NoBorder ) - { - if ( $X1 < ceil($X1) ) - { - $AlphaA = $Alpha * (ceil($X1) - $X1); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,ceil($X1)-1,ceil($Y1),ceil($X1)-1,floor($Y2),$Color); - } - - if ( $Y1 < ceil($Y1) ) - { - $AlphaA = $Alpha * (ceil($Y1) - $Y1); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,ceil($X1),ceil($Y1)-1,floor($X2),ceil($Y1)-1,$Color); - } - - if ( $X2 > floor($X2) ) - { - $AlphaA = $Alpha * (.5-($X2 - floor($X2))); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,floor($X2)+1,ceil($Y1),floor($X2)+1,floor($Y2),$Color); - } - - if ( $Y2 > floor($Y2) ) - { - $AlphaA = $Alpha * (.5-($Y2 - floor($Y2))); - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$AlphaA); - imageline($this->Picture,ceil($X1),floor($Y2)+1,floor($X2),floor($Y2)+1,$Color); - } - } - - if ( $BorderR != -1 ) - $this->drawRectangle($X1,$Y1,$X2,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks,"NoAngle"=>$NoAngle)); - - $this->Shadow = $RestoreShadow; - } - - /* Draw a rectangular marker of the specified size */ - function drawRectangleMarker($X,$Y,$Format="") - { - $Size = isset($Format["Size"]) ? $Format["Size"] : 4; - - $HalfSize = floor($Size/2); - $this->drawFilledRectangle($X-$HalfSize,$Y-$HalfSize,$X+$HalfSize,$Y+$HalfSize,$Format); - } - - /* Drawn a spline based on the bezier function */ - function drawSpline($Coordinates,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Force = isset($Format["Force"]) ? $Format["Force"] : 30; - $Forces = isset($Format["Forces"]) ? $Format["Forces"] : NULL; - $ShowC = isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $PathOnly = isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - - $Cpt = NULL; $Mode = NULL; $Result = ""; - for($i=1;$i<=count($Coordinates)-1;$i++) - { - $X1 = $Coordinates[$i-1][0]; $Y1 = $Coordinates[$i-1][1]; - $X2 = $Coordinates[$i][0]; $Y2 = $Coordinates[$i][1]; - - if ( $Forces != NULL ) { $Force = $Forces[$i]; } - - /* First segment */ - if ( $i == 1 ) - { $Xv1 = $X1; $Yv1 = $Y1; } - else - { - $Angle1 = $this->getAngle($XLast,$YLast,$X1,$Y1); - $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2); - $XOff = cos($Angle2 * PI / 180) * $Force + $X1; - $YOff = sin($Angle2 * PI / 180) * $Force + $Y1; - - $Xv1 = cos($Angle1 * PI / 180) * $Force + $XOff; - $Yv1 = sin($Angle1 * PI / 180) * $Force + $YOff; - } - - /* Last segment */ - if ( $i == count($Coordinates)-1 ) - { $Xv2 = $X2; $Yv2 = $Y2; } - else - { - $Angle1 = $this->getAngle($X2,$Y2,$Coordinates[$i+1][0],$Coordinates[$i+1][1]); - $Angle2 = $this->getAngle($X1,$Y1,$X2,$Y2); - $XOff = cos(($Angle2+180) * PI / 180) * $Force + $X2; - $YOff = sin(($Angle2+180) * PI / 180) * $Force + $Y2; - - $Xv2 = cos(($Angle1+180) * PI / 180) * $Force + $XOff; - $Yv2 = sin(($Angle1+180) * PI / 180) * $Force + $YOff; - } - - $Path = $this->drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format); - if ($PathOnly) { $Result[] = $Path; } - - $XLast = $X1; $YLast = $Y1; - } - - return($Result); - } - - /* Draw a bezier curve with two controls points */ - function drawBezier($X1,$Y1,$X2,$Y2,$Xv1,$Yv1,$Xv2,$Yv2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $ShowC = isset($Format["ShowControl"]) ? $Format["ShowControl"] : FALSE; - $Segments = isset($Format["Segments"]) ? $Format["Segments"] : NULL; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $NoDraw = isset($Format["NoDraw"]) ? $Format["NoDraw"] : FALSE; - $PathOnly = isset($Format["PathOnly"]) ? $Format["PathOnly"] : FALSE; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - $DrawArrow = isset($Format["DrawArrow"]) ? $Format["DrawArrow"] : FALSE; - $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 10; - $ArrowRatio = isset($Format["ArrowRatio"]) ? $Format["ArrowRatio"] : .5; - $ArrowTwoHeads = isset($Format["ArrowTwoHeads"]) ? $Format["ArrowTwoHeads"] : FALSE; - - if ( $Segments == NULL ) - { - $Length = $this->getLength($X1,$Y1,$X2,$Y2); - $Precision = ($Length*125)/1000; - } - else - $Precision = $Segments; - - $P[0]["X"] = $X1; $P[0]["Y"] = $Y1; - $P[1]["X"] = $Xv1; $P[1]["Y"] = $Yv1; - $P[2]["X"] = $Xv2; $P[2]["Y"] = $Yv2; - $P[3]["X"] = $X2; $P[3]["Y"] = $Y2; - - /* Compute the bezier points */ - $Q = ""; $ID = 0; $Path = ""; - for($i=0;$i<=$Precision;$i=$i+1) - { - $u = $i / $Precision; - - $C = ""; - $C[0] = (1 - $u) * (1 - $u) * (1 - $u); - $C[1] = ($u * 3) * (1 - $u) * (1 - $u); - $C[2] = 3 * $u * $u * (1 - $u); - $C[3] = $u * $u * $u; - - for($j=0;$j<=3;$j++) - { - if ( !isset($Q[$ID]) ) { $Q[$ID] = ""; } - if ( !isset($Q[$ID]["X"]) ) { $Q[$ID]["X"] = 0; } - if ( !isset($Q[$ID]["Y"]) ) { $Q[$ID]["Y"] = 0; } - - $Q[$ID]["X"] = $Q[$ID]["X"] + $P[$j]["X"] * $C[$j]; - $Q[$ID]["Y"] = $Q[$ID]["Y"] + $P[$j]["Y"] * $C[$j]; - } - $ID++; - } - $Q[$ID]["X"] = $X2; $Q[$ID]["Y"] = $Y2; - - if ( !$NoDraw ) - { - /* Display the control points */ - if ( $ShowC && !$PathOnly ) - { - $Xv1 = floor($Xv1); $Yv1 = floor($Yv1); $Xv2 = floor($Xv2); $Yv2 = floor($Yv2); - - $this->drawLine($X1,$Y1,$X2,$Y2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>30)); - - $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4); - $this->drawRectangleMarker($Xv1,$Yv1,$MyMarkerSettings); - $this->drawText($Xv1+4,$Yv1,"v1"); - $MyMarkerSettings = array("R"=>0,"G"=>0,"B"=>255,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4); - $this->drawRectangleMarker($Xv2,$Yv2,$MyMarkerSettings); - $this->drawText($Xv2+4,$Yv2,"v2"); - } - - /* Draw the bezier */ - $LastX = NULL; $LastY = NULL; $Cpt = NULL; $Mode = NULL; $ArrowS = NULL; - foreach ($Q as $Key => $Point) - { - $X = $Point["X"]; $Y = $Point["Y"]; - - /* Get the first segment */ - if ( $ArrowS == NULL && $LastX != NULL && $LastY != NULL ) - { $ArrowS["X2"] = $LastX; $ArrowS["Y2"] = $LastY; $ArrowS["X1"] = $X; $ArrowS["Y1"] = $Y; } - - if ( $LastX != NULL && $LastY != NULL && !$PathOnly) - list($Cpt,$Mode) = $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Cpt"=>$Cpt,"Mode"=>$Mode,"Weight"=>$Weight)); - - /* Get the last segment */ - $ArrowE["X1"] = $LastX; $ArrowE["Y1"] = $LastY; $ArrowE["X2"] = $X; $ArrowE["Y2"] = $Y; - - $LastX = $X; $LastY = $Y; - } - - if ( $DrawArrow && !$PathOnly ) - { - $ArrowSettings = array("FillR"=>$R,"FillG"=>$G,"FillB"=>$B,"Alpha"=>$Alpha,"Size"=>$ArrowSize,"Ratio"=>$ArrowRatio); - if ( $ArrowTwoHeads ) - $this->drawArrow($ArrowS["X1"],$ArrowS["Y1"],$ArrowS["X2"],$ArrowS["Y2"],$ArrowSettings); - - $this->drawArrow($ArrowE["X1"],$ArrowE["Y1"],$ArrowE["X2"],$ArrowE["Y2"],$ArrowSettings); - } - } - return($Q); - } - - /* Draw a line between two points */ - function drawLine($X1,$Y1,$X2,$Y2,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $Cpt = isset($Format["Cpt"]) ? $Format["Cpt"] : 1; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : 1; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - if ( $this->Antialias == FALSE && $Ticks == NULL ) - { - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa); - imageline($this->Picture,$X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,$ShadowColor); - } - - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imageline($this->Picture,$X1,$Y1,$X2,$Y2,$Color); - return(0); - } - - $Distance = sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1)); - if ( $Distance == 0 ) { return(-1); } - - /* Derivative algorithm for overweighted lines, re-route to polygons primitives */ - if ( $Weight != NULL ) - { - $Angle = $this->getAngle($X1,$Y1,$X2,$Y2); - $PolySettings = array ("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderAlpha"=>$Alpha); - - if ( $Ticks == NULL ) - { - $Points = ""; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y1; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X1; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y1; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Y2; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $X2; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Y2; - - $this->drawPolygon($Points,$PolySettings); - } - else - { - for($i=0;$i<=$Distance;$i=$i+$Ticks*2) - { - $Xa = (($X2-$X1)/$Distance) * $i + $X1; $Ya = (($Y2-$Y1)/$Distance) * $i + $Y1; - $Xb = (($X2-$X1)/$Distance) * ($i+$Ticks) + $X1; $Yb = (($Y2-$Y1)/$Distance) * ($i+$Ticks) + $Y1; - - $Points = ""; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Ya; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xa; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Ya; - $Points[] = cos(deg2rad($Angle+90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle+90)) * $Weight + $Yb; - $Points[] = cos(deg2rad($Angle-90)) * $Weight + $Xb; $Points[] = sin(deg2rad($Angle-90)) * $Weight + $Yb; - - $this->drawPolygon($Points,$PolySettings); - } - } - - return(1); - } - - $XStep = ($X2-$X1) / $Distance; - $YStep = ($Y2-$Y1) / $Distance; - - for($i=0;$i<=$Distance;$i++) - { - $X = $i * $XStep + $X1; - $Y = $i * $YStep + $Y1; - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Parameters) - { - if ( $Y <= $Parameters["MinX"] && $Y >= $Parameters["MaxX"]) - { - if ( isset($Parameters["R"]) ) { $RT = $Parameters["R"]; } else { $RT = 0; } - if ( isset($Parameters["G"]) ) { $GT = $Parameters["G"]; } else { $GT = 0; } - if ( isset($Parameters["B"]) ) { $BT = $Parameters["B"]; } else { $BT = 0; } - if ( isset($Parameters["Alpha"]) ) { $AlphaT = $Parameters["Alpha"]; } else { $AlphaT = 0; } - $Color = array("R"=>$RT,"G"=>$GT,"B"=>$BT,"Alpha"=>$AlphaT); - } - } - } - - if ( $Ticks != NULL ) - { - if ( $Cpt % $Ticks == 0 ) - { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } } - - if ( $Mode == 1 ) - $this->drawAntialiasPixel($X,$Y,$Color); - - $Cpt++; - } - else - $this->drawAntialiasPixel($X,$Y,$Color); - } - - return(array($Cpt,$Mode)); - } - - /* Draw a circle */ - function drawCircle($Xc,$Yc,$Height,$Width,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - - $Height = abs($Height); - $Width = abs($Width); - - if ( $Height == 0 ) { $Height = 1; } - if ( $Width == 0 ) { $Width = 1; } - $Xc = floor($Xc); $Yc = floor($Yc); - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawCircle($Xc+$this->ShadowX,$Yc+$this->ShadowY,$Height,$Width,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks)); - } - - if ( $Width == 0 ) { $Width = $Height; } - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - $Step = 360 / (2 * PI * max($Width,$Height)); - $Mode = 1; $Cpt = 1; - for($i=0;$i<=360;$i=$i+$Step) - { - $X = cos($i*PI/180) * $Height + $Xc; - $Y = sin($i*PI/180) * $Width + $Yc; - - if ( $Ticks != NULL ) - { - if ( $Cpt % $Ticks == 0 ) - { $Cpt = 0; if ( $Mode == 1 ) { $Mode = 0; } else { $Mode = 1; } } - - if ( $Mode == 1 ) - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - $Cpt++; - } - else - $this->drawAntialiasPixel($X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - - } - $this->Shadow = $RestoreShadow; - } - - /* Draw a filled circle */ - function drawFilledCircle($X,$Y,$Radius,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - - if ( $Radius == 0 ) { $Radius = 1; } - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - $X = floor($X); $Y = floor($Y); - - $Radius = abs($Radius); - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawFilledCircle($X+$this->ShadowX,$Y+$this->ShadowY,$Radius,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Ticks"=>$Ticks)); - } - - $this->Mask = ""; - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - for ($i=0; $i<=$Radius*2; $i++) - { - $Slice = sqrt($Radius * $Radius - ($Radius - $i) * ($Radius - $i)); - $XPos = floor($Slice); - $YPos = $Y + $i - $Radius; - $AAlias = $Slice - floor($Slice); - - $this->Mask[$X-$XPos][$YPos] = TRUE; - $this->Mask[$X+$XPos][$YPos] = TRUE; - imageline($this->Picture,$X-$XPos,$YPos,$X+$XPos,$YPos,$Color); - } - if ( $this->Antialias ) - $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - - $this->Mask = ""; - - if ( $BorderR != -1 ) - $this->drawCircle($X,$Y,$Radius,$Radius,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$Ticks)); - - $this->Shadow = $RestoreShadow; - } - - /* Write text */ - function drawText($X,$Y,$Text,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : $this->FontColorR; - $G = isset($Format["G"]) ? $Format["G"] : $this->FontColorG; - $B = isset($Format["B"]) ? $Format["B"] : $this->FontColorB; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $Align = isset($Format["Align"]) ? $Format["Align"] : TEXT_ALIGN_BOTTOMLEFT; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $this->FontColorA; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $ShowOrigine = isset($Format["ShowOrigine"]) ? $Format["ShowOrigine"] : FALSE; - $TOffset = isset($Format["TOffset"]) ? $Format["TOffset"] : 2; - $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : FALSE; - $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : TRUE; - $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 6; - $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : FALSE; - $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 6; - $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 255; - $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 255; - $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 255; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : ""; - $BoxBorderR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0; - $BoxBorderG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0; - $BoxBorderB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0; - $BoxBorderAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 50; - $NoShadow = isset($Format["NoShadow"]) ? $Format["NoShadow"] : FALSE; - - $Shadow = $this->Shadow; - if ( $NoShadow ) { $this->Shadow = FALSE; } - - if ( $BoxSurrounding != "" ) { $BoxBorderR = $BoxR - $BoxSurrounding; $BoxBorderG = $BoxG - $BoxSurrounding; $BoxBorderB = $BoxB - $BoxSurrounding; $BoxBorderAlpha = $Boxalpha; } - - if ( $ShowOrigine ) - { - $MyMarkerSettings = array("R"=>255,"G"=>0,"B"=>0,"BorderR"=>255,"BorderB"=>255,"BorderG"=>255,"Size"=>4); - $this->drawRectangleMarker($X,$Y,$MyMarkerSettings); - } - - $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text); - - if ( $DrawBox && ($Angle == 0 || $Angle == 90 || $Angle == 180 || $Angle == 270)) - { - $T[0]["X"]=0;$T[0]["Y"]=0;$T[1]["X"]=0;$T[1]["Y"]=0;$T[2]["X"]=0;$T[2]["Y"]=0;$T[3]["X"]=0;$T[3]["Y"]=0; - if ( $Angle == 0 ) { $T[0]["X"]=-$TOffset;$T[0]["Y"]=$TOffset;$T[1]["X"]=$TOffset;$T[1]["Y"]=$TOffset;$T[2]["X"]=$TOffset;$T[2]["Y"]=-$TOffset;$T[3]["X"]=-$TOffset;$T[3]["Y"]=-$TOffset; } - - $X1 = min($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) - $BorderOffset + 3; - $Y1 = min($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) - $BorderOffset; - $X2 = max($TxtPos[0]["X"],$TxtPos[1]["X"],$TxtPos[2]["X"],$TxtPos[3]["X"]) + $BorderOffset + 3; - $Y2 = max($TxtPos[0]["Y"],$TxtPos[1]["Y"],$TxtPos[2]["Y"],$TxtPos[3]["Y"]) + $BorderOffset - 3; - - $X1 = $X1 - $TxtPos[$Align]["X"] + $X + $T[0]["X"]; - $Y1 = $Y1 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"]; - $X2 = $X2 - $TxtPos[$Align]["X"] + $X + $T[0]["X"]; - $Y2 = $Y2 - $TxtPos[$Align]["Y"] + $Y + $T[0]["Y"]; - - $Settings = array("R"=>$BoxR,"G"=>$BoxG,"B"=>$BoxB,"Alpha"=>$BoxAlpha,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"BorderAlpha"=>$BoxBorderAlpha); - - if ( $BoxRounded ) - { $this->drawRoundedFilledRectangle($X1,$Y1,$X2,$Y2,$RoundedRadius,$Settings); } - else - { $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Settings); } - } - - $X = $X - $TxtPos[$Align]["X"] + $X; - $Y = $Y - $TxtPos[$Align]["Y"] + $Y; - - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $C_ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa); - imagettftext($this->Picture,$FontSize,$Angle,$X+$this->ShadowX,$Y+$this->ShadowY,$C_ShadowColor,$FontName,$Text); - } - - $C_TextColor = $this->AllocateColor($this->Picture,$R,$G,$B,$Alpha); - imagettftext($this->Picture,$FontSize,$Angle,$X,$Y,$C_TextColor,$FontName,$Text); - - $this->Shadow = $Shadow; - - return($TxtPos); - } - - /* Draw a gradient within a defined area */ - function drawGradientArea($X1,$Y1,$X2,$Y2,$Direction,$Format="") - { - $StartR = isset($Format["StartR"]) ? $Format["StartR"] : 90; - $StartG = isset($Format["StartG"]) ? $Format["StartG"] : 90; - $StartB = isset($Format["StartB"]) ? $Format["StartB"] : 90; - $EndR = isset($Format["EndR"]) ? $Format["EndR"] : 0; - $EndG = isset($Format["EndG"]) ? $Format["EndG"] : 0; - $EndB = isset($Format["EndB"]) ? $Format["EndB"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Levels = isset($Format["Levels"]) ? $Format["Levels"] : NULL; - - $Shadow = $this->Shadow; - $this->Shadow = FALSE; - - if ( $StartR == $EndR && $StartG == $EndG && $StartB == $EndB ) - { - $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,array("R"=>$StartR,"G"=>$StartG,"B"=>$StartB,"Alpha"=>$Alpha)); - return(0); - } - - if ( $Levels != NULL ) - { $EndR=$StartR+$Levels; $EndG=$StartG+$Levels; $EndB=$StartB+$Levels; } - - if ($X1 > $X2) { list($X1, $X2) = array($X2, $X1); } - if ($Y1 > $Y2) { list($Y1, $Y2) = array($Y2, $Y1); } - - if ( $Direction == DIRECTION_VERTICAL ) { $Width = abs($Y2-$Y1); } - if ( $Direction == DIRECTION_HORIZONTAL ) { $Width = abs($X2-$X1); } - - $Step = max(abs($EndR-$StartR),abs($EndG-$StartG),abs($EndB-$StartB)); - $StepSize = $Width/$Step; - $RStep = ($EndR-$StartR)/$Step; - $GStep = ($EndG-$StartG)/$Step; - $BStep = ($EndB-$StartB)/$Step; - - $R=$StartR;$G=$StartG;$B=$StartB; - switch($Direction) - { - case DIRECTION_VERTICAL: - $StartY = $Y1; $EndY = floor($Y2)+1; $LastY2 = $StartY; - for($i=0;$i<=$Step;$i++) - { - $Y2 = floor($StartY + ($i * $StepSize)); - - if ($Y2 > $EndY) { $Y2 = $EndY; } - if (($Y1 != $Y2 && $Y1 < $Y2) || $Y2 == $EndY) - { - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); - $LastY2 = max($LastY2,$Y2); - $Y1 = $Y2+1; - } - $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep; - } - if ( $LastY2 < $EndY && isset($Color)) { for ($i=$LastY2+1;$i<=$EndY;$i++) { $this->drawLine($X1,$i,$X2,$i,$Color); } } - break; - - case DIRECTION_HORIZONTAL: - $StartX = $X1; $EndX = $X2; - for($i=0;$i<=$Step;$i++) - { - $X2 = floor($StartX + ($i * $StepSize)); - - if ($X2 > $EndX) { $X2 = $EndX; } - if (($X1 != $X2 && $X1 < $X2) || $X2 == $EndX) - { - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - $this->drawFilledRectangle($X1,$Y1,$X2,$Y2,$Color); - $X1 = $X2+1; - } - $R = $R + $RStep; $G = $G + $GStep; $B = $B + $BStep; - } - if ( $X2 < $EndX && isset($Color)) { $this->drawFilledRectangle($X2,$Y1,$EndX,$Y2,$Color); } - break; - } - - $this->Shadow = $Shadow; - - } - - /* Draw an aliased pixel */ - function drawAntialiasPixel($X,$Y,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize ) - return(-1); - - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - if ( !$this->Antialias ) - { - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$this->Shadowa); - imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor); - } - - $PlotColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imagesetpixel($this->Picture,$X,$Y,$PlotColor); - - return(0); - } - - $Plot = ""; - $Xi = floor($X); - $Yi = floor($Y); - - if ( $Xi == $X && $Yi == $Y) - { - if ( $Alpha == 100 ) - $this->drawAlphaPixel($X,$Y,100,$R,$G,$B); - else - $this->drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B); - } - else - { - $Alpha1 = (((1 - ($X - floor($X))) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; - if ( $Alpha1 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi,$Alpha1,$R,$G,$B); } - - $Alpha2 = ((($X - floor($X)) * (1 - ($Y - floor($Y))) * 100) / 100) * $Alpha; - if ( $Alpha2 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi,$Alpha2,$R,$G,$B); } - - $Alpha3 = (((1 - ($X - floor($X))) * ($Y - floor($Y)) * 100) / 100) * $Alpha; - if ( $Alpha3 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi,$Yi+1,$Alpha3,$R,$G,$B); } - - $Alpha4 = ((($X - floor($X)) * ($Y - floor($Y)) * 100) / 100) * $Alpha; - if ( $Alpha4 > $this->AntialiasQuality ) { $this->drawAlphaPixel($Xi+1,$Yi+1,$Alpha4,$R,$G,$B); } - } - } - - /* Draw a semi-transparent pixel */ - function drawAlphaPixel($X,$Y,$Alpha,$R,$G,$B) - { - if ( isset($this->Mask[$X])) { if ( isset($this->Mask[$X][$Y]) ) { return(0); } } - - if ( $X < 0 || $Y < 0 || $X >= $this->XSize || $Y >= $this->YSize ) - return(-1); - - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $AlphaFactor = floor(($Alpha / 100) * $this->Shadowa); - $ShadowColor = $this->allocateColor($this->Picture,$this->ShadowR,$this->ShadowG,$this->ShadowB,$AlphaFactor); - imagesetpixel($this->Picture,$X+$this->ShadowX,$Y+$this->ShadowY,$ShadowColor); - } - - $C_Aliased = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - imagesetpixel($this->Picture,$X,$Y,$C_Aliased); - } - - /* Convert apha to base 10 */ - function convertAlpha($AlphaValue) - { return((127/100)*(100-$AlphaValue)); } - - /* Allocate a color with transparency */ - function allocateColor($Picture,$R,$G,$B,$Alpha=100) - { - if ( $R < 0 ) { $R = 0; } if ( $R > 255 ) { $R = 255; } - if ( $G < 0 ) { $G = 0; } if ( $G > 255 ) { $G = 255; } - if ( $B < 0 ) { $B = 0; } if ( $B > 255 ) { $B = 255; } - if ( $Alpha < 0 ) { $Alpha = 0; } - if ( $Alpha > 100) { $Alpha = 100; } - - $Alpha = $this->convertAlpha($Alpha); - return(imagecolorallocatealpha($Picture,$R,$G,$B,$Alpha)); - } - - /* Load a PNG file and draw it over the chart */ - function drawFromPNG($X,$Y,$FileName) - { $this->drawFromPicture(1,$FileName,$X,$Y); } - - /* Load a GIF file and draw it over the chart */ - function drawFromGIF($X,$Y,$FileName) - { $this->drawFromPicture(2,$FileName,$X,$Y); } - - /* Load a JPEG file and draw it over the chart */ - function drawFromJPG($X,$Y,$FileName) - { $this->drawFromPicture(3,$FileName,$X,$Y); } - - function getPicInfo($FileName) - { - $Infos = getimagesize($FileName); - $Width = $Infos[0]; - $Height = $Infos[1]; - $Type = $Infos["mime"]; - - if ( $Type == "image/png") { $Type = 1; } - if ( $Type == "image/gif") { $Type = 2; } - if ( $Type == "image/jpeg ") { $Type = 3; } - - return(array($Width,$Height,$Type)); - } - - /* Generic loader function for external pictures */ - function drawFromPicture($PicType,$FileName,$X,$Y) - { - if ( file_exists($FileName)) - { - list($Width,$Height) = $this->getPicInfo($FileName); - - if ( $PicType == 1 ) - { $Raster = imagecreatefrompng($FileName); } - elseif ( $PicType == 2 ) - { $Raster = imagecreatefromgif($FileName); } - elseif ( $PicType == 3 ) - { $Raster = imagecreatefromjpeg($FileName); } - else - { return(0); } - - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - if ( $PicType == 3 ) - $this->drawFilledRectangle($X+$this->ShadowX,$Y+$this->ShadowY,$X+$Width+$this->ShadowX,$Y+$Height+$this->ShadowY,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - else - { - $TranparentID = imagecolortransparent($Raster); - for ($Xc=0;$Xc<=$Width-1;$Xc++) - { - for ($Yc=0;$Yc<=$Height-1;$Yc++) - { - $RGBa = imagecolorat($Raster,$Xc,$Yc); - $Values = imagecolorsforindex($Raster,$RGBa); - if ( $Values["alpha"] < 120 ) - { - $AlphaFactor = floor(($this->Shadowa / 100) * ((100 / 127) * (127-$Values["alpha"]))); - $this->drawAlphaPixel($X+$Xc+$this->ShadowX,$Y+$Yc+$this->ShadowY,$AlphaFactor,$this->ShadowR,$this->ShadowG,$this->ShadowB); - } - } - } - } - } - $this->Shadow = $RestoreShadow; - - imagecopy($this->Picture,$Raster,$X,$Y,0,0,$Width,$Height); - imagedestroy($Raster); - } - } - - /* Draw an arrow */ - function drawArrow($X1,$Y1,$X2,$Y2,$Format="") - { - $FillR = isset($Format["FillR"]) ? $Format["FillR"] : 0; - $FillG = isset($Format["FillG"]) ? $Format["FillG"] : 0; - $FillB = isset($Format["FillB"]) ? $Format["FillB"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Size = isset($Format["Size"]) ? $Format["Size"] : 10; - $Ratio = isset($Format["Ratio"]) ? $Format["Ratio"] : .5; - $TwoHeads = isset($Format["TwoHeads"]) ? $Format["TwoHeads"] : FALSE; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : FALSE; - - /* Calculate the line angle */ - $Angle = $this->getAngle($X1,$Y1,$X2,$Y2); - - /* Override Shadow support, this will be managed internally */ - $RestoreShadow = $this->Shadow; - if ( $this->Shadow && $this->ShadowX != 0 && $this->ShadowY != 0 ) - { - $this->Shadow = FALSE; - $this->drawArrow($X1+$this->ShadowX,$Y1+$this->ShadowY,$X2+$this->ShadowX,$Y2+$this->ShadowY,array("FillR"=>$this->ShadowR,"FillG"=>$this->ShadowG,"FillB"=>$this->ShadowB,"Alpha"=>$this->Shadowa,"Size"=>$Size,"Ratio"=>$Ratio,"TwoHeads"=>$TwoHeads,"Ticks"=>$Ticks)); - } - - /* Draw the 1st Head */ - $TailX = cos(($Angle-180)*PI/180)*$Size+$X2; - $TailY = sin(($Angle-180)*PI/180)*$Size+$Y2; - - $Points = ""; - $Points[] = $X2; $Points[] = $Y2; - $Points[] = cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY; - $Points[] = cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY; - $Points[] = $X2; $Points[] = $Y2; - - /* Visual correction */ - if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; } - if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; } - - $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha); - ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor); - - $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - /* Draw the second head */ - if ( $TwoHeads ) - { - $Angle = $this->getAngle($X2,$Y2,$X1,$Y1); - - $TailX2 = cos(($Angle-180)*PI/180)*$Size+$X1; - $TailY2 = sin(($Angle-180)*PI/180)*$Size+$Y1; - - $Points = ""; - $Points[] = $X1; $Points[] = $Y1; - $Points[] = cos(($Angle-90)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-90)*PI/180)*$Size*$Ratio+$TailY2; - $Points[] = cos(($Angle-270)*PI/180)*$Size*$Ratio+$TailX2; $Points[] = sin(($Angle-270)*PI/180)*$Size*$Ratio+$TailY2; - $Points[] = $X1; $Points[] = $Y1; - - /* Visual correction */ - if ($Angle == 180 || $Angle == 360 ) { $Points[4] = $Points[2]; } - if ($Angle == 90 || $Angle == 270 ) { $Points[5] = $Points[3]; } - - $ArrowColor = $this->allocateColor($this->Picture,$FillR,$FillG,$FillB,$Alpha); - ImageFilledPolygon($this->Picture,$Points,4,$ArrowColor); - - $this->drawLine($Points[0],$Points[1],$Points[2],$Points[3],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[2],$Points[3],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - $this->drawLine($Points[0],$Points[1],$Points[4],$Points[5],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - - $this->drawLine($TailX,$TailY,$TailX2,$TailY2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - else - $this->drawLine($X1,$Y1,$TailX,$TailY,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - - /* Re-enable shadows */ - $this->Shadow = $RestoreShadow; - } - - /* Draw a label with associated arrow */ - function drawArrowLabel($X1,$Y1,$Text,$Format="") - { - $FillR = isset($Format["FillR"]) ? $Format["FillR"] : 0; - $FillG = isset($Format["FillG"]) ? $Format["FillG"] : 0; - $FillB = isset($Format["FillB"]) ? $Format["FillB"] : 0; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $FillR; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $FillG; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $FillB; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Length = isset($Format["Length"]) ? $Format["Length"] : 50; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 315; - $Size = isset($Format["Size"]) ? $Format["Size"] : 10; - $Position = isset($Format["Position"]) ? $Format["Position"] : POSITION_TOP; - $RoundPos = isset($Format["RoundPos"]) ? $Format["RoundPos"] : FALSE; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - - $Angle = $Angle % 360; - - $X2 = sin(($Angle+180)*PI/180)*$Length+$X1; - $Y2 = cos(($Angle+180)*PI/180)*$Length+$Y1; - - if ( $RoundPos && $Angle > 0 && $Angle < 180 ) { $Y2 = ceil($Y2); } - if ( $RoundPos && $Angle > 180 ) { $Y2 = floor($Y2); } - - $this->drawArrow($X2,$Y2,$X1,$Y1,$Format); - - $Size = imagettfbbox($FontSize,0,$FontName,$Text); - $TxtWidth = max(abs($Size[2]-$Size[0]),abs($Size[0]-$Size[6])); - $TxtHeight = max(abs($Size[1]-$Size[7]),abs($Size[3]-$Size[1])); - - if ( $Angle > 0 && $Angle < 180 ) - { - $this->drawLine($X2,$Y2,$X2-$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - if ( $Position == POSITION_TOP ) - $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_BOTTOMRIGHT)); - else - $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPRIGHT)); - } - else - { - $this->drawLine($X2,$Y2,$X2+$TxtWidth,$Y2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - if ( $Position == POSITION_TOP ) - $this->drawText($X2,$Y2-2,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha)); - else - $this->drawText($X2,$Y2+4,$Text,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$Alpha,"Align"=>TEXT_ALIGN_TOPLEFT)); - } - } - - /* Draw a progress bar filled with specified % */ - function drawProgress($X,$Y,$Percent,$Format="") - { - if ( $Percent > 100 ) { $Percent = 100; } - if ( $Percent < 0 ) { $Percent = 0; } - - $Width = isset($Format["Width"]) ? $Format["Width"] : 200; - $Height = isset($Format["Height"]) ? $Format["Height"] : 20; - $Orientation = isset($Format["Orientation"]) ? $Format["Orientation"] : ORIENTATION_HORIZONTAL; - $ShowLabel = isset($Format["ShowLabel"]) ? $Format["ShowLabel"] : FALSE; - $LabelPos = isset($Format["LabelPos"]) ? $Format["LabelPos"] : LABEL_POS_INSIDE; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 10; - $R = isset($Format["R"]) ? $Format["R"] : 130; - $G = isset($Format["G"]) ? $Format["G"] : 130; - $B = isset($Format["B"]) ? $Format["B"] : 130; - $RFade = isset($Format["RFade"]) ? $Format["RFade"] : -1; - $GFade = isset($Format["GFade"]) ? $Format["GFade"] : -1; - $BFade = isset($Format["BFade"]) ? $Format["BFade"] : -1; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 0; - $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 0; - $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 0; - $BoxBackR = isset($Format["BoxBackR"]) ? $Format["BoxBackR"] : 255; - $BoxBackG = isset($Format["BoxBackG"]) ? $Format["BoxBackG"] : 255; - $BoxBackB = isset($Format["BoxBackB"]) ? $Format["BoxBackB"] : 255; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : NULL; - $NoAngle = isset($Format["NoAngle"]) ? $Format["NoAngle"] : FALSE; - - if ( $RFade != -1 && $GFade != -1 && $BFade != -1 ) - { - $RFade = (($RFade-$R)/100)*$Percent+$R; - $GFade = (($GFade-$G)/100)*$Percent+$G; - $BFade = (($BFade-$B)/100)*$Percent+$B; - } - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - if ( $BoxSurrounding != NULL ) { $BoxBorderR = $BoxBackR + $Surrounding; $BoxBorderG = $BoxBackG + $Surrounding; $BoxBorderB = $BoxBackB + $Surrounding; } - - if ( $Orientation == ORIENTATION_VERTICAL ) - { - $InnerHeight = (($Height-2)/100)*$Percent; - $this->drawFilledRectangle($X,$Y,$X+$Width,$Y-$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle)); - - $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; - if ( $RFade != -1 && $GFade != -1 && $BFade != -1 ) - { - $GradientOptions = array("StartR"=>$RFade,"StartG"=>$GFade,"StartB"=>$BFade,"EndR"=>$R,"EndG"=>$G,"EndB"=>$B); - $this->drawGradientArea($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,DIRECTION_VERTICAL,$GradientOptions); - - if ( $Surrounding ) - $this->drawRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding)); - } - else - $this->drawFilledRectangle($X+1,$Y-1,$X+$Width-1,$Y-$InnerHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $this->Shadow = $RestoreShadow; - - if ( $ShowLabel && $LabelPos == LABEL_POS_BOTTOM ) { $this->drawText($X+($Width/2),$Y+$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_TOPMIDDLE)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_TOP ) { $this->drawText($X+($Width/2),$Y-$Height-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE ) { $this->drawText($X+($Width/2),$Y-$InnerHeight-$Margin,$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT,"Angle"=>90)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER ) { $this->drawText($X+($Width/2),$Y-($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"Angle"=>90)); } - } - else - { - if ( $Percent == 100 ) - $InnerWidth = $Width-1; - else - $InnerWidth = (($Width-2)/100)*$Percent; - - $this->drawFilledRectangle($X,$Y,$X+$Width,$Y+$Height,array("R"=>$BoxBackR,"G"=>$BoxBackG,"B"=>$BoxBackB,"BorderR"=>$BoxBorderR,"BorderG"=>$BoxBorderG,"BorderB"=>$BoxBorderB,"NoAngle"=>$NoAngle)); - - $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; - if ( $RFade != -1 && $GFade != -1 && $BFade != -1 ) - { - $GradientOptions = array("StartR"=>$R,"StartG"=>$G,"StartB"=>$B,"EndR"=>$RFade,"EndG"=>$GFade,"EndB"=>$BFade); - $this->drawGradientArea($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,DIRECTION_HORIZONTAL,$GradientOptions); - - if ( $Surrounding ) - $this->drawRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>255,"G"=>255,"B"=>255,"Alpha"=>$Surrounding)); - } - else - $this->drawFilledRectangle($X+1,$Y+1,$X+$InnerWidth,$Y+$Height-1,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $this->Shadow = $RestoreShadow; - - if ( $ShowLabel && $LabelPos == LABEL_POS_LEFT ) { $this->drawText($X-$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_RIGHT ) { $this->drawText($X+$Width+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_CENTER ) { $this->drawText($X+($Width/2),$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE)); } - if ( $ShowLabel && $LabelPos == LABEL_POS_INSIDE ) { $this->drawText($X+$InnerWidth+$Margin,$Y+($Height/2),$Percent."%",array("Align"=>TEXT_ALIGN_MIDDLELEFT)); } - } - } - - /* Get the legend box size */ - function getLegendSize($Format="") - { - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5; - $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5; - $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth; - $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight; - $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5; - - $Data = $this->DataSet->getData(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"])) - { - list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]); - if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; } - if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; } - } - } - - $YStep = max($this->FontSize,$IconAreaHeight) + 5; - $XStep = $IconAreaWidth + 5; - $XStep = $XSpacing; - - $X=100; $Y=100; - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - if ( $Mode == LEGEND_VERTICAL ) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Lines = preg_split("/\n/",$Serie["Description"]); - $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Width[] = $BoxArray[1]["X"]; - } - - $vX=max($Width)+$XStep; - } - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; } - - $Width = ($Boundaries["R"]+$Margin) - ($Boundaries["L"]-$Margin); - $Height = ($Boundaries["B"]+$Margin) - ($Boundaries["T"]-$Margin); - - return(array("Width"=>$Width,"Height"=>$Height)); - } - - /* Draw the legend of the active series */ - function drawLegend($X,$Y,$Format="") - { - $Family = isset($Format["Family"]) ? $Format["Family"] : LEGEND_FAMILY_BOX; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->FontColorR; - $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->FontColorG; - $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->FontColorB; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5; - $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5; - $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth; - $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight; - $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $R = isset($Format["R"]) ? $Format["R"] : 200; - $G = isset($Format["G"]) ? $Format["G"] : 200; - $B = isset($Format["B"]) ? $Format["B"] : 200; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - - $Data = $this->DataSet->getData(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && isset($Serie["Picture"])) - { - list($PicWidth,$PicHeight) = $this->getPicInfo($Serie["Picture"]); - if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; } - if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; } - } - } - - - $YStep = max($this->FontSize,$IconAreaHeight) + 5; - $XStep = $IconAreaWidth + 5; - $XStep = $XSpacing; - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - if ( $Mode == LEGEND_VERTICAL ) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Serie["Description"]); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Lines = preg_split("/\n/",$Serie["Description"]); - $vY = $vY + max($this->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$FontName,$FontSize,0,$Value); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Width[] = $BoxArray[1]["X"]; - } - - $vX=max($Width)+$XStep; - } - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; } - - if ( $Style == LEGEND_ROUND ) - $this->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - elseif ( $Style == LEGEND_BOX ) - $this->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; - $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( isset($Serie["Picture"]) ) - { - $Picture = $Serie["Picture"]; - list($PicWidth,$PicHeight) = $this->getPicInfo($Picture); - $PicX = $X+$IconAreaWidth/2; $PicY = $Y+$IconAreaHeight/2; - - $this->drawFromPNG($PicX-$PicWidth/2,$PicY-$PicHeight/2,$Picture); - } - else - { - if ( $Family == LEGEND_FAMILY_BOX ) - { - if ( $BoxWidth != $IconAreaWidth ) { $XOffset = floor(($IconAreaWidth-$BoxWidth)/2); } else { $XOffset = 0; } - if ( $BoxHeight != $IconAreaHeight ) { $YOffset = floor(($IconAreaHeight-$BoxHeight)/2); } else { $YOffset = 0; } - - $this->drawFilledRectangle($X+1+$XOffset,$Y+1+$YOffset,$X+$BoxWidth+$XOffset+1,$Y+$BoxHeight+1+$YOffset,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->drawFilledRectangle($X+$XOffset,$Y+$YOffset,$X+$BoxWidth+$XOffset,$Y+$BoxHeight+$YOffset,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - } - elseif ( $Family == LEGEND_FAMILY_CIRCLE ) - { - $this->drawFilledCircle($X+1+$IconAreaWidth/2,$Y+1+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->drawFilledCircle($X+$IconAreaWidth/2,$Y+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - } - elseif ( $Family == LEGEND_FAMILY_LINE ) - { - $this->drawLine($X+1,$Y+1+$IconAreaHeight/2,$X+1+$IconAreaWidth,$Y+1+$IconAreaHeight/2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20,"Ticks"=>$Ticks,"Weight"=>$Weight)); - $this->drawLine($X,$Y+$IconAreaHeight/2,$X+$IconAreaWidth,$Y+$IconAreaHeight/2,array("R"=>$R,"G"=>$G,"B"=>$B,"Ticks"=>$Ticks,"Weight"=>$Weight)); - } - } - - if ( $Mode == LEGEND_VERTICAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - foreach($Lines as $Key => $Value) - $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT)); - - $Y=$Y+max($this->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Serie["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT)); - $Width[] = $BoxArray[1]["X"]; - } - $X=max($Width)+2+$XStep; - } - } - } - - - $this->Shadow = $RestoreShadow; - } - - function drawScale($Format="") - { - $Pos = isset($Format["Pos"]) ? $Format["Pos"] : SCALE_POS_LEFTRIGHT; - $Floating = isset($Format["Floating"]) ? $Format["Floating"] : FALSE; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING; - $MinDivHeight = isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20; - $Factors = isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5); - $ManualScale = isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100)); - $XMargin = isset($Format["XMargin"]) ? $Format["XMargin"] : AUTO; - $YMargin = isset($Format["YMargin"]) ? $Format["YMargin"] : 0; - $ScaleSpacing = isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15; - $InnerTickWidth = isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2; - $OuterTickWidth = isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2; - $DrawXLines = isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : TRUE; - $DrawYLines = isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL; - $GridTicks = isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4; - $GridR = isset($Format["GridR"]) ? $Format["GridR"] : 255; - $GridG = isset($Format["GridG"]) ? $Format["GridG"] : 255; - $GridB = isset($Format["GridB"]) ? $Format["GridB"] : 255; - $GridAlpha = isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40; - $AxisRo = isset($Format["AxisR"]) ? $Format["AxisR"] : 0; - $AxisGo = isset($Format["AxisG"]) ? $Format["AxisG"] : 0; - $AxisBo = isset($Format["AxisB"]) ? $Format["AxisB"] : 0; - $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100; - $TickRo = isset($Format["TickR"]) ? $Format["TickR"] : 0; - $TickGo = isset($Format["TickG"]) ? $Format["TickG"] : 0; - $TickBo = isset($Format["TickB"]) ? $Format["TickB"] : 0; - $TickAlpha = isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100; - $DrawSubTicks = isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE; - $InnerSubTickWidth = isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0; - $OuterSubTickWidth = isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2; - $SubTickR = isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255; - $SubTickG = isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0; - $SubTickB = isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0; - $SubTickAlpha = isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100; - $AutoAxisLabels = isset($Format["AutoAxisLabels"]) ? $Format["AutoAxisLabels"] : TRUE; - $XReleasePercent = isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1; - $DrawArrows = isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE; - $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8; - $CycleBackground = isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE; - $BackgroundR1 = isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255; - $BackgroundG1 = isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255; - $BackgroundB1 = isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255; - $BackgroundAlpha1 = isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 20; - $BackgroundR2 = isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230; - $BackgroundG2 = isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230; - $BackgroundB2 = isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230; - $BackgroundAlpha2 = isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 20; - $LabelingMethod = isset($Format["LabelingMethod"]) ? $Format["LabelingMethod"] : LABELING_ALL; - $LabelSkip = isset($Format["LabelSkip"]) ? $Format["LabelSkip"] : 0; - $LabelRotation = isset($Format["LabelRotation"]) ? $Format["LabelRotation"] : 0; - $SkippedAxisTicks = isset($Format["SkippedAxisTicks"]) ? $Format["SkippedAxisTicks"] : $GridTicks+2; - $SkippedAxisR = isset($Format["SkippedAxisR"]) ? $Format["SkippedAxisR"] : $GridR; - $SkippedAxisG = isset($Format["SkippedAxisG"]) ? $Format["SkippedAxisG"] : $GridG; - $SkippedAxisB = isset($Format["SkippedAxisB"]) ? $Format["SkippedAxisB"] : $GridB; - $SkippedAxisAlpha = isset($Format["SkippedAxisAlpha"]) ? $Format["SkippedAxisAlpha"] : $GridAlpha-30; - $SkippedTickR = isset($Format["SkippedTickR"]) ? $Format["SkippedTickR"] : $TickRo; - $SkippedTickG = isset($Format["SkippedTickG"]) ? $Format["SkippedTickG"] : $TickGo; - $SkippedTickB = isset($Format["SkippedTicksB"]) ? $Format["SkippedTickB"] : $TickBo; - $SkippedTickAlpha = isset($Format["SkippedTickAlpha"]) ? $Format["SkippedTickAlpha"] : $TickAlpha-80; - $SkippedInnerTickWidth = isset($Format["SkippedInnerTickWidth"]) ? $Format["SkippedInnerTickWidth"] : 0; - $SkippedOuterTickWidth = isset($Format["SkippedOuterTickWidth"]) ? $Format["SkippedOuterTickWidth"] : 2; - - /* Floating scale require X & Y margins to be set manually */ - if ( $Floating && ( $XMargin == AUTO || $YMargin == 0 ) ) { $Floating = FALSE; } - - /* Skip a NOTICE event in case of an empty array */ - if ( $DrawYLines == NONE || $DrawYLines == FALSE ) { $DrawYLines = array("zarma"=>"31"); } - - /* Define the color for the skipped elements */ - $SkippedAxisColor = array("R"=>$SkippedAxisR,"G"=>$SkippedAxisG,"B"=>$SkippedAxisB,"Alpha"=>$SkippedAxisAlpha,"Ticks"=>$SkippedAxisTicks); - $SkippedTickColor = array("R"=>$SkippedTickR,"G"=>$SkippedTickG,"B"=>$SkippedTickB,"Alpha"=>$SkippedTickAlpha); - - $Data = $this->DataSet->getData(); - if ( isset($Data["Abscissa"]) ) { $Abscissa = $Data["Abscissa"]; } else { $Abscissa = NULL; } - - /* Unset the abscissa axis, needed if we display multiple charts on the same picture */ - if ( $Abscissa != NULL ) - { - foreach($Data["Axis"] as $AxisID => $Parameters) - { if ($Parameters["Identity"] == AXIS_X) { unset($Data["Axis"][$AxisID]); } } - } - - /* Build the scale settings */ - $GotXAxis = FALSE; - foreach($Data["Axis"] as $AxisID => $AxisParameter) - { - if ( $AxisParameter["Identity"] == AXIS_X ) { $GotXAxis = TRUE; } - - if ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_Y) - { $Height = $this->GraphAreaY2-$this->GraphAreaY1 - $YMargin*2; } - elseif ( $Pos == SCALE_POS_LEFTRIGHT && $AxisParameter["Identity"] == AXIS_X) - { $Height = $this->GraphAreaX2-$this->GraphAreaX1; } - elseif ( $Pos == SCALE_POS_TOPBOTTOM && $AxisParameter["Identity"] == AXIS_Y) - { $Height = $this->GraphAreaX2-$this->GraphAreaX1 - $YMargin*2;; } - else - { $Height = $this->GraphAreaY2-$this->GraphAreaY1; } - - $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT; - if ( $Mode == SCALE_MODE_FLOATING || $Mode == SCALE_MODE_START0 ) - { - foreach($Data["Series"] as $SerieID => $SerieParameter) - { - if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] && $Data["Abscissa"] != $SerieID) - { - $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]); - $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]); - } - } - $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent; - - $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin; - if ( $Mode == SCALE_MODE_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; } - } - elseif ( $Mode == SCALE_MODE_MANUAL ) - { - if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) ) - { - $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"]; - $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"]; - } - else - { echo "Manual scale boundaries not set."; exit(); } - } - elseif ( $Mode == SCALE_MODE_ADDALL || $Mode == SCALE_MODE_ADDALL_START0 ) - { - $Series = ""; - foreach($Data["Series"] as $SerieID => $SerieParameter) - { if ( $SerieParameter["Axis"] == $AxisID && $SerieParameter["isDrawable"] && $Data["Abscissa"] != $SerieID ) { $Series[$SerieID] = count($Data["Series"][$SerieID]["Data"]); } } - - for ($ID=0;$ID<=max($Series)-1;$ID++) - { - $PointMin = 0; $PointMax = 0; - foreach($Series as $SerieID => $ValuesCount ) - { - if (isset($Data["Series"][$SerieID]["Data"][$ID]) && $Data["Series"][$SerieID]["Data"][$ID] != NULL ) - { - $Value = $Data["Series"][$SerieID]["Data"][$ID]; - if ( $Value > 0 ) { $PointMax = $PointMax + $Value; } else { $PointMin = $PointMin + $Value; } - } - } - $AxisMax = max($AxisMax,$PointMax); - $AxisMin = min($AxisMin,$PointMin); - } - $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent; - $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin; - } - $MaxDivs = floor($Height/$MinDivHeight); - - if ( $Mode == SCALE_MODE_ADDALL_START0 ) { $Data["Axis"][$AxisID]["Min"] = 0; } - - $Scale = $this->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID); - - $Data["Axis"][$AxisID]["Margin"] = $AxisParameter["Identity"] == AXIS_X ? $XMargin : $YMargin; - $Data["Axis"][$AxisID]["ScaleMin"] = $Scale["XMin"]; - $Data["Axis"][$AxisID]["ScaleMax"] = $Scale["XMax"]; - $Data["Axis"][$AxisID]["Rows"] = $Scale["Rows"]; - $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"]; - - if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; } - - if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; } - } - - /* Still no X axis */ - if ( $GotXAxis == FALSE ) - { - if ( $Abscissa != NULL ) - { - $Points = count($Data["Series"][$Abscissa]["Data"]); - if ( $AutoAxisLabels ) - $AxisName = isset($Data["Series"][$Abscissa]["Description"]) ? $Data["Series"][$Abscissa]["Description"] : NULL; - else - $AxisName = NULL; - } - else - { - $Points = 0; - $AxisName = isset($Data["XAxisName"]) ? $Data["XAxisName"] : NULL; - foreach($Data["Series"] as $SerieID => $SerieParameter) - { if ( $SerieParameter["isDrawable"] ) { $Points = max($Points,count($SerieParameter["Data"])); } } - } - - $AxisID = count($Data["Axis"]); - $Data["Axis"][$AxisID]["Identity"] = AXIS_X; - if ( $Pos == SCALE_POS_LEFTRIGHT ) { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_BOTTOM; } else { $Data["Axis"][$AxisID]["Position"] = AXIS_POSITION_LEFT; } - if ( isset($Data["AbscissaName"]) ) { $Data["Axis"][$AxisID]["Name"] = $Data["AbscissaName"]; } - if ( $XMargin == AUTO ) - { - if ( $Pos == SCALE_POS_LEFTRIGHT ) - { $Height = $this->GraphAreaX2-$this->GraphAreaX1; } - else - { $Height = $this->GraphAreaY2-$this->GraphAreaY1; } - - if ( $Points == 1 ) - $Data["Axis"][$AxisID]["Margin"] = $Height / 2; - else - $Data["Axis"][$AxisID]["Margin"] = ($Height/$Points) / 2; - } - else - { $Data["Axis"][$AxisID]["Margin"] = $XMargin; } - $Data["Axis"][$AxisID]["Rows"] = $Points-1; - if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; } - } - - $this->DataSet->saveOrientation($Pos); - $this->DataSet->saveAxisConfig($Data["Axis"]); - $this->DataSet->saveYMargin($YMargin); - - $FontColorRo = $this->FontColorR; $FontColorGo = $this->FontColorG; $FontColorBo = $this->FontColorB; - - $AxisPos["L"] = $this->GraphAreaX1; $AxisPos["R"] = $this->GraphAreaX2; $AxisPos["T"] = $this->GraphAreaY1; $AxisPos["B"] = $this->GraphAreaY2; - foreach($Data["Axis"] as $AxisID => $Parameters) - { - if ( isset($Parameters["Color"]) ) - { - $AxisR = $Parameters["Color"]["R"]; $AxisG = $Parameters["Color"]["G"]; $AxisB = $Parameters["Color"]["B"]; - $TickR = $Parameters["Color"]["R"]; $TickG = $Parameters["Color"]["G"]; $TickB = $Parameters["Color"]["B"]; - $this->setFontProperties(array("R"=>$Parameters["Color"]["R"],"G"=>$Parameters["Color"]["G"],"B"=>$Parameters["Color"]["B"])); - } - else - { - $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo; - $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo; - $this->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo)); - } - - $LastValue = "w00t"; $ID = 1; - if ( $Parameters["Identity"] == AXIS_X ) - { - if ( $Pos == SCALE_POS_LEFTRIGHT ) - { - if ( $Parameters["Position"] == AXIS_POSITION_BOTTOM ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 5; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; } - - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Width; } else { $Step = $Width / ($Parameters["Rows"]); } - - $MaxBottom = $AxisPos["B"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["B"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) ) - { - $Bounds = $this->drawText($XPos,$YPos+$OuterTickWidth+$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBottom = $YPos+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]); - $MaxBottom = max($MaxBottom,$TxtBottom); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $Skipped ) - { - if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); } - if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos-$SkippedInnerTickWidth,$XPos,$YPos+$SkippedOuterTickWidth,$SkippedTickColor); } - } - else - { - if ( $DrawXLines && ($XPos != $this->GraphAreaX1 && $XPos != $this->GraphAreaX2) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - - } - if ( isset($Parameters["Name"]) ) - { - $YPos = $MaxBottom+2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE)); - $MaxBottom = $Bounds[0]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize; - } - - $AxisPos["B"] = $MaxBottom + $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_TOP ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $YLabelOffset = 2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $YLabelOffset = 2; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $YLabelOffset = 5; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $YLabelOffset = 5; } - - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Width; } else { $Step = $Width / $Parameters["Rows"]; } - - $MinTop = $AxisPos["T"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["T"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) ) - { - $Bounds = $this->drawText($XPos,$YPos-$OuterTickWidth-$YLabelOffset,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBox = $YPos-$OuterTickWidth-2-($Bounds[0]["Y"]-$Bounds[2]["Y"]); - $MinTop = min($MinTop,$TxtBox); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $Skipped ) - { - if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$SkippedAxisColor); } - if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos+$SkippedInnerTickWidth,$XPos,$YPos-$SkippedOuterTickWidth,$SkippedTickColor); } - } - else - { - if ( $DrawXLines ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos,$YPos+$InnerTickWidth,$XPos,$YPos-$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - - } - if ( isset($Parameters["Name"]) ) - { - $YPos = $MinTop-2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - $MinTop = $Bounds[2]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop; - } - - $AxisPos["T"] = $MinTop - $ScaleSpacing; - } - } - elseif ( $Pos == SCALE_POS_TOPBOTTOM ) - { - if ( $Parameters["Position"] == AXIS_POSITION_LEFT ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = -6; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -2; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = -5; } - - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Height; } else { $Step = $Height / $Parameters["Rows"]; } - - $MinLeft = $AxisPos["L"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i; - $XPos = $AxisPos["L"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) ) - { - $Bounds = $this->drawText($XPos-$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBox = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]); - $MinLeft = min($MinLeft,$TxtBox); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $Skipped ) - { - if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); } - if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos-$SkippedOuterTickWidth,$YPos,$XPos+$SkippedInnerTickWidth,$YPos,$SkippedTickColor); } - } - else - { - if ( $DrawXLines && ($YPos != $this->GraphAreaY1 && $YPos != $this->GraphAreaY2) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - - } - if ( isset($Parameters["Name"]) ) - { - $XPos = $MinLeft-2; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90)); - $MinLeft = $Bounds[0]["X"]; - - $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft; - } - - $AxisPos["L"] = $MinLeft - $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT ) - { - if ( $LabelRotation == 0 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 2; } - if ( $LabelRotation > 0 && $LabelRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $XLabelOffset = 6; } - if ( $LabelRotation == 180 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 5; } - if ( $LabelRotation > 180 && $LabelRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $XLabelOffset = 7; } - - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2+($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - - if ($Parameters["Rows"] == 0 ) { $Step = $Height; } else { $Step = $Height / $Parameters["Rows"]; } - - $MaxRight = $AxisPos["R"]; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY1 + $Parameters["Margin"] + $Step*$i; - $XPos = $AxisPos["R"]; - - if ( $Abscissa != NULL ) - { if ( isset($Data["Series"][$Abscissa]["Data"][$i]) ) { $Value = $this->scaleFormat($Data["Series"][$Abscissa]["Data"][$i],$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); } else { $Value = ""; } } - else - { - if ( isset($Parameters["ScaleMin"]) && isset ($Parameters["RowHeight"]) ) - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Data["XAxisDisplay"],$Data["XAxisFormat"],$Data["XAxisUnit"]); - else - $Value = $i; - } - - $ID++; $Skipped = TRUE; - if ( $this->isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) ) - { - $Bounds = $this->drawText($XPos+$OuterTickWidth+$XLabelOffset,$YPos,$Value,array("Angle"=>$LabelRotation,"Align"=>$LabelAlign)); - $TxtBox = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]); - $MaxRight = max($MaxRight,$TxtBox); - $LastValue = $Value; - $Skipped = FALSE; - } - - if ( $Skipped ) - { - if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,$SkippedAxisColor); } - if ( $SkippedInnerTickWidth !=0 || $SkippedOuterTickWidth != 0 ) { $this->drawLine($XPos+$SkippedOuterTickWidth,$YPos,$XPos-$SkippedInnerTickWidth,$YPos,$SkippedTickColor); } - } - else - { - if ( $DrawXLines ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( $InnerTickWidth !=0 || $OuterTickWidth != 0 ) { $this->drawLine($XPos+$OuterTickWidth,$YPos,$XPos-$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); } - } - - } - if ( isset($Parameters["Name"]) ) - { - $XPos = $MaxRight+4; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270)); - $MaxRight = $Bounds[1]["X"]; - - $this->DataSet->Data["GraphArea"]["X2"] = $MaxRight + $this->FontSize; - } - - $AxisPos["R"] = $MaxRight + $ScaleSpacing; - } - } - } - - - - if ( $Parameters["Identity"] == AXIS_Y ) - { - if ( $Pos == SCALE_POS_LEFTRIGHT ) - { - if ( $Parameters["Position"] == AXIS_POSITION_LEFT ) - { - - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["L"],$this->GraphAreaY1,$AxisPos["L"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["L"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["L"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - $Step = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"]; - $LastY = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i; - $XPos = $AxisPos["L"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); - $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]); - $MinLeft = min($MinLeft,$TxtLeft); - - $LastY = $YPos; - } - - if ( isset($Parameters["Name"]) ) - { - $XPos = $MinLeft-2; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90)); - $MinLeft = $Bounds[2]["X"]; - - $this->DataSet->Data["GraphArea"]["X1"] = $MinLeft; - } - - $AxisPos["L"] = $MinLeft - $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_RIGHT ) - { - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY2-$Parameters["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($AxisPos["R"],$this->GraphAreaY1,$AxisPos["R"],$this->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($AxisPos["R"],$this->GraphAreaY1+$Parameters["Margin"],$AxisPos["R"],$this->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Parameters["Margin"]*2; - $Step = $Height / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"]; - $LastY = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $YPos = $this->GraphAreaY2 - $Parameters["Margin"] - $Step*$i; - $XPos = $AxisPos["R"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($this->GraphAreaX1+$FloatingOffset,$LastY,$this->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($this->GraphAreaX1+$FloatingOffset,$YPos,$this->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); - $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]); - $MaxLeft = max($MaxLeft,$TxtLeft); - - $LastY = $YPos; - } - - if ( isset($Parameters["Name"]) ) - { - $XPos = $MaxLeft+6; - $YPos = $this->GraphAreaY1+($this->GraphAreaY2-$this->GraphAreaY1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270)); - $MaxLeft = $Bounds[2]["X"]; - - $this->DataSet->Data["GraphArea"]["X2"] = $MaxLeft + $this->FontSize; - } - $AxisPos["R"] = $MaxLeft + $ScaleSpacing; - } - } - elseif ( $Pos == SCALE_POS_TOPBOTTOM ) - { - if ( $Parameters["Position"] == AXIS_POSITION_TOP ) - { - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["T"],$this->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["T"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - $Step = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"]; - $LastX = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["T"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastX != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos,$YPos-$OuterTickWidth-2,$Value,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - $TxtHeight = $YPos-$OuterTickWidth-2-($Bounds[1]["Y"]-$Bounds[2]["Y"]); - $MinTop = min($MinTop,$TxtHeight); - - $LastX = $XPos; - } - - if ( isset($Parameters["Name"]) ) - { - $YPos = $MinTop-2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - $MinTop = $Bounds[2]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y1"] = $MinTop; - } - - $AxisPos["T"] = $MinTop - $ScaleSpacing; - } - elseif ( $Parameters["Position"] == AXIS_POSITION_BOTTOM ) - { - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->drawLine($this->GraphAreaX1+$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->drawLine($this->GraphAreaX1,$AxisPos["B"],$this->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->drawArrow($this->GraphAreaX2-$Parameters["Margin"],$AxisPos["B"],$this->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Parameters["Margin"]*2; - $Step = $Width / $Parameters["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"]; - $LastX = NULL; - for($i=0;$i<=$Parameters["Rows"];$i++) - { - $XPos = $this->GraphAreaX1 + $Parameters["Margin"] + $Step*$i; - $YPos = $AxisPos["B"]; - $Value = $this->scaleFormat($Parameters["ScaleMin"] + $Parameters["RowHeight"]*$i,$Parameters["Display"],$Parameters["Format"],$Parameters["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastX != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->drawFilledRectangle($LastX,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,$BGColor); } - - if ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) ) { $this->drawLine($XPos,$this->GraphAreaY1+$FloatingOffset,$XPos,$this->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $Parameters["Rows"] ) - $this->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->drawText($XPos,$YPos+$OuterTickWidth+2,$Value,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); - $TxtHeight = $YPos+$OuterTickWidth+2+($Bounds[1]["Y"]-$Bounds[2]["Y"]); - $MaxBottom = max($MaxBottom,$TxtHeight); - - $LastX = $XPos; - } - - if ( isset($Parameters["Name"]) ) - { - $YPos = $MaxBottom+2; - $XPos = $this->GraphAreaX1+($this->GraphAreaX2-$this->GraphAreaX1)/2; - $Bounds = $this->drawText($XPos,$YPos,$Parameters["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE)); - $MaxBottom = $Bounds[0]["Y"]; - - $this->DataSet->Data["GraphArea"]["Y2"] = $MaxBottom + $this->FontSize; - } - - $AxisPos["B"] = $MaxBottom + $ScaleSpacing; - } - } - } - } - } - - function isValidLabel($Value,$LastValue,$LabelingMethod,$ID,$LabelSkip) - { - if ( $LabelingMethod == LABELING_DIFFERENT && $Value != $LastValue ) { return(TRUE); } - if ( $LabelingMethod == LABELING_DIFFERENT && $Value == $LastValue ) { return(FALSE); } - if ( $LabelingMethod == LABELING_ALL && $LabelSkip == 0 ) { return(TRUE); } - if ( $LabelingMethod == LABELING_ALL && ($ID+$LabelSkip) % ($LabelSkip+1) != 1 ) { return(FALSE); } - - return(TRUE); - } - - /* Compute the scale, check for the best visual factors */ - function computeScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID=0) - { - /* Compute each factors */ - $Results = ""; - foreach ($Factors as $Key => $Factor) - $Results[$Factor] = $this->processScale($XMin,$XMax,$MaxDivs,array($Factor),$AxisID); - - /* Remove scales that are creating to much decimals */ - $GoodScaleFactors = ""; - foreach ($Results as $Key => $Result) - { - $Decimals = preg_split("/\./",$Result["RowHeight"]); - if ( (!isset($Decimals[1])) || (strlen($Decimals[1]) < 6) ) { $GoodScaleFactors[] = $Key; } - } - - /* Found no correct scale, shame,... returns the 1st one as default */ - if ( $GoodScaleFactors == "" ) { return($Results[$Factors[0]]); } - - /* Find the factor that cause the maximum number of Rows */ - $MaxRows = 0; $BestFactor = 0; - foreach($GoodScaleFactors as $Key => $Factor) - { if ( $Results[$Factor]["Rows"] > $MaxRows ) { $MaxRows = $Results[$Factor]["Rows"]; $BestFactor = $Factor; } } - - /* Return the best visual scale */ - return($Results[$BestFactor]); - } - - /* Compute the best matching scale based on size & factors */ - function processScale($XMin,$XMax,$MaxDivs,$Factors,$AxisID) - { - $ScaleHeight = abs(ceil($XMax)-floor($XMin)); - - if ( isset($this->DataSet->Data["Axis"][$AxisID]["Format"]) ) - $Format = $this->DataSet->Data["Axis"][$AxisID]["Format"]; - else - $Format = NULL; - - if ( isset($this->DataSet->Data["Axis"][$AxisID]["Display"]) ) - $Mode = $this->DataSet->Data["Axis"][$AxisID]["Display"]; - else - $Mode = AXIS_FORMAT_DEFAULT; - - $Scale = ""; - if ( $XMin != $XMax ) - { - $Found = FALSE; $Rescaled = FALSE; $Scaled10Factor = .0001; $Result = 0; - while(!$Found) - { - foreach($Factors as $Key => $Factor) - { - if ( !$Found ) - { - if ( !($this->modulo($XMin,$Factor*$Scaled10Factor) == 0) || ($XMin != floor($XMin))) { $XMinRescaled = floor($XMin/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor; } else { $XMinRescaled = $XMin; } - if ( !($this->modulo($XMax,$Factor*$Scaled10Factor) == 0) || ($XMax != floor($XMax))) { $XMaxRescaled = floor($XMax/($Factor*$Scaled10Factor))*$Factor*$Scaled10Factor+($Factor*$Scaled10Factor); } else { $XMaxRescaled = $XMax; } - $ScaleHeightRescaled = abs($XMaxRescaled-$XMinRescaled); - - if ( !$Found && floor($ScaleHeightRescaled/($Factor*$Scaled10Factor)) <= $MaxDivs ) { $Found = TRUE; $Rescaled = TRUE; $Result = $Factor * $Scaled10Factor; } - } - } - $Scaled10Factor = $Scaled10Factor * 10; - } - - /* ReCall Min / Max / Height */ - if ( $Rescaled ) { $XMin = $XMinRescaled; $XMax = $XMaxRescaled; $ScaleHeight = $ScaleHeightRescaled; } - - /* Compute rows size */ - $Rows = floor($ScaleHeight / $Result); if ( $Rows == 0 ) { $Rows = 1; } - $RowHeight = $ScaleHeight / $Rows; - - /* Return the results */ - $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin; $Scale["XMax"] = $XMax; - - /* Compute the needed decimals for the metric view to avoid repetition of the same X Axis labels */ - if ( $Mode == AXIS_FORMAT_METRIC && $Format == NULL ) - { - $Done = FALSE; $GoodDecimals = 0; - for($Decimals=0;$Decimals<=10;$Decimals++) - { - if ( !$Done ) - { - $LastLabel = "zob"; $ScaleOK = TRUE; - for($i=0;$i<=$Rows;$i++) - { - $Value = $XMin + $i*$RowHeight; - $Label = $this->scaleFormat($Value,AXIS_FORMAT_METRIC,$Decimals); - - if ( $LastLabel == $Label ) { $ScaleOK = FALSE; } - $LastLabel = $Label; - } - if ( $ScaleOK ) { $Done = TRUE; $GoodDecimals = $Decimals; } - } - } - - $Scale["Format"] = $GoodDecimals; - } - } - else - { - /* If all values are the same we keep a +1/-1 scale */ - $Rows = 2; $XMin = $XMax-1; $XMax = $XMax+1; $RowHeight = 1; - - /* Return the results */ - $Scale["Rows"] = $Rows; $Scale["RowHeight"] = $RowHeight; $Scale["XMin"] = $XMin; $Scale["XMax"] = $XMax; - } - - return($Scale); - } - - function modulo($Value1,$Value2) - { - if (floor($Value2) == 0) { return(0); } - if (floor($Value2) != 0) { return($Value1 % $Value2); } - - $MinValue = min($Value1,$Value2); $Factor = 10; - while ( floor($MinValue*$Factor) == 0 ) - { $Factor = $Factor * 10; } - - return(($Value1*$Factor) % ($Value2*$Factor)); - } - - /* Draw a threshold with the computed scale */ - function drawThreshold($Value,$Format="") - { - $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0; - $R = isset($Format["R"]) ? $Format["R"] : 255; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 50; - $Weight = isset($Format["Weight"]) ? $Format["Weight"] : NULL; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : 6; - $Wide = isset($Format["Wide"]) ? $Format["Wide"] : FALSE; - $WideFactor = isset($Format["WideFactor"]) ? $Format["WideFactor"] : 5; - $WriteCaption = isset($Format["WriteCaption"]) ? $Format["WriteCaption"] : FALSE; - $Caption = isset($Format["Caption"]) ? $Format["Caption"] : NULL; - $CaptionAlign = isset($Format["CaptionAlign"]) ? $Format["CaptionAlign"] : CAPTION_LEFT_TOP; - $CaptionOffset = isset($Format["CaptionOffset"]) ? $Format["CaptionOffset"] : 10; - $CaptionR = isset($Format["CaptionR"]) ? $Format["CaptionR"] : 255; - $CaptionG = isset($Format["CaptionG"]) ? $Format["CaptionG"] : 255; - $CaptionB = isset($Format["CaptionB"]) ? $Format["CaptionB"] : 255; - $CaptionAlpha = isset($Format["CaptionAlpha"]) ? $Format["CaptionAlpha"] : 100; - $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE; - $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE; - $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 3; - $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE; - $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3; - $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0; - $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0; - $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 30; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : ""; - $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255; - $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255; - $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255; - $BoxBorderAlpha = isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100; - - $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius, - "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding, - "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha, - "R"=>$CaptionR,"G"=>$CaptionG,"B"=>$CaptionB,"Alpha"=>$CaptionAlpha); - - if ( $Caption == NULL ) { $Caption = $Value; } - - $Data = $this->DataSet->getData(); - if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $YPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID)); - if ( $YPos >= $this->GraphAreaY1 && $YPos <= $this->GraphAreaY2 ) - { - $this->drawLine($this->GraphAreaX1,$YPos,$this->GraphAreaX2,$YPos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Wide ) - { - $this->drawLine($this->GraphAreaX1,$YPos-1,$this->GraphAreaX2,$YPos-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - $this->drawLine($this->GraphAreaX1,$YPos+1,$this->GraphAreaX2,$YPos+1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - } - - if ( $WriteCaption ) - { - if ( $CaptionAlign == CAPTION_LEFT_TOP ) - { $X = $this->GraphAreaX1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLELEFT; } - else - { $X = $this->GraphAreaX2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_MIDDLERIGHT; } - - $this->drawText($X,$YPos,$Caption,$CaptionSettings); - } - } - - return(array("Y"=>$YPos)); - } - - if ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - $XPos = $this->scaleComputeY($Value,array("AxisID"=>$AxisID)); - if ( $XPos >= $this->GraphAreaX1 && $XPos <= $this->GraphAreaX2 ) - { - $this->drawLine($XPos,$this->GraphAreaY1,$XPos,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Wide ) - { - $this->drawLine($XPos-1,$this->GraphAreaY1,$XPos-1,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - $this->drawLine($XPos+1,$this->GraphAreaY1,$XPos+1,$this->GraphAreaY2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/$WideFactor,"Ticks"=>$Ticks)); - } - - if ( $WriteCaption ) - { - if ( $CaptionAlign == CAPTION_LEFT_TOP ) - { $Y = $this->GraphAreaY1 + $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE; } - else - { $Y = $this->GraphAreaY2 - $CaptionOffset; $CaptionSettings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE; } - - $CaptionSettings["Align"] = TEXT_ALIGN_TOPMIDDLE; - $this->drawText($XPos,$Y,$Caption,$CaptionSettings); - } - } - - return(array("Y"=>$XPos)); - } - } - - /* Draw a threshold with the computed scale */ - function drawThresholdArea($Value1,$Value2,$Format="") - { - $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0; - $R = isset($Format["R"]) ? $Format["R"] : 255; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 20; - $Border = isset($Format["Border"]) ? $Format["Border"] : TRUE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha + 20; - $BorderTicks = isset($Format["BorderTicks"]) ? $Format["BorderTicks"] : 2; - - if ($BorderAlpha >100) { $BorderAlpha = 100;} - - $Data = $this->DataSet->getData(); - if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $YPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID)); - $YPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID)); - - if ( $YPos1 > $this->GraphAreaY2 ) { $YPos1 = $this->GraphAreaY2; } if ( $YPos1 < $this->GraphAreaY1 ) { $YPos1 = $this->GraphAreaY1; } - if ( $YPos2 > $this->GraphAreaY2 ) { $YPos2 = $this->GraphAreaY2; } if ( $YPos2 < $this->GraphAreaY1 ) { $YPos2 = $this->GraphAreaY1; } - - $this->drawFilledRectangle($this->GraphAreaX1+1,$YPos1,$this->GraphAreaX2-1,$YPos2,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - if ( $Border ) - { - $this->drawLine($this->GraphAreaX1+1,$YPos1,$this->GraphAreaX2-1,$YPos1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - $this->drawLine($this->GraphAreaX1+1,$YPos2,$this->GraphAreaX2-1,$YPos2,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - } - return(array("Y1"=>$YPos1,"Y2"=>$YPos2)); - } - - if ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - $XPos1 = $this->scaleComputeY($Value1,array("AxisID"=>$AxisID)); - $XPos2 = $this->scaleComputeY($Value2,array("AxisID"=>$AxisID)); - - if ( $XPos1 > $this->GraphAreaX2 ) { $XPos1 = $this->GraphAreaX2; } if ( $XPos1 < $this->GraphAreaX1 ) { $XPos1 = $this->GraphAreaX1; } - if ( $XPos2 > $this->GraphAreaX2 ) { $XPos2 = $this->GraphAreaX2; } if ( $XPos2 < $this->GraphAreaX1 ) { $XPos2 = $this->GraphAreaX1; } - - $this->drawFilledRectangle($XPos1,$this->GraphAreaY1+1,$XPos2,$this->GraphAreaY2-1,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - if ( $Border ) - { - $this->drawLine($XPos1,$this->GraphAreaY1+1,$XPos1,$this->GraphAreaY2-1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - $this->drawLine($XPos2,$this->GraphAreaY1+1,$XPos2,$this->GraphAreaY2-1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Ticks"=>$BorderTicks)); - } - return(array("Y1"=>$XPos1,"Y2"=>$XPos2)); - } - } - - function scaleGetXSettings() - { - $Data = $this->DataSet->getData(); - foreach($Data["Axis"] as $AxisID => $Settings) - { - if ( $Settings["Identity"] == AXIS_X ) - { - $Rows = $Settings["Rows"]; - - return(array($Settings["Margin"],$Rows)); - } - } - } - - function scaleComputeY($Values,$Option="",$ReturnOnly0Height=FALSE) - { - $AxisID = isset($Option["AxisID"]) ? $Option["AxisID"] : 0; - $SerieName = isset($Option["SerieName"]) ? $Option["SerieName"] : NULL; - - $Data = $this->DataSet->getData(); - if ( !isset($Data["Axis"][$AxisID]) ) { return(-1); } - - if ( $SerieName != NULL ) { $AxisID = $Data["Series"][$SerieName]["Axis"]; } - if ( !is_array($Values) ) { $tmp = $Values; $Values = ""; $Values[0] = $tmp; } - - $Result = ""; - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $Height = ($this->GraphAreaY2 - $this->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2; - $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"]; - $Step = $Height / $ScaleHeight; - - if ( $ReturnOnly0Height ) - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } } - else - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } } - } - else - { - $Width = ($this->GraphAreaX2 - $this->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2; - $ScaleWidth = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"]; - $Step = $Width / $ScaleWidth; - - if ( $ReturnOnly0Height ) - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $Step * $Value; } } } - else - { foreach($Values as $Key => $Value) { if ( $Value == VOID ) { $Result[] = VOID; } else { $Result[] = $this->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); } } } - } - - if ( count($Result) == 1 ) - return($Result[0]); - else - return($Result); - } - - /* Format the axis values */ - function scaleFormat($Value,$Mode=NULL,$Format=NULL,$Unit=NULL) - { - if ( $Value == VOID ) { return(""); } - - if ( $Mode == AXIS_FORMAT_DATE ) - { if ( $Format == NULL ) { $Pattern = "d/m/Y"; } else { $Pattern = $Format; } return(date($Pattern,$Value)); } - - if ( $Mode == AXIS_FORMAT_TIME ) - { if ( $Format == NULL ) { $Pattern = "H:i:s"; } else { $Pattern = $Format; } return(date($Pattern,$Value)); } - - if ( $Mode == AXIS_FORMAT_CURRENCY ) - { return($Format.number_format($Value,2)); } - - if ( $Mode == AXIS_FORMAT_METRIC ) - { - if (abs($Value) > 1000000000) - return(round($Value/1000000000,$Format)."g".$Unit); - if (abs($Value) > 1000000) - return(round($Value/1000000,$Format)."m".$Unit); - elseif (abs($Value) >= 1000) - return(round($Value/1000,$Format)."k".$Unit); - - } - return($Value.$Unit); - } - - /* Write Max value on a chart */ - function writeBounds($Type=BOUND_BOTH,$Format=NULL) - { - $MaxLabelTxt = isset($Format["MaxLabelTxt"]) ? $Format["MaxLabelTxt"] : "max="; - $MinLabelTxt = isset($Format["MinLabelTxt"]) ? $Format["MinLabelTxt"] : "min="; - $Decimals = isset($Format["Decimals"]) ? $Format["Decimals"] : 1; - $ExcludedSeries = isset($Format["ExcludedSeries"]) ? $Format["ExcludedSeries"] : ""; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $MaxDisplayR = isset($Format["MaxDisplayR"]) ? $Format["MaxDisplayR"] : 0; - $MaxDisplayG = isset($Format["MaxDisplayG"]) ? $Format["MaxDisplayG"] : 0; - $MaxDisplayB = isset($Format["MaxDisplayB"]) ? $Format["MaxDisplayB"] : 0; - $MinDisplayR = isset($Format["MinDisplayR"]) ? $Format["MinDisplayR"] : 255; - $MinDisplayG = isset($Format["MinDisplayG"]) ? $Format["MinDisplayG"] : 255; - $MinDisplayB = isset($Format["MinDisplayB"]) ? $Format["MinDisplayB"] : 255; - $MinLabelPos = isset($Format["MinLabelPos"]) ? $Format["MinLabelPos"] : BOUND_LABEL_POS_AUTO; - $MaxLabelPos = isset($Format["MaxLabelPos"]) ? $Format["MaxLabelPos"] : BOUND_LABEL_POS_AUTO; - $DrawBox = isset($Format["DrawBox"]) ? $Format["DrawBox"] : TRUE; - $DrawBoxBorder = isset($Format["DrawBoxBorder"]) ? $Format["DrawBoxBorder"] : FALSE; - $BorderOffset = isset($Format["BorderOffset"]) ? $Format["BorderOffset"] : 3; - $BoxRounded = isset($Format["BoxRounded"]) ? $Format["BoxRounded"] : TRUE; - $RoundedRadius = isset($Format["RoundedRadius"]) ? $Format["RoundedRadius"] : 3; - $BoxR = isset($Format["BoxR"]) ? $Format["BoxR"] : 0; - $BoxG = isset($Format["BoxG"]) ? $Format["BoxG"] : 0; - $BoxB = isset($Format["BoxB"]) ? $Format["BoxB"] : 0; - $BoxAlpha = isset($Format["BoxAlpha"]) ? $Format["BoxAlpha"] : 20; - $BoxSurrounding = isset($Format["BoxSurrounding"]) ? $Format["BoxSurrounding"] : ""; - $BoxBorderR = isset($Format["BoxBorderR"]) ? $Format["BoxBorderR"] : 255; - $BoxBorderG = isset($Format["BoxBorderG"]) ? $Format["BoxBorderG"] : 255; - $BoxBorderB = isset($Format["BoxBorderB"]) ? $Format["BoxBorderB"] : 255; - $BoxBorderAlpha = isset($Format["BoxBorderAlpha"]) ? $Format["BoxBorderAlpha"] : 100; - - $CaptionSettings = array("DrawBox"=>$DrawBox,"DrawBoxBorder"=>$DrawBoxBorder,"BorderOffset"=>$BorderOffset,"BoxRounded"=>$BoxRounded,"RoundedRadius"=>$RoundedRadius, - "BoxR"=>$BoxR,"BoxG"=>$BoxG,"BoxB"=>$BoxB,"BoxAlpha"=>$BoxAlpha,"BoxSurrounding"=>$BoxSurrounding, - "BoxBorderR"=>$BoxBorderR,"BoxBorderG"=>$BoxBorderG,"BoxBorderB"=>$BoxBorderB,"BoxBorderAlpha"=>$BoxBorderAlpha); - - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $Data = $this->DataSet->getData(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] && !isset($ExcludedSeries[$SerieName])) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $MinValue = $this->DataSet->getMin($SerieName); - $MaxValue = $this->DataSet->getMax($SerieName); - - $MinPos = VOID; $MaxPos = VOID; - foreach($Serie["Data"] as $Key => $Value) - { - if ( $Value == $MinValue && $MinPos == VOID ) { $MinPos = $Key; } - if ( $Value == $MaxValue ) { $MaxPos = $Key; } - } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; - $X = $this->GraphAreaX1 + $XMargin; - $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0; - - if ( $Type == BOUND_MAX || $Type == BOUND_BOTH ) - { - if ( $MaxLabelPos == BOUND_LABEL_POS_TOP || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; } - if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; } - - $XPos = $X + $MaxPos*$XStep + $SerieOffset; - $Label = $MaxLabelTxt.$this->scaleFormat(round($MaxValue,$Decimals),$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); } - - $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG; - $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($XPos+$XOffset,$YPos+$YOffset,$Label,$CaptionSettings); - } - - if ( $Type == BOUND_MIN || $Type == BOUND_BOTH ) - { - if ( $MinLabelPos == BOUND_LABEL_POS_TOP || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_BOTTOMMIDDLE; } - if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_TOPMIDDLE; } - - $XPos = $X + $MinPos*$XStep + $SerieOffset; - $Label = $MinLabelTxt.$this->scaleFormat(round($MinValue,$Decimals),$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($XPos,$YPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = (($this->GraphAreaX1 - $TxtPos[0]["X"])/2); } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -(($TxtPos[1]["X"] - $this->GraphAreaX2)/2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $TxtPos[2]["Y"]; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -($TxtPos[0]["Y"] - $this->GraphAreaY2); } - - $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG; - $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($XPos+$XOffset,$YPos-$DisplayOffset+$YOffset,$Label,$CaptionSettings); - } - } - else - { - $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; - $X = $this->GraphAreaY1 + $XMargin; - $SerieOffset = isset($Serie["XOffset"]) ? $Serie["XOffset"] : 0; - - if ( $Type == BOUND_MAX || $Type == BOUND_BOTH ) - { - if ( $MaxLabelPos == BOUND_LABEL_POS_TOP || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue >= 0) ) { $YPos = $PosArray[$MaxPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; } - if ( $MaxLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MaxLabelPos == BOUND_LABEL_POS_AUTO && $MaxValue < 0) ) { $YPos = $PosArray[$MaxPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; } - - $XPos = $X + $MaxPos*$XStep + $SerieOffset; - $Label = $MaxLabelTxt.$this->scaleFormat($MaxValue,$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);} - - $CaptionSettings["R"] = $MaxDisplayR; $CaptionSettings["G"] = $MaxDisplayG; - $CaptionSettings["B"] = $MaxDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings); - } - - if ( $Type == BOUND_MIN || $Type == BOUND_BOTH ) - { - if ( $MinLabelPos == BOUND_LABEL_POS_TOP || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue >= 0) ) { $YPos = $PosArray[$MinPos] + $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLELEFT; } - if ( $MinLabelPos == BOUND_LABEL_POS_BOTTOM || ( $MinLabelPos == BOUND_LABEL_POS_AUTO && $MinValue < 0) ) { $YPos = $PosArray[$MinPos] - $DisplayOffset + 2; $Align = TEXT_ALIGN_MIDDLERIGHT; } - - $XPos = $X + $MinPos*$XStep + $SerieOffset; - $Label = $MinLabelTxt.$this->scaleFormat($MinValue,$Mode,$Format,$Unit); - - $TxtPos = $this->getTextBox($YPos,$XPos,$this->FontName,$this->FontSize,0,$Label); - $XOffset = 0; $YOffset = 0; - if ( $TxtPos[0]["X"] < $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $TxtPos[0]["X"]; } - if ( $TxtPos[1]["X"] > $this->GraphAreaX2 ) { $XOffset = -($TxtPos[1]["X"] - $this->GraphAreaX2); } - if ( $TxtPos[2]["Y"] < $this->GraphAreaY1 ) { $YOffset = ($this->GraphAreaY1 - $TxtPos[2]["Y"])/2; } - if ( $TxtPos[0]["Y"] > $this->GraphAreaY2 ) { $YOffset = -(($TxtPos[0]["Y"] - $this->GraphAreaY2)/2);} - - $CaptionSettings["R"] = $MinDisplayR; $CaptionSettings["G"] = $MinDisplayG; - $CaptionSettings["B"] = $MinDisplayB; $CaptionSettings["Align"] = $Align; - - $this->drawText($YPos+$XOffset,$XPos+$YOffset,$Label,$CaptionSettings); - } - } - } - } - } - - /* Draw a plot chart */ - function drawPlotChart($Format=NULL) - { - $PlotSize = isset($Format["PlotSize"]) ? $Format["PlotSize"] : 3; - $PlotBorder = isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 50; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 50; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 50; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30; - $BorderSize = isset($Format["BorderSize"]) ? $Format["BorderSize"] : 2; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 4; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - if ( isset($Serie["Picture"]) ) - { $Picture = $Serie["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->getPicInfo($Picture); } - else { $Picture = NULL; $PicOffset = 0; } - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Shape = $Serie["Shape"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - if ( $Picture != NULL ) { $PicOffset = $PicHeight / 2; $PlotSize = 0; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues ) - $this->drawText($X,$Y-$DisplayOffset-$PlotSize-$BorderSize-$PicOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $Y != VOID ) - { - if ( $RecordImageMap ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$PlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Picture != NULL ) - { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); } - else - { $this->drawShape($X,$Y,$Shape,$PlotSize,$PlotBorder,$BorderSize,$R,$G,$B,$Alpha,$BorderR,$BorderG,$BorderB,$BorderAlpha); } - } - $X = $X + $XStep; - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - if ( $Picture != NULL ) { $PicOffset = $PicWidth / 2; $PlotSize = 0; } - $Y = $this->GraphAreaY1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues ) - $this->drawText($X+$DisplayOffset+$PlotSize+$BorderSize+$PicOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $X != VOID ) - { - if ( $RecordImageMap ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$PlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Picture != NULL ) - { $this->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); } - else - { $this->drawShape($X,$Y,$Shape,$PlotSize,$PlotBorder,$BorderSize,$R,$G,$B,$Alpha,$BorderR,$BorderG,$BorderB,$BorderAlpha); } - } - $Y = $Y + $YStep; - } - } - } - } - } - - /* Draw a spline chart */ - function drawSplineChart($Format=NULL) - { - $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE; - $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4; - $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; // 234 - $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; // 55 - $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; // 26 - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 5; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( $BreakR == NULL ) - $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks); - else - $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $WayPoints = ""; - $Force = $XStep / 5; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1; - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues ) - $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $RecordImageMap && $Y != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Y == VOID && $LastY != NULL ) - { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; } - - if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); } - - if ( $Y != VOID ) - $WayPoints[] = array($X,$Y); - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - $LastX = $X; $LastY = $Y; - $X = $X + $XStep; - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $WayPoints = ""; - $Force = $YStep / 5; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $LastX = 1; $LastY = 1; - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues ) - $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $RecordImageMap && $X != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $X == VOID && $LastX != NULL ) - { $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); $WayPoints = ""; } - - if ( $X != VOID && $LastX == NULL && $LastGoodX != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); } - - if ( $X != VOID ) - $WayPoints[] = array($X,$Y); - - if ( $X != VOID ) { $LastGoodX = $X; $LastGoodY = $Y; } - if ( $X == VOID ) { $X = NULL; } - - $LastX = $X; $LastY = $Y; - $Y = $Y + $YStep; - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - } - } - } - } - - /* Draw a filled spline chart */ - function drawFilledSplineChart($Format=NULL) - { - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - if ( $AroundZero ) { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); } - - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Params) - { - $Threshold[$Key]["MinX"] = $this->scaleComputeY($Params["Min"],array("AxisID"=>$Serie["Axis"])); - $Threshold[$Key]["MaxX"] = $this->scaleComputeY($Params["Max"],array("AxisID"=>$Serie["Axis"])); - } - } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $WayPoints = ""; - $Force = $XStep / 5; - - if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - $LastX = ""; $LastY = ""; - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues ) - $this->drawText($X,$Y-$DisplayOffset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $Y == VOID ) - { - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]+1; - } - $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - - $WayPoints = ""; - } - else - $WayPoints[] = array($X,$Y-.5); /* -.5 for AA visual fix */ - - $X = $X + $XStep; - } - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $Area[$key][0]["X"]; $Corners[] = $YZero; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]+1; - } - $Corners[] = $Points[$subKey]["X"]-1; $Corners[] = $YZero; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $WayPoints = ""; - $Force = $YStep / 5; - - if ( !$AroundZero ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues ) - $this->drawText($X+$DisplayOffset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - - if ( $X == VOID ) - { - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"]; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]; - } - $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - - $WayPoints = ""; - } - else - $WayPoints[] = array($X,$Y); - - $Y = $Y + $YStep; - } - $Area = $this->drawSpline($WayPoints,array("Force"=>$Force,"PathOnly"=>TRUE)); - - if ( $Area != "" ) - { - foreach ($Area as $key => $Points) - { - $Corners = ""; $Corners[] = $YZero; $Corners[] = $Area[$key][0]["Y"]; - foreach($Points as $subKey => $Point) - { - if ( $subKey == count($Points)-1) { $Corners[] = $Point["X"]-1; } else { $Corners[] = $Point["X"]; } - $Corners[] = $Point["Y"]; - } - $Corners[] = $YZero; $Corners[] = $Points[$subKey]["Y"]-1; - - $this->drawPolygonChart($Corners,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha/2,"NoBorder"=>TRUE,"Threshold"=>$Threshold)); - } - $this->drawSpline($WayPoints,array("Force"=>$Force,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks)); - } - - } - } - } - } - - /* Draw a line chart */ - function drawLineChart($Format=NULL) - { - $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : TRUE; - $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4; - $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; - $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; - $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 5; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( $BreakR == NULL ) - $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - else - $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $RecordImageMap && $Y != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Y != VOID && $LastX != NULL && $LastY != NULL ) - $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; } - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - $LastX = $X; $LastY = $Y; - $X = $X + $XStep; - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { $this->drawText($X+$DisplayOffset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); } - - if ( $RecordImageMap && $X != VOID ) { $this->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $X != VOID && $LastX != NULL && $LastY != NULL ) - $this->drawLine($LastX,$LastY,$X,$Y,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight)); - - if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid ) - { $this->drawLine($LastGoodX,$LastGoodY,$X,$Y,$BreakSettings); $LastGoodY = NULL; } - - if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $X == VOID ) { $X = NULL; } - - $LastX = $X; $LastY = $Y; - $Y = $Y + $YStep; - } - } - } - } - } - - /* Draw a line chart */ - function drawZoneChart($SerieA,$SerieB,$Format=NULL) - { - $AxisID = isset($Format["AxisID"]) ? $Format["AxisID"] : 0; - $LineR = isset($Format["LineR"]) ? $Format["LineR"] : 150; - $LineG = isset($Format["LineG"]) ? $Format["LineG"] : 150; - $LineB = isset($Format["LineB"]) ? $Format["LineB"] : 150; - $LineAlpha = isset($Format["LineAlpha"]) ? $Format["LineAlpha"] : 50; - $LineTicks = isset($Format["LineTicks"]) ? $Format["LineTicks"] : 1; - $AreaR = isset($Format["AreaR"]) ? $Format["AreaR"] : 150; - $AreaG = isset($Format["AreaG"]) ? $Format["AreaG"] : 150; - $AreaB = isset($Format["AreaB"]) ? $Format["AreaB"] : 150; - $AreaAlpha = isset($Format["AreaAlpha"]) ? $Format["AreaAlpha"] : 5; - - $Data = $this->DataSet->getData(); - if ( !isset($Data["Series"][$SerieA]["Data"]) || !isset($Data["Series"][$SerieB]["Data"]) ) { return(0); } - $SerieAData = $Data["Series"][$SerieA]["Data"]; - $SerieBData = $Data["Series"][$SerieB]["Data"]; - - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArrayA = $this->scaleComputeY($SerieAData,array("AxisID"=>$AxisID)); - $PosArrayB = $this->scaleComputeY($SerieBData,array("AxisID"=>$AxisID)); - if ( count($PosArrayA) != count($PosArrayB) ) { return(0); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - $LastX = NULL; $LastY1 = NULL; $LastY2 = NULL; - $BoundsA = ""; $BoundsB = ""; - foreach($PosArrayA as $Key => $Y1) - { - $Y2 = $PosArrayB[$Key]; - - $BoundsA[] = $X; $BoundsA[] = $Y1; - $BoundsB[] = $X; $BoundsB[] = $Y2; - - $LastX = $X; - $LastY1 = $Y1; $LastY2 = $Y2; - - $X = $X + $XStep; - } - $Bounds = array_merge($BoundsA,$this->reversePlots($BoundsB)); - $this->drawPolygonChart($Bounds,array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"Alpha"=>$AreaAlpha)); - - for($i=0;$i<=count($BoundsA)-4;$i=$i+2) - { - $this->drawLine($BoundsA[$i],$BoundsA[$i+1],$BoundsA[$i+2],$BoundsA[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - $this->drawLine($BoundsB[$i],$BoundsB[$i+1],$BoundsB[$i+2],$BoundsB[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - $LastY = NULL; $LastX1 = NULL; $LastX2 = NULL; - $BoundsA = ""; $BoundsB = ""; - foreach($PosArrayA as $Key => $X1) - { - $X2 = $PosArrayB[$Key]; - - $BoundsA[] = $X1; $BoundsA[] = $Y; - $BoundsB[] = $X2; $BoundsB[] = $Y; - - $LastY = $Y; - $LastX1 = $X1; $LastX2 = $X2; - - $Y = $Y + $YStep; - } - $Bounds = array_merge($BoundsA,$this->reversePlots($BoundsB)); - $this->drawPolygonChart($Bounds,array("R"=>$AreaR,"G"=>$AreaG,"B"=>$AreaB,"Alpha"=>$AreaAlpha)); - - for($i=0;$i<=count($BoundsA)-4;$i=$i+2) - { - $this->drawLine($BoundsA[$i],$BoundsA[$i+1],$BoundsA[$i+2],$BoundsA[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - $this->drawLine($BoundsB[$i],$BoundsB[$i+1],$BoundsB[$i+2],$BoundsB[$i+3],array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha,"Ticks"=>$LineTicks)); - } - } - } - - /* Draw a step chart */ - function drawStepChart($Format=NULL) - { - $BreakVoid = isset($Format["BreakVoid"]) ? $Format["BreakVoid"] : FALSE; - $ReCenter = isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE; - $VoidTicks = isset($Format["VoidTicks"]) ? $Format["VoidTicks"] : 4; - $BreakR = isset($Format["BreakR"]) ? $Format["BreakR"] : NULL; - $BreakG = isset($Format["BreakG"]) ? $Format["BreakG"] : NULL; - $BreakB = isset($Format["BreakB"]) ? $Format["BreakB"] : NULL; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 5; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - if ( $BreakR == NULL ) - $BreakSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - else - $BreakSettings = array("R"=>$BreakR,"G"=>$BreakG,"B"=>$BreakB,"Alpha"=>$Alpha,"Ticks"=>$VoidTicks,"Weight"=>$Weight); - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight); - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE; - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Y <= $LastY ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X,$Y-$Offset-$Weight,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $Y != VOID && $LastX != NULL && $LastY != NULL ) - { - $this->drawLine($LastX,$LastY,$X,$LastY,$Color); - $this->drawLine($X,$LastY,$X,$Y,$Color); - if ( $ReCenter && $X+$XStep < $this->GraphAreaX2 - $XMargin ) - { - $this->drawLine($X,$Y,$X+$XStep,$Y,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X-$ImageMapPlotSize).",".floor($Y-$ImageMapPlotSize).",".floor($X+$XStep+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - else - { if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($LastY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } } - } - - if ( $Y != VOID && $LastY == NULL && $LastGoodY != NULL && !$BreakVoid ) - { - if ( $ReCenter ) - { - $this->drawLine($LastGoodX+$XStep,$LastGoodY,$X,$LastGoodY,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX+$XStep-$ImageMapPlotSize).",".floor($LastGoodY-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($LastGoodY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - else - { - $this->drawLine($LastGoodX,$LastGoodY,$X,$LastGoodY,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX-$ImageMapPlotSize).",".floor($LastGoodY-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($LastGoodY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - $this->drawLine($X,$LastGoodY,$X,$Y,$BreakSettings); - $LastGoodY = NULL; - } - elseif( !$BreakVoid && $LastGoodY == NULL && $Y != VOID ) - { - $this->drawLine($this->GraphAreaX1 + $XMargin,$Y,$X,$Y,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($this->GraphAreaX1+$XMargin-$ImageMapPlotSize).",".floor($Y-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; } - $LastX = $X; $LastY = $Y; - if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; } - $X = $X + $XStep; - } - if ( $ReCenter ) - { - $this->drawLine($LastX,$LastY,$this->GraphAreaX2 - $XMargin,$LastY,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($this->GraphAreaX2-$XMargin+$ImageMapPlotSize).",".floor($LastY+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Init = FALSE; - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $X >= $LastX ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; } - $this->drawText($X+$Offset+$Weight,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $X != VOID && $LastX != NULL && $LastY != NULL ) - { - $this->drawLine($LastX,$LastY,$LastX,$Y,$Color); - $this->drawLine($LastX,$Y,$X,$Y,$Color); - - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($LastX+$XStep+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - if ( $X != VOID && $LastX == NULL && $LastGoodY != NULL && !$BreakVoid ) - { - $this->drawLine($LastGoodX,$LastGoodY,$LastGoodX,$LastGoodY+$YStep,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX-$ImageMapPlotSize).",".floor($LastGoodY-$ImageMapPlotSize).",".floor($LastGoodX+$ImageMapPlotSize).",".floor($LastGoodY+$YStep+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - $this->drawLine($LastGoodX,$LastGoodY+$YStep,$LastGoodX,$Y,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastGoodX-$ImageMapPlotSize).",".floor($LastGoodY+$YStep-$ImageMapPlotSize).",".floor($LastGoodX+$ImageMapPlotSize).",".floor($YStep+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - $this->drawLine($LastGoodX,$Y,$X,$Y,$BreakSettings); - $LastGoodY = NULL; - } - elseif ( $X != VOID && $LastGoodY == NULL && !$BreakVoid ) - { - $this->drawLine($X,$this->GraphAreaY1 + $XMargin,$X,$Y,$BreakSettings); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X-$ImageMapPlotSize).",".floor($this->GraphAreaY1+$XMargin-$ImageMapPlotSize).",".floor($X+$ImageMapPlotSize).",".floor($Y+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - - if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $X == VOID ) { $X = NULL; } - - if ( !$Init && $ReCenter ) { $Y = $Y - $YStep/2; $Init = TRUE; } - $LastX = $X; $LastY = $Y; - if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; } - $Y = $Y + $YStep; - } - if ( $ReCenter ) - { - $this->drawLine($LastX,$LastY,$LastX,$this->GraphAreaY2 - $XMargin,$Color); - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($LastX-$ImageMapPlotSize).",".floor($LastY-$ImageMapPlotSize).",".floor($LastX+$ImageMapPlotSize).",".floor($this->GraphAreaY2-$XMargin+$ImageMapPlotSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - } - } - } - } - } - - /* Draw a step chart */ - function drawFilledStepChart($Format=NULL) - { - $ReCenter = isset($Format["ReCenter"]) ? $Format["ReCenter"] : TRUE; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] :FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : NULL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B); - if ( $ForceTransparency != NULL ) { $Color["Alpha"] = $ForceTransparency; } else { $Color["Alpha"] = $Alpha; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !$AroundZero ) { $YZero = $this->GraphAreaY2-1; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Points = ""; $Init = FALSE; - foreach($PosArray as $Key => $Y) - { - if ( $Y == VOID && $LastX != NULL && $LastY != NULL && $Points !="" ) - { - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $X; $Points[] = $LastY; - $Points[] = $X; $Points[] = $YZero; - $this->drawPolygon($Points,$Color); - $Points = ""; - } - - if ( $Y != VOID && $LastX != NULL && $LastY != NULL ) - { - if ( $Points == "") { $Points[] = $LastX; $Points[] = $YZero; } - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $X; $Points[] = $LastY; - $Points[] = $X; $Points[] = $Y; - } - - if ( $Y != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $Y == VOID ) { $Y = NULL; } - - if ( !$Init && $ReCenter ) { $X = $X - $XStep/2; $Init = TRUE; } - $LastX = $X; $LastY = $Y; - if ( $LastX < $this->GraphAreaX1 + $XMargin ) { $LastX = $this->GraphAreaX1 + $XMargin; } - $X = $X + $XStep; - } - - if ( $ReCenter ) - { - $Points[] = $LastX+$XStep/2; $Points[] = $LastY; - $Points[] = $LastX+$XStep/2; $Points[] = $YZero; - } - else - { $Points[] = $LastX; $Points[] = $YZero; } - - $this->drawPolygon($Points,$Color); - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $LastGoodY = NULL; $LastGoodX = NULL; $Points = ""; - foreach($PosArray as $Key => $X) - { - if ( $X == VOID && $LastX != NULL && $LastY != NULL && $Points !="" ) - { - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $LastX; $Points[] = $Y; - $Points[] = $YZero; $Points[] = $Y; - $this->drawPolygon($Points,$Color); - $Points = ""; - } - - if ( $X != VOID && $LastX != NULL && $LastY != NULL ) - { - if ( $Points == "") { $Points[] = $YZero; $Points[] = $LastY; } - $Points[] = $LastX; $Points[] = $LastY; - $Points[] = $LastX; $Points[] = $Y; - $Points[] = $X; $Points[] = $Y; - } - - if ( $X != VOID ) { $LastGoodY = $Y; $LastGoodX = $X; } - if ( $X == VOID ) { $X = NULL; } - - if ( $LastX == NULL && $ReCenter ) { $Y = $Y - $YStep/2; } - $LastX = $X; $LastY = $Y; - if ( $LastY < $this->GraphAreaY1 + $XMargin ) { $LastY = $this->GraphAreaY1 + $XMargin; } - $Y = $Y + $YStep; - } - - if ( $ReCenter ) - { - $Points[] = $LastX; $Points[] = $LastY+$YStep/2; - $Points[] = $YZero; $Points[] = $LastY+$YStep/2; - } - else - { $Points[] = $YZero; $Points[] = $LastY; } - - $this->drawPolygon($Points,$Color); - } - } - } - } - - /* Draw an area chart */ - function drawAreaChart($Format=NULL) - { - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : 25; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Params) - { - $Threshold[$Key]["MinX"] = $this->scaleComputeY($Params["Min"],array("AxisID"=>$Serie["Axis"])); - $Threshold[$Key]["MaxX"] = $this->scaleComputeY($Params["Max"],array("AxisID"=>$Serie["Axis"])); - } - } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - - $Areas = ""; $AreaID = 0; - $Areas[$AreaID][] = $this->GraphAreaX1 + $XMargin; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Y) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X,$Y-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $Y == VOID && isset($Areas[$AreaID]) ) - { - if($LastX == NULL) - { $Areas[$AreaID][] = $X; } - else - { $Areas[$AreaID][] = $LastX; } - - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - $AreaID++; - } - elseif ($Y != VOID) - { - if ( !isset($Areas[$AreaID]) ) - { - $Areas[$AreaID][] = $X; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - } - - $Areas[$AreaID][] = $X; - $Areas[$AreaID][] = $Y; - } - - $LastX = $X; - $X = $X + $XStep; - } - $Areas[$AreaID][] = $LastX; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaY2-1; } - - $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha; - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Threshold"=>$Threshold); - foreach($Areas as $Key => $Points) - $this->drawPolygonChart($Points,$Color); - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - $Areas = ""; $AreaID = 0; - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - $Areas[$AreaID][] = $this->GraphAreaY1 + $XMargin; - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; $LastX = NULL; $LastY = NULL; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $X) - { - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X+$Offset,$Y,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("Angle"=>270,"R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align)); - } - - if ( $X == VOID && isset($Areas[$AreaID]) ) - { - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - - if($LastY == NULL) - { $Areas[$AreaID][] = $Y; } - else - { $Areas[$AreaID][] = $LastY; } - - $AreaID++; - } - elseif ($X != VOID) - { - if ( !isset($Areas[$AreaID]) ) - { - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - $Areas[$AreaID][] = $Y; - } - - $Areas[$AreaID][] = $X; - $Areas[$AreaID][] = $Y; - } - - $LastX = $X; $LastY = $Y; - $Y = $Y + $YStep; - } - if ( $AroundZero ) { $Areas[$AreaID][] = $YZero; } else { $Areas[$AreaID][] = $this->GraphAreaX1+1; } - $Areas[$AreaID][] = $LastY; - - $Alpha = $ForceTransparency != NULL ? $ForceTransparency : $Alpha; - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Threshold"=>$Threshold); - foreach($Areas as $Key => $Points) - $this->drawPolygonChart($Points,$Color); - } - } - } - } - - - /* Draw a bar chart */ - function drawBarChart($Format=NULL) - { - $Floating0Serie = isset($Format["Floating0Serie"]) ? $Format["Floating0Serie"] : NULL; - $Floating0Value = isset($Format["Floating0Value"]) ? $Format["Floating0Value"] : NULL; - $Draw0Line = isset($Format["Draw0Line"]) ? $Format["Draw0Line"] : FALSE; - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayOffset = isset($Format["DisplayOffset"]) ? $Format["DisplayOffset"] : 2; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayFont = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontName; - $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize; - $DisplayPos = isset($Format["DisplayPos"]) ? $Format["DisplayPos"] : LABEL_POS_OUTSIDE; - $DisplayShadow = isset($Format["DisplayShadow"]) ? $Format["DisplayShadow"] : TRUE; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $AroundZero = isset($Format["AroundZero"]) ? $Format["AroundZero"] : TRUE; - $Interleave = isset($Format["Interleave"]) ? $Format["Interleave"] : .5; - $Rounded = isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE; - $RoundRadius = isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Gradient = isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE; - $GradientMode = isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE; - $GradientAlpha = isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20; - $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255; - $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255; - $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255; - $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0; - $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0; - $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0; - $TxtMargin = isset($Format["TxtMargin"]) ? $Format["TxtMargin"] : 6; - $OverrideColors = isset($Format["OverrideColors"]) ? $Format["OverrideColors"] : NULL; - $OverrideSurrounding = isset($Format["OverrideSurrounding"]) ? $Format["OverrideSurrounding"] : 30; - $InnerSurrounding = isset($Format["InnerSurrounding"]) ? $Format["InnerSurrounding"] : NULL; - $InnerBorderR = isset($Format["InnerBorderR"]) ? $Format["InnerBorderR"] : -1; - $InnerBorderG = isset($Format["InnerBorderG"]) ? $Format["InnerBorderG"] : -1; - $InnerBorderB = isset($Format["InnerBorderB"]) ? $Format["InnerBorderB"] : -1; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - if ( $OverrideColors != NULL ) - { - $OverrideColors = $this->validatePalette($OverrideColors,$OverrideSurrounding); - $this->DataSet->saveExtendedData("Palette",$OverrideColors); - } - - $RestoreShadow = $this->Shadow; - - $SeriesCount = $this->countDrawableSeries(); - $CurrentSerie = 0; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = $R; $DisplayG = $G; $DisplayB = $B; } - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $InnerSurrounding != NULL ) { $InnerBorderR = $R+$InnerSurrounding; $InnerBorderG = $G+$InnerSurrounding; $InnerBorderB = $B+$InnerSurrounding; } - if ( $InnerBorderR == -1 ) { $InnerColor = NULL; } else { $InnerColor = array("R"=>$InnerBorderR,"G"=>$InnerBorderG,"B"=>$InnerBorderB); } - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB); - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Floating0Value != NULL ) - { $YZero = $this->scaleComputeY($Floating0Value,array("AxisID"=>$Serie["Axis"])); } - else - { $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; } - if ( $XDivs == 0 ) { $XSize = ($this->GraphAreaX2-$this->GraphAreaX1)/($SeriesCount+$Interleave); } else { $XSize = ($XStep / ($SeriesCount+$Interleave) ); } - - $XOffset = -($XSize*$SeriesCount)/2 + $CurrentSerie * $XSize; - if ( $X + $XOffset <= $this->GraphAreaX1 ) { $XOffset = $this->GraphAreaX1 - $X + 1 ; } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $XOffset + $XSize / 2; - - if ( $Rounded || $BorderR != -1) { $XSpace = 1; } else { $XSpace = 0; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $ID = 0; - foreach($PosArray as $Key => $Y2) - { - if ( $Floating0Serie != NULL ) - { - if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) ) - { $Value = $Data["Series"][$Floating0Serie]["Data"][$Key]; } - else - { $Value = 0; } - - $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"])); - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero < $this->GraphAreaY1+1 ) { $YZero = $this->GraphAreaY1+1; } - - if ( $AroundZero ) { $Y1 = $YZero; } else { $Y1 = $this->GraphAreaY2-1; } - } - - if ( $OverrideColors != NULL ) - { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } } - - if ( $Y2 != VOID ) - { - $BarHeight = $Y1 - $Y2; - - if ( $Serie["Data"][$Key] == 0 ) - $this->drawLine($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y1,$Color); - else - { - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X+$XOffset+$XSpace).",".floor($Y1).",".floor($X+$XOffset+$XSize-$XSpace).",".floor($Y2),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,$Color); - - if ( $InnerColor != NULL ) { $this->drawRectangle($X+$XOffset+$XSpace+1,min($Y1,$Y2)+1,$X+$XOffset+$XSize-$XSpace-1,max($Y1,$Y2)-1,$InnerColor); } - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - if ( $Serie["Data"][$Key] >= 0 ) - $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - else - $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - - $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_VERTICAL,$GradienColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $XSpan = floor($XSize / 3); - - $this->drawGradientArea($X+$XOffset+$XSpace,$Y1,$X+$XOffset+$XSpan-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor1); - $this->drawGradientArea($X+$XOffset+$XSpan+$XSpace,$Y1,$X+$XOffset+$XSize-$XSpace,$Y2,DIRECTION_HORIZONTAL,$GradienColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $Draw0Line ) - { - $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20); - - if ( abs($Y1 - $Y2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; } - if ( $Y1 - $Y2 < 0 ) { $Line0Width = -$Line0Width; } - - $this->drawFilledRectangle($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1)-$Line0Width,$Line0Color); - $this->drawLine($X+$XOffset+$XSpace,floor($Y1),$X+$XOffset+$XSize-$XSpace,floor($Y1),$Line0Color); - } - } - - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $DisplayShadow ) { $this->Shadow = TRUE; } - - $Caption = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,90,$Caption); - $TxtHeight = $TxtPos[0]["Y"] - $TxtPos[1]["Y"] + $TxtMargin; - - if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtHeight) < abs($BarHeight) ) - { - $CenterX = (($X+$XOffset+$XSize-$XSpace)-($X+$XOffset+$XSpace))/2 + $X+$XOffset+$XSpace; - $CenterY = ($Y2-$Y1)/2 + $Y1; - - $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"Angle"=>90)); - } - else - { - if ( $Serie["Data"][$Key] >= 0 ) { $Align = TEXT_ALIGN_BOTTOMMIDDLE; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_TOPMIDDLE; $Offset = -$DisplayOffset; } - $this->drawText($X+$XOffset+$XSize/2,$Y2-$Offset,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize)); - } - - $this->Shadow = $RestoreShadow; - } - } - - $X = $X + $XStep; - $ID++; - } - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - if ( $XDivs == 0 ) { $YStep = 0; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - - $Y = $this->GraphAreaY1 + $XMargin; - - if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; } - if ( $XDivs == 0 ) { $YSize = ($this->GraphAreaY2-$this->GraphAreaY1)/($SeriesCount+$Interleave); } else { $YSize = ($YStep / ($SeriesCount+$Interleave) ); } - - $YOffset = -($YSize*$SeriesCount)/2 + $CurrentSerie * $YSize; - if ( $Y + $YOffset <= $this->GraphAreaY1 ) { $YOffset = $this->GraphAreaY1 - $Y + 1 ; } - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = $YOffset + $YSize / 2; - - if ( $Rounded || $BorderR != -1 ) { $YSpace = 1; } else { $YSpace = 0; } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $ID = 0 ; - foreach($PosArray as $Key => $X2) - { - if ( $Floating0Serie != NULL ) - { - if ( isset($Data["Series"][$Floating0Serie]["Data"][$Key]) ) - $Value = $Data["Series"][$Floating0Serie]["Data"][$Key]; - else { $Value = 0; } - - $YZero = $this->scaleComputeY($Value,array("AxisID"=>$Serie["Axis"])); - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - if ( $AroundZero ) { $X1 = $YZero; } else { $X1 = $this->GraphAreaX1+1; } - } - - if ( $OverrideColors != NULL ) - { if ( isset($OverrideColors[$ID]) ) { $Color = array("R"=>$OverrideColors[$ID]["R"],"G"=>$OverrideColors[$ID]["G"],"B"=>$OverrideColors[$ID]["B"],"Alpha"=>$OverrideColors[$ID]["Alpha"],"BorderR"=>$OverrideColors[$ID]["BorderR"],"BorderG"=>$OverrideColors[$ID]["BorderG"],"BorderB"=>$OverrideColors[$ID]["BorderB"]); } else { $Color = $this->getRandomColor(); } } - - if ( $X2 != VOID ) - { - $BarWidth = $X2 - $X1; - - if ( $Serie["Data"][$Key] == 0 ) - $this->drawLine($X1,$Y+$YOffset+$YSpace,$X1,$Y+$YOffset+$YSize-$YSpace,$Color); - else - { - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X1).",".floor($Y+$YOffset+$YSpace).",".floor($X2).",".floor($Y+$YOffset+$YSize-$YSpace),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X1+1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,$Color); - - if ( $InnerColor != NULL ) { $this->drawRectangle(min($X1,$X2)+1,$Y+$YOffset+$YSpace+1,max($X1,$X2)-1,$Y+$YOffset+$YSize-$YSpace-1,$InnerColor); } - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - if ( $Serie["Data"][$Key] >= 0 ) - $GradienColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - else - $GradienColor = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - - $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_HORIZONTAL,$GradienColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradienColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradienColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $YSpan = floor($YSize / 3); - - $this->drawGradientArea($X1,$Y+$YOffset+$YSpace,$X2,$Y+$YOffset+$YSpan-$YSpace,DIRECTION_VERTICAL,$GradienColor1); - $this->drawGradientArea($X1,$Y+$YOffset+$YSpan,$X2,$Y+$YOffset+$YSize-$YSpace,DIRECTION_VERTICAL,$GradienColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $Draw0Line ) - { - $Line0Color = array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20); - - if ( abs($X1 - $X2) > 3 ) { $Line0Width = 3; } else { $Line0Width = 1; } - if ( $X2 - $X1 < 0 ) { $Line0Width = -$Line0Width; } - - $this->drawFilledRectangle(floor($X1),$Y+$YOffset+$YSpace,floor($X1)+$Line0Width,$Y+$YOffset+$YSize-$YSpace,$Line0Color); - $this->drawLine(floor($X1),$Y+$YOffset+$YSpace,floor($X1),$Y+$YOffset+$YSize-$YSpace,$Line0Color); - } - } - - if ( $DisplayValues && $Serie["Data"][$Key] != VOID ) - { - if ( $DisplayShadow ) { $this->Shadow = TRUE; } - - $Caption = $this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtWidth = $TxtPos[1]["X"] - $TxtPos[0]["X"] + $TxtMargin; - - if ( $DisplayPos == LABEL_POS_INSIDE && abs($TxtWidth) < abs($BarWidth) ) - { - $CenterX = ($X2-$X1)/2 + $X1; - $CenterY = (($Y+$YOffset+$YSize-$YSpace)-($Y+$YOffset+$YSpace))/2 + ($Y+$YOffset+$YSpace); - - $this->drawText($CenterX,$CenterY,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize)); - } - else - { - if ( $Serie["Data"][$Key] >= 0 ) { $Align = TEXT_ALIGN_MIDDLELEFT; $Offset = $DisplayOffset; } else { $Align = TEXT_ALIGN_MIDDLERIGHT; $Offset = -$DisplayOffset; } - $this->drawText($X2+$Offset,$Y+$YOffset+$YSize/2,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>$Align,"FontSize"=>$DisplaySize)); - } - - $this->Shadow = $RestoreShadow; - } - } - $Y = $Y + $YStep; - $ID++; - } - } - $CurrentSerie++; - } - } - } - - /* Draw a bar chart */ - function drawStackedBarChart($Format=NULL) - { - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayRound = isset($Format["DisplayRound"]) ? $Format["DisplayRound"] : 0; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayFont = isset($Format["DisplayFont"]) ? $Format["DisplayFont"] : $this->FontName; - $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $Interleave = isset($Format["Interleave"]) ? $Format["Interleave"] : .5; - $Rounded = isset($Format["Rounded"]) ? $Format["Rounded"] : FALSE; - $RoundRadius = isset($Format["RoundRadius"]) ? $Format["RoundRadius"] : 4; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $Gradient = isset($Format["Gradient"]) ? $Format["Gradient"] : FALSE; - $GradientMode = isset($Format["GradientMode"]) ? $Format["GradientMode"] : GRADIENT_SIMPLE; - $GradientAlpha = isset($Format["GradientAlpha"]) ? $Format["GradientAlpha"] : 20; - $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255; - $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255; - $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255; - $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 0; - $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 0; - $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 0; - $InnerSurrounding = isset($Format["InnerSurrounding"]) ? $Format["InnerSurrounding"] : NULL; - $InnerBorderR = isset($Format["InnerBorderR"]) ? $Format["InnerBorderR"] : -1; - $InnerBorderG = isset($Format["InnerBorderG"]) ? $Format["InnerBorderG"] : -1; - $InnerBorderB = isset($Format["InnerBorderB"]) ? $Format["InnerBorderB"] : -1; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $RestoreShadow = $this->Shadow; - - $LastX = ""; $LastY = ""; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = 255; $DisplayG = 255; $DisplayB = 255; } - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - if ( $InnerSurrounding != NULL ) { $InnerBorderR = $R+$InnerSurrounding; $InnerBorderG = $G+$InnerSurrounding; $InnerBorderB = $B+$InnerSurrounding; } - if ( $InnerBorderR == -1 ) { $InnerColor = NULL; } else { $InnerColor = array("R"=>$InnerBorderR,"G"=>$InnerBorderG,"B"=>$InnerBorderB); } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - if (isset($Serie["Description"])) { $SerieDescription = $Serie["Description"]; } else { $SerieDescription = $SerieName; } - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - $Color = array("TransCorner"=>TRUE,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - $XSize = ($XStep / (1+$Interleave) ); - $XOffset = -($XSize/2); - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Height) - { - if ( $Height != VOID && $Serie["Data"][$Key] != 0 ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; } - - if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; } - if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; } - - $Y1 = $LastY[$Key][$Pos]; - $Y2 = $Y1 - $Height; - - if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $Y1 != $YZero) ) { $YSpaceUp = 1; } else { $YSpaceUp = 0; } - if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $Y1 != $YZero) ) { $YSpaceDown = 1; } else { $YSpaceDown = 0; } - - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X+$XOffset).",".floor($Y1-$YSpaceUp+$YSpaceDown).",".floor($X+$XOffset+$XSize).",".floor($Y2),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X+$XOffset,$Y1-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2,$Color); - - if ( $InnerColor != NULL ) { $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; $this->drawRectangle(min($X+$XOffset+1,$X+$XOffset+$XSize),min($Y1-$YSpaceUp+$YSpaceDown,$Y2)+1,max($X+$XOffset+1,$X+$XOffset+$XSize)-1,max($Y1-$YSpaceUp+$YSpaceDown,$Y2)-1,$InnerColor); $this->Shadow = $RestoreShadow;} - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $this->drawGradientArea($X+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+.5,DIRECTION_VERTICAL,$GradientColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $XSpan = floor($XSize / 3); - - $this->drawGradientArea($X+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSpan,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor1); - $this->drawGradientArea($X+$XSpan+$XOffset-.5,$Y1-.5-$YSpaceUp+$YSpaceDown,$X+$XOffset+$XSize,$Y2+.5,DIRECTION_HORIZONTAL,$GradientColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $DisplayValues ) - { - $BarHeight = abs($Y2-$Y1); - - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]); - - if ( $BarHeight > $TxtHeight ) - { - $XCenter = ( ($X+$XOffset+$XSize) - ($X+$XOffset) ) / 2 + $X+$XOffset; - $YCenter = ( ($Y2) - ($Y1-$YSpaceUp+$YSpaceDown) ) / 2 + $Y1-$YSpaceUp+$YSpaceDown; - - $this->drawText($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastY[$Key][$Pos] = $Y2; - } - - $X = $X + $XStep; - } - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - $YSize = $YStep / (1+$Interleave); - $YOffset = -($YSize/2); - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - foreach($PosArray as $Key => $Width) - { - if ( $Width != VOID && $Serie["Data"][$Key] != 0 ) - { - if ( $Serie["Data"][$Key] > 0 ) { $Pos = "+"; } else { $Pos = "-"; } - - if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; } - if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; } - - $X1 = $LastX[$Key][$Pos]; - $X2 = $X1 + $Width; - - if ( ($Rounded || $BorderR != -1) && ($Pos == "+" && $X1 != $YZero) ) { $XSpaceLeft = 2; } else { $XSpaceLeft = 0; } - if ( ($Rounded || $BorderR != -1) && ($Pos == "-" && $X1 != $YZero) ) { $XSpaceRight = 2; } else { $XSpaceRight = 0; } - - if ( $RecordImageMap ) { $this->addToImageMap("RECT",floor($X1+$XSpaceLeft).",".floor($Y+$YOffset).",".floor($X2-$XSpaceRight).",".floor($Y+$YOffset+$YSize),$this->toHTMLColor($R,$G,$B),$SerieDescription,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit)); } - - if ( $Rounded ) - $this->drawRoundedFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$RoundRadius,$Color); - else - { - $this->drawFilledRectangle($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,$Color); - - if ( $InnerColor != NULL ) { $RestoreShadow = $this->Shadow; $this->Shadow = FALSE; $this->drawRectangle(min($X1+$XSpaceLeft,$X2-$XSpaceRight)+1,min($Y+$YOffset,$Y+$YOffset+$YSize)+1,max($X1+$XSpaceLeft,$X2-$XSpaceRight)-1,max($Y+$YOffset,$Y+$YOffset+$YSize)-1,$InnerColor); $this->Shadow = $RestoreShadow;} - - if ( $Gradient ) - { - $this->Shadow = FALSE; - - if ( $GradientMode == GRADIENT_SIMPLE ) - { - $GradientColor = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_HORIZONTAL,$GradientColor); - } - elseif ( $GradientMode == GRADIENT_EFFECT_CAN ) - { - $GradientColor1 = array("StartR"=>$GradientEndR,"StartG"=>$GradientEndG,"StartB"=>$GradientEndB,"EndR"=>$GradientStartR,"EndG"=>$GradientStartG,"EndB"=>$GradientStartB,"Alpha"=>$GradientAlpha); - $GradientColor2 = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB,"Alpha"=>$GradientAlpha); - $YSpan = floor($YSize / 3); - - $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset,$X2-$XSpaceRight,$Y+$YOffset+$YSpan,DIRECTION_VERTICAL,$GradientColor1); - $this->drawGradientArea($X1+$XSpaceLeft,$Y+$YOffset+$YSpan,$X2-$XSpaceRight,$Y+$YOffset+$YSize,DIRECTION_VERTICAL,$GradientColor2); - } - $this->Shadow = $RestoreShadow; - } - } - - if ( $DisplayValues ) - { - $BarWidth = abs($X2-$X1); - - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]); - - if ( $BarWidth > $TxtWidth ) - { - $XCenter = ( $X2 - $X1 ) / 2 + $X1; - $YCenter = ( ($Y+$YOffset+$YSize) - ($Y+$YOffset) ) / 2 + $Y+$YOffset; - - $this->drawText($XCenter,$YCenter,$Caption,array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastX[$Key][$Pos] = $X2; - } - - $Y = $Y + $YStep; - } - } - } - } - } - - /* Draw a bar chart */ - function drawStackedAreaChart($Format=NULL) - { - $DisplayValues = isset($Format["DisplayValues"]) ? $Format["DisplayValues"] : FALSE; - $DisplayRound = isset($Format["DisplayRound"]) ? $Format["DisplayRound"] : 0; - $DisplayColor = isset($Format["DisplayColor"]) ? $Format["DisplayColor"] : DISPLAY_MANUAL; - $DisplayFont = isset($Format["DisplayFont"]) ? $Format["DisplayFont"] : $this->FontName; - $DisplaySize = isset($Format["DisplaySize"]) ? $Format["DisplaySize"] : $this->FontSize; - $DisplayR = isset($Format["DisplayR"]) ? $Format["DisplayR"] : 0; - $DisplayG = isset($Format["DisplayG"]) ? $Format["DisplayG"] : 0; - $DisplayB = isset($Format["DisplayB"]) ? $Format["DisplayB"] : 0; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : -1; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : -1; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : -1; - $ForceTransparency = isset($Format["ForceTransparency"]) ? $Format["ForceTransparency"] : NULL; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - $RestoreShadow = $this->Shadow; - - /* Determine if we only have positive or negatives values */ - $Sign["+"] = 0; $Sign["-"] = 0; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { foreach($Serie["Data"] as $Key => $Value) { if ($Value > 0) { $Sign["+"]++; } elseif ($Value < 0) { $Sign["-"]++; } } } - } - if ( $Sign["+"] == 0 || $Sign["-"] == 0 ) { $SingleWay = TRUE; } else { $SingleWay = FALSE; } - - $LastX = ""; $LastY = ""; - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; - - if ( $ForceTransparency != NULL ) { $Alpha = $ForceTransparency; } - if ( $DisplayColor == DISPLAY_AUTO ) { $DisplayR = 255; $DisplayG = 255; $DisplayB = 255; } - if ( $Surrounding != NULL ) - { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - else - { $BorderR = $R; $BorderG = $G; $BorderB = $B; } - - $AxisID = $Serie["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"]),TRUE); - $YZero = $this->scaleComputeY(0,array("AxisID"=>$Serie["Axis"])); - - $this->DataSet->Data["Series"][$SerieName]["XOffset"] = 0; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - if ( $YZero > $this->GraphAreaY2-1 ) { $YZero = $this->GraphAreaY2-1; } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB,"SkipY"=>$YZero); - - if ( $SingleWay ) { unset($Color["SkipY"]); } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $PointsTop = ""; $PointsBottom = ""; $Labels = ""; $Pos = "+"; - foreach($PosArray as $Key => $Height) - { - if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; } - if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; } - - if ( $Height != VOID && $Serie["Data"][$Key] >= 0) - { - $Y1 = $LastY[$Key][$Pos]; - $Y2 = $Y1 - $Height; - - $PointsTop[] = $X; $PointsTop[] = $Y2; - $PointsBottom[] = $X; $PointsBottom[] = $Y1; - - if ( $DisplayValues ) - { - $BarHeight = abs($Y2-$Y1); - - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]); - - if ( $BarHeight > $TxtHeight ) - { - $XCenter = $X; - $YCenter = $Y1- $BarHeight / 2; - - $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastY[$Key][$Pos] = $Y2; - } - else - { $PointsTop[] = $X; $PointsTop[] = $LastY[$Key][$Pos]; $PointsBottom[] = $X; $PointsBottom[] = $LastY[$Key][$Pos]; } - - $X = $X + $XStep; - } - $Points = $PointsTop; - for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; } - $this->drawPolygon($Points,$Color); - - /* Reset the X axis parser for the negative values pass */ - $X = $this->GraphAreaX1 + $XMargin; - - $PointsTop = ""; $PointsBottom = ""; $Pos = "-"; - foreach($PosArray as $Key => $Height) - { - if ( !isset($LastY[$Key] ) ) { $LastY[$Key] = ""; } - if ( !isset($LastY[$Key][$Pos] ) ) { $LastY[$Key][$Pos] = $YZero; } - - if ( $Height != VOID && $Serie["Data"][$Key] < 0) - { - $Y1 = $LastY[$Key][$Pos]; - $Y2 = $Y1 - $Height; - - $PointsTop[] = $X; $PointsTop[] = $Y2; - $PointsBottom[] = $X; $PointsBottom[] = $Y1; - - if ( $DisplayValues ) - { - $BarHeight = abs($Y2-$Y1); - - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtHeight = abs($TxtPos[2]["Y"] - $TxtPos[0]["Y"]); - - if ( $BarHeight > $TxtHeight ) - { - $XCenter = $X; - $YCenter = $BarHeight / 2 + $Y1; - - $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastY[$Key][$Pos] = $Y2; - } - else - { $PointsTop[] = $X; $PointsTop[] = $LastY[$Key][$Pos]; $PointsBottom[] = $X; $PointsBottom[] = $LastY[$Key][$Pos]; } - - $X = $X + $XStep; - } - $Points = $PointsTop; - for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; } - $this->drawPolygon($Points,$Color); - - if ( $DisplayValues ) { foreach($Labels as $Key => $Value) { $this->drawText($Value[0],$Value[1],$Value[2],$Value[3]);} } - } - else - { - if ( $YZero < $this->GraphAreaX1+1 ) { $YZero = $this->GraphAreaX1+1; } - if ( $YZero > $this->GraphAreaX2-1 ) { $YZero = $this->GraphAreaX2-1; } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB,"SkipX"=>$YZero); - - if ( $SingleWay ) { unset($Color["SkipX"]); } - - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $PointsTop = ""; $PointsBottom = ""; $Labels = ""; $Pos = "+"; - foreach($PosArray as $Key => $Width) - { - if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; } - if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; } - - if ( $Width != VOID && $Serie["Data"][$Key] >= 0) - { - $X1 = $LastX[$Key][$Pos]; - $X2 = $X1 + $Width; - - $PointsTop[] = $X1; $PointsTop[] = $Y; - $PointsBottom[] = $X2; $PointsBottom[] = $Y; - - if ( $DisplayValues ) - { - $BarWidth = abs($X2-$X1); - - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]); - - if ( $BarWidth > $TxtWidth ) - { - $XCenter = $X1 + $BarWidth / 2; - $YCenter = $Y; - - $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastX[$Key][$Pos] = $X2; - } - else - { $PointsTop[] = $LastX[$Key][$Pos]; $PointsTop[] = $Y; $PointsBottom[] = $LastX[$Key][$Pos]; $PointsBottom[] = $Y; } - - $Y = $Y + $YStep; - } - $Points = $PointsTop; - for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; } - $this->drawPolygon($Points,$Color); - - - /* Reset the X axis parser for the negative values pass */ - $Y = $this->GraphAreaY1 + $XMargin; - - - $PointsTop = ""; $PointsBottom = ""; $Pos = "-"; - foreach($PosArray as $Key => $Width) - { - if ( !isset($LastX[$Key] ) ) { $LastX[$Key] = ""; } - if ( !isset($LastX[$Key][$Pos] ) ) { $LastX[$Key][$Pos] = $YZero; } - - if ( $Width != VOID && $Serie["Data"][$Key] < 0) - { - $X1 = $LastX[$Key][$Pos]; - $X2 = $X1 + $Width; - - $PointsTop[] = $X1; $PointsTop[] = $Y; - $PointsBottom[] = $X2; $PointsBottom[] = $Y; - - if ( $DisplayValues ) - { - $BarWidth = abs($X2-$X1); - - $Caption = $this->scaleFormat(round($Serie["Data"][$Key],$DisplayRound),$Mode,$Format,$Unit); - $TxtPos = $this->getTextBox(0,0,$DisplayFont,$DisplaySize,0,$Caption); - $TxtWidth = abs($TxtPos[1]["X"] - $TxtPos[0]["X"]); - - if ( $BarWidth > $TxtWidth ) - { - $XCenter = $X1 - $BarWidth / 2; - $YCenter = $Y; - - $Labels[] = array($XCenter,$YCenter,$this->scaleFormat($Serie["Data"][$Key],$Mode,$Format,$Unit),array("R"=>$DisplayR,"G"=>$DisplayG,"B"=>$DisplayB,"Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontSize"=>$DisplaySize,"FontName"=>$DisplayFont)); - } - } - - $LastX[$Key][$Pos] = $X2; - } - else - { $PointsTop[] = $LastX[$Key][$Pos]; $PointsTop[] = $Y; $PointsBottom[] = $LastX[$Key][$Pos]; $PointsBottom[] = $Y; } - - $Y = $Y + $YStep; - } - $Points = $PointsTop; - for($i=count($PointsBottom)-2;$i>=0;$i-=2) { $Points[] = $PointsBottom[$i]; $Points[] = $PointsBottom[$i+1]; } - $this->drawPolygon($Points,$Color); - - if ( $DisplayValues ) { foreach($Labels as $Key => $Value) { $this->drawText($Value[0],$Value[1],$Value[2],$Value[3]);} } - } - } - } - } - - /* Returns a random color */ - function getRandomColor($Alpha=100) - { return(array("R"=>rand(0,255),"G"=>rand(0,255),"B"=>rand(0,255),"Alpha"=>$Alpha)); } - - /* Validate a palette */ - function validatePalette($Colors,$Surrounding=NULL) - { - $Result = ""; - - if ( !is_array($Colors) ) { return($this->getRandomColor()); } - - foreach($Colors as $Key => $Values) - { - if ( isset($Values["R"]) ) { $Result[$Key]["R"] = $Values["R"]; } else { $Result[$Key]["R"] = rand(0,255); } - if ( isset($Values["G"]) ) { $Result[$Key]["G"] = $Values["G"]; } else { $Result[$Key]["G"] = rand(0,255); } - if ( isset($Values["B"]) ) { $Result[$Key]["B"] = $Values["B"]; } else { $Result[$Key]["B"] = rand(0,255); } - if ( isset($Values["Alpha"]) ) { $Result[$Key]["Alpha"] = $Values["Alpha"]; } else { $Result[$Key]["Alpha"] = 100; } - - if ( $Surrounding != NULL ) - { - $Result[$Key]["BorderR"] = $Result[$Key]["R"] + $Surrounding; - $Result[$Key]["BorderG"] = $Result[$Key]["G"] + $Surrounding; - $Result[$Key]["BorderB"] = $Result[$Key]["B"] + $Surrounding; - } - else - { - if ( isset($Values["BorderR"]) ) { $Result[$Key]["BorderR"] = $Values["BorderR"]; } else { $Result[$Key]["BorderR"] = $Result[$Key]["R"]; } - if ( isset($Values["BorderG"]) ) { $Result[$Key]["BorderG"] = $Values["BorderG"]; } else { $Result[$Key]["BorderG"] = $Result[$Key]["G"]; } - if ( isset($Values["BorderB"]) ) { $Result[$Key]["BorderB"] = $Values["BorderB"]; } else { $Result[$Key]["BorderB"] = $Result[$Key]["B"]; } - if ( isset($Values["BorderAlpha"]) ) { $Result[$Key]["BorderAlpha"] = $Values["BorderAlpha"]; } else { $Result[$Key]["BorderAlpha"] = $Result[$Key]["Alpha"]; } - } - } - - return($Result); - } - - /* Draw the derivative chart associated to the data series */ - function drawDerivative($Format=NULL) - { - $Offset = isset($Format["Offset"]) ? $Format["Offset"] : 10; - $SerieSpacing = isset($Format["SerieSpacing"]) ? $Format["SerieSpacing"] : 3; - $DerivativeHeight = isset($Format["DerivativeHeight"]) ? $Format["DerivativeHeight"] : 4; - $ShadedSlopeBox = isset($Format["ShadedSlopeBox"]) ? $Format["ShadedSlopeBox"] : FALSE; - $DrawBackground = isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE; - $BackgroundR = isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255; - $BackgroundG = isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255; - $BackgroundB = isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255; - $BackgroundAlpha = isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 20; - $DrawBorder = isset($Format["DrawBorder"]) ? $Format["DrawBorder"] : TRUE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 0; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 0; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 0; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 100; - $Caption = isset($Format["Caption"]) ? $Format["Caption"] : TRUE; - $CaptionHeight = isset($Format["CaptionHeight"]) ? $Format["CaptionHeight"] : 10; - $CaptionWidth = isset($Format["CaptionWidth"]) ? $Format["CaptionWidth"] : 20; - $CaptionMargin = isset($Format["CaptionMargin"]) ? $Format["CaptionMargin"] : 4; - $CaptionLine = isset($Format["CaptionLine"]) ? $Format["CaptionLine"] : FALSE; - $CaptionBox = isset($Format["CaptionBox"]) ? $Format["CaptionBox"] : FALSE; - $CaptionBorderR = isset($Format["CaptionBorderR"]) ? $Format["CaptionBorderR"] : 0; - $CaptionBorderG = isset($Format["CaptionBorderG"]) ? $Format["CaptionBorderG"] : 0; - $CaptionBorderB = isset($Format["CaptionBorderB"]) ? $Format["CaptionBorderB"] : 0; - $CaptionFillR = isset($Format["CaptionFillR"]) ? $Format["CaptionFillR"] : 255; - $CaptionFillG = isset($Format["CaptionFillG"]) ? $Format["CaptionFillG"] : 255; - $CaptionFillB = isset($Format["CaptionFillB"]) ? $Format["CaptionFillB"] : 255; - $CaptionFillAlpha = isset($Format["CaptionFillAlpha"]) ? $Format["CaptionFillAlpha"] : 80; - $PositiveSlopeStartR = isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 184; - $PositiveSlopeStartG = isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 234; - $PositiveSlopeStartB = isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 88; - $PositiveSlopeEndR = isset($Format["PositiveSlopeStartR"]) ? $Format["PositiveSlopeStartR"] : 239; - $PositiveSlopeEndG = isset($Format["PositiveSlopeStartG"]) ? $Format["PositiveSlopeStartG"] : 31; - $PositiveSlopeEndB = isset($Format["PositiveSlopeStartB"]) ? $Format["PositiveSlopeStartB"] : 36; - $NegativeSlopeStartR = isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 184; - $NegativeSlopeStartG = isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 234; - $NegativeSlopeStartB = isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 88; - $NegativeSlopeEndR = isset($Format["NegativeSlopeStartR"]) ? $Format["NegativeSlopeStartR"] : 67; - $NegativeSlopeEndG = isset($Format["NegativeSlopeStartG"]) ? $Format["NegativeSlopeStartG"] : 124; - $NegativeSlopeEndB = isset($Format["NegativeSlopeStartB"]) ? $Format["NegativeSlopeStartB"] : 227; - - $Data = $this->DataSet->getData(); - - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - $YPos = $this->DataSet->Data["GraphArea"]["Y2"] + $Offset; - else - $XPos = $this->DataSet->Data["GraphArea"]["X2"] + $Offset; - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; $Alpha = $Serie["Color"]["Alpha"]; $Ticks = $Serie["Ticks"]; $Weight = $Serie["Weight"]; - - $AxisID = $Serie["Axis"]; - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $Caption ) - { - if ( $CaptionLine ) - { - $StartX = floor($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin); - $EndX = floor($this->GraphAreaX1-$CaptionMargin+$XMargin); - - $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight); - if ( $CaptionBox ) { $this->drawFilledRectangle($StartX,$YPos,$EndX,$YPos+$CaptionHeight,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); } - $this->drawLine($StartX+2,$YPos+($CaptionHeight/2),$EndX-2,$YPos+($CaptionHeight/2),$CaptionSettings); - } - else - $this->drawFilledRectangle($this->GraphAreaX1-$CaptionWidth+$XMargin-$CaptionMargin,$YPos,$this->GraphAreaX1-$CaptionMargin+$XMargin,$YPos+$CaptionHeight,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB)); - } - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - $TopY = $YPos + ($CaptionHeight/2) - ($DerivativeHeight/2); - $BottomY = $YPos + ($CaptionHeight/2) + ($DerivativeHeight/2); - - $StartX = floor($this->GraphAreaX1+$XMargin); - $EndX = floor($this->GraphAreaX2-$XMargin); - - if ( $DrawBackground ) { $this->drawFilledRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); } - if ( $DrawBorder ) { $this->drawRectangle($StartX-1,$TopY-1,$EndX+1,$BottomY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $RestoreShadow = $this->Shadow; - $this->Shadow = FALSE; - - /* Determine the Max slope index */ - $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1; - foreach($PosArray as $Key => $Y) - { - if ( $Y != VOID && $LastX != NULL ) - { $Slope = ($LastY - $Y); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } } - - if ( $Y == VOID ) - { $LastX = NULL; $LastY = NULL; } - else - { $LastX = $X; $LastY = $Y; } - } - - $LastX = NULL; $LastY = NULL; $LastColor = NULL; - foreach($PosArray as $Key => $Y) - { - if ( $Y != VOID && $LastY != NULL ) - { - $Slope = ($LastY - $Y); - - if ( $Slope >= 0 ) - { - $SlopeIndex = (100 / $MaxSlope) * $Slope; - $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR; - $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG; - $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB; - } - elseif ( $Slope < 0 ) - { - $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope); - $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR; - $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG; - $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB; - } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B); - - if ( $ShadedSlopeBox && $LastColor != NULL ) // && $Slope != 0 - { - $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B); - $this->drawGradientArea($LastX,$TopY,$X,$BottomY,DIRECTION_HORIZONTAL,$GradientSettings); - } - elseif ( !$ShadedSlopeBox || $LastColor == NULL ) // || $Slope == 0 - $this->drawFilledRectangle(floor($LastX),$TopY,floor($X),$BottomY,$Color); - - $LastColor = $Color; - } - - if ( $Y == VOID ) - { $LastY = NULL; } - else - { $LastX = $X; $LastY = $Y; } - - $X = $X + $XStep; - } - - $YPos = $YPos + $CaptionHeight + $SerieSpacing; - } - else - { - if ( $Caption ) - { - $StartY = floor($this->GraphAreaY1-$CaptionWidth+$XMargin-$CaptionMargin); - $EndY = floor($this->GraphAreaY1-$CaptionMargin+$XMargin); - if ( $CaptionLine ) - { - $CaptionSettings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks,"Weight"=>$Weight); - if ( $CaptionBox ) { $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$CaptionFillR,"G"=>$CaptionFillG,"B"=>$CaptionFillB,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB,"Alpha"=>$CaptionFillAlpha)); } - $this->drawLine($XPos+($CaptionHeight/2),$StartY+2,$XPos+($CaptionHeight/2),$EndY-2,$CaptionSettings); - } - else - $this->drawFilledRectangle($XPos,$StartY,$XPos+$CaptionHeight,$EndY,array("R"=>$R,"G"=>$G,"B"=>$B,"BorderR"=>$CaptionBorderR,"BorderG"=>$CaptionBorderG,"BorderB"=>$CaptionBorderB)); - } - - - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - $TopX = $XPos + ($CaptionHeight/2) - ($DerivativeHeight/2); - $BottomX = $XPos + ($CaptionHeight/2) + ($DerivativeHeight/2); - - $StartY = floor($this->GraphAreaY1+$XMargin); - $EndY = floor($this->GraphAreaY2-$XMargin); - - if ( $DrawBackground ) { $this->drawFilledRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha)); } - if ( $DrawBorder ) { $this->drawRectangle($TopX-1,$StartY-1,$BottomX+1,$EndY+1,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - - $RestoreShadow = $this->Shadow; - $this->Shadow = FALSE; - - /* Determine the Max slope index */ - $LastX = NULL; $LastY = NULL; $MinSlope = 0; $MaxSlope = 1; - foreach($PosArray as $Key => $X) - { - if ( $X != VOID && $LastX != NULL ) - { $Slope = ($X - $LastX); if ( $Slope > $MaxSlope ) { $MaxSlope = $Slope; } if ( $Slope < $MinSlope ) { $MinSlope = $Slope; } } - - if ( $X == VOID ) - { $LastX = NULL; } - else - { $LastX = $X; } - } - - $LastX = NULL; $LastY = NULL; $LastColor = NULL; - foreach($PosArray as $Key => $X) - { - if ( $X != VOID && $LastX != NULL ) - { - $Slope = ($X - $LastX); - - if ( $Slope >= 0 ) - { - $SlopeIndex = (100 / $MaxSlope) * $Slope; - $R = (($PositiveSlopeEndR - $PositiveSlopeStartR)/100)*$SlopeIndex+$PositiveSlopeStartR; - $G = (($PositiveSlopeEndG - $PositiveSlopeStartG)/100)*$SlopeIndex+$PositiveSlopeStartG; - $B = (($PositiveSlopeEndB - $PositiveSlopeStartB)/100)*$SlopeIndex+$PositiveSlopeStartB; - } - elseif ( $Slope < 0 ) - { - $SlopeIndex = (100 / abs($MinSlope)) * abs($Slope); - $R = (($NegativeSlopeEndR - $NegativeSlopeStartR)/100)*$SlopeIndex+$NegativeSlopeStartR; - $G = (($NegativeSlopeEndG - $NegativeSlopeStartG)/100)*$SlopeIndex+$NegativeSlopeStartG; - $B = (($NegativeSlopeEndB - $NegativeSlopeStartB)/100)*$SlopeIndex+$NegativeSlopeStartB; - } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B); - - if ( $ShadedSlopeBox && $LastColor != NULL ) - { - $GradientSettings = array("StartR"=>$LastColor["R"],"StartG"=>$LastColor["G"],"StartB"=>$LastColor["B"],"EndR"=>$R,"EndG"=>$G,"EndB"=>$B); - - $this->drawGradientArea($TopX,$LastY,$BottomX,$Y,DIRECTION_VERTICAL,$GradientSettings); - } - elseif ( !$ShadedSlopeBox || $LastColor == NULL ) - $this->drawFilledRectangle($TopX,floor($LastY),$BottomX,floor($Y),$Color); - - $LastColor = $Color; - } - - if ( $X == VOID ) - { $LastX = NULL; } - else - { $LastX = $X; $LastY = $Y; } - - $Y = $Y + $XStep; - } - - $XPos = $XPos + $CaptionHeight + $SerieSpacing; - } - - $this->Shadow = $RestoreShadow; - } - } - } - - /* Draw the line of best fit */ - function drawBestFit($Format="") - { - $OverrideTicks = isset($Format["Ticks"]) ? $Format["Ticks"] : NULL; - $OverrideR = isset($Format["R"]) ? $Format["R"] : VOID; - $OverrideG = isset($Format["G"]) ? $Format["G"] : VOID; - $OverrideB = isset($Format["B"]) ? $Format["B"] : VOID; - $OverrideAlpha = isset($Format["Alpha"]) ? $Format["Alpha"] : VOID; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - foreach($Data["Series"] as $SerieName => $Serie) - { - if ( $Serie["isDrawable"] == TRUE && $SerieName != $Data["Abscissa"] ) - { - if ( $OverrideR != VOID && $OverrideG != VOID && $OverrideB != VOID ) { $R = $OverrideR; $G = $OverrideG; $B = $OverrideB; } else { $R = $Serie["Color"]["R"]; $G = $Serie["Color"]["G"]; $B = $Serie["Color"]["B"]; } - if ( $OverrideTicks == NULL ) { $Ticks = $Serie["Ticks"]; } else { $Ticks = $OverrideTicks; } - if ( $OverrideAlpha == VOID ) { $Alpha = $Serie["Color"]["Alpha"]; } else { $Alpha = $OverrideAlpha; } - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks); - - $AxisID = $Serie["Axis"]; - $PosArray = $this->scaleComputeY($Serie["Data"],array("AxisID"=>$Serie["Axis"])); - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0; - foreach($PosArray as $Key => $Y) - { - $Sxy = $Sxy + $X*$Y; - $Sx = $Sx + $X; - $Sy = $Sy + $Y; - $Sxx = $Sxx + $X*$X; - - $X = $X + $XStep; - } - $n = count($PosArray); - $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx)); - $B = (($Sy)-($M*$Sx))/($n); - - $X1 = $this->GraphAreaX1 + $XMargin; - $Y1 = $M * $X1 + $B; - $X2 = $this->GraphAreaX2 - $XMargin; - $Y2 = $M * $X2 + $B; - - if ( $Y1 < $this->GraphAreaY1 ) { $X1 = $X1 + ($this->GraphAreaY1-$Y1); $Y1 = $this->GraphAreaY1; } - if ( $Y1 > $this->GraphAreaY2 ) { $X1 = $X1 + ($Y1-$this->GraphAreaY2); $Y1 = $this->GraphAreaY2; } - if ( $Y2 < $this->GraphAreaY1 ) { $X2 = $X2 - ($this->GraphAreaY1-$Y2); $Y2 = $this->GraphAreaY1; } - if ( $Y2 > $this->GraphAreaY2 ) { $X2 = $X2 - ($Y2-$this->GraphAreaY2); $Y2 = $this->GraphAreaY2; } - - $this->drawLine($X1,$Y1,$X2,$Y2,$Color); - } - else - { - if ( $XDivs == 0 ) { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $YStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin; - - if ( !is_array($PosArray) ) { $Value = $PosArray; $PosArray = ""; $PosArray[0] = $Value; } - $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0; - foreach($PosArray as $Key => $X) - { - $Sxy = $Sxy + $X*$Y; - $Sx = $Sx + $Y; - $Sy = $Sy + $X; - $Sxx = $Sxx + $Y*$Y; - - $Y = $Y + $YStep; - } - $n = count($PosArray); - $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx)); - $B = (($Sy)-($M*$Sx))/($n); - - $Y1 = $this->GraphAreaY1 + $XMargin; - $X1 = $M * $Y1 + $B; - $Y2 = $this->GraphAreaY2 - $XMargin; - $X2 = $M * $Y2 + $B; - - if ( $X1 < $this->GraphAreaX1 ) { $Y1 = $Y1 + ($this->GraphAreaX1-$X1); $X1 = $this->GraphAreaX1; } - if ( $X1 > $this->GraphAreaX2 ) { $Y1 = $Y1 + ($X1-$this->GraphAreaX2); $X1 = $this->GraphAreaX2; } - if ( $X2 < $this->GraphAreaX1 ) { $Y2 = $Y2 - ($this->GraphAreaY1-$X2); $X2 = $this->GraphAreaX1; } - if ( $X2 > $this->GraphAreaX2 ) { $Y2 = $Y2 - ($X2-$this->GraphAreaX2); $X2 = $this->GraphAreaX2; } - - $this->drawLine($X1,$Y1,$X2,$Y2,$Color); - } - } - } - } - - /* Write labels */ - function writeLabel($SeriesName,$Indexes,$Format="") - { - $OverrideTitle = isset($Format["OverrideTitle"]) ? $Format["OverrideTitle"] : NULL; - $ForceLabels = isset($Format["ForceLabels"]) ? $Format["ForceLabels"] : NULL; - $DrawPoint = isset($Format["DrawPoint"]) ? $Format["DrawPoint"] : LABEL_POINT_BOX; - $DrawVerticalLine = isset($Format["DrawVerticalLine"]) ? $Format["DrawVerticalLine"] : FALSE; - $VerticalLineR = isset($Format["VerticalLineR"]) ? $Format["VerticalLineR"] : 0; - $VerticalLineG = isset($Format["VerticalLineG"]) ? $Format["VerticalLineG"] : 0; - $VerticalLineB = isset($Format["VerticalLineB"]) ? $Format["VerticalLineB"] : 0; - $VerticalLineAlpha = isset($Format["VerticalLineAlpha"]) ? $Format["VerticalLineAlpha"] : 40; - $VerticalLineTicks = isset($Format["VerticalLineTicks"]) ? $Format["VerticalLineTicks"] : 2; - - $Data = $this->DataSet->getData(); - list($XMargin,$XDivs) = $this->scaleGetXSettings(); - - if ( !is_array($Indexes) ) { $Index = $Indexes; $Indexes = ""; $Indexes[] = $Index; } - if ( !is_array($SeriesName) ) { $SerieName = $SeriesName; $SeriesName = ""; $SeriesName[] = $SerieName; } - if ( $ForceLabels != NULL && !is_array($ForceLabels) ) { $ForceLabel = $ForceLabels; $ForceLabels = ""; $ForceLabels[] = $ForceLabel; } - - foreach ($Indexes as $Key => $Index) - { - $Series = ""; - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1)/4; } else { $XStep = ($this->GraphAreaX2-$this->GraphAreaX1-$XMargin*2)/$XDivs; } - $X = $this->GraphAreaX1 + $XMargin + $Index * $XStep; - - if ( $DrawVerticalLine ) { $this->drawLine($X,$this->GraphAreaY1+$Data["YMargin"],$X,$this->GraphAreaY2-$Data["YMargin"],array("R"=>$VerticalLineR,"G"=>$VerticalLineG,"B"=>$VerticalLineB,"Alpha"=>$VerticalLineAlpha,"Ticks"=>$VerticalLineTicks)); } - - $MinY = $this->GraphAreaY2; - foreach ($SeriesName as $iKey => $SerieName) - { - if ( isset($Data["Series"][$SerieName]["Data"][$Index]) ) - { - $AxisID = $Data["Series"][$SerieName]["Axis"]; - - if ( $OverrideTitle != NULL) - $Description = $OverrideTitle; - elseif ( count($SeriesName) == 1 ) - { - if ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $Description = $Data["Series"][$SerieName]["Description"]." - ".$Data["Series"][$Data["Abscissa"]]["Data"][$Index]; - else - $Description = $Data["Series"][$SerieName]["Description"]; - } - elseif ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $Description = $Data["Series"][$Data["Abscissa"]]["Data"][$Index]; - - $AxisMode = $Data["Axis"][$AxisID]["Display"]; - $AxisFormat = $Data["Axis"][$AxisID]["Format"]; - $AxisUnit = $Data["Axis"][$AxisID]["Unit"]; - - $Serie = ""; - $Serie["R"] = $Data["Series"][$SerieName]["Color"]["R"]; - $Serie["G"] = $Data["Series"][$SerieName]["Color"]["G"]; - $Serie["B"] = $Data["Series"][$SerieName]["Color"]["B"]; - $Serie["Alpha"] = $Data["Series"][$SerieName]["Color"]["Alpha"]; - - if ( count($SeriesName) == 1 && isset($Data["Series"][$SerieName]["XOffset"]) ) - $SerieOffset = $Data["Series"][$SerieName]["XOffset"]; - else - $SerieOffset = 0; - - $Value = $Data["Series"][$SerieName]["Data"][$Index]; - if ( $ForceLabels != NULL ) - $Caption = isset($ForceLabels[$Key]) ? $ForceLabels[$Key] : "Not set"; - else - $Caption = $this->scaleFormat($Value,$AxisMode,$AxisFormat,$AxisUnit); - - $X = floor($this->GraphAreaX1 + $XMargin + $Index * $XStep + $SerieOffset); - $Y = floor($this->scaleComputeY($Value,array("AxisID"=>$AxisID))); - - if ($Y < $MinY) { $MinY = $Y; } - - if ( $DrawPoint == LABEL_POINT_CIRCLE ) - $this->drawFilledCircle($X,$Y,3,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - elseif ( $DrawPoint == LABEL_POINT_BOX ) - $this->drawFilledRectangle($X-2,$Y-2,$X+2,$Y+2,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - - $Series[] = array("Format"=>$Serie,"Caption"=>$Caption); - } - } - $this->drawLabelBox($X,$MinY-3,$Description,$Series,$Format); - - } - else - { - if ( $XDivs == 0 ) { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1)/4; } else { $XStep = ($this->GraphAreaY2-$this->GraphAreaY1-$XMargin*2)/$XDivs; } - $Y = $this->GraphAreaY1 + $XMargin + $Index * $XStep; - - if ( $DrawVerticalLine ) { $this->drawLine($this->GraphAreaX1+$Data["YMargin"],$Y,$this->GraphAreaX2-$Data["YMargin"],$Y,array("R"=>$VerticalLineR,"G"=>$VerticalLineG,"B"=>$VerticalLineB,"Alpha"=>$VerticalLineAlpha,"Ticks"=>$VerticalLineTicks)); } - - $MinX = $this->GraphAreaX2; - foreach ($SeriesName as $Key => $SerieName) - { - if ( isset($Data["Series"][$SerieName]["Data"][$Index]) ) - { - $AxisID = $Data["Series"][$SerieName]["Axis"]; - - if ( $OverrideTitle != NULL) - $Description = $OverrideTitle; - elseif ( count($SeriesName) == 1 ) - { - if ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $Description = $Data["Series"][$SerieName]["Description"]." - ".$Data["Series"][$Data["Abscissa"]]["Data"][$Index]; - else - $Description = $Data["Series"][$SerieName]["Description"]; - } - elseif ( isset($Data["Abscissa"]) && isset($Data["Series"][$Data["Abscissa"]]["Data"][$Index]) ) - $Description = $Data["Series"][$Data["Abscissa"]]["Data"][$Index]; - - $AxisMode = $Data["Axis"][$AxisID]["Display"]; - $AxisFormat = $Data["Axis"][$AxisID]["Format"]; - $AxisUnit = $Data["Axis"][$AxisID]["Unit"]; - - $Serie = ""; - if ( isset($Data["Extended"]["Palette"][$Index] ) ) - { - $Serie["R"] = $Data["Extended"]["Palette"][$Index]["R"]; - $Serie["G"] = $Data["Extended"]["Palette"][$Index]["G"]; - $Serie["B"] = $Data["Extended"]["Palette"][$Index]["B"]; - $Serie["Alpha"] = $Data["Extended"]["Palette"][$Index]["Alpha"]; - } - else - { - $Serie["R"] = $Data["Series"][$SerieName]["Color"]["R"]; - $Serie["G"] = $Data["Series"][$SerieName]["Color"]["G"]; - $Serie["B"] = $Data["Series"][$SerieName]["Color"]["B"]; - $Serie["Alpha"] = $Data["Series"][$SerieName]["Color"]["Alpha"]; - } - - if ( count($SeriesName) == 1 && isset($Data["Series"][$SerieName]["XOffset"]) ) - $SerieOffset = $Data["Series"][$SerieName]["XOffset"]; - else - $SerieOffset = 0; - - $Value = $Data["Series"][$SerieName]["Data"][$Index]; - if ( $ForceLabels != NULL ) - $Caption = isset($ForceLabels[$Key]) ? $ForceLabels[$Key] : "Not set"; - else - $Caption = $this->scaleFormat($Value,$AxisMode,$AxisFormat,$AxisUnit); - - $X = floor($this->scaleComputeY($Value,array("AxisID"=>$AxisID))); - $Y = floor($this->GraphAreaY1 + $XMargin + $Index * $XStep + $SerieOffset); - - if ($X < $MinX) { $MinX = $X; } - - if ( $DrawPoint == LABEL_POINT_CIRCLE ) - $this->drawFilledCircle($X,$Y,3,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - elseif ( $DrawPoint == LABEL_POINT_BOX ) - $this->drawFilledRectangle($X-2,$Y-2,$X+2,$Y+2,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - - $Series[] = array("Format"=>$Serie,"Caption"=>$Caption); - } - } - $this->drawLabelBox($MinX,$Y-3,$Description,$Series,$Format); - - } - } - } - - /* Draw a label box */ - function drawLabelBox($X,$Y,$Title,$Captions,$Format="") - { - $NoTitle = isset($Format["NoTitle"]) ? $Format["NoTitle"] : NULL; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 50; - $DrawSerieColor = isset($Format["DrawSerieColor"]) ? $Format["DrawSerieColor"] : TRUE; - $SerieR = isset($Format["SerieR"]) ? $Format["SerieR"] : NULL; - $SerieG = isset($Format["SerieG"]) ? $Format["SerieG"] : NULL; - $SerieB = isset($Format["SerieB"]) ? $Format["SerieB"] : NULL; - $SerieAlpha = isset($Format["SerieAlpha"]) ? $Format["SerieAlpha"] : NULL; - $SerieBoxSize = isset($Format["SerieBoxSize"]) ? $Format["SerieBoxSize"] : 6; - $SerieBoxSpacing = isset($Format["SerieBoxSpacing"]) ? $Format["SerieBoxSpacing"] : 4; - $VerticalMargin = isset($Format["VerticalMargin"]) ? $Format["VerticalMargin"] : 10; - $HorizontalMargin = isset($Format["HorizontalMargin"]) ? $Format["HorizontalMargin"] : 8; - $R = isset($Format["R"]) ? $Format["R"] : $this->FontColorR; - $G = isset($Format["G"]) ? $Format["G"] : $this->FontColorG; - $B = isset($Format["B"]) ? $Format["B"] : $this->FontColorB; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $this->FontColorA; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->FontSize; - $TitleMode = isset($Format["TitleMode"]) ? $Format["TitleMode"] : LABEL_TITLE_NOBACKGROUND; - $TitleR = isset($Format["TitleR"]) ? $Format["TitleR"] : $R; - $TitleG = isset($Format["TitleG"]) ? $Format["TitleG"] : $G; - $TitleB = isset($Format["TitleB"]) ? $Format["TitleB"] : $B; - $TitleBackgroundR = isset($Format["TitleBackgroundR"]) ? $Format["TitleBackgroundR"] : 0; - $TitleBackgroundG = isset($Format["TitleBackgroundG"]) ? $Format["TitleBackgroundG"] : 0; - $TitleBackgroundB = isset($Format["TitleBackgroundB"]) ? $Format["TitleBackgroundB"] : 0; - $GradientStartR = isset($Format["GradientStartR"]) ? $Format["GradientStartR"] : 255; - $GradientStartG = isset($Format["GradientStartG"]) ? $Format["GradientStartG"] : 255; - $GradientStartB = isset($Format["GradientStartB"]) ? $Format["GradientStartB"] : 255; - $GradientEndR = isset($Format["GradientEndR"]) ? $Format["GradientEndR"] : 220; - $GradientEndG = isset($Format["GradientEndG"]) ? $Format["GradientEndG"] : 220; - $GradientEndB = isset($Format["GradientEndB"]) ? $Format["GradientEndB"] : 220; - - if ( !$DrawSerieColor ) { $SerieBoxSize = 0; $SerieBoxSpacing = 0; } - - $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,0,$Title); - $TitleWidth = ($TxtPos[1]["X"] - $TxtPos[0]["X"])+$VerticalMargin*2; - $TitleHeight = ($TxtPos[0]["Y"] - $TxtPos[2]["Y"]); - - if ( $NoTitle ) { $TitleWidth = 0; $TitleHeight = 0; } - - $CaptionWidth = 0; $CaptionHeight = -$HorizontalMargin; - foreach($Captions as $Key =>$Caption) - { - $TxtPos = $this->getTextBox($X,$Y,$FontName,$FontSize,0,$Caption["Caption"]); - $CaptionWidth = max($CaptionWidth,($TxtPos[1]["X"] - $TxtPos[0]["X"])+$VerticalMargin*2); - $CaptionHeight = $CaptionHeight + max(($TxtPos[0]["Y"] - $TxtPos[2]["Y"]),($SerieBoxSize+2)) + $HorizontalMargin; - } - - if ( $CaptionHeight <= 5 ) { $CaptionHeight = $CaptionHeight + $HorizontalMargin/2; } - - if ( $DrawSerieColor ) { $CaptionWidth = $CaptionWidth + $SerieBoxSize + $SerieBoxSpacing; } - - $BoxWidth = max($BoxWidth,$TitleWidth,$CaptionWidth); - - $XMin = $X - 5 - floor(($BoxWidth-10) / 2); - $XMax = $X + 5 + floor(($BoxWidth-10) / 2); - - $RestoreShadow = $this->Shadow; - if ( $this->Shadow == TRUE ) - { - $this->Shadow = FALSE; - - $Poly = ""; - $Poly[] = $X+$this->ShadowX; $Poly[] = $Y+$this->ShadowX; - $Poly[] = $X+5+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - $Poly[] = $XMax+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - - if ( $NoTitle ) - { - $Poly[] = $XMax+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2+$this->ShadowX; - $Poly[] = $XMin+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2+$this->ShadowX; - } - else - { - $Poly[] = $XMax+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3+$this->ShadowX; - $Poly[] = $XMin+$this->ShadowX; $Poly[] = $Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3+$this->ShadowX; - } - - $Poly[] = $XMin+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - $Poly[] = $X-5+$this->ShadowX; $Poly[] = $Y-5+$this->ShadowX; - $this->drawPolygon($Poly,array("R"=>$this->ShadowR,"G"=>$this->ShadowG,"B"=>$this->ShadowB,"Alpha"=>$this->Shadowa)); - } - - /* Draw the background */ - $GradientSettings = array("StartR"=>$GradientStartR,"StartG"=>$GradientStartG,"StartB"=>$GradientStartB,"EndR"=>$GradientEndR,"EndG"=>$GradientEndG,"EndB"=>$GradientEndB); - if ( $NoTitle ) - $this->drawGradientArea($XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax,$Y-6,DIRECTION_VERTICAL,$GradientSettings); - else - $this->drawGradientArea($XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-6,DIRECTION_VERTICAL,$GradientSettings); - $Poly = ""; $Poly[] = $X; $Poly[] = $Y; $Poly[] = $X-5; $Poly[] = $Y-5; $Poly[] = $X+5; $Poly[] = $Y-5; - $this->drawPolygon($Poly,array("R"=>$GradientEndR,"G"=>$GradientEndG,"B"=>$GradientEndB,"NoBorder"=>TRUE)); - - /* Outer border */ - $OuterBorderColor = $this->allocateColor($this->Picture,100,100,100,100); - imageline($this->Picture,$XMin,$Y-5,$X-5,$Y-5,$OuterBorderColor); - imageline($this->Picture,$X,$Y,$X-5,$Y-5,$OuterBorderColor); - imageline($this->Picture,$X,$Y,$X+5,$Y-5,$OuterBorderColor); - imageline($this->Picture,$X+5,$Y-5,$XMax,$Y-5,$OuterBorderColor); - if ( $NoTitle ) - { - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMin,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$OuterBorderColor); - } - else - { - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMin,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-5,$OuterBorderColor); - imageline($this->Picture,$XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$OuterBorderColor); - } - - /* Inner border */ - $InnerBorderColor = $this->allocateColor($this->Picture,255,255,255,100); - imageline($this->Picture,$XMin+1,$Y-6,$X-5,$Y-6,$InnerBorderColor); - imageline($this->Picture,$X,$Y-1,$X-5,$Y-6,$InnerBorderColor); - imageline($this->Picture,$X,$Y-1,$X+5,$Y-6,$InnerBorderColor); - imageline($this->Picture,$X+5,$Y-6,$XMax-1,$Y-6,$InnerBorderColor); - if ( $NoTitle ) - { - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMin+1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax-1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*2,$InnerBorderColor); - } - else - { - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMin+1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax-1,$Y-6,$InnerBorderColor); - imageline($this->Picture,$XMin+1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax-1,$Y-4-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$InnerBorderColor); - } - - /* Draw the separator line */ - if ( $TitleMode == LABEL_TITLE_NOBACKGROUND && !$NoTitle ) - { - $YPos = $Y-7-$CaptionHeight-$HorizontalMargin-$HorizontalMargin/2; - $XMargin = $VerticalMargin / 2; - $this->drawLine($XMin+$XMargin,$YPos+1,$XMax-$XMargin,$YPos+1,array("R"=>$GradientEndR,"G"=>$GradientEndG,"B"=>$GradientEndB)); - $this->drawLine($XMin+$XMargin,$YPos,$XMax-$XMargin,$YPos,array("R"=>$GradientStartR,"G"=>$GradientStartG,"B"=>$GradientStartB)); - } - elseif ( $TitleMode == LABEL_TITLE_BACKGROUND ) - { - $this->drawFilledRectangle($XMin,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin*3,$XMax,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin+$HorizontalMargin/2,array("R"=>$TitleBackgroundR,"G"=>$TitleBackgroundG,"B"=>$TitleBackgroundB)); - imageline($this->Picture,$XMin+1,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin+$HorizontalMargin/2+1,$XMax-1,$Y-5-$TitleHeight-$CaptionHeight-$HorizontalMargin+$HorizontalMargin/2+1,$InnerBorderColor); - } - - /* Write the description */ - if ( !$NoTitle ) - $this->drawText($XMin+$VerticalMargin,$Y-7-$CaptionHeight-$HorizontalMargin*2,$Title,array("Align"=>TEXT_ALIGN_BOTTOMLEFT,"R"=>$TitleR,"G"=>$TitleG,"B"=>$TitleB)); - - /* Write the value */ - $YPos = $Y-5-$HorizontalMargin; $XPos = $XMin+$VerticalMargin+$SerieBoxSize+$SerieBoxSpacing; - foreach($Captions as $Key => $Caption) - { - $CaptionTxt = $Caption["Caption"]; - $TxtPos = $this->getTextBox($XPos,$YPos,$FontName,$FontSize,0,$CaptionTxt); - $CaptionHeight = ($TxtPos[0]["Y"] - $TxtPos[2]["Y"]); - - /* Write the serie color if needed */ - if ( $DrawSerieColor ) - { - $BoxSettings = array("R"=>$Caption["Format"]["R"],"G"=>$Caption["Format"]["G"],"B"=>$Caption["Format"]["B"],"Alpha"=>$Caption["Format"]["Alpha"],"BorderR"=>0,"BorderG"=>0,"BorderB"=>0); - $this->drawFilledRectangle($XMin+$VerticalMargin,$YPos-$SerieBoxSize,$XMin+$VerticalMargin+$SerieBoxSize,$YPos,$BoxSettings); - } - - $this->drawText($XPos,$YPos,$CaptionTxt,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); - - $YPos = $YPos - $CaptionHeight - $HorizontalMargin; - } - - $this->Shadow = $RestoreShadow; - } - - /* Draw a basic shape */ - function drawShape($X,$Y,$Shape,$PlotSize,$PlotBorder,$BorderSize,$R,$G,$B,$Alpha,$BorderR,$BorderG,$BorderB,$BorderAlpha) - { - if ( $Shape == SERIE_SHAPE_FILLEDCIRCLE ) - { - if ( $PlotBorder ) { $this->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - $this->drawFilledCircle($X,$Y,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_FILLEDSQUARE ) - { - if ( $PlotBorder ) { $this->drawFilledRectangle($X-$PlotSize-$BorderSize,$Y-$PlotSize-$BorderSize,$X+$PlotSize+$BorderSize,$Y+$PlotSize+$BorderSize,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); } - $this->drawFilledRectangle($X-$PlotSize,$Y-$PlotSize,$X+$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_FILLEDTRIANGLE ) - { - if ( $PlotBorder ) - { - $Pos = ""; $Pos[]=$X; $Pos[]=$Y-$PlotSize-$BorderSize; $Pos[]=$X-$PlotSize-$BorderSize; $Pos[]=$Y+$PlotSize+$BorderSize; $Pos[]=$X+$PlotSize+$BorderSize; $Pos[]=$Y+$PlotSize+$BorderSize; - $this->drawPolygon($Pos,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); - } - - $Pos = ""; $Pos[]=$X; $Pos[]=$Y-$PlotSize; $Pos[]=$X-$PlotSize; $Pos[]=$Y+$PlotSize; $Pos[]=$X+$PlotSize; $Pos[]=$Y+$PlotSize; - $this->drawPolygon($Pos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_TRIANGLE ) - { - $this->drawLine($X,$Y-$PlotSize,$X-$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - $this->drawLine($X-$PlotSize,$Y+$PlotSize,$X+$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - $this->drawLine($X+$PlotSize,$Y+$PlotSize,$X,$Y-$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_SQUARE ) - $this->drawRectangle($X-$PlotSize,$Y-$PlotSize,$X+$PlotSize,$Y+$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - elseif ( $Shape == SERIE_SHAPE_CIRCLE ) - $this->drawCircle($X,$Y,$PlotSize,$PlotSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - elseif ( $Shape == SERIE_SHAPE_DIAMOND ) - { - $Pos = ""; $Pos[]=$X-$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y-$PlotSize; $Pos[]=$X+$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y+$PlotSize; - $this->drawPolygon($Pos,array("NoFill"=>TRUE,"BorderR"=>$R,"BorderG"=>$G,"BorderB"=>$B,"BorderAlpha"=>$Alpha)); - } - elseif ( $Shape == SERIE_SHAPE_FILLEDDIAMOND ) - { - if ( $PlotBorder ) - { - $Pos = ""; $Pos[]=$X-$PlotSize-$BorderSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y-$PlotSize-$BorderSize; $Pos[]=$X+$PlotSize+$BorderSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y+$PlotSize+$BorderSize; - $this->drawPolygon($Pos,array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha)); - } - - $Pos = ""; $Pos[]=$X-$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y-$PlotSize; $Pos[]=$X+$PlotSize; $Pos[]=$Y; $Pos[]=$X; $Pos[]=$Y+$PlotSize; - $this->drawPolygon($Pos,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha)); - } - } - - function drawPolygonChart($Points,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $NoFill = isset($Format["NoFill"]) ? $Format["NoFill"] : FALSE; - $NoBorder = isset($Format["NoBorder"]) ? $Format["NoBorder"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : $R; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : $G; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : $B; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : $Alpha / 2; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Threshold = isset($Format["Threshold"]) ? $Format["Threshold"] : NULL; - - if ( $Surrounding != NULL ) { $BorderR = $R+$Surrounding; $BorderG = $G+$Surrounding; $BorderB = $B+$Surrounding; } - - $RestoreShadow = $this->Shadow; - $this->Shadow = FALSE; - - $AllIntegers = TRUE; - for($i=0;$i<=count($Points)-2;$i=$i+2) - { if ( $this->getFirstDecimal($Points[$i+1]) != 0 ) { $AllIntegers = FALSE; } } - - /* Convert polygon to segments */ - $Segments = ""; - for($i=2;$i<=count($Points)-2;$i=$i+2) - { $Segments[] = array("X1"=>$Points[$i-2],"Y1"=>$Points[$i-1],"X2"=>$Points[$i],"Y2"=>$Points[$i+1]); } - $Segments[] = array("X1"=>$Points[$i-2],"Y1"=>$Points[$i-1],"X2"=>$Points[0],"Y2"=>$Points[1]); - - /* Simplify straight lines */ - $Result = ""; $inHorizon = FALSE; $LastX = VOID; - foreach($Segments as $Key => $Pos) - { - if ( $Pos["Y1"] != $Pos["Y2"] ) - { - if ( $inHorizon ) { $inHorizon = FALSE; $Result[] = array("X1"=>$LastX,"Y1"=>$Pos["Y1"],"X2"=>$Pos["X1"],"Y2"=>$Pos["Y1"]); } - - $Result[] = array("X1"=>$Pos["X1"],"Y1"=>$Pos["Y1"],"X2"=>$Pos["X2"],"Y2"=>$Pos["Y2"]); - } - else { if ( !$inHorizon ) { $inHorizon = TRUE; $LastX = $Pos["X1"];} } - } - $Segments = $Result; - - /* Do we have something to draw */ - if ( $Segments == "" ) { return(0); } - - /* For segments debugging purpose */ - //foreach($Segments as $Key => $Pos) - // echo $Pos["X1"].",".$Pos["Y1"].",".$Pos["X2"].",".$Pos["Y2"]."\r\n"; - - /* Find out the min & max Y boundaries */ - $MinY = OUT_OF_SIGHT; $MaxY = OUT_OF_SIGHT; - foreach($Segments as $Key => $Coords) - { - if ( $MinY == OUT_OF_SIGHT || $MinY > min($Coords["Y1"],$Coords["Y2"]) ) { $MinY = min($Coords["Y1"],$Coords["Y2"]); } - if ( $MaxY == OUT_OF_SIGHT || $MaxY < max($Coords["Y1"],$Coords["Y2"]) ) { $MaxY = max($Coords["Y1"],$Coords["Y2"]); } - } - - if ( $AllIntegers ) { $YStep = 1; } else { $YStep = .5; } - - $MinY = floor($MinY); $MaxY = floor($MaxY); - - /* Scan each Y lines */ - $DefaultColor = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - $DebugLine = 0; $DebugColor = $this->allocateColor($this->Picture,255,0,0,100); - - $MinY = floor($MinY); $MaxY = floor($MaxY); $YStep = 1; - - if ( !$NoFill ) - { - //if ( $DebugLine ) { $MinY = $DebugLine; $MaxY = $DebugLine; } - for($Y=$MinY;$Y<=$MaxY;$Y=$Y+$YStep) - { - $Intersections = ""; $LastSlope = NULL; $RestoreLast = "-"; - foreach($Segments as $Key => $Coords) - { - $X1 = $Coords["X1"]; $X2 = $Coords["X2"]; $Y1 = $Coords["Y1"]; $Y2 = $Coords["Y2"]; - - if ( min($Y1,$Y2) <= $Y && max($Y1,$Y2) >= $Y ) - { - if ( $Y1 == $Y2 ) - { $X = $X1; } - else - { $X = $X1 + ( ($Y-$Y1)*$X2 - ($Y-$Y1)*$X1 ) / ($Y2-$Y1); } - - $X = floor($X); - - if ( $X2 == $X1 ) - { $Slope = "!"; } - else - { - $SlopeC = ($Y2 - $Y1) / ($X2 - $X1); - if( $SlopeC == 0 ) - { $Slope = "="; } - elseif( $SlopeC > 0 ) - { $Slope = "+"; } - elseif ( $SlopeC < 0 ) - { $Slope = "-"; } - } - - if ( !is_array($Intersections) ) - { $Intersections[] = $X; } - elseif( !in_array($X,$Intersections) ) - { $Intersections[] = $X; } - elseif( in_array($X,$Intersections) ) - { - if ($Y == $DebugLine) { echo $Slope."/".$LastSlope."(".$X.") "; } - - if ( $Slope == "=" && $LastSlope == "-" ) { $Intersections[] = $X; } - if ( $Slope != $LastSlope && $LastSlope != "!" && $LastSlope != "=" ) { $Intersections[] = $X; } - if ( $Slope != $LastSlope && $LastSlope == "!" && $Slope == "+" ) { $Intersections[] = $X; } - } - - if ( is_array($Intersections) && in_array($X,$Intersections) && $LastSlope == "=" && ($Slope == "-" )) { $Intersections[] = $X; } - - $LastSlope = $Slope; - } - } - if ( $RestoreLast != "-" ) { $Intersections[] = $RestoreLast; echo "@".$Y."\r\n"; } - - if ( is_array($Intersections) ) - { - sort($Intersections); - - if ($Y == $DebugLine) { print_r($Intersections); } - - /* Remove NULL plots */ - $Result = ""; - for($i=0;$i<=count($Intersections)-1;$i=$i+2) - { - if ( isset($Intersections[$i+1]) ) - { if ( $Intersections[$i] != $Intersections[$i+1] ) { $Result[] = $Intersections[$i]; $Result[] = $Intersections[$i+1]; } } - } - - if ( is_array($Result) ) - { - $Intersections = $Result; - - $LastX = OUT_OF_SIGHT; - foreach($Intersections as $Key => $X) - { - if ( $LastX == OUT_OF_SIGHT ) - $LastX = $X; - elseif ( $LastX != OUT_OF_SIGHT ) - { - if ( $this->getFirstDecimal($LastX) > 1 ) { $LastX++; } - - $Color = $DefaultColor; - if ( $Threshold != NULL ) - { - foreach($Threshold as $Key => $Parameters) - { - if ( $Y <= $Parameters["MinX"] && $Y >= $Parameters["MaxX"]) - { - if ( isset($Parameters["R"]) ) { $R = $Parameters["R"]; } else { $R = 0; } - if ( isset($Parameters["G"]) ) { $G = $Parameters["G"]; } else { $G = 0; } - if ( isset($Parameters["B"]) ) { $B = $Parameters["B"]; } else { $B = 0; } - if ( isset($Parameters["Alpha"]) ) { $Alpha = $Parameters["Alpha"]; } else { $Alpha = 100; } - $Color = $this->allocateColor($this->Picture,$R,$G,$B,$Alpha); - } - } - } - - imageline($this->Picture,$LastX,$Y,$X,$Y,$Color); - - if ( $Y == $DebugLine) { imageline($this->Picture,$LastX,$Y,$X,$Y,$DebugColor); } - - $LastX = OUT_OF_SIGHT; - } - } - } - } - } - } - - /* Draw the polygon border, if required */ - if ( !$NoBorder) - { - foreach($Segments as $Key => $Coords) - $this->drawLine($Coords["X1"],$Coords["Y1"],$Coords["X2"],$Coords["Y2"],array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha,"Threshold"=>$Threshold)); - } - - $this->Shadow = $RestoreShadow; - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pImage.class.php b/Under-Testing/Website/class/pImage.class.php deleted file mode 100644 index 4684e3c..0000000 --- a/Under-Testing/Website/class/pImage.class.php +++ /dev/null @@ -1,343 +0,0 @@ -TransparentBackground = $TransparentBackground; - - if ( $DataSet != NULL ) { $this->DataSet = $DataSet; } - - $this->XSize = $XSize; - $this->YSize = $YSize; - $this->Picture = imagecreatetruecolor($XSize,$YSize); - - if ( $this->TransparentBackground ) - { - imagealphablending($this->Picture,FALSE); - imagefilledrectangle($this->Picture, 0,0,$XSize, $YSize, imagecolorallocatealpha($this->Picture, 255, 255, 255, 127)); - imagealphablending($this->Picture,TRUE); - imagesavealpha($this->Picture,true); - } - else - { - $C_White = $this->AllocateColor($this->Picture,255,255,255); - imagefilledrectangle($this->Picture,0,0,$XSize,$YSize,$C_White); - } - } - - /* Enable / Disable and set shadow properties */ - function setShadow($Enabled=TRUE,$Format="") - { - $X = isset($Format["X"]) ? $Format["X"] : 2; - $Y = isset($Format["Y"]) ? $Format["Y"] : 2; - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 10; - - $this->Shadow = $Enabled; - $this->ShadowX = $X; - $this->ShadowY = $Y; - $this->ShadowR = $R; - $this->ShadowG = $G; - $this->ShadowB = $B; - $this->Shadowa = $Alpha; - } - - /* Set the graph area position */ - function setGraphArea($X1,$Y1,$X2,$Y2) - { - if ( $X2 < $X1 || $X1 == $X2 || $Y2 < $Y1 || $Y1 == $Y2 ) { return(-1); } - - $this->GraphAreaX1 = $X1; $this->DataSet->Data["GraphArea"]["X1"] = $X1; - $this->GraphAreaY1 = $Y1; $this->DataSet->Data["GraphArea"]["Y1"] = $Y1; - $this->GraphAreaX2 = $X2; $this->DataSet->Data["GraphArea"]["X2"] = $X2; - $this->GraphAreaY2 = $Y2; $this->DataSet->Data["GraphArea"]["Y2"] = $Y2; - } - - /* Return the width of the picture */ - function getWidth() - { return($this->XSize); } - - /* Return the heigth of the picture */ - function getHeight() - { return($this->YSize); } - - /* Render the picture to a file */ - function render($FileName) - { - if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); } - imagepng($this->Picture,$FileName); - } - - /* Render the picture to a web browser stream */ - function stroke($BrowserExpire=FALSE) - { - if ( $this->TransparentBackground ) { imagealphablending($this->Picture,false); imagesavealpha($this->Picture,true); } - - if ( $BrowserExpire ) - { - header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); - header("Cache-Control: no-cache"); - header("Pragma: no-cache"); - } - - header('Content-type: image/png'); - imagepng($this->Picture); - } - - /* Automatic output method based on the calling interface */ - function autoOutput($FileName="output.png") - { - if (php_sapi_name() == "cli") - $this->Render($FileName); - else - $this->Stroke(); - } - - /* Return the length between two points */ - function getLength($X1,$Y1,$X2,$Y2) - { return(sqrt(pow(max($X1,$X2)-min($X1,$X2),2)+pow(max($Y1,$Y2)-min($Y1,$Y2),2))); } - - /* Return the orientation of a line */ - function getAngle($X1,$Y1,$X2,$Y2) - { - $Opposite = $Y2 - $Y1; $Adjacent = $X2 - $X1;$Angle = rad2deg(atan2($Opposite,$Adjacent)); - if ($Angle > 0) { return($Angle); } else { return(360-abs($Angle)); } - } - - /* Return the surrounding box of text area */ - function getTextBox_deprecated($X,$Y,$FontName,$FontSize,$Angle,$Text) - { - $Size = imagettfbbox($FontSize,$Angle,$FontName,$Text); - $Width = $this->getLength($Size[0],$Size[1],$Size[2],$Size[3])+1; - $Height = $this->getLength($Size[2],$Size[3],$Size[4],$Size[5])+1; - - $RealPos[0]["X"] = $X; $RealPos[0]["Y"] = $Y; - $RealPos[1]["X"] = cos((360-$Angle)*PI/180)*$Width + $RealPos[0]["X"]; $RealPos[1]["Y"] = sin((360-$Angle)*PI/180)*$Width + $RealPos[0]["Y"]; - $RealPos[2]["X"] = cos((270-$Angle)*PI/180)*$Height + $RealPos[1]["X"]; $RealPos[2]["Y"] = sin((270-$Angle)*PI/180)*$Height + $RealPos[1]["Y"]; - $RealPos[3]["X"] = cos((180-$Angle)*PI/180)*$Width + $RealPos[2]["X"]; $RealPos[3]["Y"] = sin((180-$Angle)*PI/180)*$Width + $RealPos[2]["Y"]; - - $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"] = $RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"] = $RealPos[0]["Y"]; - $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"] = $RealPos[1]["X"]; $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"] = $RealPos[1]["Y"]; - - return($RealPos); - } - - /* Return the surrounding box of text area */ - function getTextBox($X,$Y,$FontName,$FontSize,$Angle,$Text) - { - $coords = imagettfbbox($FontSize, 0, $FontName, $Text); - - $a = deg2rad($Angle); $ca = cos($a); $sa = sin($a); $RealPos = array(); - for($i = 0; $i < 7; $i += 2) - { - $RealPos[$i/2]["X"] = $X + round($coords[$i] * $ca + $coords[$i+1] * $sa); - $RealPos[$i/2]["Y"] = $Y + round($coords[$i+1] * $ca - $coords[$i] * $sa); - } - - $RealPos[TEXT_ALIGN_BOTTOMLEFT]["X"] = $RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMLEFT]["Y"] = $RealPos[0]["Y"]; - $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["X"] = $RealPos[1]["X"]; $RealPos[TEXT_ALIGN_BOTTOMRIGHT]["Y"] = $RealPos[1]["Y"]; - $RealPos[TEXT_ALIGN_TOPLEFT]["X"] = $RealPos[3]["X"]; $RealPos[TEXT_ALIGN_TOPLEFT]["Y"] = $RealPos[3]["Y"]; - $RealPos[TEXT_ALIGN_TOPRIGHT]["X"] = $RealPos[2]["X"]; $RealPos[TEXT_ALIGN_TOPRIGHT]["Y"] = $RealPos[2]["Y"]; - $RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["X"] = ($RealPos[1]["X"]-$RealPos[0]["X"])/2+$RealPos[0]["X"]; $RealPos[TEXT_ALIGN_BOTTOMMIDDLE]["Y"] = ($RealPos[0]["Y"]-$RealPos[1]["Y"])/2+$RealPos[1]["Y"]; - $RealPos[TEXT_ALIGN_TOPMIDDLE]["X"] = ($RealPos[2]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_TOPMIDDLE]["Y"] = ($RealPos[3]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"]; - $RealPos[TEXT_ALIGN_MIDDLELEFT]["X"] = ($RealPos[0]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_MIDDLELEFT]["Y"] = ($RealPos[0]["Y"]-$RealPos[3]["Y"])/2+$RealPos[3]["Y"]; - $RealPos[TEXT_ALIGN_MIDDLERIGHT]["X"] = ($RealPos[1]["X"]-$RealPos[2]["X"])/2+$RealPos[2]["X"]; $RealPos[TEXT_ALIGN_MIDDLERIGHT]["Y"] = ($RealPos[1]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"]; - $RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["X"] = ($RealPos[1]["X"]-$RealPos[3]["X"])/2+$RealPos[3]["X"]; $RealPos[TEXT_ALIGN_MIDDLEMIDDLE]["Y"] = ($RealPos[0]["Y"]-$RealPos[2]["Y"])/2+$RealPos[2]["Y"]; - - return($RealPos); - } - - /* Set current font properties */ - function setFontProperties($Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : -1; - $G = isset($Format["G"]) ? $Format["G"] : -1; - $B = isset($Format["B"]) ? $Format["B"] : -1; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : NULL; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : NULL; - - if ( $R != -1) { $this->FontColorR = $R; } - if ( $G != -1) { $this->FontColorG = $G; } - if ( $B != -1) { $this->FontColorB = $B; } - if ( $Alpha != NULL) { $this->FontColorA = $Alpha; } - - if ( $FontName != NULL ) - $this->FontName = $FontName; - - if ( $FontSize != NULL ) - $this->FontSize = $FontSize; - } - - /* Returns the 1st decimal values (used to correct AA bugs) */ - function getFirstDecimal($Value) - { - $Values = preg_split("/\./",$Value); - if ( isset($Values[1]) ) { return(substr($Values[1],0,1)); } else { return(0); } - } - - /* Attach a dataset to your pChart Object */ - function setDataSet(&$DataSet) - { $this->DataSet = $DataSet; } - - /* Print attached dataset contents to STDOUT */ - function printDataSet() - { print_r($this->DataSet); } - - /* Initialise the image map methods */ - function initialiseImageMap($Name="pChart",$StorageMode=IMAGE_MAP_STORAGE_SESSION,$UniqueID="imageMap",$StorageFolder="tmp") - { - $this->ImageMapIndex = $Name; - $this->ImageMapStorageMode = $StorageMode; - - if ($StorageMode == IMAGE_MAP_STORAGE_SESSION) - { - if(!isset($_SESSION)) { session_start(); } - $_SESSION[$this->ImageMapIndex] = NULL; - } - elseif($StorageMode == IMAGE_MAP_STORAGE_FILE) - { - $this->ImageMapFileName = $UniqueID; - $this->ImageMapStorageFolder = $StorageFolder; - - if (file_exists($StorageFolder."/".$UniqueID.".map")) { unlink($StorageFolder."/".$UniqueID.".map"); } - } - } - - /* Add a zone to the image map */ - function addToImageMap($Type,$Plots,$Color=NULL,$Title=NULL,$Message=NULL) - { - if ( $this->ImageMapStorageMode == NULL ) { $this->initialiseImageMap(); } - - if ( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_SESSION ) - { - if(!isset($_SESSION)) { $this->initialiseImageMap(); } - $_SESSION[$this->ImageMapIndex][] = array($Type,$Plots,$Color,$Title,$Message); - } - elseif($this->ImageMapStorageMode == IMAGE_MAP_STORAGE_FILE) - { - $Handle = fopen($this->ImageMapStorageFolder."/".$this->ImageMapFileName.".map", 'a'); - fwrite($Handle, $Type.";".$Plots.";".$Color.";".$Title.";".$Message."\r\n"); - fclose($Handle); - } - } - - /* Dump the image map */ - function dumpImageMap($Name="pChart",$StorageMode=IMAGE_MAP_STORAGE_SESSION,$UniqueID="imageMap",$StorageFolder="tmp") - { - $this->ImageMapIndex = $Name; - $this->ImageMapStorageMode = $StorageMode; - - if ( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_SESSION ) - { - if(!isset($_SESSION)) { session_start(); } - if ( $_SESSION[$Name] != NULL ) - { - foreach($_SESSION[$Name] as $Key => $Params) - { echo $Params[0].";".$Params[1].";".$Params[2].";".$Params[3].";".$Params[4]."\r\n"; } - } - } - elseif( $this->ImageMapStorageMode == IMAGE_MAP_STORAGE_FILE ) - { - if (file_exists($StorageFolder."/".$UniqueID.".map")) - { - $Handle = @fopen($StorageFolder."/".$UniqueID.".map", "r"); - if ($Handle) { while (($Buffer = fgets($Handle, 4096)) !== false) { echo $Buffer; } } - fclose($Handle); - - if ( $this->ImageMapAutoDelete ) { unlink($StorageFolder."/".$UniqueID.".map"); } - } - } - exit(); - } - - /* Return the HTML converted color from the RGB composite values */ - function toHTMLColor($R,$G,$B) - { - $R=intval($R); $G=intval($G); $B=intval($B); - $R=dechex($R<0?0:($R>255?255:$R)); $G=dechex($G<0?0:($G>255?255:$G));$B=dechex($B<0?0:($B>255?255:$B)); - $Color="#".(strlen($R) < 2?'0':'').$R; $Color.=(strlen($G) < 2?'0':'').$G; $Color.= (strlen($B) < 2?'0':'').$B; - return($Color); - } - - /* Reverse an array of points */ - function reversePlots($Plots) - { - $Result = ""; - for($i=count($Plots)-2;$i>=0;$i=$i-2) { $Result[] = $Plots[$i]; $Result[] = $Plots[$i+1]; } - return($Result); - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pIndicator.class.php b/Under-Testing/Website/class/pIndicator.class.php deleted file mode 100644 index 4f7f23b..0000000 --- a/Under-Testing/Website/class/pIndicator.class.php +++ /dev/null @@ -1,241 +0,0 @@ -pChartObject = $pChartObject; - } - - /* Draw an indicator */ - function draw($X,$Y,$Width,$Height,$Format="") - { - $Values = isset($Format["Values"]) ? $Format["Values"] : VOID; - $IndicatorSections = isset($Format["IndicatorSections"]) ? $Format["IndicatorSections"] : NULL; - $ValueDisplay = isset($Format["ValueDisplay"]) ? $Format["ValueDisplay"] : INDICATOR_VALUE_BUBBLE; - $SectionsMargin = isset($Format["SectionsMargin"]) ? $Format["SectionsMargin"] : 4; - $DrawLeftHead = isset($Format["DrawLeftHead"]) ? $Format["DrawLeftHead"] : TRUE; - $DrawRightHead = isset($Format["DrawRightHead"]) ? $Format["DrawRightHead"] : TRUE; - $HeadSize = isset($Format["HeadSize"]) ? $Format["HeadSize"] : floor($Height/4); - $TextPadding = isset($Format["TextPadding"]) ? $Format["TextPadding"] : 4; - $CaptionLayout = isset($Format["CaptionLayout"]) ? $Format["CaptionLayout"] : INDICATOR_CAPTION_EXTENDED; - $CaptionPosition = isset($Format["CaptionPosition"]) ? $Format["CaptionPosition"] : INDICATOR_CAPTION_INSIDE; - $CaptionColorFactor = isset($Format["CaptionColorFactor"]) ? $Format["CaptionColorFactor"] : NULL; - $CaptionR = isset($Format["CaptionR"]) ? $Format["CaptionR"] : 255; - $CaptionG = isset($Format["CaptionG"]) ? $Format["CaptionG"] : 255; - $CaptionB = isset($Format["CaptionB"]) ? $Format["CaptionB"] : 255; - $CaptionAlpha = isset($Format["CaptionAlpha"]) ? $Format["CaptionAlpha"] : 100; - $SubCaptionColorFactor = isset($Format["SubCaptionColorFactor"]) ? $Format["SubCaptionColorFactor"] : NULL; - $SubCaptionR = isset($Format["SubCaptionR"]) ? $Format["SubCaptionR"] : 50; - $SubCaptionG = isset($Format["SubCaptionG"]) ? $Format["SubCaptionG"] : 50; - $SubCaptionB = isset($Format["SubCaptionB"]) ? $Format["SubCaptionB"] : 50; - $SubCaptionAlpha = isset($Format["SubCaptionAlpha"]) ? $Format["SubCaptionAlpha"] : 100; - $ValueFontName = isset($Format["ValueFontName"]) ? $Format["ValueFontName"] : $this->pChartObject->FontName; - $ValueFontSize = isset($Format["ValueFontSize"]) ? $Format["ValueFontSize"] : $this->pChartObject->FontSize; - $CaptionFontName = isset($Format["CaptionFontName"]) ? $Format["CaptionFontName"] : $this->pChartObject->FontName; - $CaptionFontSize = isset($Format["CaptionFontSize"]) ? $Format["CaptionFontSize"] : $this->pChartObject->FontSize; - $Unit = isset($Format["Unit"]) ? $Format["Unit"] : ""; - - /* Convert the Values to display to an array if needed */ - if ( !is_array($Values) ) { $Value = $Values; $Values = ""; $Values[] = $Value; } - - /* No section, let's die */ - if ( $IndicatorSections == NULL ) { return(0); } - - /* Determine indicator visual configuration */ - $OverallMin = $IndicatorSections[0]["End"]; $OverallMax = $IndicatorSections[0]["Start"]; - foreach ($IndicatorSections as $Key => $Settings) - { - if ( $Settings["End"] > $OverallMax ) { $OverallMax = $Settings["End"]; } - if ( $Settings["Start"] < $OverallMin ) { $OverallMin = $Settings["Start"]; } - } - $RealWidth = $Width - (count($IndicatorSections)-1)*$SectionsMargin; - $XScale = $RealWidth / ($OverallMax-$OverallMin); - - $X1 = $X; $ValuesPos = ""; - foreach ($IndicatorSections as $Key => $Settings) - { - $Color = array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"]); - $Caption = $Settings["Caption"]; - $SubCaption = $Settings["Start"]." - ".$Settings["End"]; - - $X2 = $X1 + ($Settings["End"] - $Settings["Start"]) * $XScale; - - if ( $Key == 0 && $DrawLeftHead ) - { - $Poly = ""; $Poly[] = $X1-1; $Poly[] = $Y; $Poly[] = $X1-1; $Poly[] = $Y+$Height; $Poly[] = $X1-1-$HeadSize; $Poly[] = $Y+($Height/2); - $this->pChartObject->drawPolygon($Poly,$Color); - $this->pChartObject->drawLine($X1-2,$Y,$X1-2-$HeadSize,$Y+($Height/2),$Color); - $this->pChartObject->drawLine($X1-2,$Y+$Height,$X1-2-$HeadSize,$Y+($Height/2),$Color); - } - - /* Determine the position of the breaks */ - $Break = ""; - foreach($Values as $iKey => $Value) - { - if ( $Value >= $Settings["Start"] && $Value <= $Settings["End"] ) - { - $XBreak = $X1 + ($Value - $Settings["Start"]) * $XScale; - $ValuesPos[$Value] = $XBreak; - $Break[] = floor($XBreak); - } - } - - if ( $ValueDisplay == INDICATOR_VALUE_LABEL ) - { - if ( $Break == "" ) - $this->pChartObject->drawFilledRectangle($X1,$Y,$X2,$Y+$Height,$Color); - else - { - sort($Break); - $Poly = ""; $Poly[] = $X1; $Poly[] = $Y; $LastPointWritten = FALSE; - foreach($Break as $iKey => $Value) - { - if ( $Value-5 >= $X1 ) - { $Poly[] = $Value-5; $Poly[] = $Y; } - elseif ($X1 - ($Value-5) > 0 ) - { - $Offset = $X1 - ($Value-5); - $Poly = ""; $Poly[] = $X1; $Poly[] = $Y + $Offset; - } - - $Poly[] = $Value; $Poly[] = $Y+5; - - if ( $Value+5 <= $X2 ) - { $Poly[] = $Value+5; $Poly[] = $Y; } - elseif (($Value+5) > $X2 ) - { - $Offset = ($Value+5) - $X2; - $Poly[] = $X2; $Poly[] = $Y + $Offset; - $LastPointWritten = TRUE; - } - - } - if ( !$LastPointWritten ) { $Poly[] = $X2; $Poly[] = $Y; } - $Poly[] = $X2; $Poly[] = $Y+$Height; - $Poly[] = $X1; $Poly[] = $Y+$Height; - - $this->pChartObject->drawPolygon($Poly,$Color); - } - } - else - $this->pChartObject->drawFilledRectangle($X1,$Y,$X2,$Y+$Height,$Color); - - if ( $Key == count($IndicatorSections)-1 && $DrawRightHead ) - { - $Poly = ""; $Poly[] = $X2+1; $Poly[] = $Y; $Poly[] = $X2+1; $Poly[] = $Y+$Height; $Poly[] = $X2+1+$HeadSize; $Poly[] = $Y+($Height/2); - $this->pChartObject->drawPolygon($Poly,$Color); - $this->pChartObject->drawLine($X2+1,$Y,$X2+1+$HeadSize,$Y+($Height/2),$Color); - $this->pChartObject->drawLine($X2+1,$Y+$Height,$X2+1+$HeadSize,$Y+($Height/2),$Color); - } - - if ( $CaptionPosition == INDICATOR_CAPTION_INSIDE ) - { - $TxtPos = $this->pChartObject->getTextBox($X1,$Y+$Height+$TextPadding,$CaptionFontName,$CaptionFontSize,0,$Caption); - $YOffset = ($TxtPos[0]["Y"] - $TxtPos[2]["Y"]) + $TextPadding; - - if ( $CaptionLayout == INDICATOR_CAPTION_EXTENDED ) - { - $TxtPos = $this->pChartObject->getTextBox($X1,$Y+$Height+$TextPadding,$CaptionFontName,$CaptionFontSize,0,$SubCaption); - $YOffset = $YOffset + ($TxtPos[0]["Y"] - $TxtPos[2]["Y"]) + $TextPadding*2; - } - - $XOffset = $TextPadding; - } - else - { $YOffset = 0; $XOffset = 0; } - - if ( $CaptionColorFactor == NULL ) - { $CaptionColor = array("Align"=>TEXT_ALIGN_TOPLEFT,"FontName"=>$CaptionFontName,"FontSize"=>$CaptionFontSize,"R"=>$CaptionR,"G"=>$CaptionG,"B"=>$CaptionB,"Alpha"=>$CaptionAlpha); } - else - { $CaptionColor = array("Align"=>TEXT_ALIGN_TOPLEFT,"FontName"=>$CaptionFontName,"FontSize"=>$CaptionFontSize,"R"=>$Settings["R"]+$CaptionColorFactor,"G"=>$Settings["G"]+$CaptionColorFactor,"B"=>$Settings["B"]+$CaptionColorFactor); } - - if ( $SubCaptionColorFactor == NULL ) - $SubCaptionColor = array("Align"=>TEXT_ALIGN_TOPLEFT,"FontName"=>$CaptionFontName,"FontSize"=>$CaptionFontSize,"R"=>$SubCaptionR,"G"=>$SubCaptionG,"B"=>$SubCaptionB,"Alpha"=>$SubCaptionAlpha); - else - $SubCaptionColor = array("Align"=>TEXT_ALIGN_TOPLEFT,"FontName"=>$CaptionFontName,"FontSize"=>$CaptionFontSize,"R"=>$Settings["R"]+$SubCaptionColorFactor,"G"=>$Settings["G"]+$SubCaptionColorFactor,"B"=>$Settings["B"]+$SubCaptionColorFactor); - - $RestoreShadow = $this->pChartObject->Shadow; - $this->pChartObject->Shadow = FALSE; - - if ( $CaptionLayout == INDICATOR_CAPTION_DEFAULT ) - $this->pChartObject->drawText($X1,$Y+$Height+$TextPadding,$Caption,$CaptionColor); - elseif ( $CaptionLayout == INDICATOR_CAPTION_EXTENDED ) - { - $TxtPos = $this->pChartObject->getTextBox($X1,$Y+$Height+$TextPadding,$CaptionFontName,$CaptionFontSize,0,$Caption); - $CaptionHeight = $TxtPos[0]["Y"] - $TxtPos[2]["Y"]; - - $this->pChartObject->drawText($X1+$XOffset,$Y+$Height-$YOffset+$TextPadding,$Caption,$CaptionColor); - $this->pChartObject->drawText($X1+$XOffset,$Y+$Height-$YOffset+$CaptionHeight+$TextPadding*2,$SubCaption,$SubCaptionColor); - } - - $this->pChartObject->Shadow = $RestoreShadow; - - $X1 = $X2 + $SectionsMargin; - } - - $RestoreShadow = $this->pChartObject->Shadow; - $this->pChartObject->Shadow = FALSE; - - foreach($Values as $Key => $Value) - { - if ( $Value >= $OverallMin && $Value <= $OverallMax ) - { - foreach ($IndicatorSections as $Key => $Settings) - { - if ( $Value >= $Settings["Start"] && $Value <= $Settings["End"] ) - { - $X1 = $ValuesPos[$Value]; //$X + $Key*$SectionsMargin + ($Value - $OverallMin) * $XScale; - - if ( $ValueDisplay == INDICATOR_VALUE_BUBBLE ) - { - $TxtPos = $this->pChartObject->getTextBox($X1,$Y,$ValueFontName,$ValueFontSize,0,$Value.$Unit); - $Radius = floor(($TxtPos[1]["X"] - $TxtPos[0]["X"] + $TextPadding*4)/2); - - $this->pChartObject->drawFilledCircle($X1,$Y,$Radius+4,array("R"=>$Settings["R"]+20,"G"=>$Settings["G"]+20,"B"=>$Settings["B"]+20)); - $this->pChartObject->drawFilledCircle($X1,$Y,$Radius,array("R"=>255,"G"=>255,"B"=>255)); - - $TextSettings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontName"=>$ValueFontName,"FontSize"=>$ValueFontSize); - $this->pChartObject->drawText($X1-1,$Y-1,$Value.$Unit,$TextSettings); - } - elseif( $ValueDisplay == INDICATOR_VALUE_LABEL ) - { - $Caption = ""; - $Caption[] = array("Format"=>array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"],"Alpha"=>100),"Caption"=>$Value.$Unit); - $this->pChartObject->drawLabelBox(floor($X1),floor($Y)+2,"Value - ".$Settings["Caption"],$Caption); - } - } - $X1 = $X2 + $SectionsMargin; - } - } - } - $this->pChartObject->Shadow = $RestoreShadow; - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pPie.class.php b/Under-Testing/Website/class/pPie.class.php deleted file mode 100644 index 8940b4d..0000000 --- a/Under-Testing/Website/class/pPie.class.php +++ /dev/null @@ -1,1493 +0,0 @@ -pChartObject = $Object; - - /* Cache the pData object reference */ - $this->pDataObject = $pDataObject; - } - - /* Draw a pie chart */ - function draw2DPie($X,$Y,$Format="") - { - $Radius = isset($Format["Radius"]) ? $Format["Radius"] : 60; - $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0; - $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0; - $SecondPass = isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : NULL; - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_OUTSIDE; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 15; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; } - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) - { - $this->pChartObject->Shadow = FALSE; - - $ShadowFormat = $Format; $ShadowFormat["Shadow"] = TRUE; - $this->draw2DPie($X+$this->pChartObject->ShadowX,$Y+$this->pChartObject->ShadowY,$ShadowFormat); - } - - /* Draw the polygon pie elements */ - $Step = 360 / (2 * PI * $Radius); - $Offset = 0; $ID = 0; - foreach($Values as $Key => $Value) - { - if ( $Shadow ) - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - else - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - } - - if ( !$SecondPass && !$Shadow ) - { - if ( !$Border ) - $Settings["Surrounding"] = 10; - else - { $Settings["BorderR"] = $BorderR; $Settings["BorderG"] = $BorderG; $Settings["BorderB"] = $BorderB; } - } - - $Plots = ""; - $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y; } - else - { - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y; - } - - $Plots[] = $X0; $Plots[] = $Y0; - - - for($i=$Offset;$i<=$EndAngle;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius + $Y; - - if ( $SecondPass && ( $i<90 )) { $Yc++; } - if ( $SecondPass && ( $i>180 && $i<270 )) { $Xc++; } - if ( $SecondPass && ( $i>=270 )) { $Xc++; $Yc++; } - - $Plots[] = $Xc; $Plots[] = $Yc; - } - - $this->pChartObject->drawPolygon($Plots,$Settings); - if ( $RecordImageMap && !$Shadow ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Plots),$this->pChartObject->toHTMLColor($Palette[$ID]["R"],$Palette[$ID]["G"],$Palette[$ID]["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][$Key],$Value); } - - if ( $DrawLabels && !$Shadow && !$SecondPass ) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y; - - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$Radius); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $i + $DataGapAngle; $ID++; - } - - /* Second pass to smooth the angles */ - if ( $SecondPass ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 0; $ID = 0; - foreach($Values as $Key => $Value) - { - $FirstPoint = TRUE; - if ( $Shadow ) - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - else - { - if ( $Border ) - $Settings = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB); - else - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - } - - $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; } - - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y; } - else - { - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius + $Y; - } - $Plots[] = $X0; $Plots[] = $Y0; - - for($i=$Offset;$i<=$EndAngle;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius + $Y; - - if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; } - - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - } - $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); - - if ( $DrawLabels && !$Shadow ) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius + $Y; - - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$Radius); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $i + $DataGapAngle; $ID++; - } - } - - if ( $WriteValues != NULL && !$Shadow ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 0; $ID = count($Values)-1; - $Settings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB,"Alpha"=>$ValueAlpha); - foreach($Values as $Key => $Value) - { - $EndAngle = ($Value*$ScaleFactor) + $Offset; if ( $EndAngle > 360 ) { $EndAngle = 0; } - $Angle = ($EndAngle - $Offset)/2 + $Offset; - - if ( $ValuePosition == PIE_VALUE_OUTSIDE ) - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius+$ValuePadding) + $X; - $Yc = sin(($Angle-90)*PI/180) * ($Radius+$ValuePadding) + $Y; - } - else - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius)/2 + $X; - $Yc = sin(($Angle-90)*PI/180) * ($Radius)/2 + $Y; - } - - if ( $WriteValues == PIE_VALUE_PERCENTAGE ) - $Display = round(( 100 / $SerieSum ) * $Value)."%"; - elseif ( $WriteValues == PIE_VALUE_NATURAL ) - $Display = $Value.$ValueSuffix; - - $this->pChartObject->drawText($Xc,$Yc,$Display,$Settings); - - $Offset = $EndAngle + $DataGapAngle; $ID--; - } - } - - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Draw a 3D pie chart */ - function draw3DPie($X,$Y,$Format="") - { - /* Rendering layout */ - $Radius = isset($Format["Radius"]) ? $Format["Radius"] : 80; - $SkewFactor = isset($Format["SkewFactor"]) ? $Format["SkewFactor"] : .5; - $SliceHeight = isset($Format["SliceHeight"]) ? $Format["SliceHeight"] : 20; - $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 0; - $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 0; - $SecondPass = isset($Format["SecondPass"]) ? $Format["SecondPass"] : TRUE; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : NULL; //PIE_VALUE_PERCENTAGE - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_INSIDE; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 15; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Error correction for overlaying rounded corners */ - if ( $SkewFactor < .5 ) { $SkewFactor = .5; } - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; } - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) { $this->pChartObject->Shadow = FALSE; } - - /* Draw the polygon pie elements */ - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - $Values = array_reverse($Values); - $Slice = 0; $Slices = ""; $SliceColors = ""; $Visible = ""; $SliceAngle = ""; - foreach($Values as $Key => $Value) - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - - $SliceColors[$Slice] = $Settings; - - $StartAngle = $Offset; - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ( $StartAngle > 180 ) { $Visible[$Slice]["Start"] = TRUE; } else { $Visible[$Slice]["Start"] = TRUE; } - if ( $EndAngle < 180 ) { $Visible[$Slice]["End"] = FALSE; } else { $Visible[$Slice]["End"] = TRUE; } - - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y; } - else - { - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y; - } - $Slices[$Slice][] = $X0; $Slices[$Slice][] = $Y0; $SliceAngle[$Slice][] = 0; - - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y; - - if ( ($SecondPass || $RestoreShadow ) && ( $i<90 )) { $Yc++; } - if ( ($SecondPass || $RestoreShadow ) && ( $i>90 && $i<180 )) { $Xc++; } - if ( ($SecondPass || $RestoreShadow ) && ( $i>180 && $i<270 )) { $Xc++; } - if ( ($SecondPass || $RestoreShadow ) && ( $i>=270 )) { $Xc++; $Yc++; } - - $Slices[$Slice][] = $Xc; $Slices[$Slice][] = $Yc; $SliceAngle[$Slice][] = $i; - } - - $Offset = $i - $DataGapAngle; $ID--; $Slice++; - } - - /* Draw the bottom shadow if needed */ - if ( $RestoreShadow && ($this->pChartObject->ShadowX != 0 || $this->pChartObject->ShadowY !=0 )) - { - foreach($Slices as $SliceID => $Plots) - { - $ShadowPie = ""; - for($i=0;$ipChartObject->ShadowX; $ShadowPie[] = $Plots[$i+1]+$this->pChartObject->ShadowY; } - - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa,"NoBorder"=>TRUE); - $this->pChartObject->drawPolygon($ShadowPie,$Settings); - } - - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; - foreach($Values as $Key => $Value) - { - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X + $this->pChartObject->ShadowX; - $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y + $this->pChartObject->ShadowY; - - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - } - - $Offset = $i - $DataGapAngle; $ID--; - } - } - - /* Draw the bottom pie splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $this->pChartObject->drawPolygon($Plots,$Settings); - - if ( $SecondPass ) - { - $Settings = $SliceColors[$SliceID]; - if ( $Border ) - { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30;; } - - if ( isset($SliceAngle[$SliceID][1]) ) /* Empty error handling */ - { - $Angle = $SliceAngle[$SliceID][1]; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings); - - $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1]; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Plots[0],$Plots[1],$Xc,$Yc,$Settings); - } - } - } - - /* Draw the two vertical edges */ - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE; - - if ( $Visible[$SliceID]["Start"] && isset($Plots[2])) /* Empty error handling */ - { - $this->pChartObject->drawLine($Plots[2],$Plots[3],$Plots[2],$Plots[3]- $SliceHeight,array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"])); - $Border = ""; - $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight; - $Border[] = $Plots[2]; $Border[] = $Plots[3] - $SliceHeight; $Border[] = $Plots[2]; $Border[] = $Plots[3]; - $this->pChartObject->drawPolygon($Border,$Settings); - } - } - - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE; - if ( $Visible[$SliceID]["End"] ) - { - $this->pChartObject->drawLine($Plots[count($Plots)-2],$Plots[count($Plots)-1],$Plots[count($Plots)-2],$Plots[count($Plots)-1]- $SliceHeight,array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"])); - - $Border = ""; - $Border[] = $Plots[0]; $Border[] = $Plots[1]; $Border[] = $Plots[0]; $Border[] = $Plots[1] - $SliceHeight; - $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1] - $SliceHeight; $Border[] = $Plots[count($Plots)-2]; $Border[] = $Plots[count($Plots)-1]; - $this->pChartObject->drawPolygon($Border,$Settings); - } - } - - /* Draw the rounded edges */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 10; $Settings["G"]+= 10; $Settings["B"]+= 10; $Settings["NoBorder"] = TRUE; - - for ($j=2;$j 90 ) - { - $Border = ""; - $Border[] = $Plots[$j]; $Border[] = $Plots[$j+1]; - $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3]; - $Border[] = $Plots[$j+2]; $Border[] = $Plots[$j+3] - $SliceHeight; - $Border[] = $Plots[$j]; $Border[] = $Plots[$j+1] - $SliceHeight; - $this->pChartObject->drawPolygon($Border,$Settings); - } - } - - if ( $SecondPass ) - { - $Settings = $SliceColors[$SliceID]; - if ( $Border ) - { $Settings["R"]+= 30; $Settings["G"]+= 30; $Settings["B"]+= 30; } - - if ( isset($SliceAngle[$SliceID][1]) ) /* Empty error handling */ - { - $Angle = $SliceAngle[$SliceID][1]; - if ( $Angle < 270 && $Angle > 90 ) - { - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - } - - $Angle = $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1]; - if ( $Angle < 270 && $Angle > 90 ) - { - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - - if ( isset($SliceAngle[$SliceID][1]) && $SliceAngle[$SliceID][1] > 270 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 270 ) - { - $Xc = cos((270-90)*PI/180) * $Radius + $X; - $Yc = sin((270-90)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - - if ( isset($SliceAngle[$SliceID][1]) && $SliceAngle[$SliceID][1] > 90 && $SliceAngle[$SliceID][count($SliceAngle[$SliceID])-1] < 90 ) - { - $Xc = cos((0)*PI/180) * $Radius + $X; - $Yc = sin((0)*PI/180) * $Radius*$SkewFactor + $Y; - $this->pChartObject->drawLine($Xc,$Yc,$Xc,$Yc-$SliceHeight,$Settings); - } - - } - } - - /* Draw the top splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; - $Settings["R"]+= 20; $Settings["G"]+= 20; $Settings["B"]+= 20; - - $Top = ""; - for($j=0;$jpChartObject->drawPolygon($Top,$Settings); - - if ( $RecordImageMap && !$Shadow ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Top),$this->pChartObject->toHTMLColor($Settings["R"],$Settings["G"],$Settings["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][count($Slices)-$SliceID-1],$Values[$SliceID]); } - } - - - /* Second pass to smooth the angles */ - if ( $SecondPass ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - foreach($Values as $Key => $Value) - { - $FirstPoint = TRUE; - if ( $Shadow ) - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - else - { - if ( $Border ) - { $Settings = array("R"=>$Palette[$ID]["R"]+30,"G"=>$Palette[$ID]["G"]+30,"B"=>$Palette[$ID]["B"]+30,"Alpha"=>$Palette[$ID]["Alpha"]); } - else - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - } - - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ($DataGapAngle == 0) - { $X0 = $X; $Y0 = $Y- $SliceHeight; } - else - { - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $X0 = cos(($Angle-90)*PI/180) * $DataGapRadius + $X; - $Y0 = sin(($Angle-90)*PI/180) * $DataGapRadius*$SkewFactor + $Y - $SliceHeight; - } - $Plots[] = $X0; $Plots[] = $Y0; - - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * $Radius + $X; - $Yc = sin(($i-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight; - - if ( $FirstPoint ) { $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); } { $FirstPoint = FALSE; } - - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - if ($i < 270 && $i > 90 ) { $this->pChartObject->drawAntialiasPixel($Xc,$Yc+$SliceHeight,$Settings); } - } - $this->pChartObject->drawLine($Xc,$Yc,$X0,$Y0,$Settings); - - $Offset = $i - $DataGapAngle; $ID--; - } - } - - if ( $WriteValues != NULL ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - $Settings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB,"Alpha"=>$ValueAlpha); - foreach($Values as $Key => $Value) - { - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - - if ( $ValuePosition == PIE_VALUE_OUTSIDE ) - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius+$ValuePadding) + $X; - $Yc = sin(($Angle-90)*PI/180) * (($Radius*$SkewFactor)+$ValuePadding) + $Y - $SliceHeight; - } - else - { - $Xc = cos(($Angle-90)*PI/180) * ($Radius)/2 + $X; - $Yc = sin(($Angle-90)*PI/180) * ($Radius*$SkewFactor)/2 + $Y - $SliceHeight; - } - - if ( $WriteValues == PIE_VALUE_PERCENTAGE ) - $Display = round(( 100 / $SerieSum ) * $Value)."%"; - elseif ( $WriteValues == PIE_VALUE_NATURAL ) - $Display = $Value.$ValueSuffix; - - $this->pChartObject->drawText($Xc,$Yc,$Display,$Settings); - - $Offset = $EndAngle - $DataGapAngle; $ID--; - } - } - - if ( $DrawLabels ) - { - $Step = 360 / (2 * PI * $Radius); - $Offset = 360; $ID = count($Values)-1; - foreach($Values as $Key => $Value) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $Radius + $X; - $Yc = sin(($Angle-90)*PI/180) * $Radius*$SkewFactor + $Y - $SliceHeight; - - if ( isset($Data["Series"][$Data["Abscissa"]]["Data"][$ID]) ) - { - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$ID]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$Radius,TRUE); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $EndAngle - $DataGapAngle; $ID--; - } - } - - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Draw the legend of pie chart */ - function drawPieLegend($X,$Y,$Format="") - { - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize; - $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->pChartObject->FontColorR; - $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->pChartObject->FontColorG; - $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->pChartObject->FontColorB; - $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $R = isset($Format["R"]) ? $Format["R"] : 200; - $G = isset($Format["G"]) ? $Format["G"] : 200; - $B = isset($Format["B"]) ? $Format["B"] : 200; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - - $YStep = max($this->pChartObject->FontSize,$BoxSize) + 5; - $XStep = $BoxSize + 5; - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value) - { - $BoxArray = $this->pChartObject->getTextBox($vX+$BoxSize+4,$vY+$BoxSize/2,$FontName,$FontSize,0,$Value); - - if ( $Mode == LEGEND_VERTICAL ) - { - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; } - $vY=$vY+$YStep; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$BoxSize/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$BoxSize/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$BoxSize/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$BoxSize/2; } - $vX=$Boundaries["R"]+$XStep; - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$BoxSize) < $TopOffset ) { $Boundaries["B"] = $vY+$BoxSize+$TopOffset; } - - if ( $Style == LEGEND_ROUND ) - $this->pChartObject->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - elseif ( $Style == LEGEND_BOX ) - $this->pChartObject->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; - foreach($Data["Series"][$Data["Abscissa"]]["Data"] as $Key => $Value) - { - $R = $Palette[$Key]["R"]; $G = $Palette[$Key]["G"]; $B = $Palette[$Key]["B"]; - - $this->pChartObject->drawFilledRectangle($X+1,$Y+1,$X+$BoxSize+1,$Y+$BoxSize+1,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->pChartObject->drawFilledRectangle($X,$Y,$X+$BoxSize,$Y+$BoxSize,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - if ( $Mode == LEGEND_VERTICAL ) - { - $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT,"FontName"=>$FontName,"FontSize"=>$FontSize)); - $Y=$Y+$YStep; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $BoxArray = $this->pChartObject->drawText($X+$BoxSize+4,$Y+$BoxSize/2,$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT,"FontName"=>$FontName,"FontSize"=>$FontSize)); - $X=$BoxArray[1]["X"]+2+$XStep; - } - } - - $this->Shadow = $RestoreShadow; - } - - /* Set the color of the specified slice */ - function setSliceColor($SliceID,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - - $this->pDataObject->Palette[$SliceID]["R"] = $R; - $this->pDataObject->Palette[$SliceID]["G"] = $G; - $this->pDataObject->Palette[$SliceID]["B"] = $B; - $this->pDataObject->Palette[$SliceID]["Alpha"] = $Alpha; - } - - /* Internally used compute the label positions */ - function writePieLabel($X,$Y,$Label,$Angle,$Settings,$Stacked,$Xc=0,$Yc=0,$Radius=0,$Reversed=FALSE) - { - $LabelOffset = 30; - $FontName = $this->pChartObject->FontName; - $FontSize = $this->pChartObject->FontSize; - - if ( !$Stacked ) - { - $Settings["Angle"] = 360-$Angle; - $Settings["Length"] = 25; - $Settings["Size"] = 8; - - $this->pChartObject->drawArrowLabel($X,$Y," ".$Label." ",$Settings); - } - else - { - $X2 = cos(deg2rad($Angle-90))*20+$X; - $Y2 = sin(deg2rad($Angle-90))*20+$Y; - - $TxtPos = $this->pChartObject->getTextBox($X,$Y,$FontName,$FontSize,0,$Label); - $Height = $TxtPos[0]["Y"] - $TxtPos[2]["Y"]; - $YTop = $Y2 - $Height/2 - 2; - $YBottom = $Y2 + $Height/2 + 2; - - if ( $this->LabelPos != "" ) - { - $Done = FALSE; - foreach($this->LabelPos as $Key => $Settings) - { - if ( !$Done ) - { - if ( $Angle <= 90 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(0,180,-($Height+2),$Reversed); $Done = TRUE; } - if ( $Angle > 90 && $Angle <= 180 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(0,180,-($Height+2),$Reversed); $Done = TRUE; } - if ( $Angle > 180 && $Angle <= 270 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(180,360,($Height+2),$Reversed); $Done = TRUE; } - if ( $Angle > 270 && $Angle <= 360 && (($YTop >= $Settings["YTop"] && $YTop <= $Settings["YBottom"]) || ($YBottom >= $Settings["YTop"] && $YBottom <= $Settings["YBottom"]))) - { $this->shift(180,360,($Height+2),$Reversed); $Done = TRUE; } - } - } - } - - $LabelSettings = array("YTop"=>$YTop,"YBottom"=>$YBottom,"Label"=>$Label,"Angle"=>$Angle,"X1"=>$X,"Y1"=>$Y,"X2"=>$X2,"Y2"=>$Y2); - if ( $Angle <= 180 ) { $LabelSettings["X3"] = $Xc+$Radius+$LabelOffset; } - if ( $Angle > 180 ) { $LabelSettings["X3"] = $Xc-$Radius-$LabelOffset; } - $this->LabelPos[] = $LabelSettings; - } - } - - /* Internally used to shift label positions */ - function shift($StartAngle,$EndAngle,$Offset,$Reversed) - { - if ( $Reversed ) { $Offset = -$Offset; } - foreach($this->LabelPos as $Key => $Settings) - { - if ( $Settings["Angle"] > $StartAngle && $Settings["Angle"] <= $EndAngle ) { $this->LabelPos[$Key]["YTop"] = $Settings["YTop"] + $Offset; $this->LabelPos[$Key]["YBottom"] = $Settings["YBottom"] + $Offset; $this->LabelPos[$Key]["Y2"] = $Settings["Y2"] + $Offset; } - } - } - - /* Internally used to write the re-computed labels */ - function writeShiftedLabels() - { - if ( $this->LabelPos == "" ) { return(0); } - foreach($this->LabelPos as $Key => $Settings) - { - $X1 = $Settings["X1"]; $Y1 = $Settings["Y1"]; - $X2 = $Settings["X2"]; $Y2 = $Settings["Y2"]; - $X3 = $Settings["X3"]; - $Angle = $Settings["Angle"]; - $Label = $Settings["Label"]; - - $this->pChartObject->drawArrow($X2,$Y2,$X1,$Y1,array("Size"=>8)); - if ( $Angle <= 180 ) - { - $this->pChartObject->drawLine($X2,$Y2,$X3,$Y2); - $this->pChartObject->drawText($X3+2,$Y2,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); - } - else - { - $this->pChartObject->drawLine($X2,$Y2,$X3,$Y2); - $this->pChartObject->drawText($X3-2,$Y2,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); - } - } - } - - /* Draw a ring chart */ - function draw2DRing($X,$Y,$Format="") - { - $OuterRadius = isset($Format["Radius"]) ? $Format["Radius"] : 60; - $InnerRadius = isset($Format["Radius"]) ? $Format["Radius"] : 30; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 100; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : NULL; //PIE_VALUE_PERCENTAGE - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 5; - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_OUTSIDE; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = 0; } // count($Values) - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) - { - $this->pChartObject->Shadow = FALSE; - - $ShadowFormat = $Format; $ShadowFormat["Shadow"] = TRUE; - $this->draw2DRing($X+$this->pChartObject->ShadowX,$Y+$this->pChartObject->ShadowY,$ShadowFormat); - } - - /* Draw the polygon pie elements */ - $Step = 360 / (2 * PI * $OuterRadius); - $Offset = 0; $ID = 0; - foreach($Values as $Key => $Value) - { - if ( $Shadow ) - { - $Settings = array("R"=>$this->pChartObject->ShadowR,"G"=>$this->pChartObject->ShadowG,"B"=>$this->pChartObject->ShadowB,"Alpha"=>$this->pChartObject->Shadowa); - $BorderColor = $Settings; - } - else - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - - if ( $Border ) - $BorderColor = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha); - else - $BorderColor = $Settings; - } - - $Plots = ""; $Boundaries = ""; $AAPixels = ""; - $EndAngle = $Offset+($Value*$ScaleFactor); if ( $EndAngle > 360 ) { $EndAngle = 360; } - for($i=$Offset;$i<=$EndAngle;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * $OuterRadius + $X; - $Yc = sin(($i-90)*PI/180) * $OuterRadius + $Y; - - if ( !isset($Boundaries[0]["X1"]) ) { $Boundaries[0]["X1"] = $Xc; $Boundaries[0]["Y1"] = $Yc; } - $AAPixels[] = array($Xc,$Yc); - - if ( $i<90 ) { $Yc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Plots[] = $Xc; $Plots[] = $Yc; - } - $Boundaries[1]["X1"] = $Xc; $Boundaries[1]["Y1"] = $Yc; - $Lasti = $EndAngle; - - for($i=$EndAngle;$i>=$Offset;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * ($InnerRadius-1) + $X; - $Yc = sin(($i-90)*PI/180) * ($InnerRadius-1) + $Y; - - if ( !isset($Boundaries[1]["X2"]) ) { $Boundaries[1]["X2"] = $Xc; $Boundaries[1]["Y2"] = $Yc; } - $AAPixels[] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * $InnerRadius + $X; - $Yc = sin(($i-90)*PI/180) * $InnerRadius + $Y; - - if ( $i<90 ) { $Yc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Plots[] = $Xc; $Plots[] = $Yc; - } - $Boundaries[0]["X2"] = $Xc; $Boundaries[0]["Y2"] = $Yc; - - /* Draw the polygon */ - $this->pChartObject->drawPolygon($Plots,$Settings); - if ( $RecordImageMap && !$Shadow ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Plots),$this->pChartObject->toHTMLColor($Palette[$ID]["R"],$Palette[$ID]["G"],$Palette[$ID]["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][$Key],$Value); } - - /* Smooth the edges using AA */ - foreach($AAPixels as $iKey => $Pos ) { $this->pChartObject->drawAntialiasPixel($Pos[0],$Pos[1],$BorderColor); } - $this->pChartObject->drawLine($Boundaries[0]["X1"],$Boundaries[0]["Y1"],$Boundaries[0]["X2"],$Boundaries[0]["Y2"],$BorderColor); - $this->pChartObject->drawLine($Boundaries[1]["X1"],$Boundaries[1]["Y1"],$Boundaries[1]["X2"],$Boundaries[1]["Y2"],$BorderColor); - - if ( $DrawLabels && !$Shadow ) - { - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * $OuterRadius + $X; - $Yc = sin(($Angle-90)*PI/180) * $OuterRadius + $Y; - - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,TRUE,$X,$Y,$OuterRadius); - else - $this->writePieLabel($Xc,$Yc,$Label,$Angle,$Settings,FALSE); - } - - $Offset = $Lasti; $ID++; - } - - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - if ( $WriteValues && !$Shadow ) - { - $Step = 360 / (2 * PI * $OuterRadius); - $Offset = 0; - foreach($Values as $Key => $Value) - { - $EndAngle = $Offset+($Value*$ScaleFactor); - if ( $EndAngle > 360 ) { $EndAngle = 360; } - - $Angle = $Offset+($Value*$ScaleFactor)/2; - if ( $ValuePosition == PIE_VALUE_OUTSIDE ) - { - $Xc = cos(($Angle-90)*PI/180) * ($OuterRadius+$ValuePadding) + $X; - $Yc = sin(($Angle-90)*PI/180) * ($OuterRadius+$ValuePadding) + $Y; - if ( $Angle >=0 && $Angle <= 90 ) { $Align = TEXT_ALIGN_BOTTOMLEFT; } - if ( $Angle > 90 && $Angle <= 180 ) { $Align = TEXT_ALIGN_TOPLEFT; } - if ( $Angle > 180 && $Angle <= 270 ) { $Align = TEXT_ALIGN_TOPRIGHT; } - if ( $Angle > 270 ) { $Align = TEXT_ALIGN_BOTTOMRIGHT; } - } - else - { - $Xc = cos(($Angle-90)*PI/180) * (($OuterRadius-$InnerRadius)/2+$InnerRadius) + $X; - $Yc = sin(($Angle-90)*PI/180) * (($OuterRadius-$InnerRadius)/2+$InnerRadius) + $Y; - $Align = TEXT_ALIGN_MIDDLEMIDDLE; - } - - if ( $WriteValues == PIE_VALUE_PERCENTAGE ) - $Display = round(( 100 / $SerieSum ) * $Value)."%"; - elseif ( $WriteValues == PIE_VALUE_NATURAL ) - $Display = $Value.$ValueSuffix; - - $this->pChartObject->drawText($Xc,$Yc,$Display,array("Align"=>$Align,"R"=>$ValueR,"G"=>$ValueG,"B"=>$ValueB)); - $Offset = $EndAngle; - } - } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Draw a 3D ring chart */ - function draw3DRing($X,$Y,$Format="") - { - /* Rendering layout */ - $OuterRadius = isset($Format["OuterRadius"]) ? $Format["OuterRadius"] : 100; - $InnerRadius = isset($Format["InnerRadius"]) ? $Format["InnerRadius"] : 30; - $SkewFactor = isset($Format["SkewFactor"]) ? $Format["SkewFactor"] : .6; - $SliceHeight = isset($Format["SliceHeight"]) ? $Format["SliceHeight"] : 10; - $DataGapAngle = isset($Format["DataGapAngle"]) ? $Format["DataGapAngle"] : 10; - $DataGapRadius = isset($Format["DataGapRadius"]) ? $Format["DataGapRadius"] : 10; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $Shadow = isset($Format["Shadow"]) ? $Format["Shadow"] : FALSE; - $DrawLabels = isset($Format["DrawLabels"]) ? $Format["DrawLabels"] : FALSE; - $LabelStacked = isset($Format["LabelStacked"]) ? $Format["LabelStacked"] : FALSE; - $LabelColor = isset($Format["LabelColor"]) ? $Format["LabelColor"] : PIE_LABEL_COLOR_MANUAL; - $LabelR = isset($Format["LabelR"]) ? $Format["LabelR"] : 0; - $LabelG = isset($Format["LabelG"]) ? $Format["LabelG"] : 0; - $LabelB = isset($Format["LabelB"]) ? $Format["LabelB"] : 0; - $LabelAlpha = isset($Format["LabelAlpha"]) ? $Format["LabelAlpha"] : 100; - $Cf = isset($Format["Cf"]) ? $Format["Cf"] : 20; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : NULL; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : $SliceHeight + 15; - $ValuePosition = isset($Format["ValuePosition"]) ? $Format["ValuePosition"] : PIE_VALUE_OUTSIDE; - $ValueSuffix = isset($Format["ValueSuffix"]) ? $Format["ValueSuffix"] : ""; - $ValueR = isset($Format["ValueR"]) ? $Format["ValueR"] : 255; - $ValueG = isset($Format["ValueG"]) ? $Format["ValueG"] : 255; - $ValueB = isset($Format["ValueB"]) ? $Format["ValueB"] : 255; - $ValueAlpha = isset($Format["ValueAlpha"]) ? $Format["ValueAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Error correction for overlaying rounded corners */ - if ( $SkewFactor < .5 ) { $SkewFactor = .5; } - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - /* Do we have an abscissa serie defined? */ - if ( $Data["Abscissa"] == "" ) { return(PIE_NO_ABSCISSA); } - - /* Try to find the data serie */ - $DataSerie = ""; - foreach ($Data["Series"] as $SerieName => $SerieData) - { if ( $SerieName != $Data["Abscissa"]) { $DataSerie = $SerieName; } } - - /* Do we have data to compute? */ - if ( $DataSerie == "" ) { return(PIE_NO_DATASERIE); } - - /* Remove unused data */ - list($Data,$Palette) = $this->clean0Values($Data,$Palette,$DataSerie,$Data["Abscissa"]); - - /* Compute the pie sum */ - $SerieSum = $this->pDataObject->getSum($DataSerie); - - /* Do we have data to draw? */ - if ( $SerieSum == 0 ) { return(PIE_SUMISNULL); } - - /* Dump the real number of data to draw */ - $Values = ""; - foreach ($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { if ($Value != 0) { $Values[] = $Value; } } - - /* Compute the wasted angular space between series */ - if (count($Values)==1) { $WastedAngular = 0; } else { $WastedAngular = count($Values) * $DataGapAngle; } - - /* Compute the scale */ - $ScaleFactor = (360 - $WastedAngular) / $SerieSum; - - $RestoreShadow = $this->pChartObject->Shadow; - if ( $this->pChartObject->Shadow ) { $this->pChartObject->Shadow = FALSE; } - - /* Draw the polygon ring elements */ - $Offset = 360; $ID = count($Values)-1; - $Values = array_reverse($Values); - $Slice = 0; $Slices = ""; $SliceColors = ""; $Visible = ""; $SliceAngle = ""; - foreach($Values as $Key => $Value) - { - if ( !isset($Palette[$ID]["R"]) ) { $Color = $this->pChartObject->getRandomColor(); $Palette[$ID] = $Color; $this->pDataObject->savePalette($ID,$Color); } - $Settings = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]); - - $SliceColors[$Slice] = $Settings; - - $StartAngle = $Offset; - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ( $StartAngle > 180 ) { $Visible[$Slice]["Start"] = TRUE; } else { $Visible[$Slice]["Start"] = TRUE; } - if ( $EndAngle < 180 ) { $Visible[$Slice]["End"] = FALSE; } else { $Visible[$Slice]["End"] = TRUE; } - - $Step = (360 / (2 * PI * $OuterRadius))/2; - $OutX1 = VOID; $OutY1 = VOID; - for($i=$Offset;$i>=$EndAngle;$i=$i-$Step) - { - $Xc = cos(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-2) + $X; - $Yc = sin(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-2)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-1) + $X; - $Yc = sin(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius-1)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius) + $X; - $Yc = sin(($i-90)*PI/180) * ($OuterRadius+$DataGapRadius)*$SkewFactor + $Y; - $this->pChartObject->drawAntialiasPixel($Xc,$Yc,$Settings); - - if ( $OutX1 == VOID ) { $OutX1 = $Xc; $OutY1 = $Yc; } - - if ( $i<90 ) { $Yc++; } - if ( $i>90 && $i<180 ) { $Xc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Slices[$Slice]["BottomPoly"][] = floor($Xc); $Slices[$Slice]["BottomPoly"][] = floor($Yc); - $Slices[$Slice]["TopPoly"][] = floor($Xc); $Slices[$Slice]["TopPoly"][] = floor($Yc)-$SliceHeight; - $Slices[$Slice]["Angle"][] = $i; - } - $OutX2 = $Xc; $OutY2 = $Yc; - - $Slices[$Slice]["Angle"][] = VOID; - $Lasti = $i; - - $Step = (360 / (2 * PI * $InnerRadius))/2; - $InX1 = VOID; $InY1 = VOID; - for($i=$EndAngle;$i<=$Offset;$i=$i+$Step) - { - $Xc = cos(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius-1) + $X; - $Yc = sin(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius-1)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - $Xc = cos(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius) + $X; - $Yc = sin(($i-90)*PI/180) * ($InnerRadius+$DataGapRadius)*$SkewFactor + $Y; - $Slices[$Slice]["AA"][] = array($Xc,$Yc); - - if ( $InX1 == VOID ) { $InX1 = $Xc; $InY1 = $Yc; } - - if ( $i<90 ) { $Yc++; } - if ( $i>90 && $i<180 ) { $Xc++; } - if ( $i>180 && $i<270 ) { $Xc++; } - if ( $i>=270 ) { $Xc++; $Yc++; } - - $Slices[$Slice]["BottomPoly"][] = floor($Xc); $Slices[$Slice]["BottomPoly"][] = floor($Yc); - $Slices[$Slice]["TopPoly"][] = floor($Xc); $Slices[$Slice]["TopPoly"][] = floor($Yc)-$SliceHeight; - $Slices[$Slice]["Angle"][] = $i; - } - $InX2 = $Xc; $InY2 = $Yc; - - $Slices[$Slice]["InX1"] = $InX1; $Slices[$Slice]["InY1"] = $InY1; - $Slices[$Slice]["InX2"] = $InX2; $Slices[$Slice]["InY2"] = $InY2; - $Slices[$Slice]["OutX1"] = $OutX1; $Slices[$Slice]["OutY1"] = $OutY1; - $Slices[$Slice]["OutX2"] = $OutX2; $Slices[$Slice]["OutY2"] = $OutY2; - - $Offset = $Lasti - $DataGapAngle; $ID--; $Slice++; - } - - /* Draw the bottom pie splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $this->pChartObject->drawPolygon($Plots["BottomPoly"],$Settings); - - foreach($Plots["AA"] as $Key => $Pos) - $this->pChartObject->drawAntialiasPixel($Pos[0],$Pos[1],$Settings); - - $this->pChartObject->drawLine($Plots["InX1"],$Plots["InY1"],$Plots["OutX2"],$Plots["OutY2"],$Settings); - $this->pChartObject->drawLine($Plots["InX2"],$Plots["InY2"],$Plots["OutX1"],$Plots["OutY1"],$Settings); - } - - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - - /* Draw the vertical edges (semi-visible) */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $StartAngle = $Plots["Angle"][0]; - foreach($Plots["Angle"] as $Key =>$Angle) { if ($Angle == VOID) { $EndAngle = $Plots["Angle"][$Key-1]; } } - - if ( $StartAngle >= 270 || $StartAngle <= 90 ) - $this->pChartObject->drawLine($Plots["OutX1"],$Plots["OutY1"],$Plots["OutX1"],$Plots["OutY1"]-$SliceHeight,$Settings); - if ( $StartAngle >= 270 || $StartAngle <= 90 ) - $this->pChartObject->drawLine($Plots["OutX2"],$Plots["OutY2"],$Plots["OutX2"],$Plots["OutY2"]-$SliceHeight,$Settings); - - $this->pChartObject->drawLine($Plots["InX1"],$Plots["InY1"],$Plots["InX1"],$Plots["InY1"]-$SliceHeight,$Settings); - $this->pChartObject->drawLine($Plots["InX2"],$Plots["InY2"],$Plots["InX2"],$Plots["InY2"]-$SliceHeight,$Settings); - } - - /* Draw the inner vertical slices */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $Outer = TRUE; $Inner = FALSE; - $InnerPlotsA = ""; $InnerPlotsB = ""; - foreach($Plots["Angle"] as $ID => $Angle) - { - if ( $Angle == VOID ) - { $Outer = FALSE; $Inner = TRUE; } - elseif( $Inner ) - { - if (( $Angle < 90 || $Angle > 270 ) && isset($Plots["BottomPoly"][$ID*2]) ) - { - $Xo = $Plots["BottomPoly"][$ID*2]; - $Yo = $Plots["BottomPoly"][$ID*2+1]; - - $InnerPlotsA[] = $Xo; $InnerPlotsA[] = $Yo; - $InnerPlotsB[] = $Xo; $InnerPlotsB[] = $Yo-$SliceHeight; - } - } - } - - if ( $InnerPlotsA != "" ) - { $InnerPlots = array_merge($InnerPlotsA,$this->arrayReverse($InnerPlotsB)); $this->pChartObject->drawPolygon($InnerPlots,$Settings); } - } - - - /* Draw the splice top and left poly */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf*1.5; $Settings["G"] = $Settings["G"]+$Cf*1.5; $Settings["B"] = $Settings["B"]+$Cf*1.5; - - $StartAngle = $Plots["Angle"][0]; - foreach($Plots["Angle"] as $Key =>$Angle) { if ($Angle == VOID) { $EndAngle = $Plots["Angle"][$Key-1]; } } - - if ( $StartAngle < 180 ) - { - $Points = ""; - $Points[] = $Plots["InX2"]; - $Points[] = $Plots["InY2"]; - $Points[] = $Plots["InX2"]; - $Points[] = $Plots["InY2"]-$SliceHeight; - $Points[] = $Plots["OutX1"]; - $Points[] = $Plots["OutY1"]-$SliceHeight; - $Points[] = $Plots["OutX1"]; - $Points[] = $Plots["OutY1"]; - - $this->pChartObject->drawPolygon($Points,$Settings); - } - - if ( $EndAngle > 180 ) - { - $Points = ""; - $Points[] = $Plots["InX1"]; - $Points[] = $Plots["InY1"]; - $Points[] = $Plots["InX1"]; - $Points[] = $Plots["InY1"]-$SliceHeight; - $Points[] = $Plots["OutX2"]; - $Points[] = $Plots["OutY2"]-$SliceHeight; - $Points[] = $Plots["OutX2"]; - $Points[] = $Plots["OutY2"]; - - $this->pChartObject->drawPolygon($Points,$Settings); - } - } - - - /* Draw the vertical edges (visible) */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $StartAngle = $Plots["Angle"][0]; - foreach($Plots["Angle"] as $Key =>$Angle) { if ($Angle == VOID) { $EndAngle = $Plots["Angle"][$Key-1]; } } - - if ( $StartAngle <= 270 && $StartAngle >= 90 ) - $this->pChartObject->drawLine($Plots["OutX1"],$Plots["OutY1"],$Plots["OutX1"],$Plots["OutY1"]-$SliceHeight,$Settings); - if ( $EndAngle <= 270 && $EndAngle >= 90 ) - $this->pChartObject->drawLine($Plots["OutX2"],$Plots["OutY2"],$Plots["OutX2"],$Plots["OutY2"]-$SliceHeight,$Settings); - } - - - /* Draw the outer vertical slices */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf; $Settings["G"] = $Settings["G"]+$Cf; $Settings["B"] = $Settings["B"]+$Cf; - - $Outer = TRUE; $Inner = FALSE; - $OuterPlotsA = ""; $OuterPlotsB = ""; $InnerPlotsA = ""; $InnerPlotsB = ""; - foreach($Plots["Angle"] as $ID => $Angle) - { - if ( $Angle == VOID ) - { $Outer = FALSE; $Inner = TRUE; } - elseif( $Outer ) - { - if ( ( $Angle > 90 && $Angle < 270 ) && isset($Plots["BottomPoly"][$ID*2]) ) - { - $Xo = $Plots["BottomPoly"][$ID*2]; - $Yo = $Plots["BottomPoly"][$ID*2+1]; - - $OuterPlotsA[] = $Xo; $OuterPlotsA[] = $Yo; - $OuterPlotsB[] = $Xo; $OuterPlotsB[] = $Yo-$SliceHeight; - } - } - } - if ( $OuterPlotsA != "" ) - { $OuterPlots = array_merge($OuterPlotsA,$this->arrayReverse($OuterPlotsB)); $this->pChartObject->drawPolygon($OuterPlots,$Settings); } - } - - $Slices = array_reverse($Slices); - $SliceColors = array_reverse($SliceColors); - - - /* Draw the top pie splice */ - foreach($Slices as $SliceID => $Plots) - { - $Settings = $SliceColors[$SliceID]; $Settings["NoBorder"] = TRUE; - $Settings["R"] = $Settings["R"]+$Cf*2; $Settings["G"] = $Settings["G"]+$Cf*2; $Settings["B"] = $Settings["B"]+$Cf*2; - - $this->pChartObject->drawPolygon($Plots["TopPoly"],$Settings); - -//print_r($Data["Series"][$Data["Abscissa"]]["Data"]); -//exit(); - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("POLY",$this->arraySerialize($Plots["TopPoly"]),$this->pChartObject->toHTMLColor($Settings["R"],$Settings["G"],$Settings["B"]),$Data["Series"][$Data["Abscissa"]]["Data"][$SliceID],$Data["Series"][$DataSerie]["Data"][count($Slices)-$SliceID-1]); } - - foreach($Plots["AA"] as $Key => $Pos) - $this->pChartObject->drawAntialiasPixel($Pos[0],$Pos[1]-$SliceHeight,$Settings); - - $this->pChartObject->drawLine($Plots["InX1"],$Plots["InY1"]-$SliceHeight,$Plots["OutX2"],$Plots["OutY2"]-$SliceHeight,$Settings); - $this->pChartObject->drawLine($Plots["InX2"],$Plots["InY2"]-$SliceHeight,$Plots["OutX1"],$Plots["OutY1"]-$SliceHeight,$Settings); - } - - if ( $DrawLabels ) - { - $Offset = 360; - foreach($Values as $Key => $Value) - { - $StartAngle = $Offset; - $EndAngle = $Offset-($Value*$ScaleFactor); if ( $EndAngle < 0 ) { $EndAngle = 0; } - - if ( $LabelColor == PIE_LABEL_COLOR_AUTO ) - { $Settings = array("FillR"=>$Palette[$ID]["R"],"FillG"=>$Palette[$ID]["G"],"FillB"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"]);} - else - { $Settings = array("FillR"=>$LabelR,"FillG"=>$LabelG,"FillB"=>$LabelB,"Alpha"=>$LabelAlpha); } - - $Angle = ($EndAngle - $Offset)/2 + $Offset; - $Xc = cos(($Angle-90)*PI/180) * ($OuterRadius+$DataGapRadius) + $X; - $Yc = sin(($Angle-90)*PI/180) * ($OuterRadius+$DataGapRadius)*$SkewFactor + $Y; - - $Label = $Data["Series"][$Data["Abscissa"]]["Data"][$Key]; - - if ( $LabelStacked ) - $this->writePieLabel($Xc,$Yc-$SliceHeight,$Label,$Angle,$Settings,TRUE,$X,$Y,$OuterRadius); - else - $this->writePieLabel($Xc,$Yc-$SliceHeight,$Label,$Angle,$Settings,FALSE); - - $Offset = $EndAngle - $DataGapAngle; $ID--; $Slice++; - } - } - if ( $DrawLabels && $LabelStacked ) { $this->writeShiftedLabels(); } - - $this->pChartObject->Shadow = $RestoreShadow; - - return(PIE_RENDERED); - } - - /* Serialize an array */ - function arraySerialize($Data) - { - $Result = ""; - foreach($Data as $Key => $Value) - { if ($Result == "") { $Result = floor($Value); } else { $Result = $Result.",".floor($Value); } } - - return($Result); - } - - /* Reverse an array */ - function arrayReverse($Plots) - { - $Result = ""; - - for($i=count($Plots)-1;$i>=0;$i=$i-2) - { $Result[] = $Plots[$i-1]; $Result[] = $Plots[$i]; } - - return($Result); - } - - /* Remove unused series & values */ - function clean0Values($Data,$Palette,$DataSerie,$AbscissaSerie) - { - $NewPalette = ""; $NewData = ""; $NewAbscissa = ""; - - /* Remove unused series */ - foreach($Data["Series"] as $SerieName => $SerieSettings) - { if ( $SerieName != $DataSerie && $SerieName != $AbscissaSerie ) { unset($Data["Series"][$SerieName]); } } - - /* Remove NULL values */ - foreach($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { - if ($Value != 0 ) - { - $NewData[] = $Value; - $NewAbscissa[] = $Data["Series"][$AbscissaSerie]["Data"][$Key]; - if ( isset($Palette[$Key]) ) { $NewPalette[] = $Palette[$Key]; } - } - } - $Data["Series"][$DataSerie]["Data"] = $NewData; - $Data["Series"][$AbscissaSerie]["Data"] = $NewAbscissa; - - return(array($Data,$NewPalette)); - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pRadar.class.php b/Under-Testing/Website/class/pRadar.class.php deleted file mode 100644 index 6235c99..0000000 --- a/Under-Testing/Website/class/pRadar.class.php +++ /dev/null @@ -1,669 +0,0 @@ -pChartObject = $Object; - - $AxisR = isset($Format["AxisR"]) ? $Format["AxisR"] : 60; - $AxisG = isset($Format["AxisG"]) ? $Format["AxisG"] : 60; - $AxisB = isset($Format["AxisB"]) ? $Format["AxisB"] : 60; - $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 50; - $AxisRotation = isset($Format["AxisRotation"]) ? $Format["AxisRotation"] : 0; - $DrawTicks = isset($Format["DrawTicks"]) ? $Format["DrawTicks"] : TRUE; - $TicksLength = isset($Format["TicksLength"]) ? $Format["TicksLength"] : 2; - $DrawAxisValues = isset($Format["DrawAxisValues"]) ? $Format["DrawAxisValues"] : TRUE; - $AxisBoxRounded = isset($Format["AxisBoxRounded"]) ? $Format["AxisBoxRounded"] : TRUE; - $AxisFontName = isset($Format["AxisFontName"]) ? $Format["AxisFontName"] : $this->pChartObject->FontName; - $AxisFontSize = isset($Format["AxisFontSize"]) ? $Format["AxisFontSize"] : $this->pChartObject->FontSize; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : FALSE; - $WriteValuesInBubble = isset($Format["WriteValuesInBubble"]) ? $Format["WriteValuesInBubble"] : TRUE; - $ValueFontName = isset($Format["ValueFontName"]) ? $Format["ValueFontName"] : $this->pChartObject->FontName; - $ValueFontSize = isset($Format["ValueFontSize"]) ? $Format["ValueFontSize"] : $this->pChartObject->FontSize; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 4; - $OuterBubbleRadius = isset($Format["OuterBubbleRadius"]) ? $Format["OuterBubbleRadius"] : 2; - $OuterBubbleR = isset($Format["OuterBubbleR"]) ? $Format["OuterBubbleR"] : VOID; - $OuterBubbleG = isset($Format["OuterBubbleG"]) ? $Format["OuterBubbleG"] : VOID; - $OuterBubbleB = isset($Format["OuterBubbleB"]) ? $Format["OuterBubbleB"] : VOID; - $OuterBubbleAlpha = isset($Format["OuterBubbleAlpha"]) ? $Format["OuterBubbleAlpha"] : 100; - $InnerBubbleR = isset($Format["InnerBubbleR"]) ? $Format["InnerBubbleR"] : 255; - $InnerBubbleG = isset($Format["InnerBubbleG"]) ? $Format["InnerBubbleG"] : 255; - $InnerBubbleB = isset($Format["InnerBubbleB"]) ? $Format["InnerBubbleB"] : 255; - $InnerBubbleAlpha = isset($Format["InnerBubbleAlpha"]) ? $Format["InnerBubbleAlpha"] : 100; - $DrawBackground = isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE; - $BackgroundR = isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255; - $BackgroundG = isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255; - $BackgroundB = isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255; - $BackgroundAlpha = isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 50; - $BackgroundGradient= isset($Format["BackgroundGradient"]) ? $Format["BackgroundGradient"] : NULL; - $Layout = isset($Format["Layout"]) ? $Format["Layout"] : RADAR_LAYOUT_STAR; - $SegmentHeight = isset($Format["SegmentHeight"]) ? $Format["SegmentHeight"] : SEGMENT_HEIGHT_AUTO; - $Segments = isset($Format["Segments"]) ? $Format["Segments"] : 4; - $WriteLabels = isset($Format["WriteLabels"]) ? $Format["WriteLabels"] : TRUE; - $SkipLabels = isset($Format["SkipLabels"]) ? $Format["SkipLabels"] : 1; - $LabelMiddle = isset($Format["LabelMiddle"]) ? $Format["LabelMiddle"] : FALSE; - $LabelsBackground = isset($Format["LabelsBackground"]) ? $Format["LabelsBackground"] : TRUE; - $LabelsBGR = isset($Format["LabelsBGR"]) ? $Format["LabelsBGR"] : 255; - $LabelsBGG = isset($Format["LabelsBGR"]) ? $Format["LabelsBGG"] : 255; - $LabelsBGB = isset($Format["LabelsBGR"]) ? $Format["LabelsBGB"] : 255; - $LabelsBGAlpha = isset($Format["LabelsBGAlpha"]) ? $Format["LabelsBGAlpha"] : 50; - $LabelPos = isset($Format["LabelPos"]) ? $Format["LabelPos"] : RADAR_LABELS_ROTATED; - $LabelPadding = isset($Format["LabelPadding"]) ? $Format["LabelPadding"] : 4; - $DrawPoints = isset($Format["DrawPoints"]) ? $Format["DrawPoints"] : TRUE; - $PointRadius = isset($Format["PointRadius"]) ? $Format["PointRadius"] : 4; - $PointSurrounding = isset($Format["PointRadius"]) ? $Format["PointRadius"] : -30; - $DrawLines = isset($Format["DrawLines"]) ? $Format["DrawLines"] : TRUE; - $LineLoopStart = isset($Format["LineLoopStart"]) ? $Format["LineLoopStart"] : TRUE; - $DrawPoly = isset($Format["DrawPoly"]) ? $Format["DrawPoly"] : FALSE; - $PolyAlpha = isset($Format["PolyAlpha"]) ? $Format["PolyAlpha"] : 40; - $FontSize = $Object->FontSize; - $X1 = $Object->GraphAreaX1; - $Y1 = $Object->GraphAreaY1; - $X2 = $Object->GraphAreaX2; - $Y2 = $Object->GraphAreaY2; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - /* Cancel default tick length if ticks not enabled */ - if ( $DrawTicks == FALSE ) { $TicksLength = 0; } - - /* Data Processing */ - $Data = $Values->getData(); - $Palette = $Values->getPalette(); - - /* Catch the number of required axis */ - $LabelSerie = $Data["Abscissa"]; - if ( $LabelSerie != "" ) - { $Points = count($Data["Series"][$LabelSerie]["Data"]); } - else - { - $Points = 0; - foreach($Data["Series"] as $SerieName => $DataArray) - { if ( count($DataArray["Data"]) > $Points ) { $Points = count($DataArray["Data"]); } } - } - - /* Draw the axis */ - $CenterX = ($X2-$X1)/2 + $X1; - $CenterY = ($Y2-$Y1)/2 + $Y1; - - $EdgeHeight = min(($X2-$X1)/2,($Y2-$Y1)/2); - if ( $WriteLabels ) - $EdgeHeight = $EdgeHeight - $FontSize - $LabelPadding - $TicksLength; - - /* Determine the scale if set to automatic */ - if ( $SegmentHeight == SEGMENT_HEIGHT_AUTO) - { - $Max = 0; - foreach($Data["Series"] as $SerieName => $DataArray) - { - if ( $SerieName != $LabelSerie ) - { - if ( max($DataArray["Data"]) > $Max ) { $Max = max($DataArray["Data"]); } - } - } - $MaxSegments = $EdgeHeight/20; - $Scale = $Object->computeScale(0,$Max,$MaxSegments,array(1,2,5)); - - $Segments = $Scale["Rows"]; - $SegmentHeight = $Scale["RowHeight"]; - } - - if ( $LabelMiddle && $SkipLabels == 1 ) - { $Axisoffset = (360/$Points)/2; } - elseif ( $LabelMiddle && $SkipLabels != 1 ) - { $Axisoffset = (360/($Points/$SkipLabels))/2; } - elseif ( !$LabelMiddle ) - { $Axisoffset = 0; } - - /* Background processing */ - if ( $DrawBackground ) - { - $RestoreShadow = $Object->Shadow; - $Object->Shadow = FALSE; - - if ($BackgroundGradient == NULL) - { - if ( $Layout == RADAR_LAYOUT_STAR ) - { - $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha); - $PointArray = ""; - for($i=0;$i<=360;$i=$i+(360/$Points)) - { - $PointArray[] = cos(deg2rad($i+$AxisRotation)) * $EdgeHeight + $CenterX; - $PointArray[] = sin(deg2rad($i+$AxisRotation)) * $EdgeHeight + $CenterY; - } - $Object->drawPolygon($PointArray,$Color); - } - elseif ( $Layout == RADAR_LAYOUT_CIRCLE ) - { - $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha); - $Object->drawFilledCircle($CenterX,$CenterY,$EdgeHeight,$Color); - } - } - else - { - $GradientROffset = ($BackgroundGradient["EndR"] - $BackgroundGradient["StartR"]) / $Segments; - $GradientGOffset = ($BackgroundGradient["EndG"] - $BackgroundGradient["StartG"]) / $Segments; - $GradientBOffset = ($BackgroundGradient["EndB"] - $BackgroundGradient["StartB"]) / $Segments; - $GradientAlphaOffset = ($BackgroundGradient["EndAlpha"] - $BackgroundGradient["StartAlpha"]) / $Segments; - - if ( $Layout == RADAR_LAYOUT_STAR ) - { - for($j=$Segments;$j>=1;$j--) - { - $Color = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j); - $PointArray = ""; - - for($i=0;$i<=360;$i=$i+(360/$Points)) - { - $PointArray[] = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX; - $PointArray[] = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY; - } - $Object->drawPolygon($PointArray,$Color); - } - } - elseif ( $Layout == RADAR_LAYOUT_CIRCLE ) - { - for($j=$Segments;$j>=1;$j--) - { - $Color = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j); - $Object->drawFilledCircle($CenterX,$CenterY,($EdgeHeight/$Segments)*$j,$Color); - } - } - } - $Object->Shadow = $RestoreShadow; - } - - /* Axis to axis lines */ - $Color = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha); - $ColorDotted = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha*.8, "Ticks"=>2); - if ( $Layout == RADAR_LAYOUT_STAR ) - { - for($j=1;$j<=$Segments;$j++) - { - for($i=0;$i<360;$i=$i+(360/$Points)) - { - $EdgeX1 = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX; - $EdgeY1 = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY; - $EdgeX2 = cos(deg2rad($i+$AxisRotation+(360/$Points))) * ($EdgeHeight/$Segments)*$j + $CenterX; - $EdgeY2 = sin(deg2rad($i+$AxisRotation+(360/$Points))) * ($EdgeHeight/$Segments)*$j + $CenterY; - - $Object->drawLine($EdgeX1,$EdgeY1,$EdgeX2,$EdgeY2,$Color); - } - } - } - elseif ( $Layout == RADAR_LAYOUT_CIRCLE ) - { - for($j=1;$j<=$Segments;$j++) - { - $Radius = ($EdgeHeight/$Segments)*$j; - $Object->drawCircle($CenterX,$CenterY,$Radius,$Radius,$Color); - } - } - - if ( $DrawAxisValues ) - { - if ( $LabelsBackground ) - $Options = array("DrawBox"=>TRUE, "Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"BoxR"=>$LabelsBGR,"BoxG"=>$LabelsBGG,"BoxB"=>$LabelsBGB,"BoxAlpha"=>$LabelsBGAlpha); - else - $Options = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE); - - if ( $AxisBoxRounded ) { $Options["BoxRounded"] = TRUE; } - - $Options["FontName"] = $AxisFontName; - $Options["FontSize"] = $AxisFontSize; - - $Angle = 360 / ($Points*2); - for($j=1;$j<=$Segments;$j++) - { - $Label = $j * $SegmentHeight; - - if ( $Layout == RADAR_LAYOUT_CIRCLE ) - { - $EdgeX1 = cos(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX; - $EdgeY1 = sin(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY; - } - elseif ( $Layout == RADAR_LAYOUT_STAR ) - { - $EdgeX1 = cos(deg2rad($AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX; - $EdgeY1 = sin(deg2rad($AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY; - $EdgeX2 = cos(deg2rad((360 / $Points) + $AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX; - $EdgeY2 = sin(deg2rad((360 / $Points) + $AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY; - - $EdgeX1 = ($EdgeX2 - $EdgeX1)/2 + $EdgeX1; - $EdgeY1 = ($EdgeY2 - $EdgeY1)/2 + $EdgeY1; - } - - $Object->drawText($EdgeX1,$EdgeY1,$Label,$Options); - } - } - - /* Axis lines */ - $ID = 0; - for($i=0;$i<360;$i=$i+(360/$Points)) - { - $EdgeX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterX; - $EdgeY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterY; - - if ($ID % $SkipLabels == 0) - { $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$Color); } - else - { $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$ColorDotted); } - - if ( $WriteLabels ) - { - $LabelX = cos(deg2rad($i+$AxisRotation+$Axisoffset)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterX; - $LabelY = sin(deg2rad($i+$AxisRotation+$Axisoffset)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterY; - - if ( $LabelSerie != "" ) - { $Label = isset($Data["Series"][$LabelSerie]["Data"][$ID]) ? $Data["Series"][$LabelSerie]["Data"][$ID] : ""; } - else - $Label = $ID; - - if ($ID % $SkipLabels == 0) - { - if ( $LabelPos == RADAR_LABELS_ROTATED ) - $Object->drawText($LabelX,$LabelY,$Label,array("Angle"=>(360-($i+$AxisRotation+$Axisoffset))-90,"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - else - { - if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); } - if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); } - if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); } - if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPLEFT)); } - if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT)); } - if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); } - if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPRIGHT)); } - if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); } - } - } - } - $ID++; - } - - /* Compute the plots position */ - $ID = 0; $Plot = ""; - foreach($Data["Series"] as $SerieName => $DataS) - { - if ( $SerieName != $LabelSerie ) - { - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding); - foreach($DataS["Data"] as $Key => $Value) - { - $Angle = (360/$Points) * $Key; - $Length = ($EdgeHeight/($Segments*$SegmentHeight))*$Value; - - $X = cos(deg2rad($Angle+$AxisRotation)) * $Length + $CenterX; - $Y = sin(deg2rad($Angle+$AxisRotation)) * $Length + $CenterY; - - $Plot[$ID][] = array($X,$Y,$Value); - - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".floor($PointRadius),$this->pChartObject->toHTMLColor($Palette[$ID]["R"],$Palette[$ID]["G"],$Palette[$ID]["B"]),$DataS["Description"],$Data["Series"][$LabelSerie]["Data"][$Key]." = ".$Value); } - } - $ID++; - } - } - - /* Draw all that stuff! */ - foreach($Plot as $ID => $Points) - { - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding); - - /* Draw the polygons */ - if ( $DrawPoly ) - { - if ($PolyAlpha != NULL) - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$PolyAlpha,"Surrounding"=>$PointSurrounding); - - $PointsArray = ""; - for($i=0; $idrawPolygon($PointsArray,$Color); - } - - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding); - - /* Bubble and labels settings */ - $TextSettings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontName"=>$ValueFontName,"FontSize"=>$ValueFontSize,"R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"]); - $InnerColor = array("R"=>$InnerBubbleR,"G"=>$InnerBubbleG,"B"=>$InnerBubbleB,"Alpha"=>$InnerBubbleAlpha); - if ( $OuterBubbleR != VOID ) - $OuterColor = array("R"=>$OuterBubbleR,"G"=>$OuterBubbleG,"B"=>$OuterBubbleB,"Alpha"=>$OuterBubbleAlpha); - else - $OuterColor = array("R"=>$Palette[$ID]["R"]+20,"G"=>$Palette[$ID]["G"]+20,"B"=>$Palette[$ID]["B"]+20,"Alpha"=>$Palette[$ID]["Alpha"]); - - /* Loop to the starting points if asked */ - if ( $LineLoopStart && $DrawLines ) - $Object->drawLine($Points[count($Points)-1][0],$Points[count($Points)-1][1],$Points[0][0],$Points[0][1],$Color); - - /* Draw the lines & points */ - for($i=0; $idrawLine($Points[$i][0],$Points[$i][1],$Points[$i+1][0],$Points[$i+1][1],$Color); - - if ( $DrawPoints ) - $Object->drawFilledCircle($Points[$i][0],$Points[$i][1],$PointRadius,$Color); - - if ( $WriteValuesInBubble && $WriteValues ) - { - $TxtPos = $this->pChartObject->getTextBox($Points[$i][0],$Points[$i][1],$ValueFontName,$ValueFontSize,0,$Points[$i][2]); - $Radius = floor(($TxtPos[1]["X"] - $TxtPos[0]["X"] + $ValuePadding*2)/2); - - $this->pChartObject->drawFilledCircle($Points[$i][0],$Points[$i][1],$Radius+$OuterBubbleRadius,$OuterColor); - $this->pChartObject->drawFilledCircle($Points[$i][0],$Points[$i][1],$Radius,$InnerColor); - } - - if ( $WriteValues ) - $this->pChartObject->drawText($Points[$i][0]-1,$Points[$i][1]-1,$Points[$i][2],$TextSettings); - } - } - } - - - - /* Draw a radar chart */ - function drawPolar($Object,$Values,$Format="") - { - $this->pChartObject = $Object; - - $AxisR = isset($Format["AxisR"]) ? $Format["AxisR"] : 60; - $AxisG = isset($Format["AxisG"]) ? $Format["AxisG"] : 60; - $AxisB = isset($Format["AxisB"]) ? $Format["AxisB"] : 60; - $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 50; - $AxisRotation = isset($Format["AxisRotation"]) ? $Format["AxisRotation"] : -90; - $DrawTicks = isset($Format["DrawTicks"]) ? $Format["DrawTicks"] : TRUE; - $TicksLength = isset($Format["TicksLength"]) ? $Format["TicksLength"] : 2; - $DrawAxisValues = isset($Format["DrawAxisValues"]) ? $Format["DrawAxisValues"] : TRUE; - $AxisBoxRounded = isset($Format["AxisBoxRounded"]) ? $Format["AxisBoxRounded"] : TRUE; - $AxisFontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName; - $AxisFontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize; - $WriteValues = isset($Format["WriteValues"]) ? $Format["WriteValues"] : FALSE; - $WriteValuesInBubble = isset($Format["WriteValuesInBubble"]) ? $Format["WriteValuesInBubble"] : TRUE; - $ValueFontName = isset($Format["ValueFontName"]) ? $Format["ValueFontName"] : $this->pChartObject->FontName; - $ValueFontSize = isset($Format["ValueFontSize"]) ? $Format["ValueFontSize"] : $this->pChartObject->FontSize; - $ValuePadding = isset($Format["ValuePadding"]) ? $Format["ValuePadding"] : 4; - $OuterBubbleRadius = isset($Format["OuterBubbleRadius"]) ? $Format["OuterBubbleRadius"] : 2; - $OuterBubbleR = isset($Format["OuterBubbleR"]) ? $Format["OuterBubbleR"] : VOID; - $OuterBubbleG = isset($Format["OuterBubbleG"]) ? $Format["OuterBubbleG"] : VOID; - $OuterBubbleB = isset($Format["OuterBubbleB"]) ? $Format["OuterBubbleB"] : VOID; - $OuterBubbleAlpha = isset($Format["OuterBubbleAlpha"]) ? $Format["OuterBubbleAlpha"] : 100; - $InnerBubbleR = isset($Format["InnerBubbleR"]) ? $Format["InnerBubbleR"] : 255; - $InnerBubbleG = isset($Format["InnerBubbleG"]) ? $Format["InnerBubbleG"] : 255; - $InnerBubbleB = isset($Format["InnerBubbleB"]) ? $Format["InnerBubbleB"] : 255; - $InnerBubbleAlpha = isset($Format["InnerBubbleAlpha"]) ? $Format["InnerBubbleAlpha"] : 100; - $DrawBackground = isset($Format["DrawBackground"]) ? $Format["DrawBackground"] : TRUE; - $BackgroundR = isset($Format["BackgroundR"]) ? $Format["BackgroundR"] : 255; - $BackgroundG = isset($Format["BackgroundG"]) ? $Format["BackgroundG"] : 255; - $BackgroundB = isset($Format["BackgroundB"]) ? $Format["BackgroundB"] : 255; - $BackgroundAlpha = isset($Format["BackgroundAlpha"]) ? $Format["BackgroundAlpha"] : 50; - $BackgroundGradient= isset($Format["BackgroundGradient"]) ? $Format["BackgroundGradient"] : NULL; - $AxisSteps = isset($Format["AxisSteps"]) ? $Format["AxisSteps"] : 20; - $SegmentHeight = isset($Format["SegmentHeight"]) ? $Format["SegmentHeight"] : SEGMENT_HEIGHT_AUTO; - $Segments = isset($Format["Segments"]) ? $Format["Segments"] : 4; - $WriteLabels = isset($Format["WriteLabels"]) ? $Format["WriteLabels"] : TRUE; - $LabelsBackground = isset($Format["LabelsBackground"]) ? $Format["LabelsBackground"] : TRUE; - $LabelsBGR = isset($Format["LabelsBGR"]) ? $Format["LabelsBGR"] : 255; - $LabelsBGG = isset($Format["LabelsBGR"]) ? $Format["LabelsBGG"] : 255; - $LabelsBGB = isset($Format["LabelsBGR"]) ? $Format["LabelsBGB"] : 255; - $LabelsBGAlpha = isset($Format["LabelsBGAlpha"]) ? $Format["LabelsBGAlpha"] : 50; - $LabelPos = isset($Format["LabelPos"]) ? $Format["LabelPos"] : RADAR_LABELS_ROTATED; - $LabelPadding = isset($Format["LabelPadding"]) ? $Format["LabelPadding"] : 4; - $DrawPoints = isset($Format["DrawPoints"]) ? $Format["DrawPoints"] : TRUE; - $PointRadius = isset($Format["PointRadius"]) ? $Format["PointRadius"] : 4; - $PointSurrounding = isset($Format["PointRadius"]) ? $Format["PointRadius"] : -30; - $DrawLines = isset($Format["DrawLines"]) ? $Format["DrawLines"] : TRUE; - $LineLoopStart = isset($Format["LineLoopStart"]) ? $Format["LineLoopStart"] : FALSE; - $DrawPoly = isset($Format["DrawPoly"]) ? $Format["DrawPoly"] : FALSE; - $PolyAlpha = isset($Format["PolyAlpha"]) ? $Format["PolyAlpha"] : NULL; - $FontSize = $Object->FontSize; - $X1 = $Object->GraphAreaX1; - $Y1 = $Object->GraphAreaY1; - $X2 = $Object->GraphAreaX2; - $Y2 = $Object->GraphAreaY2; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - - if ( $AxisBoxRounded ) { $DrawAxisValues = TRUE; } - - /* Cancel default tick length if ticks not enabled */ - if ( $DrawTicks == FALSE ) { $TicksLength = 0; } - - /* Data Processing */ - $Data = $Values->getData(); - $Palette = $Values->getPalette(); - - /* Catch the number of required axis */ - $LabelSerie = $Data["Abscissa"]; - if ( $LabelSerie != "" ) - { $Points = count($Data["Series"][$LabelSerie]["Data"]); } - else - { - $Points = 0; - foreach($Data["Series"] as $SerieName => $DataArray) - { if ( count($DataArray["Data"]) > $Points ) { $Points = count($DataArray["Data"]); } } - } - - /* Draw the axis */ - $CenterX = ($X2-$X1)/2 + $X1; - $CenterY = ($Y2-$Y1)/2 + $Y1; - - $EdgeHeight = min(($X2-$X1)/2,($Y2-$Y1)/2); - if ( $WriteLabels ) - $EdgeHeight = $EdgeHeight - $FontSize - $LabelPadding - $TicksLength; - - /* Determine the scale if set to automatic */ - if ( $SegmentHeight == SEGMENT_HEIGHT_AUTO) - { - $Max = 0; - foreach($Data["Series"] as $SerieName => $DataArray) - { - if ( $SerieName != $LabelSerie ) - { - if ( max($DataArray["Data"]) > $Max ) { $Max = max($DataArray["Data"]); } - } - } - $MaxSegments = $EdgeHeight/20; - $Scale = $Object->computeScale(0,$Max,$MaxSegments,array(1,2,5)); - - $Segments = $Scale["Rows"]; - $SegmentHeight = $Scale["RowHeight"]; - } - - - /* Background processing */ - if ( $DrawBackground ) - { - $RestoreShadow = $Object->Shadow; - $Object->Shadow = FALSE; - - if ($BackgroundGradient == NULL) - { - $Color = array("R"=>$BackgroundR,"G"=>$BackgroundG,"B"=>$BackgroundB,"Alpha"=>$BackgroundAlpha); - $Object->drawFilledCircle($CenterX,$CenterY,$EdgeHeight,$Color); - } - else - { - $GradientROffset = ($BackgroundGradient["EndR"] - $BackgroundGradient["StartR"]) / $Segments; - $GradientGOffset = ($BackgroundGradient["EndG"] - $BackgroundGradient["StartG"]) / $Segments; - $GradientBOffset = ($BackgroundGradient["EndB"] - $BackgroundGradient["StartB"]) / $Segments; - $GradientAlphaOffset = ($BackgroundGradient["EndAlpha"] - $BackgroundGradient["StartAlpha"]) / $Segments; - - for($j=$Segments;$j>=1;$j--) - { - $Color = array("R"=>$BackgroundGradient["StartR"]+$GradientROffset*$j,"G"=>$BackgroundGradient["StartG"]+$GradientGOffset*$j,"B"=>$BackgroundGradient["StartB"]+$GradientBOffset*$j,"Alpha"=>$BackgroundGradient["StartAlpha"]+$GradientAlphaOffset*$j); - $Object->drawFilledCircle($CenterX,$CenterY,($EdgeHeight/$Segments)*$j,$Color); - } - } - $Object->Shadow = $RestoreShadow; - } - - /* Axis to axis lines */ - $Color = array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha); - for($j=1;$j<=$Segments;$j++) - { - $Radius = ($EdgeHeight/$Segments)*$j; - $Object->drawCircle($CenterX,$CenterY,$Radius,$Radius,$Color); - } - - if ( $DrawAxisValues ) - { - if ( $LabelsBackground ) - $Options = array("DrawBox"=>TRUE, "Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"BoxR"=>$LabelsBGR,"BoxG"=>$LabelsBGG,"BoxB"=>$LabelsBGB,"BoxAlpha"=>$LabelsBGAlpha); - else - $Options = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE); - - if ( $AxisBoxRounded ) { $Options["BoxRounded"] = TRUE; } - - $Options["FontName"] = $AxisFontName; - $Options["FontSize"] = $AxisFontSize; - - $Angle = 360 / ($Points*2); - for($j=1;$j<=$Segments;$j++) - { - $EdgeX1 = cos(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterX; - $EdgeY1 = sin(deg2rad($Angle+$AxisRotation)) * ($EdgeHeight/$Segments)*$j + $CenterY; - $Label = $j*$SegmentHeight; - - $Object->drawText($EdgeX1,$EdgeY1,$Label,$Options); - } - } - - /* Axis lines */ - $ID = 0; - for($i=0;$i<=359;$i=$i+$AxisSteps) - { - $EdgeX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterX; - $EdgeY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$TicksLength) + $CenterY; - - $Object->drawLine($CenterX,$CenterY,$EdgeX,$EdgeY,$Color); - - if ( $WriteLabels ) - { - $LabelX = cos(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterX; - $LabelY = sin(deg2rad($i+$AxisRotation)) * ($EdgeHeight+$LabelPadding+$TicksLength) + $CenterY; - $Label = $i."°"; - - if ( $LabelPos == RADAR_LABELS_ROTATED ) - $Object->drawText($LabelX,$LabelY,$Label,array("Angle"=>(360-$i),"Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - else - { - if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); } - if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMLEFT)); } - if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); } - if ( (floor($LabelX) > floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPLEFT)); } - if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) < floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT)); } - if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) == floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); } - if ( (floor($LabelX) < floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPRIGHT)); } - if ( (floor($LabelX) == floor($CenterX)) && (floor($LabelY) > floor($CenterY)) ) { $Object->drawText($LabelX,$LabelY,$Label,array("Align"=>TEXT_ALIGN_TOPMIDDLE)); } - } - } - $ID++; - } - - /* Compute the plots position */ - $ID = 0; $Plot = ""; - foreach($Data["Series"] as $SerieName => $DataSet) - { - if ( $SerieName != $LabelSerie ) - { - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding); - foreach($DataSet["Data"] as $Key => $Value) - { - $Angle = $Data["Series"][$LabelSerie]["Data"][$Key]; - $Length = ($EdgeHeight/($Segments*$SegmentHeight))*$Value; - - $X = cos(deg2rad($Angle+$AxisRotation)) * $Length + $CenterX; - $Y = sin(deg2rad($Angle+$AxisRotation)) * $Length + $CenterY; - - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".floor($PointRadius),$this->pChartObject->toHTMLColor($Palette[$ID]["R"],$Palette[$ID]["G"],$Palette[$ID]["B"]),$DataSet["Description"],$Data["Series"][$LabelSerie]["Data"][$Key]."° = ".$Value); } - - $Plot[$ID][] = array($X,$Y,$Value); - } - $ID++; - } - } - - /* Draw all that stuff! */ - foreach($Plot as $ID => $Points) - { - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding); - - /* Draw the polygons */ - if ( $DrawPoly ) - { - if ($PolyAlpha != NULL) - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$PolyAlpha,"Surrounding"=>$PointSurrounding); - - $PointsArray = ""; - for($i=0; $idrawPolygon($PointsArray,$Color); - } - - $Color = array("R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"],"Alpha"=>$Palette[$ID]["Alpha"],"Surrounding"=>$PointSurrounding); - - /* Bubble and labels settings */ - $TextSettings = array("Align"=>TEXT_ALIGN_MIDDLEMIDDLE,"FontName"=>$ValueFontName,"FontSize"=>$ValueFontSize,"R"=>$Palette[$ID]["R"],"G"=>$Palette[$ID]["G"],"B"=>$Palette[$ID]["B"]); - $InnerColor = array("R"=>$InnerBubbleR,"G"=>$InnerBubbleG,"B"=>$InnerBubbleB,"Alpha"=>$InnerBubbleAlpha); - if ( $OuterBubbleR != VOID ) - $OuterColor = array("R"=>$OuterBubbleR,"G"=>$OuterBubbleG,"B"=>$OuterBubbleB,"Alpha"=>$OuterBubbleAlpha); - else - $OuterColor = array("R"=>$Palette[$ID]["R"]+20,"G"=>$Palette[$ID]["G"]+20,"B"=>$Palette[$ID]["B"]+20,"Alpha"=>$Palette[$ID]["Alpha"]); - - /* Loop to the starting points if asked */ - if ( $LineLoopStart && $DrawLines ) - $Object->drawLine($Points[count($Points)-1][0],$Points[count($Points)-1][1],$Points[0][0],$Points[0][1],$Color); - - /* Draw the lines & points */ - for($i=0; $idrawLine($Points[$i][0],$Points[$i][1],$Points[$i+1][0],$Points[$i+1][1],$Color); - - if ( $DrawPoints ) - $Object->drawFilledCircle($Points[$i][0],$Points[$i][1],$PointRadius,$Color); - - if ( $WriteValuesInBubble && $WriteValues ) - { - $TxtPos = $this->pChartObject->getTextBox($Points[$i][0],$Points[$i][1],$ValueFontName,$ValueFontSize,0,$Points[$i][2]); - $Radius = floor(($TxtPos[1]["X"] - $TxtPos[0]["X"] + $ValuePadding*2)/2); - - $this->pChartObject->drawFilledCircle($Points[$i][0],$Points[$i][1],$Radius+$OuterBubbleRadius,$OuterColor); - $this->pChartObject->drawFilledCircle($Points[$i][0],$Points[$i][1],$Radius,$InnerColor); - } - - if ( $WriteValues ) - $this->pChartObject->drawText($Points[$i][0]-1,$Points[$i][1]-1,$Points[$i][2],$TextSettings); - } - } - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pScatter.class.php b/Under-Testing/Website/class/pScatter.class.php deleted file mode 100644 index 55ef1c7..0000000 --- a/Under-Testing/Website/class/pScatter.class.php +++ /dev/null @@ -1,954 +0,0 @@ -pChartObject = $pChartObject; - $this->pDataObject = $pDataObject; - } - - /* Prepare the scale */ - function drawScatterScale($Format="") - { - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : SCALE_MODE_FLOATING; - $Floating = isset($Format["Floating"]) ? $Format["Floating"] : FALSE; - $XLabelsRotation = isset($Format["XLabelsRotation"]) ? $Format["XLabelsRotation"] : 90; - $MinDivHeight = isset($Format["MinDivHeight"]) ? $Format["MinDivHeight"] : 20; - $Factors = isset($Format["Factors"]) ? $Format["Factors"] : array(1,2,5); - $ManualScale = isset($Format["ManualScale"]) ? $Format["ManualScale"] : array("0"=>array("Min"=>-100,"Max"=>100)); - $XMargin = isset($Format["XMargin"]) ? $Format["XMargin"] : 0; - $YMargin = isset($Format["YMargin"]) ? $Format["YMargin"] : 0; - $ScaleSpacing = isset($Format["ScaleSpacing"]) ? $Format["ScaleSpacing"] : 15; - $InnerTickWidth = isset($Format["InnerTickWidth"]) ? $Format["InnerTickWidth"] : 2; - $OuterTickWidth = isset($Format["OuterTickWidth"]) ? $Format["OuterTickWidth"] : 2; - $DrawXLines = isset($Format["DrawXLines"]) ? $Format["DrawXLines"] : ALL; - $DrawYLines = isset($Format["DrawYLines"]) ? $Format["DrawYLines"] : ALL; - $GridTicks = isset($Format["GridTicks"]) ? $Format["GridTicks"] : 4; - $GridR = isset($Format["GridR"]) ? $Format["GridR"] : 255; - $GridG = isset($Format["GridG"]) ? $Format["GridG"] : 255; - $GridB = isset($Format["GridB"]) ? $Format["GridB"] : 255; - $GridAlpha = isset($Format["GridAlpha"]) ? $Format["GridAlpha"] : 40; - $AxisRo = isset($Format["AxisR"]) ? $Format["AxisR"] : 0; - $AxisGo = isset($Format["AxisG"]) ? $Format["AxisG"] : 0; - $AxisBo = isset($Format["AxisB"]) ? $Format["AxisB"] : 0; - $AxisAlpha = isset($Format["AxisAlpha"]) ? $Format["AxisAlpha"] : 100; - $TickRo = isset($Format["TickR"]) ? $Format["TickR"] : 0; - $TickGo = isset($Format["TickG"]) ? $Format["TickG"] : 0; - $TickBo = isset($Format["TickB"]) ? $Format["TickB"] : 0; - $TickAlpha = isset($Format["TickAlpha"]) ? $Format["TickAlpha"] : 100; - $DrawSubTicks = isset($Format["DrawSubTicks"]) ? $Format["DrawSubTicks"] : FALSE; - $InnerSubTickWidth = isset($Format["InnerSubTickWidth"]) ? $Format["InnerSubTickWidth"] : 0; - $OuterSubTickWidth = isset($Format["OuterSubTickWidth"]) ? $Format["OuterSubTickWidth"] : 2; - $SubTickR = isset($Format["SubTickR"]) ? $Format["SubTickR"] : 255; - $SubTickG = isset($Format["SubTickG"]) ? $Format["SubTickG"] : 0; - $SubTickB = isset($Format["SubTickB"]) ? $Format["SubTickB"] : 0; - $SubTickAlpha = isset($Format["SubTickAlpha"]) ? $Format["SubTickAlpha"] : 100; - $XReleasePercent = isset($Format["XReleasePercent"]) ? $Format["XReleasePercent"] : 1; - $DrawArrows = isset($Format["DrawArrows"]) ? $Format["DrawArrows"] : FALSE; - $ArrowSize = isset($Format["ArrowSize"]) ? $Format["ArrowSize"] : 8; - $CycleBackground = isset($Format["CycleBackground"]) ? $Format["CycleBackground"] : FALSE; - $BackgroundR1 = isset($Format["BackgroundR1"]) ? $Format["BackgroundR1"] : 255; - $BackgroundG1 = isset($Format["BackgroundG1"]) ? $Format["BackgroundG1"] : 255; - $BackgroundB1 = isset($Format["BackgroundB1"]) ? $Format["BackgroundB1"] : 255; - $BackgroundAlpha1 = isset($Format["BackgroundAlpha1"]) ? $Format["BackgroundAlpha1"] : 10; - $BackgroundR2 = isset($Format["BackgroundR2"]) ? $Format["BackgroundR2"] : 230; - $BackgroundG2 = isset($Format["BackgroundG2"]) ? $Format["BackgroundG2"] : 230; - $BackgroundB2 = isset($Format["BackgroundB2"]) ? $Format["BackgroundB2"] : 230; - $BackgroundAlpha2 = isset($Format["BackgroundAlpha2"]) ? $Format["BackgroundAlpha2"] : 10; - - /* Check if we have at least both one X and Y axis */ - $GotXAxis = FALSE; $GotYAxis = FALSE; - foreach($this->pDataObject->Data["Axis"] as $AxisID => $AxisSettings) - { - if ( $AxisSettings["Identity"] == AXIS_X ) { $GotXAxis = TRUE; } - if ( $AxisSettings["Identity"] == AXIS_Y ) { $GotYAxis = TRUE; } - } - if ( !$GotXAxis ) { return(SCATTER_MISSING_X_SERIE); } - if ( !$GotYAxis ) { return(SCATTER_MISSING_Y_SERIE); } - - /* Skip a NOTICE event in case of an empty array */ - if ( $DrawYLines == NONE ) { $DrawYLines = array("zarma"=>"31"); } - - $Data = $this->pDataObject->getData(); - - foreach($Data["Axis"] as $AxisID => $AxisSettings) - { - if ( $AxisSettings["Identity"] == AXIS_X) - { $Width = $this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1 - $XMargin*2; } - else - { $Width = $this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1 - $YMargin*2; } - - $AxisMin = ABSOLUTE_MAX; $AxisMax = OUT_OF_SIGHT; - if ( $Mode == SCALE_MODE_FLOATING ) - { - foreach($Data["Series"] as $SerieID => $SerieParameter) - { - if ( $SerieParameter["Axis"] == $AxisID && $Data["Series"][$SerieID]["isDrawable"] ) - { - $AxisMax = max($AxisMax,$Data["Series"][$SerieID]["Max"]); - $AxisMin = min($AxisMin,$Data["Series"][$SerieID]["Min"]); - } - } - $AutoMargin = (($AxisMax-$AxisMin)/100)*$XReleasePercent; - - $Data["Axis"][$AxisID]["Min"] = $AxisMin-$AutoMargin; $Data["Axis"][$AxisID]["Max"] = $AxisMax+$AutoMargin; - } - elseif ( $Mode == SCALE_MODE_MANUAL ) - { - if ( isset($ManualScale[$AxisID]["Min"]) && isset($ManualScale[$AxisID]["Max"]) ) - { - $Data["Axis"][$AxisID]["Min"] = $ManualScale[$AxisID]["Min"]; - $Data["Axis"][$AxisID]["Max"] = $ManualScale[$AxisID]["Max"]; - } - else - { echo "Manual scale boundaries not set."; exit(); } - } - - /* Full manual scale */ - if ( isset($ManualScale[$AxisID]["Rows"]) && isset($ManualScale[$AxisID]["RowHeight"]) ) - $Scale = array("Rows"=>$ManualScale[$AxisID]["Rows"],"RowHeight"=>$ManualScale[$AxisID]["RowHeight"],"XMin"=>$ManualScale[$AxisID]["Min"],"XMax"=>$ManualScale[$AxisID]["Max"]); - else - { - $MaxDivs = floor($Width/$MinDivHeight); - $Scale = $this->pChartObject->computeScale($Data["Axis"][$AxisID]["Min"],$Data["Axis"][$AxisID]["Max"],$MaxDivs,$Factors,$AxisID); - } - - $Data["Axis"][$AxisID]["Margin"] = $AxisSettings["Identity"] == AXIS_X ? $XMargin : $YMargin; - $Data["Axis"][$AxisID]["ScaleMin"] = $Scale["XMin"]; - $Data["Axis"][$AxisID]["ScaleMax"] = $Scale["XMax"]; - $Data["Axis"][$AxisID]["Rows"] = $Scale["Rows"]; - $Data["Axis"][$AxisID]["RowHeight"] = $Scale["RowHeight"]; - - if ( isset($Scale["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = $Scale["Format"]; } - - if ( !isset($Data["Axis"][$AxisID]["Display"]) ) { $Data["Axis"][$AxisID]["Display"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Format"]) ) { $Data["Axis"][$AxisID]["Format"] = NULL; } - if ( !isset($Data["Axis"][$AxisID]["Unit"]) ) { $Data["Axis"][$AxisID]["Unit"] = NULL; } - } - - /* Get the default font color */ - $FontColorRo = $this->pChartObject->FontColorR; $FontColorGo = $this->pChartObject->FontColorG; $FontColorBo = $this->pChartObject->FontColorB; - - /* Set the original boundaries */ - $AxisPos["L"] = $this->pChartObject->GraphAreaX1; $AxisPos["R"] = $this->pChartObject->GraphAreaX2; $AxisPos["T"] = $this->pChartObject->GraphAreaY1; $AxisPos["B"] = $this->pChartObject->GraphAreaY2; - - foreach($Data["Axis"] as $AxisID => $AxisSettings) - { - if ( isset($AxisSettings["Color"]) ) - { - $AxisR = $AxisSettings["Color"]["R"]; $AxisG = $AxisSettings["Color"]["G"]; $AxisB = $AxisSettings["Color"]["B"]; - $TickR = $AxisSettings["Color"]["R"]; $TickG = $AxisSettings["Color"]["G"]; $TickB = $AxisSettings["Color"]["B"]; - $this->pChartObject->setFontProperties(array("R"=>$AxisSettings["Color"]["R"],"G"=>$AxisSettings["Color"]["G"],"B"=>$AxisSettings["Color"]["B"])); - } - else - { - $AxisR = $AxisRo; $AxisG = $AxisGo; $AxisB = $AxisBo; - $TickR = $TickRo; $TickG = $TickGo; $TickB = $TickBo; - $this->pChartObject->setFontProperties(array("R"=>$FontColorRo,"G"=>$FontColorGo,"B"=>$FontColorBo)); - } - - $LastValue = "w00t"; $ID = 1; - if ( $AxisSettings["Identity"] == AXIS_X ) - { - if ( $AxisSettings["Position"] == AXIS_POSITION_BOTTOM ) - { - if ( $XLabelsRotation == 0 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 2; } - if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; } - if ( $XLabelsRotation == 180 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 5; } - if ( $XLabelsRotation > 180 && $XLabelsRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; } - - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["B"],$this->pChartObject->GraphAreaX2,$AxisPos["B"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["B"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["B"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2; - $Step = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxBottom = $AxisPos["B"]; - $LastX = NULL; - for($i=0;$i<=$AxisSettings["Rows"];$i++) - { - $XPos = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i; - $YPos = $AxisPos["B"]; - $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastX != NULL && $CycleBackground && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); } - - if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - if ( $DrawSubTicks && $i != $AxisSettings["Rows"] ) - $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$InnerSubTickWidth,$XPos+$SubTicksSize,$YPos+$OuterSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->pChartObject->drawLine($XPos,$YPos-$InnerTickWidth,$XPos,$YPos+$OuterTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->pChartObject->drawText($XPos,$YPos+$OuterTickWidth+$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign)); - $TxtBottom = $YPos+2+$OuterTickWidth+2+($Bounds[0]["Y"]-$Bounds[2]["Y"]); - $MaxBottom = max($MaxBottom,$TxtBottom); - - $LastX = $XPos; - } - - if ( isset($AxisSettings["Name"]) ) - { - $YPos = $MaxBottom+2; - $XPos = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2; - $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_TOPMIDDLE)); - $MaxBottom = $Bounds[0]["Y"]; - - $this->pDataObject->Data["GraphArea"]["Y2"] = $MaxBottom + $this->pChartObject->FontSize; - } - - $AxisPos["B"] = $MaxBottom + $ScaleSpacing; - } - elseif ( $AxisSettings["Position"] == AXIS_POSITION_TOP ) - { - if ( $XLabelsRotation == 0 ) { $LabelAlign = TEXT_ALIGN_BOTTOMMIDDLE; $LabelOffset = 2; } - if ( $XLabelsRotation > 0 && $XLabelsRotation < 190 ) { $LabelAlign = TEXT_ALIGN_MIDDLELEFT; $LabelOffset = 2; } - if ( $XLabelsRotation == 180 ) { $LabelAlign = TEXT_ALIGN_TOPMIDDLE; $LabelOffset = 5; } - if ( $XLabelsRotation > 180 && $SLabelxRotation < 360 ) { $LabelAlign = TEXT_ALIGN_MIDDLERIGHT; $LabelOffset = 5; } - - if ( $Floating ) - { $FloatingOffset = $YMargin; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1,$AxisPos["T"],$this->pChartObject->GraphAreaX2,$AxisPos["T"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->pChartObject->drawArrow($this->pChartObject->GraphAreaX2-$AxisSettings["Margin"],$AxisPos["T"],$this->pChartObject->GraphAreaX2+($ArrowSize*2),$AxisPos["T"],array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Width = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $AxisSettings["Margin"]*2; - $Step = $Width / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinTop = $AxisPos["T"]; - $LastX = NULL; - for($i=0;$i<=$AxisSettings["Rows"];$i++) - { - $XPos = $this->pChartObject->GraphAreaX1 + $AxisSettings["Margin"] + $Step*$i; - $YPos = $AxisPos["T"]; - $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastX != NULL && $CycleBackground && ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) )) { $this->pChartObject->drawFilledRectangle($LastX,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,$BGColor); } - - if ( $DrawXLines == ALL || in_array($AxisID,$DrawXLines) ) { $this->pChartObject->drawLine($XPos,$this->pChartObject->GraphAreaY1+$FloatingOffset,$XPos,$this->pChartObject->GraphAreaY2-$FloatingOffset,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $AxisSettings["Rows"] ) - $this->pChartObject->drawLine($XPos+$SubTicksSize,$YPos-$OuterSubTickWidth,$XPos+$SubTicksSize,$YPos+$InnerSubTickWidth,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->pChartObject->drawLine($XPos,$YPos-$OuterTickWidth,$XPos,$YPos+$InnerTickWidth,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->pChartObject->drawText($XPos,$YPos-$OuterTickWidth-$LabelOffset,$Value,array("Angle"=>$XLabelsRotation,"Align"=>$LabelAlign)); - $TxtBox = $YPos-$OuterTickWidth-4-($Bounds[0]["Y"]-$Bounds[2]["Y"]); - $MinTop = min($MinTop,$TxtBox); - - $LastX = $XPos; - } - - if ( isset($AxisSettings["Name"]) ) - { - $YPos = $MinTop-2; - $XPos = $this->pChartObject->GraphAreaX1+($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1)/2; - $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE)); - $MinTop = $Bounds[2]["Y"]; - - $this->pDataObject->Data["GraphArea"]["Y1"] = $MinTop; - } - - $AxisPos["T"] = $MinTop - $ScaleSpacing; - } - } - elseif ( $AxisSettings["Identity"] == AXIS_Y ) - { - if ( $AxisSettings["Position"] == AXIS_POSITION_LEFT ) - { - - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["L"],$this->pChartObject->GraphAreaY1,$AxisPos["L"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["L"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["L"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2; - $Step = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MinLeft = $AxisPos["L"]; - $LastY = NULL; - for($i=0;$i<=$AxisSettings["Rows"];$i++) - { - $YPos = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i; - $XPos = $AxisPos["L"]; - $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); } - - if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $AxisSettings["Rows"] ) - $this->pChartObject->drawLine($XPos-$OuterSubTickWidth,$YPos-$SubTicksSize,$XPos+$InnerSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->pChartObject->drawLine($XPos-$OuterTickWidth,$YPos,$XPos+$InnerTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->pChartObject->drawText($XPos-$OuterTickWidth-2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLERIGHT)); - $TxtLeft = $XPos-$OuterTickWidth-2-($Bounds[1]["X"]-$Bounds[0]["X"]); - $MinLeft = min($MinLeft,$TxtLeft); - - $LastY = $YPos; - } - - if ( isset($AxisSettings["Name"]) ) - { - $XPos = $MinLeft-2; - $YPos = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2; - $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>90)); - $MinLeft = $Bounds[2]["X"]; - - $this->pDataObject->Data["GraphArea"]["X1"] = $MinLeft; - } - - $AxisPos["L"] = $MinLeft - $ScaleSpacing; - } - elseif ( $AxisSettings["Position"] == AXIS_POSITION_RIGHT ) - { - - if ( $Floating ) - { $FloatingOffset = $XMargin; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY2-$AxisSettings["Margin"],array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - else - { $FloatingOffset = 0; $this->pChartObject->drawLine($AxisPos["R"],$this->pChartObject->GraphAreaY1,$AxisPos["R"],$this->pChartObject->GraphAreaY2,array("R"=>$AxisR,"G"=>$AxisG,"B"=>$AxisB,"Alpha"=>$AxisAlpha)); } - - if ( $DrawArrows ) { $this->pChartObject->drawArrow($AxisPos["R"],$this->pChartObject->GraphAreaY1+$AxisSettings["Margin"],$AxisPos["R"],$this->pChartObject->GraphAreaY1-($ArrowSize*2),array("FillR"=>$AxisR,"FillG"=>$AxisG,"FillB"=>$AxisB,"Size"=>$ArrowSize)); } - - $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $AxisSettings["Margin"]*2; - $Step = $Height / $AxisSettings["Rows"]; $SubTicksSize = $Step /2; $MaxLeft = $AxisPos["R"]; - $LastY = NULL; - for($i=0;$i<=$AxisSettings["Rows"];$i++) - { - $YPos = $this->pChartObject->GraphAreaY2 - $AxisSettings["Margin"] - $Step*$i; - $XPos = $AxisPos["R"]; - $Value = $this->pChartObject->scaleFormat($AxisSettings["ScaleMin"] + $AxisSettings["RowHeight"]*$i,$AxisSettings["Display"],$AxisSettings["Format"],$AxisSettings["Unit"]); - - if ( $i%2 == 1 ) { $BGColor = array("R"=>$BackgroundR1,"G"=>$BackgroundG1,"B"=>$BackgroundB1,"Alpha"=>$BackgroundAlpha1); } else { $BGColor = array("R"=>$BackgroundR2,"G"=>$BackgroundG2,"B"=>$BackgroundB2,"Alpha"=>$BackgroundAlpha2); } - if ( $LastY != NULL && $CycleBackground && ( $DrawYLines == ALL || in_array($AxisID,$DrawYLines) )) { $this->pChartObject->drawFilledRectangle($this->pChartObject->GraphAreaX1+$FloatingOffset,$LastY,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,$BGColor); } - - if ( ($YPos != $this->pChartObject->GraphAreaY1 && $YPos != $this->pChartObject->GraphAreaY2) && ($DrawYLines == ALL || in_array($AxisID,$DrawYLines)) ) { $this->pChartObject->drawLine($this->pChartObject->GraphAreaX1+$FloatingOffset,$YPos,$this->pChartObject->GraphAreaX2-$FloatingOffset,$YPos,array("R"=>$GridR,"G"=>$GridG,"B"=>$GridB,"Alpha"=>$GridAlpha,"Ticks"=>$GridTicks)); } - - if ( $DrawSubTicks && $i != $AxisSettings["Rows"] ) - $this->pChartObject->drawLine($XPos-$InnerSubTickWidth,$YPos-$SubTicksSize,$XPos+$OuterSubTickWidth,$YPos-$SubTicksSize,array("R"=>$SubTickR,"G"=>$SubTickG,"B"=>$SubTickB,"Alpha"=>$SubTickAlpha)); - - $this->pChartObject->drawLine($XPos-$InnerTickWidth,$YPos,$XPos+$OuterTickWidth,$YPos,array("R"=>$TickR,"G"=>$TickG,"B"=>$TickB,"Alpha"=>$TickAlpha)); - $Bounds = $this->pChartObject->drawText($XPos+$OuterTickWidth+2,$YPos,$Value,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); - $TxtLeft = $XPos+$OuterTickWidth+2+($Bounds[1]["X"]-$Bounds[0]["X"]); - $MaxLeft = max($MaxLeft,$TxtLeft); - - $LastY = $YPos; - } - - if ( isset($AxisSettings["Name"]) ) - { - $XPos = $MaxLeft+6; - $YPos = $this->pChartObject->GraphAreaY1+($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1)/2; - $Bounds = $this->pChartObject->drawText($XPos,$YPos,$AxisSettings["Name"],array("Align"=>TEXT_ALIGN_BOTTOMMIDDLE,"Angle"=>270)); - $MaxLeft = $Bounds[2]["X"]; - - $this->pDataObject->Data["GraphArea"]["X2"] = $MaxLeft + $this->pChartObject->FontSize; - } - - $AxisPos["R"] = $MaxLeft + $ScaleSpacing; - } - } - } - - $this->pDataObject->saveAxisConfig($Data["Axis"]); - } - - /* Draw a scatter plot chart */ - function drawScatterPlotChart($Format=NULL) - { - $PlotSize = isset($Format["PlotSize"]) ? $Format["PlotSize"] : 3; - $PlotBorder = isset($Format["PlotBorder"]) ? $Format["PlotBorder"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 250; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 250; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 250; - $BorderAlpha = isset($Format["BorderAlpha"]) ? $Format["BorderAlpha"] : 30; - $BorderSize = isset($Format["BorderSize"]) ? $Format["BorderSize"] : 1; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapTitle = isset($Format["ImageMapTitle"]) ? $Format["ImageMapTitle"] : NULL; - $ImageMapPrecision = isset($Format["ImageMapPrecision"]) ? $Format["ImageMapPrecision"] : 2; - - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - $BorderColor = array("R"=>$BorderR,"G"=>$BorderG,"B"=>$BorderB,"Alpha"=>$BorderAlpha); - - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE ) - { - $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"]; - $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"]; - - if ( $ImageMapTitle == NULL ) { $Description = $Data["Series"][$Series["X"]]["Description"]." / ".$Data["Series"][$Series["Y"]]["Description"]; } else { $Description = $ImageMapTitle; } - - if ( isset($Series["Picture"]) && $Series["Picture"] != "" ) - { $Picture = $Series["Picture"]; list($PicWidth,$PicHeight,$PicType) = $this->pChartObject->getPicInfo($Picture); } - else - { $Picture = NULL; } - - $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis); - if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; } - $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis); - if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; } - - $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]); - - foreach($PosArrayX as $Key => $Value) - { - $X = $Value; $Y = $PosArrayY[$Key]; - - if ( $X != VOID && $Y != VOID ) - { - $RealValue = round($Data["Series"][$Series["X"]]["Data"][$Key],2)." / ".round($Data["Series"][$Series["Y"]]["Data"][$Key],2); - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".floor($PlotSize+$BorderSize),$this->pChartObject->toHTMLColor($Series["Color"]["R"],$Series["Color"]["G"],$Series["Color"]["B"]),$Description,$RealValue); } - - if( isset($Series["Shape"]) ) - { $this->pChartObject->drawShape($X,$Y,$Series["Shape"],$PlotSize,$PlotBorder,$BorderSize,$Series["Color"]["R"],$Series["Color"]["G"],$Series["Color"]["B"],$Series["Color"]["Alpha"],$BorderR,$BorderG,$BorderB,$BorderAlpha); } - elseif ( $Picture == NULL ) - { - if ( $PlotBorder ) { $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize+$BorderSize,$BorderColor); } - $this->pChartObject->drawFilledCircle($X,$Y,$PlotSize,$Color); - } - else - { $this->pChartObject->drawFromPicture($PicType,$Picture,$X-$PicWidth/2,$Y-$PicHeight/2); } - } - } - } - } - } - - /* Draw a scatter line chart */ - function drawScatterLineChart($Format=NULL) - { - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapTitle = isset($Format["ImageMapTitle"]) ? $Format["ImageMapTitle"] : NULL; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 10; - $ImageMapPrecision = isset($Format["ImageMapPrecision"]) ? $Format["ImageMapPrecision"] : 2; - - /* Parse all the series to draw */ - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE ) - { - $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"]; - $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"]; - $Ticks = $Series["Ticks"]; - $Weight = $Series["Weight"]; - - if ( $ImageMapTitle == NULL ) { $Description = $Data["Series"][$Series["X"]]["Description"]." / ".$Data["Series"][$Series["Y"]]["Description"]; } else { $Description = $ImageMapTitle; } - - $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis); - if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; } - $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis); - if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; } - - $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]); - if ( $Ticks != 0 ) { $Color["Ticks"] = $Ticks; } - if ( $Weight != 0 ) { $Color["Weight"] = $Weight; } - - $LastX = VOID; $LastY = VOID; - foreach($PosArrayX as $Key => $Value) - { - $X = $Value; $Y = $PosArrayY[$Key]; - - if ( $X != VOID && $Y != VOID ) - { - $RealValue = round($Data["Series"][$Series["X"]]["Data"][$Key],2)." / ".round($Data["Series"][$Series["Y"]]["Data"][$Key],2); - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->pChartObject->toHTMLColor($Series["Color"]["R"],$Series["Color"]["G"],$Series["Color"]["B"]),$Description,$RealValue); } - } - - if ( $X != VOID && $Y != VOID && $LastX != VOID && $LastY != VOID) - $this->pChartObject->drawLine($LastX,$LastY,$X,$Y,$Color); - - $LastX = $X; $LastY = $Y; - } - } - } - } - - /* Draw a scatter spline chart */ - function drawScatterSplineChart($Format=NULL) - { - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapTitle = isset($Format["ImageMapTitle"]) ? $Format["ImageMapTitle"] : NULL; - $ImageMapPlotSize = isset($Format["ImageMapPlotSize"]) ? $Format["ImageMapPlotSize"] : 10; - $ImageMapPrecision = isset($Format["ImageMapPrecision"]) ? $Format["ImageMapPrecision"] : 2; - - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE ) - { - $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"]; - $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"]; - $Ticks = $Series["Ticks"]; - $Weight = $Series["Weight"]; - - if ( $ImageMapTitle == NULL ) { $Description = $Data["Series"][$Series["X"]]["Description"]." / ".$Data["Series"][$Series["Y"]]["Description"]; } else { $Description = $ImageMapTitle; } - - $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis); - if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; } - $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis); - if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; } - - $SplineSettings = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]); - if ( $Ticks != 0 ) { $SplineSettings["Ticks"] = $Ticks; } - if ( $Weight != 0 ) { $SplineSettings["Weight"] = $Weight; } - - $LastX = VOID; $LastY = VOID; $WayPoints = ""; $Forces = ""; - foreach($PosArrayX as $Key => $Value) - { - $X = $Value; $Y = $PosArrayY[$Key]; - $Force = $this->pChartObject->getLength($LastX,$LastY,$X,$Y)/5; - - if ( $X != VOID && $Y != VOID ) - { - $RealValue = round($Data["Series"][$Series["X"]]["Data"][$Key],2)." / ".round($Data["Series"][$Series["Y"]]["Data"][$Key],2); - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("CIRCLE",floor($X).",".floor($Y).",".$ImageMapPlotSize,$this->pChartObject->toHTMLColor($Series["Color"]["R"],$Series["Color"]["G"],$Series["Color"]["B"]),$Description,$RealValue); } - } - - if ( $X != VOID && $Y != VOID ) - { $WayPoints[] = array($X,$Y); $Forces[] = $Force; } - - if ( $Y == VOID || $X == VOID ) - { $SplineSettings["Forces"] = $Forces; $this->pChartObject->drawSpline($WayPoints,$SplineSettings); $WayPoints = ""; $Forces = "";} - - $LastX = $X; $LastY = $Y; - } - $SplineSettings["Forces"] = $Forces; - $this->pChartObject->drawSpline($WayPoints,$SplineSettings); - } - } - } - - /* Return the scaled plot position */ - function getPosArray($Values,$AxisID) - { - $Data = $this->pDataObject->getData(); - - if ( !is_array($Values) ) { $Values = array($Values); } - - if ( $Data["Axis"][$AxisID]["Identity"] == AXIS_X ) - { - $Height = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) - $Data["Axis"][$AxisID]["Margin"]*2; - $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"]; - $Step = $Height / $ScaleHeight; - - $Result = ""; - foreach($Values as $Key => $Value) - { - if ( $Value == VOID ) - $Result[] = VOID; - else - $Result[] = $this->pChartObject->GraphAreaX1 + $Data["Axis"][$AxisID]["Margin"] + ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); - } - - if ( count($Result) == 1 ) { return($Result[0]); } else { return($Result); } - } - else - { - $Height = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) - $Data["Axis"][$AxisID]["Margin"]*2; - $ScaleHeight = $Data["Axis"][$AxisID]["ScaleMax"] - $Data["Axis"][$AxisID]["ScaleMin"]; - $Step = $Height / $ScaleHeight; - - $Result = ""; - foreach($Values as $Key => $Value) - { - if ( $Value == VOID ) - $Result[] = VOID; - else - $Result[] = $this->pChartObject->GraphAreaY2 - $Data["Axis"][$AxisID]["Margin"] - ($Step * ($Value-$Data["Axis"][$AxisID]["ScaleMin"])); - } - - if ( count($Result) == 1 ) { return($Result[0]); } else { return($Result); } - } - } - - /* Draw the legend of the active series */ - function drawScatterLegend($X,$Y,$Format="") - { - $Family = isset($Format["Family"]) ? $Format["Family"] : LEGEND_FAMILY_BOX; - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize; - $FontR = isset($Format["FontR"]) ? $Format["FontR"] : $this->pChartObject->FontColorR; - $FontG = isset($Format["FontG"]) ? $Format["FontG"] : $this->pChartObject->FontColorG; - $FontB = isset($Format["FontB"]) ? $Format["FontB"] : $this->pChartObject->FontColorB; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 5; - $BoxHeight = isset($Format["BoxHeight"]) ? $Format["BoxHeight"] : 5; - $IconAreaWidth = isset($Format["IconAreaWidth"]) ? $Format["IconAreaWidth"] : $BoxWidth; - $IconAreaHeight = isset($Format["IconAreaHeight"]) ? $Format["IconAreaHeight"] : $BoxHeight; - $XSpacing = isset($Format["XSpacing"]) ? $Format["XSpacing"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $R = isset($Format["R"]) ? $Format["R"] : 200; - $G = isset($Format["G"]) ? $Format["G"] : 200; - $B = isset($Format["B"]) ? $Format["B"] : 200; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 255; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 255; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 255; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - - $Data = $this->pDataObject->getData(); - - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE && isset($Series["Picture"])) - { - list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Series["Picture"]); - if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; } - if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; } - } - } - - $YStep = max($this->pChartObject->FontSize,$IconAreaHeight) + 5; - $XStep = $IconAreaWidth + 5; - $XStep = $XSpacing; - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE ) - { - if ( $Mode == LEGEND_VERTICAL ) - { - $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Series["Description"]); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Lines = preg_split("/\n/",$Series["Description"]); - $vY = $vY + max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Series["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$FontName,$FontSize,0,$Value); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Width[] = $BoxArray[1]["X"]; - } - - $vX=max($Width)+$XStep; - } - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$IconAreaHeight) < $TopOffset ) { $Boundaries["B"] = $vY+$IconAreaHeight+$TopOffset; } - - if ( $Style == LEGEND_ROUND ) - $this->pChartObject->drawRoundedFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - elseif ( $Style == LEGEND_BOX ) - $this->pChartObject->drawFilledRectangle($Boundaries["L"]-$Margin,$Boundaries["T"]-$Margin,$Boundaries["R"]+$Margin,$Boundaries["B"]+$Margin,array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"BorderR"=>$BorderR,"BorderG"=>$BorderG,"BorderB"=>$BorderB)); - - $RestoreShadow = $this->pChartObject->Shadow; $this->Shadow = FALSE; - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE ) - { - $R = $Series["Color"]["R"]; $G = $Series["Color"]["G"]; $B = $Series["Color"]["B"]; - $Ticks = $Series["Ticks"]; $Weight = $Series["Weight"]; - - if ( isset($Series["Picture"]) ) - { - $Picture = $Series["Picture"]; - list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Picture); - $PicX = $X+$IconAreaWidth/2; $PicY = $Y+$IconAreaHeight/2; - - $this->pChartObject->drawFromPNG($PicX-$PicWidth/2,$PicY-$PicHeight/2,$Picture); - } - else - { - if ( $Family == LEGEND_FAMILY_BOX ) - { - if ( $BoxWidth != $IconAreaWidth ) { $XOffset = floor(($IconAreaWidth-$BoxWidth)/2); } else { $XOffset = 0; } - if ( $BoxHeight != $IconAreaHeight ) { $YOffset = floor(($IconAreaHeight-$BoxHeight)/2); } else { $YOffset = 0; } - - $this->pChartObject->drawFilledRectangle($X+1+$XOffset,$Y+1+$YOffset,$X+$BoxWidth+$XOffset+1,$Y+$BoxHeight+1+$YOffset,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->pChartObject->drawFilledRectangle($X+$XOffset,$Y+$YOffset,$X+$BoxWidth+$XOffset,$Y+$BoxHeight+$YOffset,array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - } - elseif ( $Family == LEGEND_FAMILY_CIRCLE ) - { - $this->pChartObject->drawFilledCircle($X+1+$IconAreaWidth/2,$Y+1+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - $this->pChartObject->drawFilledCircle($X+$IconAreaWidth/2,$Y+$IconAreaHeight/2,min($IconAreaHeight/2,$IconAreaWidth/2),array("R"=>$R,"G"=>$G,"B"=>$B,"Surrounding"=>20)); - } - elseif ( $Family == LEGEND_FAMILY_LINE ) - { - $this->pChartObject->drawLine($X+1,$Y+1+$IconAreaHeight/2,$X+1+$IconAreaWidth,$Y+1+$IconAreaHeight/2,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>20,"Ticks"=>$Ticks,"Weight"=>$Weight)); - $this->pChartObject->drawLine($X,$Y+$IconAreaHeight/2,$X+$IconAreaWidth,$Y+$IconAreaHeight/2,array("R"=>$R,"G"=>$G,"B"=>$B,"Ticks"=>$Ticks,"Weight"=>$Weight)); - } - } - - if ( $Mode == LEGEND_VERTICAL ) - { - $Lines = preg_split("/\n/",$Series["Description"]); - foreach($Lines as $Key => $Value) - $this->pChartObject->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT)); - - $Y=$Y+max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Series["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->pChartObject->drawText($X+$IconAreaWidth+4,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$Value,array("R"=>$FontR,"G"=>$FontG,"B"=>$FontB,"Align"=>TEXT_ALIGN_MIDDLELEFT)); - $Width[] = $BoxArray[1]["X"]; - } - $X=max($Width)+2+$XStep; - } - } - } - - $this->Shadow = $RestoreShadow; - } - - /* Get the legend box size */ - function getScatterLegendSize($Format="") - { - $FontName = isset($Format["FontName"]) ? $Format["FontName"] : $this->pChartObject->FontName; - $FontSize = isset($Format["FontSize"]) ? $Format["FontSize"] : $this->pChartObject->FontSize; - $BoxSize = isset($Format["BoxSize"]) ? $Format["BoxSize"] : 5; - $Margin = isset($Format["Margin"]) ? $Format["Margin"] : 5; - $Style = isset($Format["Style"]) ? $Format["Style"] : LEGEND_ROUND; - $Mode = isset($Format["Mode"]) ? $Format["Mode"] : LEGEND_VERTICAL; - - $YStep = max($this->pChartObject->FontSize,$BoxSize) + 5; - $XStep = $BoxSize + 5; - - $X=100; $Y=100; - - $Data = $this->pDataObject->getData(); - - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE && isset($Series["Picture"])) - { - list($PicWidth,$PicHeight) = $this->pChartObject->getPicInfo($Series["Picture"]); - if ( $IconAreaWidth < $PicWidth ) { $IconAreaWidth = $PicWidth; } - if ( $IconAreaHeight < $PicHeight ) { $IconAreaHeight = $PicHeight; } - } - } - - $YStep = max($this->pChartObject->FontSize,$IconAreaHeight) + 5; - $XStep = $IconAreaWidth + 5; - $XStep = $XSpacing; - - $Boundaries = ""; $Boundaries["L"] = $X; $Boundaries["T"] = $Y; $Boundaries["R"] = 0; $Boundaries["B"] = 0; $vY = $Y; $vX = $X; - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE ) - { - if ( $Mode == LEGEND_VERTICAL ) - { - $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+4,$vY+$IconAreaHeight/2,$FontName,$FontSize,0,$Series["Description"]); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Lines = preg_split("/\n/",$Series["Description"]); - $vY = $vY + max($this->pChartObject->FontSize*count($Lines),$IconAreaHeight) + 5; - } - elseif ( $Mode == LEGEND_HORIZONTAL ) - { - $Lines = preg_split("/\n/",$Series["Description"]); - $Width = ""; - foreach($Lines as $Key => $Value) - { - $BoxArray = $this->pChartObject->getTextBox($vX+$IconAreaWidth+6,$Y+$IconAreaHeight/2+(($this->pChartObject->FontSize+3)*$Key),$FontName,$FontSize,0,$Value); - - if ( $Boundaries["T"] > $BoxArray[2]["Y"]+$IconAreaHeight/2 ) { $Boundaries["T"] = $BoxArray[2]["Y"]+$IconAreaHeight/2; } - if ( $Boundaries["R"] < $BoxArray[1]["X"]+2 ) { $Boundaries["R"] = $BoxArray[1]["X"]+2; } - if ( $Boundaries["B"] < $BoxArray[1]["Y"]+2+$IconAreaHeight/2 ) { $Boundaries["B"] = $BoxArray[1]["Y"]+2+$IconAreaHeight/2; } - - $Width[] = $BoxArray[1]["X"]; - } - - $vX=max($Width)+$XStep; - } - } - } - $vY=$vY-$YStep; $vX=$vX-$XStep; - - $TopOffset = $Y - $Boundaries["T"]; - if ( $Boundaries["B"]-($vY+$BoxSize) < $TopOffset ) { $Boundaries["B"] = $vY+$BoxSize+$TopOffset; } - - $Width = ($Boundaries["R"]+$Margin) - ($Boundaries["L"]-$Margin); - $Height = ($Boundaries["B"]+$Margin) - ($Boundaries["T"]-$Margin); - - return(array("Width"=>$Width,"Height"=>$Height)); - } - - /* Draw the line of best fit */ - function drawScatterBestFit($Format="") - { - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : 0; - - $Data = $this->pDataObject->getData(); - - foreach($Data["ScatterSeries"] as $Key => $Series) - { - if ( $Series["isDrawable"] == TRUE ) - { - $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"]; - $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"]; - - $Color = array("R"=>$Series["Color"]["R"],"G"=>$Series["Color"]["G"],"B"=>$Series["Color"]["B"],"Alpha"=>$Series["Color"]["Alpha"]); - $Color["Ticks"] = $Ticks; - - $PosArrayX = $Data["Series"][$Series["X"]]["Data"]; - $PosArrayY = $Data["Series"][$Series["Y"]]["Data"]; - - $Sxy = 0; $Sx = 0; $Sy = 0; $Sxx = 0; - foreach($PosArrayX as $Key => $Value) - { - $X = $Value; $Y = $PosArrayY[$Key]; - - $Sxy = $Sxy + $X*$Y; - $Sx = $Sx + $X; - $Sy = $Sy + $Y; - $Sxx = $Sxx + $X*$X; - } - - $n = count($PosArrayX); - - if ((($n*$Sxx) == ($Sx*$Sx))) - { - $X1 = $this->getPosArray($Data["Axis"][$SerieXAxis]["ScaleMin"],$SerieXAxis); - $X2 = $X1; - $Y1 = $this->pChartObject->GraphAreaY1; - $Y2 = $this->pChartObject->GraphAreaY2; - } - else - { - $M = (($n*$Sxy)-($Sx*$Sy)) / (($n*$Sxx)-($Sx*$Sx)); - $B = (($Sy)-($M*$Sx))/($n); - - $X1 = $this->getPosArray($Data["Axis"][$SerieXAxis]["ScaleMin"],$SerieXAxis); - $Y1 = $this->getPosArray($M * $Data["Axis"][$SerieXAxis]["ScaleMin"] + $B,$SerieYAxis); - $X2 = $this->getPosArray($Data["Axis"][$SerieXAxis]["ScaleMax"],$SerieXAxis); - $Y2 = $this->getPosArray($M * $Data["Axis"][$SerieXAxis]["ScaleMax"] + $B,$SerieYAxis); - - $RealM = -($Y2-$Y1)/($X2-$X1); - - if ( $Y1 < $this->pChartObject->GraphAreaY1 ) { $X1 = $X1 + ($this->pChartObject->GraphAreaY1-$Y1/$RealM); $Y1 = $this->pChartObject->GraphAreaY1; } - if ( $Y1 > $this->pChartObject->GraphAreaY2 ) { $X1 = $X1 + ($Y1-$this->pChartObject->GraphAreaY2)/$RealM; $Y1 = $this->pChartObject->GraphAreaY2; } - if ( $Y2 < $this->pChartObject->GraphAreaY1 ) { $X2 = $X2 - ($this->pChartObject->GraphAreaY1-$Y2)/$RealM; $Y2 = $this->pChartObject->GraphAreaY1; } - if ( $Y2 > $this->pChartObject->GraphAreaY2 ) { $X2 = $X2 - ($Y2-$this->pChartObject->GraphAreaY2)/$RealM; $Y2 = $this->pChartObject->GraphAreaY2; } - } - - $this->pChartObject->drawLine($X1,$Y1,$X2,$Y2,$Color); - } - } - } - - function writeScatterLabel($ScatterSerieID,$Points,$Format="") - { - $OverrideTitle = isset($Format["OverrideTitle"]) ? $Format["OverrideTitle"] : NULL; - $DrawPoint = isset($Format["DrawPoint"]) ? $Format["DrawPoint"] : LABEL_POINT_BOX; - $Decimals = isset($Format["Decimals"]) ? $Format["Decimals"] : NULL; - - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - if ( !is_array($Points) ) { $Point = $Points; $Points = ""; $Points[0] = $Point; } - - if ( !isset($Data["ScatterSeries"][$ScatterSerieID]) ) - return(0); - - $Series = $Data["ScatterSeries"][$ScatterSerieID]; - $SerieX = $Series["X"]; $SerieValuesX = $Data["Series"][$SerieX]["Data"]; $SerieXAxis = $Data["Series"][$SerieX]["Axis"]; - $SerieY = $Series["Y"]; $SerieValuesY = $Data["Series"][$SerieY]["Data"]; $SerieYAxis = $Data["Series"][$SerieY]["Axis"]; - - $PosArrayX = $this->getPosArray($SerieValuesX,$SerieXAxis); - if ( !is_array($PosArrayX) ) { $Value = $PosArrayX; $PosArrayX = ""; $PosArrayX[0] = $Value; } - $PosArrayY = $this->getPosArray($SerieValuesY,$SerieYAxis); - if ( !is_array($PosArrayY) ) { $Value = $PosArrayY; $PosArrayY = ""; $PosArrayY[0] = $Value; } - - foreach($Points as $Key => $Point) - { - if ( isset($PosArrayX[$Point]) && isset($PosArrayY[$Point]) ) - { - $X = floor($PosArrayX[$Point]); - $Y = floor($PosArrayY[$Point]); - - if ( $DrawPoint == LABEL_POINT_CIRCLE ) - $this->pChartObject->drawFilledCircle($X,$Y,3,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - elseif ( $DrawPoint == LABEL_POINT_BOX ) - $this->pChartObject->drawFilledRectangle($X-2,$Y-2,$X+2,$Y+2,array("R"=>255,"G"=>255,"B"=>255,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0)); - - $Serie = ""; - $Serie["R"] = $Series["Color"]["R"]; - $Serie["G"] = $Series["Color"]["G"]; - $Serie["B"] = $Series["Color"]["B"]; - $Serie["Alpha"] = $Series["Color"]["Alpha"]; - - $XAxisMode = $Data["Axis"][$SerieXAxis]["Display"]; - $XAxisFormat = $Data["Axis"][$SerieXAxis]["Format"]; - $XAxisUnit = $Data["Axis"][$SerieXAxis]["Unit"]; - if ( $Decimals == NULL ) { $XValue = $SerieValuesX[$Point]; } else { $XValue = round($SerieValuesX[$Point],$Decimals); } - $XValue = $this->pChartObject->scaleFormat($XValue,$XAxisMode,$XAxisFormat,$XAxisUnit); - - $YAxisMode = $Data["Axis"][$SerieYAxis]["Display"]; - $YAxisFormat = $Data["Axis"][$SerieYAxis]["Format"]; - $YAxisUnit = $Data["Axis"][$SerieYAxis]["Unit"]; - if ( $Decimals == NULL ) { $YValue = $SerieValuesY[$Point]; } else { $YValue = round($SerieValuesY[$Point],$Decimals); } - $YValue = $this->pChartObject->scaleFormat($YValue,$YAxisMode,$YAxisFormat,$YAxisUnit); - - $Caption = $XValue." / ".$YValue; - - if ( isset($Series["Description"]) ) - $Description = $Series["Description"]; - else - $Description = "No description"; - - $Series = ""; - $Series[] = array("Format"=>$Serie,"Caption"=>$Caption); - - $this->pChartObject->drawLabelBox($X,$Y-3,$Description,$Series,$Format); - } - } - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pSplit.class.php b/Under-Testing/Website/class/pSplit.class.php deleted file mode 100644 index 0a62c3d..0000000 --- a/Under-Testing/Website/class/pSplit.class.php +++ /dev/null @@ -1,131 +0,0 @@ -pChartObject = $Object; - - $Spacing = isset($Format["Spacing"]) ? $Format["Spacing"] : 20; - $TextPadding = isset($Format["TextPadding"]) ? $Format["TextPadding"] : 2; - $TextPos = isset($Format["TextPos"]) ? $Format["TextPos"] : TEXT_POS_TOP; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : NULL; - $Force = isset($Format["Force"]) ? $Format["Force"] : 70; - $Segments = isset($Format["Segments"]) ? $Format["Segments"] : 15; - $FontSize = $Object->FontSize; - $X1 = $Object->GraphAreaX1; - $Y1 = $Object->GraphAreaY1; - $X2 = $Object->GraphAreaX2; - $Y2 = $Object->GraphAreaY2; - - /* Data Processing */ - $Data = $Values->getData(); - $Palette = $Values->getPalette(); - - $LabelSerie = $Data["Abscissa"]; - $DataSerie = ""; - - foreach($Data["Series"] as $SerieName => $Value) - { if ( $SerieName != $LabelSerie && $DataSerie == "" ) { $DataSerie = $SerieName; } } - - $DataSerieSum = array_sum($Data["Series"][$DataSerie]["Data"]); - $DataSerieCount = count($Data["Series"][$DataSerie]["Data"]); - - /* Scale Processing */ - if ( $TextPos == TEXT_POS_RIGHT ) - $YScale = (($Y2-$Y1) - (($DataSerieCount+1)*$Spacing)) / $DataSerieSum; - else - $YScale = (($Y2-$Y1) - ($DataSerieCount*$Spacing)) / $DataSerieSum; - $LeftHeight = $DataSerieSum * $YScale; - - /* Re-compute graph width depending of the text mode choosen */ - if ( $TextPos == TEXT_POS_RIGHT ) - { - $MaxWidth = 0; - foreach($Data["Series"][$LabelSerie]["Data"] as $Key => $Label) - { - $Boundardies = $Object->getTextBox(0,0,$Object->FontName,$Object->FontSize,0,$Label); - if ( $Boundardies[1]["X"] > $MaxWidth ) { $MaxWidth = $Boundardies[1]["X"] + $TextPadding*2; } - } - $X2 = $X2 - $MaxWidth; - } - - /* Drawing */ - $LeftY = ((($Y2-$Y1) / 2) + $Y1) - ($LeftHeight/2); - $RightY = $Y1; - $VectorX = (($X2-$X1) / 2); - - foreach($Data["Series"][$DataSerie]["Data"] as $Key => $Value) - { - if ( isset($Data["Series"][$LabelSerie]["Data"][$Key]) ) - $Label = $Data["Series"][$LabelSerie]["Data"][$Key]; - else - $Label = "-"; - - $LeftY1 = $LeftY; - $LeftY2 = $LeftY + $Value * $YScale; - - $RightY1 = $RightY + $Spacing; - $RightY2 = $RightY + $Spacing + $Value * $YScale;; - - $Settings = array("R"=>$Palette[$Key]["R"],"G"=>$Palette[$Key]["G"],"B"=>$Palette[$Key]["B"],"Alpha"=>$Palette[$Key]["Alpha"],"NoDraw"=>TRUE,"Segments"=>$Segments,"Surrounding"=>$Surrounding); - - $PolyGon = ""; - - $Angle = $Object->getAngle($X2,$RightY1,$X1,$LeftY1); - $VectorX1 = cos(deg2rad($Angle+90)) * $Force + ($X2-$X1)/2 + $X1; - $VectorY1 = sin(deg2rad($Angle+90)) * $Force + ($RightY1-$LeftY1)/2 + $LeftY1; - $VectorX2 = cos(deg2rad($Angle-90)) * $Force + ($X2-$X1)/2 + $X1; - $VectorY2 = sin(deg2rad($Angle-90)) * $Force + ($RightY1-$LeftY1)/2 + $LeftY1; - - $Points = $Object->drawBezier($X1,$LeftY1,$X2,$RightY1,$VectorX1,$VectorY1,$VectorX2,$VectorY2,$Settings); - foreach($Points as $Key => $Pos) { $PolyGon[] = $Pos["X"]; $PolyGon[] = $Pos["Y"]; } - - - $Angle = $Object->getAngle($X2,$RightY2,$X1,$LeftY2); - $VectorX1 = cos(deg2rad($Angle+90)) * $Force + ($X2-$X1)/2 +$X1; - $VectorY1 = sin(deg2rad($Angle+90)) * $Force + ($RightY2-$LeftY2)/2 + $LeftY2; - $VectorX2 = cos(deg2rad($Angle-90)) * $Force + ($X2-$X1)/2 +$X1; - $VectorY2 = sin(deg2rad($Angle-90)) * $Force + ($RightY2-$LeftY2)/2 + $LeftY2; - - $Points = $Object->drawBezier($X1,$LeftY2,$X2,$RightY2,$VectorX1,$VectorY1,$VectorX2,$VectorY2,$Settings); - $Points = array_reverse($Points); - foreach($Points as $Key => $Pos) { $PolyGon[] = $Pos["X"]; $PolyGon[] = $Pos["Y"]; } - - $Object->drawPolygon($PolyGon,$Settings); - - if ( $TextPos == TEXT_POS_RIGHT ) - $Object->drawText($X2+$TextPadding,($RightY2-$RightY1)/2+$RightY1,$Label,array("Align"=>TEXT_ALIGN_MIDDLELEFT)); - else - $Object->drawText($X2,$RightY1-$TextPadding,$Label,array("Align"=>TEXT_ALIGN_BOTTOMRIGHT)); - - $LeftY = $LeftY2; - $RightY = $RightY2; - } - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pSpring.class.php b/Under-Testing/Website/class/pSpring.class.php deleted file mode 100644 index fcfc8f2..0000000 --- a/Under-Testing/Website/class/pSpring.class.php +++ /dev/null @@ -1,868 +0,0 @@ -Data = ""; - $this->Links = ""; - - /* Set nodes defaults */ - $this->Default["R"] = 255; - $this->Default["G"] = 255; - $this->Default["B"] = 255; - $this->Default["Alpha"] = 100; - $this->Default["BorderR"] = 0; - $this->Default["BorderG"] = 0; - $this->Default["BorderB"] = 0; - $this->Default["BorderAlpha"] = 100; - $this->Default["Surrounding"] = NULL; - $this->Default["BackgroundR"] = 255; - $this->Default["BackgroundG"] = 255; - $this->Default["BackgroundB"] = 255; - $this->Default["BackgroundAlpha"] = 0; - $this->Default["Force"] = 1; - $this->Default["NodeType"] = NODE_TYPE_FREE; - $this->Default["Size"] = 5; - $this->Default["Shape"] = NODE_SHAPE_CIRCLE; - $this->Default["FreeZone"] = 40; - $this->Default["LinkR"] = 0; - $this->Default["LinkG"] = 0; - $this->Default["LinkB"] = 0; - $this->Default["LinkAlpha"] = 0; - - $this->Labels["Type"] = LABEL_CLASSIC; - $this->Labels["R"] = 0; - $this->Labels["G"] = 0; - $this->Labels["B"] = 0; - $this->Labels["Alpha"] = 100; - - $this->AutoComputeFreeZone = FALSE; - } - - /* Set default links options */ - function setLinkDefaults($Settings="") - { - if ( isset($Settings["R"]) ) { $this->Default["LinkR"] = $Settings["R"]; } - if ( isset($Settings["G"]) ) { $this->Default["LinkG"] = $Settings["G"]; } - if ( isset($Settings["B"]) ) { $this->Default["LinkB"] = $Settings["B"]; } - if ( isset($Settings["Alpha"]) ) { $this->Default["LinkAlpha"] = $Settings["Alpha"]; } - } - - /* Set default links options */ - function setLabelsSettings($Settings="") - { - if ( isset($Settings["Type"]) ) { $this->Labels["Type"] = $Settings["Type"]; } - if ( isset($Settings["R"]) ) { $this->Labels["R"] = $Settings["R"]; } - if ( isset($Settings["G"]) ) { $this->Labels["G"] = $Settings["G"]; } - if ( isset($Settings["B"]) ) { $this->Labels["B"] = $Settings["B"]; } - if ( isset($Settings["Alpha"]) ) { $this->Labels["Alpha"] = $Settings["Alpha"]; } - } - - /* Auto compute the FreeZone size based on the number of connections */ - function autoFreeZone() - { - /* Check connections reciprocity */ - foreach($this->Data as $Key => $Settings) - { - if ( isset($Settings["Connections"]) ) - { $this->Data[$Key]["FreeZone"] = count($Settings["Connections"])*10 + 20; } - else - { $this->Data[$Key]["FreeZone"] = 20; } - } - - } - - /* Set link properties */ - function linkProperties($FromNode,$ToNode,$Settings) - { - if ( !isset($this->Data[$FromNode]) ) { return(0); } - if ( !isset($this->Data[$ToNode]) ) { return(0); } - - $R = isset($Settings["R"]) ? $Settings["R"] : 0; - $G = isset($Settings["G"]) ? $Settings["G"] : 0; - $B = isset($Settings["B"]) ? $Settings["B"] : 0; - $Alpha = isset($Settings["Alpha"]) ? $Settings["Alpha"] : 100; - $Name = isset($Settings["Name"]) ? $Settings["Name"] : NULL; - $Ticks = isset($Settings["Ticks"]) ? $Settings["Ticks"] : NULL; - - $this->Links[$FromNode][$ToNode]["R"] = $R; $this->Links[$ToNode][$FromNode]["R"] = $R; - $this->Links[$FromNode][$ToNode]["G"] = $G; $this->Links[$ToNode][$FromNode]["G"] = $G; - $this->Links[$FromNode][$ToNode]["B"] = $B; $this->Links[$ToNode][$FromNode]["B"] = $B; - $this->Links[$FromNode][$ToNode]["Alpha"] = $Alpha; $this->Links[$ToNode][$FromNode]["Alpha"] = $Alpha; - $this->Links[$FromNode][$ToNode]["Name"] = $Name; $this->Links[$ToNode][$FromNode]["Name"] = $Name; - $this->Links[$FromNode][$ToNode]["Ticks"] = $Ticks; $this->Links[$ToNode][$FromNode]["Ticks"] = $Ticks; - } - - function setNodeDefaults($Settings="") - { - if ( isset($Settings["R"]) ) { $this->Default["R"] = $Settings["R"]; } - if ( isset($Settings["G"]) ) { $this->Default["G"] = $Settings["G"]; } - if ( isset($Settings["B"]) ) { $this->Default["B"] = $Settings["B"]; } - if ( isset($Settings["Alpha"]) ) { $this->Default["Alpha"] = $Settings["Alpha"]; } - if ( isset($Settings["BorderR"]) ) { $this->Default["BorderR"] = $Settings["BorderR"]; } - if ( isset($Settings["BorderG"]) ) { $this->Default["BorderG"] = $Settings["BorderG"]; } - if ( isset($Settings["BorderB"]) ) { $this->Default["BorderB"] = $Settings["BorderB"]; } - if ( isset($Settings["BorderAlpha"]) ) { $this->Default["BorderAlpha"] = $Settings["BorderAlpha"]; } - if ( isset($Settings["Surrounding"]) ) { $this->Default["Surrounding"] = $Settings["Surrounding"]; } - if ( isset($Settings["BackgroundR"]) ) { $this->Default["BackgroundR"] = $Settings["BackgroundR"]; } - if ( isset($Settings["BackgroundG"]) ) { $this->Default["BackgroundG"] = $Settings["BackgroundG"]; } - if ( isset($Settings["BackgroundB"]) ) { $this->Default["BackgroundB"] = $Settings["BackgroundB"]; } - if ( isset($Settings["BackgroundAlpha"]) ) { $this->Default["BackgroundAlpha"] = $Settings["BackgroundAlpha"]; } - if ( isset($Settings["NodeType"]) ) { $this->Default["NodeType"] = $Settings["NodeType"]; } - if ( isset($Settings["Size"]) ) { $this->Default["Size"] = $Settings["Size"]; } - if ( isset($Settings["Shape"]) ) { $this->Default["Shape"] = $Settings["Shape"]; } - if ( isset($Settings["FreeZone"]) ) { $this->Default["FreeZone"] = $Settings["FreeZone"]; } - } - - /* Add a node */ - function addNode($NodeID,$Settings="") - { - /* if the node already exists, ignore */ - if (isset($this->Data[$NodeID])) { return(0); } - - $Name = isset($Settings["Name"]) ? $Settings["Name"] : "Node ".$NodeID; - $Connections = isset($Settings["Connections"]) ? $Settings["Connections"] : NULL; - - $R = isset($Settings["R"]) ? $Settings["R"] : $this->Default["R"]; - $G = isset($Settings["G"]) ? $Settings["G"] : $this->Default["G"]; - $B = isset($Settings["B"]) ? $Settings["B"] : $this->Default["B"]; - $Alpha = isset($Settings["Alpha"]) ? $Settings["Alpha"] : $this->Default["Alpha"]; - $BorderR = isset($Settings["BorderR"]) ? $Settings["BorderR"] : $this->Default["BorderR"]; - $BorderG = isset($Settings["BorderG"]) ? $Settings["BorderG"] : $this->Default["BorderG"]; - $BorderB = isset($Settings["BorderB"]) ? $Settings["BorderB"] : $this->Default["BorderB"]; - $BorderAlpha = isset($Settings["BorderAlpha"]) ? $Settings["BorderAlpha"] : $this->Default["BorderAlpha"]; - $Surrounding = isset($Settings["Surrounding"]) ? $Settings["Surrounding"] : $this->Default["Surrounding"]; - $BackgroundR = isset($Settings["BackgroundR"]) ? $Settings["BackgroundR"] : $this->Default["BackgroundR"]; - $BackgroundG = isset($Settings["BackgroundG"]) ? $Settings["BackgroundG"] : $this->Default["BackgroundG"]; - $BackgroundB = isset($Settings["BackgroundB"]) ? $Settings["BackgroundB"] : $this->Default["BackgroundB"]; - $BackgroundAlpha = isset($Settings["BackgroundAlpha"]) ? $Settings["BackgroundAlpha"] : $this->Default["BackgroundAlpha"]; - $Force = isset($Settings["Force"]) ? $Settings["Force"] : $this->Default["Force"]; - $NodeType = isset($Settings["NodeType"]) ? $Settings["NodeType"] : $this->Default["NodeType"]; - $Size = isset($Settings["Size"]) ? $Settings["Size"] : $this->Default["Size"]; - $Shape = isset($Settings["Shape"]) ? $Settings["Shape"] : $this->Default["Shape"]; - $FreeZone = isset($Settings["FreeZone"]) ? $Settings["FreeZone"] : $this->Default["FreeZone"]; - - if ( $Surrounding != NULL ) { $BorderR = $R + $Surrounding; $BorderG = $G + $Surrounding; $BorderB = $B + $Surrounding; } - - $this->Data[$NodeID]["R"] = $R; $this->Data[$NodeID]["G"] = $G; $this->Data[$NodeID]["B"] = $B; $this->Data[$NodeID]["Alpha"] = $Alpha; - $this->Data[$NodeID]["BorderR"] = $BorderR; $this->Data[$NodeID]["BorderG"] = $BorderG; $this->Data[$NodeID]["BorderB"] = $BorderB; $this->Data[$NodeID]["BorderAlpha"] = $BorderAlpha; - $this->Data[$NodeID]["BackgroundR"] = $BackgroundR; $this->Data[$NodeID]["BackgroundG"] = $BackgroundG; $this->Data[$NodeID]["BackgroundB"] = $BackgroundB; $this->Data[$NodeID]["BackgroundAlpha"] = $BackgroundAlpha; - $this->Data[$NodeID]["Name"] = $Name; - $this->Data[$NodeID]["Force"] = $Force; - $this->Data[$NodeID]["Type"] = $NodeType; - $this->Data[$NodeID]["Size"] = $Size; - $this->Data[$NodeID]["Shape"] = $Shape; - $this->Data[$NodeID]["FreeZone"] = $FreeZone; - if ( $Connections != NULL ) - { - if ( is_array($Connections ) ) - { - foreach($Connections as $Key => $Value) - $this->Data[$NodeID]["Connections"][] = $Value; - } - else - $this->Data[$NodeID]["Connections"][] = $Connections; - } - } - - /* Set color attribute for a list of nodes */ - function setNodesColor($Nodes,$Settings="") - { - if ( is_array($Nodes) ) - { - foreach ($Nodes as $Key => $NodeID) - { - if (isset($this->Data[$NodeID]) ) - { - if ( isset($Settings["R"]) ) { $this->Data[$NodeID]["R"] = $Settings["R"]; } - if ( isset($Settings["G"]) ) { $this->Data[$NodeID]["G"] = $Settings["G"]; } - if ( isset($Settings["B"]) ) { $this->Data[$NodeID]["B"] = $Settings["B"]; } - if ( isset($Settings["Alpha"]) ) { $this->Data[$NodeID]["Alpha"] = $Settings["Alpha"]; } - if ( isset($Settings["BorderR"]) ) { $this->Data[$NodeID]["BorderR"] = $Settings["BorderR"]; } - if ( isset($Settings["BorderG"]) ) { $this->Data[$NodeID]["BorderG"] = $Settings["BorderG"]; } - if ( isset($Settings["BorderB"]) ) { $this->Data[$NodeID]["BorderB"] = $Settings["BorderB"]; } - if ( isset($Settings["BorderAlpha"]) ) { $this->Data[$NodeID]["BorderAlpha"] = $Settings["BorderAlpha"]; } - if ( isset($Settings["Surrounding"]) ) { $this->Data[$NodeID]["BorderR"] = $this->Data[$NodeID]["R"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderG"] = $this->Data[$NodeID]["G"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderB"] = $this->Data[$NodeID]["B"] + $Settings["Surrounding"]; } - } - } - } - else - { - if ( isset($Settings["R"]) ) { $this->Data[$Nodes]["R"] = $Settings["R"]; } - if ( isset($Settings["G"]) ) { $this->Data[$Nodes]["G"] = $Settings["G"]; } - if ( isset($Settings["B"]) ) { $this->Data[$Nodes]["B"] = $Settings["B"]; } - if ( isset($Settings["Alpha"]) ) { $this->Data[$Nodes]["Alpha"] = $Settings["Alpha"]; } - if ( isset($Settings["BorderR"]) ) { $this->Data[$Nodes]["BorderR"] = $Settings["BorderR"]; } - if ( isset($Settings["BorderG"]) ) { $this->Data[$Nodes]["BorderG"] = $Settings["BorderG"]; } - if ( isset($Settings["BorderB"]) ) { $this->Data[$Nodes]["BorderB"] = $Settings["BorderB"]; } - if ( isset($Settings["BorderAlpha"]) ) { $this->Data[$Nodes]["BorderAlpha"] = $Settings["BorderAlpha"]; } - if ( isset($Settings["Surrounding"]) ) { $this->Data[$Nodes]["BorderR"] = $this->Data[$NodeID]["R"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderG"] = $this->Data[$NodeID]["G"] + $Settings["Surrounding"]; $this->Data[$NodeID]["BorderB"] = $this->Data[$NodeID]["B"] + $Settings["Surrounding"]; } - } - } - - /* Returns all the nodes details */ - function dumpNodes() - { return($this->Data); } - - /* Check if a connection exists and create it if required */ - function checkConnection($SourceID, $TargetID) - { - if ( isset($this->Data[$SourceID]["Connections"]) ) - { - foreach ($this->Data[$SourceID]["Connections"] as $Key => $ConnectionID) - { if ( $TargetID == $ConnectionID ) { return(TRUE); } } - } - $this->Data[$SourceID]["Connections"][] = $TargetID; - } - /* Get the median linked nodes position */ - function getMedianOffset($Key,$X,$Y) - { - $Cpt = 1; - if ( isset($this->Data[$Key]["Connections"]) ) - { - foreach($this->Data[$Key]["Connections"] as $ID => $NodeID) - { - if ( isset($this->Data[$NodeID]["X"]) && isset($this->Data[$NodeID]["Y"]) ) - { - $X = $X + $this->Data[$NodeID]["X"]; - $Y = $Y + $this->Data[$NodeID]["Y"]; - $Cpt++; - } - } - } - return(array("X"=>$X/$Cpt,"Y"=>$Y/$Cpt)); - } - - /* Return the ID of the attached partner with the biggest weight */ - function getBiggestPartner($Key) - { - if ( !isset($this->Data[$Key]["Connections"]) ) { return(""); } - - $MaxWeight = 0; $Result = ""; - foreach($this->Data[$Key]["Connections"] as $Key => $PeerID) - { - if ( $this->Data[$PeerID]["Weight"] > $MaxWeight ) - { $MaxWeight = $this->Data[$PeerID]["Weight"]; $Result = $PeerID; } - } - return($Result); - } - - /* Do the initial node positions computing pass */ - function firstPass($Algorithm) - { - $CenterX = ($this->X2 - $this->X1) / 2 + $this->X1; - $CenterY = ($this->Y2 - $this->Y1) / 2 + $this->Y1; - - /* Check connections reciprocity */ - foreach($this->Data as $Key => $Settings) - { - if ( isset($Settings["Connections"]) ) - { - foreach($Settings["Connections"] as $ID => $ConnectionID) - $this->checkConnection($ConnectionID,$Key); - } - } - - if ( $this->AutoComputeFreeZone ) { $this->autoFreeZone(); } - - /* Get the max number of connections */ - $MaxConnections = 0; - foreach($this->Data as $Key => $Settings) - { if ( isset($Settings["Connections"]) ) { if ( $MaxConnections < count($Settings["Connections"] ) ) { $MaxConnections = count($Settings["Connections"]); } } } - - if ( $Algorithm == ALGORITHM_WEIGHTED ) - { - foreach($this->Data as $Key => $Settings) - { - if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; } - if ( $Settings["Type"] == NODE_TYPE_FREE ) - { - if ( isset($Settings["Connections"]) ) - { $Connections = count($Settings["Connections"]); } - else - { $Connections = 0; } - - $Ring = $MaxConnections - $Connections; - $Angle = rand(0,360); - - $this->Data[$Key]["X"] = cos(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterX; - $this->Data[$Key]["Y"] = sin(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterY; - } - } - } - elseif ( $Algorithm == ALGORITHM_CENTRAL ) - { - /* Put a weight on each nodes */ - foreach($this->Data as $Key => $Settings) - { - if ( isset($Settings["Connections"]) ) - $this->Data[$Key]["Weight"] = count($Settings["Connections"]); - else - $this->Data[$Key]["Weight"] = 0; - } - - $MaxConnections = $MaxConnections + 1; - for($i=$MaxConnections;$i>=0;$i--) - { - foreach($this->Data as $Key => $Settings) - { - if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; } - if ( $Settings["Type"] == NODE_TYPE_FREE ) - { - if ( isset($Settings["Connections"]) ) - { $Connections = count($Settings["Connections"]); } - else - { $Connections = 0; } - - if ( $Connections == $i ) - { - $BiggestPartner = $this->getBiggestPartner($Key); - if ( $BiggestPartner != "" ) - { - $Ring = $this->Data[$BiggestPartner]["FreeZone"]; - $Weight = $this->Data[$BiggestPartner]["Weight"]; - $AngleDivision = 360 / $this->Data[$BiggestPartner]["Weight"]; - $Done = FALSE; $Tries = 0; - while (!$Done && $Tries <= $Weight*2) - { - $Tries++; - $Angle = floor(rand(0,$Weight)*$AngleDivision); - if ( !isset($this->Data[$BiggestPartner]["Angular"][$Angle]) || !isset($this->Data[$BiggestPartner]["Angular"]) ) - { - $this->Data[$BiggestPartner]["Angular"][$Angle] = $Angle; - $Done = TRUE; - } - } - if ( !$Done ) - { $Angle = rand(0,360); $this->Data[$BiggestPartner]["Angular"][$Angle] = $Angle; } - - $X = cos(deg2rad($Angle)) * ($Ring) + $this->Data[$BiggestPartner]["X"]; - $Y = sin(deg2rad($Angle)) * ($Ring) + $this->Data[$BiggestPartner]["Y"]; - - $this->Data[$Key]["X"] = $X; - $this->Data[$Key]["Y"] = $Y; - } - } - } - } - } - } - elseif ( $Algorithm == ALGORITHM_CIRCULAR ) - { - $MaxConnections = $MaxConnections + 1; - for($i=$MaxConnections;$i>=0;$i--) - { - foreach($this->Data as $Key => $Settings) - { - if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; } - if ( $Settings["Type"] == NODE_TYPE_FREE ) - { - if ( isset($Settings["Connections"]) ) - { $Connections = count($Settings["Connections"]); } - else - { $Connections = 0; } - - if ( $Connections == $i ) - { - $Ring = $MaxConnections - $Connections; - $Angle = rand(0,360); - - $X = cos(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterX; - $Y = sin(deg2rad($Angle)) * ($Ring*$this->RingSize) + $CenterY; - - $MedianOffset = $this->getMedianOffset($Key,$X,$Y); - - $this->Data[$Key]["X"] = $MedianOffset["X"]; - $this->Data[$Key]["Y"] = $MedianOffset["Y"]; - } - } - } - } - } - elseif ( $Algorithm == ALGORITHM_RANDOM ) - { - foreach($this->Data as $Key => $Settings) - { - if ( $Settings["Type"] == NODE_TYPE_FREE ) - { - $this->Data[$Key]["X"] = $CenterX + rand(-20,20); - $this->Data[$Key]["Y"] = $CenterY + rand(-20,20); - } - if ( $Settings["Type"] == NODE_TYPE_CENTRAL ) { $this->Data[$Key]["X"] = $CenterX; $this->Data[$Key]["Y"] = $CenterY; } - } - } - } - - /* Compute one pass */ - function doPass() - { - /* Compute vectors */ - foreach($this->Data as $Key => $Settings) - { - if ( $Settings["Type"] != NODE_TYPE_CENTRAL ) - { - unset($this->Data[$Key]["Vectors"]); - - $X1 = $Settings["X"]; - $Y1 = $Settings["Y"]; - - /* Repulsion vectors */ - foreach($this->Data as $Key2 => $Settings2) - { - if ( $Key != $Key2 ) - { - $X2 = $this->Data[$Key2]["X"]; - $Y2 = $this->Data[$Key2]["Y"]; - $FreeZone = $this->Data[$Key2]["FreeZone"]; - - $Distance = $this->getDistance($X1,$Y1,$X2,$Y2); - $Angle = $this->getAngle($X1,$Y1,$X2,$Y2) + 180; - - /* Nodes too close, repulsion occurs */ - if ( $Distance < $FreeZone ) - { - $Force = log(pow(2,$FreeZone-$Distance)); - if ( $Force > 1 ) - { $this->Data[$Key]["Vectors"][] = array("Type"=>"R","Angle"=>$Angle % 360,"Force"=>$Force); } - } - } - } - - /* Attraction vectors */ - if ( isset($Settings["Connections"]) ) - { - foreach($Settings["Connections"] as $ID => $NodeID) - { - if ( isset($this->Data[$NodeID]) ) - { - $X2 = $this->Data[$NodeID]["X"]; - $Y2 = $this->Data[$NodeID]["Y"]; - $FreeZone = $this->Data[$Key2]["FreeZone"]; - - $Distance = $this->getDistance($X1,$Y1,$X2,$Y2); - $Angle = $this->getAngle($X1,$Y1,$X2,$Y2); - - if ( $Distance > $FreeZone ) - $Force = log(($Distance-$FreeZone)+1); - else - { $Force = log(($FreeZone-$Distance)+1); ($Angle = $Angle + 180); } - - if ( $Force > 1 ) - $this->Data[$Key]["Vectors"][] = array("Type"=>"A","Angle"=>$Angle % 360,"Force"=>$Force); - } - } - } - } - } - - /* Move the nodes accoding to the vectors */ - foreach($this->Data as $Key => $Settings) - { - $X = $Settings["X"]; - $Y = $Settings["Y"]; - - if ( isset($Settings["Vectors"]) && $Settings["Type"] != NODE_TYPE_CENTRAL ) - { - foreach($Settings["Vectors"] as $ID => $Vector) - { - $Type = $Vector["Type"]; - $Force = $Vector["Force"]; - $Angle = $Vector["Angle"]; - $Factor = $Type == "A" ? $this->MagneticForceA : $this->MagneticForceR; - - $X = cos(deg2rad($Angle)) * $Force * $Factor + $X; - $Y = sin(deg2rad($Angle)) * $Force * $Factor + $Y; - } - } - - $this->Data[$Key]["X"] = $X; - $this->Data[$Key]["Y"] = $Y; - } - } - - function lastPass() - { - /* Put everything inside the graph area */ - foreach($this->Data as $Key => $Settings) - { - $X = $Settings["X"]; - $Y = $Settings["Y"]; - - if ( $X < $this->X1 ) { $X = $this->X1; } - if ( $X > $this->X2 ) { $X = $this->X2; } - if ( $Y < $this->Y1 ) { $Y = $this->Y1; } - if ( $Y > $this->Y2 ) { $Y = $this->Y2; } - - $this->Data[$Key]["X"] = $X; - $this->Data[$Key]["Y"] = $Y; - } - - /* Dump all links */ - $Links = ""; - foreach($this->Data as $Key => $Settings) - { - $X1 = $Settings["X"]; - $Y1 = $Settings["Y"]; - - if ( isset($Settings["Connections"]) ) - { - foreach ($Settings["Connections"] as $ID => $NodeID) - { - if ( isset($this->Data[$NodeID]) ) - { - $X2 = $this->Data[$NodeID]["X"]; - $Y2 = $this->Data[$NodeID]["Y"]; - - $Links[] = array("X1"=>$X1,"Y1"=>$Y1,"X2"=>$X2,"Y2"=>$Y2,"Source"=>$Settings["Name"],"Destination"=>$this->Data[$NodeID]["Name"]); - } - } - } - } - - /* Check collisions */ - $Conflicts = 0; - foreach($this->Data as $Key => $Settings) - { - $X1 = $Settings["X"]; - $Y1 = $Settings["Y"]; - - if ( isset($Settings["Connections"]) ) - { - foreach ($Settings["Connections"] as $ID => $NodeID) - { - if ( isset($this->Data[$NodeID]) ) - { - $X2 = $this->Data[$NodeID]["X"]; - $Y2 = $this->Data[$NodeID]["Y"]; - - foreach($Links as $IDLinks => $Link) - { - $X3 = $Link["X1"]; $Y3 = $Link["Y1"]; $X4 = $Link["X2"]; $Y4 = $Link["Y2"]; - - if ( !($X1 == $X3 && $X2 == $X4 && $Y1 == $Y3 && $Y2 == $Y4 ) ) - { - if ( $this->intersect($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4) ) - { - if ( $Link["Source"] != $Settings["Name"] && $Link["Source"] != $this->Data[$NodeID]["Name"] && $Link["Destination"] != $Settings["Name"] && $Link["Destination"] != $this->Data[$NodeID]["Name"] ) - { $Conflicts++; } - } - } - } - } - } - } - } - return($Conflicts/2); - } - - /* Center the graph */ - function center() - { - /* Determine the real center */ - $TargetCenterX = ($this->X2 - $this->X1) / 2 + $this->X1; - $TargetCenterY = ($this->Y2 - $this->Y1) / 2 + $this->Y1; - - /* Get current boundaries */ - $XMin = $this->X2; $XMax = $this->X1; - $YMin = $this->Y2; $YMax = $this->Y1; - foreach($this->Data as $Key => $Settings) - { - $X = $Settings["X"]; - $Y = $Settings["Y"]; - - if ( $X < $XMin) { $XMin = $X; } - if ( $X > $XMax) { $XMax = $X; } - if ( $Y < $YMin) { $YMin = $Y; } - if ( $Y > $YMax) { $YMax = $Y; } - } - $CurrentCenterX = ($XMax - $XMin) / 2 + $XMin; - $CurrentCenterY = ($YMax - $YMin) / 2 + $YMin; - - /* Compute the offset to apply */ - $XOffset = $TargetCenterX - $CurrentCenterX; - $YOffset = $TargetCenterY - $CurrentCenterY; - - /* Correct the points position */ - foreach($this->Data as $Key => $Settings) - { - $this->Data[$Key]["X"] = $Settings["X"] + $XOffset; - $this->Data[$Key]["Y"] = $Settings["Y"] + $YOffset; - } - } - - /* Create the encoded string */ - function drawSpring($Object,$Settings="") - { - $this->pChartObject = $Object; - - $Pass = isset($Settings["Pass"]) ? $Settings["Pass"] : 50; - $Retries = isset($Settings["Retry"]) ? $Settings["Retry"] : 10; - $this->MagneticForceA = isset($Settings["MagneticForceA"]) ? $Settings["MagneticForceA"] : 1.5; - $this->MagneticForceR = isset($Settings["MagneticForceR"]) ? $Settings["MagneticForceR"] : 2; - $this->RingSize = isset($Settings["RingSize"]) ? $Settings["RingSize"] : 40; - $DrawVectors = isset($Settings["DrawVectors"]) ? $Settings["DrawVectors"] : FALSE; - $DrawQuietZone = isset($Settings["DrawQuietZone"]) ? $Settings["DrawQuietZone"] : FALSE; - $CenterGraph = isset($Settings["CenterGraph"]) ? $Settings["CenterGraph"] : TRUE; - $TextPadding = isset($Settings["TextPadding"]) ? $Settings["TextPadding"] : 4; - $Algorithm = isset($Settings["Algorithm"]) ? $Settings["Algorithm"] : ALGORITHM_WEIGHTED; - - $FontSize = $Object->FontSize; - $this->X1 = $Object->GraphAreaX1; - $this->Y1 = $Object->GraphAreaY1; - $this->X2 = $Object->GraphAreaX2; - $this->Y2 = $Object->GraphAreaY2; - - $Conflicts = 1; $Jobs = 0; $this->History["MinimumConflicts"] = -1; - while ($Conflicts != 0 && $Jobs < $Retries ) - { - $Jobs++; - - /* Compute the initial settings */ - $this->firstPass($Algorithm); - - /* Apply the vectors */ - if ( $Pass > 0 ) - { - for ($i=0; $i<=$Pass; $i++) { $this->doPass(); } - } - - $Conflicts = $this->lastPass(); - if ( $this->History["MinimumConflicts"] == -1 || $Conflicts < $this->History["MinimumConflicts"] ) - { $this->History["MinimumConflicts"] = $Conflicts; $this->History["Result"] = $this->Data; } - } - - $Conflicts = $this->History["MinimumConflicts"]; - $this->Data = $this->History["Result"]; - - if ( $CenterGraph ) { $this->center(); } - - /* Draw the connections */ - $Drawn = ""; - foreach($this->Data as $Key => $Settings) - { - $X = $Settings["X"]; - $Y = $Settings["Y"]; - - if ( isset($Settings["Connections"]) ) - { - foreach ($Settings["Connections"] as $ID => $NodeID) - { - if ( !isset($Drawn[$Key]) ) { $Drawn[$Key] = ""; } - if ( !isset($Drawn[$NodeID]) ) { $Drawn[$NodeID] = ""; } - - if ( isset($this->Data[$NodeID]) && !isset($Drawn[$Key][$NodeID]) && !isset($Drawn[$NodeID][$Key]) ) - { - $Color = array("R"=>$this->Default["LinkR"],"G"=>$this->Default["LinkG"],"B"=>$this->Default["LinkB"],"Alpha"=>$this->Default["Alpha"]); - - if ( $this->Links != "" ) - { - if ( isset($this->Links[$Key][$NodeID]["R"]) ) - { $Color = array("R"=>$this->Links[$Key][$NodeID]["R"],"G"=>$this->Links[$Key][$NodeID]["G"],"B"=>$this->Links[$Key][$NodeID]["B"],"Alpha"=>$this->Links[$Key][$NodeID]["Alpha"]); } - - if ( isset($this->Links[$Key][$NodeID]["Ticks"]) ) - { $Color["Ticks"] = $this->Links[$Key][$NodeID]["Ticks"]; } - } - - $X2 = $this->Data[$NodeID]["X"]; - $Y2 = $this->Data[$NodeID]["Y"]; - $this->pChartObject->drawLine($X,$Y,$X2,$Y2,$Color); - $Drawn[$Key][$NodeID] = TRUE; - - if ( isset($this->Links) && $this->Links != "" ) - { - if ( isset($this->Links[$Key][$NodeID]["Name"]) || isset($this->Links[$NodeID][$Key]["Name"]) ) - { - $Name = isset($this->Links[$Key][$NodeID]["Name"]) ? $this->Links[$Key][$NodeID]["Name"] : $this->Links[$NodeID][$Key]["Name"]; - $TxtX = ($X2 - $X)/2 + $X; - $TxtY = ($Y2 - $Y)/2 + $Y; - - if ( $X <= $X2 ) - $Angle = (360-$this->getAngle($X,$Y,$X2,$Y2)) % 360; - else - $Angle = (360-$this->getAngle($X2,$Y2,$X,$Y)) % 360; - - $Settings = $Color; - $Settings["Angle"] = $Angle; - $Settings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE; - $this->pChartObject->drawText($TxtX,$TxtY,$Name,$Settings); - } - } - } - } - } - } - - /* Draw the quiet zones */ - if ( $DrawQuietZone ) - { - foreach($this->Data as $Key => $Settings) - { - $X = $Settings["X"]; - $Y = $Settings["Y"]; - $FreeZone = $Settings["FreeZone"]; - - $this->pChartObject->drawFilledCircle($X,$Y,$FreeZone,array("R"=>0,"G"=>0,"B"=>0,"Alpha"=>2)); - } - } - - - /* Draw the nodes */ - foreach($this->Data as $Key => $Settings) - { - $X = $Settings["X"]; - $Y = $Settings["Y"]; - $Name = $Settings["Name"]; - $FreeZone = $Settings["FreeZone"]; - $Shape = $Settings["Shape"]; - $Size = $Settings["Size"]; - - $Color = array("R"=>$Settings["R"],"G"=>$Settings["G"],"B"=>$Settings["B"],"Alpha"=>$Settings["Alpha"],"BorderR"=>$Settings["BorderR"],"BorderG"=>$Settings["BorderG"],"BorderB"=>$Settings["BorderB"],"BorderApha"=>$Settings["BorderAlpha"]); - - if ( $Shape == NODE_SHAPE_CIRCLE ) - { - $this->pChartObject->drawFilledCircle($X,$Y,$Size,$Color); - } - elseif ( $Shape == NODE_SHAPE_TRIANGLE ) - { - $Points = ""; - $Points[] = cos(deg2rad(270)) * $Size + $X; $Points[] = sin(deg2rad(270)) * $Size + $Y; - $Points[] = cos(deg2rad(45)) * $Size + $X; $Points[] = sin(deg2rad(45)) * $Size + $Y; - $Points[] = cos(deg2rad(135)) * $Size + $X; $Points[] = sin(deg2rad(135)) * $Size + $Y; - $this->pChartObject->drawPolygon($Points,$Color); - } - elseif ( $Shape == NODE_SHAPE_SQUARE ) - { - $Offset = $Size/2; $Size = $Size / 2; - $this->pChartObject->drawFilledRectangle($X-$Offset,$Y-$Offset,$X+$Offset,$Y+$Offset,$Color); - } - - if ( $Name != "" ) - { - $LabelOptions = array("R"=>$this->Labels["R"],"G"=>$this->Labels["G"],"B"=>$this->Labels["B"],"Alpha"=>$this->Labels["Alpha"]); - - if ( $this->Labels["Type"] == LABEL_LIGHT ) - { - $LabelOptions["Align"] = TEXT_ALIGN_BOTTOMLEFT; - $this->pChartObject->drawText($X,$Y,$Name,$LabelOptions); - } - elseif ( $this->Labels["Type"] == LABEL_CLASSIC ) - { - $LabelOptions["Align"] = TEXT_ALIGN_TOPMIDDLE; - $LabelOptions["DrawBox"] = TRUE; - $LabelOptions["BoxAlpha"] = 50; - $LabelOptions["BorderOffset"] = 4; - $LabelOptions["RoundedRadius"] = 3; - $LabelOptions["BoxRounded"] = TRUE; - $LabelOptions["NoShadow"] = TRUE; - - $this->pChartObject->drawText($X,$Y+$Size+$TextPadding,$Name,$LabelOptions); - } - } - } - - /* Draw the vectors */ - if ( $DrawVectors ) - { - foreach($this->Data as $Key => $Settings) - { - $X1 = $Settings["X"]; - $Y1 = $Settings["Y"]; - - if ( isset($Settings["Vectors"]) && $Settings["Type"] != NODE_TYPE_CENTRAL ) - { - foreach($Settings["Vectors"] as $ID => $Vector) - { - $Type = $Vector["Type"]; - $Force = $Vector["Force"]; - $Angle = $Vector["Angle"]; - $Factor = $Type == "A" ? $this->MagneticForceA : $this->MagneticForceR; - $Color = $Type == "A" ? array("FillR"=>255,"FillG"=>0,"FillB"=>0) : array("FillR"=>0,"FillG"=>255,"FillB"=>0); - - $X2 = cos(deg2rad($Angle)) * $Force * $Factor + $X1; - $Y2 = sin(deg2rad($Angle)) * $Force * $Factor + $Y1; - - $this->pChartObject->drawArrow($X1,$Y1,$X2,$Y2,$Color); - } - } - } - } - - return(array("Pass"=>$Jobs,"Conflicts"=>$Conflicts)); - } - - /* Return the distance between two points */ - function getDistance($X1,$Y1,$X2,$Y2) - { return (sqrt(($X2-$X1)*($X2-$X1)+($Y2-$Y1)*($Y2-$Y1))); } - - /* Return the angle made by a line and the X axis */ - function getAngle($X1,$Y1,$X2,$Y2) - { - $Opposite = $Y2 - $Y1; $Adjacent = $X2 - $X1;$Angle = rad2deg(atan2($Opposite,$Adjacent)); - if ($Angle > 0) { return($Angle); } else { return(360-abs($Angle)); } - } - - function intersect($X1,$Y1,$X2,$Y2,$X3,$Y3,$X4,$Y4) - { - $A = (($X3 * $Y4 - $X4 * $Y3) * ($X1 - $X2) - ($X1 * $Y2 - $X2 * $Y1) * ($X3 - $X4)); - $B = (($Y1 - $Y2) * ($X3 - $X4) - ($Y3 - $Y4) * ($X1 - $X2)); - - if ( $B == 0 ) { return(FALSE); } - $Xi = $A / $B; - - $C = ($X1 - $X2); - if ( $C == 0 ) { return(FALSE); } - $Yi = $Xi * (($Y1 - $Y2)/$C) + (($X1 * $Y2 - $X2 * $Y1)/$C); - - if ( $Xi >= min($X1,$X2) && $Xi >= min($X3,$X4) && $Xi <= max($X1,$X2) && $Xi <= max($X3,$X4)) - { - if ( $Yi >= min($Y1,$Y2) && $Yi >= min($Y3,$Y4) && $Yi <= max($Y1,$Y2) && $Yi <= max($Y3,$Y4)) - { return(TRUE); } - } - - return(FALSE); - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pStock.class.php b/Under-Testing/Website/class/pStock.class.php deleted file mode 100644 index 7f9dbfb..0000000 --- a/Under-Testing/Website/class/pStock.class.php +++ /dev/null @@ -1,216 +0,0 @@ -pChartObject = $pChartObject; - $this->pDataObject = $pDataObject; - } - - /* Draw a stock chart */ - function drawStockChart($Format="") - { - $SerieOpen = isset($Format["SerieOpen"]) ? $Format["SerieOpen"] : "Open"; - $SerieClose = isset($Format["SerieClose"]) ? $Format["SerieClose"] : "Close"; - $SerieMin = isset($Format["SerieMin"]) ? $Format["SerieMin"] : "Min"; - $SerieMax = isset($Format["SerieMax"]) ? $Format["SerieMax"] : "Max"; - $SerieMedian = isset($Format["SerieMedian"]) ? $Format["SerieMedian"] : NULL; - $LineWidth = isset($Format["LineWidth"]) ? $Format["LineWidth"] : 1; - $LineR = isset($Format["LineR"]) ? $Format["LineR"] : 0; - $LineG = isset($Format["LineG"]) ? $Format["LineG"] : 0; - $LineB = isset($Format["LineB"]) ? $Format["LineB"] : 0; - $LineAlpha = isset($Format["LineAlpha"]) ? $Format["LineAlpha"] : 100; - $ExtremityWidth = isset($Format["ExtremityWidth"]) ? $Format["ExtremityWidth"] : 1; - $ExtremityLength = isset($Format["ExtremityLength"]) ? $Format["ExtremityLength"] : 3; - $ExtremityR = isset($Format["ExtremityR"]) ? $Format["ExtremityR"] : 0; - $ExtremityG = isset($Format["ExtremityG"]) ? $Format["ExtremityG"] : 0; - $ExtremityB = isset($Format["ExtremityB"]) ? $Format["ExtremityB"] : 0; - $ExtremityAlpha = isset($Format["ExtremityAlpha"]) ? $Format["ExtremityAlpha"] : 100; - $BoxWidth = isset($Format["BoxWidth"]) ? $Format["BoxWidth"] : 8; - $BoxUpR = isset($Format["BoxUpR"]) ? $Format["BoxUpR"] : 188; - $BoxUpG = isset($Format["BoxUpG"]) ? $Format["BoxUpG"] : 224; - $BoxUpB = isset($Format["BoxUpB"]) ? $Format["BoxUpB"] : 46; - $BoxUpAlpha = isset($Format["BoxUpAlpha"]) ? $Format["BoxUpAlpha"] : 100; - $BoxUpSurrounding = isset($Format["BoxUpSurrounding"]) ? $Format["BoxUpSurrounding"] : NULL; - $BoxUpBorderR = isset($Format["BoxUpBorderR"]) ? $Format["BoxUpBorderR"] : $BoxUpR-20; - $BoxUpBorderG = isset($Format["BoxUpBorderG"]) ? $Format["BoxUpBorderG"] : $BoxUpG-20; - $BoxUpBorderB = isset($Format["BoxUpBorderB"]) ? $Format["BoxUpBorderB"] : $BoxUpB-20; - $BoxUpBorderAlpha = isset($Format["BoxUpBorderAlpha"]) ? $Format["BoxUpBorderAlpha"] : 100; - $BoxDownR = isset($Format["BoxDownR"]) ? $Format["BoxDownR"] : 224; - $BoxDownG = isset($Format["BoxDownG"]) ? $Format["BoxDownG"] : 100; - $BoxDownB = isset($Format["BoxDownB"]) ? $Format["BoxDownB"] : 46; - $BoxDownAlpha = isset($Format["BoxDownAlpha"]) ? $Format["BoxDownAlpha"] : 100; - $BoxDownSurrounding= isset($Format["BoxDownSurrounding"]) ? $Format["BoxDownSurrounding"] : NULL; - $BoxDownBorderR = isset($Format["BoxDownBorderR"]) ? $Format["BoxDownBorderR"] : $BoxDownR-20; - $BoxDownBorderG = isset($Format["BoxDownBorderG"]) ? $Format["BoxDownBorderG"] : $BoxDownG-20; - $BoxDownBorderB = isset($Format["BoxDownBorderB"]) ? $Format["BoxDownBorderB"] : $BoxDownB-20; - $BoxDownBorderAlpha= isset($Format["BoxDownBorderAlpha"]) ? $Format["BoxDownBorderAlpha"] : 100; - $ShadowOnBoxesOnly = isset($Format["ShadowOnBoxesOnly"]) ? $Format["ShadowOnBoxesOnly"] : TRUE; - $MedianR = isset($Format["MedianR"]) ? $Format["MedianR"] : 255; - $MedianG = isset($Format["MedianG"]) ? $Format["MedianG"] : 0; - $MedianB = isset($Format["MedianB"]) ? $Format["MedianB"] : 0; - $MedianAlpha = isset($Format["MedianAlpha"]) ? $Format["MedianAlpha"] : 100; - $RecordImageMap = isset($Format["RecordImageMap"]) ? $Format["RecordImageMap"] : FALSE; - $ImageMapTitle = isset($Format["ImageMapTitle"]) ? $Format["ImageMapTitle"] : "Stock Chart"; - - - /* Data Processing */ - $Data = $this->pDataObject->getData(); - $Palette = $this->pDataObject->getPalette(); - - if ( $BoxUpSurrounding != NULL ) { $BoxUpBorderR = $BoxUpR + $BoxUpSurrounding; $BoxUpBorderG = $BoxUpG + $BoxUpSurrounding; $BoxUpBorderB = $BoxUpB + $BoxUpSurrounding; } - if ( $BoxDownSurrounding != NULL ) { $BoxDownBorderR = $BoxDownR + $BoxDownSurrounding; $BoxDownBorderG = $BoxDownG + $BoxDownSurrounding; $BoxDownBorderB = $BoxDownB + $BoxDownSurrounding; } - - if ( $LineWidth != 1 ) { $LineOffset = $LineWidth / 2; } - $BoxOffset = $BoxWidth / 2; - - $Data = $this->pChartObject->DataSet->getData(); - list($XMargin,$XDivs) = $this->pChartObject->scaleGetXSettings(); - - if ( !isset($Data["Series"][$SerieOpen]) || !isset($Data["Series"][$SerieClose]) || !isset($Data["Series"][$SerieMin]) || !isset($Data["Series"][$SerieMax]) ) - return(STOCK_MISSING_SERIE); - - $Plots = ""; - foreach($Data["Series"][$SerieOpen]["Data"] as $Key => $Value) - { - $Point = ""; - if ( isset($Data["Series"][$SerieClose]["Data"][$Key]) || isset($Data["Series"][$SerieMin]["Data"][$Key]) || isset($Data["Series"][$SerieMax]["Data"][$Key]) ) - $Point = array($Value,$Data["Series"][$SerieClose]["Data"][$Key],$Data["Series"][$SerieMin]["Data"][$Key],$Data["Series"][$SerieMax]["Data"][$Key]); - if ( $SerieMedian != NULL && isset($Data["Series"][$SerieMedian]["Data"][$Key]) ) - $Point[] = $Data["Series"][$SerieMedian]["Data"][$Key]; - - $Plots[] = $Point; - } - - $AxisID = $Data["Series"][$SerieOpen]["Axis"]; - $Mode = $Data["Axis"][$AxisID]["Display"]; - $Format = $Data["Axis"][$AxisID]["Format"]; - $Unit = $Data["Axis"][$AxisID]["Unit"]; - - $YZero = $this->pChartObject->scaleComputeY(0,array("AxisID"=>$AxisID)); - $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; - - $X = $this->pChartObject->GraphAreaX1 + $XMargin; - $Y = $this->pChartObject->GraphAreaY1 + $XMargin; - - $LineSettings = array("R"=>$LineR,"G"=>$LineG,"B"=>$LineB,"Alpha"=>$LineAlpha); - $ExtremitySettings = array("R"=>$ExtremityR,"G"=>$ExtremityG,"B"=>$ExtremityB,"Alpha"=>$ExtremityAlpha); - $BoxUpSettings = array("R"=>$BoxUpR,"G"=>$BoxUpG,"B"=>$BoxUpB,"Alpha"=>$BoxUpAlpha,"BorderR"=>$BoxUpBorderR,"BorderG"=>$BoxUpBorderG,"BorderB"=>$BoxUpBorderB,"BorderAlpha"=>$BoxUpBorderAlpha); - $BoxDownSettings = array("R"=>$BoxDownR,"G"=>$BoxDownG,"B"=>$BoxDownB,"Alpha"=>$BoxDownAlpha,"BorderR"=>$BoxDownBorderR,"BorderG"=>$BoxDownBorderG,"BorderB"=>$BoxDownBorderB,"BorderAlpha"=>$BoxDownBorderAlpha); - $MedianSettings = array("R"=>$MedianR,"G"=>$MedianG,"B"=>$MedianB,"Alpha"=>$MedianAlpha); - - foreach($Plots as $Key =>$Points) - { - $PosArray = $this->pChartObject->scaleComputeY($Points,array("AxisID"=>$AxisID)); - - $Values = "Open :".$Data["Series"][$SerieOpen]["Data"][$Key]."
Close : ".$Data["Series"][$SerieClose]["Data"][$Key]."
Min : ".$Data["Series"][$SerieMin]["Data"][$Key]."
Max : ".$Data["Series"][$SerieMax]["Data"][$Key]."
"; - if ( $SerieMedian != NULL ) { $Values = $Values."Median : ".$Data["Series"][$SerieMedian]["Data"][$Key]."
"; } - if ( $PosArray[0] > $PosArray[1] ) { $ImageMapColor = $this->pChartObject->toHTMLColor($BoxUpR,$BoxUpG,$BoxUpB); } else { $ImageMapColor = $this->pChartObject->toHTMLColor($BoxDownR,$BoxDownG,$BoxDownB); } - - if ( $Data["Orientation"] == SCALE_POS_LEFTRIGHT ) - { - if ( $YZero > $this->pChartObject->GraphAreaY2-1 ) { $YZero = $this->pChartObject->GraphAreaY2-1; } - if ( $YZero < $this->pChartObject->GraphAreaY1+1 ) { $YZero = $this->pChartObject->GraphAreaY1+1; } - - if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaX2-$this->pChartObject->GraphAreaX1-$XMargin*2)/$XDivs; } - - if ( $ShadowOnBoxesOnly ) { $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; } - - if ( $LineWidth == 1 ) - $this->pChartObject->drawLine($X,$PosArray[2],$X,$PosArray[3],$LineSettings); - else - $this->pChartObject->drawFilledRectangle($X-$LineOffset,$PosArray[2],$X+$LineOffset,$PosArray[3],$LineSettings); - - if ( $ExtremityWidth == 1 ) - { - $this->pChartObject->drawLine($X-$ExtremityLength,$PosArray[2],$X+$ExtremityLength,$PosArray[2],$ExtremitySettings); - $this->pChartObject->drawLine($X-$ExtremityLength,$PosArray[3],$X+$ExtremityLength,$PosArray[3],$ExtremitySettings); - - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("RECT",floor($X-$ExtremityLength).",".floor($PosArray[2]).",".floor($X+$ExtremityLength).",".floor($PosArray[3]),$ImageMapColor,$ImageMapTitle,$Values); } - } - else - { - $this->pChartObject->drawFilledRectangle($X-$ExtremityLength,$PosArray[2],$X+$ExtremityLength,$PosArray[2]-$ExtremityWidth,$ExtremitySettings); - $this->pChartObject->drawFilledRectangle($X-$ExtremityLength,$PosArray[3],$X+$ExtremityLength,$PosArray[3]+$ExtremityWidth,$ExtremitySettings); - - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("RECT",floor($X-$ExtremityLength).",".floor($PosArray[2]-$ExtremityWidth).",".floor($X+$ExtremityLength).",".floor($PosArray[3]+$ExtremityWidth),$ImageMapColor,$ImageMapTitle,$Values); } - } - - if ( $ShadowOnBoxesOnly ) { $this->pChartObject->Shadow = $RestoreShadow; } - - if ( $PosArray[0] > $PosArray[1] ) - $this->pChartObject->drawFilledRectangle($X-$BoxOffset,$PosArray[0],$X+$BoxOffset,$PosArray[1],$BoxUpSettings); - else - $this->pChartObject->drawFilledRectangle($X-$BoxOffset,$PosArray[0],$X+$BoxOffset,$PosArray[1],$BoxDownSettings); - - if ( isset($PosArray[4]) ) - $this->pChartObject->drawLine($X-$ExtremityLength,$PosArray[4],$X+$ExtremityLength,$PosArray[4],$MedianSettings); - - $X = $X + $XStep; - } - elseif ( $Data["Orientation"] == SCALE_POS_TOPBOTTOM ) - { - if ( $YZero > $this->pChartObject->GraphAreaX2-1 ) { $YZero = $this->pChartObject->GraphAreaX2-1; } - if ( $YZero < $this->pChartObject->GraphAreaX1+1 ) { $YZero = $this->pChartObject->GraphAreaX1+1; } - - if ( $XDivs == 0 ) { $XStep = 0; } else { $XStep = ($this->pChartObject->GraphAreaY2-$this->pChartObject->GraphAreaY1-$XMargin*2)/$XDivs; } - - if ( $LineWidth == 1 ) - $this->pChartObject->drawLine($PosArray[2],$Y,$PosArray[3],$Y,$LineSettings); - else - $this->pChartObject->drawFilledRectangle($PosArray[2],$Y-$LineOffset,$PosArray[3],$Y+$LineOffset,$LineSettings); - - if ( $ShadowOnBoxesOnly ) { $RestoreShadow = $this->pChartObject->Shadow; $this->pChartObject->Shadow = FALSE; } - - if ( $ExtremityWidth == 1 ) - { - $this->pChartObject->drawLine($PosArray[2],$Y-$ExtremityLength,$PosArray[2],$Y+$ExtremityLength,$ExtremitySettings); - $this->pChartObject->drawLine($PosArray[3],$Y-$ExtremityLength,$PosArray[3],$Y+$ExtremityLength,$ExtremitySettings); - - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("RECT",floor($PosArray[2]).",".floor($Y-$ExtremityLength).",".floor($PosArray[3]).",".floor($Y+$ExtremityLength),$ImageMapColor,$ImageMapTitle,$Values); } - } - else - { - $this->pChartObject->drawFilledRectangle($PosArray[2],$Y-$ExtremityLength,$PosArray[2]-$ExtremityWidth,$Y+$ExtremityLength,$ExtremitySettings); - $this->pChartObject->drawFilledRectangle($PosArray[3],$Y-$ExtremityLength,$PosArray[3]+$ExtremityWidth,$Y+$ExtremityLength,$ExtremitySettings); - - if ( $RecordImageMap ) { $this->pChartObject->addToImageMap("RECT",floor($PosArray[2]-$ExtremityWidth).",".floor($Y-$ExtremityLength).",".floor($PosArray[3]+$ExtremityWidth).",".floor($Y+$ExtremityLength),$ImageMapColor,$ImageMapTitle,$Values); } - } - - if ( $ShadowOnBoxesOnly ) { $this->pChartObject->Shadow = $RestoreShadow; } - - if ( $PosArray[0] < $PosArray[1] ) - $this->pChartObject->drawFilledRectangle($PosArray[0],$Y-$BoxOffset,$PosArray[1],$Y+$BoxOffset,$BoxUpSettings); - else - $this->pChartObject->drawFilledRectangle($PosArray[0],$Y-$BoxOffset,$PosArray[1],$Y+$BoxOffset,$BoxDownSettings); - - if ( isset($PosArray[4]) ) - $this->pChartObject->drawLine($PosArray[4],$Y-$ExtremityLength,$PosArray[4],$Y+$ExtremityLength,$MedianSettings); - - $Y = $Y + $XStep; - } - } - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/class/pSurface.class.php b/Under-Testing/Website/class/pSurface.class.php deleted file mode 100644 index f887ac0..0000000 --- a/Under-Testing/Website/class/pSurface.class.php +++ /dev/null @@ -1,315 +0,0 @@ -pChartObject = $pChartObject; - $this->GridSize = 10; - $this->Points = ""; - } - - /* Define the grid size and initialise the 2D matrix */ - function setGrid($XSize=10,$YSize=10) - { - for($X=0; $X<=$XSize; $X++) { for($Y=0; $Y<=$YSize; $Y++) { $this->Points[$X][$Y]=UNKNOWN; } } - - $this->GridSizeX = $XSize; - $this->GridSizeY = $YSize; - } - - /* Add a point on the grid */ - function addPoint($X,$Y,$Value,$Force=TRUE) - { - if ( $X < 0 || $X >$this->GridSizeX ) { return(0); } - if ( $Y < 0 || $Y >$this->GridSizeY ) { return(0); } - - if ( $this->Points[$X][$Y] == UNKNOWN || $Force ) - $this->Points[$X][$Y] = $Value; - elseif ( $this->Points[$X][$Y] == UNKNOWN ) - $this->Points[$X][$Y] = $Value; - else - $this->Points[$X][$Y] = ($this->Points[$X][$Y] + $Value)/2; - } - - /* Write the X labels */ - function writeXLabels($Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : $this->pChartObject->FontColorR; - $G = isset($Format["G"]) ? $Format["G"] : $this->pChartObject->FontColorG; - $B = isset($Format["B"]) ? $Format["B"] : $this->pChartObject->FontColorB; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $this->pChartObject->FontColorA; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $Padding = isset($Format["Padding"]) ? $Format["Padding"] : 5; - $Position = isset($Format["Position"]) ? $Format["Position"] : LABEL_POSITION_TOP; - $Labels = isset($Format["Labels"]) ? $Format["Labels"] : NULL; - $CountOffset = isset($Format["CountOffset"]) ? $Format["CountOffset"] : 0; - - if ( $Labels != NULL && !is_array($Labels) ) { $Label = $Labels; $Labels = ""; $Labels[] = $Label; } - - $X0 = $this->pChartObject->GraphAreaX1; - $XSize = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) / ($this->GridSizeX+1); - - $Settings = array("Angle"=>$Angle,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - if ( $Position == LABEL_POSITION_TOP ) - { - $YPos = $this->pChartObject->GraphAreaY1 - $Padding; - if ($Angle == 0 ) { $Settings["Align"] = TEXT_ALIGN_BOTTOMMIDDLE; } - if ($Angle != 0 ) { $Settings["Align"] = TEXT_ALIGN_MIDDLELEFT; } - } - elseif ( $Position == LABEL_POSITION_BOTTOM ) - { - $YPos = $this->pChartObject->GraphAreaY2 + $Padding; - if ($Angle == 0 ) { $Settings["Align"] = TEXT_ALIGN_TOPMIDDLE; } - if ($Angle != 0 ) { $Settings["Align"] = TEXT_ALIGN_MIDDLERIGHT; } - } - else - return(-1); - - for($X=0;$X<=$this->GridSizeX;$X++) - { - $XPos = floor($X0+$X*$XSize + $XSize/2); - - if( $Labels == NULL || !isset($Labels[$X]) ) - $Value = $X+$CountOffset; - else - $Value = $Labels[$X]; - - $this->pChartObject->drawText($XPos,$YPos,$Value,$Settings); - } - } - - /* Write the Y labels */ - function writeYLabels($Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : $this->pChartObject->FontColorR; - $G = isset($Format["G"]) ? $Format["G"] : $this->pChartObject->FontColorG; - $B = isset($Format["B"]) ? $Format["B"] : $this->pChartObject->FontColorB; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : $this->pChartObject->FontColorA; - $Angle = isset($Format["Angle"]) ? $Format["Angle"] : 0; - $Padding = isset($Format["Padding"]) ? $Format["Padding"] : 5; - $Position = isset($Format["Position"]) ? $Format["Position"] : LABEL_POSITION_LEFT; - $Labels = isset($Format["Labels"]) ? $Format["Labels"] : NULL; - $CountOffset = isset($Format["CountOffset"]) ? $Format["CountOffset"] : 0; - - if ( $Labels != NULL && !is_array($Labels) ) { $Label = $Labels; $Labels = ""; $Labels[] = $Label; } - - $Y0 = $this->pChartObject->GraphAreaY1; - $YSize = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) / ($this->GridSizeY+1); - - $Settings = array("Angle"=>$Angle,"R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - if ( $Position == LABEL_POSITION_LEFT ) - { $XPos = $this->pChartObject->GraphAreaX1 - $Padding; $Settings["Align"] = TEXT_ALIGN_MIDDLERIGHT; } - elseif ( $Position == LABEL_POSITION_RIGHT ) - { $XPos = $this->pChartObject->GraphAreaX2 + $Padding; $Settings["Align"] = TEXT_ALIGN_MIDDLELEFT; } - else - return(-1); - - for($Y=0;$Y<=$this->GridSizeY;$Y++) - { - $YPos = floor($Y0+$Y*$YSize + $YSize/2); - - if( $Labels == NULL || !isset($Labels[$Y]) ) - $Value = $Y+$CountOffset; - else - $Value = $Labels[$Y]; - - $this->pChartObject->drawText($XPos,$YPos,$Value,$Settings); - } - } - - /* Draw the area arround the specified Threshold */ - function drawContour($Threshold,$Format="") - { - $R = isset($Format["R"]) ? $Format["R"] : 0; - $G = isset($Format["G"]) ? $Format["G"] : 0; - $B = isset($Format["B"]) ? $Format["B"] : 0; - $Alpha = isset($Format["Alpha"]) ? $Format["Alpha"] : 100; - $Ticks = isset($Format["Ticks"]) ? $Format["Ticks"] : 3; - $Padding = isset($Format["Padding"]) ? $Format["Padding"] : 0; - - $X0 = $this->pChartObject->GraphAreaX1; - $Y0 = $this->pChartObject->GraphAreaY1; - $XSize = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) / ($this->GridSizeX+1); - $YSize = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) / ($this->GridSizeY+1); - - $Color = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha,"Ticks"=>$Ticks); - - for($X=0;$X<=$this->GridSizeX;$X++) - { - for($Y=0;$Y<=$this->GridSizeY;$Y++) - { - $Value = $this->Points[$X][$Y]; - - if ( $Value != UNKNOWN && $Value != IGNORED && $Value >= $Threshold) - { - $X1 = floor($X0+$X*$XSize)+$Padding; - $Y1 = floor($Y0+$Y*$YSize)+$Padding; - $X2 = floor($X0+$X*$XSize+$XSize); - $Y2 = floor($Y0+$Y*$YSize+$YSize); - - if ( $X > 0 && $this->Points[$X-1][$Y] != UNKNOWN && $this->Points[$X-1][$Y] != IGNORED && $this->Points[$X-1][$Y] < $Threshold) - $this->pChartObject->drawLine($X1,$Y1,$X1,$Y2,$Color); - if ( $Y > 0 && $this->Points[$X][$Y-1] != UNKNOWN && $this->Points[$X][$Y-1] != IGNORED && $this->Points[$X][$Y-1] < $Threshold) - $this->pChartObject->drawLine($X1,$Y1,$X2,$Y1,$Color); - if ( $X < $this->GridSizeX && $this->Points[$X+1][$Y] != UNKNOWN && $this->Points[$X+1][$Y] != IGNORED && $this->Points[$X+1][$Y] < $Threshold) - $this->pChartObject->drawLine($X2,$Y1,$X2,$Y2,$Color); - if ( $Y < $this->GridSizeY && $this->Points[$X][$Y+1] != UNKNOWN && $this->Points[$X][$Y+1] != IGNORED && $this->Points[$X][$Y+1] < $Threshold) - $this->pChartObject->drawLine($X1,$Y2,$X2,$Y2,$Color); - } - } - } - } - - /* Draw the surface chart */ - function drawSurface($Format="") - { - $Palette = isset($Format["Palette"]) ? $Format["Palette"] : NULL; - $ShadeR1 = isset($Format["ShadeR1"]) ? $Format["ShadeR1"] : 77; - $ShadeG1 = isset($Format["ShadeG1"]) ? $Format["ShadeG1"] : 205; - $ShadeB1 = isset($Format["ShadeB1"]) ? $Format["ShadeB1"] : 21; - $ShadeA1 = isset($Format["ShadeA1"]) ? $Format["ShadeA1"] : 40; - $ShadeR2 = isset($Format["ShadeR2"]) ? $Format["ShadeR2"] : 227; - $ShadeG2 = isset($Format["ShadeG2"]) ? $Format["ShadeG2"] : 135; - $ShadeB2 = isset($Format["ShadeB2"]) ? $Format["ShadeB2"] : 61; - $ShadeA2 = isset($Format["ShadeA2"]) ? $Format["ShadeA2"] : 100; - $Border = isset($Format["Border"]) ? $Format["Border"] : FALSE; - $BorderR = isset($Format["BorderR"]) ? $Format["BorderR"] : 0; - $BorderG = isset($Format["BorderG"]) ? $Format["BorderG"] : 0; - $BorderB = isset($Format["BorderB"]) ? $Format["BorderB"] : 0; - $Surrounding = isset($Format["Surrounding"]) ? $Format["Surrounding"] : -1; - $Padding = isset($Format["Padding"]) ? $Format["Padding"] : 1; - - $X0 = $this->pChartObject->GraphAreaX1; - $Y0 = $this->pChartObject->GraphAreaY1; - $XSize = ($this->pChartObject->GraphAreaX2 - $this->pChartObject->GraphAreaX1) / ($this->GridSizeX+1); - $YSize = ($this->pChartObject->GraphAreaY2 - $this->pChartObject->GraphAreaY1) / ($this->GridSizeY+1); - - for($X=0;$X<=$this->GridSizeX;$X++) - { - for($Y=0;$Y<=$this->GridSizeY;$Y++) - { - $Value = $this->Points[$X][$Y]; - - if ( $Value != UNKNOWN && $Value != IGNORED ) - { - $X1 = floor($X0+$X*$XSize)+$Padding; - $Y1 = floor($Y0+$Y*$YSize)+$Padding; - $X2 = floor($X0+$X*$XSize+$XSize); - $Y2 = floor($Y0+$Y*$YSize+$YSize); - - if ( $Palette != NULL ) - { - if ( isset($Palette[$Value]) && isset($Palette[$Value]["R"]) ) { $R = $Palette[$Value]["R"]; } else { $R = 0; } - if ( isset($Palette[$Value]) && isset($Palette[$Value]["G"]) ) { $G = $Palette[$Value]["G"]; } else { $G = 0; } - if ( isset($Palette[$Value]) && isset($Palette[$Value]["B"]) ) { $B = $Palette[$Value]["B"]; } else { $B = 0; } - if ( isset($Palette[$Value]) && isset($Palette[$Value]["Alpha"]) ) { $Alpha = $Palette[$Value]["Alpha"]; } else { $Alpha = 1000; } - } - else - { - $R = (($ShadeR2-$ShadeR1)/100)*$Value + $ShadeR1; - $G = (($ShadeG2-$ShadeG1)/100)*$Value + $ShadeG1; - $B = (($ShadeB2-$ShadeB1)/100)*$Value + $ShadeB1; - $Alpha = (($ShadeA2-$ShadeA1)/100)*$Value + $ShadeA1; - } - - $Settings = array("R"=>$R,"G"=>$G,"B"=>$B,"Alpha"=>$Alpha); - if ( $Border ) { $Settings["BorderR"] = $BorderR; $Settings["BorderG"] = $BorderG; $Settings["BorderB"] = $BorderB; } - if ( $Surrounding != -1 ) { $Settings["BorderR"] = $R+$Surrounding; $Settings["BorderG"] = $G+$Surrounding; $Settings["BorderB"] = $B+$Surrounding; } - - $this->pChartObject->drawFilledRectangle($X1,$Y1,$X2-1,$Y2-1,$Settings); - } - } - } - } - - /* Compute the missing points */ - function computeMissing() - { - $Missing = ""; - for($X=0;$X<=$this->GridSizeX;$X++) - { - for($Y=0;$Y<=$this->GridSizeY;$Y++) - { - if ( $this->Points[$X][$Y] == UNKNOWN ) - $Missing[] = $X.",".$Y; - } - } - shuffle($Missing); - - foreach($Missing as $Key => $Pos) - { - $Pos = preg_split("/,/",$Pos); - $X = $Pos[0]; - $Y = $Pos[1]; - - if ( $this->Points[$X][$Y] == UNKNOWN ) - { - $NearestNeighbor = $this->getNearestNeighbor($X,$Y); - - $Value = 0; $Points = 0; - for($Xi=$X-$NearestNeighbor;$Xi<=$X+$NearestNeighbor;$Xi++) - { - for($Yi=$Y-$NearestNeighbor;$Yi<=$Y+$NearestNeighbor;$Yi++) - { - if ($Xi >=0 && $Yi >= 0 && $Xi <= $this->GridSizeX && $Yi <= $this->GridSizeY && $this->Points[$Xi][$Yi] != UNKNOWN && $this->Points[$Xi][$Yi] != IGNORED) - { - $Value = $Value + $this->Points[$Xi][$Yi]; $Points++; - } - } - } - - if ( $Points != 0 ) { $this->Points[$X][$Y] = $Value / $Points; } - } - } - } - - /* Return the nearest Neighbor distance of a point */ - function getNearestNeighbor($Xp,$Yp) - { - $Nearest = UNKNOWN; - for($X=0;$X<=$this->GridSizeX;$X++) - { - for($Y=0;$Y<=$this->GridSizeY;$Y++) - { - if ( $this->Points[$X][$Y] != UNKNOWN && $this->Points[$X][$Y] != IGNORED ) - { - $DistanceX = max($Xp,$X)-min($Xp,$X); - $DistanceY = max($Yp,$Y)-min($Yp,$Y); - $Distance = max($DistanceX,$DistanceY); - if ( $Distance < $Nearest || $Nearest == UNKNOWN ) { $Nearest = $Distance; } - } - } - } - return($Nearest); - } - } -?> \ No newline at end of file diff --git a/Under-Testing/Website/css/Critical.png b/Under-Testing/Website/css/Critical.png deleted file mode 100644 index e025d19..0000000 Binary files a/Under-Testing/Website/css/Critical.png and /dev/null differ diff --git a/Under-Testing/Website/css/Help.png b/Under-Testing/Website/css/Help.png deleted file mode 100644 index 42a8f7c..0000000 Binary files a/Under-Testing/Website/css/Help.png and /dev/null differ diff --git a/Under-Testing/Website/css/Info.png b/Under-Testing/Website/css/Info.png deleted file mode 100644 index 5a7a2c3..0000000 Binary files a/Under-Testing/Website/css/Info.png and /dev/null differ diff --git a/Under-Testing/Website/css/Warning.png b/Under-Testing/Website/css/Warning.png deleted file mode 100644 index 0af654e..0000000 Binary files a/Under-Testing/Website/css/Warning.png and /dev/null differ diff --git a/Under-Testing/Website/css/chk_off.png b/Under-Testing/Website/css/chk_off.png deleted file mode 100755 index 1514d51..0000000 Binary files a/Under-Testing/Website/css/chk_off.png and /dev/null differ diff --git a/Under-Testing/Website/css/chk_on.png b/Under-Testing/Website/css/chk_on.png deleted file mode 100755 index a9925a0..0000000 Binary files a/Under-Testing/Website/css/chk_on.png and /dev/null differ diff --git a/Under-Testing/Website/css/formCSS.css b/Under-Testing/Website/css/formCSS.css deleted file mode 100644 index f94bd72..0000000 --- a/Under-Testing/Website/css/formCSS.css +++ /dev/null @@ -1,46 +0,0 @@ -/* fancyform styles edited by Refik Hadzialic*/ -html -{ -font-family:Arial,Helvetica,sans-serif; -} -.form label -{ -display:block; -padding:0.0em; -padding-left:22px; -/*background-position:9px center;*/ -background-repeat:no-repeat; -/*border:1px solid #252525;*/ -clear:both;cursor:pointer; - -font-family:Arial,Helvetica,sans-serif; -font-style:normal; -font-size:15px; -} - -.checked -{ -background-color:#fff; -background-image:url(chk_on.png); -} - -.unchecked -{ -background-color:#fff; -background-image:url(chk_off.png); -} - -.leftcol -{ -float:left; -clear:left; -width:30%; -} - -.rightcol -{ -float:left; -clear:right; -width:50%; -} - diff --git a/Under-Testing/Website/css/info_rhombus.png b/Under-Testing/Website/css/info_rhombus.png deleted file mode 100644 index 036733e..0000000 Binary files a/Under-Testing/Website/css/info_rhombus.png and /dev/null differ diff --git a/Under-Testing/Website/css/information.png b/Under-Testing/Website/css/information.png deleted file mode 100644 index 93c67f2..0000000 Binary files a/Under-Testing/Website/css/information.png and /dev/null differ diff --git a/Under-Testing/Website/css/link.gif b/Under-Testing/Website/css/link.gif deleted file mode 100644 index daada04..0000000 Binary files a/Under-Testing/Website/css/link.gif and /dev/null differ diff --git a/Under-Testing/Website/css/tableCSS.css b/Under-Testing/Website/css/tableCSS.css deleted file mode 100644 index 32a6d71..0000000 --- a/Under-Testing/Website/css/tableCSS.css +++ /dev/null @@ -1,147 +0,0 @@ -/* ------------------------------------------------------- -Author: Vitaly Friedman but edited by Refik Hadzialic -Theme: Green Life - A Fresh, Warm and Readable Table -URL: http://www.alvit.de/vf -------------------------------------------------------- -*/ - - html { - height: 100%; - } - #main { - float: left; - width: 350px; - } - #sidebar - { - float: left; - width: 700px; - } - #footer - { - position: absolute; - bottom: 0; - padding-top: 0px; - padding-right: 220px; - padding-left: 350px; - border: 0; - border-style: none; - } - body { - background-color: #F0F0F0; - font-family: verdana, verdana, ariel; - height: 100%; - } - - a.pChart - { - text-decoration: none; - color: #6A6A6A; - } - - table { - font: 11px verdana,verdana, arial; - margin: 0; - padding: 0; - border-collapse: collapse; - text-align: left; - color: #333; - line-height: 19px; - } - - caption { - font-size: 14px; - font-weight: bold; - margin-bottom: 20px; - text-align: left; - text-transform: uppercase; - } - - td { - margin: 0; - padding: 20px 10px; - border: 1px dotted #f5f5f5; - } - - - th { - font-weight: normal; - text-transform: uppercase; - } - - thead tr th { - background-color: #575757; - padding: 20px 10px; - color: #fff; - font-weight: bold; - border-right: 2px solid #333; - text-transform: uppercase; - text-align:center; - } - - tfoot tr th, tfoot tr td { - background-color: transparent; - padding: 20px 10px; - color: #ccc; - border-top: 1px solid #ccc; - } - - tbody tr th { - padding: 20px 10px; - border-bottom: 1px dotted #fafafa; - } - - tr { - background-color: #FBFDF6; - } - tr.odd { - background-color: #EDF7DC; - } - - tr:hover { - } - - tr:hover td, tr:hover td a, tr:hover th a { - color: #a10000; - } - - td:hover { - } - - tr:hover th a:hover { - background-color: #F7FBEF; - border-bottom: 2px solid #86C200; - } - - table a { - color: #608117; - background-image: none; - text-decoration: none; - border-bottom: 1px dotted #8A8F95; - padding: 2px; - padding-right: 12px; background: transparent url(link.gif) no-repeat 100% 50%; - } - - table a:hover { - color: #BBC4CD; - background-image: none; - text-decoration: none; - border-bottom: 3px solid #333; - padding: 2px; - padding-right: 12px; color: #A2A2A2; background: transparent url(link.gif) no-repeat 100% 50%; - } - - table a:visited { - text-decoration: none; - border-bottom: 1px dotted #333; - text-decoration: none; - padding-right: 12px; color: #A2A2A2; background: transparent url(visitedLink.gif) no-repeat 100% 50%; - } - - table a:visited:hover { - background-image: none; - text-decoration: none; - border-bottom: 3px solid #333; - padding: 2px; - padding-right: 12px; color: #A2A2A2; background: transparent url(visitedLink.gif) no-repeat 100% 50%; - } diff --git a/Under-Testing/Website/css/tooltip.css b/Under-Testing/Website/css/tooltip.css deleted file mode 100644 index 3a50734..0000000 --- a/Under-Testing/Website/css/tooltip.css +++ /dev/null @@ -1,33 +0,0 @@ -.tooltip { - border-bottom: 1px dotted #000000; color: #000000; outline: none; - cursor: help; text-decoration: none; - position: relative; - } - .tooltip span { - margin-left: -999em; - position: absolute; - } - .tooltip:hover span { - border-radius: 5px 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.1); -webkit-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); -moz-box-shadow: 5px 5px rgba(0, 0, 0, 0.1); - font-family: Calibri, Tahoma, Geneva, sans-serif; - position: absolute; left: 1em; top: 2em; z-index: 99; - margin-left: 0; width: 250px; - } - .tooltip:hover img { - border: 0; margin: -10px 0 0 -55px; - float: left; position: absolute; - } - .tooltip:hover em { - font-family: Candara, Tahoma, Geneva, sans-serif; font-size: 1.2em; font-weight: bold; - display: block; padding: 0.2em 0 0.6em 0; - } - .classic { padding: 0.8em 1em; } - .custom { padding: 0.5em 0.8em 0.8em 2em; } - * html a:hover { background: transparent; } - .classic {background: #f8ff88; border: 1px solid #FFAD33; } - .critical { background: #f8ff88; border: 1px solid #FF3334; } - .help { background: #f8ff88; border: 1px solid #2BB0D7; } - .info { background: #f8ff88; border: 1px solid #2BB0D7; } - .warning { background: #f8ff88; border: 1px solid #FFAD33; } - diff --git a/Under-Testing/Website/css/visitedLink.gif b/Under-Testing/Website/css/visitedLink.gif deleted file mode 100644 index f7f1867..0000000 Binary files a/Under-Testing/Website/css/visitedLink.gif and /dev/null differ diff --git a/Under-Testing/Website/delayedLoading.js b/Under-Testing/Website/delayedLoading.js deleted file mode 100644 index b76bbe3..0000000 --- a/Under-Testing/Website/delayedLoading.js +++ /dev/null @@ -1,228 +0,0 @@ - /* - delayedLoader - JS to delay out of sight pictures rendering - - Version : 2.0.2 - Made by : Jean-Damien POGOLOTTI - Last Update : 10/12/10 - - This file can be distributed under the license you can find at : - - http://www.pchart.net/license - - You can find the whole class documentation on the pChart web site. - */ - - var PictureCache = new Array(); - var PictureCount = 0; - var WaitPicture = "wait.gif"; - var DivClassName = "pChart"; - var DefaultWidth = 70; - var DefaultHeight = 230; - var DefaultAlt = "pChart rendered picture"; - - - /* Do the DOM document processing */ - function loaderInit() - { - WindowSize = getWindowSize(); - WindowHeight = WindowSize[1]; - Offset = getScrollXY(); - HeightOffset = Offset[1]; - - /* Enumerate the tags */ - Links = document.getElementsByTagName("a"); - for (i = 0; i < Links.length; i++) - { - className = Links[i].className; - - if ( className == DivClassName ) - { - ObjectWidth = Links[i].getAttribute("data-pchart-width"); - ObjectHeight = Links[i].getAttribute("data-pchart-height"); - ObjectID = Links[i].id; - ObjectTop = Links[i].offsetTop; - ObjectURL = Links[i].href; - ObjectAlt = Links[i].getAttribute("data-pchart-alt"); - - if ( ObjectWidth == null ) { ObjectWidth = DefaultWidth; } - if ( ObjectHeight == null ) { ObjectHeight = DefaultHeight; } - if ( ObjectAlt == null ) { ObjectAlt = DefaultAlt; } - - if (ObjectID == "") { ObjectID = "pChart-"+i; Links[i].id = ObjectID; } - - PictureCache[PictureCount] = new Array(); - PictureCache[PictureCount][0] = ObjectID; - PictureCache[PictureCount][1] = ObjectTop; - PictureCache[PictureCount][2] = ObjectURL; - PictureCache[PictureCount][3] = ObjectAlt; - PictureCache[PictureCount][4] = ObjectWidth; - PictureCache[PictureCount][5] = ObjectHeight; - - PictureCount++; - } - } - - /* Replace the tags by
ones and attach the loader */ - for(i=0;i",i); - - if ( HeightOffset + WindowHeight > PictureCache[i][1] ) { triggerVisible(i); } - } - } - - /* Replace the contents of the delayed loading DIV */ - function changeContent(html, id) - { DivID = PictureCache[id][0]; document.getElementById(DivID).innerHTML = html; } - - /* Trigger the picture rendering when the pChart DIV became visible */ - function triggerVisible(PictureID) - { - if ( !PictureCache[PictureID][6] == true ) - { - PictureCache[PictureID][6] = true; - ajaxRender(PictureCache[PictureID][2],PictureID); - } - } - - /* Catch the navigator window scrolling event */ - function scrollEvent() - { - WindowSize = getWindowSize(); - WindowHeight = WindowSize[1]; - Offset = getScrollXY(); - HeightOffset = Offset[1]; - - for(i=0;i<=PictureCount-1;i++) { if ( HeightOffset + WindowHeight > PictureCache[i][1] ) { triggerVisible(i); } } - } - - /* Cross browser X/Y window offset gatherer */ - function getScrollXY() - { - var scrOfX = 0, scrOfY = 0; - - if( typeof( window.pageYOffset ) == 'number' ) - { scrOfY = window.pageYOffset; scrOfX = window.pageXOffset; } - else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) - { scrOfY = document.body.scrollTop; scrOfX = document.body.scrollLeft; } - else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) - { scrOfY = document.documentElement.scrollTop; scrOfX = document.documentElement.scrollLeft; } - - return [ scrOfX, scrOfY ]; - } - - /* Cross browser X/Y window size gatherer */ - function getWindowSize() - { - var myWidth = 0, myHeight = 0; - - if( typeof( window.innerWidth ) == 'number' ) - { myWidth = window.innerWidth; myHeight = window.innerHeight; } - else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) - { myWidth = document.documentElement.clientWidth; myHeight = document.documentElement.clientHeight; } - else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) - { myWidth = document.body.clientWidth; myHeight = document.body.clientHeight; } - - return [ myWidth, myHeight ]; - } - - /* Cross browser alpha transparency changer */ - function changeOpac(opacity, id) - { - DivID = PictureCache[id][0]; - - var object = document.getElementById(DivID).style; - object.opacity = (opacity / 100); - object.MozOpacity = (opacity / 100); - object.KhtmlOpacity = (opacity / 100); - object.filter = "alpha(opacity=" + opacity + ")"; - } - - /* Shade in-out function */ - function opacity(id, opacStart, opacEnd, millisec) - { - var speed = Math.round(millisec / 100); - var timer = 0; - - if(opacStart > opacEnd) - { - for(i = opacStart; i >= opacEnd; i--) - { - setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); - timer++; - } - } - else if(opacStart < opacEnd) - { - for(i = opacStart; i <= opacEnd; i++) - { - setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed)); - timer++; - } - } - } - - /* Start the loader */ - function StartFade(PictureID) - { - Loader = new Image(); - URL = PictureCache[PictureID][2]; - Loader.src = URL; - setTimeout("CheckLoadingStatus("+PictureID+")", 200); - } - - /* check the picture loading status */ - function CheckLoadingStatus(PictureID) - { - DivID = PictureCache[PictureID][0]; - URL = PictureCache[PictureID][2]; - Alt = PictureCache[PictureID][3]; - - if ( Loader.complete == true ) - { - changeOpac(0, PictureID); - HTMLResult = "
"+Alt+"
"; - document.getElementById(DivID).innerHTML = HTMLResult; - - opacity(PictureID,0,100,100); - } - else - setTimeout("CheckLoadingStatus("+PictureID+")", 200); - } - - /* Compute the pChart picture in background */ - function ajaxRender(URL,PictureID) - { - var xmlhttp=false; - /*@cc_on @*/ - /*@if (@_jscript_version >= 5) - try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } - @end @*/ - - if (!xmlhttp && typeof XMLHttpRequest!='undefined') - { try { xmlhttp = new XMLHttpRequest(); } catch (e) { xmlhttp=false; } } - - if (!xmlhttp && window.createRequest) - { try { xmlhttp = window.createRequest(); } catch (e) { xmlhttp=false; } } - - xmlhttp.open("GET", URL,true); - - xmlhttp.onreadystatechange=function() - { if (xmlhttp.readyState==4) { StartFade(PictureID); } } - xmlhttp.send(null) - } diff --git a/Under-Testing/Website/devconf.php b/Under-Testing/Website/devconf.php deleted file mode 100644 index bd13067..0000000 --- a/Under-Testing/Website/devconf.php +++ /dev/null @@ -1,130 +0,0 @@ -"; - } -else - { - echo 'We have some serious error here'; - } -?> - - diff --git a/Under-Testing/Website/devconfig.php b/Under-Testing/Website/devconfig.php deleted file mode 100644 index dc35163..0000000 --- a/Under-Testing/Website/devconfig.php +++ /dev/null @@ -1,67 +0,0 @@ - - - - - GSM selftest Software - - - - - - -
- - - - - - - - - - - - - - - - - - -
HOMEAbout UsHelp
- - - -
- - - - -
-
- - Automatic Configuration -
-
- Manual Configuration -
- - - - - - - - - - - - - -
Albert-Ludwig University of Freiburg 2011
- - - - - - diff --git a/Under-Testing/Website/devconfigAuto.php b/Under-Testing/Website/devconfigAuto.php deleted file mode 100644 index c1473ed..0000000 --- a/Under-Testing/Website/devconfigAuto.php +++ /dev/null @@ -1,66 +0,0 @@ - - - - - GSM selftest Software - - - - - - - -
- - - - - - - - - - - - - - - - - - -
HOMEAbout UsHelp
- - - - -
- - - -
- - - -
- - - - - - - - - - - - - - -
Albert-Ludwig University of Freiburg 2011
- - - - - - diff --git a/Under-Testing/Website/devconfigManual.php b/Under-Testing/Website/devconfigManual.php deleted file mode 100644 index 3f58b2f..0000000 --- a/Under-Testing/Website/devconfigManual.php +++ /dev/null @@ -1,56 +0,0 @@ - - - - GSM selftest Software - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HOMEAbout UsHelp
- - - - - -
- - - -
Albert-Ludwig University of Freiburg 2011
- - - - - - diff --git a/Under-Testing/Website/fonts/Bedizen.ttf b/Under-Testing/Website/fonts/Bedizen.ttf deleted file mode 100644 index d115733..0000000 Binary files a/Under-Testing/Website/fonts/Bedizen.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/Forgotte.ttf b/Under-Testing/Website/fonts/Forgotte.ttf deleted file mode 100644 index a2f7f4a..0000000 Binary files a/Under-Testing/Website/fonts/Forgotte.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/GeosansLight.ttf b/Under-Testing/Website/fonts/GeosansLight.ttf deleted file mode 100644 index 055932a..0000000 Binary files a/Under-Testing/Website/fonts/GeosansLight.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/MankSans.ttf b/Under-Testing/Website/fonts/MankSans.ttf deleted file mode 100644 index a6146a9..0000000 Binary files a/Under-Testing/Website/fonts/MankSans.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/Silkscreen.ttf b/Under-Testing/Website/fonts/Silkscreen.ttf deleted file mode 100644 index ae4425d..0000000 Binary files a/Under-Testing/Website/fonts/Silkscreen.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/advent_light.ttf b/Under-Testing/Website/fonts/advent_light.ttf deleted file mode 100644 index 514030a..0000000 Binary files a/Under-Testing/Website/fonts/advent_light.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/calibri.ttf b/Under-Testing/Website/fonts/calibri.ttf deleted file mode 100644 index 8b6e3c9..0000000 Binary files a/Under-Testing/Website/fonts/calibri.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/pf_arma_five.ttf b/Under-Testing/Website/fonts/pf_arma_five.ttf deleted file mode 100644 index db04ec3..0000000 Binary files a/Under-Testing/Website/fonts/pf_arma_five.ttf and /dev/null differ diff --git a/Under-Testing/Website/fonts/verdana.ttf b/Under-Testing/Website/fonts/verdana.ttf deleted file mode 100644 index 5a059d2..0000000 Binary files a/Under-Testing/Website/fonts/verdana.ttf and /dev/null differ diff --git a/Under-Testing/Website/icons/blackberry_dunno.png b/Under-Testing/Website/icons/blackberry_dunno.png deleted file mode 100644 index 4ee9ee0..0000000 Binary files a/Under-Testing/Website/icons/blackberry_dunno.png and /dev/null differ diff --git a/Under-Testing/Website/icons/blackberry_fail.png b/Under-Testing/Website/icons/blackberry_fail.png deleted file mode 100644 index 650d942..0000000 Binary files a/Under-Testing/Website/icons/blackberry_fail.png and /dev/null differ diff --git a/Under-Testing/Website/icons/blackberry_work.png b/Under-Testing/Website/icons/blackberry_work.png deleted file mode 100644 index 3fe1d09..0000000 Binary files a/Under-Testing/Website/icons/blackberry_work.png and /dev/null differ diff --git a/Under-Testing/Website/icons/box_dunno.png b/Under-Testing/Website/icons/box_dunno.png deleted file mode 100644 index 744ec7a..0000000 Binary files a/Under-Testing/Website/icons/box_dunno.png and /dev/null differ diff --git a/Under-Testing/Website/icons/box_fail.png b/Under-Testing/Website/icons/box_fail.png deleted file mode 100644 index 3398e05..0000000 Binary files a/Under-Testing/Website/icons/box_fail.png and /dev/null differ diff --git a/Under-Testing/Website/icons/box_work.png b/Under-Testing/Website/icons/box_work.png deleted file mode 100644 index 666fced..0000000 Binary files a/Under-Testing/Website/icons/box_work.png and /dev/null differ diff --git a/Under-Testing/Website/icons/server_dunno.png b/Under-Testing/Website/icons/server_dunno.png deleted file mode 100644 index 588514e..0000000 Binary files a/Under-Testing/Website/icons/server_dunno.png and /dev/null differ diff --git a/Under-Testing/Website/icons/server_fail.png b/Under-Testing/Website/icons/server_fail.png deleted file mode 100644 index a699864..0000000 Binary files a/Under-Testing/Website/icons/server_fail.png and /dev/null differ diff --git a/Under-Testing/Website/icons/server_work.png b/Under-Testing/Website/icons/server_work.png deleted file mode 100644 index 210979f..0000000 Binary files a/Under-Testing/Website/icons/server_work.png and /dev/null differ diff --git a/Under-Testing/Website/icons/sip_dunno.png b/Under-Testing/Website/icons/sip_dunno.png deleted file mode 100644 index e494a61..0000000 Binary files a/Under-Testing/Website/icons/sip_dunno.png and /dev/null differ diff --git a/Under-Testing/Website/icons/sip_fail.png b/Under-Testing/Website/icons/sip_fail.png deleted file mode 100644 index 02d7029..0000000 Binary files a/Under-Testing/Website/icons/sip_fail.png and /dev/null differ diff --git a/Under-Testing/Website/icons/sip_work.png b/Under-Testing/Website/icons/sip_work.png deleted file mode 100644 index 5774487..0000000 Binary files a/Under-Testing/Website/icons/sip_work.png and /dev/null differ diff --git a/Under-Testing/Website/icons/telephone_dunno.png b/Under-Testing/Website/icons/telephone_dunno.png deleted file mode 100644 index 2ac9dd6..0000000 Binary files a/Under-Testing/Website/icons/telephone_dunno.png and /dev/null differ diff --git a/Under-Testing/Website/icons/telephone_fail.png b/Under-Testing/Website/icons/telephone_fail.png deleted file mode 100644 index 222050d..0000000 Binary files a/Under-Testing/Website/icons/telephone_fail.png and /dev/null differ diff --git a/Under-Testing/Website/icons/telephone_work.png b/Under-Testing/Website/icons/telephone_work.png deleted file mode 100644 index 5086dd2..0000000 Binary files a/Under-Testing/Website/icons/telephone_work.png and /dev/null differ diff --git a/Under-Testing/Website/icons/uni-network_dunno.png b/Under-Testing/Website/icons/uni-network_dunno.png deleted file mode 100644 index 7d99f0e..0000000 Binary files a/Under-Testing/Website/icons/uni-network_dunno.png and /dev/null differ diff --git a/Under-Testing/Website/icons/uni-network_fail.png b/Under-Testing/Website/icons/uni-network_fail.png deleted file mode 100644 index 3da0a70..0000000 Binary files a/Under-Testing/Website/icons/uni-network_fail.png and /dev/null differ diff --git a/Under-Testing/Website/icons/uni-network_work.png b/Under-Testing/Website/icons/uni-network_work.png deleted file mode 100644 index fdc7989..0000000 Binary files a/Under-Testing/Website/icons/uni-network_work.png and /dev/null differ diff --git a/Under-Testing/Website/index.php b/Under-Testing/Website/index.php deleted file mode 100644 index bb4b579..0000000 --- a/Under-Testing/Website/index.php +++ /dev/null @@ -1,49 +0,0 @@ - - - - - GSM selftest Software - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -
HOMEAbout UsHelp
Device ConfigurationSmart TestChoose The Test
- - - -
Albert-Ludwig University of Freiburg 2011
- - -
- - - diff --git a/Under-Testing/Website/insertData.php b/Under-Testing/Website/insertData.php deleted file mode 100644 index 2facf1c..0000000 --- a/Under-Testing/Website/insertData.php +++ /dev/null @@ -1,69 +0,0 @@ - diff --git a/Under-Testing/Website/insertdevice.php b/Under-Testing/Website/insertdevice.php deleted file mode 100644 index 7875891..0000000 --- a/Under-Testing/Website/insertdevice.php +++ /dev/null @@ -1,28 +0,0 @@ - UPDATE Device Succeed'; - } - else - { - $message = 'ERROR: '.mysql_error(); - } - header('Location: http://132.230.4.202/tricode/devconfigManual.php'); - } - -mysql_close($con) - -?> diff --git a/Under-Testing/Website/loader.gif b/Under-Testing/Website/loader.gif deleted file mode 100644 index 240d4e1..0000000 Binary files a/Under-Testing/Website/loader.gif and /dev/null differ diff --git a/Under-Testing/Website/main.php b/Under-Testing/Website/main.php deleted file mode 100644 index 3a5bd25..0000000 --- a/Under-Testing/Website/main.php +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - -
- -
- RZ GSM 1
- E-Plus
- O2
- Vodaphone
- T-Mobile
- -
-
- - Port Address
- IMEI
- Number
-
-
- - : *
- :
- : *
-
-
- -
-
-
- diff --git a/Under-Testing/Website/mutexFunctions.php b/Under-Testing/Website/mutexFunctions.php deleted file mode 100644 index af45610..0000000 --- a/Under-Testing/Website/mutexFunctions.php +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/Under-Testing/Website/mutexSmartTest.php b/Under-Testing/Website/mutexSmartTest.php deleted file mode 100644 index a44b121..0000000 --- a/Under-Testing/Website/mutexSmartTest.php +++ /dev/null @@ -1,1012 +0,0 @@ - - - - -Network test live results! - - - -
-'."\n"; - ob_implicit_flush(1); - - echo '
- - - - - - - - - - '; - ob_implicit_flush(1); - sleep(6); - $pings = mysql_query("select * from PingResultTable where taskNo=(select max(taskNo) from PingResultTable)"); - - while($row = mysql_fetch_array($pings)) - { - $SIPP = $row['sipServer']; - $LANDLINEP = $row['sipGate']; - $UNISIPP = $row['unisip']; - $NANOBTS1P = $row['gsmBox1']; - $NANOBTS2P = $row['gsmBox2']; - } - } - elseif ($received == "TEST DONE\n") - { - if ($taskAmount == "ON") - { - $taskAmount = "SMART TEST"; - } - - echo '
From: To: Message: Status:
'; - echo '
'; - echo '
"; -echo ''; - ob_implicit_flush(1); - usleep(100); - #tell the testing software it may close - fwrite($fp, 'DISCONNECT'); - break; - } - else - { - //parse the received data! - $numberofTask++; - $received = str_replace("\n",'',$received); - $dataForTable = explode("|", $received); - $callFrom = strtoupper($dataForTable[1]); - $callTo = strtoupper($dataForTable[2]); - $testStatus = strtoupper($dataForTable[3]); - - if($callFrom == 'SIP' || $callTo == 'SIP') - { - if($testStatus == '200' || $testStatus == '402') - { - $SIP = 1; - $SIPP = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - //Check that SIP already working or not, if working, leave as it is, otherwise update that sip broken. same with LSFKS - if ($SIP != 1) - { - $SIP = 1; - } - $SIPP = 1; - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'SIP') - { - if ($testStatus == '998' || $testStatus == '802') - { - $SIP = 1; - $SIPP = 1; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '999') - { - if ($SIP != 1) - { - $SIP = -1; - } - $SIPP = 2; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'SIP') - { - if ($testStatus == '999') - { - if ($SIP != 1) - { - $SIP = 0; - } - if ($SIPP != 1) - { - $SIPP = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998') - { - if ($SIP != 1) - { - $SIP = -1; - } - $SIPP = 2; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - } - if($callFrom == 'GSMRZ1' || $callTo == 'GSMRZ1') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMRZ1 = 1; - } - elseif($testStatus == '486') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = -1; - } - } - if ($callFrom == 'GSMRZ1') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - } - elseif ($callTo == 'GSMRZ1') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - } - } - - if($callFrom == 'GSMRZ2' || $callTo == 'GSMRZ2') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMRZ2 = 1; - $NANOBTS1P = 1; - } - elseif($testStatus == '486') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2 = -1; - } - $NANOBTS1P = 1; - } - if ($callFrom == 'GSMRZ2') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2= 0; - } - - if ($testStatus == '801') - { - $NANOBTS1P= 1; - } - if ($testStatus == '999') - { - if ($NANOBTS1P != 1) - { - $NANOBTS1P= 0; - } - } - } - elseif ($testStatus == '500') - { - $NANOBTS1P = 0; - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2= 0; - } - $NANOBTS1P= 1; - } - } - elseif ($callTo == 'GSMRZ2') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - if ($testStatus == '802') - { - $NANOBTS1P= 1; - } - if ($testStatus == '998') - { - if ($NANOBTS1P != 1) - { - $NANOBTS1P= 0; - } - } - } - elseif ($testStatus == '501') - { - $NANOBTS1P = 0; - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - if ($NANOBTS1P != 1) - { - $NANOBTS1P= 2; - } - - } - } - - } - - if($callFrom == 'GSMRZ3' || $callTo == 'GSMRZ3') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMRZ3 = 1; - $NANOBTS2P = 1; - } - elseif($testStatus == '486') - { - - if ($GSMRZ3 != 1) - { - $GSMRZ3 = -1; - } - $NANOBTS2P = 1; - } - if ($callFrom == 'GSMRZ3') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3= 0; - } - - if ($testStatus == '801') - { - $NANOBTS2P= 1; - } - if ($testStatus == '999') - { - if ($NANOBTS2P != 1) - { - $NANOBTS2P= 0; - } - } - } - elseif ($testStatus == '501') - { - $NANOBTS2P = 0; - if ($GSMRZ3 != 1) - { - $GSMRZ3= 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3= 0; - } - $NANOBTS2P= 1; - } - } - elseif ($callTo == 'GSMRZ3') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3 = 0; - } - if ($testStatus == '802') - { - $NANOBTS2P= 1; - } - if ($testStatus == '998') - { - if ($NANOBTS2P != 1) - { - $NANOBTS2P= 0; - } - } - } - elseif ($testStatus == '501') - { - $NANOBTS2P = 0; - if ($GSMRZ3 != 1) - { - $GSMRZ3 = 0; - } - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3 = 0; - } - if ($NANOBTS1P != 1) - { - $NANOBTS2P= 2; - } - - } - } - - } - if($callFrom == 'GSMEXT.O2' || $callTo == 'GSMEXT.O2') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMEO = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMEO != 1) - { - $GSMEO = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.O2') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEO != 1) - { - $GSMEO = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEO != 1) - { - $GSMEO =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.O2') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEO != 1) - { - $GSMEO = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEO != 1) - { - $GSMEO =0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - } - if($callFrom == 'GSMEXT.VODA' || $callTo == 'GSMEXT.VODA') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMEV = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMEV != 1) - { - $GSMEV = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.VODA') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEV != 1) - { - $GSMEV = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEV != 1) - { - $GSMEV =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.VODA') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEV != 1) - { - $GSMEV = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEV != 1) - { - $GSMEV =0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - } - - if($callFrom == 'GSMEXT.EPLUS' || $callTo == 'GSMEXT.EPLUS') - { - if($testStatus == '200') - { - $GSMEE = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMEE != 1) - { - $GSMEE = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.EPLUS') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEE != 1) - { - $GSMEE = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEE != 1) - { - $GSMEE =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.EPLUS') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEE != 1) - { - $GSMEE = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEE != 1) - { - $GSMEE=0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '402') - { - if ($GSMEE != 1) - { - $GSMEE=0; - } - $LSFKS = 1; - } - } - } - - if($callFrom == 'GSMEXT.TM' || $callTo == 'GSMEXT.TM') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMET = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMET != 1) - { - $GSMET = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.TM') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMET != 1) - { - $GSMET = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMET != 1) - { - $GSMET =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.TM') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMET != 1) - { - $GSMET = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMET != 1) - { - $GSMET =0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - - } - - if($callFrom == 'LANDLINE' || $callTo == 'LANDLINE') - { - - if($testStatus == '200' || $testStatus == '402') - { - - $LANDLINEP = 1; - $LANDLINE = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - $LANDLINEP = 1; - if ($LANDLINE != 1) - { - $LANDLINE = -1; - } - } - if ($callFrom == 'LANDLINE') - { - if ($testStatus == '999') - { - if ($LANDLINE != 1) - { - $LANDLINE = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - if ($LANDLINEP != 1) - { - $LANDLINEP = 2; - } - } - elseif ($testStatus == '500') - { - $LANDLINEP = 0; - if ($LANDLINE != 1) - { - $LANDLINE = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - $LANDLINE = 1; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - $LANDLINEP = 1; - } - } - elseif ($callTo == 'LANDLINE') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($LANDLINE != 1) - { - $LANDLINE = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - if ($LANDLINEP != 1) - { - $LANDLINEP = 0; - } - } - elseif ($testStatus == '501') - { - $LANDLINEP = 0; - if ($LANDLINE != 1) - { - $LANDLINE = 0; - } - } - elseif($testStatus == '998') - { - if ($LANDLINE != 1) - { - $LANDLINE = -1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - if ($LANDLINEP != 1) - { - $LANDLINEP = 2; - } - } - } - } - if($callFrom == 'UNISIP' || $callTo == 'UNISIP') - { - - if($testStatus == '200' || $testStatus == '402') - { - $UNISIPP = 1; - $UNISIP = 1; - } - elseif($testStatus == '486') - { - $UNISIPP = 1; - if ($UNISIP != 1) - { - $UNISIP = -1; - } - } - if ($callFrom == 'UNISIP') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($UNISIP != 1) - { - $UNISIP = -1; - } - if ($UNISIPP != 1) - { - $UNISIPP = 2; - } - } - elseif ($testStatus == '500') - { - $UNISIPP = 0; - if ($UNISIP != 1) - { - $UNISIP = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($UNISIP != 1) - { - $UNISIP = 0; - } - $UNISIPP = 1; - } - } - if ($callTo == 'UNISIP') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($UNISIP != 1) - { - $UNISIP = -1; - } - if ($UNISIPP != 1) - { - $UNISIPP = 0; - } - - } - elseif ($testStatus == '501') - { - $UNISIPP = 0; - $UNISIP = 0; - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($UNISIP != 1) - { - $UNISIP = 0; - } - if ($UNISIPP != 1) - { - $UNISIPP = 0; - } - } - } - } - echo ' - '. $dataForTable[1] . ' - '. $dataForTable[2] . ' - ' . $dataForTable[4] . ' - ' . $dataForTable[3] . ' - '; - ob_implicit_flush(1); - usleep(100); - # tesll controller to continue the test - fwrite($fp, "CONTINUE"); - } - } - } - - fclose($fp);//close the soccket and the connection - } - - } - elseif($softwareRunning1 == '1') - { - echo 'Controller was not started(didn\'t obtain the lock)! Check it!'; - } - else - { - echo 'Testing software didn\'t obtain the lock'; - } - } } - elseif($softwareRunning == '0') //0 means the software is still running in the background - { - echo 'Testing software is still running! Maybe you should kill it (if not started manually!)'; - } - else - { - echo 'We have an unknown error! Refresh te web page!'; - } - } - else - { - echo 'No single test was selected! Please go back and select at least one test'; - } - } - elseif($lockMe == '0') //0 means if the attempt timed out (for example, because another client has previously locked the name) - { - echo 'Someone was faster than you'; - } - else - { - // # if an error occurred (such as running out of memory or the thread was killed with - echo 'We have an error here'; - } -} -elseif ($locking == '0') //0 means somebody is already on the web site -{ - echo 'Somebody is using the web site already!' . "
"; -} -else -{ - echo 'We have some serious error here'; -} -?> -
- - - diff --git a/Under-Testing/Website/mutexTry.php b/Under-Testing/Website/mutexTry.php deleted file mode 100644 index b09c702..0000000 --- a/Under-Testing/Website/mutexTry.php +++ /dev/null @@ -1,995 +0,0 @@ -d> - - -Network test live results! - - - -
-'."\n"; - ob_implicit_flush(1); - echo '
- - - - - - - - - - '; - ob_implicit_flush(1); - sleep(6); - $pings = mysql_query("select * from PingResultTable where taskNo=(select max(taskNo) from PingResultTable)"); - - while($row = mysql_fetch_array($pings)) - { - $SIPP = $row['sipServer']; - $LANDLINEP = $row['sipGate']; - $UNISIPP = $row['unisip']; - $NANOBTS1P = $row['gsmBox1']; - $NANOBTS2P = $row['gsmBox2']; - } - } - elseif ($received == "TEST DONE\n") - { - - - echo '
From: To: Message: Status:
'; - echo '
'; - echo '"; -echo ''; - ob_implicit_flush(1); - usleep(100); - fwrite($fp, 'DISCONNECT'); //tell the testing software it may close - break; - } - else - { - //parse the received data! - $received = str_replace("\n",'',$received); - $dataForTable = explode("|", $received); - $callFrom = strtoupper($dataForTable[1]); - $callTo = strtoupper($dataForTable[2]); - $testStatus = strtoupper($dataForTable[3]); - - if($callFrom == 'SIP' || $callTo == 'SIP') - { - if($testStatus == '200' || $testStatus == '402') - { - $SIP = 1; - $SIPP = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - //Check that SIP already working or not, if working, leave as it is, otherwise update that sip broken. same with LSFKS - if ($SIP != 1) - { - $SIP = 1; - } - $SIPP = 1; - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'SIP') - { - if ($testStatus == '998' || $testStatus == '802') - { - $SIP = 1; - $SIPP = 1; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '999') - { - if ($SIP != 1) - { - $SIP = -1; - } - $SIPP = 2; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'SIP') - { - if ($testStatus == '999') - { - if ($SIP != 1) - { - $SIP = 0; - } - if ($SIPP != 1) - { - $SIPP = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998') - { - if ($SIP != 1) - { - $SIP = -1; - } - $SIPP = 2; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - } - if($callFrom == 'GSMRZ1' || $callTo == 'GSMRZ1') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMRZ1 = 1; - } - elseif($testStatus == '486') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = -1; - } - } - if ($callFrom == 'GSMRZ1') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - } - elseif ($callTo == 'GSMRZ1') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ1 != 1) - { - $GSMRZ1 = 0; - } - } - } - } - - if($callFrom == 'GSMRZ2' || $callTo == 'GSMRZ2') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMRZ2 = 1; - $NANOBTS1P = 1; - } - elseif($testStatus == '486') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2 = -1; - } - $NANOBTS1P = 1; - } - if ($callFrom == 'GSMRZ2') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2= 0; - } - - if ($testStatus == '801') - { - $NANOBTS1P= 1; - } - if ($testStatus == '999') - { - if ($NANOBTS1P != 1) - { - $NANOBTS1P= 0; - } - } - } - elseif ($testStatus == '500') - { - $NANOBTS1P = 0; - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2= 0; - } - $NANOBTS1P= 1; - } - } - elseif ($callTo == 'GSMRZ2') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - if ($testStatus == '802') - { - $NANOBTS1P= 1; - } - if ($testStatus == '998') - { - if ($NANOBTS1P != 1) - { - $NANOBTS1P= 0; - } - } - } - elseif ($testStatus == '501') - { - $NANOBTS1P = 0; - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ2 != 1) - { - $GSMRZ2 = 0; - } - if ($NANOBTS1P != 1) - { - $NANOBTS1P= 2; - } - - } - } - - } - - if($callFrom == 'GSMRZ3' || $callTo == 'GSMRZ3') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMRZ3 = 1; - $NANOBTS2P = 1; - } - elseif($testStatus == '486') - { - - if ($GSMRZ3 != 1) - { - $GSMRZ3 = -1; - } - $NANOBTS2P = 1; - } - if ($callFrom == 'GSMRZ3') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3= 0; - } - - if ($testStatus == '801') - { - $NANOBTS2P= 1; - } - if ($testStatus == '999') - { - if ($NANOBTS2P != 1) - { - $NANOBTS2P= 0; - } - } - } - elseif ($testStatus == '501') - { - $NANOBTS2P = 0; - if ($GSMRZ3 != 1) - { - $GSMRZ3= 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3= 0; - } - $NANOBTS2P= 1; - } - } - elseif ($callTo == 'GSMRZ3') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3 = 0; - } - if ($testStatus == '802') - { - $NANOBTS2P= 1; - } - if ($testStatus == '998') - { - if ($NANOBTS2P != 1) - { - $NANOBTS2P= 0; - } - } - } - elseif ($testStatus == '501') - { - $NANOBTS2P = 0; - if ($GSMRZ3 != 1) - { - $GSMRZ3 = 0; - } - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($GSMRZ3 != 1) - { - $GSMRZ3 = 0; - } - if ($NANOBTS1P != 1) - { - $NANOBTS2P= 2; - } - - } - } - - } - if($callFrom == 'GSMEXT.O2' || $callTo == 'GSMEXT.O2') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMEO = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMEO != 1) - { - $GSMEO = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.O2') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEO != 1) - { - $GSMEO = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEO != 1) - { - $GSMEO =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.O2') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEO != 1) - { - $GSMEO = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEO != 1) - { - $GSMEO =0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - } - if($callFrom == 'GSMEXT.VODA' || $callTo == 'GSMEXT.VODA') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMEV = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMEV != 1) - { - $GSMEV = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.VODA') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEV != 1) - { - $GSMEV = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEV != 1) - { - $GSMEV =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.VODA') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEV != 1) - { - $GSMEV = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEV != 1) - { - $GSMEV =0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - } - - if($callFrom == 'GSMEXT.EPLUS' || $callTo == 'GSMEXT.EPLUS') - { - if($testStatus == '200') - { - $GSMEE = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMEE != 1) - { - $GSMEE = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.EPLUS') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEE != 1) - { - $GSMEE = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEE != 1) - { - $GSMEE =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.EPLUS') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMEE != 1) - { - $GSMEE = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMEE != 1) - { - $GSMEE=0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '402') - { - if ($GSMEE != 1) - { - $GSMEE=0; - } - $LSFKS = 1; - } - } - } - - if($callFrom == 'GSMEXT.TM' || $callTo == 'GSMEXT.TM') - { - if($testStatus == '200' || $testStatus == '402') - { - $GSMET = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - if ($GSMET != 1) - { - $GSMET = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - } - if ($callFrom == 'GSMEXT.TM') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMET != 1) - { - $GSMET = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMET != 1) - { - $GSMET =1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - elseif ($callTo == 'GSMEXT.TM') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($GSMET != 1) - { - $GSMET = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($GSMET != 1) - { - $GSMET =0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - } - } - - } - - if($callFrom == 'LANDLINE' || $callTo == 'LANDLINE') - { - - if($testStatus == '200' || $testStatus == '402') - { - - $LANDLINEP = 1; - $LANDLINE = 1; - $LSFKS = 1; - } - elseif($testStatus == '486') - { - $LANDLINEP = 1; - if ($LANDLINE != 1) - { - $LANDLINE = -1; - } - } - if ($callFrom == 'LANDLINE') - { - if ($testStatus == '999') - { - if ($LANDLINE != 1) - { - $LANDLINE = -1; - } - if ($LSFKS != 1) - { - $LSFKS = -1; - } - if ($LANDLINEP != 1) - { - $LANDLINEP = 2; - } - } - elseif ($testStatus == '500') - { - $LANDLINEP = 0; - if ($LANDLINE != 1) - { - $LANDLINE = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - $LANDLINE = 1; - if ($LSFKS != 1) - { - $LSFKS = 0; - } - $LANDLINEP = 1; - } - } - elseif ($callTo == 'LANDLINE') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($LANDLINE != 1) - { - $LANDLINE = 0; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - if ($LANDLINEP != 1) - { - $LANDLINEP = 0; - } - } - elseif ($testStatus == '501') - { - $LANDLINEP = 0; - if ($LANDLINE != 1) - { - $LANDLINE = 0; - } - } - elseif($testStatus == '998') - { - if ($LANDLINE != 1) - { - $LANDLINE = -1; - } - if ($LSFKS != 1) - { - $LSFKS = 0; - } - if ($LANDLINEP != 1) - { - $LANDLINEP = 2; - } - } - } - } - if($callFrom == 'UNISIP' || $callTo == 'UNISIP') - { - - if($testStatus == '200' || $testStatus == '402') - { - $UNISIPP = 1; - $UNISIP = 1; - } - elseif($testStatus == '486') - { - $UNISIPP = 1; - if ($UNISIP != 1) - { - $UNISIP = -1; - } - } - if ($callFrom == 'UNISIP') - { - if ($testStatus == '999' || $testStatus == '801') - { - if ($UNISIP != 1) - { - $UNISIP = -1; - } - if ($UNISIPP != 1) - { - $UNISIPP = 2; - } - } - elseif ($testStatus == '500') - { - $UNISIPP = 0; - if ($UNISIP != 1) - { - $UNISIP = 0; - } - } - elseif($testStatus == '998' || $testStatus == '802') - { - if ($UNISIP != 1) - { - $UNISIP = 0; - } - $UNISIPP = 1; - } - } - if ($callTo == 'UNISIP') - { - if ($testStatus == '998' || $testStatus == '802') - { - if ($UNISIP != 1) - { - $UNISIP = -1; - } - if ($UNISIPP != 1) - { - $UNISIPP = 0; - } - - } - elseif ($testStatus == '501') - { - $UNISIPP = 0; - $UNISIP = 0; - } - elseif($testStatus == '999' || $testStatus == '801') - { - if ($UNISIP != 1) - { - $UNISIP = 0; - } - if ($UNISIPP != 1) - { - $UNISIPP = 0; - } - } - } - } - echo ' - '. $dataForTable[1] . ' - '. $dataForTable[2] . ' - ' . $dataForTable[4] . ' - ' . $dataForTable[3] . ' - '; - ob_implicit_flush(1); - usleep(100); - fwrite($fp, "CONTINUE"); //tell the software to proceed with the test and confirm receiving data - } - } - } - - fclose($fp);//close the soccket and the connection - - } - - } - elseif($softwareRunning1 == '1') - { - echo 'Testing software was not started(didn\'t obtain the lock)! Check it!'; - } - else - { - echo 'Testing software didn\'t obtain the lock'; - } - } - elseif($softwareRunning == '0') //0 means the software is still running in the background - { - echo 'Testing software is still running! Maybe you should kill it (if not started manually!)'; - } - else - { - echo 'We have an unknown error! Refresh te web page!'; - } - } - else - { - echo 'No single test was selected! Please go back and select at least one test'; - } - } - elseif($lockMe == '0') //0 means if the attempt timed out (for example, because another client has previously locked the name) - { - echo 'Someone was faster than you'; - } - else - { - // # if an error occurred (such as running out of memory or the thread was killed with - echo 'We have an error here'; - } - } -elseif ($locking == '0') //0 means somebody is already on the web site -{ -echo 'Somebody is using the web site already!' . "
"; -} -else -{ - echo 'We have some serious error here'; -} -?> -
- - - diff --git a/Under-Testing/Website/networkResult.php b/Under-Testing/Website/networkResult.php deleted file mode 100644 index 962d607..0000000 --- a/Under-Testing/Website/networkResult.php +++ /dev/null @@ -1,309 +0,0 @@ -addPoints(array($GSMINTPercent,$GSMEXTPercent,$SIPPercent,$UNISIPPercent,$LANDLINEPercent),"Hits"); - $MyData->setAxisName(0,"Network operability"); - $MyData->addPoints(array("GSM University","GSM External","SIP","Uni.Tel.network","Landline"),"Networks"); - $MyData->setSerieDescription("Networks","Networks"); - $MyData->setAbscissa("Networks"); - - - /* Create the pChart object */ - $myPicture = new pImage(700,430,$MyData); - - /* Draw the background */ - $Settings = array("R"=>170, "G"=>183, "B"=>87, "Dash"=>1, "DashR"=>190, "DashG"=>203, "DashB"=>107); -// $myPicture->drawFilledRectangle(0,0,700,230,$Settings); - - /* Overlay with a gradient */ - $Settings = array("StartR"=>219, "StartG"=>231, "StartB"=>139, "EndR"=>1, "EndG"=>138, "EndB"=>68, "Alpha"=>50); - $myPicture->drawGradientArea(0,0,700,430,DIRECTION_VERTICAL,$Settings); - $myPicture->drawGradientArea(0,0,700,20,DIRECTION_VERTICAL,array("StartR"=>0,"StartG"=>0,"StartB"=>0,"EndR"=>50,"EndG"=>50,"EndB"=>50,"Alpha"=>80)); - - /* Add a border to the picture */ - $myPicture->drawRectangle(0,0,699,429,array("R"=>0,"G"=>0,"B"=>0)); - - /* Write the picture title */ - $myPicture->setFontProperties(array("FontName"=>"fonts/Silkscreen.ttf","FontSize"=>6)); - $myPicture->drawText(10,13,"Network Test Results - UNI FREIBURG",array("R"=>255,"G"=>255,"B"=>255)); - - - - //CONNECTIONS - /* BTS PICTURE INTERNAL CONNECTIONS */ - $myPicture->drawLine(80,170,185,230,$BTS1PING); //BTS1 PING - $myPicture->drawLine(75,225,185,225,$BTS2PING); //BTS2 PING - $myPicture->drawLine(75,288,185,220,$BTS2PING); //BTS3 PING - /*GSMBOX LINES */ - $myPicture->drawLine(181,65,299,150); //BTS3 PING - $myPicture->drawLine(250,65,308,150); //BTS3 PING - $myPicture->drawLine(347,65,309,150); //BTS3 PING - $myPicture->drawLine(410,70,316,150); //BTS3 PING - - //Arrow for GSM-Box - $arrowSettings = array("FillR"=>2.5,"FillG"=>2.5,"FillB"=>2.5,"Ticks"=>1); - $myPicture->drawArrow(303,209,303,161,$arrowSettings); - - //Arrow for Landline - $arrowSettings = array("FillR"=>2.5,"FillG"=>2.5,"FillB"=>2.5,"Ticks"=>1); - $myPicture->drawArrow(313,210,393,171,$arrowSettings); - - //Arrow for University telephone network - $arrowSettings = array("FillR"=>2.5,"FillG"=>2.5,"FillB"=>2.5,"Ticks"=>1, "TwoHeads"=>TRUE); - $myPicture->drawArrow(303,298,303,239,$arrowSettings); - - //SIP - $arrowSettings = array("FillR"=>2.5,"FillG"=>2.5,"FillB"=>2.5,"Ticks"=>1, "TwoHeads"=>TRUE); - $myPicture->drawArrow(316,220,393,220,$arrowSettings); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(346,218,"SIP",$TextSettings); - - //IAX - $arrowSettings = array("FillR"=>2.5,"FillG"=>2.5,"FillB"=>2.5,"Ticks"=>1, "TwoHeads"=>TRUE); - $myPicture->drawArrow(192,220,297,220,$arrowSettings); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(235,218,"IAX",$TextSettings); - //###################################### - - //BTS1 - $Points = Triangle(74,155); - $myPicture->drawPolygon($Points, $BTS1COL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(10,169,"nanoBTS0",$TextSettings); - //################################## - - //BTS2 - $Points = Triangle(74,215); - $myPicture->drawPolygon($Points, $BTS2COL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(10,229,"nanoBTS1",$TextSettings); - //################################### - - //BTS3 - $Points = Triangle(74,275); - $myPicture->drawPolygon($Points, $BTS3COL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(10,289,"nanoBTS3",$TextSettings); - //################################### - - - - //LsfKs-Asterisk - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(295,210,$LSFKSCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(270,257," LsfKs-Asterisk",$TextSettings); - //############################### - - - //Open BSC - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(171,210,$GSMINTCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(155,275," OpenBSC \r\n LCR \r\n Asterisk",$TextSettings); - //############################### - - - //E-plus - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(171,50,$GSMEECOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(171,40,"E-Plus",$TextSettings); - //############################### - - - //Vodaphone - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(231,50,$GSMEVCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(218,40,"Vodafone",$TextSettings); - //############################### - - - //T-mobile - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(336,50,$GSMETCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(330,40,"T-Mobile",$TextSettings); - //############################### - - - //O2 - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(396,50,$GSMEOCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(404,40,"02",$TextSettings); - //############################### - - - //GSMBOX - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(293,140,$GSMEXTCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(238,157,"GSM-Box",$TextSettings); - //############################### - - - //LANDLINE - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(393,147,$LANDLINECOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(388,137,"Landline",$TextSettings); - //############################### - - - //University SIP - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(283,297,$UNISIPCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(238,365,"University telephone network",$TextSettings); - //############################### - - - //SIP - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>20)); - /* Draw a PNG object */ - $myPicture->drawFromPNG(393,208,$SIPCOL); - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("DrawBox"=>TRUE,"BoxRounded"=>TRUE,"R"=>0,"G"=>0,"B"=>0,"Angle"=>0,"FontSize"=>7); - $myPicture->drawText(399,256,"SIP",$TextSettings); - //############################### - - //PING RESULTS - //START ############################################ - $myPicture->setGraphArea(530,280,660,290); - - // Create the surface object - $mySurface = new pSurface($myPicture); - - // Set the grid size - $mySurface->setGrid(4,0); - - $mySurface->writeXLabels(array("Angle"=>45,"Labels"=>array("SIP","Landline","Uni. Telephone","BTS Cont.1","BTS Cont.2"))); - $mySurface->writeYLabels(array("Labels"=>array("Ping"))); - - $Palette = array(1=>array("R"=>0,"G"=>255,"B"=>0, "Alpha"=>40), - 0=>array("R"=>255,"G"=>0,"B"=>1, "Alpha"=>40), - 2=>array("R"=>255,"G"=>227,"B"=>85)); - - $mySurface->addPoint(0,0,$SIPP); - $mySurface->addPoint(1,0,$LANDLINEP); - $mySurface->addPoint(2,0,$UNISIPP); - $mySurface->addPoint(3,0,$NANOBTS1P); - $mySurface->addPoint(4,0,$NANOBTS2P); - - // Draw the surface chart - $mySurface->drawSurface(array("Border"=>TRUE,"Surrounding"=>40,"Palette"=>$Palette)); - - - //A BIT OF STATISTICS - /* Draw the chart scale */ - $myPicture->setGraphArea(520,50,685,220); - $AxisBoundaries = array(0=>array("Min"=>0,"Max"=>100)); - - $myPicture->drawScale(array("CycleBackground"=>TRUE,"DrawSubTicks"=>TRUE,"GridR"=>0,"GridG"=>0,"GridB"=>0,"GridAlpha"=>10,"Pos"=>SCALE_POS_TOPBOTTOM,"Mode"=>SCALE_MODE_MANUAL,"ManualScale"=>$AxisBoundaries)); - - /* Turn on shadow computing */ - $myPicture->setShadow(TRUE,array("X"=>1,"Y"=>1,"R"=>0,"G"=>0,"B"=>0,"Alpha"=>10)); - - /* Create the per bar palette */ - $Palette = array("0"=>array("R"=>188,"G"=>224,"B"=>46,"Alpha"=>100), - "1"=>array("R"=>224,"G"=>100,"B"=>46,"Alpha"=>100), - "2"=>array("R"=>224,"G"=>214,"B"=>46,"Alpha"=>100), - "3"=>array("R"=>46,"G"=>151,"B"=>224,"Alpha"=>100), - "4"=>array("R"=>224,"G"=>176,"B"=>46,"Alpha"=>100)); - - -/* $Palette = array("1"=>array("R"=>91,"G"=>184,"B"=>202,"Alpha"=>100), - "2"=>array("R"=>166,"G"=>218,"B"=>215,"Alpha"=>100), - "3"=>array("R"=>223,"G"=>227,"B"=>203,"Alpha"=>100), - "0"=>array("R"=>114,"G"=>176,"B"=>180,"Alpha"=>100), - "4"=>array("R"=>241,"G"=>233,"B"=>214,"Alpha"=>100)); -*/ - /* Draw the chart */ - $myPicture->drawBarChart(array("DisplayPos"=>LABEL_POS_INSIDE,"DisplayValues"=>TRUE,"Rounded"=>TRUE,"Surrounding"=>30,"OverrideColors"=>$Palette)); - //############################################STATISTICS - - //DATE AND TEST NUMBER - /* Write some text */ - $myPicture->setFontProperties(array("FontName"=>"fonts/verdana.ttf","FontSize"=>7)); - $TextSettings = array("BoxRounded"=>TRUE,"R"=>255,"G"=>255,"B"=>255,"Angle"=>0,"FontSize"=>9); - $taskInfo ='Task #: ' . $TASKID . ' ' . date("d.m.Y H:m:s"); - $myPicture->drawText(460,425,$taskInfo,$TextSettings); - //########################################################### - - - - /* Render the picture (choose the best way) */ - $myPicture->autoOutput("example.drawFilledCircle.png"); -?> diff --git a/Under-Testing/Website/post.php b/Under-Testing/Website/post.php deleted file mode 100644 index c574768..0000000 --- a/Under-Testing/Website/post.php +++ /dev/null @@ -1,516 +0,0 @@ - diff --git a/Under-Testing/Website/report.pdf b/Under-Testing/Website/report.pdf deleted file mode 100644 index 8fa060b..0000000 Binary files a/Under-Testing/Website/report.pdf and /dev/null differ diff --git a/Under-Testing/Website/testCase.php b/Under-Testing/Website/testCase.php deleted file mode 100644 index fe5c655..0000000 --- a/Under-Testing/Website/testCase.php +++ /dev/null @@ -1,244 +0,0 @@ -216,"G"=>166,"B"=>14,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0); - $colorFail = array("R"=>255, "G"=>25, "B"=>25,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0); - $colorWork = array("R"=>150,"G"=>215,"B"=>121,"BorderR"=>0,"BorderG"=>0,"BorderB"=>0); - - -$TASKID = $_GET['TASKID']; - -$GSMRZ1 = $_GET['RZ1']; -$GSMRZ2 = $_GET['RZ2']; -$GSMRZ3 = $_GET['RZ3']; - - -$SIP = $_GET['S']; -$UNISIP = $_GET['US']; -$LANDLINE = $_GET['LL']; -$LSFKS = $_GET['LS']; - -$GSMEE = $_GET['EE']; -$GSMEV = $_GET['EV']; -$GSMET = $_GET['ET']; -$GSMEO = $_GET['EO']; - - -$SIPP = $_GET['SP']; -$LANDLINEP = $_GET['SGP']; -$UNISIPP = $_GET['USP']; -$NANOBTS1P = $_GET['NBP1']; -$NANOBTS2P = $_GET['NBP2']; - -$GSMEXTCOL = 'icons/box_dunno.png'; -$GSMINTCOL = "icons/server_dunno.png"; -$LSFKSCOL = "icons/server_dunno.png"; - -$SIPCOL = 'icons/sip_dunno.png'; -$UNISIPCOL = 'icons/uni-network_dunno.png'; -$LANDLINECOL = 'icons/telephone_dunno.png'; - -$BTS1COL = $colorDunno; -$BTS2COL = $colorDunno; -$BTS3COL = $colorDunno; - -$GSMEECOL = 'icons/blackberry_dunno.png'; -$GSMEVCOL = 'icons/blackberry_dunno.png'; -$GSMETCOL = 'icons/blackberry_dunno.png'; -$GSMEOCOL = 'icons/blackberry_dunno.png'; - - -$BTS1PING = array("R"=>255,"G"=>0,"B"=>0); //put here the color :) -$BTS1PING["Ticks"]=2; -$BTS1PING["Weight"]=0; - -$BTS2PING = array("R"=>255,"G"=>0,"B"=>0); -$BTS2PING["Ticks"]=2; -$BTS2PING["Weight"]=0; - -$BTS3PING = array("R"=>255,"G"=>0,"B"=>0); -$BTS3PING["Ticks"]=2; -$BTS3PING["Weight"]=0; - -if ($GSMRZ1 > 0 || $GSMRZ2 > 0 || $GSMRZ3 > 0) -{ - $GSMINT = 1; - $GSMINTCOL = 'icons/server_work.png'; -} -elseif($GSMRZ1 < 0 || $GSMRZ2 < 0 || $GSMRZ3 < 0) -{ - $GSMINT = -1; - $GSMINTCOL = 'icons/server_fail.png'; -} - -if($LANDLINE>0) -{ - $LANDLINECOL = 'icons/telephone_work.png'; -} -elseif($LANDLINE<0) -{ - $LANDLINECOL = 'icons/telephone_fail.png'; -} - -if($SIP > 0 && $GSMINT > 0) -{ - $LSFKS = 1; -} - -if($LSFKS>0) -{ - $LSFKSCOL = 'icons/server_work.png'; -} -elseif($LSFKS<0) -{ - $LSFKSCOL = 'icons/server_fail.png'; -} - -if($SIP>0) -{ - $SIPCOL = 'icons/sip_work.png'; -} -elseif($SIP<0) -{ - $SIPCOL = 'icons/sip_fail.png'; -} - -if($UNISIP > 0) -{ - $UNISIPCOL = 'icons/uni-network_work.png'; -} -elseif($UNISIP < 0) -{ - $UNISIPCOL = 'icons/uni-network_fail.png'; -} - -if($GSMEE > 0 || $GSMEV > 0 || $GSMET > 0 || $GSMEO > 0) -{ - $GSMEXTCOL = 'icons/box_work.png'; -} -elseif($GSMEE < 0 || $GSMEV < 0 || $GSMET < 0 || $GSMEO < 0) -{ - $GSMEXTCOL = 'icons/box_fail.png'; -} - -if($GSMRZ1 > 0) -{ - $BTS1COL = $colorWork; -} -elseif($GSMRZ1 < 0) -{ - $BTS1COL = $colorFail; -} - -if($GSMRZ2 > 0) -{ - $BTS2COL = $colorWork; -} -elseif($GSMRZ2 < 0) -{ - $BTS2COL = $colorFail; -} - -if($GSMRZ3 > 0) -{ - $BTS3COL = $colorWork; -} -elseif($GSMRZ3 < 0) -{ - $BTS3COL = $colorFail; -} - -if($GSMEE > 0) -{ - $GSMEECOL = 'icons/blackberry_work.png'; -} -elseif($GSMEE < 0) -{ - $GSMEECOL = 'icons/blackberry_fail.png'; -} - -if($GSMEV > 0) -{ - $GSMEVCOL = 'icons/blackberry_work.png'; -} -elseif($GSMEV < 0) -{ - $GSMEVCOL = 'icons/blackberry_fail.png'; -} - -if($GSMET > 0) -{ - $GSMETCOL = 'icons/blackberry_work.png'; -} -elseif($GSMET < 0) -{ - $GSMETCOL = 'icons/blackberry_fail.png'; -} - -if($GSMEO > 0) -{ - $GSMEOCOL = 'icons/blackberry_work.png'; -} -elseif($GSMEO < 0) -{ - $GSMEOCOL = 'icons/blackberry_fail.png'; -} - - - -//NETWORK OPERABILITY CALCULATION -$GSMINTOCalc = 0; -$GSMEXTOCalc = 0; - -//internal GSM calcuation -if($GSMRZ1>0) -{ - $GSMINTOCalc += 1; -} -if($GSMRZ2>0) -{ - $GSMINTOCalc += 1; -} -if($GSMRZ3>0) -{ - $GSMINTOCalc += 1; -} - -//external GSM calculation -if($GSMET>0) -{ - $GSMEXTOCalc += 1; -} -if($GSMEO>0) -{ - $GSMEXTOCalc += 1; -} -if($GSMEE>0) -{ - $GSMEXTOCalc += 1; -} -if($GSMEV>0) -{ - $GSMEXTOCalc += 1; -} - -if($SIP<0) -{ - $SIP=0; -} - -if($LANDLINE<0) -{ - $LANDLINE=0; -} -if($UNISIP<0) -{ - $UNISIP=0; -} -$GSMINTPercent = round(($GSMINTOCalc/3),2)*100; -$GSMEXTPercent = round(($GSMEXTOCalc/4),2)*100; -$SIPPercent = $SIP*100; -$UNISIPPercent = $UNISIP*100; -$LANDLINEPercent = $LANDLINE*100; - - -?> diff --git a/Under-Testing/Website/wait.gif b/Under-Testing/Website/wait.gif deleted file mode 100644 index 1c72ebb..0000000 Binary files a/Under-Testing/Website/wait.gif and /dev/null differ diff --git a/Website/mutexSmartTest.php b/Website/mutexSmartTest.php index 663f2f0..a44b121 100644 --- a/Website/mutexSmartTest.php +++ b/Website/mutexSmartTest.php @@ -60,7 +60,7 @@ if ($locking == '1') fwrite($startApp, "START APP"); usleep(2500); fclose($startApp); - } + #sleep till the software starts sleep(5); @@ -125,7 +125,18 @@ if ($locking == '1') '; - ob_implicit_flush(1); + ob_implicit_flush(1); + sleep(6); + $pings = mysql_query("select * from PingResultTable where taskNo=(select max(taskNo) from PingResultTable)"); + + while($row = mysql_fetch_array($pings)) + { + $SIPP = $row['sipServer']; + $LANDLINEP = $row['sipGate']; + $UNISIPP = $row['unisip']; + $NANOBTS1P = $row['gsmBox1']; + $NANOBTS2P = $row['gsmBox2']; + } } elseif ($received == "TEST DONE\n") { @@ -186,7 +197,6 @@ echo '