summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--documenting/Report/test.log4
-rw-r--r--documenting/Report/test.pdfbin5058627 -> 5058590 bytes
-rw-r--r--documenting/Report/test.tex8
-rw-r--r--documenting/Report/test.tex~45
-rwxr-xr-xnotFinishedCode/tricode/ClientClass.py123
-rwxr-xr-xnotFinishedCode/tricode/ClientClass.pycbin0 -> 3286 bytes
-rwxr-xr-xnotFinishedCode/tricode/ControllerClass.py226
-rw-r--r--notFinishedCode/tricode/ControllerClass.pycbin0 -> 6875 bytes
-rwxr-xr-xnotFinishedCode/tricode/DbClass.py294
-rwxr-xr-xnotFinishedCode/tricode/DbClass.pycbin0 -> 7155 bytes
-rwxr-xr-xnotFinishedCode/tricode/GSM EPlus handler.log40
-rwxr-xr-xnotFinishedCode/tricode/GSM O2 handler.log112
-rwxr-xr-xnotFinishedCode/tricode/GSM RZ1 handler.log445
-rwxr-xr-xnotFinishedCode/tricode/GSM TMobile handler.log56
-rwxr-xr-xnotFinishedCode/tricode/GSM Vodaphone handler.log56
-rwxr-xr-xnotFinishedCode/tricode/GSMClass.py304
-rw-r--r--notFinishedCode/tricode/GSMClass.pycbin0 -> 6669 bytes
-rwxr-xr-xnotFinishedCode/tricode/GSMHandler.py286
-rwxr-xr-xnotFinishedCode/tricode/Landline handler.log252
-rwxr-xr-xnotFinishedCode/tricode/LogFileClass.py21
-rwxr-xr-xnotFinishedCode/tricode/LogFileClass.pycbin0 -> 1319 bytes
-rwxr-xr-xnotFinishedCode/tricode/PingClass.py28
-rwxr-xr-xnotFinishedCode/tricode/PingClass.pycbin0 -> 1111 bytes
-rwxr-xr-xnotFinishedCode/tricode/SIP handler.log1282
-rwxr-xr-xnotFinishedCode/tricode/SIPHandler.py233
-rwxr-xr-xnotFinishedCode/tricode/SSHTunnelBoxClass.py45
-rwxr-xr-xnotFinishedCode/tricode/SSHTunnelBoxClass.pycbin0 -> 1645 bytes
-rwxr-xr-xnotFinishedCode/tricode/SSHTunnelClass.py47
-rwxr-xr-xnotFinishedCode/tricode/ServerClass.py152
-rw-r--r--notFinishedCode/tricode/ServerClass.pycbin0 -> 4178 bytes
-rwxr-xr-xnotFinishedCode/tricode/ServerClassSoftware.py162
-rw-r--r--notFinishedCode/tricode/ServerClassSoftware.pycbin0 -> 4384 bytes
-rwxr-xr-xnotFinishedCode/tricode/TestProcessLog.log1855
-rwxr-xr-xnotFinishedCode/tricode/University SIP handler.log184
-rw-r--r--notFinishedCode/tricode/class/pBarcode128.class.php184
-rw-r--r--notFinishedCode/tricode/class/pBarcode39.class.php200
-rw-r--r--notFinishedCode/tricode/class/pBubble.class.php283
-rw-r--r--notFinishedCode/tricode/class/pCache.class.php280
-rw-r--r--notFinishedCode/tricode/class/pData.class.php723
-rw-r--r--notFinishedCode/tricode/class/pDraw.class.php5799
-rw-r--r--notFinishedCode/tricode/class/pImage.class.php343
-rw-r--r--notFinishedCode/tricode/class/pIndicator.class.php241
-rw-r--r--notFinishedCode/tricode/class/pPie.class.php1493
-rw-r--r--notFinishedCode/tricode/class/pRadar.class.php669
-rw-r--r--notFinishedCode/tricode/class/pScatter.class.php954
-rw-r--r--notFinishedCode/tricode/class/pSplit.class.php131
-rw-r--r--notFinishedCode/tricode/class/pSpring.class.php868
-rw-r--r--notFinishedCode/tricode/class/pStock.class.php216
-rw-r--r--notFinishedCode/tricode/class/pSurface.class.php315
-rw-r--r--notFinishedCode/tricode/css/Critical.pngbin0 -> 4795 bytes
-rw-r--r--notFinishedCode/tricode/css/Help.pngbin0 -> 4907 bytes
-rw-r--r--notFinishedCode/tricode/css/Info.pngbin0 -> 4600 bytes
-rw-r--r--notFinishedCode/tricode/css/Warning.pngbin0 -> 3467 bytes
-rwxr-xr-xnotFinishedCode/tricode/css/chk_off.pngbin0 -> 655 bytes
-rwxr-xr-xnotFinishedCode/tricode/css/chk_on.pngbin0 -> 537 bytes
-rw-r--r--notFinishedCode/tricode/css/formCSS.css46
-rw-r--r--notFinishedCode/tricode/css/info_rhombus.pngbin0 -> 1816 bytes
-rw-r--r--notFinishedCode/tricode/css/information.pngbin0 -> 2112 bytes
-rw-r--r--notFinishedCode/tricode/css/link.gifbin0 -> 836 bytes
-rw-r--r--notFinishedCode/tricode/css/tableCSS.css146
-rw-r--r--notFinishedCode/tricode/css/tooltip.css33
-rw-r--r--notFinishedCode/tricode/css/visitedLink.gifbin0 -> 838 bytes
-rw-r--r--notFinishedCode/tricode/delayedLoading.js228
-rwxr-xr-xnotFinishedCode/tricode/execute.php30
-rw-r--r--notFinishedCode/tricode/fonts/Bedizen.ttfbin0 -> 42912 bytes
-rw-r--r--notFinishedCode/tricode/fonts/Forgotte.ttfbin0 -> 42148 bytes
-rw-r--r--notFinishedCode/tricode/fonts/GeosansLight.ttfbin0 -> 60072 bytes
-rw-r--r--notFinishedCode/tricode/fonts/MankSans.ttfbin0 -> 58492 bytes
-rw-r--r--notFinishedCode/tricode/fonts/Silkscreen.ttfbin0 -> 16172 bytes
-rw-r--r--notFinishedCode/tricode/fonts/advent_light.ttfbin0 -> 45768 bytes
-rw-r--r--notFinishedCode/tricode/fonts/calibri.ttfbin0 -> 811052 bytes
-rw-r--r--notFinishedCode/tricode/fonts/pf_arma_five.ttfbin0 -> 21936 bytes
-rw-r--r--notFinishedCode/tricode/fonts/verdana.ttfbin0 -> 189144 bytes
-rwxr-xr-xnotFinishedCode/tricode/gsmselftest.py783
-rwxr-xr-xnotFinishedCode/tricode/gsmselftest1.py300
-rwxr-xr-xnotFinishedCode/tricode/gsmselftest2.py370
-rwxr-xr-xnotFinishedCode/tricode/help.txt15
-rw-r--r--notFinishedCode/tricode/icons/blackberry_dunno.pngbin0 -> 1922 bytes
-rw-r--r--notFinishedCode/tricode/icons/blackberry_fail.pngbin0 -> 1954 bytes
-rw-r--r--notFinishedCode/tricode/icons/blackberry_work.pngbin0 -> 1988 bytes
-rw-r--r--notFinishedCode/tricode/icons/box_dunno.pngbin0 -> 1255 bytes
-rw-r--r--notFinishedCode/tricode/icons/box_fail.pngbin0 -> 1407 bytes
-rw-r--r--notFinishedCode/tricode/icons/box_work.pngbin0 -> 1420 bytes
-rw-r--r--notFinishedCode/tricode/icons/server_dunno.pngbin0 -> 1410 bytes
-rw-r--r--notFinishedCode/tricode/icons/server_fail.pngbin0 -> 1497 bytes
-rw-r--r--notFinishedCode/tricode/icons/server_work.pngbin0 -> 1480 bytes
-rw-r--r--notFinishedCode/tricode/icons/sip_dunno.pngbin0 -> 1494 bytes
-rw-r--r--notFinishedCode/tricode/icons/sip_fail.pngbin0 -> 1621 bytes
-rw-r--r--notFinishedCode/tricode/icons/sip_work.pngbin0 -> 1591 bytes
-rw-r--r--notFinishedCode/tricode/icons/telephone_dunno.pngbin0 -> 1798 bytes
-rw-r--r--notFinishedCode/tricode/icons/telephone_fail.pngbin0 -> 1871 bytes
-rw-r--r--notFinishedCode/tricode/icons/telephone_work.pngbin0 -> 1883 bytes
-rw-r--r--notFinishedCode/tricode/icons/uni-network_dunno.pngbin0 -> 3126 bytes
-rw-r--r--notFinishedCode/tricode/icons/uni-network_fail.pngbin0 -> 3202 bytes
-rw-r--r--notFinishedCode/tricode/icons/uni-network_work.pngbin0 -> 3198 bytes
-rwxr-xr-xnotFinishedCode/tricode/initTestClass.py147
-rwxr-xr-xnotFinishedCode/tricode/initTestClass.pycbin0 -> 3954 bytes
-rw-r--r--notFinishedCode/tricode/insertData.php81
-rw-r--r--notFinishedCode/tricode/loader.gifbin0 -> 10819 bytes
-rw-r--r--notFinishedCode/tricode/moocheck.js176
-rw-r--r--notFinishedCode/tricode/mootools.js126
-rw-r--r--notFinishedCode/tricode/mutexFunctions.php36
-rwxr-xr-xnotFinishedCode/tricode/mutexTry.php238
-rw-r--r--notFinishedCode/tricode/networkResult.php307
-rw-r--r--notFinishedCode/tricode/post.php470
-rwxr-xr-xnotFinishedCode/tricode/script.sh1
-rwxr-xr-xnotFinishedCode/tricode/sshtest.py15
-rw-r--r--notFinishedCode/tricode/startSoftware.py14
-rw-r--r--notFinishedCode/tricode/startTest.php438
-rw-r--r--notFinishedCode/tricode/testCase.php209
-rwxr-xr-xnotFinishedCode/tricode/trueTableClass.py198
-rwxr-xr-xnotFinishedCode/tricode/trueTableClass.pycbin0 -> 3422 bytes
-rwxr-xr-xnotFinishedCode/tricode/usbDetectClass.py88
-rwxr-xr-xnotFinishedCode/tricode/usbDetectClass.pycbin0 -> 3123 bytes
-rw-r--r--notFinishedCode/tricode/wait.gifbin0 -> 2545 bytes
-rw-r--r--notFinishedCode/web/css/Critical.pngbin0 -> 4795 bytes
-rw-r--r--notFinishedCode/web/css/Help.pngbin0 -> 4907 bytes
-rw-r--r--notFinishedCode/web/css/Info.pngbin0 -> 4600 bytes
-rw-r--r--notFinishedCode/web/css/Warning.pngbin0 -> 3467 bytes
-rwxr-xr-xnotFinishedCode/web/css/chk_off.pngbin0 -> 655 bytes
-rwxr-xr-xnotFinishedCode/web/css/chk_on.pngbin0 -> 537 bytes
-rw-r--r--notFinishedCode/web/css/formCSS.css46
-rw-r--r--notFinishedCode/web/css/info_rhombus.pngbin0 -> 1816 bytes
-rw-r--r--notFinishedCode/web/css/information.pngbin0 -> 2112 bytes
-rw-r--r--notFinishedCode/web/css/link.gifbin0 -> 836 bytes
-rw-r--r--notFinishedCode/web/css/tableCSS.css146
-rw-r--r--notFinishedCode/web/css/tooltip.css33
-rw-r--r--notFinishedCode/web/css/visitedLink.gifbin0 -> 838 bytes
128 files changed, 23640 insertions, 39 deletions
diff --git a/documenting/Report/test.log b/documenting/Report/test.log
index e88ead4..5147064 100644
--- a/documenting/Report/test.log
+++ b/documenting/Report/test.log
@@ -1,4 +1,4 @@
-This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=pdflatex 2011.9.27) 8 NOV 2011 12:30
+This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian) (format=pdflatex 2011.9.27) 9 NOV 2011 18:40
entering extended mode
%&-line parsing enabled.
**test.tex
@@ -633,7 +633,7 @@ en/ec/ecsx1440.600pk> </home/refik/.texmf-var/fonts/pk/ljfour/jknappen/ec/ecsl1
texmf-texlive/fonts/type1/public/amsfonts/cm/cmmi10.pfb></usr/share/texmf-texli
ve/fonts/type1/public/amsfonts/cm/cmsy10.pfb></usr/share/texmf-texlive/fonts/ty
pe1/public/amsfonts/cm/cmsy9.pfb>
-Output written on test.pdf (50 pages, 5058627 bytes).
+Output written on test.pdf (50 pages, 5058590 bytes).
PDF statistics:
1657 PDF objects out of 1728 (max. 8388607)
418 named destinations out of 1000 (max. 500000)
diff --git a/documenting/Report/test.pdf b/documenting/Report/test.pdf
index 71c64e0..e76d775 100644
--- a/documenting/Report/test.pdf
+++ b/documenting/Report/test.pdf
Binary files differ
diff --git a/documenting/Report/test.tex b/documenting/Report/test.tex
index 6e15c02..0f07041 100644
--- a/documenting/Report/test.tex
+++ b/documenting/Report/test.tex
@@ -1113,14 +1113,14 @@ drwxr-xr-x 30 gsmselftest gsmselftest 4096 2011-11-02 18:28 ..
-rw-r--r-- 1 gsmselftest gsmselftest 1263 2011-10-20 17:54 PingClass.pyc
-rwxr--r-- 1 gsmselftest gsmselftest 3982 2011-10-20 17:54 ServerClass.py
-rw-r--r-- 1 gsmselftest gsmselftest 4596 2011-10-20 17:57 ServerClass.pyc
--rw-r--r-- 1 gsmselftest gsmselftest 4129 2011-10-20 23:17 ServerClassSoftware.py
--rw-r--r-- 1 gsmselftest gsmselftest 4802 2011-10-20 23:17 ServerClassSoftware.pyc
+-rw-r--r-- 1 gsmselftest gsmselftest 4129 2011-10-20 23:17 WebsiteCommClass.py
+-rw-r--r-- 1 gsmselftest gsmselftest 4802 2011-10-20 23:17 WebsiteCommClass.pyc
-rwxr-xr-x 1 gsmselftest gsmselftest 5252 2011-10-22 03:58 SIPHandler.py
-rwxr--r-- 1 gsmselftest gsmselftest 1267 2011-11-02 14:07 SSHTunnelBoxClass.py
-rw-r--r-- 1 gsmselftest gsmselftest 1852 2011-11-02 14:19 SSHTunnelBoxClass.pyc
-rw-r--r-- 1 gsmselftest gsmselftest 323 2011-11-02 18:44 startSoftware.py
--rwxr-xr-x 1 gsmselftest gsmselftest 6378 2011-11-02 16:13 trueTableClass.py
--rw-r--r-- 1 gsmselftest gsmselftest 4583 2011-11-02 16:16 trueTableClass.pyc
+-rwxr-xr-x 1 gsmselftest gsmselftest 6378 2011-11-02 16:13 truthTableClass.py
+-rw-r--r-- 1 gsmselftest gsmselftest 4583 2011-11-02 16:16 truthTableClass.pyc
-rwxr-xr-x 1 gsmselftest gsmselftest 2248 2011-10-28 14:04 usbDetectClass.py
-rw-r--r-- 1 gsmselftest gsmselftest 3590 2011-10-28 14:05 usbDetectClass.pyc
\end{lstlisting}
diff --git a/documenting/Report/test.tex~ b/documenting/Report/test.tex~
index 866b72b..6e15c02 100644
--- a/documenting/Report/test.tex~
+++ b/documenting/Report/test.tex~
@@ -1211,40 +1211,19 @@ The errors can be described the following way:
\begin{itemize}
\item \emph{200}, Connection between the caller and callee was properly established
-\item \emph{604}, Callee handler has a problem , a connection error between caller and callee
-\item \emph{998}, Controller software cannot establish a connection and send messages to the callee handler but the destination handler is alive
+\item \emph{604}, Callee handler has a problem during executing the test, a connection error between caller and callee
+\item \emph{998}, Controller cannot establish a connection and send messages to the callee handler but the callee handler is alive
\item \emph{605}, Caller handler has a problem during executing the test, a connection error between caller and callee
-\end{itemize}
-605, 'General Handler Error: Caller handler did not respond. Timeout'
-Means that The caller handler having problem during the test task. Probably the connection between controller and caller handler having problem.
-
-
-999, 'General Handler Error: Could not connect to the caller handler!'
-Means that controller can’t make connection and send message to caller handler but the caller handler reachable from the server.
-
-486, 'Call Failed’
-The test task is failed. The connection between caller and destination are broken.
-
-500, 'Caller server Internal Error'
-Means that the caller handler unreachable from the server.
-
-501, 'Destination server Internal Error'
-Means that the destination handler unreachable from the server.
-
-333, 'Could not establish a connection to the database!’
-Could not login to the database MySql.
-
-100, 'Missing account detail'
-Means can’t sign to the existing account at SIP server (SIP at asterisk, Landline at sipgate.de, SIP at University telephone network) due missing or incorrect information in the device address table.
-
-402, 'Payment Required (Eplus Card)'),
-Error respond code for E-Plus card.
-
-801, 'Connection to caller establishment, but device error'
-The device on the caller handler doesn’t connect properly or die.
-
-802, 'Connection to destination establishment, but device error');
-The device on the Destination handler doesn’t connect properly or die.
+\item \emph{999}, Controller cannot establish a connection and send messages to the caller handler but the caller handler is alive
+\item \emph{486}, Call test failled, the connection between the caller and callee could not be established
+\item \emph{500}, Caller handler cannot be reached from the server
+\item \emph{501}, Callee handler cannot be reached from the server
+\item \emph{333}, Cannot login to the MySQL database
+\item \emph{100}, Software cannot sign in to the SIP account(SIP at Asterisk, Landline at sipgate.de, SIP at University telephone network), due to missing or incorrect information in the device address table
+\item \emph{402}, Payment required for the E-Plus SIM card
+\item \emph{801}, Caller device on the handler times out or is not properly connected
+\item \emph{802}, Callee device on the handler times out or is not properly connected
+\end{itemize}
\clearpage
\newpage
diff --git a/notFinishedCode/tricode/ClientClass.py b/notFinishedCode/tricode/ClientClass.py
new file mode 100755
index 0000000..46c3b00
--- /dev/null
+++ b/notFinishedCode/tricode/ClientClass.py
@@ -0,0 +1,123 @@
+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/notFinishedCode/tricode/ClientClass.pyc b/notFinishedCode/tricode/ClientClass.pyc
new file mode 100755
index 0000000..ae03a09
--- /dev/null
+++ b/notFinishedCode/tricode/ClientClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/ControllerClass.py b/notFinishedCode/tricode/ControllerClass.py
new file mode 100755
index 0000000..30d8b33
--- /dev/null
+++ b/notFinishedCode/tricode/ControllerClass.py
@@ -0,0 +1,226 @@
+import sys
+import os
+import subprocess
+import SSHTunnelBoxClass
+import ClientClass
+
+import LogFileClass
+logger = LogFileClass.Logging('TestProcessLog.log')
+
+from time import sleep
+
+
+class doTheTest:
+
+ 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('')
+
+ self.initCaller()
+ sleep(2)
+
+ self.callerGreeting()
+
+ if self.connected == 'OK':
+
+ self.caller.sendData('CALLER|'+self.destNo)
+ callerHandler = self.caller.receiveData(10)
+
+ if callerHandler == "CALLER READY":
+ logger.logEvent('Caller handler : Ready')
+
+ self.initReceiver()
+ sleep(2)
+ self.receiverGreeting()
+
+ if self.connected == 'OK':
+
+ self.receiver.sendData('RECEIVER')
+ destHandler = self.receiver.receiveData(10)
+
+ if destHandler == 'RECEIVER READY':
+ logger.logEvent('Receiver handler : Ready')
+
+ self.startCall()
+ self.waitingFeedback()
+
+ else:
+ self.testResult = 604
+ logger.logEvent('604 General Handler Error: Destination handler no respond timeout')
+ self.caller.sendData('TERMINATE CONNECTION')
+ self.receiver.closeConnection()
+
+ else:
+ logger.logEvent('998 General Handler Error: Could not connect Destination handler')
+ self.testResult = 998
+ self.caller.sendData('TERMINATE CONNECTION')
+ self.caller.closeConnection()
+ else:
+ self.testResult = 605
+ logger.logEvent('605 General Handler Error: caller handler no respond timeout')
+
+ self.caller.closeConnection()
+
+ else:
+ self.testResult = 999
+ logger.logEvent('999 General Handler Error: Could not connect to Caller handler')
+
+
+
+ def waitingFeedback(self):
+ logger.logEvent('Waiting Feedback')
+ self.resultCaller = self.caller.receiveData(15)
+ self.resultDest = self.receiver.receiveData(15)
+
+ if self.resultCaller <> 'CALL OK' or self.resultDest <> 'CALL OK':
+
+ logger.logEvent('Test Failed')
+ self.testResult = 486
+ self.initTerminate()
+
+ else:
+ logger.logEvent('Test Succeed')
+ self.testResult = 200
+ self.initTerminate()
+
+ def startCall(self):
+ logger.logEvent('Start Call')
+ self.receiver.sendData('RECEIVE START')
+ self.caller.sendData('CALL START')
+
+ def initCaller(self):
+ logger.logEvent('init Caller')
+ logger.logEvent(self.callFrom)
+
+ if self.callFrom =="GSMRZ1":
+ self.portCaller = 50007
+ self.initGSM(self.portCaller, self.callPortName)
+
+ elif self.callFrom =="GSMRZ2":
+ self.portCaller = 40000
+ self.box1 = SHHTunnelBoxClass.SSHTunneling(40000, 50008, '10.4.58.241', 'lsfks', 'r')
+ self.box1.startTunneling()
+
+ elif self.callFrom =="GSMRZ3":
+ self.portCaller = 20000
+ self.box2 = SSHTunnelBoxClass.SSHTunneling(20000, 50008, '132.230.4.67', 'lsfks', 'r')#ip??
+ self.box2.startTunneling()
+
+ elif self.callFrom =="GSMExt.O2":
+ self.portCaller = 50010
+ self.initGSM(self.portCaller, self.callPortName)
+
+ elif self.callFrom =="GSMExt.Voda":
+ self.portCaller = 50011
+ self.initGSM(self.portCaller, self.callPortName)
+
+ elif self.callFrom =="GSMExt.Tm":
+ self.portCaller = 50012
+ self.initGSM(self.portCaller, self.callPortName)
+
+ elif self.callFrom =="GSMExt.Eplus":
+ self.portCaller = 50013
+ self.initGSM(self.portCaller, self.callPortName)
+
+ else:
+ self.portCaller = 50099
+ subprocess.Popen(args=["gnome-terminal", '--command=python SIPHandler.py '+self.accCaller+ ' ' +str(self.portCaller)])
+
+ def initReceiver(self):
+ logger.logEvent('init Receiver')
+ logger.logEvent(self.dest)
+
+ if self.dest =="GSMRZ1":
+ self.portDest = 50007
+ self.initGSM(self.portDest, self.destPortName)
+
+ elif self.dest =="GSMRZ2":
+ self.portDest = 40000
+ self.box1 = SHHTunnelBoxClass.SSHTunneling(40000, 50008, '10.4.58.241', 'lsfks', 'r')
+ self.box1.startTunneling()
+
+ elif self.dest =="GSMRZ3":
+ self.portDest = 20000#should be 9
+ self.box2 = SSHTunnelBoxClass.SSHTunneling(20000, 50008, '132.230.4.67', 'lsfks', 'r')#ip??
+ self.box2.startTunneling()
+
+ elif self.dest =="GSMExt.O2":
+ self.portDest = 50010
+ self.initGSM(self.portDest, self.destPortName)
+
+ elif self.dest =="GSMExt.Voda":
+ self.portDest = 50011
+ self.initGSM(self.portDest, self.destPortName)
+
+ elif self.dest =="GSMExt.Tm":
+ self.portDest = 50012
+ self.initGSM(self.portDest, self.destPortName)
+
+ elif self.dest =="GSMExt.Eplus":
+ self.portDest = 50013
+ self.initGSM(self.portDest, self.destPortName)
+
+ else:
+ self.portDest = 50100
+ subprocess.Popen(args=['gnome-terminal', '--command=python SIPHandler.py '+self.accDest+ ' ' +str(self.portDest)])
+
+ def initTerminate(self):
+ self.caller.sendData('TERMINATE CONNECTION')
+ self.receiver.sendData('TERMINATE CONNECTION')
+ if self.dest =="GSMRZ2" or self.callFrom =="GSMRZ2":
+ self.box1.killTunneling()
+ if self.dest =="GSMRZ3" or self.callFrom =="GSMRZ3":
+ self.box2.killTunneling()
+
+ def callerGreeting(self):
+ self.connected = None
+ self.caller = ClientClass.Connection('localhost',self.portCaller)
+ self.caller.connect()
+
+ if self.caller.connected == 1:
+ logger.logEvent('Connected to Caller Handler')
+ self.caller.sendData('HELLO HANDLER')
+ if self.caller.receiveData(10) == 'HELLO CONTROLLER':
+ logger.logEvent('Caller Handler respond')
+ self.connected = 'OK'
+ else:
+ logger.logEvent('Cannt connect to Caller')
+ self.connected = 'NOT OK'
+
+ def receiverGreeting(self):
+ self.connected = None
+ self.receiver = ClientClass.Connection('localhost', self.portDest)
+ self.receiver.connect()
+
+ if self.receiver.connected == 1:
+ logger.logEvent('Connected to Receiver Handler')
+ self.receiver.sendData('HELLO HANDLER')
+ if self.receiver.receiveData(10) == 'HELLO CONTROLLER':
+ logger.logEvent('Receiver Handler respond')
+ self.connected = 'OK'
+ else:
+ logger.logEvent('Cannt connect to Receiver')
+ self.connected = 'NOT OK'
+
+ def initGSM(self, portCommunication, portDevice):
+
+ subprocess.Popen(args=["gnome-terminal", '--command=python GSMHandler.py '+str(portCommunication)+ ' ' +str(portDevice)])
+
+
+
+
diff --git a/notFinishedCode/tricode/ControllerClass.pyc b/notFinishedCode/tricode/ControllerClass.pyc
new file mode 100644
index 0000000..f502b88
--- /dev/null
+++ b/notFinishedCode/tricode/ControllerClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/DbClass.py b/notFinishedCode/tricode/DbClass.py
new file mode 100755
index 0000000..697a2e4
--- /dev/null
+++ b/notFinishedCode/tricode/DbClass.py
@@ -0,0 +1,294 @@
+import MySQLdb
+import string
+
+class DBMySQLConnection:
+ def __init__(self, username, password, host, dbname):
+ #initialize at the start all the user parameters
+ self.usern = username
+ self.passw = password
+ self.host = host
+ self.db = dbname
+ self.connectionCreated = 0
+ self.tasksList = list()
+ self.callerLists = list()
+ self.errCode = None
+ self.lockSet = 0
+ self.deviceUpdate = None
+ global debugMode
+ debugMode = 0
+
+ def connectDB(self):
+ try:
+ #try the connection
+ 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 updateGSMDevice(self, deviceName, newPortName, newNumber):
+ if self.connectionCreated == 1:
+ try:
+ stmt = "UPDATE DeviceAddressTable SET portName = '"+ newPortName + "', number = '"+ newNumber+ "' WHERE deviceName = '" + deviceName+ "'"
+ self.cur.execute(stmt)
+
+ 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("UPDATE PingResultTable SET sipServer=%i, sipGate=%i, unisip=%i, gsmBox1=%i, gsmBox2=%i WHERE taskNo=%i"%(int(sipServer), int(sipGate), int(unisip), int(gsmBox1), int(gsmBox2), int(taskNo)))
+ 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 `errorcode`=%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 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/notFinishedCode/tricode/DbClass.pyc b/notFinishedCode/tricode/DbClass.pyc
new file mode 100755
index 0000000..16f6395
--- /dev/null
+++ b/notFinishedCode/tricode/DbClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/GSM EPlus handler.log b/notFinishedCode/tricode/GSM EPlus handler.log
new file mode 100755
index 0000000..7997504
--- /dev/null
+++ b/notFinishedCode/tricode/GSM EPlus handler.log
@@ -0,0 +1,40 @@
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:48:27.264683 ------------------
+On: 2011-09-09 12:48:27.265058 Event: LISTEN ON PORT: 50013
+On: 2011-09-09 12:48:28.558466 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 49184)
+On: 2011-09-09 12:48:28.558826 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:48:28.559020 Event: RECEIVER READY SENT
+On: 2011-09-09 12:48:41.101556 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:59:06.848402 ------------------
+On: 2011-09-09 12:59:06.848758 Event: LISTEN ON PORT: 50013
+On: 2011-09-09 12:59:08.158183 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 57214)
+On: 2011-09-09 12:59:08.158555 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:59:08.158752 Event: RECEIVER READY SENT
+On: 2011-09-09 12:59:19.917552 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:06:13.387544 ------------------
+On: 2011-09-09 13:06:13.387893 Event: LISTEN ON PORT: 50013
+On: 2011-09-09 13:06:14.689750 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 46713)
+On: 2011-09-09 13:06:14.690101 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:06:14.690286 Event: RECEIVER READY SENT
+On: 2011-09-09 13:06:27.129506 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:26:32.215390 ------------------
+On: 2011-09-09 16:26:32.215752 Event: LISTEN ON PORT: 50013
+On: 2011-09-09 16:26:33.562369 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 42523)
+On: 2011-09-09 16:26:33.562737 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 16:26:33.562934 Event: RECEIVER READY SENT
+On: 2011-09-09 16:26:45.033768 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:40:55.226813 ------------------
+On: 2011-09-12 14:40:55.227014 Event: LISTEN ON PORT: 50013
+On: 2011-09-12 14:40:57.081675 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 43518)
+On: 2011-09-12 14:40:57.081881 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:40:57.082085 Event: RECEIVER READY SENT
+On: 2011-09-12 14:41:08.595861 Event: RECEIVE STATUS REPORTED
diff --git a/notFinishedCode/tricode/GSM O2 handler.log b/notFinishedCode/tricode/GSM O2 handler.log
new file mode 100755
index 0000000..84433a8
--- /dev/null
+++ b/notFinishedCode/tricode/GSM O2 handler.log
@@ -0,0 +1,112 @@
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:19:16.340815 ------------------
+On: 2011-09-02 13:19:16.341186 Event: LISTEN ON PORT: 50010
+On: 2011-09-02 13:19:17.518510 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58024)
+On: 2011-09-02 13:19:17.518877 Event: TALK INITIALIZATION SENT
+On: 2011-09-02 13:19:17.519088 Event: RECEIVER READY SENT
+On: 2011-09-02 13:19:52.565859 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:20:12.787827 ------------------
+On: 2011-09-02 13:20:12.788178 Event: LISTEN ON PORT: 50010
+On: 2011-09-02 13:20:14.086507 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58028)
+On: 2011-09-02 13:20:14.086878 Event: TALK INITIALIZATION SENT
+On: 2011-09-02 13:20:14.087087 Event: RECEIVER READY SENT
+On: 2011-09-02 13:20:49.131352 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:21:04.327838 ------------------
+On: 2011-09-02 13:21:04.328190 Event: LISTEN ON PORT: 50010
+On: 2011-09-02 13:21:05.622153 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58032)
+On: 2011-09-02 13:21:05.622509 Event: TALK INITIALIZATION SENT
+On: 2011-09-02 13:21:05.622716 Event: RECEIVER READY SENT
+On: 2011-09-02 13:21:40.669855 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:29:20.540569 ------------------
+On: 2011-09-02 13:29:20.540925 Event: LISTEN ON PORT: 50010
+On: 2011-09-02 13:29:21.822541 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 35657)
+On: 2011-09-02 13:29:21.823061 Event: TALK INITIALIZATION SENT
+On: 2011-09-02 13:29:21.823284 Event: RECEIVER READY SENT
+On: 2011-09-02 13:29:56.893863 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:46:00.662353 ------------------
+On: 2011-09-02 13:46:00.662704 Event: LISTEN ON PORT: 50010
+On: 2011-09-02 13:46:01.954462 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 50620)
+On: 2011-09-02 13:46:01.954832 Event: TALK INITIALIZATION SENT
+On: 2011-09-02 13:46:01.955047 Event: RECEIVER READY SENT
+On: 2011-09-02 13:46:37.001865 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:49:55.948391 ------------------
+On: 2011-09-02 13:49:55.948742 Event: LISTEN ON PORT: 50010
+On: 2011-09-02 13:49:57.222503 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 34857)
+On: 2011-09-02 13:49:57.222862 Event: TALK INITIALIZATION SENT
+On: 2011-09-02 13:49:57.223068 Event: RECEIVER READY SENT
+On: 2011-09-02 13:50:32.269865 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:55:04.613859 ------------------
+On: 2011-09-02 13:55:04.614276 Event: LISTEN ON PORT: 50010
+On: 2011-09-02 13:55:05.900791 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 49252)
+On: 2011-09-02 13:55:05.901155 Event: TALK INITIALIZATION SENT
+On: 2011-09-02 13:55:05.901360 Event: RECEIVER READY SENT
+On: 2011-09-02 13:55:40.945864 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:01:08.553238 ------------------
+On: 2011-09-09 12:01:08.553690 Event: LISTEN ON PORT: 50010
+On: 2011-09-09 12:01:09.633472 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 37013)
+On: 2011-09-09 12:01:09.633839 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:01:09.634040 Event: RECEIVER READY SENT
+On: 2011-09-09 12:01:20.697548 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:47:38.800491 ------------------
+On: 2011-09-09 12:47:38.800847 Event: LISTEN ON PORT: 50010
+On: 2011-09-09 12:47:40.099170 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 38025)
+On: 2011-09-09 12:47:40.099532 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:47:40.099759 Event: RECEIVER READY SENT
+On: 2011-09-09 12:47:52.645510 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:51:04.852997 ------------------
+On: 2011-09-09 12:51:04.853352 Event: LISTEN ON PORT: 50010
+On: 2011-09-09 12:51:05.992284 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 52593)
+On: 2011-09-09 12:51:05.992645 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:51:05.992845 Event: CALLER READY SENT
+On: 2011-09-09 12:51:18.173129 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:58:45.031428 ------------------
+On: 2011-09-09 12:58:45.031786 Event: LISTEN ON PORT: 50010
+On: 2011-09-09 12:58:46.137551 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 50390)
+On: 2011-09-09 12:58:46.137917 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:58:46.138115 Event: RECEIVER READY SENT
+On: 2011-09-09 12:58:57.525504 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:05:28.675031 ------------------
+On: 2011-09-09 13:05:28.675384 Event: LISTEN ON PORT: 50010
+On: 2011-09-09 13:05:29.989932 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58734)
+On: 2011-09-09 13:05:29.990321 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:05:29.990516 Event: RECEIVER READY SENT
+On: 2011-09-09 13:05:41.029529 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:25:14.182184 ------------------
+On: 2011-09-09 16:25:14.182544 Event: LISTEN ON PORT: 50010
+On: 2011-09-09 16:25:15.512986 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 41638)
+On: 2011-09-09 16:25:15.513359 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 16:25:15.513559 Event: RECEIVER READY SENT
+On: 2011-09-09 16:25:50.557079 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:43:09.337867 ------------------
+On: 2011-09-12 14:43:09.338081 Event: LISTEN ON PORT: 50010
+On: 2011-09-12 14:43:11.180846 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 60058)
+On: 2011-09-12 14:43:11.181472 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:43:11.181850 Event: RECEIVER READY SENT
+On: 2011-09-12 14:43:46.231884 Event: RECEIVE STATUS REPORTED
diff --git a/notFinishedCode/tricode/GSM RZ1 handler.log b/notFinishedCode/tricode/GSM RZ1 handler.log
new file mode 100755
index 0000000..73390d2
--- /dev/null
+++ b/notFinishedCode/tricode/GSM RZ1 handler.log
@@ -0,0 +1,445 @@
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:09:04.252668 ------------------
+On: 2011-09-09 12:09:04.253031 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 12:09:05.548461 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 56426)
+On: 2011-09-09 12:09:05.548828 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:09:05.549026 Event: RECEIVER READY SENT
+On: 2011-09-09 12:09:10.346080 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:49:14.607291 ------------------
+On: 2011-09-09 12:49:14.607750 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 12:49:15.835788 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 56351)
+On: 2011-09-09 12:49:15.836139 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:49:15.836444 Event: RECEIVER READY SENT
+On: 2011-09-09 12:49:20.734057 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:49:58.309936 ------------------
+On: 2011-09-09 12:49:58.310290 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 12:49:59.620358 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 56362)
+On: 2011-09-09 12:49:59.620713 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:49:59.620910 Event: CALLER READY SENT
+On: 2011-09-09 12:50:07.098264 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:50:12.795225 ------------------
+On: 2011-09-09 12:50:12.795583 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 12:50:14.118855 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 56366)
+On: 2011-09-09 12:50:14.119213 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:50:14.119408 Event: CALLER READY SENT
+On: 2011-09-09 12:50:19.922092 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:50:27.671994 ------------------
+On: 2011-09-09 12:50:27.672351 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 12:50:28.975329 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 56372)
+On: 2011-09-09 12:50:28.975692 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:50:28.975891 Event: RECEIVER READY SENT
+On: 2011-09-09 12:51:04.023944 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:51:06.711538 ------------------
+On: 2011-09-09 12:51:06.711896 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 12:51:07.998006 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 56376)
+On: 2011-09-09 12:51:07.998560 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:51:07.998802 Event: RECEIVER READY SENT
+On: 2011-09-09 12:51:14.901568 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:51:25.887230 ------------------
+On: 2011-09-09 12:51:25.887589 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 12:51:27.186301 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 56380)
+On: 2011-09-09 12:51:27.186663 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:51:27.186859 Event: RECEIVER READY SENT
+On: 2011-09-09 12:51:34.905569 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:06:58.642536 ------------------
+On: 2011-09-09 13:06:58.642891 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 13:06:59.926611 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 55773)
+On: 2011-09-09 13:06:59.926965 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:06:59.927150 Event: RECEIVER READY SENT
+On: 2011-09-09 13:07:04.714132 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:07:42.389809 ------------------
+On: 2011-09-09 13:07:42.390169 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 13:07:43.727870 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 55784)
+On: 2011-09-09 13:07:43.728236 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:07:43.728439 Event: CALLER READY SENT
+On: 2011-09-09 13:07:52.374208 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:07:58.054747 ------------------
+On: 2011-09-09 13:07:58.055099 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 13:07:59.392133 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 55789)
+On: 2011-09-09 13:07:59.392493 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:07:59.392689 Event: CALLER READY SENT
+On: 2011-09-09 13:08:04.658096 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:08:12.432386 ------------------
+On: 2011-09-09 13:08:12.432741 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 13:08:13.714138 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 55795)
+On: 2011-09-09 13:08:13.714495 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:08:13.714691 Event: RECEIVER READY SENT
+On: 2011-09-09 13:08:21.713585 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:27:33.320470 ------------------
+On: 2011-09-09 16:27:33.320821 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 16:27:34.665873 Event: $connection established but device not working: ('127.0.0.1', 46371)
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:28:12.758156 ------------------
+On: 2011-09-09 16:28:12.758516 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 16:28:14.140885 Event: $connection established but device not working: ('127.0.0.1', 46381)
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:28:21.843292 ------------------
+On: 2011-09-09 16:28:21.843645 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 16:28:23.189381 Event: $connection established but device not working: ('127.0.0.1', 46385)
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:08:03.739982 ------------------
+On: 2011-09-09 21:08:03.740341 Event: LISTEN ON PORT: 50007
+On: 2011-09-09 21:08:57.457214 Event: $no connection
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:31:40.604286 ------------------
+On: 2011-09-11 20:31:40.604485 Event: LISTEN ON PORT: 50007
+On: 2011-09-11 20:31:42.470822 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 44479)
+On: 2011-09-11 20:31:42.471118 Event: TALK INITIALIZATION SENT
+On: 2011-09-11 20:31:42.471364 Event: RECEIVER READY SENT
+On: 2011-09-11 20:31:47.318892 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:32:18.769934 ------------------
+On: 2011-09-11 20:32:18.770084 Event: LISTEN ON PORT: 50007
+On: 2011-09-11 20:32:20.621688 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 44487)
+On: 2011-09-11 20:32:20.621780 Event: TALK INITIALIZATION SENT
+On: 2011-09-11 20:32:20.621846 Event: RECEIVER READY SENT
+On: 2011-09-11 20:32:26.154870 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:35:30.903279 ------------------
+On: 2011-09-11 20:35:30.903427 Event: LISTEN ON PORT: 50007
+On: 2011-09-11 20:35:32.736107 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 37454)
+On: 2011-09-11 20:35:32.736376 Event: TALK INITIALIZATION SENT
+On: 2011-09-11 20:35:32.736586 Event: RECEIVER READY SENT
+On: 2011-09-11 20:35:37.982869 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:41:54.832964 ------------------
+On: 2011-09-11 20:41:54.833110 Event: LISTEN ON PORT: 50007
+On: 2011-09-11 20:41:56.697828 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58521)
+On: 2011-09-11 20:41:56.698115 Event: TALK INITIALIZATION SENT
+On: 2011-09-11 20:41:56.698374 Event: RECEIVER READY SENT
+On: 2011-09-11 20:42:02.138861 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:49:38.859404 ------------------
+On: 2011-09-11 20:49:38.859549 Event: LISTEN ON PORT: 50007
+On: 2011-09-11 20:49:40.711849 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 59578)
+On: 2011-09-11 20:49:40.712111 Event: TALK INITIALIZATION SENT
+On: 2011-09-11 20:49:40.712340 Event: RECEIVER READY SENT
+On: 2011-09-11 20:49:46.566860 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:51:48.137464 ------------------
+On: 2011-09-11 20:51:48.137600 Event: LISTEN ON PORT: 50007
+On: 2011-09-11 20:51:49.999857 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 59586)
+On: 2011-09-11 20:51:50.000517 Event: TALK INITIALIZATION SENT
+On: 2011-09-11 20:51:50.000950 Event: RECEIVER READY SENT
+On: 2011-09-11 20:51:54.838862 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:34:12.369592 ------------------
+On: 2011-09-12 14:34:12.369780 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:34:14.215731 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 57075)
+On: 2011-09-12 14:34:14.216034 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:34:14.216425 Event: RECEIVER READY SENT
+On: 2011-09-12 14:34:19.731872 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:34:26.897437 ------------------
+On: 2011-09-12 14:34:26.897653 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:34:28.757754 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 57077)
+On: 2011-09-12 14:34:28.758024 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:34:28.758241 Event: RECEIVER READY SENT
+On: 2011-09-12 14:34:33.871865 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:36:30.859006 ------------------
+On: 2011-09-12 14:36:30.859141 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:36:32.707629 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 45158)
+On: 2011-09-12 14:36:32.708010 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:36:32.708271 Event: RECEIVER READY SENT
+On: 2011-09-12 14:36:38.611894 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:40:53.205353 ------------------
+On: 2011-09-12 14:40:53.205499 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:40:55.075920 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 49757)
+On: 2011-09-12 14:40:55.076216 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:40:55.076464 Event: CALLER READY SENT
+On: 2011-09-12 14:41:07.847951 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:41:13.772641 ------------------
+On: 2011-09-12 14:41:13.772791 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:41:15.609376 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 49771)
+On: 2011-09-12 14:41:15.609466 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:41:15.609593 Event: CALLER READY SENT
+On: 2011-09-12 14:41:28.439868 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:42:01.018134 ------------------
+On: 2011-09-12 14:42:01.018284 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:42:02.872258 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 49796)
+On: 2011-09-12 14:42:02.872476 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:42:02.872611 Event: CALLER READY SENT
+On: 2011-09-12 14:42:16.175900 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:43:07.312211 ------------------
+On: 2011-09-12 14:43:07.312401 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:43:09.176761 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 49805)
+On: 2011-09-12 14:43:09.176850 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:43:09.176919 Event: CALLER READY SENT
+On: 2011-09-12 14:43:16.643865 Event: CALLER STATUS SENT
+On: 2011-09-12 14:43:26.644063 Event: other appeared
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:43:59.133145 ------------------
+On: 2011-09-12 14:43:59.133347 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:44:01.004213 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 49838)
+On: 2011-09-12 14:44:01.004306 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:44:01.004376 Event: CALLER READY SENT
+On: 2011-09-12 14:44:13.703866 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:56:55.325808 ------------------
+On: 2011-09-12 14:56:55.325950 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:56:57.176660 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 48944)
+On: 2011-09-12 14:56:57.176744 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:56:57.176805 Event: RECEIVER READY SENT
+On: 2011-09-12 14:57:02.143879 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:57:09.298801 ------------------
+On: 2011-09-12 14:57:09.298948 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 14:57:11.164230 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 48947)
+On: 2011-09-12 14:57:11.164541 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:57:11.164947 Event: RECEIVER READY SENT
+On: 2011-09-12 14:57:16.499867 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:01:23.466451 ------------------
+On: 2011-09-12 15:01:23.466659 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:01:25.332316 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 41827)
+On: 2011-09-12 15:01:25.332421 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:01:25.332502 Event: RECEIVER READY SENT
+On: 2011-09-12 15:01:30.483863 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:14:56.063288 ------------------
+On: 2011-09-12 15:14:56.063476 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:14:57.923208 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 43898)
+On: 2011-09-12 15:14:57.923488 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:14:57.923737 Event: RECEIVER READY SENT
+On: 2011-09-12 15:15:03.759896 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:15:10.907063 ------------------
+On: 2011-09-12 15:15:10.907204 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:15:12.776151 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 43900)
+On: 2011-09-12 15:15:12.776358 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:15:12.776473 Event: RECEIVER READY SENT
+On: 2011-09-12 15:15:17.859905 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:15:25.020451 ------------------
+On: 2011-09-12 15:15:25.020668 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:15:26.879166 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 43918)
+On: 2011-09-12 15:15:26.879252 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:15:26.879313 Event: RECEIVER READY SENT
+On: 2011-09-12 15:15:31.983889 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:15:39.151966 ------------------
+On: 2011-09-12 15:15:39.152162 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:15:41.014279 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 43926)
+On: 2011-09-12 15:15:41.014619 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:15:41.014957 Event: RECEIVER READY SENT
+On: 2011-09-12 15:15:46.127870 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:19:35.668448 ------------------
+On: 2011-09-12 15:19:35.668590 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:19:37.524158 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 46144)
+On: 2011-09-12 15:19:37.524361 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:19:37.524709 Event: RECEIVER READY SENT
+On: 2011-09-12 15:19:42.659891 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:26:15.168629 ------------------
+On: 2011-09-12 15:26:15.168820 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:26:17.019563 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58905)
+On: 2011-09-12 15:26:17.019971 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:26:17.020260 Event: RECEIVER READY SENT
+On: 2011-09-12 15:26:22.843918 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:27:38.930946 ------------------
+On: 2011-09-12 15:27:38.931129 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:27:40.788517 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58943)
+On: 2011-09-12 15:27:40.788624 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:27:40.788685 Event: RECEIVER READY SENT
+On: 2011-09-12 15:27:46.383896 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:28:27.223362 ------------------
+On: 2011-09-12 15:28:27.223509 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:28:29.089129 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58952)
+On: 2011-09-12 15:28:29.089276 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:28:29.089381 Event: RECEIVER READY SENT
+On: 2011-09-12 15:28:34.667894 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:32:15.562789 ------------------
+On: 2011-09-12 15:32:15.562925 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:32:17.448140 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 54499)
+On: 2011-09-12 15:32:17.448234 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:32:17.448299 Event: RECEIVER READY SENT
+On: 2011-09-12 15:32:23.207892 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:35:10.231404 ------------------
+On: 2011-09-12 15:35:10.231546 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:35:12.110089 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 54545)
+On: 2011-09-12 15:35:12.110396 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:35:12.110643 Event: RECEIVER READY SENT
+On: 2011-09-12 15:35:17.147894 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:44:49.454514 ------------------
+On: 2011-09-12 15:44:49.454646 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:44:51.312223 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 40859)
+On: 2011-09-12 15:44:51.312332 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:44:51.312444 Event: RECEIVER READY SENT
+On: 2011-09-12 15:44:56.207917 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:45:58.478998 ------------------
+On: 2011-09-12 15:45:58.479175 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:46:00.348200 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 35704)
+On: 2011-09-12 15:46:00.348288 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:46:00.348402 Event: RECEIVER READY SENT
+On: 2011-09-12 15:46:05.651905 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:47:40.237784 ------------------
+On: 2011-09-12 15:47:40.237923 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:47:42.088635 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 35741)
+On: 2011-09-12 15:47:42.088727 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:47:42.088865 Event: RECEIVER READY SENT
+On: 2011-09-12 15:47:47.091885 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:55:03.395908 ------------------
+On: 2011-09-12 15:55:03.396061 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:55:05.261236 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 55348)
+On: 2011-09-12 15:55:05.261516 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:55:05.261715 Event: RECEIVER READY SENT
+On: 2011-09-12 15:55:10.551886 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:57:55.360458 ------------------
+On: 2011-09-12 15:57:55.360590 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 15:57:57.197326 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 33224)
+On: 2011-09-12 15:57:57.197439 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 15:57:57.197511 Event: RECEIVER READY SENT
+On: 2011-09-12 15:58:02.635879 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:02:33.745309 ------------------
+On: 2011-09-12 16:02:33.745511 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:02:35.604235 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 43816)
+On: 2011-09-12 16:02:35.604417 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:02:35.604598 Event: RECEIVER READY SENT
+On: 2011-09-12 16:02:41.331887 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:05:11.726433 ------------------
+On: 2011-09-12 16:05:11.726571 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:05:13.603313 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 43849)
+On: 2011-09-12 16:05:13.603771 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:05:13.604019 Event: RECEIVER READY SENT
+On: 2011-09-12 16:05:19.495897 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:08:31.470858 ------------------
+On: 2011-09-12 16:08:31.470998 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:08:33.337750 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 39817)
+On: 2011-09-12 16:08:33.337841 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:08:33.337910 Event: RECEIVER READY SENT
+On: 2011-09-12 16:08:39.355862 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:11:34.073728 ------------------
+On: 2011-09-12 16:11:34.073917 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:11:35.951587 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 53207)
+On: 2011-09-12 16:11:35.951971 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:11:35.952285 Event: RECEIVER READY SENT
+On: 2011-09-12 16:11:41.543962 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:12:13.028243 ------------------
+On: 2011-09-12 16:12:13.028417 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:12:14.905460 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 53219)
+On: 2011-09-12 16:12:14.905667 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:12:14.905862 Event: RECEIVER READY SENT
+On: 2011-09-12 16:12:20.399889 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:15:16.858935 ------------------
+On: 2011-09-12 16:15:16.859140 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:15:18.724328 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 53266)
+On: 2011-09-12 16:15:18.724846 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:15:18.725171 Event: RECEIVER READY SENT
+On: 2011-09-12 16:15:23.999890 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:18:26.944225 ------------------
+On: 2011-09-12 16:18:26.944421 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:18:28.809780 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 50008)
+On: 2011-09-12 16:18:28.809979 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:18:28.810119 Event: RECEIVER READY SENT
+On: 2011-09-12 16:18:34.635876 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:19:00.950542 ------------------
+On: 2011-09-12 16:19:00.950681 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:19:02.800590 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 50012)
+On: 2011-09-12 16:19:02.800677 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:19:02.800741 Event: RECEIVER READY SENT
+On: 2011-09-12 16:19:07.579882 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:20:42.868060 ------------------
+On: 2011-09-12 16:20:42.868263 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:20:44.730978 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 50048)
+On: 2011-09-12 16:20:44.731284 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:20:44.731556 Event: RECEIVER READY SENT
+On: 2011-09-12 16:20:49.983860 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:23:23.910331 ------------------
+On: 2011-09-12 16:23:23.910501 Event: LISTEN ON PORT: 50007
+On: 2011-09-12 16:23:25.776088 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 33016)
+On: 2011-09-12 16:23:25.776407 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 16:23:25.776661 Event: RECEIVER READY SENT
+On: 2011-09-12 16:23:31.215885 Event: RECEIVE STATUS REPORTED
diff --git a/notFinishedCode/tricode/GSM TMobile handler.log b/notFinishedCode/tricode/GSM TMobile handler.log
new file mode 100755
index 0000000..6a7f938
--- /dev/null
+++ b/notFinishedCode/tricode/GSM TMobile handler.log
@@ -0,0 +1,56 @@
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:48:50.590312 ------------------
+On: 2011-09-09 12:48:50.590686 Event: LISTEN ON PORT: 50012
+On: 2011-09-09 12:48:51.813655 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 47771)
+On: 2011-09-09 12:48:51.814016 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:48:51.814216 Event: RECEIVER READY SENT
+On: 2011-09-09 12:49:05.881506 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:59:29.325937 ------------------
+On: 2011-09-09 12:59:29.326293 Event: LISTEN ON PORT: 50012
+On: 2011-09-09 12:59:30.568222 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 57949)
+On: 2011-09-09 12:59:30.568583 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:59:30.568778 Event: RECEIVER READY SENT
+On: 2011-09-09 12:59:44.301288 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:05:00.413015 ------------------
+On: 2011-09-09 13:05:00.413369 Event: LISTEN ON PORT: 50012
+On: 2011-09-09 13:05:01.734174 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 44493)
+On: 2011-09-09 13:05:01.734527 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:05:01.734718 Event: RECEIVER READY SENT
+On: 2011-09-09 13:05:13.425508 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:06:36.468289 ------------------
+On: 2011-09-09 13:06:36.468641 Event: LISTEN ON PORT: 50012
+On: 2011-09-09 13:06:37.752250 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 44509)
+On: 2011-09-09 13:06:37.752613 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:06:37.752814 Event: RECEIVER READY SENT
+On: 2011-09-09 13:06:49.193498 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:26:54.291836 ------------------
+On: 2011-09-09 16:26:54.292192 Event: LISTEN ON PORT: 50012
+On: 2011-09-09 16:26:55.638609 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 42778)
+On: 2011-09-09 16:26:55.638985 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 16:26:55.639188 Event: RECEIVER READY SENT
+On: 2011-09-09 16:27:30.685203 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:42:03.020109 ------------------
+On: 2011-09-12 14:42:03.020283 Event: LISTEN ON PORT: 50012
+On: 2011-09-12 14:42:04.876236 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58176)
+On: 2011-09-12 14:42:04.876328 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:42:04.876395 Event: RECEIVER READY SENT
+On: 2011-09-12 14:42:17.287864 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:44:01.136434 ------------------
+On: 2011-09-12 14:44:01.136573 Event: LISTEN ON PORT: 50012
+On: 2011-09-12 14:44:03.009101 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58218)
+On: 2011-09-12 14:44:03.009384 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:44:03.009624 Event: RECEIVER READY SENT
+On: 2011-09-12 14:44:13.523887 Event: RECEIVE STATUS REPORTED
diff --git a/notFinishedCode/tricode/GSM Vodaphone handler.log b/notFinishedCode/tricode/GSM Vodaphone handler.log
new file mode 100755
index 0000000..15335b2
--- /dev/null
+++ b/notFinishedCode/tricode/GSM Vodaphone handler.log
@@ -0,0 +1,56 @@
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:01:29.973703 ------------------
+On: 2011-09-09 12:01:29.974088 Event: LISTEN ON PORT: 50011
+On: 2011-09-09 12:01:31.288549 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 39844)
+On: 2011-09-09 12:01:31.288923 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:01:31.289125 Event: RECEIVER READY SENT
+On: 2011-09-09 12:01:42.069538 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:48:01.958543 ------------------
+On: 2011-09-09 12:48:01.958901 Event: LISTEN ON PORT: 50011
+On: 2011-09-09 12:48:03.266126 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 46507)
+On: 2011-09-09 12:48:03.266485 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:48:03.266679 Event: RECEIVER READY SENT
+On: 2011-09-09 12:48:19.538059 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:51:23.872295 ------------------
+On: 2011-09-09 12:51:23.872646 Event: LISTEN ON PORT: 50011
+On: 2011-09-09 12:51:25.180609 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 58881)
+On: 2011-09-09 12:51:25.180965 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:51:25.181157 Event: CALLER READY SENT
+On: 2011-09-09 12:51:35.665094 Event: CALLER STATUS SENT
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:58:22.590937 ------------------
+On: 2011-09-09 12:58:22.591294 Event: LISTEN ON PORT: 50011
+On: 2011-09-09 12:58:23.464597 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 34076)
+On: 2011-09-09 12:58:23.464968 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 12:58:23.465167 Event: RECEIVER READY SENT
+On: 2011-09-09 12:58:35.341553 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:05:50.346578 ------------------
+On: 2011-09-09 13:05:50.346932 Event: LISTEN ON PORT: 50011
+On: 2011-09-09 13:05:51.666150 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 55008)
+On: 2011-09-09 13:05:51.666510 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 13:05:51.666703 Event: RECEIVER READY SENT
+On: 2011-09-09 13:06:02.993510 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:25:53.192832 ------------------
+On: 2011-09-09 16:25:53.193191 Event: LISTEN ON PORT: 50011
+On: 2011-09-09 16:25:54.538374 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 39631)
+On: 2011-09-09 16:25:54.538750 Event: TALK INITIALIZATION SENT
+On: 2011-09-09 16:25:54.538949 Event: RECEIVER READY SENT
+On: 2011-09-09 16:26:29.585947 Event: RECEIVE STATUS REPORTED
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:41:15.765779 ------------------
+On: 2011-09-12 14:41:15.765922 Event: LISTEN ON PORT: 50011
+On: 2011-09-12 14:41:17.614908 Event: CONNECTION ESTABLISHED AND DEVICE WORKING: ('127.0.0.1', 37023)
+On: 2011-09-12 14:41:17.615107 Event: TALK INITIALIZATION SENT
+On: 2011-09-12 14:41:17.615280 Event: RECEIVER READY SENT
+On: 2011-09-12 14:41:27.639880 Event: RECEIVE STATUS REPORTED
diff --git a/notFinishedCode/tricode/GSMClass.py b/notFinishedCode/tricode/GSMClass.py
new file mode 100755
index 0000000..e994814
--- /dev/null
+++ b/notFinishedCode/tricode/GSMClass.py
@@ -0,0 +1,304 @@
+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.debugMode = 0
+
+ def portInit(self):
+ portName = self.portAddress[-4:]
+ portExist = os.popen('dmesg | grep ' + portName).read()
+
+ 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.flushInput() #clean the input buffer for serial port
+ self.ser.write('AT\r')
+
+ received = self.__receiveData()
+
+ 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()
+
+ 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/notFinishedCode/tricode/GSMClass.pyc b/notFinishedCode/tricode/GSMClass.pyc
new file mode 100644
index 0000000..c3e8062
--- /dev/null
+++ b/notFinishedCode/tricode/GSMClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/GSMHandler.py b/notFinishedCode/tricode/GSMHandler.py
new file mode 100755
index 0000000..d701d94
--- /dev/null
+++ b/notFinishedCode/tricode/GSMHandler.py
@@ -0,0 +1,286 @@
+import ServerClass
+import GSMClass
+import LogFileClass
+from time import sleep
+import sys
+
+global portListen
+global portAddress
+
+
+if len(sys.argv) <> 3:
+ print "Error given command"
+ sys.exit(2)
+
+
+portListen = int(sys.argv[1])
+portAddress = sys.argv[2]
+
+def initLogfile():
+ global nameOfLogFile
+
+ if portListen == 50007:
+ nameOfLogFile = 'GSM RZ1 handler.log'
+
+ elif portListen == 50010:
+ nameOfLogFile = 'GSM O2 handler.log'
+
+ elif portListen == 50011:
+ nameOfLogFile = 'GSM Vodaphone handler.log'
+
+ elif portListen == 50012:
+ nameOfLogFile = 'GSM TMobile handler.log'
+
+ elif portListen == 50013:
+ nameOfLogFile = 'GSM EPlus handler.log'
+ else:
+ print "No port listening found"
+
+
+baudRate = 19200
+
+initLogfile()
+logger = LogFileClass.Logging(nameOfLogFile)
+
+errorCount = 0
+
+logger.logEvent('')
+
+whileCounter =0
+
+#define global varibales
+global lastState
+global resetState
+lastState = 0
+resetState = 0
+
+
+def initSystem():
+ print 'init system'
+
+ global handlerSocket
+ global gsmDevice
+ global initTalkVar
+ global lastState
+
+ global numberToCall
+ global resetState
+
+ 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))
+
+ #add this if you need it
+ gsmDevice = GSMClass.serialPort(portAddress, baudRate, 35)
+
+ initDevice = gsmDevice.portInit()
+ ########################################################
+
+ #add nice formating to the log file :)
+ anyConnection = handlerSocket.openSocket()
+
+
+ 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()))
+ terminateConnection()
+ return 2
+ else:
+ logger.logEvent('$no connection')
+ sys.exit(1)
+ return 0
+
+def receiveMessage(timeout):
+
+ message = str(handlerSocket.receiveData(timeout))
+
+ 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))
+
+ elif message == 'RECEIVE START' and lastState == 2:
+ outcome = receiveStart()
+ if outcome == 1:
+ logger.logEvent('RECEIVE STATUS REPORTED')
+ else:
+ logger.logEvent('$receive status not reported: ' + str(outcome))
+
+ 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))
+
+ elif message == 'CALL START' and lastState == 4:
+ outcome = callStart(numberToCall)
+ if outcome == 1:
+ logger.logEvent('CALLER STATUS SENT')
+ else:
+ logger.logEvent('$caller status not sent: ' + str(outcome))
+
+ 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:
+ outcome = other()
+ logger.logEvent('other appeared')
+ terminateConnection()
+
+
+ return 1
+ #return 0
+
+########INIT TALK PART########
+def initTalk():
+ print 'init talk'
+
+ #initialize the talk between handler and controller
+ global lastState
+ 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
+ lastState = 3
+ receiveCall = gsmDevice.receiveCall()
+
+ if receiveCall == 1:
+ callSuccess = 'CALL OK'
+ else:
+ callSuccess = 'CALL NOT OK'
+
+ tryHangUp = gsmDevice.hangUp()
+
+ sendMessage = handlerSocket.sendData(callSuccess)
+ return sendMessage
+############################
+
+
+########CALL PART########
+def initCaller():
+ print 'initCaller'
+
+ #initialize caller here
+ global lastState
+ lastState = 4
+ sendMessage = handlerSocket.sendData('CALLER READY')
+ return sendMessage
+
+def callStart(numberToCall):
+ print 'initCaller'
+
+ #call the number here
+ global lastState
+ lastState = 5
+
+ callSuccess = 'CALL NOT OK'
+
+ tryCall = gsmDevice.callNumber(numberToCall)
+ if tryCall != 1:
+ callSuccess = 'CALL NOT OK'
+ else:
+ sleep(2)
+ activeCall = gsmDevice.currentCall()
+ counter = 0
+ while(activeCall!=1):
+ sleep(1)
+ activeCall = gsmDevice.currentCall()
+ if counter == 6:
+ break
+ counter += 1
+
+ if activeCall == 1:
+ callSuccess = 'CALL OK'
+ else:
+ callSuccess = 'CALL NOT OK'
+
+ tryHangUp = gsmDevice.hangUp()
+
+ return handlerSocket.sendData(callSuccess)
+#########################
+
+
+########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
+##############################
+
+
+
+while 1:
+ test = initSystem()
+ if test == 1:
+ print 'initialized system'
+ receivedMessage = 0
+ while receivedMessage < 4 and resetState!= 1:
+ receivedMessage += receiveMessage(10)
+
+ del handlerSocket
+ del gsmDevice
diff --git a/notFinishedCode/tricode/Landline handler.log b/notFinishedCode/tricode/Landline handler.log
new file mode 100755
index 0000000..9df2628
--- /dev/null
+++ b/notFinishedCode/tricode/Landline handler.log
@@ -0,0 +1,252 @@
+
+
+------------------STARTED THE LOGGING 2011-09-02 12:52:18.607406 ------------------
+On: 2011-09-02 12:52:18.630918 Event: try to Connect to Controller
+On: 2011-09-02 12:52:19.825005 Event: init state
+On: 2011-09-02 12:52:19.825252 Event: Register Account to SIP server
+On: 2011-09-02 12:52:19.827301 Event: 100
+On: 2011-09-02 12:52:19.827695 Event: Receiver Handler Ready
+On: 2011-09-02 12:52:19.827758 Event: RECEIVE START
+On: 2011-09-02 12:52:25.854718 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-02 12:52:25.855212 Event: Call Connecting
+On: 2011-09-02 12:52:25.855251 Event: 200
+On: 2011-09-02 12:52:25.855397 Event: Answer call
+On: 2011-09-02 12:52:25.855429 Event: Hangup call
+On: 2011-09-02 12:52:25.855582 Event: CALL OK
+On: 2011-09-02 12:52:25.906299 Event: Call Disconnected
+On: 2011-09-02 12:52:26.635047 Event: Terminate
+On: 2011-09-02 12:52:26.635111 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:04:21.554606 ------------------
+On: 2011-09-02 13:04:21.575322 Event: try to Connect to Controller
+On: 2011-09-02 13:04:22.858718 Event: init state
+On: 2011-09-02 13:04:22.858946 Event: Register Account to SIP server
+On: 2011-09-02 13:04:22.860443 Event: 100
+On: 2011-09-02 13:04:22.860784 Event: Receiver Handler Ready
+On: 2011-09-02 13:04:22.860838 Event: RECEIVE START
+On: 2011-09-02 13:04:28.893785 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-02 13:04:28.894283 Event: Call Connecting
+On: 2011-09-02 13:04:28.894322 Event: 200
+On: 2011-09-02 13:04:28.894465 Event: Answer call
+On: 2011-09-02 13:04:28.894496 Event: Hangup call
+On: 2011-09-02 13:04:28.894648 Event: CALL OK
+On: 2011-09-02 13:04:28.945299 Event: Call Disconnected
+On: 2011-09-02 13:04:29.581365 Event: Terminate
+On: 2011-09-02 13:04:29.581424 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:09:05.499955 ------------------
+On: 2011-09-02 13:09:05.520757 Event: try to Connect to Controller
+On: 2011-09-02 13:09:06.657084 Event: init state
+On: 2011-09-02 13:09:06.657313 Event: Register Account to SIP server
+On: 2011-09-02 13:09:06.659550 Event: 100
+On: 2011-09-02 13:09:06.659647 Event: Receiver Handler Ready
+On: 2011-09-02 13:09:06.659955 Event: RECEIVE START
+On: 2011-09-02 13:09:12.539174 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-02 13:09:12.539661 Event: Call Connecting
+On: 2011-09-02 13:09:12.539700 Event: 200
+On: 2011-09-02 13:09:12.539844 Event: Answer call
+On: 2011-09-02 13:09:12.539876 Event: Hangup call
+On: 2011-09-02 13:09:12.540029 Event: CALL OK
+On: 2011-09-02 13:09:12.590670 Event: Call Disconnected
+On: 2011-09-02 13:09:13.239354 Event: Terminate
+On: 2011-09-02 13:09:13.239412 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:15:40.364573 ------------------
+On: 2011-09-02 13:15:40.385233 Event: try to Connect to Controller
+On: 2011-09-02 13:15:41.649241 Event: init state
+On: 2011-09-02 13:15:41.649477 Event: Register Account to SIP server
+On: 2011-09-02 13:15:41.651355 Event: 100
+On: 2011-09-02 13:15:41.651703 Event: Receiver Handler Ready
+On: 2011-09-02 13:15:41.651760 Event: RECEIVE START
+On: 2011-09-02 13:15:48.166113 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-02 13:15:48.166609 Event: Call Connecting
+On: 2011-09-02 13:15:48.166648 Event: 200
+On: 2011-09-02 13:15:48.166795 Event: Answer call
+On: 2011-09-02 13:15:48.166827 Event: Hangup call
+On: 2011-09-02 13:15:48.166985 Event: CALL OK
+On: 2011-09-02 13:15:48.217641 Event: Call Disconnected
+On: 2011-09-02 13:15:50.013696 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-02 13:15:50.014310 Event: Call Connecting
+On: 2011-09-02 13:15:50.014351 Event: 200
+On: 2011-09-02 13:15:50.014501 Event: Answer call
+On: 2011-09-02 13:15:50.014529 Event: Hangup call
+On: 2011-09-02 13:15:50.014674 Event: CALL OK
+On: 2011-09-02 13:15:50.065382 Event: Call Disconnected
+On: 2011-09-02 13:15:50.633895 Event: Terminate
+On: 2011-09-02 13:15:50.633956 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:04:13.402457 ------------------
+On: 2011-09-09 12:04:13.423005 Event: try to Connect to Controller
+On: 2011-09-09 12:04:14.626365 Event: init state
+On: 2011-09-09 12:04:14.626599 Event: Register Account to SIP server
+On: 2011-09-09 12:04:14.628265 Event: 100
+On: 2011-09-09 12:04:14.628609 Event: Receiver Handler Ready
+On: 2011-09-09 12:04:14.628669 Event: RECEIVE START
+On: 2011-09-09 12:04:20.692145 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-09 12:04:20.692639 Event: Call Connecting
+On: 2011-09-09 12:04:20.692678 Event: 200
+On: 2011-09-09 12:04:20.692825 Event: Answer call
+On: 2011-09-09 12:04:20.692858 Event: Hangup call
+On: 2011-09-09 12:04:20.693013 Event: CALL OK
+On: 2011-09-09 12:04:20.743692 Event: Call Disconnected
+On: 2011-09-09 12:04:21.365368 Event: Terminate
+On: 2011-09-09 12:04:21.365436 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:46:03.859314 ------------------
+On: 2011-09-09 12:46:03.879880 Event: try to Connect to Controller
+On: 2011-09-09 12:46:05.154437 Event: init state
+On: 2011-09-09 12:46:05.154665 Event: Register Account to SIP server
+On: 2011-09-09 12:46:05.156405 Event: 100
+On: 2011-09-09 12:46:05.156501 Event: Receiver Handler Ready
+On: 2011-09-09 12:46:05.156814 Event: RECEIVE START
+On: 2011-09-09 12:46:12.993331 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-09 12:46:12.993883 Event: Call Connecting
+On: 2011-09-09 12:46:12.993928 Event: 200
+On: 2011-09-09 12:46:12.994076 Event: Answer call
+On: 2011-09-09 12:46:12.994108 Event: Hangup call
+On: 2011-09-09 12:46:12.994260 Event: CALL OK
+On: 2011-09-09 12:46:13.044912 Event: Call Disconnected
+On: 2011-09-09 12:46:13.518160 Event: Terminate
+On: 2011-09-09 12:46:13.518225 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:49:32.523406 ------------------
+On: 2011-09-09 12:49:32.543709 Event: try to Connect to Controller
+On: 2011-09-09 12:49:33.806652 Event: init state
+On: 2011-09-09 12:49:33.806878 Event: Register Account to SIP server
+On: 2011-09-09 12:49:33.808777 Event: 100
+On: 2011-09-09 12:49:33.808873 Event: Receiver Handler Ready
+On: 2011-09-09 12:49:33.809184 Event: RECEIVE START
+On: 2011-09-09 12:49:39.767163 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-09 12:49:39.767661 Event: Call Connecting
+On: 2011-09-09 12:49:39.767702 Event: 200
+On: 2011-09-09 12:49:39.767853 Event: Answer call
+On: 2011-09-09 12:49:39.767885 Event: Hangup call
+On: 2011-09-09 12:49:39.768044 Event: CALL OK
+On: 2011-09-09 12:49:39.818702 Event: Call Disconnected
+On: 2011-09-09 12:49:40.461803 Event: Terminate
+On: 2011-09-09 12:49:40.461843 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:50:00.424514 ------------------
+On: 2011-09-09 12:50:00.445863 Event: try to Connect to Controller
+On: 2011-09-09 12:50:01.624553 Event: init state
+On: 2011-09-09 12:50:01.624780 Event: Register Account to SIP server
+On: 2011-09-09 12:50:01.626454 Event: 100
+On: 2011-09-09 12:50:01.629675 Event: Receiver Handler Ready
+On: 2011-09-09 12:50:01.629749 Event: RECEIVE START
+On: 2011-09-09 12:50:05.984948 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-09 12:50:05.985490 Event: Call Connecting
+On: 2011-09-09 12:50:05.985534 Event: 200
+On: 2011-09-09 12:50:05.985714 Event: Answer call
+On: 2011-09-09 12:50:05.985747 Event: Hangup call
+On: 2011-09-09 12:50:05.985917 Event: CALL OK
+On: 2011-09-09 12:50:06.036590 Event: Call Disconnected
+On: 2011-09-09 12:50:07.097850 Event: Terminate
+On: 2011-09-09 12:50:07.097890 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:50:25.754304 ------------------
+On: 2011-09-09 12:50:25.774778 Event: try to Connect to Controller
+On: 2011-09-09 12:50:26.968180 Event: init state
+On: 2011-09-09 12:50:26.968417 Event: Register Account to SIP server
+On: 2011-09-09 12:50:26.970431 Event: 100
+On: 2011-09-09 12:50:26.972636 Event: Caller Handler Ready
+On: 2011-09-09 12:50:31.977419 Event: CALL START
+On: 2011-09-09 12:50:31.977472 Event: Make a call to: 07612034661447
+On: 2011-09-09 12:50:41.588213 Event: Call Disconnected
+On: 2011-09-09 12:50:58.976542 Event: Terminate
+On: 2011-09-09 12:50:58.976585 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:07:16.481749 ------------------
+On: 2011-09-09 13:07:16.502112 Event: try to Connect to Controller
+On: 2011-09-09 13:07:17.789958 Event: init state
+On: 2011-09-09 13:07:17.790193 Event: Register Account to SIP server
+On: 2011-09-09 13:07:17.792481 Event: 100
+On: 2011-09-09 13:07:17.792829 Event: Receiver Handler Ready
+On: 2011-09-09 13:07:17.792886 Event: RECEIVE START
+On: 2011-09-09 13:07:23.872615 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-09 13:07:23.873116 Event: Call Connecting
+On: 2011-09-09 13:07:23.873157 Event: 200
+On: 2011-09-09 13:07:23.873306 Event: Answer call
+On: 2011-09-09 13:07:23.873337 Event: Hangup call
+On: 2011-09-09 13:07:23.873542 Event: CALL OK
+On: 2011-09-09 13:07:23.924191 Event: Call Disconnected
+On: 2011-09-09 13:07:24.560455 Event: Terminate
+On: 2011-09-09 13:07:24.560513 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:07:44.432287 ------------------
+On: 2011-09-09 13:07:44.452745 Event: try to Connect to Controller
+On: 2011-09-09 13:07:45.733130 Event: init state
+On: 2011-09-09 13:07:45.733364 Event: Register Account to SIP server
+On: 2011-09-09 13:07:45.734871 Event: 100
+On: 2011-09-09 13:07:45.737681 Event: Receiver Handler Ready
+On: 2011-09-09 13:07:45.737757 Event: RECEIVE START
+On: 2011-09-09 13:07:51.067366 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-09 13:07:51.067862 Event: Call Connecting
+On: 2011-09-09 13:07:51.067903 Event: 200
+On: 2011-09-09 13:07:51.068051 Event: Answer call
+On: 2011-09-09 13:07:51.068082 Event: Hangup call
+On: 2011-09-09 13:07:51.068238 Event: CALL OK
+On: 2011-09-09 13:07:51.118875 Event: Call Disconnected
+On: 2011-09-09 13:07:52.373796 Event: Terminate
+On: 2011-09-09 13:07:52.373836 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:08:10.420396 ------------------
+On: 2011-09-09 13:08:10.440680 Event: try to Connect to Controller
+On: 2011-09-09 13:08:11.707489 Event: init state
+On: 2011-09-09 13:08:11.707723 Event: Register Account to SIP server
+On: 2011-09-09 13:08:11.709786 Event: 100
+On: 2011-09-09 13:08:11.712030 Event: Caller Handler Ready
+On: 2011-09-09 13:08:16.720169 Event: CALL START
+On: 2011-09-09 13:08:16.720225 Event: Make a call to: 07612034661447
+On: 2011-09-09 13:08:22.021697 Event: Call Connecting
+On: 2011-09-09 13:08:22.021750 Event: 200
+On: 2011-09-09 13:08:22.025668 Event: Terminate
+On: 2011-09-09 13:08:22.025730 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:27:44.548708 ------------------
+On: 2011-09-09 16:27:44.569970 Event: try to Connect to Controller
+On: 2011-09-09 16:27:45.884718 Event: init state
+On: 2011-09-09 16:27:45.884946 Event: Register Account to SIP server
+On: 2011-09-09 16:27:45.886676 Event: 100
+On: 2011-09-09 16:27:45.886773 Event: Receiver Handler Ready
+On: 2011-09-09 16:27:45.887092 Event: RECEIVE START
+On: 2011-09-09 16:27:54.508082 Event: {Call "anonymous" <sip:anonymous@sipgate.de>}
+On: 2011-09-09 16:27:54.508585 Event: Call Connecting
+On: 2011-09-09 16:27:54.508627 Event: 200
+On: 2011-09-09 16:27:54.508773 Event: Answer call
+On: 2011-09-09 16:27:54.508805 Event: Hangup call
+On: 2011-09-09 16:27:54.508962 Event: CALL OK
+On: 2011-09-09 16:27:54.559680 Event: Call Disconnected
+On: 2011-09-09 16:27:55.022441 Event: Terminate
+On: 2011-09-09 16:27:55.022481 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:28:19.816093 ------------------
+On: 2011-09-09 16:28:19.837183 Event: try to Connect to Controller
+On: 2011-09-09 16:28:21.181980 Event: init state
+On: 2011-09-09 16:28:21.182208 Event: Register Account to SIP server
+On: 2011-09-09 16:28:21.184143 Event: 100
+On: 2011-09-09 16:28:21.184237 Event: Caller Handler Ready
+On: 2011-09-09 16:28:23.194234 Event: Terminate
+On: 2011-09-09 16:28:23.194275 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:09:03.763605 ------------------
+On: 2011-09-09 21:09:03.807874 Event: try to Connect to Controller
+On: 2011-09-09 21:09:04.504740 Event: init state
+On: 2011-09-09 21:09:04.504968 Event: Register Account to SIP server
+On: 2011-09-09 21:09:04.506507 Event: 100
+On: 2011-09-09 21:09:04.506597 Event: Caller Handler Ready
+On: 2011-09-09 21:09:08.512560 Event: Terminate
+On: 2011-09-09 21:09:08.512597 Event: Goodbye
diff --git a/notFinishedCode/tricode/LogFileClass.py b/notFinishedCode/tricode/LogFileClass.py
new file mode 100755
index 0000000..cb152f4
--- /dev/null
+++ b/notFinishedCode/tricode/LogFileClass.py
@@ -0,0 +1,21 @@
+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/notFinishedCode/tricode/LogFileClass.pyc b/notFinishedCode/tricode/LogFileClass.pyc
new file mode 100755
index 0000000..ac02ce0
--- /dev/null
+++ b/notFinishedCode/tricode/LogFileClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/PingClass.py b/notFinishedCode/tricode/PingClass.py
new file mode 100755
index 0000000..e13b32b
--- /dev/null
+++ b/notFinishedCode/tricode/PingClass.py
@@ -0,0 +1,28 @@
+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/notFinishedCode/tricode/PingClass.pyc b/notFinishedCode/tricode/PingClass.pyc
new file mode 100755
index 0000000..bdc3030
--- /dev/null
+++ b/notFinishedCode/tricode/PingClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/SIP handler.log b/notFinishedCode/tricode/SIP handler.log
new file mode 100755
index 0000000..3996f33
--- /dev/null
+++ b/notFinishedCode/tricode/SIP handler.log
@@ -0,0 +1,1282 @@
+
+
+------------------STARTED THE LOGGING 2011-09-02 12:52:16.569462 ------------------
+On: 2011-09-02 12:52:16.590556 Event: try to Connect to Controller
+On: 2011-09-02 12:52:17.818389 Event: init state
+On: 2011-09-02 12:52:17.818926 Event: Register Account to SIP server
+On: 2011-09-02 12:52:17.819346 Event: 100
+On: 2011-09-02 12:52:17.819430 Event: Caller Handler Ready
+On: 2011-09-02 12:52:22.830562 Event: CALL START
+On: 2011-09-02 12:52:22.830621 Event: Make a call to: 076145875681
+On: 2011-09-02 12:52:26.633015 Event: Call Connecting
+On: 2011-09-02 12:52:26.633066 Event: 200
+On: 2011-09-02 12:52:26.635568 Event: Terminate
+On: 2011-09-02 12:52:26.635620 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:04:19.521527 ------------------
+On: 2011-09-02 13:04:19.542334 Event: try to Connect to Controller
+On: 2011-09-02 13:04:20.853864 Event: init state
+On: 2011-09-02 13:04:20.854098 Event: Register Account to SIP server
+On: 2011-09-02 13:04:20.854507 Event: 100
+On: 2011-09-02 13:04:20.854585 Event: Caller Handler Ready
+On: 2011-09-02 13:04:25.862590 Event: CALL START
+On: 2011-09-02 13:04:25.862647 Event: Make a call to: 076145875681
+On: 2011-09-02 13:04:29.575870 Event: Call Connecting
+On: 2011-09-02 13:04:29.575919 Event: 200
+On: 2011-09-02 13:04:29.579191 Event: Terminate
+On: 2011-09-02 13:04:29.579251 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:04:30.400558 ------------------
+On: 2011-09-02 13:04:30.426054 Event: try to Connect to Controller
+On: 2011-09-02 13:04:31.589851 Event: init state
+On: 2011-09-02 13:04:31.590091 Event: Register Account to SIP server
+On: 2011-09-02 13:04:31.590501 Event: 100
+On: 2011-09-02 13:04:31.590582 Event: Caller Handler Ready
+On: 2011-09-02 13:04:33.595630 Event: No number to call
+On: 2011-09-02 13:04:33.595665 Event: CALL NOT OK
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:09:03.332562 ------------------
+On: 2011-09-02 13:09:03.353588 Event: try to Connect to Controller
+On: 2011-09-02 13:09:04.647294 Event: init state
+On: 2011-09-02 13:09:04.647968 Event: Register Account to SIP server
+On: 2011-09-02 13:09:04.648454 Event: 100
+On: 2011-09-02 13:09:04.648542 Event: Caller Handler Ready
+On: 2011-09-02 13:09:09.660442 Event: CALL START
+On: 2011-09-02 13:09:09.660500 Event: Make a call to: 076145875681
+On: 2011-09-02 13:09:13.238056 Event: Call Connecting
+On: 2011-09-02 13:09:13.238106 Event: 200
+On: 2011-09-02 13:09:13.239830 Event: Terminate
+On: 2011-09-02 13:09:13.239882 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:09:14.079176 ------------------
+On: 2011-09-02 13:09:14.111735 Event: try to Connect to Controller
+On: 2011-09-02 13:09:15.252127 Event: init state
+On: 2011-09-02 13:09:15.252359 Event: Register Account to SIP server
+On: 2011-09-02 13:09:15.252768 Event: 100
+On: 2011-09-02 13:09:15.252850 Event: Caller Handler Ready
+On: 2011-09-02 13:09:20.260518 Event: CALL START
+On: 2011-09-02 13:09:20.260572 Event: Make a call to: 076120397898
+On: 2011-09-02 13:09:20.312559 Event: Call Connecting
+On: 2011-09-02 13:09:20.312602 Event: 200
+On: 2011-09-02 13:09:20.317870 Event: Terminate
+On: 2011-09-02 13:09:20.317929 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:15:38.321140 ------------------
+On: 2011-09-02 13:15:38.342105 Event: try to Connect to Controller
+On: 2011-09-02 13:15:39.643146 Event: init state
+On: 2011-09-02 13:15:39.643373 Event: Register Account to SIP server
+On: 2011-09-02 13:15:39.643790 Event: 100
+On: 2011-09-02 13:15:39.643872 Event: Caller Handler Ready
+On: 2011-09-02 13:15:44.652007 Event: CALL START
+On: 2011-09-02 13:15:44.652063 Event: Make a call to: 076145875681
+On: 2011-09-02 13:15:50.628202 Event: Call Connecting
+On: 2011-09-02 13:15:50.628251 Event: 200
+On: 2011-09-02 13:15:50.631622 Event: Terminate
+On: 2011-09-02 13:15:50.631677 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:15:51.475577 ------------------
+On: 2011-09-02 13:15:51.511402 Event: try to Connect to Controller
+On: 2011-09-02 13:15:52.640715 Event: init state
+On: 2011-09-02 13:15:52.640948 Event: Register Account to SIP server
+On: 2011-09-02 13:15:52.641361 Event: 100
+On: 2011-09-02 13:15:52.641438 Event: Caller Handler Ready
+On: 2011-09-02 13:15:57.647572 Event: CALL START
+On: 2011-09-02 13:15:57.647631 Event: Make a call to: 076120397898
+On: 2011-09-02 13:15:57.758051 Event: Call Connecting
+On: 2011-09-02 13:15:57.758099 Event: 200
+On: 2011-09-02 13:15:57.762095 Event: Terminate
+On: 2011-09-02 13:15:57.762156 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:19:14.235203 ------------------
+On: 2011-09-02 13:19:14.255845 Event: try to Connect to Controller
+On: 2011-09-02 13:19:15.513986 Event: init state
+On: 2011-09-02 13:19:15.514215 Event: Register Account to SIP server
+On: 2011-09-02 13:19:15.514634 Event: 100
+On: 2011-09-02 13:19:15.514714 Event: Caller Handler Ready
+On: 2011-09-02 13:19:20.521761 Event: CALL START
+On: 2011-09-02 13:19:20.521815 Event: Make a call to: 017678038038
+On: 2011-09-02 13:19:24.029595 Event: Call Connecting
+On: 2011-09-02 13:19:24.029643 Event: 200
+On: 2011-09-02 13:19:39.030951 Event: Terminate
+On: 2011-09-02 13:19:39.031002 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:20:10.793411 ------------------
+On: 2011-09-02 13:20:10.814030 Event: try to Connect to Controller
+On: 2011-09-02 13:20:12.082004 Event: init state
+On: 2011-09-02 13:20:12.082234 Event: Register Account to SIP server
+On: 2011-09-02 13:20:12.082649 Event: 100
+On: 2011-09-02 13:20:12.082731 Event: Caller Handler Ready
+On: 2011-09-02 13:20:17.092943 Event: CALL START
+On: 2011-09-02 13:20:17.092999 Event: Make a call to: 017678038038
+On: 2011-09-02 13:20:20.135349 Event: Call Connecting
+On: 2011-09-02 13:20:20.135396 Event: 200
+On: 2011-09-02 13:20:35.136635 Event: Terminate
+On: 2011-09-02 13:20:35.136685 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:21:02.335449 ------------------
+On: 2011-09-02 13:21:02.356332 Event: try to Connect to Controller
+On: 2011-09-02 13:21:03.616157 Event: init state
+On: 2011-09-02 13:21:03.616388 Event: Register Account to SIP server
+On: 2011-09-02 13:21:03.616815 Event: 100
+On: 2011-09-02 13:21:03.616894 Event: Caller Handler Ready
+On: 2011-09-02 13:21:08.628942 Event: CALL START
+On: 2011-09-02 13:21:08.628995 Event: Make a call to: 017678038038
+On: 2011-09-02 13:21:11.214323 Event: Call Connecting
+On: 2011-09-02 13:21:11.214371 Event: 200
+On: 2011-09-02 13:21:26.215654 Event: Terminate
+On: 2011-09-02 13:21:26.215704 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:29:18.535751 ------------------
+On: 2011-09-02 13:29:18.556882 Event: try to Connect to Controller
+On: 2011-09-02 13:29:19.818174 Event: init state
+On: 2011-09-02 13:29:19.818503 Event: Register Account to SIP server
+On: 2011-09-02 13:29:19.818926 Event: 100
+On: 2011-09-02 13:29:19.819009 Event: Caller Handler Ready
+On: 2011-09-02 13:29:24.825761 Event: CALL START
+On: 2011-09-02 13:29:24.825816 Event: Make a call to: 017678038038
+On: 2011-09-02 13:29:32.222022 Event: Call Connecting
+On: 2011-09-02 13:29:32.222069 Event: 200
+On: 2011-09-02 13:29:47.223206 Event: Terminate
+On: 2011-09-02 13:29:47.223249 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:45:58.666059 ------------------
+On: 2011-09-02 13:45:58.686845 Event: try to Connect to Controller
+On: 2011-09-02 13:45:59.948541 Event: init state
+On: 2011-09-02 13:45:59.948778 Event: Register Account to SIP server
+On: 2011-09-02 13:45:59.949189 Event: 100
+On: 2011-09-02 13:45:59.949271 Event: Caller Handler Ready
+On: 2011-09-02 13:46:04.960957 Event: CALL START
+On: 2011-09-02 13:46:04.961018 Event: Make a call to: 017678038038
+On: 2011-09-02 13:46:08.725986 Event: Call Connecting
+On: 2011-09-02 13:46:08.726034 Event: 200
+On: 2011-09-02 13:46:23.727944 Event: Terminate
+On: 2011-09-02 13:46:23.727996 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:49:53.956104 ------------------
+On: 2011-09-02 13:49:53.976967 Event: try to Connect to Controller
+On: 2011-09-02 13:49:55.218183 Event: init state
+On: 2011-09-02 13:49:55.218439 Event: Register Account to SIP server
+On: 2011-09-02 13:49:55.218849 Event: 100
+On: 2011-09-02 13:49:55.218931 Event: Caller Handler Ready
+On: 2011-09-02 13:50:00.228948 Event: CALL START
+On: 2011-09-02 13:50:00.229003 Event: Make a call to: 017678038038
+On: 2011-09-02 13:50:03.854561 Event: Call Connecting
+On: 2011-09-02 13:50:03.854608 Event: 200
+On: 2011-09-02 13:50:18.855761 Event: Terminate
+On: 2011-09-02 13:50:18.855801 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:55:02.607072 ------------------
+On: 2011-09-02 13:55:02.628231 Event: try to Connect to Controller
+On: 2011-09-02 13:55:03.894910 Event: init state
+On: 2011-09-02 13:55:03.895136 Event: Register Account to SIP server
+On: 2011-09-02 13:55:03.895551 Event: 100
+On: 2011-09-02 13:55:03.895634 Event: Caller Handler Ready
+On: 2011-09-02 13:55:08.908330 Event: CALL START
+On: 2011-09-02 13:55:08.908385 Event: Make a call to: 017678038038
+On: 2011-09-02 13:55:13.119741 Event: Call Connecting
+On: 2011-09-02 13:55:13.119787 Event: 200
+On: 2011-09-02 13:55:28.120884 Event: Terminate
+On: 2011-09-02 13:55:28.120926 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:01:06.420185 ------------------
+On: 2011-09-09 12:01:06.441073 Event: try to Connect to Controller
+On: 2011-09-09 12:01:07.624045 Event: init state
+On: 2011-09-09 12:01:07.624285 Event: Register Account to SIP server
+On: 2011-09-09 12:01:07.625055 Event: 100
+On: 2011-09-09 12:01:07.625137 Event: Caller Handler Ready
+On: 2011-09-09 12:01:12.640588 Event: CALL START
+On: 2011-09-09 12:01:12.640715 Event: Make a call to: 017678038038
+On: 2011-09-09 12:01:22.265854 Event: Call Connecting
+On: 2011-09-09 12:01:22.265902 Event: 200
+On: 2011-09-09 12:01:22.269543 Event: Terminate
+On: 2011-09-09 12:01:22.269602 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:01:27.972292 ------------------
+On: 2011-09-09 12:01:27.992997 Event: try to Connect to Controller
+On: 2011-09-09 12:01:29.282631 Event: init state
+On: 2011-09-09 12:01:29.282872 Event: Register Account to SIP server
+On: 2011-09-09 12:01:29.283281 Event: 100
+On: 2011-09-09 12:01:29.283364 Event: Caller Handler Ready
+On: 2011-09-09 12:01:34.289743 Event: CALL START
+On: 2011-09-09 12:01:34.289799 Event: Make a call to: 015252423662
+On: 2011-09-09 12:01:43.808484 Event: Call Connecting
+On: 2011-09-09 12:01:43.808533 Event: 200
+On: 2011-09-09 12:01:43.812409 Event: Terminate
+On: 2011-09-09 12:01:43.812469 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:04:11.310443 ------------------
+On: 2011-09-09 12:04:11.331278 Event: try to Connect to Controller
+On: 2011-09-09 12:04:12.620596 Event: init state
+On: 2011-09-09 12:04:12.620841 Event: Register Account to SIP server
+On: 2011-09-09 12:04:12.621254 Event: 100
+On: 2011-09-09 12:04:12.621337 Event: Caller Handler Ready
+On: 2011-09-09 12:04:17.630856 Event: CALL START
+On: 2011-09-09 12:04:17.630920 Event: Make a call to: 076145875681
+On: 2011-09-09 12:04:21.364288 Event: Call Connecting
+On: 2011-09-09 12:04:21.364340 Event: 200
+On: 2011-09-09 12:04:21.365852 Event: Terminate
+On: 2011-09-09 12:04:21.365905 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:04:27.072709 ------------------
+On: 2011-09-09 12:04:27.093893 Event: try to Connect to Controller
+On: 2011-09-09 12:04:28.386696 Event: init state
+On: 2011-09-09 12:04:28.386933 Event: Register Account to SIP server
+On: 2011-09-09 12:04:28.387349 Event: 100
+On: 2011-09-09 12:04:28.387431 Event: Caller Handler Ready
+On: 2011-09-09 12:04:33.394162 Event: CALL START
+On: 2011-09-09 12:04:33.394221 Event: Make a call to: 076120397898
+On: 2011-09-09 12:04:33.442576 Event: Call Connecting
+On: 2011-09-09 12:04:33.442622 Event: 200
+On: 2011-09-09 12:04:33.443707 Event: Terminate
+On: 2011-09-09 12:04:33.443768 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:09:02.294476 ------------------
+On: 2011-09-09 12:09:02.314819 Event: try to Connect to Controller
+On: 2011-09-09 12:09:03.542291 Event: init state
+On: 2011-09-09 12:09:03.542526 Event: Register Account to SIP server
+On: 2011-09-09 12:09:03.542939 Event: 100
+On: 2011-09-09 12:09:03.543023 Event: Caller Handler Ready
+On: 2011-09-09 12:09:08.549418 Event: CALL START
+On: 2011-09-09 12:09:08.549474 Event: Make a call to: 07612034661447
+On: 2011-09-09 12:09:10.146099 Event: Call Connecting
+On: 2011-09-09 12:09:10.146148 Event: 200
+On: 2011-09-09 12:09:10.345788 Event: Terminate
+On: 2011-09-09 12:09:10.345831 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:46:01.821854 ------------------
+On: 2011-09-09 12:46:01.842126 Event: try to Connect to Controller
+On: 2011-09-09 12:46:03.149724 Event: init state
+On: 2011-09-09 12:46:03.149956 Event: Register Account to SIP server
+On: 2011-09-09 12:46:03.150372 Event: 100
+On: 2011-09-09 12:46:03.150456 Event: Caller Handler Ready
+On: 2011-09-09 12:46:08.157069 Event: CALL START
+On: 2011-09-09 12:46:08.157127 Event: Make a call to: 076145875681
+On: 2011-09-09 12:46:13.516165 Event: Call Connecting
+On: 2011-09-09 12:46:13.516213 Event: 200
+On: 2011-09-09 12:46:13.516633 Event: Terminate
+On: 2011-09-09 12:46:13.516673 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:46:19.200607 ------------------
+On: 2011-09-09 12:46:19.221192 Event: try to Connect to Controller
+On: 2011-09-09 12:46:20.538553 Event: init state
+On: 2011-09-09 12:46:20.538784 Event: Register Account to SIP server
+On: 2011-09-09 12:46:20.539209 Event: 100
+On: 2011-09-09 12:46:20.539293 Event: Caller Handler Ready
+On: 2011-09-09 12:46:25.546196 Event: CALL START
+On: 2011-09-09 12:46:25.546257 Event: Make a call to: 076120397898
+On: 2011-09-09 12:46:25.620261 Event: Call Connecting
+On: 2011-09-09 12:46:25.620311 Event: 200
+On: 2011-09-09 12:46:25.620673 Event: Terminate
+On: 2011-09-09 12:46:25.620708 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:47:36.818688 ------------------
+On: 2011-09-09 12:47:36.838962 Event: try to Connect to Controller
+On: 2011-09-09 12:47:38.093716 Event: init state
+On: 2011-09-09 12:47:38.093947 Event: Register Account to SIP server
+On: 2011-09-09 12:47:38.094345 Event: 100
+On: 2011-09-09 12:47:38.094424 Event: Caller Handler Ready
+On: 2011-09-09 12:47:43.104501 Event: CALL START
+On: 2011-09-09 12:47:43.104558 Event: Make a call to: 017678038038
+On: 2011-09-09 12:47:54.243504 Event: Call Connecting
+On: 2011-09-09 12:47:54.243553 Event: 200
+On: 2011-09-09 12:47:54.248176 Event: Terminate
+On: 2011-09-09 12:47:54.248240 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:47:59.948642 ------------------
+On: 2011-09-09 12:47:59.972325 Event: try to Connect to Controller
+On: 2011-09-09 12:48:01.261000 Event: init state
+On: 2011-09-09 12:48:01.261228 Event: Register Account to SIP server
+On: 2011-09-09 12:48:01.261688 Event: 100
+On: 2011-09-09 12:48:01.261775 Event: Caller Handler Ready
+On: 2011-09-09 12:48:06.272095 Event: CALL START
+On: 2011-09-09 12:48:06.272150 Event: Make a call to: 015252423662
+On: 2011-09-09 12:48:19.537769 Event: Terminate
+On: 2011-09-09 12:48:19.537809 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:48:25.257085 ------------------
+On: 2011-09-09 12:48:25.277858 Event: try to Connect to Controller
+On: 2011-09-09 12:48:26.554221 Event: init state
+On: 2011-09-09 12:48:26.554449 Event: Register Account to SIP server
+On: 2011-09-09 12:48:26.554863 Event: 100
+On: 2011-09-09 12:48:26.554945 Event: Caller Handler Ready
+On: 2011-09-09 12:48:31.561418 Event: CALL START
+On: 2011-09-09 12:48:31.561470 Event: Make a call to: 015782677224
+On: 2011-09-09 12:48:42.790005 Event: Call Connecting
+On: 2011-09-09 12:48:42.790053 Event: 200
+On: 2011-09-09 12:48:42.793676 Event: Terminate
+On: 2011-09-09 12:48:42.793741 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:48:48.496361 ------------------
+On: 2011-09-09 12:48:48.516769 Event: try to Connect to Controller
+On: 2011-09-09 12:48:49.807782 Event: init state
+On: 2011-09-09 12:48:49.808010 Event: Register Account to SIP server
+On: 2011-09-09 12:48:49.808428 Event: 100
+On: 2011-09-09 12:48:49.808513 Event: Caller Handler Ready
+On: 2011-09-09 12:48:54.820514 Event: CALL START
+On: 2011-09-09 12:48:54.820566 Event: Make a call to: 015128040906
+On: 2011-09-09 12:49:06.817545 Event: Terminate
+On: 2011-09-09 12:49:06.817607 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:49:12.538517 ------------------
+On: 2011-09-09 12:49:12.558970 Event: try to Connect to Controller
+On: 2011-09-09 12:49:13.830382 Event: init state
+On: 2011-09-09 12:49:13.830609 Event: Register Account to SIP server
+On: 2011-09-09 12:49:13.831028 Event: 100
+On: 2011-09-09 12:49:13.831112 Event: Caller Handler Ready
+On: 2011-09-09 12:49:18.839366 Event: CALL START
+On: 2011-09-09 12:49:18.839421 Event: Make a call to: 07612034661447
+On: 2011-09-09 12:49:20.543018 Event: Call Connecting
+On: 2011-09-09 12:49:20.543066 Event: 200
+On: 2011-09-09 12:49:20.733764 Event: Terminate
+On: 2011-09-09 12:49:20.733805 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:49:30.502233 ------------------
+On: 2011-09-09 12:49:30.522419 Event: try to Connect to Controller
+On: 2011-09-09 12:49:31.801363 Event: init state
+On: 2011-09-09 12:49:31.801840 Event: Register Account to SIP server
+On: 2011-09-09 12:49:31.802279 Event: 100
+On: 2011-09-09 12:49:31.802366 Event: Caller Handler Ready
+On: 2011-09-09 12:49:36.809543 Event: CALL START
+On: 2011-09-09 12:49:36.809603 Event: Make a call to: 076145875681
+On: 2011-09-09 12:49:40.460699 Event: Call Connecting
+On: 2011-09-09 12:49:40.460753 Event: 200
+On: 2011-09-09 12:49:40.462290 Event: Terminate
+On: 2011-09-09 12:49:40.462345 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:49:46.198801 ------------------
+On: 2011-09-09 12:49:46.219626 Event: try to Connect to Controller
+On: 2011-09-09 12:49:47.486204 Event: init state
+On: 2011-09-09 12:49:47.486444 Event: Register Account to SIP server
+On: 2011-09-09 12:49:47.486859 Event: 100
+On: 2011-09-09 12:49:47.486941 Event: Caller Handler Ready
+On: 2011-09-09 12:49:52.491671 Event: CALL START
+On: 2011-09-09 12:49:52.491731 Event: Make a call to: 076120397898
+On: 2011-09-09 12:49:52.569288 Event: Call Connecting
+On: 2011-09-09 12:49:52.569338 Event: 200
+On: 2011-09-09 12:49:52.569742 Event: Terminate
+On: 2011-09-09 12:49:52.569777 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:58:20.174197 ------------------
+On: 2011-09-09 12:58:20.195014 Event: try to Connect to Controller
+On: 2011-09-09 12:58:21.458654 Event: init state
+On: 2011-09-09 12:58:21.458892 Event: Register Account to SIP server
+On: 2011-09-09 12:58:21.459311 Event: 100
+On: 2011-09-09 12:58:21.459398 Event: Caller Handler Ready
+On: 2011-09-09 12:58:26.472479 Event: CALL START
+On: 2011-09-09 12:58:26.472535 Event: Make a call to: 015252423662
+On: 2011-09-09 12:58:37.114342 Event: Call Connecting
+On: 2011-09-09 12:58:37.114393 Event: 200
+On: 2011-09-09 12:58:37.117854 Event: Terminate
+On: 2011-09-09 12:58:37.117915 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:58:42.916843 ------------------
+On: 2011-09-09 12:58:42.937147 Event: try to Connect to Controller
+On: 2011-09-09 12:58:44.132837 Event: init state
+On: 2011-09-09 12:58:44.133066 Event: Register Account to SIP server
+On: 2011-09-09 12:58:44.133523 Event: 100
+On: 2011-09-09 12:58:44.133611 Event: Caller Handler Ready
+On: 2011-09-09 12:58:49.138793 Event: CALL START
+On: 2011-09-09 12:58:49.138850 Event: Make a call to: 017678038038
+On: 2011-09-09 12:58:59.126113 Event: Call Connecting
+On: 2011-09-09 12:58:59.126165 Event: 200
+On: 2011-09-09 12:58:59.129673 Event: Terminate
+On: 2011-09-09 12:58:59.129736 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:59:04.942801 ------------------
+On: 2011-09-09 12:59:04.990449 Event: try to Connect to Controller
+On: 2011-09-09 12:59:06.152581 Event: init state
+On: 2011-09-09 12:59:06.152824 Event: Register Account to SIP server
+On: 2011-09-09 12:59:06.153236 Event: 100
+On: 2011-09-09 12:59:06.153322 Event: Caller Handler Ready
+On: 2011-09-09 12:59:11.161419 Event: CALL START
+On: 2011-09-09 12:59:11.161474 Event: Make a call to: 015782677224
+On: 2011-09-09 12:59:21.541457 Event: Call Connecting
+On: 2011-09-09 12:59:21.541510 Event: 200
+On: 2011-09-09 12:59:21.545672 Event: Terminate
+On: 2011-09-09 12:59:21.545735 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:59:27.340187 ------------------
+On: 2011-09-09 12:59:27.360782 Event: try to Connect to Controller
+On: 2011-09-09 12:59:28.561500 Event: init state
+On: 2011-09-09 12:59:28.561749 Event: Register Account to SIP server
+On: 2011-09-09 12:59:28.562158 Event: 100
+On: 2011-09-09 12:59:28.562241 Event: Caller Handler Ready
+On: 2011-09-09 12:59:33.576600 Event: CALL START
+On: 2011-09-09 12:59:33.576660 Event: Make a call to: 015128040906
+On: 2011-09-09 12:59:45.569369 Event: Terminate
+On: 2011-09-09 12:59:45.569441 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:04:58.421962 ------------------
+On: 2011-09-09 13:04:58.442647 Event: try to Connect to Controller
+On: 2011-09-09 13:04:59.728794 Event: init state
+On: 2011-09-09 13:04:59.729021 Event: Register Account to SIP server
+On: 2011-09-09 13:04:59.729834 Event: 100
+On: 2011-09-09 13:04:59.729922 Event: Caller Handler Ready
+On: 2011-09-09 13:05:04.740606 Event: CALL START
+On: 2011-09-09 13:05:04.740660 Event: Make a call to: 015128040906
+On: 2011-09-09 13:05:15.030801 Event: Call Connecting
+On: 2011-09-09 13:05:15.030851 Event: 200
+On: 2011-09-09 13:05:15.033546 Event: Terminate
+On: 2011-09-09 13:05:15.033606 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:05:26.648660 ------------------
+On: 2011-09-09 13:05:26.669361 Event: try to Connect to Controller
+On: 2011-09-09 13:05:27.985769 Event: init state
+On: 2011-09-09 13:05:27.986002 Event: Register Account to SIP server
+On: 2011-09-09 13:05:27.986407 Event: 100
+On: 2011-09-09 13:05:27.986491 Event: Caller Handler Ready
+On: 2011-09-09 13:05:32.996493 Event: CALL START
+On: 2011-09-09 13:05:32.996545 Event: Make a call to: 017678038038
+On: 2011-09-09 13:05:42.643592 Event: Call Connecting
+On: 2011-09-09 13:05:42.643644 Event: 200
+On: 2011-09-09 13:05:42.647437 Event: Terminate
+On: 2011-09-09 13:05:42.647501 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:05:48.327361 ------------------
+On: 2011-09-09 13:05:48.348139 Event: try to Connect to Controller
+On: 2011-09-09 13:05:49.660344 Event: init state
+On: 2011-09-09 13:05:49.660579 Event: Register Account to SIP server
+On: 2011-09-09 13:05:49.661345 Event: 100
+On: 2011-09-09 13:05:49.663653 Event: Caller Handler Ready
+On: 2011-09-09 13:05:54.672639 Event: CALL START
+On: 2011-09-09 13:05:54.672694 Event: Make a call to: 015252423662
+On: 2011-09-09 13:06:05.667086 Event: Call Connecting
+On: 2011-09-09 13:06:05.667136 Event: 200
+On: 2011-09-09 13:06:05.671226 Event: Terminate
+On: 2011-09-09 13:06:05.671290 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:06:11.405119 ------------------
+On: 2011-09-09 13:06:11.425872 Event: try to Connect to Controller
+On: 2011-09-09 13:06:12.683847 Event: init state
+On: 2011-09-09 13:06:12.684074 Event: Register Account to SIP server
+On: 2011-09-09 13:06:12.684493 Event: 100
+On: 2011-09-09 13:06:12.684578 Event: Caller Handler Ready
+On: 2011-09-09 13:06:17.696611 Event: CALL START
+On: 2011-09-09 13:06:17.696665 Event: Make a call to: 015782677224
+On: 2011-09-09 13:06:28.728114 Event: Call Connecting
+On: 2011-09-09 13:06:28.728164 Event: 200
+On: 2011-09-09 13:06:28.732045 Event: Terminate
+On: 2011-09-09 13:06:28.732110 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:06:34.452717 ------------------
+On: 2011-09-09 13:06:34.474895 Event: try to Connect to Controller
+On: 2011-09-09 13:06:35.745335 Event: init state
+On: 2011-09-09 13:06:35.745603 Event: Register Account to SIP server
+On: 2011-09-09 13:06:35.746018 Event: 100
+On: 2011-09-09 13:06:35.746104 Event: Caller Handler Ready
+On: 2011-09-09 13:06:40.760614 Event: CALL START
+On: 2011-09-09 13:06:40.760671 Event: Make a call to: 015128040906
+On: 2011-09-09 13:06:50.907716 Event: Call Connecting
+On: 2011-09-09 13:06:50.907768 Event: 200
+On: 2011-09-09 13:06:50.911592 Event: Terminate
+On: 2011-09-09 13:06:50.911654 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:06:56.605366 ------------------
+On: 2011-09-09 13:06:56.625913 Event: try to Connect to Controller
+On: 2011-09-09 13:06:57.921131 Event: init state
+On: 2011-09-09 13:06:57.921367 Event: Register Account to SIP server
+On: 2011-09-09 13:06:57.921806 Event: 100
+On: 2011-09-09 13:06:57.921892 Event: Caller Handler Ready
+On: 2011-09-09 13:07:02.929420 Event: CALL START
+On: 2011-09-09 13:07:02.929473 Event: Make a call to: 07612034661447
+On: 2011-09-09 13:07:04.508943 Event: Call Connecting
+On: 2011-09-09 13:07:04.508991 Event: 200
+On: 2011-09-09 13:07:04.713844 Event: Terminate
+On: 2011-09-09 13:07:04.713885 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:07:14.452722 ------------------
+On: 2011-09-09 13:07:14.473633 Event: try to Connect to Controller
+On: 2011-09-09 13:07:15.783664 Event: init state
+On: 2011-09-09 13:07:15.784093 Event: Register Account to SIP server
+On: 2011-09-09 13:07:15.784532 Event: 100
+On: 2011-09-09 13:07:15.784617 Event: Caller Handler Ready
+On: 2011-09-09 13:07:20.793868 Event: CALL START
+On: 2011-09-09 13:07:20.793927 Event: Make a call to: 076145875681
+On: 2011-09-09 13:07:24.558896 Event: Call Connecting
+On: 2011-09-09 13:07:24.558946 Event: 200
+On: 2011-09-09 13:07:24.559967 Event: Terminate
+On: 2011-09-09 13:07:24.560005 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:07:30.255299 ------------------
+On: 2011-09-09 13:07:30.275748 Event: try to Connect to Controller
+On: 2011-09-09 13:07:31.584377 Event: init state
+On: 2011-09-09 13:07:31.584611 Event: Register Account to SIP server
+On: 2011-09-09 13:07:31.585019 Event: 100
+On: 2011-09-09 13:07:31.585102 Event: Caller Handler Ready
+On: 2011-09-09 13:07:36.591716 Event: CALL START
+On: 2011-09-09 13:07:36.591776 Event: Make a call to: 076120397898
+On: 2011-09-09 13:07:36.676807 Event: Call Connecting
+On: 2011-09-09 13:07:36.676854 Event: 200
+On: 2011-09-09 13:07:36.677205 Event: Terminate
+On: 2011-09-09 13:07:36.677239 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:38:38.862334 ------------------
+On: 2011-09-09 15:38:38.883937 Event: try to Connect to Controller
+On: 2011-09-09 15:38:40.171851 Event: init state
+On: 2011-09-09 15:38:40.172085 Event: Register Account to SIP server
+On: 2011-09-09 15:38:40.172494 Event: 100
+On: 2011-09-09 15:38:40.172579 Event: Caller Handler Ready
+On: 2011-09-09 15:38:42.178095 Event: Terminate
+On: 2011-09-09 15:38:42.178134 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:39:17.710963 ------------------
+On: 2011-09-09 15:39:17.731386 Event: try to Connect to Controller
+On: 2011-09-09 15:39:19.018300 Event: init state
+On: 2011-09-09 15:39:19.018532 Event: Register Account to SIP server
+On: 2011-09-09 15:39:19.018958 Event: 100
+On: 2011-09-09 15:39:19.019036 Event: Caller Handler Ready
+On: 2011-09-09 15:39:21.025863 Event: Terminate
+On: 2011-09-09 15:39:21.025902 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:41:19.074634 ------------------
+On: 2011-09-09 15:41:19.095189 Event: try to Connect to Controller
+On: 2011-09-09 15:41:20.360841 Event: init state
+On: 2011-09-09 15:41:20.361067 Event: Register Account to SIP server
+On: 2011-09-09 15:41:20.361537 Event: 100
+On: 2011-09-09 15:41:20.361621 Event: Caller Handler Ready
+On: 2011-09-09 15:41:22.370715 Event: Terminate
+On: 2011-09-09 15:41:22.370764 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:42:15.189735 ------------------
+On: 2011-09-09 15:42:15.210301 Event: try to Connect to Controller
+On: 2011-09-09 15:42:16.404871 Event: init state
+On: 2011-09-09 15:42:16.405539 Event: Register Account to SIP server
+On: 2011-09-09 15:42:16.405967 Event: 100
+On: 2011-09-09 15:42:16.406055 Event: Caller Handler Ready
+On: 2011-09-09 15:42:18.414642 Event: Terminate
+On: 2011-09-09 15:42:18.414681 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:43:05.543327 ------------------
+On: 2011-09-09 15:43:05.564248 Event: try to Connect to Controller
+On: 2011-09-09 15:43:06.842160 Event: init state
+On: 2011-09-09 15:43:06.842401 Event: Register Account to SIP server
+On: 2011-09-09 15:43:06.842824 Event: 100
+On: 2011-09-09 15:43:06.842905 Event: Caller Handler Ready
+On: 2011-09-09 15:43:08.853668 Event: Terminate
+On: 2011-09-09 15:43:08.853708 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:44:22.249976 ------------------
+On: 2011-09-09 15:44:22.270438 Event: try to Connect to Controller
+On: 2011-09-09 15:44:23.538514 Event: init state
+On: 2011-09-09 15:44:23.538769 Event: Register Account to SIP server
+On: 2011-09-09 15:44:23.539189 Event: 100
+On: 2011-09-09 15:44:23.539271 Event: Caller Handler Ready
+On: 2011-09-09 15:44:25.545562 Event: Terminate
+On: 2011-09-09 15:44:25.545604 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:44:53.336432 ------------------
+On: 2011-09-09 15:44:53.356993 Event: try to Connect to Controller
+On: 2011-09-09 15:44:54.551974 Event: init state
+On: 2011-09-09 15:44:54.552203 Event: Register Account to SIP server
+On: 2011-09-09 15:44:54.552621 Event: 100
+On: 2011-09-09 15:44:54.552706 Event: Caller Handler Ready
+On: 2011-09-09 15:44:56.562051 Event: Terminate
+On: 2011-09-09 15:44:56.562100 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:46:14.749046 ------------------
+On: 2011-09-09 15:46:14.770803 Event: try to Connect to Controller
+On: 2011-09-09 15:46:15.974206 Event: init state
+On: 2011-09-09 15:46:15.974433 Event: Register Account to SIP server
+On: 2011-09-09 15:46:15.974854 Event: 100
+On: 2011-09-09 15:46:15.974936 Event: Caller Handler Ready
+On: 2011-09-09 15:46:17.981376 Event: Terminate
+On: 2011-09-09 15:46:17.981446 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:47:37.228684 ------------------
+On: 2011-09-09 15:47:37.249277 Event: try to Connect to Controller
+On: 2011-09-09 15:47:38.525094 Event: init state
+On: 2011-09-09 15:47:38.525330 Event: Register Account to SIP server
+On: 2011-09-09 15:47:38.525783 Event: 100
+On: 2011-09-09 15:47:38.525871 Event: Caller Handler Ready
+On: 2011-09-09 15:47:40.534503 Event: Terminate
+On: 2011-09-09 15:47:40.534550 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:25:12.215770 ------------------
+On: 2011-09-09 16:25:12.236503 Event: try to Connect to Controller
+On: 2011-09-09 16:25:13.507069 Event: init state
+On: 2011-09-09 16:25:13.507301 Event: Register Account to SIP server
+On: 2011-09-09 16:25:13.507719 Event: 100
+On: 2011-09-09 16:25:13.507800 Event: Caller Handler Ready
+On: 2011-09-09 16:25:18.516795 Event: CALL START
+On: 2011-09-09 16:25:18.516851 Event: Make a call to: 017678038038
+On: 2011-09-09 16:25:45.514445 Event: Terminate
+On: 2011-09-09 16:25:45.514489 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:25:51.281243 ------------------
+On: 2011-09-09 16:25:51.302095 Event: try to Connect to Controller
+On: 2011-09-09 16:25:52.533635 Event: init state
+On: 2011-09-09 16:25:52.533906 Event: Register Account to SIP server
+On: 2011-09-09 16:25:52.534322 Event: 100
+On: 2011-09-09 16:25:52.534406 Event: Caller Handler Ready
+On: 2011-09-09 16:25:57.541638 Event: CALL START
+On: 2011-09-09 16:25:57.541699 Event: Make a call to: 015252423662
+On: 2011-09-09 16:26:24.539587 Event: Terminate
+On: 2011-09-09 16:26:24.539627 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:26:30.307947 ------------------
+On: 2011-09-09 16:26:30.329095 Event: try to Connect to Controller
+On: 2011-09-09 16:26:31.557342 Event: init state
+On: 2011-09-09 16:26:31.557574 Event: Register Account to SIP server
+On: 2011-09-09 16:26:31.558034 Event: 100
+On: 2011-09-09 16:26:31.558122 Event: Caller Handler Ready
+On: 2011-09-09 16:26:36.565637 Event: CALL START
+On: 2011-09-09 16:26:36.565699 Event: Make a call to: 015782677224
+On: 2011-09-09 16:26:46.616524 Event: Call Connecting
+On: 2011-09-09 16:26:46.616576 Event: 200
+On: 2011-09-09 16:26:46.620666 Event: Terminate
+On: 2011-09-09 16:26:46.620732 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:26:52.259958 ------------------
+On: 2011-09-09 16:26:52.280364 Event: try to Connect to Controller
+On: 2011-09-09 16:26:53.634030 Event: init state
+On: 2011-09-09 16:26:53.634261 Event: Register Account to SIP server
+On: 2011-09-09 16:26:53.634680 Event: 100
+On: 2011-09-09 16:26:53.634766 Event: Caller Handler Ready
+On: 2011-09-09 16:26:58.641649 Event: CALL START
+On: 2011-09-09 16:26:58.641713 Event: Make a call to: 015128040906
+On: 2011-09-09 16:27:25.606837 Event: Call Connecting
+On: 2011-09-09 16:27:25.606888 Event: 200
+On: 2011-09-09 16:27:25.639857 Event: Terminate
+On: 2011-09-09 16:27:25.639901 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:27:31.408855 ------------------
+On: 2011-09-09 16:27:31.429888 Event: try to Connect to Controller
+On: 2011-09-09 16:27:32.659182 Event: init state
+On: 2011-09-09 16:27:32.659415 Event: Register Account to SIP server
+On: 2011-09-09 16:27:32.660211 Event: 100
+On: 2011-09-09 16:27:32.660293 Event: Caller Handler Ready
+On: 2011-09-09 16:27:34.670023 Event: Terminate
+On: 2011-09-09 16:27:34.670079 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:27:42.491745 ------------------
+On: 2011-09-09 16:27:42.512376 Event: try to Connect to Controller
+On: 2011-09-09 16:27:43.865970 Event: init state
+On: 2011-09-09 16:27:43.866200 Event: Register Account to SIP server
+On: 2011-09-09 16:27:43.866626 Event: 100
+On: 2011-09-09 16:27:43.866712 Event: Caller Handler Ready
+On: 2011-09-09 16:27:48.889806 Event: CALL START
+On: 2011-09-09 16:27:48.889866 Event: Make a call to: 076145875681
+On: 2011-09-09 16:27:55.021303 Event: Call Connecting
+On: 2011-09-09 16:27:55.021355 Event: 200
+On: 2011-09-09 16:27:55.022924 Event: Terminate
+On: 2011-09-09 16:27:55.022977 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:28:00.672211 ------------------
+On: 2011-09-09 16:28:00.692884 Event: try to Connect to Controller
+On: 2011-09-09 16:28:02.044754 Event: init state
+On: 2011-09-09 16:28:02.044982 Event: Register Account to SIP server
+On: 2011-09-09 16:28:02.045399 Event: 100
+On: 2011-09-09 16:28:02.045484 Event: Caller Handler Ready
+On: 2011-09-09 16:28:07.053669 Event: CALL START
+On: 2011-09-09 16:28:07.053731 Event: Make a call to: 076120397898
+On: 2011-09-09 16:28:07.102375 Event: Call Connecting
+On: 2011-09-09 16:28:07.102424 Event: 200
+On: 2011-09-09 16:28:07.102788 Event: Terminate
+On: 2011-09-09 16:28:07.102824 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:13:08.268235 ------------------
+On: 2011-09-09 21:13:08.288873 Event: try to Connect to Controller
+On: 2011-09-09 21:13:09.522915 Event: init state
+On: 2011-09-09 21:13:09.523144 Event: Register Account to SIP server
+On: 2011-09-09 21:13:09.523552 Event: 100
+On: 2011-09-09 21:13:09.523632 Event: Caller Handler Ready
+On: 2011-09-09 21:13:13.533965 Event: Terminate
+On: 2011-09-09 21:13:13.534002 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:14:01.155335 ------------------
+On: 2011-09-09 21:14:01.176101 Event: try to Connect to Controller
+On: 2011-09-09 21:14:02.425716 Event: init state
+On: 2011-09-09 21:14:02.426285 Event: Register Account to SIP server
+On: 2011-09-09 21:14:02.427064 Event: 100
+On: 2011-09-09 21:14:02.427144 Event: Caller Handler Ready
+On: 2011-09-09 21:14:09.445645 Event: CALL START
+On: 2011-09-09 21:14:09.445712 Event: Make a call to: 07612034661447
+On: 2011-09-09 21:14:11.160668 Event: Call Connecting
+On: 2011-09-09 21:14:11.160719 Event: 200
+On: 2011-09-09 21:14:11.370512 Event: Terminate
+On: 2011-09-09 21:14:11.370573 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:14:57.856204 ------------------
+On: 2011-09-09 21:14:57.877032 Event: try to Connect to Controller
+On: 2011-09-09 21:14:59.130334 Event: init state
+On: 2011-09-09 21:14:59.130571 Event: Register Account to SIP server
+On: 2011-09-09 21:14:59.130983 Event: 100
+On: 2011-09-09 21:14:59.131066 Event: Caller Handler Ready
+On: 2011-09-09 21:15:06.148501 Event: CALL START
+On: 2011-09-09 21:15:06.148559 Event: Make a call to: 07612034661447
+On: 2011-09-09 21:15:08.884062 Event: Call Connecting
+On: 2011-09-09 21:15:08.884111 Event: 200
+On: 2011-09-09 21:15:09.068798 Event: Terminate
+On: 2011-09-09 21:15:09.068860 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:31:38.620492 ------------------
+On: 2011-09-11 20:31:38.632623 Event: try to Connect to Controller
+On: 2011-09-11 20:31:40.464033 Event: init state
+On: 2011-09-11 20:31:40.464251 Event: Register Account to SIP server
+On: 2011-09-11 20:31:40.464792 Event: 100
+On: 2011-09-11 20:31:40.464881 Event: Caller Handler Ready
+On: 2011-09-11 20:31:45.474711 Event: CALL START
+On: 2011-09-11 20:31:45.474748 Event: Make a call to: 07612034661447
+On: 2011-09-11 20:31:47.129864 Event: Call Connecting
+On: 2011-09-11 20:31:47.129892 Event: 200
+On: 2011-09-11 20:31:47.319009 Event: Terminate
+On: 2011-09-11 20:31:47.319032 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:32:16.758132 ------------------
+On: 2011-09-11 20:32:16.771535 Event: try to Connect to Controller
+On: 2011-09-11 20:32:18.614209 Event: init state
+On: 2011-09-11 20:32:18.614484 Event: Register Account to SIP server
+On: 2011-09-11 20:32:18.615112 Event: 100
+On: 2011-09-11 20:32:18.615474 Event: Caller Handler Ready
+On: 2011-09-11 20:32:23.622124 Event: CALL START
+On: 2011-09-11 20:32:23.622161 Event: Make a call to: 07612034661447
+On: 2011-09-11 20:32:25.982548 Event: Call Connecting
+On: 2011-09-11 20:32:25.982573 Event: 200
+On: 2011-09-11 20:32:26.154985 Event: Terminate
+On: 2011-09-11 20:32:26.155008 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:35:28.863104 ------------------
+On: 2011-09-11 20:35:28.872477 Event: try to Connect to Controller
+On: 2011-09-11 20:35:30.730348 Event: init state
+On: 2011-09-11 20:35:30.730434 Event: Register Account to SIP server
+On: 2011-09-11 20:35:30.731088 Event: 100
+On: 2011-09-11 20:35:30.731174 Event: Caller Handler Ready
+On: 2011-09-11 20:35:35.739543 Event: CALL START
+On: 2011-09-11 20:35:35.739565 Event: Make a call to: 07612034661447
+On: 2011-09-11 20:35:37.777479 Event: Call Connecting
+On: 2011-09-11 20:35:37.777509 Event: 200
+On: 2011-09-11 20:35:37.983043 Event: Terminate
+On: 2011-09-11 20:35:37.983113 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:41:52.825519 ------------------
+On: 2011-09-11 20:41:52.834709 Event: try to Connect to Controller
+On: 2011-09-11 20:41:54.694312 Event: init state
+On: 2011-09-11 20:41:54.694375 Event: Register Account to SIP server
+On: 2011-09-11 20:41:54.694567 Event: 100
+On: 2011-09-11 20:41:54.694592 Event: Caller Handler Ready
+On: 2011-09-11 20:41:59.701294 Event: CALL START
+On: 2011-09-11 20:41:59.701322 Event: Make a call to: 07612034661447
+On: 2011-09-11 20:42:01.944332 Event: Call Connecting
+On: 2011-09-11 20:42:01.944356 Event: 200
+On: 2011-09-11 20:42:02.139085 Event: Terminate
+On: 2011-09-11 20:42:02.139158 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:49:36.841179 ------------------
+On: 2011-09-11 20:49:36.850528 Event: try to Connect to Controller
+On: 2011-09-11 20:49:38.704760 Event: init state
+On: 2011-09-11 20:49:38.705002 Event: Register Account to SIP server
+On: 2011-09-11 20:49:38.705560 Event: 100
+On: 2011-09-11 20:49:38.705644 Event: Caller Handler Ready
+On: 2011-09-11 20:49:43.715508 Event: CALL START
+On: 2011-09-11 20:49:43.715537 Event: Make a call to: 07612034661447
+On: 2011-09-11 20:49:46.370226 Event: Call Connecting
+On: 2011-09-11 20:49:46.370251 Event: 200
+On: 2011-09-11 20:49:46.567133 Event: Terminate
+On: 2011-09-11 20:49:46.567208 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:51:46.143924 ------------------
+On: 2011-09-11 20:51:46.155918 Event: try to Connect to Controller
+On: 2011-09-11 20:51:47.994138 Event: init state
+On: 2011-09-11 20:51:47.994359 Event: Register Account to SIP server
+On: 2011-09-11 20:51:47.994969 Event: 100
+On: 2011-09-11 20:51:47.995065 Event: Caller Handler Ready
+On: 2011-09-11 20:51:53.004362 Event: CALL START
+On: 2011-09-11 20:51:53.004397 Event: Make a call to: 07612034661447
+On: 2011-09-11 20:51:54.654139 Event: Call Connecting
+On: 2011-09-11 20:51:54.654169 Event: 200
+On: 2011-09-11 20:51:54.838952 Event: Terminate
+On: 2011-09-11 20:51:54.838974 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:34:10.358228 ------------------
+On: 2011-09-12 14:34:10.370259 Event: try to Connect to Controller
+On: 2011-09-12 14:34:12.209200 Event: init state
+On: 2011-09-12 14:34:12.209471 Event: Register Account to SIP server
+On: 2011-09-12 14:34:12.210041 Event: 100
+On: 2011-09-12 14:34:12.210122 Event: Caller Handler Ready
+On: 2011-09-12 14:34:17.219122 Event: CALL START
+On: 2011-09-12 14:34:17.219153 Event: Make a call to: 07612034661447
+On: 2011-09-12 14:34:19.532502 Event: Call Connecting
+On: 2011-09-12 14:34:19.532527 Event: 200
+On: 2011-09-12 14:34:19.732085 Event: Terminate
+On: 2011-09-12 14:34:19.732284 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:34:24.875847 ------------------
+On: 2011-09-12 14:34:24.887778 Event: try to Connect to Controller
+On: 2011-09-12 14:34:26.751537 Event: init state
+On: 2011-09-12 14:34:26.752174 Event: Register Account to SIP server
+On: 2011-09-12 14:34:26.752987 Event: 100
+On: 2011-09-12 14:34:26.753110 Event: Caller Handler Ready
+On: 2011-09-12 14:34:31.759824 Event: CALL START
+On: 2011-09-12 14:34:31.759855 Event: Make a call to: 07612034661447
+On: 2011-09-12 14:34:33.689959 Event: Call Connecting
+On: 2011-09-12 14:34:33.689982 Event: 200
+On: 2011-09-12 14:34:33.872000 Event: Terminate
+On: 2011-09-12 14:34:33.872026 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:36:28.841016 ------------------
+On: 2011-09-12 14:36:28.850711 Event: try to Connect to Controller
+On: 2011-09-12 14:36:30.700260 Event: init state
+On: 2011-09-12 14:36:30.700497 Event: Register Account to SIP server
+On: 2011-09-12 14:36:30.701070 Event: 100
+On: 2011-09-12 14:36:30.701151 Event: Caller Handler Ready
+On: 2011-09-12 14:36:35.710868 Event: CALL START
+On: 2011-09-12 14:36:35.710905 Event: Make a call to: 07612034661447
+On: 2011-09-12 14:36:38.420487 Event: Call Connecting
+On: 2011-09-12 14:36:38.420516 Event: 200
+On: 2011-09-12 14:36:38.611979 Event: Terminate
+On: 2011-09-12 14:36:38.612000 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:56:53.315102 ------------------
+On: 2011-09-12 14:56:53.327150 Event: try to Connect to Controller
+On: 2011-09-12 14:56:55.173427 Event: init state
+On: 2011-09-12 14:56:55.173493 Event: Register Account to SIP server
+On: 2011-09-12 14:56:55.173875 Event: 100
+On: 2011-09-12 14:56:55.173974 Event: Caller Handler Ready
+On: 2011-09-12 14:57:00.178290 Event: CALL START
+On: 2011-09-12 14:57:00.178321 Event: Make a call to: 07612034661447
+On: 2011-09-12 14:57:01.978067 Event: Call Connecting
+On: 2011-09-12 14:57:01.978098 Event: 200
+On: 2011-09-12 14:57:02.143968 Event: Terminate
+On: 2011-09-12 14:57:02.143990 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:57:07.304090 ------------------
+On: 2011-09-12 14:57:07.313626 Event: try to Connect to Controller
+On: 2011-09-12 14:57:09.160267 Event: init state
+On: 2011-09-12 14:57:09.160363 Event: Register Account to SIP server
+On: 2011-09-12 14:57:09.160894 Event: 100
+On: 2011-09-12 14:57:09.160985 Event: Caller Handler Ready
+On: 2011-09-12 14:57:14.165557 Event: CALL START
+On: 2011-09-12 14:57:14.165591 Event: Make a call to: 07612034661447
+On: 2011-09-12 14:57:16.319919 Event: Call Connecting
+On: 2011-09-12 14:57:16.319942 Event: 200
+On: 2011-09-12 14:57:16.500050 Event: Terminate
+On: 2011-09-12 14:57:16.500123 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:01:21.471015 ------------------
+On: 2011-09-12 15:01:21.480603 Event: try to Connect to Controller
+On: 2011-09-12 15:01:23.328546 Event: init state
+On: 2011-09-12 15:01:23.328605 Event: Register Account to SIP server
+On: 2011-09-12 15:01:23.328778 Event: 100
+On: 2011-09-12 15:01:23.328799 Event: Caller Handler Ready
+On: 2011-09-12 15:01:28.334786 Event: CALL START
+On: 2011-09-12 15:01:28.334829 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:01:30.283420 Event: Call Connecting
+On: 2011-09-12 15:01:30.283445 Event: 200
+On: 2011-09-12 15:01:30.484037 Event: Terminate
+On: 2011-09-12 15:01:30.484060 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:14:54.052570 ------------------
+On: 2011-09-12 15:14:54.062574 Event: try to Connect to Controller
+On: 2011-09-12 15:14:55.916844 Event: init state
+On: 2011-09-12 15:14:55.917108 Event: Register Account to SIP server
+On: 2011-09-12 15:14:55.917651 Event: 100
+On: 2011-09-12 15:14:55.917731 Event: Caller Handler Ready
+On: 2011-09-12 15:15:00.927172 Event: CALL START
+On: 2011-09-12 15:15:00.927199 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:15:03.581700 Event: Call Connecting
+On: 2011-09-12 15:15:03.581730 Event: 200
+On: 2011-09-12 15:15:03.759988 Event: Terminate
+On: 2011-09-12 15:15:03.760011 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:15:08.924242 ------------------
+On: 2011-09-12 15:15:08.936389 Event: try to Connect to Controller
+On: 2011-09-12 15:15:10.772104 Event: init state
+On: 2011-09-12 15:15:10.772197 Event: Register Account to SIP server
+On: 2011-09-12 15:15:10.772740 Event: 100
+On: 2011-09-12 15:15:10.772826 Event: Caller Handler Ready
+On: 2011-09-12 15:15:15.779608 Event: CALL START
+On: 2011-09-12 15:15:15.779638 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:15:17.687477 Event: Call Connecting
+On: 2011-09-12 15:15:17.687507 Event: 200
+On: 2011-09-12 15:15:17.860030 Event: Terminate
+On: 2011-09-12 15:15:17.860052 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:15:23.003830 ------------------
+On: 2011-09-12 15:15:23.013378 Event: try to Connect to Controller
+On: 2011-09-12 15:15:24.874971 Event: init state
+On: 2011-09-12 15:15:24.875035 Event: Register Account to SIP server
+On: 2011-09-12 15:15:24.875216 Event: 100
+On: 2011-09-12 15:15:24.875238 Event: Caller Handler Ready
+On: 2011-09-12 15:15:29.879822 Event: CALL START
+On: 2011-09-12 15:15:29.879854 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:15:31.816878 Event: Call Connecting
+On: 2011-09-12 15:15:31.816901 Event: 200
+On: 2011-09-12 15:15:31.984245 Event: Terminate
+On: 2011-09-12 15:15:31.984315 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:15:37.156968 ------------------
+On: 2011-09-12 15:15:37.169358 Event: try to Connect to Controller
+On: 2011-09-12 15:15:39.007183 Event: init state
+On: 2011-09-12 15:15:39.007450 Event: Register Account to SIP server
+On: 2011-09-12 15:15:39.008244 Event: 100
+On: 2011-09-12 15:15:39.008368 Event: Caller Handler Ready
+On: 2011-09-12 15:15:44.017479 Event: CALL START
+On: 2011-09-12 15:15:44.017507 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:15:45.920732 Event: Call Connecting
+On: 2011-09-12 15:15:45.920761 Event: 200
+On: 2011-09-12 15:15:46.128003 Event: Terminate
+On: 2011-09-12 15:15:46.128027 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:19:33.653595 ------------------
+On: 2011-09-12 15:19:33.664561 Event: try to Connect to Controller
+On: 2011-09-12 15:19:35.519026 Event: init state
+On: 2011-09-12 15:19:35.519100 Event: Register Account to SIP server
+On: 2011-09-12 15:19:35.519277 Event: 100
+On: 2011-09-12 15:19:35.519298 Event: Caller Handler Ready
+On: 2011-09-12 15:19:40.527828 Event: CALL START
+On: 2011-09-12 15:19:40.527861 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:19:42.467162 Event: Call Connecting
+On: 2011-09-12 15:19:42.467190 Event: 200
+On: 2011-09-12 15:19:42.659981 Event: Terminate
+On: 2011-09-12 15:19:42.660003 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:26:13.158946 ------------------
+On: 2011-09-12 15:26:13.169605 Event: try to Connect to Controller
+On: 2011-09-12 15:26:15.012743 Event: init state
+On: 2011-09-12 15:26:15.012898 Event: Register Account to SIP server
+On: 2011-09-12 15:26:15.013470 Event: 100
+On: 2011-09-12 15:26:15.013550 Event: Caller Handler Ready
+On: 2011-09-12 15:26:20.020639 Event: CALL START
+On: 2011-09-12 15:26:20.020678 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:26:22.689378 Event: Call Connecting
+On: 2011-09-12 15:26:22.689401 Event: 200
+On: 2011-09-12 15:26:22.844134 Event: Terminate
+On: 2011-09-12 15:26:22.844212 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:27:36.915550 ------------------
+On: 2011-09-12 15:27:36.926592 Event: try to Connect to Controller
+On: 2011-09-12 15:27:38.783113 Event: init state
+On: 2011-09-12 15:27:38.783254 Event: Register Account to SIP server
+On: 2011-09-12 15:27:38.783433 Event: 100
+On: 2011-09-12 15:27:38.783455 Event: Caller Handler Ready
+On: 2011-09-12 15:27:43.789354 Event: CALL START
+On: 2011-09-12 15:27:43.789382 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:27:46.188477 Event: Call Connecting
+On: 2011-09-12 15:27:46.188502 Event: 200
+On: 2011-09-12 15:27:46.384136 Event: Terminate
+On: 2011-09-12 15:27:46.384205 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:28:25.230275 ------------------
+On: 2011-09-12 15:28:25.241943 Event: try to Connect to Controller
+On: 2011-09-12 15:28:27.084923 Event: init state
+On: 2011-09-12 15:28:27.084991 Event: Register Account to SIP server
+On: 2011-09-12 15:28:27.085181 Event: 100
+On: 2011-09-12 15:28:27.085202 Event: Caller Handler Ready
+On: 2011-09-12 15:28:32.092510 Event: CALL START
+On: 2011-09-12 15:28:32.092544 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:28:34.505932 Event: Call Connecting
+On: 2011-09-12 15:28:34.505956 Event: 200
+On: 2011-09-12 15:28:34.667985 Event: Terminate
+On: 2011-09-12 15:28:34.668005 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:32:13.574313 ------------------
+On: 2011-09-12 15:32:13.584311 Event: try to Connect to Controller
+On: 2011-09-12 15:32:15.444121 Event: init state
+On: 2011-09-12 15:32:15.444193 Event: Register Account to SIP server
+On: 2011-09-12 15:32:15.444398 Event: 100
+On: 2011-09-12 15:32:15.444421 Event: Caller Handler Ready
+On: 2011-09-12 15:32:20.451411 Event: CALL START
+On: 2011-09-12 15:32:20.451444 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:32:23.003867 Event: Call Connecting
+On: 2011-09-12 15:32:23.003897 Event: 200
+On: 2011-09-12 15:32:23.208271 Event: Terminate
+On: 2011-09-12 15:32:23.208340 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:35:08.242273 ------------------
+On: 2011-09-12 15:35:08.251511 Event: try to Connect to Controller
+On: 2011-09-12 15:35:10.104974 Event: init state
+On: 2011-09-12 15:35:10.105144 Event: Register Account to SIP server
+On: 2011-09-12 15:35:10.105679 Event: 100
+On: 2011-09-12 15:35:10.105777 Event: Caller Handler Ready
+On: 2011-09-12 15:35:15.112442 Event: CALL START
+On: 2011-09-12 15:35:15.112473 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:35:16.953734 Event: Call Connecting
+On: 2011-09-12 15:35:16.953765 Event: 200
+On: 2011-09-12 15:35:17.147994 Event: Terminate
+On: 2011-09-12 15:35:17.148022 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:44:47.472808 ------------------
+On: 2011-09-12 15:44:47.482661 Event: try to Connect to Controller
+On: 2011-09-12 15:44:49.310145 Event: init state
+On: 2011-09-12 15:44:49.310209 Event: Register Account to SIP server
+On: 2011-09-12 15:44:49.310388 Event: 100
+On: 2011-09-12 15:44:49.310411 Event: Caller Handler Ready
+On: 2011-09-12 15:44:54.315303 Event: CALL START
+On: 2011-09-12 15:44:54.315337 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:44:56.030636 Event: Call Connecting
+On: 2011-09-12 15:44:56.030669 Event: 200
+On: 2011-09-12 15:44:56.208183 Event: Terminate
+On: 2011-09-12 15:44:56.208236 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:45:56.485934 ------------------
+On: 2011-09-12 15:45:56.496217 Event: try to Connect to Controller
+On: 2011-09-12 15:45:58.344262 Event: init state
+On: 2011-09-12 15:45:58.344329 Event: Register Account to SIP server
+On: 2011-09-12 15:45:58.344516 Event: 100
+On: 2011-09-12 15:45:58.344539 Event: Caller Handler Ready
+On: 2011-09-12 15:46:03.351495 Event: CALL START
+On: 2011-09-12 15:46:03.351524 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:46:05.452149 Event: Call Connecting
+On: 2011-09-12 15:46:05.452177 Event: 200
+On: 2011-09-12 15:46:05.651996 Event: Terminate
+On: 2011-09-12 15:46:05.652019 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:53:45.533196 ------------------
+On: 2011-09-12 15:53:45.542256 Event: try to Connect to Controller
+On: 2011-09-12 15:53:45.544004 Event: Cant connect to Controller
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:54:15.171986 ------------------
+On: 2011-09-12 15:54:15.185708 Event: try to Connect to Controller
+On: 2011-09-12 15:54:15.185978 Event: Cant connect to Controller
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:55:01.406723 ------------------
+On: 2011-09-12 15:55:01.416572 Event: try to Connect to Controller
+On: 2011-09-12 15:55:03.253255 Event: init state
+On: 2011-09-12 15:55:03.253714 Event: Register Account to SIP server
+On: 2011-09-12 15:55:03.254463 Event: 100
+On: 2011-09-12 15:55:03.254567 Event: Caller Handler Ready
+On: 2011-09-12 15:55:08.263823 Event: CALL START
+On: 2011-09-12 15:55:08.263849 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:55:10.373616 Event: Call Connecting
+On: 2011-09-12 15:55:10.373651 Event: 200
+On: 2011-09-12 15:55:10.551999 Event: Terminate
+On: 2011-09-12 15:55:10.552024 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:57:53.345802 ------------------
+On: 2011-09-12 15:57:53.354844 Event: try to Connect to Controller
+On: 2011-09-12 15:57:55.191171 Event: init state
+On: 2011-09-12 15:57:55.191408 Event: Register Account to SIP server
+On: 2011-09-12 15:57:55.192092 Event: 100
+On: 2011-09-12 15:57:55.192174 Event: Caller Handler Ready
+On: 2011-09-12 15:58:00.199824 Event: CALL START
+On: 2011-09-12 15:58:00.199859 Event: Make a call to: 07612034661447
+On: 2011-09-12 15:58:02.463100 Event: Call Connecting
+On: 2011-09-12 15:58:02.463123 Event: 200
+On: 2011-09-12 15:58:02.636011 Event: Terminate
+On: 2011-09-12 15:58:02.636034 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:02:31.744404 ------------------
+On: 2011-09-12 16:02:31.757562 Event: try to Connect to Controller
+On: 2011-09-12 16:02:33.598228 Event: init state
+On: 2011-09-12 16:02:33.598337 Event: Register Account to SIP server
+On: 2011-09-12 16:02:33.598618 Event: 100
+On: 2011-09-12 16:02:33.598656 Event: Caller Handler Ready
+On: 2011-09-12 16:02:38.605527 Event: CALL START
+On: 2011-09-12 16:02:38.605559 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:02:41.172649 Event: Call Connecting
+On: 2011-09-12 16:02:41.172681 Event: 200
+On: 2011-09-12 16:02:41.331974 Event: Terminate
+On: 2011-09-12 16:02:41.331996 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:05:09.768340 ------------------
+On: 2011-09-12 16:05:09.786852 Event: try to Connect to Controller
+On: 2011-09-12 16:05:11.597411 Event: init state
+On: 2011-09-12 16:05:11.597738 Event: Register Account to SIP server
+On: 2011-09-12 16:05:11.597962 Event: 100
+On: 2011-09-12 16:05:11.597982 Event: Caller Handler Ready
+On: 2011-09-12 16:05:16.607334 Event: CALL START
+On: 2011-09-12 16:05:16.607366 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:05:19.305495 Event: Call Connecting
+On: 2011-09-12 16:05:19.305520 Event: 200
+On: 2011-09-12 16:05:19.495984 Event: Terminate
+On: 2011-09-12 16:05:19.496006 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:08:29.466710 ------------------
+On: 2011-09-12 16:08:29.479892 Event: try to Connect to Controller
+On: 2011-09-12 16:08:31.332822 Event: init state
+On: 2011-09-12 16:08:31.333042 Event: Register Account to SIP server
+On: 2011-09-12 16:08:31.333582 Event: 100
+On: 2011-09-12 16:08:31.333667 Event: Caller Handler Ready
+On: 2011-09-12 16:08:36.338553 Event: CALL START
+On: 2011-09-12 16:08:36.338584 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:08:39.156621 Event: Call Connecting
+On: 2011-09-12 16:08:39.156650 Event: 200
+On: 2011-09-12 16:08:39.355990 Event: Terminate
+On: 2011-09-12 16:08:39.356017 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:11:32.076701 ------------------
+On: 2011-09-12 16:11:32.086430 Event: try to Connect to Controller
+On: 2011-09-12 16:11:33.948344 Event: init state
+On: 2011-09-12 16:11:33.948458 Event: Register Account to SIP server
+On: 2011-09-12 16:11:33.948687 Event: 100
+On: 2011-09-12 16:11:33.948712 Event: Caller Handler Ready
+On: 2011-09-12 16:11:38.955822 Event: CALL START
+On: 2011-09-12 16:11:38.955861 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:11:41.348589 Event: Call Connecting
+On: 2011-09-12 16:11:41.348614 Event: 200
+On: 2011-09-12 16:11:41.544309 Event: Terminate
+On: 2011-09-12 16:11:41.544344 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:12:11.024130 ------------------
+On: 2011-09-12 16:12:11.033624 Event: try to Connect to Controller
+On: 2011-09-12 16:12:12.899650 Event: init state
+On: 2011-09-12 16:12:12.899953 Event: Register Account to SIP server
+On: 2011-09-12 16:12:12.900555 Event: 100
+On: 2011-09-12 16:12:12.900633 Event: Caller Handler Ready
+On: 2011-09-12 16:12:17.906913 Event: CALL START
+On: 2011-09-12 16:12:17.906945 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:12:20.245703 Event: Call Connecting
+On: 2011-09-12 16:12:20.245731 Event: 200
+On: 2011-09-12 16:12:20.400113 Event: Terminate
+On: 2011-09-12 16:12:20.400186 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:15:14.858841 ------------------
+On: 2011-09-12 16:15:14.867951 Event: try to Connect to Controller
+On: 2011-09-12 16:15:16.718880 Event: init state
+On: 2011-09-12 16:15:16.718945 Event: Register Account to SIP server
+On: 2011-09-12 16:15:16.719129 Event: 100
+On: 2011-09-12 16:15:16.719150 Event: Caller Handler Ready
+On: 2011-09-12 16:15:21.727772 Event: CALL START
+On: 2011-09-12 16:15:21.727819 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:15:23.823271 Event: Call Connecting
+On: 2011-09-12 16:15:23.823295 Event: 200
+On: 2011-09-12 16:15:23.999999 Event: Terminate
+On: 2011-09-12 16:15:24.000026 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:18:24.945352 ------------------
+On: 2011-09-12 16:18:24.956648 Event: try to Connect to Controller
+On: 2011-09-12 16:18:26.806381 Event: init state
+On: 2011-09-12 16:18:26.806452 Event: Register Account to SIP server
+On: 2011-09-12 16:18:26.806683 Event: 100
+On: 2011-09-12 16:18:26.806715 Event: Caller Handler Ready
+On: 2011-09-12 16:18:31.813255 Event: CALL START
+On: 2011-09-12 16:18:31.813289 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:18:34.474552 Event: Call Connecting
+On: 2011-09-12 16:18:34.474574 Event: 200
+On: 2011-09-12 16:18:34.635967 Event: Terminate
+On: 2011-09-12 16:18:34.635990 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:18:58.939581 ------------------
+On: 2011-09-12 16:18:58.951954 Event: try to Connect to Controller
+On: 2011-09-12 16:19:00.794848 Event: init state
+On: 2011-09-12 16:19:00.795022 Event: Register Account to SIP server
+On: 2011-09-12 16:19:00.795476 Event: 100
+On: 2011-09-12 16:19:00.795541 Event: Caller Handler Ready
+On: 2011-09-12 16:19:05.803845 Event: CALL START
+On: 2011-09-12 16:19:05.803882 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:19:07.397927 Event: Call Connecting
+On: 2011-09-12 16:19:07.397956 Event: 200
+On: 2011-09-12 16:19:07.580321 Event: Terminate
+On: 2011-09-12 16:19:07.580341 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:20:40.854417 ------------------
+On: 2011-09-12 16:20:40.865555 Event: try to Connect to Controller
+On: 2011-09-12 16:20:42.723873 Event: init state
+On: 2011-09-12 16:20:42.724140 Event: Register Account to SIP server
+On: 2011-09-12 16:20:42.724682 Event: 100
+On: 2011-09-12 16:20:42.724772 Event: Caller Handler Ready
+On: 2011-09-12 16:20:47.734348 Event: CALL START
+On: 2011-09-12 16:20:47.734373 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:20:49.822528 Event: Call Connecting
+On: 2011-09-12 16:20:49.822557 Event: 200
+On: 2011-09-12 16:20:49.983950 Event: Terminate
+On: 2011-09-12 16:20:49.983971 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:23:21.929556 ------------------
+On: 2011-09-12 16:23:21.938638 Event: try to Connect to Controller
+On: 2011-09-12 16:23:23.770268 Event: init state
+On: 2011-09-12 16:23:23.770497 Event: Register Account to SIP server
+On: 2011-09-12 16:23:23.771039 Event: 100
+On: 2011-09-12 16:23:23.771115 Event: Caller Handler Ready
+On: 2011-09-12 16:23:28.779826 Event: CALL START
+On: 2011-09-12 16:23:28.779861 Event: Make a call to: 07612034661447
+On: 2011-09-12 16:23:31.047703 Event: Call Connecting
+On: 2011-09-12 16:23:31.047731 Event: 200
+On: 2011-09-12 16:23:31.215976 Event: Terminate
+On: 2011-09-12 16:23:31.215998 Event: Goodbye
diff --git a/notFinishedCode/tricode/SIPHandler.py b/notFinishedCode/tricode/SIPHandler.py
new file mode 100755
index 0000000..8802a09
--- /dev/null
+++ b/notFinishedCode/tricode/SIPHandler.py
@@ -0,0 +1,233 @@
+import sys
+import string
+import pjsua as pj
+import ServerClass
+import LogFileClass
+
+from time import sleep
+
+def log_cb(level, str, len):
+ print '\n'
+ print "--------starting Handler--------"
+
+# Receive events from incoming Call
+class Account(pj.AccountCallback):
+
+ def on_incoming_call(self, call):
+ global current_call
+
+ current_call = call
+ call_cb = Calling(current_call)
+ current_call.set_callback(call_cb)
+
+ logger.logEvent(current_call)
+
+ call.answer(200)
+ logger.logEvent("Answer call")
+
+ if current_call <> None:
+ logger.logEvent("Hangup call")
+ call.hangup()
+
+ logger.logEvent('CALL OK')
+
+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")
+ logger.logEvent('200')
+ 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
+
+
+def make_call(uri):
+
+ try:
+
+ cb=Calling()
+ return acc.make_call(uri, cb)
+
+ except pj.Error, e:
+ print "408 " + str(e)
+ logger.logEvent('408')
+ return None
+
+def greeting():
+ global server
+ global status
+ global port
+
+ port = sys.argv[2]
+ server = None
+ status = None
+
+ server = ServerClass.ServerHandler(port)
+ logger.logEvent('try to Connect to Controller')
+ conn = server.openSocket()
+
+ if server.connected == 1:
+ if server.receiveData(30) == 'HELLO HANDLER':
+ server.sendData('HELLO CONTROLLER')
+ status = 'OK'
+ else:
+ status = 'NOT OK'
+ logger.logEvent('Cant connect to Controller')
+ sys.exit(1)
+
+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'
+ num = message[7:]
+
+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
+
+initHandler()
+
+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()
+
+ greeting()
+
+
+ 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:
+
+ if state =='RECEIVER':
+ logger.logEvent(acc.info().reg_status)
+ server.sendData('RECEIVER READY')
+ logger.logEvent('Receiver Handler Ready')
+
+ while 1:
+
+ data = server.receiveData(1)
+
+ if data == 'RECEIVE START':
+ logger.logEvent(data)
+
+ if data == 'TERMINATE CONNECTION':
+ logger.logEvent('Terminate')
+ stop = True
+ break
+
+ elif state =='CALLER':
+ logger.logEvent(acc.info().reg_status)
+ server.sendData('CALLER READY')
+ logger.logEvent('Caller Handler Ready')
+
+ while 1:
+
+ data = server.receiveData(1)
+
+ if data == 'CALL START':
+ 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')
+
+ if data == 'TERMINATE CONNECTION':
+ stop = True
+ logger.logEvent('Terminate')
+ break
+
+ else:
+ logger.logEvent('Unknow Message')
+ server.sendData('Unknow Message')
+ server.closeConnection()
+ sys.exit(0.5)
+
+ else:
+ logger.logEvent("488 Not Acceptable Here")
+ lib.destroy()
+
+ except ValueError:
+ print "401 Unauthorized " + str(e)
+ logger.logEvent("401 Unauthorized ")
+
+logger.logEvent("Goodbye")
+acc.delete()
+lib.destroy()
+server.closeConnection()
+lib = None
+acc = None
+
diff --git a/notFinishedCode/tricode/SSHTunnelBoxClass.py b/notFinishedCode/tricode/SSHTunnelBoxClass.py
new file mode 100755
index 0000000..0447365
--- /dev/null
+++ b/notFinishedCode/tricode/SSHTunnelBoxClass.py
@@ -0,0 +1,45 @@
+#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)
+ #self.__sshTunnel = subprocess.Popen(['ssh','-N', '-L', command, uad], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+ sleep(2)
+ self.__tunnelStarted = 1
+ return 1
+ except Exception, e:
+ print str(e)
+ return 0
+
+ def killTunneling(self):
+ if self.__tunnelStarted == 1:
+ try:
+ self.__sshTunnel.kill()
+ self.__tunnelStarted = 0
+ return 1
+
+ except Exception, e:
+ print str(e)
+ return 0
+
+
diff --git a/notFinishedCode/tricode/SSHTunnelBoxClass.pyc b/notFinishedCode/tricode/SSHTunnelBoxClass.pyc
new file mode 100755
index 0000000..b46482b
--- /dev/null
+++ b/notFinishedCode/tricode/SSHTunnelBoxClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/SSHTunnelClass.py b/notFinishedCode/tricode/SSHTunnelClass.py
new file mode 100755
index 0000000..12bedeb
--- /dev/null
+++ b/notFinishedCode/tricode/SSHTunnelClass.py
@@ -0,0 +1,47 @@
+#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
+
+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)
+ self.__tunnelStarted = 1
+ return 1
+ except Exception, e:
+ print str(e)
+ return 0
+
+ def killTunneling(self):
+ if self.__tunnelStarted == 1:
+ try:
+ self.__sshTunnel.kill()
+ self.__tunnelStarted = 0
+ return 1
+
+ except Exception, e:
+ print str(e)
+ return 0
+
+x = SSHTunneling(50000, 50008, '10.4.58.241', 'lsfks', 'r')
+print x.startTunneling()
+print 'Tunnel started '
+sleep(50)
+print x.killTunneling()
+print 'kill tunnel'
diff --git a/notFinishedCode/tricode/ServerClass.py b/notFinishedCode/tricode/ServerClass.py
new file mode 100755
index 0000000..93c2f8e
--- /dev/null
+++ b/notFinishedCode/tricode/ServerClass.py
@@ -0,0 +1,152 @@
+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/notFinishedCode/tricode/ServerClass.pyc b/notFinishedCode/tricode/ServerClass.pyc
new file mode 100644
index 0000000..5499934
--- /dev/null
+++ b/notFinishedCode/tricode/ServerClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/ServerClassSoftware.py b/notFinishedCode/tricode/ServerClassSoftware.py
new file mode 100755
index 0000000..206411e
--- /dev/null
+++ b/notFinishedCode/tricode/ServerClassSoftware.py
@@ -0,0 +1,162 @@
+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/notFinishedCode/tricode/ServerClassSoftware.pyc b/notFinishedCode/tricode/ServerClassSoftware.pyc
new file mode 100644
index 0000000..f4e022d
--- /dev/null
+++ b/notFinishedCode/tricode/ServerClassSoftware.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/TestProcessLog.log b/notFinishedCode/tricode/TestProcessLog.log
new file mode 100755
index 0000000..6a9f8ad
--- /dev/null
+++ b/notFinishedCode/tricode/TestProcessLog.log
@@ -0,0 +1,1855 @@
+
+
+------------------STARTED THE LOGGING 2011-09-02 12:52:15.812810 ------------------
+On: 2011-09-02 12:52:15.812883 Event: init Caller
+On: 2011-09-02 12:52:15.812903 Event: sip
+On: 2011-09-02 12:52:17.817969 Event: Connected to Caller Handler
+On: 2011-09-02 12:52:17.818675 Event: Caller Handler respond
+On: 2011-09-02 12:52:17.819528 Event: Caller handler : Ready
+On: 2011-09-02 12:52:17.819569 Event: init Receiver
+On: 2011-09-02 12:52:17.819595 Event: landline
+On: 2011-09-02 12:52:19.824816 Event: Connected to Receiver Handler
+On: 2011-09-02 12:52:19.825098 Event: Receiver Handler respond
+On: 2011-09-02 12:52:19.827498 Event: Receiver handler : Ready
+On: 2011-09-02 12:52:19.827537 Event: Start Call
+On: 2011-09-02 12:52:19.827601 Event: Waiting Feedback
+On: 2011-09-02 12:52:26.633878 Event: Test Succeed
+On: 2011-09-02 12:52:26.644193 Event:
+On: 2011-09-02 12:52:26.644251 Event: init Caller
+On: 2011-09-02 12:52:26.644269 Event: sip
+On: 2011-09-02 12:52:28.649312 Event: Connected to Caller Handler
+On: 2011-09-02 12:52:28.649590 Event: Caller Handler respond
+On: 2011-09-02 12:52:28.650405 Event: Caller handler : Ready
+On: 2011-09-02 12:52:28.650443 Event: init Receiver
+On: 2011-09-02 12:52:28.650469 Event: unisip
+On: 2011-09-02 12:52:30.655084 Event: Connected to Receiver Handler
+On: 2011-09-02 12:52:30.655364 Event: Receiver Handler respond
+On: 2011-09-02 12:52:30.656066 Event: Receiver handler : Ready
+On: 2011-09-02 12:52:30.656105 Event: Start Call
+On: 2011-09-02 12:52:30.656698 Event: Waiting Feedback
+On: 2011-09-02 12:53:00.656958 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:04:18.848335 ------------------
+On: 2011-09-02 13:04:18.848398 Event: init Caller
+On: 2011-09-02 13:04:18.848417 Event: sip
+On: 2011-09-02 13:04:20.853617 Event: Connected to Caller Handler
+On: 2011-09-02 13:04:20.853958 Event: Caller Handler respond
+On: 2011-09-02 13:04:20.854678 Event: Caller handler : Ready
+On: 2011-09-02 13:04:20.854719 Event: init Receiver
+On: 2011-09-02 13:04:20.854743 Event: landline
+On: 2011-09-02 13:04:22.858461 Event: Connected to Receiver Handler
+On: 2011-09-02 13:04:22.858814 Event: Receiver Handler respond
+On: 2011-09-02 13:04:22.860591 Event: Receiver handler : Ready
+On: 2011-09-02 13:04:22.860627 Event: Start Call
+On: 2011-09-02 13:04:22.860685 Event: Waiting Feedback
+On: 2011-09-02 13:04:29.576696 Event: Test Succeed
+On: 2011-09-02 13:04:29.584650 Event:
+On: 2011-09-02 13:04:29.584707 Event: init Caller
+On: 2011-09-02 13:04:29.584726 Event: sip
+On: 2011-09-02 13:04:31.589550 Event: Connected to Caller Handler
+On: 2011-09-02 13:04:31.589950 Event: Caller Handler respond
+On: 2011-09-02 13:04:31.590679 Event: Caller handler : Ready
+On: 2011-09-02 13:04:31.590718 Event: init Receiver
+On: 2011-09-02 13:04:31.590741 Event: unisip
+On: 2011-09-02 13:04:33.594421 Event: Connected to Receiver Handler
+On: 2011-09-02 13:04:33.594764 Event: Receiver Handler respond
+On: 2011-09-02 13:04:33.595457 Event: Receiver handler : Ready
+On: 2011-09-02 13:04:33.595495 Event: Start Call
+On: 2011-09-02 13:04:33.595556 Event: Waiting Feedback
+On: 2011-09-02 13:05:03.595791 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:09:02.641693 ------------------
+On: 2011-09-02 13:09:02.641830 Event: init Caller
+On: 2011-09-02 13:09:02.641850 Event: sip
+On: 2011-09-02 13:09:04.647125 Event: Connected to Caller Handler
+On: 2011-09-02 13:09:04.647767 Event: Caller Handler respond
+On: 2011-09-02 13:09:04.648935 Event: Caller handler : Ready
+On: 2011-09-02 13:09:04.649021 Event: init Receiver
+On: 2011-09-02 13:09:04.649044 Event: landline
+On: 2011-09-02 13:09:06.656899 Event: Connected to Receiver Handler
+On: 2011-09-02 13:09:06.657181 Event: Receiver Handler respond
+On: 2011-09-02 13:09:06.659748 Event: Receiver handler : Ready
+On: 2011-09-02 13:09:06.659786 Event: Start Call
+On: 2011-09-02 13:09:06.659847 Event: Waiting Feedback
+On: 2011-09-02 13:09:13.238259 Event: Test Succeed
+On: 2011-09-02 13:09:13.247357 Event:
+On: 2011-09-02 13:09:13.247417 Event: init Caller
+On: 2011-09-02 13:09:13.247435 Event: sip
+On: 2011-09-02 13:09:15.251937 Event: Connected to Caller Handler
+On: 2011-09-02 13:09:15.252220 Event: Caller Handler respond
+On: 2011-09-02 13:09:15.252946 Event: Caller handler : Ready
+On: 2011-09-02 13:09:15.252984 Event: init Receiver
+On: 2011-09-02 13:09:15.253008 Event: unisip
+On: 2011-09-02 13:09:17.258093 Event: Connected to Receiver Handler
+On: 2011-09-02 13:09:17.258378 Event: Receiver Handler respond
+On: 2011-09-02 13:09:17.259084 Event: Receiver handler : Ready
+On: 2011-09-02 13:09:17.259121 Event: Start Call
+On: 2011-09-02 13:09:17.259183 Event: Waiting Feedback
+On: 2011-09-02 13:09:20.312755 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:15:37.637599 ------------------
+On: 2011-09-02 13:15:37.637663 Event: init Caller
+On: 2011-09-02 13:15:37.637682 Event: sip
+On: 2011-09-02 13:15:39.642941 Event: Connected to Caller Handler
+On: 2011-09-02 13:15:39.643236 Event: Caller Handler respond
+On: 2011-09-02 13:15:39.643967 Event: Caller handler : Ready
+On: 2011-09-02 13:15:39.644003 Event: init Receiver
+On: 2011-09-02 13:15:39.644028 Event: landline
+On: 2011-09-02 13:15:41.648975 Event: Connected to Receiver Handler
+On: 2011-09-02 13:15:41.649337 Event: Receiver Handler respond
+On: 2011-09-02 13:15:41.651502 Event: Receiver handler : Ready
+On: 2011-09-02 13:15:41.651540 Event: Start Call
+On: 2011-09-02 13:15:41.651599 Event: Waiting Feedback
+On: 2011-09-02 13:15:50.629049 Event: Test Failed
+On: 2011-09-02 13:15:50.637139 Event:
+On: 2011-09-02 13:15:50.637197 Event: init Caller
+On: 2011-09-02 13:15:50.637215 Event: sip
+On: 2011-09-02 13:15:52.640454 Event: Connected to Caller Handler
+On: 2011-09-02 13:15:52.640806 Event: Caller Handler respond
+On: 2011-09-02 13:15:52.641530 Event: Caller handler : Ready
+On: 2011-09-02 13:15:52.641566 Event: init Receiver
+On: 2011-09-02 13:15:52.641590 Event: unisip
+On: 2011-09-02 13:15:54.645612 Event: Connected to Receiver Handler
+On: 2011-09-02 13:15:54.646019 Event: Receiver Handler respond
+On: 2011-09-02 13:15:54.647105 Event: Receiver handler : Ready
+On: 2011-09-02 13:15:54.647144 Event: Start Call
+On: 2011-09-02 13:15:54.647206 Event: Waiting Feedback
+On: 2011-09-02 13:15:57.758864 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:19:13.508499 ------------------
+On: 2011-09-02 13:19:13.508577 Event: init Caller
+On: 2011-09-02 13:19:13.508596 Event: sip
+On: 2011-09-02 13:19:15.513781 Event: Connected to Caller Handler
+On: 2011-09-02 13:19:15.514080 Event: Caller Handler respond
+On: 2011-09-02 13:19:15.514811 Event: Caller handler : Ready
+On: 2011-09-02 13:19:15.514853 Event: init Receiver
+On: 2011-09-02 13:19:15.514877 Event: GSMExt.O2
+On: 2011-09-02 13:19:17.518679 Event: Connected to Receiver Handler
+On: 2011-09-02 13:19:17.518968 Event: Receiver Handler respond
+On: 2011-09-02 13:19:17.519149 Event: Receiver handler : Ready
+On: 2011-09-02 13:19:17.519179 Event: Start Call
+On: 2011-09-02 13:19:17.519230 Event: Waiting Feedback
+On: 2011-09-02 13:19:39.030524 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:20:10.076476 ------------------
+On: 2011-09-02 13:20:10.076554 Event: init Caller
+On: 2011-09-02 13:20:10.076574 Event: sip
+On: 2011-09-02 13:20:12.081798 Event: Connected to Caller Handler
+On: 2011-09-02 13:20:12.082100 Event: Caller Handler respond
+On: 2011-09-02 13:20:12.082828 Event: Caller handler : Ready
+On: 2011-09-02 13:20:12.082869 Event: init Receiver
+On: 2011-09-02 13:20:12.082894 Event: GSMExt.O2
+On: 2011-09-02 13:20:14.086675 Event: Connected to Receiver Handler
+On: 2011-09-02 13:20:14.086970 Event: Receiver Handler respond
+On: 2011-09-02 13:20:14.087147 Event: Receiver handler : Ready
+On: 2011-09-02 13:20:14.087177 Event: Start Call
+On: 2011-09-02 13:20:14.087226 Event: Waiting Feedback
+On: 2011-09-02 13:20:35.136213 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:21:01.610728 ------------------
+On: 2011-09-02 13:21:01.610805 Event: init Caller
+On: 2011-09-02 13:21:01.610824 Event: sip
+On: 2011-09-02 13:21:03.615958 Event: Connected to Caller Handler
+On: 2011-09-02 13:21:03.616251 Event: Caller Handler respond
+On: 2011-09-02 13:21:03.616991 Event: Caller handler : Ready
+On: 2011-09-02 13:21:03.617033 Event: init Receiver
+On: 2011-09-02 13:21:03.617058 Event: GSMExt.O2
+On: 2011-09-02 13:21:05.622314 Event: Connected to Receiver Handler
+On: 2011-09-02 13:21:05.622597 Event: Receiver Handler respond
+On: 2011-09-02 13:21:05.622778 Event: Receiver handler : Ready
+On: 2011-09-02 13:21:05.622806 Event: Start Call
+On: 2011-09-02 13:21:05.622856 Event: Waiting Feedback
+On: 2011-09-02 13:21:26.215228 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:29:17.812561 ------------------
+On: 2011-09-02 13:29:17.812640 Event: init Caller
+On: 2011-09-02 13:29:17.812660 Event: sip
+On: 2011-09-02 13:29:19.817817 Event: Connected to Caller Handler
+On: 2011-09-02 13:29:19.818345 Event: Caller Handler respond
+On: 2011-09-02 13:29:19.819103 Event: Caller handler : Ready
+On: 2011-09-02 13:29:19.819144 Event: init Receiver
+On: 2011-09-02 13:29:19.819168 Event: GSMExt.O2
+On: 2011-09-02 13:29:21.822807 Event: Connected to Receiver Handler
+On: 2011-09-02 13:29:21.823161 Event: Receiver Handler respond
+On: 2011-09-02 13:29:21.823346 Event: Receiver handler : Ready
+On: 2011-09-02 13:29:21.823375 Event: Start Call
+On: 2011-09-02 13:29:21.823424 Event: Waiting Feedback
+On: 2011-09-02 13:29:47.222920 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:45:57.943323 ------------------
+On: 2011-09-02 13:45:57.943398 Event: init Caller
+On: 2011-09-02 13:45:57.943418 Event: sip
+On: 2011-09-02 13:45:59.948336 Event: Connected to Caller Handler
+On: 2011-09-02 13:45:59.948639 Event: Caller Handler respond
+On: 2011-09-02 13:45:59.949368 Event: Caller handler : Ready
+On: 2011-09-02 13:45:59.949409 Event: init Receiver
+On: 2011-09-02 13:45:59.949434 Event: GSMExt.O2
+On: 2011-09-02 13:46:01.954630 Event: Connected to Receiver Handler
+On: 2011-09-02 13:46:01.954927 Event: Receiver Handler respond
+On: 2011-09-02 13:46:01.955110 Event: Receiver handler : Ready
+On: 2011-09-02 13:46:01.955140 Event: Start Call
+On: 2011-09-02 13:46:01.955191 Event: Waiting Feedback
+On: 2011-09-02 13:46:23.726910 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:49:53.213947 ------------------
+On: 2011-09-02 13:49:53.214026 Event: init Caller
+On: 2011-09-02 13:49:53.214045 Event: sip
+On: 2011-09-02 13:49:55.217988 Event: Connected to Caller Handler
+On: 2011-09-02 13:49:55.218301 Event: Caller Handler respond
+On: 2011-09-02 13:49:55.219031 Event: Caller handler : Ready
+On: 2011-09-02 13:49:55.219066 Event: init Receiver
+On: 2011-09-02 13:49:55.219090 Event: GSMExt.O2
+On: 2011-09-02 13:49:57.222667 Event: Connected to Receiver Handler
+On: 2011-09-02 13:49:57.222952 Event: Receiver Handler respond
+On: 2011-09-02 13:49:57.223128 Event: Receiver handler : Ready
+On: 2011-09-02 13:49:57.223156 Event: Start Call
+On: 2011-09-02 13:49:57.223205 Event: Waiting Feedback
+On: 2011-09-02 13:50:18.855495 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:55:01.889409 ------------------
+On: 2011-09-02 13:55:01.889481 Event: init Caller
+On: 2011-09-02 13:55:01.889501 Event: sip
+On: 2011-09-02 13:55:03.894714 Event: Connected to Caller Handler
+On: 2011-09-02 13:55:03.895000 Event: Caller Handler respond
+On: 2011-09-02 13:55:03.895730 Event: Caller handler : Ready
+On: 2011-09-02 13:55:03.895773 Event: init Receiver
+On: 2011-09-02 13:55:03.895798 Event: GSMExt.O2
+On: 2011-09-02 13:55:05.900959 Event: Connected to Receiver Handler
+On: 2011-09-02 13:55:05.901245 Event: Receiver Handler respond
+On: 2011-09-02 13:55:05.901419 Event: Receiver handler : Ready
+On: 2011-09-02 13:55:05.901448 Event: Start Call
+On: 2011-09-02 13:55:05.901497 Event: Waiting Feedback
+On: 2011-09-02 13:55:28.120619 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:01:05.619501 ------------------
+On: 2011-09-09 12:01:05.619577 Event: init Caller
+On: 2011-09-09 12:01:05.619599 Event: sip
+On: 2011-09-09 12:01:07.623842 Event: Connected to Caller Handler
+On: 2011-09-09 12:01:07.624141 Event: Caller Handler respond
+On: 2011-09-09 12:01:07.625241 Event: Caller handler : Ready
+On: 2011-09-09 12:01:07.625281 Event: init Receiver
+On: 2011-09-09 12:01:07.625302 Event: GSMExt.O2
+On: 2011-09-09 12:01:09.633642 Event: Connected to Receiver Handler
+On: 2011-09-09 12:01:09.633923 Event: Receiver Handler respond
+On: 2011-09-09 12:01:09.634113 Event: Receiver handler : Ready
+On: 2011-09-09 12:01:09.634144 Event: Start Call
+On: 2011-09-09 12:01:09.634195 Event: Waiting Feedback
+On: 2011-09-09 12:01:22.266054 Event: Test Succeed
+On: 2011-09-09 12:01:27.277575 Event:
+On: 2011-09-09 12:01:27.277634 Event: init Caller
+On: 2011-09-09 12:01:27.277652 Event: sip
+On: 2011-09-09 12:01:29.282370 Event: Connected to Caller Handler
+On: 2011-09-09 12:01:29.282725 Event: Caller Handler respond
+On: 2011-09-09 12:01:29.283468 Event: Caller handler : Ready
+On: 2011-09-09 12:01:29.283508 Event: init Receiver
+On: 2011-09-09 12:01:29.283529 Event: GSMExt.Voda
+On: 2011-09-09 12:01:31.288720 Event: Connected to Receiver Handler
+On: 2011-09-09 12:01:31.289008 Event: Receiver Handler respond
+On: 2011-09-09 12:01:31.289199 Event: Receiver handler : Ready
+On: 2011-09-09 12:01:31.289228 Event: Start Call
+On: 2011-09-09 12:01:31.289279 Event: Waiting Feedback
+On: 2011-09-09 12:01:43.808688 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:04:10.615217 ------------------
+On: 2011-09-09 12:04:10.615292 Event: init Caller
+On: 2011-09-09 12:04:10.615314 Event: sip
+On: 2011-09-09 12:04:12.620325 Event: Connected to Caller Handler
+On: 2011-09-09 12:04:12.620691 Event: Caller Handler respond
+On: 2011-09-09 12:04:12.621478 Event: Caller handler : Ready
+On: 2011-09-09 12:04:12.621519 Event: init Receiver
+On: 2011-09-09 12:04:12.621540 Event: landline
+On: 2011-09-09 12:04:14.626109 Event: Connected to Receiver Handler
+On: 2011-09-09 12:04:14.626460 Event: Receiver Handler respond
+On: 2011-09-09 12:04:14.628417 Event: Receiver handler : Ready
+On: 2011-09-09 12:04:14.628455 Event: Start Call
+On: 2011-09-09 12:04:14.628512 Event: Waiting Feedback
+On: 2011-09-09 12:04:21.365130 Event: Test Succeed
+On: 2011-09-09 12:04:26.381644 Event:
+On: 2011-09-09 12:04:26.381698 Event: init Caller
+On: 2011-09-09 12:04:26.381716 Event: sip
+On: 2011-09-09 12:04:28.386440 Event: Connected to Caller Handler
+On: 2011-09-09 12:04:28.386789 Event: Caller Handler respond
+On: 2011-09-09 12:04:28.387534 Event: Caller handler : Ready
+On: 2011-09-09 12:04:28.387573 Event: init Receiver
+On: 2011-09-09 12:04:28.387594 Event: unisip
+On: 2011-09-09 12:04:30.392544 Event: Connected to Receiver Handler
+On: 2011-09-09 12:04:30.392822 Event: Receiver Handler respond
+On: 2011-09-09 12:04:30.393628 Event: Receiver handler : Ready
+On: 2011-09-09 12:04:30.393666 Event: Start Call
+On: 2011-09-09 12:04:30.393850 Event: Waiting Feedback
+On: 2011-09-09 12:04:33.442773 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:09:01.536879 ------------------
+On: 2011-09-09 12:09:01.536956 Event: init Caller
+On: 2011-09-09 12:09:01.536978 Event: sip
+On: 2011-09-09 12:09:03.542094 Event: Connected to Caller Handler
+On: 2011-09-09 12:09:03.542383 Event: Caller Handler respond
+On: 2011-09-09 12:09:03.543125 Event: Caller handler : Ready
+On: 2011-09-09 12:09:03.543165 Event: init Receiver
+On: 2011-09-09 12:09:03.543185 Event: GSMRZ1
+On: 2011-09-09 12:09:05.548629 Event: Connected to Receiver Handler
+On: 2011-09-09 12:09:05.548909 Event: Receiver Handler respond
+On: 2011-09-09 12:09:05.549100 Event: Receiver handler : Ready
+On: 2011-09-09 12:09:05.549129 Event: Start Call
+On: 2011-09-09 12:09:05.549179 Event: Waiting Feedback
+On: 2011-09-09 12:09:10.345535 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:46:01.144322 ------------------
+On: 2011-09-09 12:46:01.144390 Event: init Caller
+On: 2011-09-09 12:46:01.144413 Event: sip
+On: 2011-09-09 12:46:03.149521 Event: Connected to Caller Handler
+On: 2011-09-09 12:46:03.149816 Event: Caller Handler respond
+On: 2011-09-09 12:46:03.150558 Event: Caller handler : Ready
+On: 2011-09-09 12:46:03.150599 Event: init Receiver
+On: 2011-09-09 12:46:03.150620 Event: landline
+On: 2011-09-09 12:46:05.154250 Event: Connected to Receiver Handler
+On: 2011-09-09 12:46:05.154530 Event: Receiver Handler respond
+On: 2011-09-09 12:46:05.156606 Event: Receiver handler : Ready
+On: 2011-09-09 12:46:05.156646 Event: Start Call
+On: 2011-09-09 12:46:05.156706 Event: Waiting Feedback
+On: 2011-09-09 12:46:13.516381 Event: Test Succeed
+On: 2011-09-09 12:46:18.533509 Event:
+On: 2011-09-09 12:46:18.533571 Event: init Caller
+On: 2011-09-09 12:46:18.533589 Event: sip
+On: 2011-09-09 12:46:20.538367 Event: Connected to Caller Handler
+On: 2011-09-09 12:46:20.538645 Event: Caller Handler respond
+On: 2011-09-09 12:46:20.539395 Event: Caller handler : Ready
+On: 2011-09-09 12:46:20.539434 Event: init Receiver
+On: 2011-09-09 12:46:20.539455 Event: unisip
+On: 2011-09-09 12:46:22.544487 Event: Connected to Receiver Handler
+On: 2011-09-09 12:46:22.544849 Event: Receiver Handler respond
+On: 2011-09-09 12:46:22.545635 Event: Receiver handler : Ready
+On: 2011-09-09 12:46:22.545674 Event: Start Call
+On: 2011-09-09 12:46:22.545732 Event: Waiting Feedback
+On: 2011-09-09 12:46:25.620472 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:47:36.088306 ------------------
+On: 2011-09-09 12:47:36.088376 Event: init Caller
+On: 2011-09-09 12:47:36.088398 Event: sip
+On: 2011-09-09 12:47:38.093513 Event: Connected to Caller Handler
+On: 2011-09-09 12:47:38.093811 Event: Caller Handler respond
+On: 2011-09-09 12:47:38.094524 Event: Caller handler : Ready
+On: 2011-09-09 12:47:38.094565 Event: init Receiver
+On: 2011-09-09 12:47:38.094588 Event: GSMExt.O2
+On: 2011-09-09 12:47:40.099336 Event: Connected to Receiver Handler
+On: 2011-09-09 12:47:40.099640 Event: Receiver Handler respond
+On: 2011-09-09 12:47:40.099832 Event: Receiver handler : Ready
+On: 2011-09-09 12:47:40.099861 Event: Start Call
+On: 2011-09-09 12:47:40.099912 Event: Waiting Feedback
+On: 2011-09-09 12:47:54.244354 Event: Test Succeed
+On: 2011-09-09 12:47:59.255888 Event:
+On: 2011-09-09 12:47:59.255948 Event: init Caller
+On: 2011-09-09 12:47:59.255967 Event: sip
+On: 2011-09-09 12:48:01.260814 Event: Connected to Caller Handler
+On: 2011-09-09 12:48:01.261091 Event: Caller Handler respond
+On: 2011-09-09 12:48:01.261878 Event: Caller handler : Ready
+On: 2011-09-09 12:48:01.261916 Event: init Receiver
+On: 2011-09-09 12:48:01.261939 Event: GSMExt.Voda
+On: 2011-09-09 12:48:03.266290 Event: Connected to Receiver Handler
+On: 2011-09-09 12:48:03.266567 Event: Receiver Handler respond
+On: 2011-09-09 12:48:03.266752 Event: Receiver handler : Ready
+On: 2011-09-09 12:48:03.266781 Event: Start Call
+On: 2011-09-09 12:48:03.266831 Event: Waiting Feedback
+On: 2011-09-09 12:48:19.537540 Event: Test Failed
+On: 2011-09-09 12:48:24.549113 Event:
+On: 2011-09-09 12:48:24.549173 Event: init Caller
+On: 2011-09-09 12:48:24.549192 Event: sip
+On: 2011-09-09 12:48:26.554040 Event: Connected to Caller Handler
+On: 2011-09-09 12:48:26.554313 Event: Caller Handler respond
+On: 2011-09-09 12:48:26.555048 Event: Caller handler : Ready
+On: 2011-09-09 12:48:26.555089 Event: init Receiver
+On: 2011-09-09 12:48:26.555110 Event: GSMExt.Eplus
+On: 2011-09-09 12:48:28.558631 Event: Connected to Receiver Handler
+On: 2011-09-09 12:48:28.558907 Event: Receiver Handler respond
+On: 2011-09-09 12:48:28.559092 Event: Receiver handler : Ready
+On: 2011-09-09 12:48:28.559122 Event: Start Call
+On: 2011-09-09 12:48:28.559170 Event: Waiting Feedback
+On: 2011-09-09 12:48:42.790837 Event: Test Succeed
+On: 2011-09-09 12:48:47.802750 Event:
+On: 2011-09-09 12:48:47.802811 Event: init Caller
+On: 2011-09-09 12:48:47.802830 Event: sip
+On: 2011-09-09 12:48:49.807600 Event: Connected to Caller Handler
+On: 2011-09-09 12:48:49.807872 Event: Caller Handler respond
+On: 2011-09-09 12:48:49.808614 Event: Caller handler : Ready
+On: 2011-09-09 12:48:49.808652 Event: init Receiver
+On: 2011-09-09 12:48:49.808675 Event: GSMExt.Tm
+On: 2011-09-09 12:48:51.813820 Event: Connected to Receiver Handler
+On: 2011-09-09 12:48:51.814101 Event: Receiver Handler respond
+On: 2011-09-09 12:48:51.814289 Event: Receiver handler : Ready
+On: 2011-09-09 12:48:51.814319 Event: Start Call
+On: 2011-09-09 12:48:51.814369 Event: Waiting Feedback
+On: 2011-09-09 12:49:06.814537 Event: Test Failed
+On: 2011-09-09 12:49:11.825921 Event:
+On: 2011-09-09 12:49:11.825980 Event: init Caller
+On: 2011-09-09 12:49:11.825999 Event: sip
+On: 2011-09-09 12:49:13.830202 Event: Connected to Caller Handler
+On: 2011-09-09 12:49:13.830473 Event: Caller Handler respond
+On: 2011-09-09 12:49:13.831213 Event: Caller handler : Ready
+On: 2011-09-09 12:49:13.831251 Event: init Receiver
+On: 2011-09-09 12:49:13.831272 Event: GSMRZ1
+On: 2011-09-09 12:49:15.835950 Event: Connected to Receiver Handler
+On: 2011-09-09 12:49:15.836309 Event: Receiver Handler respond
+On: 2011-09-09 12:49:15.836522 Event: Receiver handler : Ready
+On: 2011-09-09 12:49:15.836547 Event: Start Call
+On: 2011-09-09 12:49:15.836595 Event: Waiting Feedback
+On: 2011-09-09 12:49:20.733540 Event: Test Succeed
+On: 2011-09-09 12:49:29.796274 Event:
+On: 2011-09-09 12:49:29.796334 Event: init Caller
+On: 2011-09-09 12:49:29.796353 Event: sip
+On: 2011-09-09 12:49:31.801098 Event: Connected to Caller Handler
+On: 2011-09-09 12:49:31.801495 Event: Caller Handler respond
+On: 2011-09-09 12:49:31.802466 Event: Caller handler : Ready
+On: 2011-09-09 12:49:31.802506 Event: init Receiver
+On: 2011-09-09 12:49:31.802527 Event: landline
+On: 2011-09-09 12:49:33.806467 Event: Connected to Receiver Handler
+On: 2011-09-09 12:49:33.806746 Event: Receiver Handler respond
+On: 2011-09-09 12:49:33.808977 Event: Receiver handler : Ready
+On: 2011-09-09 12:49:33.809018 Event: Start Call
+On: 2011-09-09 12:49:33.809076 Event: Waiting Feedback
+On: 2011-09-09 12:49:40.461582 Event: Test Succeed
+On: 2011-09-09 12:49:45.481119 Event:
+On: 2011-09-09 12:49:45.481178 Event: init Caller
+On: 2011-09-09 12:49:45.481197 Event: sip
+On: 2011-09-09 12:49:47.485941 Event: Connected to Caller Handler
+On: 2011-09-09 12:49:47.486300 Event: Caller Handler respond
+On: 2011-09-09 12:49:47.487042 Event: Caller handler : Ready
+On: 2011-09-09 12:49:47.487082 Event: init Receiver
+On: 2011-09-09 12:49:47.487103 Event: unisip
+On: 2011-09-09 12:49:49.490090 Event: Connected to Receiver Handler
+On: 2011-09-09 12:49:49.490452 Event: Receiver Handler respond
+On: 2011-09-09 12:49:49.491203 Event: Receiver handler : Ready
+On: 2011-09-09 12:49:49.491242 Event: Start Call
+On: 2011-09-09 12:49:49.491302 Event: Waiting Feedback
+On: 2011-09-09 12:49:52.569543 Event: Test Succeed
+On: 2011-09-09 12:49:57.610176 Event:
+On: 2011-09-09 12:49:57.610237 Event: init Caller
+On: 2011-09-09 12:49:57.610256 Event: GSMRZ1
+On: 2011-09-09 12:49:59.620522 Event: Connected to Caller Handler
+On: 2011-09-09 12:49:59.620792 Event: Caller Handler respond
+On: 2011-09-09 12:49:59.620981 Event: Caller handler : Ready
+On: 2011-09-09 12:49:59.621010 Event: init Receiver
+On: 2011-09-09 12:49:59.621029 Event: landline
+On: 2011-09-09 12:50:01.624373 Event: Connected to Receiver Handler
+On: 2011-09-09 12:50:01.624646 Event: Receiver Handler respond
+On: 2011-09-09 12:50:01.626604 Event: Receiver handler : Ready
+On: 2011-09-09 12:50:01.626643 Event: Start Call
+On: 2011-09-09 12:50:01.629568 Event: Waiting Feedback
+On: 2011-09-09 12:50:07.097630 Event: Test Succeed
+On: 2011-09-09 12:50:12.113981 Event:
+On: 2011-09-09 12:50:12.114041 Event: init Caller
+On: 2011-09-09 12:50:12.114060 Event: GSMRZ1
+On: 2011-09-09 12:50:14.119019 Event: Connected to Caller Handler
+On: 2011-09-09 12:50:14.119291 Event: Caller Handler respond
+On: 2011-09-09 12:50:14.119481 Event: Caller handler : Ready
+On: 2011-09-09 12:50:14.119511 Event: init Receiver
+On: 2011-09-09 12:50:14.119530 Event: unisip
+On: 2011-09-09 12:50:16.124483 Event: Connected to Receiver Handler
+On: 2011-09-09 12:50:16.124845 Event: Receiver Handler respond
+On: 2011-09-09 12:50:16.125623 Event: Receiver handler : Ready
+On: 2011-09-09 12:50:16.125663 Event: Start Call
+On: 2011-09-09 12:50:16.129569 Event: Waiting Feedback
+On: 2011-09-09 12:50:19.921589 Event: Test Succeed
+On: 2011-09-09 12:50:24.963154 Event:
+On: 2011-09-09 12:50:24.963216 Event: init Caller
+On: 2011-09-09 12:50:24.963235 Event: landline
+On: 2011-09-09 12:50:26.967918 Event: Connected to Caller Handler
+On: 2011-09-09 12:50:26.968274 Event: Caller Handler respond
+On: 2011-09-09 12:50:26.970586 Event: Caller handler : Ready
+On: 2011-09-09 12:50:26.970625 Event: init Receiver
+On: 2011-09-09 12:50:26.970647 Event: GSMRZ1
+On: 2011-09-09 12:50:28.975496 Event: Connected to Receiver Handler
+On: 2011-09-09 12:50:28.975776 Event: Receiver Handler respond
+On: 2011-09-09 12:50:28.975963 Event: Receiver handler : Ready
+On: 2011-09-09 12:50:28.975993 Event: Start Call
+On: 2011-09-09 12:50:28.976044 Event: Waiting Feedback
+On: 2011-09-09 12:50:58.976271 Event: Test Failed
+On: 2011-09-09 12:51:03.983591 Event:
+On: 2011-09-09 12:51:03.983642 Event: init Caller
+On: 2011-09-09 12:51:03.983660 Event: GSMExt.O2
+On: 2011-09-09 12:51:05.992451 Event: Connected to Caller Handler
+On: 2011-09-09 12:51:05.992726 Event: Caller Handler respond
+On: 2011-09-09 12:51:05.992918 Event: Caller handler : Ready
+On: 2011-09-09 12:51:05.992948 Event: init Receiver
+On: 2011-09-09 12:51:05.992968 Event: GSMRZ1
+On: 2011-09-09 12:51:07.998170 Event: Connected to Receiver Handler
+On: 2011-09-09 12:51:07.998675 Event: Receiver Handler respond
+On: 2011-09-09 12:51:07.998877 Event: Receiver handler : Ready
+On: 2011-09-09 12:51:07.998904 Event: Start Call
+On: 2011-09-09 12:51:08.001577 Event: Waiting Feedback
+On: 2011-09-09 12:51:18.169584 Event: Test Failed
+On: 2011-09-09 12:51:23.175667 Event:
+On: 2011-09-09 12:51:23.175720 Event: init Caller
+On: 2011-09-09 12:51:23.175738 Event: GSMExt.Voda
+On: 2011-09-09 12:51:25.180773 Event: Connected to Caller Handler
+On: 2011-09-09 12:51:25.181042 Event: Caller Handler respond
+On: 2011-09-09 12:51:25.181230 Event: Caller handler : Ready
+On: 2011-09-09 12:51:25.181259 Event: init Receiver
+On: 2011-09-09 12:51:25.181278 Event: GSMRZ1
+On: 2011-09-09 12:51:27.186469 Event: Connected to Receiver Handler
+On: 2011-09-09 12:51:27.186746 Event: Receiver Handler respond
+On: 2011-09-09 12:51:27.186931 Event: Receiver handler : Ready
+On: 2011-09-09 12:51:27.186960 Event: Start Call
+On: 2011-09-09 12:51:27.189454 Event: Waiting Feedback
+On: 2011-09-09 12:51:35.661555 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:58:19.454818 ------------------
+On: 2011-09-09 12:58:19.454891 Event: init Caller
+On: 2011-09-09 12:58:19.454914 Event: sip
+On: 2011-09-09 12:58:21.458456 Event: Connected to Caller Handler
+On: 2011-09-09 12:58:21.458751 Event: Caller Handler respond
+On: 2011-09-09 12:58:21.459501 Event: Caller handler : Ready
+On: 2011-09-09 12:58:21.459540 Event: init Receiver
+On: 2011-09-09 12:58:21.459562 Event: GSMExt.Voda
+On: 2011-09-09 12:58:23.464764 Event: Connected to Receiver Handler
+On: 2011-09-09 12:58:23.465052 Event: Receiver Handler respond
+On: 2011-09-09 12:58:23.465240 Event: Receiver handler : Ready
+On: 2011-09-09 12:58:23.465270 Event: Start Call
+On: 2011-09-09 12:58:23.465321 Event: Waiting Feedback
+On: 2011-09-09 12:58:37.115022 Event: Test Succeed
+On: 2011-09-09 12:58:42.127750 Event:
+On: 2011-09-09 12:58:42.127809 Event: init Caller
+On: 2011-09-09 12:58:42.127828 Event: sip
+On: 2011-09-09 12:58:44.132655 Event: Connected to Caller Handler
+On: 2011-09-09 12:58:44.132928 Event: Caller Handler respond
+On: 2011-09-09 12:58:44.133715 Event: Caller handler : Ready
+On: 2011-09-09 12:58:44.133755 Event: init Receiver
+On: 2011-09-09 12:58:44.133776 Event: GSMExt.O2
+On: 2011-09-09 12:58:46.137720 Event: Connected to Receiver Handler
+On: 2011-09-09 12:58:46.138000 Event: Receiver Handler respond
+On: 2011-09-09 12:58:46.138189 Event: Receiver handler : Ready
+On: 2011-09-09 12:58:46.138219 Event: Start Call
+On: 2011-09-09 12:58:46.138268 Event: Waiting Feedback
+On: 2011-09-09 12:58:59.126955 Event: Test Succeed
+On: 2011-09-09 12:59:04.145864 Event:
+On: 2011-09-09 12:59:04.145924 Event: init Caller
+On: 2011-09-09 12:59:04.145942 Event: sip
+On: 2011-09-09 12:59:06.152317 Event: Connected to Caller Handler
+On: 2011-09-09 12:59:06.152679 Event: Caller Handler respond
+On: 2011-09-09 12:59:06.153467 Event: Caller handler : Ready
+On: 2011-09-09 12:59:06.153504 Event: init Receiver
+On: 2011-09-09 12:59:06.153525 Event: GSMExt.Eplus
+On: 2011-09-09 12:59:08.158353 Event: Connected to Receiver Handler
+On: 2011-09-09 12:59:08.158637 Event: Receiver Handler respond
+On: 2011-09-09 12:59:08.158826 Event: Receiver handler : Ready
+On: 2011-09-09 12:59:08.158856 Event: Start Call
+On: 2011-09-09 12:59:08.161443 Event: Waiting Feedback
+On: 2011-09-09 12:59:21.542318 Event: Test Succeed
+On: 2011-09-09 12:59:26.556958 Event:
+On: 2011-09-09 12:59:26.557015 Event: init Caller
+On: 2011-09-09 12:59:26.557034 Event: sip
+On: 2011-09-09 12:59:28.561206 Event: Connected to Caller Handler
+On: 2011-09-09 12:59:28.561603 Event: Caller Handler respond
+On: 2011-09-09 12:59:28.562346 Event: Caller handler : Ready
+On: 2011-09-09 12:59:28.562385 Event: init Receiver
+On: 2011-09-09 12:59:28.562406 Event: GSMExt.Tm
+On: 2011-09-09 12:59:30.568388 Event: Connected to Receiver Handler
+On: 2011-09-09 12:59:30.568665 Event: Receiver Handler respond
+On: 2011-09-09 12:59:30.568851 Event: Receiver handler : Ready
+On: 2011-09-09 12:59:30.568879 Event: Start Call
+On: 2011-09-09 12:59:30.568927 Event: Waiting Feedback
+On: 2011-09-09 12:59:45.569112 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:04:57.723379 ------------------
+On: 2011-09-09 13:04:57.723453 Event: init Caller
+On: 2011-09-09 13:04:57.723475 Event: sip
+On: 2011-09-09 13:04:59.728595 Event: Connected to Caller Handler
+On: 2011-09-09 13:04:59.728885 Event: Caller Handler respond
+On: 2011-09-09 13:04:59.730024 Event: Caller handler : Ready
+On: 2011-09-09 13:04:59.730076 Event: init Receiver
+On: 2011-09-09 13:04:59.730097 Event: GSMExt.Tm
+On: 2011-09-09 13:05:01.734340 Event: Connected to Receiver Handler
+On: 2011-09-09 13:05:01.734609 Event: Receiver Handler respond
+On: 2011-09-09 13:05:01.734790 Event: Receiver handler : Ready
+On: 2011-09-09 13:05:01.734815 Event: Start Call
+On: 2011-09-09 13:05:01.734865 Event: Waiting Feedback
+On: 2011-09-09 13:05:15.031001 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:05:25.980348 ------------------
+On: 2011-09-09 13:05:25.980415 Event: init Caller
+On: 2011-09-09 13:05:25.980437 Event: sip
+On: 2011-09-09 13:05:27.985494 Event: Connected to Caller Handler
+On: 2011-09-09 13:05:27.985861 Event: Caller Handler respond
+On: 2011-09-09 13:05:27.986592 Event: Caller handler : Ready
+On: 2011-09-09 13:05:27.986629 Event: init Receiver
+On: 2011-09-09 13:05:27.986652 Event: GSMExt.O2
+On: 2011-09-09 13:05:29.990123 Event: Connected to Receiver Handler
+On: 2011-09-09 13:05:29.990408 Event: Receiver Handler respond
+On: 2011-09-09 13:05:29.990585 Event: Receiver handler : Ready
+On: 2011-09-09 13:05:29.990609 Event: Start Call
+On: 2011-09-09 13:05:29.990658 Event: Waiting Feedback
+On: 2011-09-09 13:05:42.643801 Event: Test Succeed
+On: 2011-09-09 13:05:47.655181 Event:
+On: 2011-09-09 13:05:47.655238 Event: init Caller
+On: 2011-09-09 13:05:47.655256 Event: sip
+On: 2011-09-09 13:05:49.660085 Event: Connected to Caller Handler
+On: 2011-09-09 13:05:49.660436 Event: Caller Handler respond
+On: 2011-09-09 13:05:49.661518 Event: Caller handler : Ready
+On: 2011-09-09 13:05:49.661575 Event: init Receiver
+On: 2011-09-09 13:05:49.661599 Event: GSMExt.Voda
+On: 2011-09-09 13:05:51.666317 Event: Connected to Receiver Handler
+On: 2011-09-09 13:05:51.666592 Event: Receiver Handler respond
+On: 2011-09-09 13:05:51.666774 Event: Receiver handler : Ready
+On: 2011-09-09 13:05:51.666798 Event: Start Call
+On: 2011-09-09 13:05:51.666847 Event: Waiting Feedback
+On: 2011-09-09 13:06:05.667291 Event: Test Succeed
+On: 2011-09-09 13:06:10.678591 Event:
+On: 2011-09-09 13:06:10.678653 Event: init Caller
+On: 2011-09-09 13:06:10.678671 Event: sip
+On: 2011-09-09 13:06:12.683667 Event: Connected to Caller Handler
+On: 2011-09-09 13:06:12.683938 Event: Caller Handler respond
+On: 2011-09-09 13:06:12.684680 Event: Caller handler : Ready
+On: 2011-09-09 13:06:12.684714 Event: init Receiver
+On: 2011-09-09 13:06:12.684735 Event: GSMExt.Eplus
+On: 2011-09-09 13:06:14.689915 Event: Connected to Receiver Handler
+On: 2011-09-09 13:06:14.690180 Event: Receiver Handler respond
+On: 2011-09-09 13:06:14.690356 Event: Receiver handler : Ready
+On: 2011-09-09 13:06:14.690379 Event: Start Call
+On: 2011-09-09 13:06:14.690429 Event: Waiting Feedback
+On: 2011-09-09 13:06:28.728315 Event: Test Succeed
+On: 2011-09-09 13:06:33.739613 Event:
+On: 2011-09-09 13:06:33.739672 Event: init Caller
+On: 2011-09-09 13:06:33.739691 Event: sip
+On: 2011-09-09 13:06:35.745154 Event: Connected to Caller Handler
+On: 2011-09-09 13:06:35.745459 Event: Caller Handler respond
+On: 2011-09-09 13:06:35.746205 Event: Caller handler : Ready
+On: 2011-09-09 13:06:35.746246 Event: init Receiver
+On: 2011-09-09 13:06:35.746267 Event: GSMExt.Tm
+On: 2011-09-09 13:06:37.752416 Event: Connected to Receiver Handler
+On: 2011-09-09 13:06:37.752695 Event: Receiver Handler respond
+On: 2011-09-09 13:06:37.752889 Event: Receiver handler : Ready
+On: 2011-09-09 13:06:37.752919 Event: Start Call
+On: 2011-09-09 13:06:37.752972 Event: Waiting Feedback
+On: 2011-09-09 13:06:50.907924 Event: Test Succeed
+On: 2011-09-09 13:06:55.915835 Event:
+On: 2011-09-09 13:06:55.915895 Event: init Caller
+On: 2011-09-09 13:06:55.915913 Event: sip
+On: 2011-09-09 13:06:57.920870 Event: Connected to Caller Handler
+On: 2011-09-09 13:06:57.921224 Event: Caller Handler respond
+On: 2011-09-09 13:06:57.921995 Event: Caller handler : Ready
+On: 2011-09-09 13:06:57.922035 Event: init Receiver
+On: 2011-09-09 13:06:57.922055 Event: GSMRZ1
+On: 2011-09-09 13:06:59.926777 Event: Connected to Receiver Handler
+On: 2011-09-09 13:06:59.927043 Event: Receiver Handler respond
+On: 2011-09-09 13:06:59.927219 Event: Receiver handler : Ready
+On: 2011-09-09 13:06:59.927244 Event: Start Call
+On: 2011-09-09 13:06:59.927290 Event: Waiting Feedback
+On: 2011-09-09 13:07:04.713563 Event: Test Succeed
+On: 2011-09-09 13:07:13.778583 Event:
+On: 2011-09-09 13:07:13.778642 Event: init Caller
+On: 2011-09-09 13:07:13.778661 Event: sip
+On: 2011-09-09 13:07:15.783404 Event: Connected to Caller Handler
+On: 2011-09-09 13:07:15.783757 Event: Caller Handler respond
+On: 2011-09-09 13:07:15.784719 Event: Caller handler : Ready
+On: 2011-09-09 13:07:15.784758 Event: init Receiver
+On: 2011-09-09 13:07:15.784779 Event: landline
+On: 2011-09-09 13:07:17.789693 Event: Connected to Receiver Handler
+On: 2011-09-09 13:07:17.790052 Event: Receiver Handler respond
+On: 2011-09-09 13:07:17.792634 Event: Receiver handler : Ready
+On: 2011-09-09 13:07:17.792673 Event: Start Call
+On: 2011-09-09 13:07:17.792729 Event: Waiting Feedback
+On: 2011-09-09 13:07:24.559737 Event: Test Succeed
+On: 2011-09-09 13:07:29.579205 Event:
+On: 2011-09-09 13:07:29.579265 Event: init Caller
+On: 2011-09-09 13:07:29.579284 Event: sip
+On: 2011-09-09 13:07:31.584117 Event: Connected to Caller Handler
+On: 2011-09-09 13:07:31.584470 Event: Caller Handler respond
+On: 2011-09-09 13:07:31.585202 Event: Caller handler : Ready
+On: 2011-09-09 13:07:31.585240 Event: init Receiver
+On: 2011-09-09 13:07:31.585261 Event: unisip
+On: 2011-09-09 13:07:33.590249 Event: Connected to Receiver Handler
+On: 2011-09-09 13:07:33.590521 Event: Receiver Handler respond
+On: 2011-09-09 13:07:33.591254 Event: Receiver handler : Ready
+On: 2011-09-09 13:07:33.591292 Event: Start Call
+On: 2011-09-09 13:07:33.591350 Event: Waiting Feedback
+On: 2011-09-09 13:07:36.677009 Event: Test Succeed
+On: 2011-09-09 13:07:41.722972 Event:
+On: 2011-09-09 13:07:41.723030 Event: init Caller
+On: 2011-09-09 13:07:41.723048 Event: GSMRZ1
+On: 2011-09-09 13:07:43.728040 Event: Connected to Caller Handler
+On: 2011-09-09 13:07:43.728319 Event: Caller Handler respond
+On: 2011-09-09 13:07:43.728513 Event: Caller handler : Ready
+On: 2011-09-09 13:07:43.728544 Event: init Receiver
+On: 2011-09-09 13:07:43.728563 Event: landline
+On: 2011-09-09 13:07:45.732870 Event: Connected to Receiver Handler
+On: 2011-09-09 13:07:45.733224 Event: Receiver Handler respond
+On: 2011-09-09 13:07:45.735013 Event: Receiver handler : Ready
+On: 2011-09-09 13:07:45.735050 Event: Start Call
+On: 2011-09-09 13:07:45.737574 Event: Waiting Feedback
+On: 2011-09-09 13:07:52.373582 Event: Test Succeed
+On: 2011-09-09 13:07:57.387174 Event:
+On: 2011-09-09 13:07:57.387237 Event: init Caller
+On: 2011-09-09 13:07:57.387255 Event: GSMRZ1
+On: 2011-09-09 13:07:59.392300 Event: Connected to Caller Handler
+On: 2011-09-09 13:07:59.392572 Event: Caller Handler respond
+On: 2011-09-09 13:07:59.392762 Event: Caller handler : Ready
+On: 2011-09-09 13:07:59.392791 Event: init Receiver
+On: 2011-09-09 13:07:59.392809 Event: unisip
+On: 2011-09-09 13:08:01.397824 Event: Connected to Receiver Handler
+On: 2011-09-09 13:08:01.398174 Event: Receiver Handler respond
+On: 2011-09-09 13:08:01.398902 Event: Receiver handler : Ready
+On: 2011-09-09 13:08:01.398943 Event: Start Call
+On: 2011-09-09 13:08:01.401568 Event: Waiting Feedback
+On: 2011-09-09 13:08:04.657590 Event: Test Succeed
+On: 2011-09-09 13:08:09.702428 Event:
+On: 2011-09-09 13:08:09.702487 Event: init Caller
+On: 2011-09-09 13:08:09.702505 Event: landline
+On: 2011-09-09 13:08:11.707232 Event: Connected to Caller Handler
+On: 2011-09-09 13:08:11.707582 Event: Caller Handler respond
+On: 2011-09-09 13:08:11.709940 Event: Caller handler : Ready
+On: 2011-09-09 13:08:11.709976 Event: init Receiver
+On: 2011-09-09 13:08:11.709997 Event: GSMRZ1
+On: 2011-09-09 13:08:13.714305 Event: Connected to Receiver Handler
+On: 2011-09-09 13:08:13.714577 Event: Receiver Handler respond
+On: 2011-09-09 13:08:13.714765 Event: Receiver handler : Ready
+On: 2011-09-09 13:08:13.714794 Event: Start Call
+On: 2011-09-09 13:08:13.714845 Event: Waiting Feedback
+On: 2011-09-09 13:08:22.022370 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:38:38.166477 ------------------
+On: 2011-09-09 15:38:38.166549 Event: init Caller
+On: 2011-09-09 15:38:38.166571 Event: sip
+On: 2011-09-09 15:38:40.171649 Event: Connected to Caller Handler
+On: 2011-09-09 15:38:40.171946 Event: Caller Handler respond
+On: 2011-09-09 15:38:40.172683 Event: Caller handler : Ready
+On: 2011-09-09 15:38:40.172724 Event: init Receiver
+On: 2011-09-09 15:38:40.172746 Event: GSMRZ3
+On: 2011-09-09 15:38:42.177853 Event: Cannt connect to Receiver
+On: 2011-09-09 15:38:42.177912 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:39:17.005589 ------------------
+On: 2011-09-09 15:39:17.005666 Event: init Caller
+On: 2011-09-09 15:39:17.005689 Event: sip
+On: 2011-09-09 15:39:19.018101 Event: Connected to Caller Handler
+On: 2011-09-09 15:39:19.018392 Event: Caller Handler respond
+On: 2011-09-09 15:39:19.019134 Event: Caller handler : Ready
+On: 2011-09-09 15:39:19.019174 Event: init Receiver
+On: 2011-09-09 15:39:19.019195 Event: GSMRZ3
+On: 2011-09-09 15:39:21.025622 Event: Cannt connect to Receiver
+On: 2011-09-09 15:39:21.025683 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:41:18.355443 ------------------
+On: 2011-09-09 15:41:18.355514 Event: init Caller
+On: 2011-09-09 15:41:18.355536 Event: sip
+On: 2011-09-09 15:41:20.360646 Event: Connected to Caller Handler
+On: 2011-09-09 15:41:20.360934 Event: Caller Handler respond
+On: 2011-09-09 15:41:20.361723 Event: Caller handler : Ready
+On: 2011-09-09 15:41:20.361762 Event: init Receiver
+On: 2011-09-09 15:41:20.361782 Event: GSMRZ3
+On: 2011-09-09 15:41:22.365990 Event: Connected to Receiver Handler
+On: 2011-09-09 15:41:22.370408 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:42:14.399425 ------------------
+On: 2011-09-09 15:42:14.399502 Event: init Caller
+On: 2011-09-09 15:42:14.399525 Event: sip
+On: 2011-09-09 15:42:16.404668 Event: Connected to Caller Handler
+On: 2011-09-09 15:42:16.405286 Event: Caller Handler respond
+On: 2011-09-09 15:42:16.406163 Event: Caller handler : Ready
+On: 2011-09-09 15:42:16.406205 Event: init Receiver
+On: 2011-09-09 15:42:16.406226 Event: GSMRZ3
+On: 2011-09-09 15:42:18.411125 Event: Connected to Receiver Handler
+On: 2011-09-09 15:42:18.414418 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:43:04.829692 ------------------
+On: 2011-09-09 15:43:04.829764 Event: init Caller
+On: 2011-09-09 15:43:04.829786 Event: sip
+On: 2011-09-09 15:43:06.841993 Event: Connected to Caller Handler
+On: 2011-09-09 15:43:06.842272 Event: Caller Handler respond
+On: 2011-09-09 15:43:06.843022 Event: Caller handler : Ready
+On: 2011-09-09 15:43:06.843061 Event: init Receiver
+On: 2011-09-09 15:43:06.843083 Event: GSMRZ3
+On: 2011-09-09 15:43:08.850163 Event: Connected to Receiver Handler
+On: 2011-09-09 15:43:08.853444 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:44:21.525747 ------------------
+On: 2011-09-09 15:44:21.525822 Event: init Caller
+On: 2011-09-09 15:44:21.525843 Event: sip
+On: 2011-09-09 15:44:23.538345 Event: Connected to Caller Handler
+On: 2011-09-09 15:44:23.538628 Event: Caller Handler respond
+On: 2011-09-09 15:44:23.539375 Event: Caller handler : Ready
+On: 2011-09-09 15:44:23.539416 Event: init Receiver
+On: 2011-09-09 15:44:23.539438 Event: GSMRZ3
+On: 2011-09-09 15:44:25.545285 Event: Cannt connect to Receiver
+On: 2011-09-09 15:44:25.545346 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:44:52.539262 ------------------
+On: 2011-09-09 15:44:52.539335 Event: init Caller
+On: 2011-09-09 15:44:52.539357 Event: sip
+On: 2011-09-09 15:44:54.551775 Event: Connected to Caller Handler
+On: 2011-09-09 15:44:54.552067 Event: Caller Handler respond
+On: 2011-09-09 15:44:54.552811 Event: Caller handler : Ready
+On: 2011-09-09 15:44:54.552850 Event: init Receiver
+On: 2011-09-09 15:44:54.552871 Event: GSMRZ3
+On: 2011-09-09 15:44:56.557792 Event: Connected to Receiver Handler
+On: 2011-09-09 15:44:56.561747 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:46:13.961524 ------------------
+On: 2011-09-09 15:46:13.961597 Event: init Caller
+On: 2011-09-09 15:46:13.961619 Event: sip
+On: 2011-09-09 15:46:15.974008 Event: Connected to Caller Handler
+On: 2011-09-09 15:46:15.974299 Event: Caller Handler respond
+On: 2011-09-09 15:46:15.975039 Event: Caller handler : Ready
+On: 2011-09-09 15:46:15.975079 Event: init Receiver
+On: 2011-09-09 15:46:15.975101 Event: GSMRZ3
+On: 2011-09-09 15:46:17.978498 Event: Connected to Receiver Handler
+On: 2011-09-09 15:46:17.981154 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 15:47:36.519692 ------------------
+On: 2011-09-09 15:47:36.519768 Event: init Caller
+On: 2011-09-09 15:47:36.519791 Event: sip
+On: 2011-09-09 15:47:38.524889 Event: Connected to Caller Handler
+On: 2011-09-09 15:47:38.525189 Event: Caller Handler respond
+On: 2011-09-09 15:47:38.525975 Event: Caller handler : Ready
+On: 2011-09-09 15:47:38.526016 Event: init Receiver
+On: 2011-09-09 15:47:38.526038 Event: GSMRZ3
+On: 2011-09-09 15:47:40.529667 Event: Connected to Receiver Handler
+On: 2011-09-09 15:47:40.534197 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:25:11.501596 ------------------
+On: 2011-09-09 16:25:11.501711 Event: init Caller
+On: 2011-09-09 16:25:11.501734 Event: sip
+On: 2011-09-09 16:25:13.506862 Event: Connected to Caller Handler
+On: 2011-09-09 16:25:13.507161 Event: Caller Handler respond
+On: 2011-09-09 16:25:13.507907 Event: Caller handler : Ready
+On: 2011-09-09 16:25:13.507949 Event: init Receiver
+On: 2011-09-09 16:25:13.507972 Event: GSMExt.O2
+On: 2011-09-09 16:25:15.513157 Event: Connected to Receiver Handler
+On: 2011-09-09 16:25:15.513442 Event: Receiver Handler respond
+On: 2011-09-09 16:25:15.513813 Event: Receiver handler : Ready
+On: 2011-09-09 16:25:15.513859 Event: Start Call
+On: 2011-09-09 16:25:15.513931 Event: Waiting Feedback
+On: 2011-09-09 16:25:45.514156 Event: Test Failed
+On: 2011-09-09 16:25:50.528093 Event:
+On: 2011-09-09 16:25:50.528155 Event: init Caller
+On: 2011-09-09 16:25:50.528174 Event: sip
+On: 2011-09-09 16:25:52.532634 Event: Connected to Caller Handler
+On: 2011-09-09 16:25:52.533754 Event: Caller Handler respond
+On: 2011-09-09 16:25:52.534507 Event: Caller handler : Ready
+On: 2011-09-09 16:25:52.534541 Event: init Receiver
+On: 2011-09-09 16:25:52.534564 Event: GSMExt.Voda
+On: 2011-09-09 16:25:54.538545 Event: Connected to Receiver Handler
+On: 2011-09-09 16:25:54.538833 Event: Receiver Handler respond
+On: 2011-09-09 16:25:54.539022 Event: Receiver handler : Ready
+On: 2011-09-09 16:25:54.539052 Event: Start Call
+On: 2011-09-09 16:25:54.539103 Event: Waiting Feedback
+On: 2011-09-09 16:26:24.539324 Event: Test Failed
+On: 2011-09-09 16:26:29.552109 Event:
+On: 2011-09-09 16:26:29.552172 Event: init Caller
+On: 2011-09-09 16:26:29.552191 Event: sip
+On: 2011-09-09 16:26:31.557153 Event: Connected to Caller Handler
+On: 2011-09-09 16:26:31.557432 Event: Caller Handler respond
+On: 2011-09-09 16:26:31.558229 Event: Caller handler : Ready
+On: 2011-09-09 16:26:31.558268 Event: init Receiver
+On: 2011-09-09 16:26:31.558289 Event: GSMExt.Eplus
+On: 2011-09-09 16:26:33.562541 Event: Connected to Receiver Handler
+On: 2011-09-09 16:26:33.562820 Event: Receiver Handler respond
+On: 2011-09-09 16:26:33.563007 Event: Receiver handler : Ready
+On: 2011-09-09 16:26:33.563033 Event: Start Call
+On: 2011-09-09 16:26:33.563086 Event: Waiting Feedback
+On: 2011-09-09 16:26:46.616731 Event: Test Succeed
+On: 2011-09-09 16:26:51.628872 Event:
+On: 2011-09-09 16:26:51.628933 Event: init Caller
+On: 2011-09-09 16:26:51.628952 Event: sip
+On: 2011-09-09 16:26:53.633844 Event: Connected to Caller Handler
+On: 2011-09-09 16:26:53.634120 Event: Caller Handler respond
+On: 2011-09-09 16:26:53.634874 Event: Caller handler : Ready
+On: 2011-09-09 16:26:53.634914 Event: init Receiver
+On: 2011-09-09 16:26:53.634937 Event: GSMExt.Tm
+On: 2011-09-09 16:26:55.638782 Event: Connected to Receiver Handler
+On: 2011-09-09 16:26:55.639067 Event: Receiver Handler respond
+On: 2011-09-09 16:26:55.639262 Event: Receiver handler : Ready
+On: 2011-09-09 16:26:55.639291 Event: Start Call
+On: 2011-09-09 16:26:55.639344 Event: Waiting Feedback
+On: 2011-09-09 16:27:25.639570 Event: Test Failed
+On: 2011-09-09 16:27:30.652101 Event:
+On: 2011-09-09 16:27:30.652163 Event: init Caller
+On: 2011-09-09 16:27:30.652182 Event: sip
+On: 2011-09-09 16:27:32.658995 Event: Connected to Caller Handler
+On: 2011-09-09 16:27:32.659274 Event: Caller Handler respond
+On: 2011-09-09 16:27:32.660398 Event: Caller handler : Ready
+On: 2011-09-09 16:27:32.660440 Event: init Receiver
+On: 2011-09-09 16:27:32.660461 Event: GSMRZ1
+On: 2011-09-09 16:27:34.669451 Event: Connected to Receiver Handler
+On: 2011-09-09 16:27:34.669694 Event: 998 General Handler Error: Could not connect Destination handler
+On: 2011-09-09 16:27:41.860752 Event:
+On: 2011-09-09 16:27:41.860816 Event: init Caller
+On: 2011-09-09 16:27:41.860835 Event: sip
+On: 2011-09-09 16:27:43.865777 Event: Connected to Caller Handler
+On: 2011-09-09 16:27:43.866060 Event: Caller Handler respond
+On: 2011-09-09 16:27:43.866817 Event: Caller handler : Ready
+On: 2011-09-09 16:27:43.866857 Event: init Receiver
+On: 2011-09-09 16:27:43.866878 Event: landline
+On: 2011-09-09 16:27:45.884530 Event: Connected to Receiver Handler
+On: 2011-09-09 16:27:45.884812 Event: Receiver Handler respond
+On: 2011-09-09 16:27:45.886880 Event: Receiver handler : Ready
+On: 2011-09-09 16:27:45.886919 Event: Start Call
+On: 2011-09-09 16:27:45.886982 Event: Waiting Feedback
+On: 2011-09-09 16:27:55.022218 Event: Test Succeed
+On: 2011-09-09 16:28:00.039575 Event:
+On: 2011-09-09 16:28:00.039637 Event: init Caller
+On: 2011-09-09 16:28:00.039656 Event: sip
+On: 2011-09-09 16:28:02.044563 Event: Connected to Caller Handler
+On: 2011-09-09 16:28:02.044842 Event: Caller Handler respond
+On: 2011-09-09 16:28:02.045588 Event: Caller handler : Ready
+On: 2011-09-09 16:28:02.045661 Event: init Receiver
+On: 2011-09-09 16:28:02.045683 Event: unisip
+On: 2011-09-09 16:28:04.050423 Event: Connected to Receiver Handler
+On: 2011-09-09 16:28:04.050710 Event: Receiver Handler respond
+On: 2011-09-09 16:28:04.051456 Event: Receiver handler : Ready
+On: 2011-09-09 16:28:04.051497 Event: Start Call
+On: 2011-09-09 16:28:04.051558 Event: Waiting Feedback
+On: 2011-09-09 16:28:07.102584 Event: Test Succeed
+On: 2011-09-09 16:28:12.134342 Event:
+On: 2011-09-09 16:28:12.134401 Event: init Caller
+On: 2011-09-09 16:28:12.134420 Event: GSMRZ1
+On: 2011-09-09 16:28:14.145857 Event: Connected to Caller Handler
+On: 2011-09-09 16:28:14.146064 Event: 999 General Handler Error: Could not connect to Caller handler
+On: 2011-09-09 16:28:19.176736 Event:
+On: 2011-09-09 16:28:19.176797 Event: init Caller
+On: 2011-09-09 16:28:19.176816 Event: landline
+On: 2011-09-09 16:28:21.181792 Event: Connected to Caller Handler
+On: 2011-09-09 16:28:21.182071 Event: Caller Handler respond
+On: 2011-09-09 16:28:21.184344 Event: Caller handler : Ready
+On: 2011-09-09 16:28:21.184380 Event: init Receiver
+On: 2011-09-09 16:28:21.184401 Event: GSMRZ1
+On: 2011-09-09 16:28:23.193862 Event: Connected to Receiver Handler
+On: 2011-09-09 16:28:23.194063 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:08:00.969790 ------------------
+On: 2011-09-09 21:08:00.969865 Event: init Caller
+On: 2011-09-09 21:08:00.969886 Event: unisip
+On: 2011-09-09 21:08:02.980850 Event: Connected to Caller Handler
+On: 2011-09-09 21:08:02.981142 Event: Caller Handler respond
+On: 2011-09-09 21:08:02.981921 Event: Caller handler : Ready
+On: 2011-09-09 21:08:02.981960 Event: init Receiver
+On: 2011-09-09 21:08:02.981981 Event: GSMRZ1
+On: 2011-09-09 21:08:04.986319 Event: Cannt connect to Receiver
+On: 2011-09-09 21:08:04.986379 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:08:53.445300 ------------------
+On: 2011-09-09 21:08:53.445370 Event: init Caller
+On: 2011-09-09 21:08:53.445392 Event: unisip
+On: 2011-09-09 21:08:55.450322 Event: Connected to Caller Handler
+On: 2011-09-09 21:08:55.451413 Event: Caller Handler respond
+On: 2011-09-09 21:08:55.452162 Event: Caller handler : Ready
+On: 2011-09-09 21:08:55.452201 Event: init Receiver
+On: 2011-09-09 21:08:55.452223 Event: GSMRZ1
+On: 2011-09-09 21:08:57.459859 Event: Connected to Receiver Handler
+On: 2011-09-09 21:08:57.465867 Event: 998 General Handler Error: Could not connect Destination handler
+On: 2011-09-09 21:09:02.495184 Event:
+On: 2011-09-09 21:09:02.495243 Event: init Caller
+On: 2011-09-09 21:09:02.495262 Event: landline
+On: 2011-09-09 21:09:04.504559 Event: Connected to Caller Handler
+On: 2011-09-09 21:09:04.504831 Event: Caller Handler respond
+On: 2011-09-09 21:09:04.506698 Event: Caller handler : Ready
+On: 2011-09-09 21:09:04.506738 Event: init Receiver
+On: 2011-09-09 21:09:04.506760 Event: GSMRZ3
+On: 2011-09-09 21:09:08.512336 Event: Cannt connect to Receiver
+On: 2011-09-09 21:09:08.512397 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:13:07.507600 ------------------
+On: 2011-09-09 21:13:07.507677 Event: init Caller
+On: 2011-09-09 21:13:07.507699 Event: sip
+On: 2011-09-09 21:13:09.522704 Event: Connected to Caller Handler
+On: 2011-09-09 21:13:09.523006 Event: Caller Handler respond
+On: 2011-09-09 21:13:09.523731 Event: Caller handler : Ready
+On: 2011-09-09 21:13:09.523772 Event: init Receiver
+On: 2011-09-09 21:13:09.523794 Event: GSMRZ3
+On: 2011-09-09 21:13:13.529591 Event: Connected to Receiver Handler
+On: 2011-09-09 21:13:13.533832 Event: 998 General Handler Error: Could not connect Destination handler
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:14:00.420114 ------------------
+On: 2011-09-09 21:14:00.420191 Event: init Caller
+On: 2011-09-09 21:14:00.420213 Event: sip
+On: 2011-09-09 21:14:02.425415 Event: Connected to Caller Handler
+On: 2011-09-09 21:14:02.426089 Event: Caller Handler respond
+On: 2011-09-09 21:14:02.427264 Event: Caller handler : Ready
+On: 2011-09-09 21:14:02.427320 Event: init Receiver
+On: 2011-09-09 21:14:02.427343 Event: GSMRZ3
+On: 2011-09-09 21:14:06.434536 Event: Connected to Receiver Handler
+On: 2011-09-09 21:14:06.441749 Event: Receiver Handler respond
+On: 2011-09-09 21:14:06.444010 Event: Receiver handler : Ready
+On: 2011-09-09 21:14:06.444065 Event: Start Call
+On: 2011-09-09 21:14:06.444242 Event: Waiting Feedback
+On: 2011-09-09 21:14:11.369826 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:14:57.117840 ------------------
+On: 2011-09-09 21:14:57.117913 Event: init Caller
+On: 2011-09-09 21:14:57.117935 Event: sip
+On: 2011-09-09 21:14:59.130128 Event: Connected to Caller Handler
+On: 2011-09-09 21:14:59.130427 Event: Caller Handler respond
+On: 2011-09-09 21:14:59.131170 Event: Caller handler : Ready
+On: 2011-09-09 21:14:59.131210 Event: init Receiver
+On: 2011-09-09 21:14:59.131232 Event: GSMRZ3
+On: 2011-09-09 21:15:03.136410 Event: Connected to Receiver Handler
+On: 2011-09-09 21:15:03.142535 Event: Receiver Handler respond
+On: 2011-09-09 21:15:03.145325 Event: Receiver handler : Ready
+On: 2011-09-09 21:15:03.145370 Event: Start Call
+On: 2011-09-09 21:15:03.145541 Event: Waiting Feedback
+On: 2011-09-09 21:15:09.068103 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-11 17:09:00.728602 ------------------
+On: 2011-09-11 17:09:00.728644 Event: init Caller
+On: 2011-09-11 17:09:00.728656 Event: sip
+On: 2011-09-11 17:09:02.732816 Event: Cannt connect to Caller
+On: 2011-09-11 17:09:02.732904 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 17:12:41.790169 ------------------
+On: 2011-09-11 17:12:41.790210 Event: init Caller
+On: 2011-09-11 17:12:41.790222 Event: sip
+On: 2011-09-11 17:12:43.792959 Event: Cannt connect to Caller
+On: 2011-09-11 17:12:43.793048 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:03:36.779374 ------------------
+On: 2011-09-11 18:03:36.779413 Event: init Caller
+On: 2011-09-11 18:03:36.779422 Event: sip
+On: 2011-09-11 18:03:38.782111 Event: Cannt connect to Caller
+On: 2011-09-11 18:03:38.782203 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:04:37.341843 ------------------
+On: 2011-09-11 18:04:37.341948 Event: init Caller
+On: 2011-09-11 18:04:37.341987 Event: sip
+On: 2011-09-11 18:04:39.345359 Event: Cannt connect to Caller
+On: 2011-09-11 18:04:39.345473 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:07:03.854906 ------------------
+On: 2011-09-11 18:07:03.855042 Event: init Caller
+On: 2011-09-11 18:07:03.855103 Event: sip
+On: 2011-09-11 18:07:05.861608 Event: Cannt connect to Caller
+On: 2011-09-11 18:07:05.861697 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:11:09.529265 ------------------
+On: 2011-09-11 18:11:09.529404 Event: init Caller
+On: 2011-09-11 18:11:09.529439 Event: sip
+On: 2011-09-11 18:11:11.534537 Event: Cannt connect to Caller
+On: 2011-09-11 18:11:11.534623 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:12:15.313131 ------------------
+On: 2011-09-11 18:12:15.313234 Event: init Caller
+On: 2011-09-11 18:12:15.313261 Event: sip
+On: 2011-09-11 18:12:17.319036 Event: Cannt connect to Caller
+On: 2011-09-11 18:12:17.319074 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:12:33.874934 ------------------
+On: 2011-09-11 18:12:33.875032 Event: init Caller
+On: 2011-09-11 18:12:33.875042 Event: sip
+On: 2011-09-11 18:12:35.879340 Event: Cannt connect to Caller
+On: 2011-09-11 18:12:35.879369 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:18:17.188273 ------------------
+On: 2011-09-11 18:18:17.188316 Event: init Caller
+On: 2011-09-11 18:18:17.188328 Event: sip
+On: 2011-09-11 18:18:19.191827 Event: Cannt connect to Caller
+On: 2011-09-11 18:18:19.191947 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:18:36.745305 ------------------
+On: 2011-09-11 18:18:36.745337 Event: init Caller
+On: 2011-09-11 18:18:36.745346 Event: sip
+On: 2011-09-11 18:18:38.747369 Event: Cannt connect to Caller
+On: 2011-09-11 18:18:38.747401 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:25:24.464017 ------------------
+On: 2011-09-11 18:25:24.464049 Event: init Caller
+On: 2011-09-11 18:25:24.464057 Event: sip
+On: 2011-09-11 18:25:26.467729 Event: Cannt connect to Caller
+On: 2011-09-11 18:25:26.467818 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:30:05.961247 ------------------
+On: 2011-09-11 18:30:05.961355 Event: init Caller
+On: 2011-09-11 18:30:05.961392 Event: sip
+On: 2011-09-11 18:30:07.965743 Event: Cannt connect to Caller
+On: 2011-09-11 18:30:07.965769 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:36:02.337076 ------------------
+On: 2011-09-11 18:36:02.337160 Event: init Caller
+On: 2011-09-11 18:36:02.337184 Event: sip
+On: 2011-09-11 18:36:04.342938 Event: Cannt connect to Caller
+On: 2011-09-11 18:36:04.343055 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:37:58.892202 ------------------
+On: 2011-09-11 18:37:58.892262 Event: init Caller
+On: 2011-09-11 18:37:58.892281 Event: sip
+On: 2011-09-11 18:38:00.895264 Event: Cannt connect to Caller
+On: 2011-09-11 18:38:00.895294 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:38:18.801428 ------------------
+On: 2011-09-11 18:38:18.801565 Event: init Caller
+On: 2011-09-11 18:38:18.801619 Event: sip
+On: 2011-09-11 18:38:20.807920 Event: Cannt connect to Caller
+On: 2011-09-11 18:38:20.808012 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:56:14.182605 ------------------
+On: 2011-09-11 18:56:14.182719 Event: init Caller
+On: 2011-09-11 18:56:14.182765 Event: GSMRZ1
+On: 2011-09-11 18:56:16.188036 Event: Cannt connect to Caller
+On: 2011-09-11 18:56:16.188139 Event: 999 General Handler Error: Could not connect to Caller handler
+On: 2011-09-11 18:56:21.197728 Event:
+On: 2011-09-11 18:56:21.197808 Event: init Caller
+On: 2011-09-11 18:56:21.197852 Event: GSMRZ1
+On: 2011-09-11 18:56:23.204170 Event: Cannt connect to Caller
+On: 2011-09-11 18:56:23.204284 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 18:57:08.109769 ------------------
+On: 2011-09-11 18:57:08.109876 Event: init Caller
+On: 2011-09-11 18:57:08.109904 Event: sip
+On: 2011-09-11 18:57:10.115635 Event: Cannt connect to Caller
+On: 2011-09-11 18:57:10.115726 Event: 999 General Handler Error: Could not connect to Caller handler
+On: 2011-09-11 18:57:15.124884 Event:
+On: 2011-09-11 18:57:15.124959 Event: init Caller
+On: 2011-09-11 18:57:15.124999 Event: GSMRZ1
+On: 2011-09-11 18:57:17.134182 Event: Cannt connect to Caller
+On: 2011-09-11 18:57:17.134288 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 19:14:29.860229 ------------------
+On: 2011-09-11 19:14:29.860278 Event: init Caller
+On: 2011-09-11 19:14:29.860293 Event: sip
+On: 2011-09-11 19:14:31.865167 Event: Cannt connect to Caller
+On: 2011-09-11 19:14:31.865261 Event: 999 General Handler Error: Could not connect to Caller handler
+On: 2011-09-11 19:14:36.881814 Event:
+On: 2011-09-11 19:14:36.881891 Event: init Caller
+On: 2011-09-11 19:14:36.881919 Event: sip
+On: 2011-09-11 19:14:38.888353 Event: Cannt connect to Caller
+On: 2011-09-11 19:14:38.888476 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 19:16:26.409515 ------------------
+On: 2011-09-11 19:16:26.409646 Event: init Caller
+On: 2011-09-11 19:16:26.409694 Event: sip
+On: 2011-09-11 19:16:28.415345 Event: Cannt connect to Caller
+On: 2011-09-11 19:16:28.415434 Event: 999 General Handler Error: Could not connect to Caller handler
+On: 2011-09-11 19:16:33.428601 Event:
+On: 2011-09-11 19:16:33.428674 Event: init Caller
+On: 2011-09-11 19:16:33.428701 Event: sip
+On: 2011-09-11 19:16:35.434593 Event: Cannt connect to Caller
+On: 2011-09-11 19:16:35.434722 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 19:24:41.075362 ------------------
+On: 2011-09-11 19:24:41.075405 Event: init Caller
+On: 2011-09-11 19:24:41.075417 Event: sip
+On: 2011-09-11 19:24:43.078338 Event: Cannt connect to Caller
+On: 2011-09-11 19:24:43.078436 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:31:38.457360 ------------------
+On: 2011-09-11 20:31:38.457491 Event: init Caller
+On: 2011-09-11 20:31:38.457538 Event: sip
+On: 2011-09-11 20:31:40.463746 Event: Connected to Caller Handler
+On: 2011-09-11 20:31:40.464064 Event: Caller Handler respond
+On: 2011-09-11 20:31:40.464927 Event: Caller handler : Ready
+On: 2011-09-11 20:31:40.464985 Event: init Receiver
+On: 2011-09-11 20:31:40.465021 Event: GSMRZ1
+On: 2011-09-11 20:31:42.470713 Event: Connected to Receiver Handler
+On: 2011-09-11 20:31:42.471164 Event: Receiver Handler respond
+On: 2011-09-11 20:31:42.471400 Event: Receiver handler : Ready
+On: 2011-09-11 20:31:42.471452 Event: Start Call
+On: 2011-09-11 20:31:42.471567 Event: Waiting Feedback
+On: 2011-09-11 20:31:47.318911 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:32:16.608858 ------------------
+On: 2011-09-11 20:32:16.608924 Event: init Caller
+On: 2011-09-11 20:32:16.608946 Event: sip
+On: 2011-09-11 20:32:18.613940 Event: Connected to Caller Handler
+On: 2011-09-11 20:32:18.614250 Event: Caller Handler respond
+On: 2011-09-11 20:32:18.615259 Event: Caller handler : Ready
+On: 2011-09-11 20:32:18.615323 Event: init Receiver
+On: 2011-09-11 20:32:18.615374 Event: GSMRZ1
+On: 2011-09-11 20:32:20.621587 Event: Connected to Receiver Handler
+On: 2011-09-11 20:32:20.621793 Event: Receiver Handler respond
+On: 2011-09-11 20:32:20.621856 Event: Receiver handler : Ready
+On: 2011-09-11 20:32:20.621870 Event: Start Call
+On: 2011-09-11 20:32:20.621909 Event: Waiting Feedback
+On: 2011-09-11 20:32:26.154889 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:35:28.724160 ------------------
+On: 2011-09-11 20:35:28.724292 Event: init Caller
+On: 2011-09-11 20:35:28.724353 Event: sip
+On: 2011-09-11 20:35:30.730249 Event: Connected to Caller Handler
+On: 2011-09-11 20:35:30.730351 Event: Caller Handler respond
+On: 2011-09-11 20:35:30.731224 Event: Caller handler : Ready
+On: 2011-09-11 20:35:30.731270 Event: init Receiver
+On: 2011-09-11 20:35:30.731286 Event: GSMRZ1
+On: 2011-09-11 20:35:32.735982 Event: Connected to Receiver Handler
+On: 2011-09-11 20:35:32.736408 Event: Receiver Handler respond
+On: 2011-09-11 20:35:32.736614 Event: Receiver handler : Ready
+On: 2011-09-11 20:35:32.736653 Event: Start Call
+On: 2011-09-11 20:35:32.736740 Event: Waiting Feedback
+On: 2011-09-11 20:35:37.982890 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:41:52.692499 ------------------
+On: 2011-09-11 20:41:52.692533 Event: init Caller
+On: 2011-09-11 20:41:52.692542 Event: sip
+On: 2011-09-11 20:41:54.694227 Event: Connected to Caller Handler
+On: 2011-09-11 20:41:54.694318 Event: Caller Handler respond
+On: 2011-09-11 20:41:54.694602 Event: Caller handler : Ready
+On: 2011-09-11 20:41:54.694619 Event: init Receiver
+On: 2011-09-11 20:41:54.694631 Event: GSMRZ1
+On: 2011-09-11 20:41:56.697735 Event: Connected to Receiver Handler
+On: 2011-09-11 20:41:56.698162 Event: Receiver Handler respond
+On: 2011-09-11 20:41:56.698407 Event: Receiver handler : Ready
+On: 2011-09-11 20:41:56.698461 Event: Start Call
+On: 2011-09-11 20:41:56.698590 Event: Waiting Feedback
+On: 2011-09-11 20:42:02.138887 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:49:36.700025 ------------------
+On: 2011-09-11 20:49:36.700068 Event: init Caller
+On: 2011-09-11 20:49:36.700082 Event: sip
+On: 2011-09-11 20:49:38.704535 Event: Connected to Caller Handler
+On: 2011-09-11 20:49:38.704800 Event: Caller Handler respond
+On: 2011-09-11 20:49:38.705692 Event: Caller handler : Ready
+On: 2011-09-11 20:49:38.705753 Event: init Receiver
+On: 2011-09-11 20:49:38.705797 Event: GSMRZ1
+On: 2011-09-11 20:49:40.711718 Event: Connected to Receiver Handler
+On: 2011-09-11 20:49:40.712163 Event: Receiver Handler respond
+On: 2011-09-11 20:49:40.712380 Event: Receiver handler : Ready
+On: 2011-09-11 20:49:40.712435 Event: Start Call
+On: 2011-09-11 20:49:40.712566 Event: Waiting Feedback
+On: 2011-09-11 20:49:46.566905 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-11 20:51:45.982791 ------------------
+On: 2011-09-11 20:51:45.982970 Event: init Caller
+On: 2011-09-11 20:51:45.983007 Event: sip
+On: 2011-09-11 20:51:47.993860 Event: Connected to Caller Handler
+On: 2011-09-11 20:51:47.994166 Event: Caller Handler respond
+On: 2011-09-11 20:51:47.995190 Event: Caller handler : Ready
+On: 2011-09-11 20:51:47.995266 Event: init Receiver
+On: 2011-09-11 20:51:47.995315 Event: GSMRZ1
+On: 2011-09-11 20:51:50.000125 Event: Connected to Receiver Handler
+On: 2011-09-11 20:51:50.000694 Event: Receiver Handler respond
+On: 2011-09-11 20:51:50.001102 Event: Receiver handler : Ready
+On: 2011-09-11 20:51:50.001162 Event: Start Call
+On: 2011-09-11 20:51:50.001295 Event: Waiting Feedback
+On: 2011-09-11 20:51:54.838883 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:34:10.205401 ------------------
+On: 2011-09-12 14:34:10.205447 Event: init Caller
+On: 2011-09-12 14:34:10.205462 Event: sip
+On: 2011-09-12 14:34:12.208949 Event: Connected to Caller Handler
+On: 2011-09-12 14:34:12.209250 Event: Caller Handler respond
+On: 2011-09-12 14:34:12.210169 Event: Caller handler : Ready
+On: 2011-09-12 14:34:12.210233 Event: init Receiver
+On: 2011-09-12 14:34:12.210267 Event: GSMRZ1
+On: 2011-09-12 14:34:14.215590 Event: Connected to Receiver Handler
+On: 2011-09-12 14:34:14.216140 Event: Receiver Handler respond
+On: 2011-09-12 14:34:14.216512 Event: Receiver handler : Ready
+On: 2011-09-12 14:34:14.216580 Event: Start Call
+On: 2011-09-12 14:34:14.216706 Event: Waiting Feedback
+On: 2011-09-12 14:34:19.731896 Event: Test Succeed
+On: 2011-09-12 14:34:24.746967 Event:
+On: 2011-09-12 14:34:24.747026 Event: init Caller
+On: 2011-09-12 14:34:24.747048 Event: sip
+On: 2011-09-12 14:34:26.751200 Event: Connected to Caller Handler
+On: 2011-09-12 14:34:26.751849 Event: Caller Handler respond
+On: 2011-09-12 14:34:26.753256 Event: Caller handler : Ready
+On: 2011-09-12 14:34:26.753320 Event: init Receiver
+On: 2011-09-12 14:34:26.753372 Event: GSMRZ1
+On: 2011-09-12 14:34:28.757684 Event: Connected to Receiver Handler
+On: 2011-09-12 14:34:28.758059 Event: Receiver Handler respond
+On: 2011-09-12 14:34:28.758264 Event: Receiver handler : Ready
+On: 2011-09-12 14:34:28.758308 Event: Start Call
+On: 2011-09-12 14:34:28.758417 Event: Waiting Feedback
+On: 2011-09-12 14:34:33.871885 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:36:28.694527 ------------------
+On: 2011-09-12 14:36:28.694622 Event: init Caller
+On: 2011-09-12 14:36:28.694654 Event: sip
+On: 2011-09-12 14:36:30.699989 Event: Connected to Caller Handler
+On: 2011-09-12 14:36:30.700292 Event: Caller Handler respond
+On: 2011-09-12 14:36:30.701194 Event: Caller handler : Ready
+On: 2011-09-12 14:36:30.701254 Event: init Receiver
+On: 2011-09-12 14:36:30.701290 Event: GSMRZ1
+On: 2011-09-12 14:36:32.707534 Event: Connected to Receiver Handler
+On: 2011-09-12 14:36:32.708056 Event: Receiver Handler respond
+On: 2011-09-12 14:36:32.708306 Event: Receiver handler : Ready
+On: 2011-09-12 14:36:32.708358 Event: Start Call
+On: 2011-09-12 14:36:32.708557 Event: Waiting Feedback
+On: 2011-09-12 14:36:38.611914 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:40:53.066071 ------------------
+On: 2011-09-12 14:40:53.066183 Event: init Caller
+On: 2011-09-12 14:40:53.066233 Event: GSMRZ1
+On: 2011-09-12 14:40:55.075870 Event: Connected to Caller Handler
+On: 2011-09-12 14:40:55.076256 Event: Caller Handler respond
+On: 2011-09-12 14:40:55.076495 Event: Caller handler : Ready
+On: 2011-09-12 14:40:55.076551 Event: init Receiver
+On: 2011-09-12 14:40:55.076597 Event: GSMExt.Eplus
+On: 2011-09-12 14:40:57.081593 Event: Connected to Receiver Handler
+On: 2011-09-12 14:40:57.081949 Event: Receiver Handler respond
+On: 2011-09-12 14:40:57.082144 Event: Receiver handler : Ready
+On: 2011-09-12 14:40:57.082184 Event: Start Call
+On: 2011-09-12 14:40:57.082251 Event: Waiting Feedback
+On: 2011-09-12 14:41:08.595881 Event: Test Failed
+On: 2011-09-12 14:41:13.602896 Event:
+On: 2011-09-12 14:41:13.602972 Event: init Caller
+On: 2011-09-12 14:41:13.603012 Event: GSMRZ1
+On: 2011-09-12 14:41:15.609223 Event: Connected to Caller Handler
+On: 2011-09-12 14:41:15.609484 Event: Caller Handler respond
+On: 2011-09-12 14:41:15.609605 Event: Caller handler : Ready
+On: 2011-09-12 14:41:15.609618 Event: init Receiver
+On: 2011-09-12 14:41:15.609631 Event: GSMExt.Voda
+On: 2011-09-12 14:41:17.614861 Event: Connected to Receiver Handler
+On: 2011-09-12 14:41:17.615150 Event: Receiver Handler respond
+On: 2011-09-12 14:41:17.615318 Event: Receiver handler : Ready
+On: 2011-09-12 14:41:17.615341 Event: Start Call
+On: 2011-09-12 14:41:17.615399 Event: Waiting Feedback
+On: 2011-09-12 14:41:28.439910 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:42:00.864581 ------------------
+On: 2011-09-12 14:42:00.864620 Event: init Caller
+On: 2011-09-12 14:42:00.864632 Event: GSMRZ1
+On: 2011-09-12 14:42:02.872222 Event: Connected to Caller Handler
+On: 2011-09-12 14:42:02.872515 Event: Caller Handler respond
+On: 2011-09-12 14:42:02.872626 Event: Caller handler : Ready
+On: 2011-09-12 14:42:02.872641 Event: init Receiver
+On: 2011-09-12 14:42:02.872654 Event: GSMExt.Tm
+On: 2011-09-12 14:42:04.876197 Event: Connected to Receiver Handler
+On: 2011-09-12 14:42:04.876341 Event: Receiver Handler respond
+On: 2011-09-12 14:42:04.876405 Event: Receiver handler : Ready
+On: 2011-09-12 14:42:04.876419 Event: Start Call
+On: 2011-09-12 14:42:04.876455 Event: Waiting Feedback
+On: 2011-09-12 14:42:17.287890 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:43:07.173824 ------------------
+On: 2011-09-12 14:43:07.173854 Event: init Caller
+On: 2011-09-12 14:43:07.173861 Event: GSMRZ1
+On: 2011-09-12 14:43:09.176663 Event: Connected to Caller Handler
+On: 2011-09-12 14:43:09.176862 Event: Caller Handler respond
+On: 2011-09-12 14:43:09.176929 Event: Caller handler : Ready
+On: 2011-09-12 14:43:09.176943 Event: init Receiver
+On: 2011-09-12 14:43:09.176955 Event: GSMExt.O2
+On: 2011-09-12 14:43:11.181121 Event: Connected to Receiver Handler
+On: 2011-09-12 14:43:11.181618 Event: Receiver Handler respond
+On: 2011-09-12 14:43:11.181991 Event: Receiver handler : Ready
+On: 2011-09-12 14:43:11.182047 Event: Start Call
+On: 2011-09-12 14:43:11.182174 Event: Waiting Feedback
+On: 2011-09-12 14:43:31.643967 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:43:58.999093 ------------------
+On: 2011-09-12 14:43:58.999207 Event: init Caller
+On: 2011-09-12 14:43:58.999257 Event: GSMRZ1
+On: 2011-09-12 14:44:01.004178 Event: Connected to Caller Handler
+On: 2011-09-12 14:44:01.004318 Event: Caller Handler respond
+On: 2011-09-12 14:44:01.004386 Event: Caller handler : Ready
+On: 2011-09-12 14:44:01.004400 Event: init Receiver
+On: 2011-09-12 14:44:01.004412 Event: GSMExt.Tm
+On: 2011-09-12 14:44:03.009007 Event: Connected to Receiver Handler
+On: 2011-09-12 14:44:03.009428 Event: Receiver Handler respond
+On: 2011-09-12 14:44:03.009659 Event: Receiver handler : Ready
+On: 2011-09-12 14:44:03.009711 Event: Start Call
+On: 2011-09-12 14:44:03.009834 Event: Waiting Feedback
+On: 2011-09-12 14:44:13.703910 Event: Test Failed
+
+
+------------------STARTED THE LOGGING 2011-09-12 14:56:53.169158 ------------------
+On: 2011-09-12 14:56:53.169217 Event: init Caller
+On: 2011-09-12 14:56:53.169236 Event: sip
+On: 2011-09-12 14:56:55.173344 Event: Connected to Caller Handler
+On: 2011-09-12 14:56:55.173435 Event: Caller Handler respond
+On: 2011-09-12 14:56:55.173987 Event: Caller handler : Ready
+On: 2011-09-12 14:56:55.174013 Event: init Receiver
+On: 2011-09-12 14:56:55.174026 Event: GSMRZ1
+On: 2011-09-12 14:56:57.176555 Event: Connected to Receiver Handler
+On: 2011-09-12 14:56:57.176755 Event: Receiver Handler respond
+On: 2011-09-12 14:56:57.176814 Event: Receiver handler : Ready
+On: 2011-09-12 14:56:57.176827 Event: Start Call
+On: 2011-09-12 14:56:57.176860 Event: Waiting Feedback
+On: 2011-09-12 14:57:02.143899 Event: Test Succeed
+On: 2011-09-12 14:57:07.157256 Event:
+On: 2011-09-12 14:57:07.157315 Event: init Caller
+On: 2011-09-12 14:57:07.157339 Event: sip
+On: 2011-09-12 14:57:09.160178 Event: Connected to Caller Handler
+On: 2011-09-12 14:57:09.160274 Event: Caller Handler respond
+On: 2011-09-12 14:57:09.161034 Event: Caller handler : Ready
+On: 2011-09-12 14:57:09.161093 Event: init Receiver
+On: 2011-09-12 14:57:09.161134 Event: GSMRZ1
+On: 2011-09-12 14:57:11.164102 Event: Connected to Receiver Handler
+On: 2011-09-12 14:57:11.164658 Event: Receiver Handler respond
+On: 2011-09-12 14:57:11.164998 Event: Receiver handler : Ready
+On: 2011-09-12 14:57:11.165040 Event: Start Call
+On: 2011-09-12 14:57:11.165134 Event: Waiting Feedback
+On: 2011-09-12 14:57:16.499888 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:01:21.325887 ------------------
+On: 2011-09-12 15:01:21.325918 Event: init Caller
+On: 2011-09-12 15:01:21.325927 Event: sip
+On: 2011-09-12 15:01:23.328366 Event: Connected to Caller Handler
+On: 2011-09-12 15:01:23.328551 Event: Caller Handler respond
+On: 2011-09-12 15:01:23.328811 Event: Caller handler : Ready
+On: 2011-09-12 15:01:23.328827 Event: init Receiver
+On: 2011-09-12 15:01:23.328837 Event: GSMRZ1
+On: 2011-09-12 15:01:25.332284 Event: Connected to Receiver Handler
+On: 2011-09-12 15:01:25.332436 Event: Receiver Handler respond
+On: 2011-09-12 15:01:25.332513 Event: Receiver handler : Ready
+On: 2011-09-12 15:01:25.332531 Event: Start Call
+On: 2011-09-12 15:01:25.332571 Event: Waiting Feedback
+On: 2011-09-12 15:01:30.483886 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:14:53.913525 ------------------
+On: 2011-09-12 15:14:53.913569 Event: init Caller
+On: 2011-09-12 15:14:53.913584 Event: sip
+On: 2011-09-12 15:14:55.916671 Event: Connected to Caller Handler
+On: 2011-09-12 15:14:55.916881 Event: Caller Handler respond
+On: 2011-09-12 15:14:55.917788 Event: Caller handler : Ready
+On: 2011-09-12 15:14:55.917850 Event: init Receiver
+On: 2011-09-12 15:14:55.917911 Event: GSMRZ1
+On: 2011-09-12 15:14:57.923118 Event: Connected to Receiver Handler
+On: 2011-09-12 15:14:57.923500 Event: Receiver Handler respond
+On: 2011-09-12 15:14:57.923778 Event: Receiver handler : Ready
+On: 2011-09-12 15:14:57.923874 Event: Start Call
+On: 2011-09-12 15:14:57.924013 Event: Waiting Feedback
+On: 2011-09-12 15:15:03.759917 Event: Test Succeed
+On: 2011-09-12 15:15:08.767952 Event:
+On: 2011-09-12 15:15:08.767974 Event: init Caller
+On: 2011-09-12 15:15:08.767981 Event: sip
+On: 2011-09-12 15:15:10.772022 Event: Connected to Caller Handler
+On: 2011-09-12 15:15:10.772110 Event: Caller Handler respond
+On: 2011-09-12 15:15:10.772874 Event: Caller handler : Ready
+On: 2011-09-12 15:15:10.772931 Event: init Receiver
+On: 2011-09-12 15:15:10.772978 Event: GSMRZ1
+On: 2011-09-12 15:15:12.776245 Event: Connected to Receiver Handler
+On: 2011-09-12 15:15:12.776402 Event: Receiver Handler respond
+On: 2011-09-12 15:15:12.776516 Event: Receiver handler : Ready
+On: 2011-09-12 15:15:12.776531 Event: Start Call
+On: 2011-09-12 15:15:12.776571 Event: Waiting Feedback
+On: 2011-09-12 15:15:17.859927 Event: Test Succeed
+On: 2011-09-12 15:15:22.870540 Event:
+On: 2011-09-12 15:15:22.870574 Event: init Caller
+On: 2011-09-12 15:15:22.870586 Event: sip
+On: 2011-09-12 15:15:24.874805 Event: Connected to Caller Handler
+On: 2011-09-12 15:15:24.874977 Event: Caller Handler respond
+On: 2011-09-12 15:15:24.875254 Event: Caller handler : Ready
+On: 2011-09-12 15:15:24.875271 Event: init Receiver
+On: 2011-09-12 15:15:24.875300 Event: GSMRZ1
+On: 2011-09-12 15:15:26.879108 Event: Connected to Receiver Handler
+On: 2011-09-12 15:15:26.879263 Event: Receiver Handler respond
+On: 2011-09-12 15:15:26.879323 Event: Receiver handler : Ready
+On: 2011-09-12 15:15:26.879337 Event: Start Call
+On: 2011-09-12 15:15:26.879369 Event: Waiting Feedback
+On: 2011-09-12 15:15:31.983910 Event: Test Succeed
+On: 2011-09-12 15:15:37.001318 Event:
+On: 2011-09-12 15:15:37.001398 Event: init Caller
+On: 2011-09-12 15:15:37.001448 Event: sip
+On: 2011-09-12 15:15:39.006943 Event: Connected to Caller Handler
+On: 2011-09-12 15:15:39.007235 Event: Caller Handler respond
+On: 2011-09-12 15:15:39.008401 Event: Caller handler : Ready
+On: 2011-09-12 15:15:39.008444 Event: init Receiver
+On: 2011-09-12 15:15:39.008476 Event: GSMRZ1
+On: 2011-09-12 15:15:41.014150 Event: Connected to Receiver Handler
+On: 2011-09-12 15:15:41.014722 Event: Receiver Handler respond
+On: 2011-09-12 15:15:41.015052 Event: Receiver handler : Ready
+On: 2011-09-12 15:15:41.015117 Event: Start Call
+On: 2011-09-12 15:15:41.015228 Event: Waiting Feedback
+On: 2011-09-12 15:15:46.127890 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:19:33.514645 ------------------
+On: 2011-09-12 15:19:33.514692 Event: init Caller
+On: 2011-09-12 15:19:33.514706 Event: sip
+On: 2011-09-12 15:19:35.518839 Event: Connected to Caller Handler
+On: 2011-09-12 15:19:35.519032 Event: Caller Handler respond
+On: 2011-09-12 15:19:35.519311 Event: Caller handler : Ready
+On: 2011-09-12 15:19:35.519327 Event: init Receiver
+On: 2011-09-12 15:19:35.519337 Event: GSMRZ1
+On: 2011-09-12 15:19:37.524250 Event: Connected to Receiver Handler
+On: 2011-09-12 15:19:37.524477 Event: Receiver Handler respond
+On: 2011-09-12 15:19:37.524745 Event: Receiver handler : Ready
+On: 2011-09-12 15:19:37.524757 Event: Start Call
+On: 2011-09-12 15:19:37.524789 Event: Waiting Feedback
+On: 2011-09-12 15:19:42.659912 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:26:13.009271 ------------------
+On: 2011-09-12 15:26:13.009323 Event: init Caller
+On: 2011-09-12 15:26:13.009338 Event: sip
+On: 2011-09-12 15:26:15.012554 Event: Connected to Caller Handler
+On: 2011-09-12 15:26:15.012763 Event: Caller Handler respond
+On: 2011-09-12 15:26:15.013592 Event: Caller handler : Ready
+On: 2011-09-12 15:26:15.013651 Event: init Receiver
+On: 2011-09-12 15:26:15.013684 Event: GSMRZ1
+On: 2011-09-12 15:26:17.019439 Event: Connected to Receiver Handler
+On: 2011-09-12 15:26:17.020017 Event: Receiver Handler respond
+On: 2011-09-12 15:26:17.020284 Event: Receiver handler : Ready
+On: 2011-09-12 15:26:17.020326 Event: Start Call
+On: 2011-09-12 15:26:17.020416 Event: Waiting Feedback
+On: 2011-09-12 15:26:22.843962 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:27:36.780252 ------------------
+On: 2011-09-12 15:27:36.780297 Event: init Caller
+On: 2011-09-12 15:27:36.780311 Event: sip
+On: 2011-09-12 15:27:38.782983 Event: Connected to Caller Handler
+On: 2011-09-12 15:27:38.783144 Event: Caller Handler respond
+On: 2011-09-12 15:27:38.783469 Event: Caller handler : Ready
+On: 2011-09-12 15:27:38.783485 Event: init Receiver
+On: 2011-09-12 15:27:38.783497 Event: GSMRZ1
+On: 2011-09-12 15:27:40.788420 Event: Connected to Receiver Handler
+On: 2011-09-12 15:27:40.788631 Event: Receiver Handler respond
+On: 2011-09-12 15:27:40.788693 Event: Receiver handler : Ready
+On: 2011-09-12 15:27:40.788707 Event: Start Call
+On: 2011-09-12 15:27:40.788743 Event: Waiting Feedback
+On: 2011-09-12 15:27:46.383940 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:28:25.079719 ------------------
+On: 2011-09-12 15:28:25.079863 Event: init Caller
+On: 2011-09-12 15:28:25.079904 Event: sip
+On: 2011-09-12 15:28:27.084713 Event: Connected to Caller Handler
+On: 2011-09-12 15:28:27.084928 Event: Caller Handler respond
+On: 2011-09-12 15:28:27.085214 Event: Caller handler : Ready
+On: 2011-09-12 15:28:27.085231 Event: init Receiver
+On: 2011-09-12 15:28:27.085266 Event: GSMRZ1
+On: 2011-09-12 15:28:29.089098 Event: Connected to Receiver Handler
+On: 2011-09-12 15:28:29.089321 Event: Receiver Handler respond
+On: 2011-09-12 15:28:29.089394 Event: Receiver handler : Ready
+On: 2011-09-12 15:28:29.089411 Event: Start Call
+On: 2011-09-12 15:28:29.089450 Event: Waiting Feedback
+On: 2011-09-12 15:28:34.667915 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:32:13.440099 ------------------
+On: 2011-09-12 15:32:13.440204 Event: init Caller
+On: 2011-09-12 15:32:13.440235 Event: sip
+On: 2011-09-12 15:32:15.444023 Event: Connected to Caller Handler
+On: 2011-09-12 15:32:15.444129 Event: Caller Handler respond
+On: 2011-09-12 15:32:15.444437 Event: Caller handler : Ready
+On: 2011-09-12 15:32:15.444456 Event: init Receiver
+On: 2011-09-12 15:32:15.444471 Event: GSMRZ1
+On: 2011-09-12 15:32:17.448107 Event: Connected to Receiver Handler
+On: 2011-09-12 15:32:17.448246 Event: Receiver Handler respond
+On: 2011-09-12 15:32:17.448308 Event: Receiver handler : Ready
+On: 2011-09-12 15:32:17.448322 Event: Start Call
+On: 2011-09-12 15:32:17.448357 Event: Waiting Feedback
+On: 2011-09-12 15:32:23.207912 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:35:08.100387 ------------------
+On: 2011-09-12 15:35:08.100419 Event: init Caller
+On: 2011-09-12 15:35:08.100428 Event: sip
+On: 2011-09-12 15:35:10.104745 Event: Connected to Caller Handler
+On: 2011-09-12 15:35:10.104964 Event: Caller Handler respond
+On: 2011-09-12 15:35:10.105834 Event: Caller handler : Ready
+On: 2011-09-12 15:35:10.105898 Event: init Receiver
+On: 2011-09-12 15:35:10.105932 Event: GSMRZ1
+On: 2011-09-12 15:35:12.110002 Event: Connected to Receiver Handler
+On: 2011-09-12 15:35:12.110443 Event: Receiver Handler respond
+On: 2011-09-12 15:35:12.110680 Event: Receiver handler : Ready
+On: 2011-09-12 15:35:12.110734 Event: Start Call
+On: 2011-09-12 15:35:12.110858 Event: Waiting Feedback
+On: 2011-09-12 15:35:17.147916 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:44:47.298852 ------------------
+On: 2011-09-12 15:44:47.298992 Event: init Caller
+On: 2011-09-12 15:44:47.299047 Event: sip
+On: 2011-09-12 15:44:49.310051 Event: Connected to Caller Handler
+On: 2011-09-12 15:44:49.310150 Event: Caller Handler respond
+On: 2011-09-12 15:44:49.310425 Event: Caller handler : Ready
+On: 2011-09-12 15:44:49.310441 Event: init Receiver
+On: 2011-09-12 15:44:49.310453 Event: GSMRZ1
+On: 2011-09-12 15:44:51.312180 Event: Connected to Receiver Handler
+On: 2011-09-12 15:44:51.312382 Event: Receiver Handler respond
+On: 2011-09-12 15:44:51.312452 Event: Receiver handler : Ready
+On: 2011-09-12 15:44:51.312463 Event: Start Call
+On: 2011-09-12 15:44:51.312488 Event: Waiting Feedback
+On: 2011-09-12 15:44:56.207969 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:45:56.339850 ------------------
+On: 2011-09-12 15:45:56.339891 Event: init Caller
+On: 2011-09-12 15:45:56.339905 Event: sip
+On: 2011-09-12 15:45:58.344175 Event: Connected to Caller Handler
+On: 2011-09-12 15:45:58.344273 Event: Caller Handler respond
+On: 2011-09-12 15:45:58.344554 Event: Caller handler : Ready
+On: 2011-09-12 15:45:58.344569 Event: init Receiver
+On: 2011-09-12 15:45:58.344580 Event: GSMRZ1
+On: 2011-09-12 15:46:00.348151 Event: Connected to Receiver Handler
+On: 2011-09-12 15:46:00.348300 Event: Receiver Handler respond
+On: 2011-09-12 15:46:00.348411 Event: Receiver handler : Ready
+On: 2011-09-12 15:46:00.348425 Event: Start Call
+On: 2011-09-12 15:46:00.348459 Event: Waiting Feedback
+On: 2011-09-12 15:46:05.651926 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:47:38.080001 ------------------
+On: 2011-09-12 15:47:38.080043 Event: init Caller
+On: 2011-09-12 15:47:38.080056 Event: sip
+On: 2011-09-12 15:47:40.082968 Event: Connected to Caller Handler
+On: 2011-09-12 15:47:40.083282 Event: Caller Handler respond
+On: 2011-09-12 15:47:40.084342 Event: Caller handler : Ready
+On: 2011-09-12 15:47:40.084404 Event: init Receiver
+On: 2011-09-12 15:47:40.084458 Event: GSMRZ1
+On: 2011-09-12 15:47:42.088511 Event: Connected to Receiver Handler
+On: 2011-09-12 15:47:42.088738 Event: Receiver Handler respond
+On: 2011-09-12 15:47:42.088900 Event: Receiver handler : Ready
+On: 2011-09-12 15:47:42.088955 Event: Start Call
+On: 2011-09-12 15:47:42.089086 Event: Waiting Feedback
+On: 2011-09-12 15:47:47.091912 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:53:45.383372 ------------------
+On: 2011-09-12 15:53:45.383404 Event: init Caller
+On: 2011-09-12 15:53:45.383413 Event: sip
+On: 2011-09-12 15:53:47.386626 Event: Connected to Caller Handler
+On: 2011-09-12 15:53:57.386765 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:54:15.000416 ------------------
+On: 2011-09-12 15:54:15.000458 Event: init Caller
+On: 2011-09-12 15:54:15.000471 Event: sip
+On: 2011-09-12 15:54:17.012378 Event: Connected to Caller Handler
+On: 2011-09-12 15:54:27.012517 Event: 999 General Handler Error: Could not connect to Caller handler
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:55:01.248710 ------------------
+On: 2011-09-12 15:55:01.248776 Event: init Caller
+On: 2011-09-12 15:55:01.248793 Event: sip
+On: 2011-09-12 15:55:03.252890 Event: Connected to Caller Handler
+On: 2011-09-12 15:55:03.253437 Event: Caller Handler respond
+On: 2011-09-12 15:55:03.254690 Event: Caller handler : Ready
+On: 2011-09-12 15:55:03.254744 Event: init Receiver
+On: 2011-09-12 15:55:03.254787 Event: GSMRZ1
+On: 2011-09-12 15:55:05.261160 Event: Connected to Receiver Handler
+On: 2011-09-12 15:55:05.261551 Event: Receiver Handler respond
+On: 2011-09-12 15:55:05.261744 Event: Receiver handler : Ready
+On: 2011-09-12 15:55:05.261788 Event: Start Call
+On: 2011-09-12 15:55:05.261885 Event: Waiting Feedback
+On: 2011-09-12 15:55:10.551910 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 15:57:53.185530 ------------------
+On: 2011-09-12 15:57:53.185580 Event: init Caller
+On: 2011-09-12 15:57:53.185593 Event: sip
+On: 2011-09-12 15:57:55.190881 Event: Connected to Caller Handler
+On: 2011-09-12 15:57:55.191202 Event: Caller Handler respond
+On: 2011-09-12 15:57:55.192219 Event: Caller handler : Ready
+On: 2011-09-12 15:57:55.192280 Event: init Receiver
+On: 2011-09-12 15:57:55.192316 Event: GSMRZ1
+On: 2011-09-12 15:57:57.197288 Event: Connected to Receiver Handler
+On: 2011-09-12 15:57:57.197451 Event: Receiver Handler respond
+On: 2011-09-12 15:57:57.197521 Event: Receiver handler : Ready
+On: 2011-09-12 15:57:57.197536 Event: Start Call
+On: 2011-09-12 15:57:57.197587 Event: Waiting Feedback
+On: 2011-09-12 15:58:02.635903 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:02:31.594819 ------------------
+On: 2011-09-12 16:02:31.594942 Event: init Caller
+On: 2011-09-12 16:02:31.594997 Event: sip
+On: 2011-09-12 16:02:33.598064 Event: Connected to Caller Handler
+On: 2011-09-12 16:02:33.598239 Event: Caller Handler respond
+On: 2011-09-12 16:02:33.598680 Event: Caller handler : Ready
+On: 2011-09-12 16:02:33.598708 Event: init Receiver
+On: 2011-09-12 16:02:33.598742 Event: GSMRZ1
+On: 2011-09-12 16:02:35.604197 Event: Connected to Receiver Handler
+On: 2011-09-12 16:02:35.604461 Event: Receiver Handler respond
+On: 2011-09-12 16:02:35.604629 Event: Receiver handler : Ready
+On: 2011-09-12 16:02:35.604655 Event: Start Call
+On: 2011-09-12 16:02:35.604691 Event: Waiting Feedback
+On: 2011-09-12 16:02:41.331907 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:05:09.592109 ------------------
+On: 2011-09-12 16:05:09.592184 Event: init Caller
+On: 2011-09-12 16:05:09.592212 Event: sip
+On: 2011-09-12 16:05:11.597239 Event: Connected to Caller Handler
+On: 2011-09-12 16:05:11.597538 Event: Caller Handler respond
+On: 2011-09-12 16:05:11.597994 Event: Caller handler : Ready
+On: 2011-09-12 16:05:11.598009 Event: init Receiver
+On: 2011-09-12 16:05:11.598018 Event: GSMRZ1
+On: 2011-09-12 16:05:13.603519 Event: Connected to Receiver Handler
+On: 2011-09-12 16:05:13.603802 Event: Receiver Handler respond
+On: 2011-09-12 16:05:13.604119 Event: Receiver handler : Ready
+On: 2011-09-12 16:05:13.604157 Event: Start Call
+On: 2011-09-12 16:05:13.604232 Event: Waiting Feedback
+On: 2011-09-12 16:05:19.495916 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:08:29.324953 ------------------
+On: 2011-09-12 16:08:29.325061 Event: init Caller
+On: 2011-09-12 16:08:29.325100 Event: sip
+On: 2011-09-12 16:08:31.332587 Event: Connected to Caller Handler
+On: 2011-09-12 16:08:31.332869 Event: Caller Handler respond
+On: 2011-09-12 16:08:31.333704 Event: Caller handler : Ready
+On: 2011-09-12 16:08:31.333740 Event: init Receiver
+On: 2011-09-12 16:08:31.333763 Event: GSMRZ1
+On: 2011-09-12 16:08:33.337712 Event: Connected to Receiver Handler
+On: 2011-09-12 16:08:33.337854 Event: Receiver Handler respond
+On: 2011-09-12 16:08:33.337919 Event: Receiver handler : Ready
+On: 2011-09-12 16:08:33.337934 Event: Start Call
+On: 2011-09-12 16:08:33.337972 Event: Waiting Feedback
+On: 2011-09-12 16:08:39.355884 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:11:31.945294 ------------------
+On: 2011-09-12 16:11:31.945341 Event: init Caller
+On: 2011-09-12 16:11:31.945355 Event: sip
+On: 2011-09-12 16:11:33.948245 Event: Connected to Caller Handler
+On: 2011-09-12 16:11:33.948388 Event: Caller Handler respond
+On: 2011-09-12 16:11:33.948742 Event: Caller handler : Ready
+On: 2011-09-12 16:11:33.948756 Event: init Receiver
+On: 2011-09-12 16:11:33.948767 Event: GSMRZ1
+On: 2011-09-12 16:11:35.951477 Event: Connected to Receiver Handler
+On: 2011-09-12 16:11:35.952027 Event: Receiver Handler respond
+On: 2011-09-12 16:11:35.952446 Event: Receiver handler : Ready
+On: 2011-09-12 16:11:35.952518 Event: Start Call
+On: 2011-09-12 16:11:35.952658 Event: Waiting Feedback
+On: 2011-09-12 16:11:41.543987 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:12:10.887381 ------------------
+On: 2011-09-12 16:12:10.887486 Event: init Caller
+On: 2011-09-12 16:12:10.887519 Event: sip
+On: 2011-09-12 16:12:12.899399 Event: Connected to Caller Handler
+On: 2011-09-12 16:12:12.899678 Event: Caller Handler respond
+On: 2011-09-12 16:12:12.900753 Event: Caller handler : Ready
+On: 2011-09-12 16:12:12.900831 Event: init Receiver
+On: 2011-09-12 16:12:12.900841 Event: GSMRZ1
+On: 2011-09-12 16:12:14.905413 Event: Connected to Receiver Handler
+On: 2011-09-12 16:12:14.905713 Event: Receiver Handler respond
+On: 2011-09-12 16:12:14.905898 Event: Receiver handler : Ready
+On: 2011-09-12 16:12:14.905938 Event: Start Call
+On: 2011-09-12 16:12:14.905995 Event: Waiting Feedback
+On: 2011-09-12 16:12:20.399932 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:15:14.715723 ------------------
+On: 2011-09-12 16:15:14.715756 Event: init Caller
+On: 2011-09-12 16:15:14.715766 Event: sip
+On: 2011-09-12 16:15:16.718783 Event: Connected to Caller Handler
+On: 2011-09-12 16:15:16.718887 Event: Caller Handler respond
+On: 2011-09-12 16:15:16.719163 Event: Caller handler : Ready
+On: 2011-09-12 16:15:16.719180 Event: init Receiver
+On: 2011-09-12 16:15:16.719193 Event: GSMRZ1
+On: 2011-09-12 16:15:18.724543 Event: Connected to Receiver Handler
+On: 2011-09-12 16:15:18.724972 Event: Receiver Handler respond
+On: 2011-09-12 16:15:18.725288 Event: Receiver handler : Ready
+On: 2011-09-12 16:15:18.725334 Event: Start Call
+On: 2011-09-12 16:15:18.725438 Event: Waiting Feedback
+On: 2011-09-12 16:15:23.999909 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:18:24.801300 ------------------
+On: 2011-09-12 16:18:24.801410 Event: init Caller
+On: 2011-09-12 16:18:24.801442 Event: sip
+On: 2011-09-12 16:18:26.806305 Event: Connected to Caller Handler
+On: 2011-09-12 16:18:26.806389 Event: Caller Handler respond
+On: 2011-09-12 16:18:26.806726 Event: Caller handler : Ready
+On: 2011-09-12 16:18:26.806739 Event: init Receiver
+On: 2011-09-12 16:18:26.806748 Event: GSMRZ1
+On: 2011-09-12 16:18:28.809700 Event: Connected to Receiver Handler
+On: 2011-09-12 16:18:28.809995 Event: Receiver Handler respond
+On: 2011-09-12 16:18:28.810132 Event: Receiver handler : Ready
+On: 2011-09-12 16:18:28.810157 Event: Start Call
+On: 2011-09-12 16:18:28.810209 Event: Waiting Feedback
+On: 2011-09-12 16:18:34.635897 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:18:58.791058 ------------------
+On: 2011-09-12 16:18:58.791109 Event: init Caller
+On: 2011-09-12 16:18:58.791122 Event: sip
+On: 2011-09-12 16:19:00.794608 Event: Connected to Caller Handler
+On: 2011-09-12 16:19:00.794868 Event: Caller Handler respond
+On: 2011-09-12 16:19:00.795590 Event: Caller handler : Ready
+On: 2011-09-12 16:19:00.795639 Event: init Receiver
+On: 2011-09-12 16:19:00.795683 Event: GSMRZ1
+On: 2011-09-12 16:19:02.800546 Event: Connected to Receiver Handler
+On: 2011-09-12 16:19:02.800692 Event: Receiver Handler respond
+On: 2011-09-12 16:19:02.800750 Event: Receiver handler : Ready
+On: 2011-09-12 16:19:02.800764 Event: Start Call
+On: 2011-09-12 16:19:02.800799 Event: Waiting Feedback
+On: 2011-09-12 16:19:07.579909 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:20:40.718551 ------------------
+On: 2011-09-12 16:20:40.718585 Event: init Caller
+On: 2011-09-12 16:20:40.718594 Event: sip
+On: 2011-09-12 16:20:42.723573 Event: Connected to Caller Handler
+On: 2011-09-12 16:20:42.723900 Event: Caller Handler respond
+On: 2011-09-12 16:20:42.724823 Event: Caller handler : Ready
+On: 2011-09-12 16:20:42.724882 Event: init Receiver
+On: 2011-09-12 16:20:42.724915 Event: GSMRZ1
+On: 2011-09-12 16:20:44.730847 Event: Connected to Receiver Handler
+On: 2011-09-12 16:20:44.731339 Event: Receiver Handler respond
+On: 2011-09-12 16:20:44.731596 Event: Receiver handler : Ready
+On: 2011-09-12 16:20:44.731655 Event: Start Call
+On: 2011-09-12 16:20:44.731790 Event: Waiting Feedback
+On: 2011-09-12 16:20:49.983881 Event: Test Succeed
+
+
+------------------STARTED THE LOGGING 2011-09-12 16:23:21.764250 ------------------
+On: 2011-09-12 16:23:21.764356 Event: init Caller
+On: 2011-09-12 16:23:21.764389 Event: sip
+On: 2011-09-12 16:23:23.769985 Event: Connected to Caller Handler
+On: 2011-09-12 16:23:23.770303 Event: Caller Handler respond
+On: 2011-09-12 16:23:23.771161 Event: Caller handler : Ready
+On: 2011-09-12 16:23:23.771218 Event: init Receiver
+On: 2011-09-12 16:23:23.771253 Event: GSMRZ1
+On: 2011-09-12 16:23:25.775726 Event: Connected to Receiver Handler
+On: 2011-09-12 16:23:25.776442 Event: Receiver Handler respond
+On: 2011-09-12 16:23:25.776696 Event: Receiver handler : Ready
+On: 2011-09-12 16:23:25.776754 Event: Start Call
+On: 2011-09-12 16:23:25.776887 Event: Waiting Feedback
+On: 2011-09-12 16:23:31.215906 Event: Test Succeed
diff --git a/notFinishedCode/tricode/University SIP handler.log b/notFinishedCode/tricode/University SIP handler.log
new file mode 100755
index 0000000..719aa51
--- /dev/null
+++ b/notFinishedCode/tricode/University SIP handler.log
@@ -0,0 +1,184 @@
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:04:32.304692 ------------------
+On: 2011-09-02 13:04:32.326564 Event: try to Connect to Controller
+On: 2011-09-02 13:04:33.594674 Event: init state
+On: 2011-09-02 13:04:33.594893 Event: Register Account to SIP server
+On: 2011-09-02 13:04:33.595281 Event: 100
+On: 2011-09-02 13:04:33.595360 Event: Receiver Handler Ready
+On: 2011-09-02 13:04:33.595726 Event: RECEIVE START
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:09:15.977494 ------------------
+On: 2011-09-02 13:09:15.998474 Event: try to Connect to Controller
+On: 2011-09-02 13:09:17.258282 Event: init state
+On: 2011-09-02 13:09:17.258513 Event: Register Account to SIP server
+On: 2011-09-02 13:09:17.258914 Event: 100
+On: 2011-09-02 13:09:17.258990 Event: Receiver Handler Ready
+On: 2011-09-02 13:09:17.259293 Event: RECEIVE START
+On: 2011-09-02 13:09:20.302293 Event: {Call "mpselftest1" <sip:4661928@132.230.252.228>}
+On: 2011-09-02 13:09:20.302735 Event: Call Connecting
+On: 2011-09-02 13:09:20.302771 Event: 200
+On: 2011-09-02 13:09:20.302916 Event: Answer call
+On: 2011-09-02 13:09:20.302948 Event: Hangup call
+On: 2011-09-02 13:09:20.303101 Event: CALL OK
+On: 2011-09-02 13:09:20.318751 Event: Terminate
+On: 2011-09-02 13:09:20.318809 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-02 13:15:53.384248 ------------------
+On: 2011-09-02 13:15:53.404888 Event: try to Connect to Controller
+On: 2011-09-02 13:15:54.645917 Event: init state
+On: 2011-09-02 13:15:54.646162 Event: Register Account to SIP server
+On: 2011-09-02 13:15:54.646926 Event: 100
+On: 2011-09-02 13:15:54.647006 Event: Receiver Handler Ready
+On: 2011-09-02 13:15:54.647317 Event: RECEIVE START
+On: 2011-09-02 13:15:57.703829 Event: {Call "mpselftest1" <sip:4661928@132.230.252.228>}
+On: 2011-09-02 13:15:57.704282 Event: Call Connecting
+On: 2011-09-02 13:15:57.704321 Event: 200
+On: 2011-09-02 13:15:57.704467 Event: Answer call
+On: 2011-09-02 13:15:57.704499 Event: Hangup call
+On: 2011-09-02 13:15:57.704653 Event: CALL OK
+On: 2011-09-02 13:15:57.762627 Event: Terminate
+On: 2011-09-02 13:15:57.762682 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:04:29.084275 ------------------
+On: 2011-09-09 12:04:29.105612 Event: try to Connect to Controller
+On: 2011-09-09 12:04:30.392727 Event: init state
+On: 2011-09-09 12:04:30.392956 Event: Register Account to SIP server
+On: 2011-09-09 12:04:30.393369 Event: 100
+On: 2011-09-09 12:04:30.393492 Event: Receiver Handler Ready
+On: 2011-09-09 12:04:30.393794 Event: RECEIVE START
+On: 2011-09-09 12:04:33.406739 Event: {Call "mpselftest1" <sip:4661928@132.230.252.228>}
+On: 2011-09-09 12:04:33.407190 Event: Call Connecting
+On: 2011-09-09 12:04:33.407228 Event: 200
+On: 2011-09-09 12:04:33.407372 Event: Answer call
+On: 2011-09-09 12:04:33.407404 Event: Hangup call
+On: 2011-09-09 12:04:33.407554 Event: CALL OK
+On: 2011-09-09 12:04:33.442980 Event: Terminate
+On: 2011-09-09 12:04:33.443020 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:46:21.313738 ------------------
+On: 2011-09-09 12:46:21.334312 Event: try to Connect to Controller
+On: 2011-09-09 12:46:22.544750 Event: init state
+On: 2011-09-09 12:46:22.544990 Event: Register Account to SIP server
+On: 2011-09-09 12:46:22.545449 Event: 100
+On: 2011-09-09 12:46:22.545533 Event: Receiver Handler Ready
+On: 2011-09-09 12:46:22.545841 Event: RECEIVE START
+On: 2011-09-09 12:46:25.582830 Event: {Call "mpselftest1" <sip:4661928@132.230.252.228>}
+On: 2011-09-09 12:46:25.583290 Event: Call Connecting
+On: 2011-09-09 12:46:25.583330 Event: 200
+On: 2011-09-09 12:46:25.583479 Event: Answer call
+On: 2011-09-09 12:46:25.583511 Event: Hangup call
+On: 2011-09-09 12:46:25.583669 Event: CALL OK
+On: 2011-09-09 12:46:25.621186 Event: Terminate
+On: 2011-09-09 12:46:25.621244 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:49:48.195086 ------------------
+On: 2011-09-09 12:49:48.215338 Event: try to Connect to Controller
+On: 2011-09-09 12:49:49.490355 Event: init state
+On: 2011-09-09 12:49:49.490592 Event: Register Account to SIP server
+On: 2011-09-09 12:49:49.491014 Event: 100
+On: 2011-09-09 12:49:49.491099 Event: Receiver Handler Ready
+On: 2011-09-09 12:49:49.491411 Event: RECEIVE START
+On: 2011-09-09 12:49:52.517371 Event: {Call "mpselftest1" <sip:4661928@132.230.252.228>}
+On: 2011-09-09 12:49:52.517908 Event: Call Connecting
+On: 2011-09-09 12:49:52.517951 Event: 200
+On: 2011-09-09 12:49:52.518098 Event: Answer call
+On: 2011-09-09 12:49:52.518129 Event: Hangup call
+On: 2011-09-09 12:49:52.518284 Event: CALL OK
+On: 2011-09-09 12:49:52.570535 Event: Terminate
+On: 2011-09-09 12:49:52.570596 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 12:50:14.891424 ------------------
+On: 2011-09-09 12:50:14.936914 Event: try to Connect to Controller
+On: 2011-09-09 12:50:16.124750 Event: init state
+On: 2011-09-09 12:50:16.124983 Event: Register Account to SIP server
+On: 2011-09-09 12:50:16.125436 Event: 100
+On: 2011-09-09 12:50:16.125523 Event: Receiver Handler Ready
+On: 2011-09-09 12:50:16.129709 Event: RECEIVE START
+On: 2011-09-09 12:50:18.370496 Event: {Call "RZ-GSM" <sip:4661447@132.230.252.228>}
+On: 2011-09-09 12:50:18.370955 Event: Call Connecting
+On: 2011-09-09 12:50:18.370992 Event: 200
+On: 2011-09-09 12:50:18.371140 Event: Answer call
+On: 2011-09-09 12:50:18.371172 Event: Hangup call
+On: 2011-09-09 12:50:18.371328 Event: CALL OK
+On: 2011-09-09 12:50:18.472220 Event: Call Disconnected
+On: 2011-09-09 12:50:19.921802 Event: Terminate
+On: 2011-09-09 12:50:19.921842 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:07:32.278782 ------------------
+On: 2011-09-09 13:07:32.299423 Event: try to Connect to Controller
+On: 2011-09-09 13:07:33.590429 Event: init state
+On: 2011-09-09 13:07:33.590655 Event: Register Account to SIP server
+On: 2011-09-09 13:07:33.591069 Event: 100
+On: 2011-09-09 13:07:33.591151 Event: Receiver Handler Ready
+On: 2011-09-09 13:07:33.591458 Event: RECEIVE START
+On: 2011-09-09 13:07:36.649672 Event: {Call "mpselftest1" <sip:4661928@132.230.252.228>}
+On: 2011-09-09 13:07:36.650122 Event: Call Connecting
+On: 2011-09-09 13:07:36.650161 Event: 200
+On: 2011-09-09 13:07:36.650309 Event: Answer call
+On: 2011-09-09 13:07:36.650340 Event: Hangup call
+On: 2011-09-09 13:07:36.650497 Event: CALL OK
+On: 2011-09-09 13:07:36.678333 Event: Terminate
+On: 2011-09-09 13:07:36.678394 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 13:08:00.165614 ------------------
+On: 2011-09-09 13:08:00.186025 Event: try to Connect to Controller
+On: 2011-09-09 13:08:01.398081 Event: init state
+On: 2011-09-09 13:08:01.398313 Event: Register Account to SIP server
+On: 2011-09-09 13:08:01.398714 Event: 100
+On: 2011-09-09 13:08:01.398800 Event: Receiver Handler Ready
+On: 2011-09-09 13:08:01.401705 Event: RECEIVE START
+On: 2011-09-09 13:08:03.207171 Event: {Call "RZ-GSM" <sip:4661447@132.230.252.228>}
+On: 2011-09-09 13:08:03.207631 Event: Call Connecting
+On: 2011-09-09 13:08:03.207667 Event: 200
+On: 2011-09-09 13:08:03.207816 Event: Answer call
+On: 2011-09-09 13:08:03.207847 Event: Hangup call
+On: 2011-09-09 13:08:03.208004 Event: CALL OK
+On: 2011-09-09 13:08:03.309111 Event: Call Disconnected
+On: 2011-09-09 13:08:04.657806 Event: Terminate
+On: 2011-09-09 13:08:04.657845 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 16:28:02.715191 ------------------
+On: 2011-09-09 16:28:02.735656 Event: try to Connect to Controller
+On: 2011-09-09 16:28:04.050616 Event: init state
+On: 2011-09-09 16:28:04.050846 Event: Register Account to SIP server
+On: 2011-09-09 16:28:04.051267 Event: 100
+On: 2011-09-09 16:28:04.051354 Event: Receiver Handler Ready
+On: 2011-09-09 16:28:04.051668 Event: RECEIVE START
+On: 2011-09-09 16:28:07.090304 Event: {Call "mpselftest1" <sip:4661928@132.230.252.228>}
+On: 2011-09-09 16:28:07.090768 Event: Call Connecting
+On: 2011-09-09 16:28:07.090805 Event: 200
+On: 2011-09-09 16:28:07.090952 Event: Answer call
+On: 2011-09-09 16:28:07.090983 Event: Hangup call
+On: 2011-09-09 16:28:07.091140 Event: CALL OK
+On: 2011-09-09 16:28:07.103922 Event: Terminate
+On: 2011-09-09 16:28:07.103986 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:08:01.714588 ------------------
+On: 2011-09-09 21:08:01.735512 Event: try to Connect to Controller
+On: 2011-09-09 21:08:02.981051 Event: init state
+On: 2011-09-09 21:08:02.981281 Event: Register Account to SIP server
+On: 2011-09-09 21:08:02.981731 Event: 100
+On: 2011-09-09 21:08:02.981817 Event: Caller Handler Ready
+On: 2011-09-09 21:08:04.986563 Event: Terminate
+On: 2011-09-09 21:08:04.986601 Event: Goodbye
+
+
+------------------STARTED THE LOGGING 2011-09-09 21:08:54.198907 ------------------
+On: 2011-09-09 21:08:54.219863 Event: try to Connect to Controller
+On: 2011-09-09 21:08:55.451295 Event: init state
+On: 2011-09-09 21:08:55.451563 Event: Register Account to SIP server
+On: 2011-09-09 21:08:55.451977 Event: 100
+On: 2011-09-09 21:08:55.452058 Event: Caller Handler Ready
+On: 2011-09-09 21:08:57.466097 Event: Terminate
+On: 2011-09-09 21:08:57.466137 Event: Goodbye
diff --git a/notFinishedCode/tricode/class/pBarcode128.class.php b/notFinishedCode/tricode/class/pBarcode128.class.php
new file mode 100644
index 0000000..07f5db8
--- /dev/null
+++ b/notFinishedCode/tricode/class/pBarcode128.class.php
@@ -0,0 +1,184 @@
+<?php
+ /*
+ pBarcode128 - class to create barcodes (128B)
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ /* pData class definition */
+ class pBarcode128
+ {
+ var $Codes;
+ var $Reverse;
+ var $Result;
+ var $pChartObject;
+ var $CRC;
+
+ /* Class creator */
+ function pBarcode128($BasePath="")
+ {
+ $this->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/notFinishedCode/tricode/class/pBarcode39.class.php b/notFinishedCode/tricode/class/pBarcode39.class.php
new file mode 100644
index 0000000..8d57b71
--- /dev/null
+++ b/notFinishedCode/tricode/class/pBarcode39.class.php
@@ -0,0 +1,200 @@
+<?php
+ /*
+ pBarcode39 - class to create barcodes (39B)
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ /* pData class definition */
+ class pBarcode39
+ {
+ var $Codes;
+ var $Reverse;
+ var $Result;
+ var $pChartObject;
+ var $CRC;
+ var $MOD43;
+
+ /* Class creator */
+ function pBarcode39($BasePath="",$EnableMOD43=FALSE)
+ {
+ $this->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/notFinishedCode/tricode/class/pBubble.class.php b/notFinishedCode/tricode/class/pBubble.class.php
new file mode 100644
index 0000000..483a1f3
--- /dev/null
+++ b/notFinishedCode/tricode/class/pBubble.class.php
@@ -0,0 +1,283 @@
+<?php
+ /*
+ pBubble - class to draw bubble charts
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ /* pBubble class definition */
+ class pBubble
+ {
+ var $pChartObject;
+ var $pDataObject;
+
+ /* Class creator */
+ function pBubble($pChartObject,$pDataObject)
+ {
+ $this->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/notFinishedCode/tricode/class/pCache.class.php b/notFinishedCode/tricode/class/pCache.class.php
new file mode 100644
index 0000000..07d1d4e
--- /dev/null
+++ b/notFinishedCode/tricode/class/pCache.class.php
@@ -0,0 +1,280 @@
+<?php
+ /*
+ pCache - speed up the rendering by caching up the pictures
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ /* pData class definition */
+ class pCache
+ {
+ var $CacheFolder;
+ var $CacheIndex;
+ var $CacheDB;
+
+ /* Class creator */
+ function pCache($Settings="")
+ {
+ $CacheFolder = isset($Settings["CacheFolder"]) ? $Settings["CacheFolder"] : "cache";
+ $CacheIndex = isset($Settings["CacheIndex"]) ? $Settings["CacheIndex"] : "index.db";
+ $CacheDB = isset($Settings["CacheDB"]) ? $Settings["CacheDB"] : "cache.db";
+
+ $this->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/notFinishedCode/tricode/class/pData.class.php b/notFinishedCode/tricode/class/pData.class.php
new file mode 100644
index 0000000..9cfbc3f
--- /dev/null
+++ b/notFinishedCode/tricode/class/pData.class.php
@@ -0,0 +1,723 @@
+<?php
+ /*
+ pDraw - class to manipulate data arrays
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ /* Axis configuration */
+ define("AXIS_FORMAT_DEFAULT" , 680001);
+ define("AXIS_FORMAT_TIME" , 680002);
+ define("AXIS_FORMAT_DATE" , 680003);
+ define("AXIS_FORMAT_METRIC" , 680004);
+ define("AXIS_FORMAT_CURRENCY" , 680005);
+
+ /* Axis position */
+ define("AXIS_POSITION_LEFT" , 681001);
+ define("AXIS_POSITION_RIGHT" , 681002);
+ define("AXIS_POSITION_TOP" , 681001);
+ define("AXIS_POSITION_BOTTOM" , 681002);
+
+ /* Families of data points */
+ define("SERIE_SHAPE_FILLEDCIRCLE" , 681011);
+ define("SERIE_SHAPE_FILLEDTRIANGLE" , 681012);
+ define("SERIE_SHAPE_FILLEDSQUARE" , 681013);
+ define("SERIE_SHAPE_FILLEDDIAMOND" , 681017);
+ define("SERIE_SHAPE_CIRCLE" , 681014);
+ define("SERIE_SHAPE_TRIANGLE" , 681015);
+ define("SERIE_SHAPE_SQUARE" , 681016);
+ define("SERIE_SHAPE_DIAMOND" , 681018);
+
+ /* Axis position */
+ define("AXIS_X" , 682001);
+ define("AXIS_Y" , 682002);
+
+ /* Define value limits */
+ define("ABSOLUTE_MIN" , -10000000000000);
+ define("ABSOLUTE_MAX" , 10000000000000);
+
+ /* Replacement to the PHP NULL keyword */
+ define("VOID" , 0.123456789);
+
+ /* pData class definition */
+ class pData
+ {
+ var $Data;
+
+ var $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"=>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/notFinishedCode/tricode/class/pDraw.class.php b/notFinishedCode/tricode/class/pDraw.class.php
new file mode 100644
index 0000000..85e408e
--- /dev/null
+++ b/notFinishedCode/tricode/class/pDraw.class.php
@@ -0,0 +1,5799 @@
+<?php
+ /*
+ pDraw - class extension with drawing methods
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("DIRECTION_VERTICAL" , 690001);
+ define("DIRECTION_HORIZONTAL" , 690002);
+
+ define("SCALE_POS_LEFTRIGHT" , 690101);
+ define("SCALE_POS_TOPBOTTOM" , 690102);
+
+ define("SCALE_MODE_FLOATING" , 690201);
+ define("SCALE_MODE_START0" , 690202);
+ define("SCALE_MODE_ADDALL" , 690203);
+ define("SCALE_MODE_ADDALL_START0" , 690204);
+ define("SCALE_MODE_MANUAL" , 690205);
+
+ define("SCALE_SKIP_NONE" , 690301);
+ define("SCALE_SKIP_SAME" , 690302);
+ define("SCALE_SKIP_NUMBERS" , 690303);
+
+ define("TEXT_ALIGN_TOPLEFT" , 690401);
+ define("TEXT_ALIGN_TOPMIDDLE" , 690402);
+ define("TEXT_ALIGN_TOPRIGHT" , 690403);
+ define("TEXT_ALIGN_MIDDLELEFT" , 690404);
+ define("TEXT_ALIGN_MIDDLEMIDDLE" , 690405);
+ define("TEXT_ALIGN_MIDDLERIGHT" , 690406);
+ define("TEXT_ALIGN_BOTTOMLEFT" , 690407);
+ define("TEXT_ALIGN_BOTTOMMIDDLE" , 690408);
+ define("TEXT_ALIGN_BOTTOMRIGHT" , 690409);
+
+ define("POSITION_TOP" , 690501);
+ define("POSITION_BOTTOM" , 690502);
+
+ define("LABEL_POS_LEFT" , 690601);
+ define("LABEL_POS_CENTER" , 690602);
+ define("LABEL_POS_RIGHT" , 690603);
+ define("LABEL_POS_TOP" , 690604);
+ define("LABEL_POS_BOTTOM" , 690605);
+ define("LABEL_POS_INSIDE" , 690606);
+ define("LABEL_POS_OUTSIDE" , 690607);
+
+ define("ORIENTATION_HORIZONTAL" , 690701);
+ define("ORIENTATION_VERTICAL" , 690702);
+
+ define("LEGEND_NOBORDER" , 690800);
+ define("LEGEND_BOX" , 690801);
+ define("LEGEND_ROUND" , 690802);
+
+ define("LEGEND_VERTICAL" , 690901);
+ define("LEGEND_HORIZONTAL" , 690902);
+
+ define("LEGEND_FAMILY_BOX" , 691051);
+ define("LEGEND_FAMILY_CIRCLE" , 691052);
+ define("LEGEND_FAMILY_LINE" , 691053);
+
+ define("DISPLAY_AUTO" , 691001);
+ define("DISPLAY_MANUAL" , 691002);
+
+ define("LABELING_ALL" , 691011);
+ define("LABELING_DIFFERENT" , 691012);
+
+ define("BOUND_MIN" , 691021);
+ define("BOUND_MAX" , 691022);
+ define("BOUND_BOTH" , 691023);
+
+ define("BOUND_LABEL_POS_TOP" , 691031);
+ define("BOUND_LABEL_POS_BOTTOM" , 691032);
+ define("BOUND_LABEL_POS_AUTO" , 691033);
+
+ define("CAPTION_LEFT_TOP" , 691041);
+ define("CAPTION_RIGHT_BOTTOM" , 691042);
+
+ define("GRADIENT_SIMPLE" , 691051);
+ define("GRADIENT_EFFECT_CAN" , 691052);
+
+ define("LABEL_TITLE_NOBACKGROUND" , 691061);
+ define("LABEL_TITLE_BACKGROUND" , 691062);
+
+ define("LABEL_POINT_NONE" , 691071);
+ define("LABEL_POINT_CIRCLE" , 691072);
+ define("LABEL_POINT_BOX" , 691073);
+
+ define("PI" , 3.14159265);
+ define("ALL" , 69);
+ define("NONE" , 31);
+ define("AUTO" , 690000);
+ define("OUT_OF_SIGHT" , -10000000000000);
+
+ class pDraw
+ {
+ /* Returns the number of drawable series */
+ function countDrawableSeries()
+ {
+ $Results = 0;
+ $Data = $this->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/notFinishedCode/tricode/class/pImage.class.php b/notFinishedCode/tricode/class/pImage.class.php
new file mode 100644
index 0000000..4684e3c
--- /dev/null
+++ b/notFinishedCode/tricode/class/pImage.class.php
@@ -0,0 +1,343 @@
+<?php
+ /*
+ pDraw - pChart core class
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ /* The GD extension is mandatory */
+ if (!extension_loaded('gd') && !extension_loaded('gd2'))
+ {
+ echo "GD extension must be loaded. \r\n";
+ exit();
+ }
+
+ define("IMAGE_MAP_STORAGE_FILE" , 680001);
+ define("IMAGE_MAP_STORAGE_SESSION" , 680002);
+
+ class pImage extends pDraw
+ {
+ /* Image settings, size, quality, .. */
+ var $XSize = NULL; // Width of the picture
+ var $YSize = NULL; // Height of the picture
+ var $Picture = NULL; // GD picture object
+ var $Antialias = TRUE; // Turn antialias on or off
+ var $AntialiasQuality = 0; // Quality of the antialiasing implementation (0-1)
+ var $Mask = ""; // Already drawn pixels mask (Filled circle implementation)
+ var $TransparentBackground = FALSE; // Just to know if we need to flush the alpha channels when rendering
+
+ /* Graph area settings */
+ var $GraphAreaX1 = NULL; // Graph area X origin
+ var $GraphAreaY1 = NULL; // Graph area Y origin
+ var $GraphAreaX2 = NULL; // Graph area bottom right X position
+ var $GraphAreaY2 = NULL; // Graph area bottom right Y position
+
+ /* Scale settings */
+ var $ScaleMinDivHeight = 20; // Minimum height for scame divs
+
+ /* Font properties */
+ var $FontName = "fonts/GeosansLight.ttf"; // Default font file
+ var $FontSize = 12; // Default font size
+ var $FontBox = NULL; // Return the bounding box of the last written string
+ var $FontColorR = 0; // Default color settings
+ var $FontColorG = 0; // Default color settings
+ var $FontColorB = 0; // Default color settings
+ var $FontColorA = 100; // Default transparency
+
+ /* Shadow properties */
+ var $Shadow = TRUE; // Turn shadows on or off
+ var $ShadowX = NULL; // X Offset of the shadow
+ var $ShadowY = NULL; // Y Offset of the shadow
+ var $ShadowR = NULL; // R component of the shadow
+ var $ShadowG = NULL; // G component of the shadow
+ var $ShadowB = NULL; // B component of the shadow
+ var $Shadowa = NULL; // Alpha level of the shadow
+
+ /* Image map */
+ var $ImageMap = NULL; // Aray containing the image map
+ var $ImageMapIndex = "pChart"; // Name of the session array
+ var $ImageMapStorageMode = NULL; // Save the current imagemap storage mode
+ var $ImageMapAutoDelete = TRUE; // Automatic deletion of the image map temp files
+
+ /* Data Set */
+ var $DataSet = NULL; // Attached dataset
+
+ /* Class constructor */
+ function pImage($XSize,$YSize,$DataSet=NULL,$TransparentBackground=FALSE)
+ {
+ $this->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/notFinishedCode/tricode/class/pIndicator.class.php b/notFinishedCode/tricode/class/pIndicator.class.php
new file mode 100644
index 0000000..4f7f23b
--- /dev/null
+++ b/notFinishedCode/tricode/class/pIndicator.class.php
@@ -0,0 +1,241 @@
+<?php
+ /*
+ pIndicator - class to draw indicators
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("INDICATOR_CAPTION_DEFAULT" , 700001);
+ define("INDICATOR_CAPTION_EXTENDED" , 700002);
+
+ define("INDICATOR_CAPTION_INSIDE" , 700011);
+ define("INDICATOR_CAPTION_BOTTOM" , 700012);
+
+ define("INDICATOR_VALUE_BUBBLE" , 700021);
+ define("INDICATOR_VALUE_LABEL" , 700022);
+
+ /* pIndicator class definition */
+ class pIndicator
+ {
+ var $pChartObject;
+
+ /* Class creator */
+ function pIndicator($pChartObject)
+ {
+ $this->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/notFinishedCode/tricode/class/pPie.class.php b/notFinishedCode/tricode/class/pPie.class.php
new file mode 100644
index 0000000..8940b4d
--- /dev/null
+++ b/notFinishedCode/tricode/class/pPie.class.php
@@ -0,0 +1,1493 @@
+<?php
+ /*
+ pPie - class to draw pie charts
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ /* Class return codes */
+ define("PIE_NO_ABSCISSA" , 140001);
+ define("PIE_NO_DATASERIE" , 140002);
+ define("PIE_SUMISNULL" , 140003);
+ define("PIE_RENDERED" , 140000);
+
+ define("PIE_LABEL_COLOR_AUTO" , 140010);
+ define("PIE_LABEL_COLOR_MANUAL", 140011);
+
+ define("PIE_VALUE_NATURAL" , 140020);
+ define("PIE_VALUE_PERCENTAGE" , 140021);
+
+ define("PIE_VALUE_INSIDE" , 140030);
+ define("PIE_VALUE_OUTSIDE" , 140031);
+
+ /* pPie class definition */
+ class pPie
+ {
+ var $pChartObject;
+ var $pDataObject;
+ var $LabelPos = "" ;
+
+ /* Class creator */
+ function pPie($Object,$pDataObject)
+ {
+ /* Cache the pChart object reference */
+ $this->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;$i<count($Plots);$i=$i+2)
+ { $ShadowPie[] = $Plots[$i]+$this->pChartObject->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<count($Plots)-2;$j=$j+2)
+ {
+ $Angle = $SliceAngle[$SliceID][$j/2];
+ if ( $Angle < 270 && $Angle > 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;$j<count($Plots);$j=$j+2) { $Top[] = $Plots[$j]; $Top[] = $Plots[$j+1]- $SliceHeight; }
+ $this->pChartObject->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/notFinishedCode/tricode/class/pRadar.class.php b/notFinishedCode/tricode/class/pRadar.class.php
new file mode 100644
index 0000000..6235c99
--- /dev/null
+++ b/notFinishedCode/tricode/class/pRadar.class.php
@@ -0,0 +1,669 @@
+<?php
+ /*
+ pRadar - class to draw radar charts
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("SEGMENT_HEIGHT_AUTO" , 690001);
+
+ define("RADAR_LAYOUT_STAR" , 690011);
+ define("RADAR_LAYOUT_CIRCLE" , 690012);
+
+ define("RADAR_LABELS_ROTATED" , 690021);
+ define("RADAR_LABELS_HORIZONTAL" , 690022);
+
+ /* pRadar class definition */
+ class pRadar
+ {
+ var $pChartObject;
+
+ /* Class creator */
+ function pRadar()
+ { }
+
+ /* Draw a radar chart */
+ function drawRadar($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"] : 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; $i<count($Points);$i++)
+ { $PointsArray[] = $Points[$i][0]; $PointsArray[] = $Points[$i][1]; }
+ $Object->drawPolygon($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; $i<count($Points);$i++)
+ {
+ if ( $DrawLines && $i < count($Points)-1)
+ $Object->drawLine($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]."&deg = ".$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; $i<count($Points);$i++)
+ { $PointsArray[] = $Points[$i][0]; $PointsArray[] = $Points[$i][1]; }
+
+ $Object->drawPolygon($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; $i<count($Points);$i++)
+ {
+ if ( $DrawLines && $i < count($Points)-1)
+ $Object->drawLine($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/notFinishedCode/tricode/class/pScatter.class.php b/notFinishedCode/tricode/class/pScatter.class.php
new file mode 100644
index 0000000..55ef1c7
--- /dev/null
+++ b/notFinishedCode/tricode/class/pScatter.class.php
@@ -0,0 +1,954 @@
+<?php
+ /*
+ pScatter - class to draw scatter charts
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("SCATTER_MISSING_X_SERIE" , 190001);
+ define("SCATTER_MISSING_Y_SERIE" , 190002);
+
+ /* pScatter class definition */
+ class pScatter
+ {
+ var $pChartObject;
+ var $pDataObject;
+
+ /* Class creator */
+ function pScatter($pChartObject,$pDataObject)
+ {
+ $this->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/notFinishedCode/tricode/class/pSplit.class.php b/notFinishedCode/tricode/class/pSplit.class.php
new file mode 100644
index 0000000..0a62c3d
--- /dev/null
+++ b/notFinishedCode/tricode/class/pSplit.class.php
@@ -0,0 +1,131 @@
+<?php
+ /*
+ pSplit - class to draw spline splitted charts
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("TEXT_POS_TOP" , 690001);
+ define("TEXT_POS_RIGHT" , 690002);
+
+ /* pSplit class definition */
+ class pSplit
+ {
+ var $pChartObject;
+
+ /* Class creator */
+ function pSplit()
+ { }
+
+ /* Create the encoded string */
+ function drawSplitPath($Object,$Values,$Format="")
+ {
+ $this->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/notFinishedCode/tricode/class/pSpring.class.php b/notFinishedCode/tricode/class/pSpring.class.php
new file mode 100644
index 0000000..fcfc8f2
--- /dev/null
+++ b/notFinishedCode/tricode/class/pSpring.class.php
@@ -0,0 +1,868 @@
+<?php
+ /*
+ pSpring - class to draw spring graphs
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("NODE_TYPE_FREE" , 690001);
+ define("NODE_TYPE_CENTRAL" , 690002);
+
+ define("NODE_SHAPE_CIRCLE" , 690011);
+ define("NODE_SHAPE_TRIANGLE" , 690012);
+ define("NODE_SHAPE_SQUARE" , 690013);
+
+ define("ALGORITHM_RANDOM" , 690021);
+ define("ALGORITHM_WEIGHTED" , 690022);
+ define("ALGORITHM_CIRCULAR" , 690023);
+ define("ALGORITHM_CENTRAL" , 690024);
+
+ define("LABEL_CLASSIC" , 690031);
+ define("LABEL_LIGHT" , 690032);
+
+ /* pSpring class definition */
+ class pSpring
+ {
+ var $History;
+ var $pChartObject;
+ var $Data;
+ var $Links;
+ var $X1;
+ var $Y1;
+ var $X2;
+ var $Y2;
+ var $AutoComputeFreeZone;
+ var $Labels;
+
+ /* Class creator */
+ function pSpring()
+ {
+ /* Initialise data arrays */
+ $this->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/notFinishedCode/tricode/class/pStock.class.php b/notFinishedCode/tricode/class/pStock.class.php
new file mode 100644
index 0000000..7f9dbfb
--- /dev/null
+++ b/notFinishedCode/tricode/class/pStock.class.php
@@ -0,0 +1,216 @@
+<?php
+ /*
+ pStock - class to draw stock charts
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("STOCK_MISSING_SERIE" , 180001);
+
+ /* pStock class definition */
+ class pStock
+ {
+ var $pChartObject;
+ var $pDataObject;
+
+ /* Class creator */
+ function pStock($pChartObject,$pDataObject)
+ {
+ $this->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]."<BR>Close : ".$Data["Series"][$SerieClose]["Data"][$Key]."<BR>Min : ".$Data["Series"][$SerieMin]["Data"][$Key]."<BR>Max : ".$Data["Series"][$SerieMax]["Data"][$Key]."<BR>";
+ if ( $SerieMedian != NULL ) { $Values = $Values."Median : ".$Data["Series"][$SerieMedian]["Data"][$Key]."<BR>"; }
+ 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/notFinishedCode/tricode/class/pSurface.class.php b/notFinishedCode/tricode/class/pSurface.class.php
new file mode 100644
index 0000000..f887ac0
--- /dev/null
+++ b/notFinishedCode/tricode/class/pSurface.class.php
@@ -0,0 +1,315 @@
+<?php
+ /*
+ pSurface - class to draw surface charts
+
+ Version : 2.1.2
+ Made by : Jean-Damien POGOLOTTI
+ Last Update : 03/08/11
+
+ 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.
+ */
+
+ define("UNKNOWN" , 0.123456789);
+ define("IGNORED" , -1);
+
+ define("LABEL_POSITION_LEFT" , 880001);
+ define("LABEL_POSITION_RIGHT" , 880002);
+ define("LABEL_POSITION_TOP" , 880003);
+ define("LABEL_POSITION_BOTTOM" , 880004);
+
+ /* pStock class definition */
+ class pSurface
+ {
+ var $pChartObject;
+ var $GridSizeX;
+ var $GridSizeY;
+ var $Points;
+
+ /* Class creator */
+ function pSurface($pChartObject)
+ {
+ $this->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/notFinishedCode/tricode/css/Critical.png b/notFinishedCode/tricode/css/Critical.png
new file mode 100644
index 0000000..e025d19
--- /dev/null
+++ b/notFinishedCode/tricode/css/Critical.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/Help.png b/notFinishedCode/tricode/css/Help.png
new file mode 100644
index 0000000..42a8f7c
--- /dev/null
+++ b/notFinishedCode/tricode/css/Help.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/Info.png b/notFinishedCode/tricode/css/Info.png
new file mode 100644
index 0000000..5a7a2c3
--- /dev/null
+++ b/notFinishedCode/tricode/css/Info.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/Warning.png b/notFinishedCode/tricode/css/Warning.png
new file mode 100644
index 0000000..0af654e
--- /dev/null
+++ b/notFinishedCode/tricode/css/Warning.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/chk_off.png b/notFinishedCode/tricode/css/chk_off.png
new file mode 100755
index 0000000..1514d51
--- /dev/null
+++ b/notFinishedCode/tricode/css/chk_off.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/chk_on.png b/notFinishedCode/tricode/css/chk_on.png
new file mode 100755
index 0000000..a9925a0
--- /dev/null
+++ b/notFinishedCode/tricode/css/chk_on.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/formCSS.css b/notFinishedCode/tricode/css/formCSS.css
new file mode 100644
index 0000000..f94bd72
--- /dev/null
+++ b/notFinishedCode/tricode/css/formCSS.css
@@ -0,0 +1,46 @@
+/* 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/notFinishedCode/tricode/css/info_rhombus.png b/notFinishedCode/tricode/css/info_rhombus.png
new file mode 100644
index 0000000..036733e
--- /dev/null
+++ b/notFinishedCode/tricode/css/info_rhombus.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/information.png b/notFinishedCode/tricode/css/information.png
new file mode 100644
index 0000000..93c67f2
--- /dev/null
+++ b/notFinishedCode/tricode/css/information.png
Binary files differ
diff --git a/notFinishedCode/tricode/css/link.gif b/notFinishedCode/tricode/css/link.gif
new file mode 100644
index 0000000..daada04
--- /dev/null
+++ b/notFinishedCode/tricode/css/link.gif
Binary files differ
diff --git a/notFinishedCode/tricode/css/tableCSS.css b/notFinishedCode/tricode/css/tableCSS.css
new file mode 100644
index 0000000..2a7f54d
--- /dev/null
+++ b/notFinishedCode/tricode/css/tableCSS.css
@@ -0,0 +1,146 @@
+/* -------------------------------------------------------
+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: 1px;
+ padding-top: 0px;
+ padding-right: 220px;
+ padding-left: 350px;
+ border: 1px solid black;
+ }
+ 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/notFinishedCode/tricode/css/tooltip.css b/notFinishedCode/tricode/css/tooltip.css
new file mode 100644
index 0000000..3a50734
--- /dev/null
+++ b/notFinishedCode/tricode/css/tooltip.css
@@ -0,0 +1,33 @@
+.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/notFinishedCode/tricode/css/visitedLink.gif b/notFinishedCode/tricode/css/visitedLink.gif
new file mode 100644
index 0000000..f7f1867
--- /dev/null
+++ b/notFinishedCode/tricode/css/visitedLink.gif
Binary files differ
diff --git a/notFinishedCode/tricode/delayedLoading.js b/notFinishedCode/tricode/delayedLoading.js
new file mode 100644
index 0000000..b76bbe3
--- /dev/null
+++ b/notFinishedCode/tricode/delayedLoading.js
@@ -0,0 +1,228 @@
+ /*
+ 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 <A> tags by <DIV> ones and attach the loader */
+ for(i=0;i<PictureCount;i++)
+ {
+ ATag = document.getElementById(PictureCache[i][0]);
+ DivTag = document.createElement("div");
+ DivID = "pChart-Div"+i; PictureCache[i][0] = DivID;
+
+ DivTag.setAttribute("id", DivID);
+ DivTag.style.width = PictureCache[i][4];
+ DivTag.style.height = PictureCache[i][5];
+ DivTag.style.backgroundColor = "#E0E0E0";
+
+ DivTag2 = ATag.parentNode.replaceChild(DivTag, ATag);
+
+ DivTop = DivTag.offsetTop;
+ PictureCache[i][1] = DivTop;
+
+ changeOpac(50, i);
+ changeContent("<img src='"+WaitPicture+"' width=24 height=24 alt=''/>",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 = "<center><img src='" + URL + "' alt='"+Alt+"'/></center>";
+ 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/notFinishedCode/tricode/execute.php b/notFinishedCode/tricode/execute.php
new file mode 100755
index 0000000..a384da1
--- /dev/null
+++ b/notFinishedCode/tricode/execute.php
@@ -0,0 +1,30 @@
+<html>
+<head>
+<script src='delayedLoading.js' type="text/javascript"></script>
+<!--ADD HERE ALL THE NEEDED META DATA -->
+<title>Network test live results!</title>
+<link rel="stylesheet" href="css/tableCSS.css" type="text/css" media="screen">
+</head>
+<body onscroll="scrollEvent();" onload="loaderInit();">
+<div>
+<?php
+ $ip = "localhost";
+ $port = 34600;
+ $startApp = fsockopen($ip, $port, $errno, $error, 5);
+ if (!$startApp)
+ {
+ printf('ERROR');
+ }
+ else
+ {
+ socket_set_timeout( $startApp, 50); //one should set the number of the longest test, so we can define the timeout
+ fwrite($startApp, "START APP");
+ usleep(500);
+ fclose($startApp);
+
+ }
+?>
+</div>
+</body>
+</html>
+
diff --git a/notFinishedCode/tricode/fonts/Bedizen.ttf b/notFinishedCode/tricode/fonts/Bedizen.ttf
new file mode 100644
index 0000000..d115733
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/Bedizen.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/Forgotte.ttf b/notFinishedCode/tricode/fonts/Forgotte.ttf
new file mode 100644
index 0000000..a2f7f4a
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/Forgotte.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/GeosansLight.ttf b/notFinishedCode/tricode/fonts/GeosansLight.ttf
new file mode 100644
index 0000000..055932a
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/GeosansLight.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/MankSans.ttf b/notFinishedCode/tricode/fonts/MankSans.ttf
new file mode 100644
index 0000000..a6146a9
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/MankSans.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/Silkscreen.ttf b/notFinishedCode/tricode/fonts/Silkscreen.ttf
new file mode 100644
index 0000000..ae4425d
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/Silkscreen.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/advent_light.ttf b/notFinishedCode/tricode/fonts/advent_light.ttf
new file mode 100644
index 0000000..514030a
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/advent_light.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/calibri.ttf b/notFinishedCode/tricode/fonts/calibri.ttf
new file mode 100644
index 0000000..8b6e3c9
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/calibri.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/pf_arma_five.ttf b/notFinishedCode/tricode/fonts/pf_arma_five.ttf
new file mode 100644
index 0000000..db04ec3
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/pf_arma_five.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/fonts/verdana.ttf b/notFinishedCode/tricode/fonts/verdana.ttf
new file mode 100644
index 0000000..5a059d2
--- /dev/null
+++ b/notFinishedCode/tricode/fonts/verdana.ttf
Binary files differ
diff --git a/notFinishedCode/tricode/gsmselftest.py b/notFinishedCode/tricode/gsmselftest.py
new file mode 100755
index 0000000..3e82b27
--- /dev/null
+++ b/notFinishedCode/tricode/gsmselftest.py
@@ -0,0 +1,783 @@
+#! /usr/bin/env python
+import sys
+import ControllerClass
+import DbClass
+import PingClass
+from time import sleep
+
+global resultsList
+resultsList = list()
+
+def ping(handler):
+
+ global serverStatus
+
+ if handler == 'landline':
+ server = PingClass.Ping('sipgate.de')
+ serverStatus = server.ping(1)
+
+ elif handler == 'sip':
+ server = PingClass.Ping('132.230.4.8')
+ serverStatus = server.ping(1)
+
+ elif handler == 'unisip':
+ server = PingClass.Ping('132.230.252.228')
+ serverStatus = server.ping(1)
+
+ elif handler == 'GSMRZ3':
+ server = PingClass.Ping('localhost')
+ serverStatus = server.ping(1)
+
+ elif handler == 'GSMRZ2':
+ server = PingClass.Ping('10.4.58.241')
+ serverStatus = server.ping(1)
+ else:
+ serverStatus = 1
+
+def allPing():
+
+ global sipGate
+ global sipServer
+ global unisip
+ global gsmBox1
+ global gsmBox2
+
+ server = PingClass.Ping('sipgate.de')
+ sipGate = server.ping(1)
+
+ server = PingClass.Ping('132.230.4.8')
+ sipServer = server.ping(1)
+
+ server = PingClass.Ping('132.230.252.228')
+ unisip = server.ping(1)
+
+ server = PingClass.Ping('localhost')
+ gsmBox1 = server.ping(1)
+
+ server = PingClass.Ping('10.4.58.241')
+ gsmBox2 = server.ping(1)
+
+def initDB():
+ global dbStatus
+ global db
+
+ db = DbClass.DBMySQLConnection('root', 'randompasswordSQL', 'localhost', 'gsmselftesting')
+ db.connectDB()
+ dbStatus = db.connectDB()
+
+def initTest(callFrom,callTo):
+ global dest
+ global caller
+ global callAdd
+ global accCaller
+ global recAdd
+ global destNo
+ global accDest
+ global result
+ global repeatTest
+
+ initDB()
+
+ if dbStatus != 0:
+
+ dest = db.deviceAddress(str(callTo))
+
+ caller = db.deviceAddress(str(callFrom))
+
+ callAdd = caller[0]
+ accCaller = caller[2]+':'+caller[3]+':'+caller[4]+':'
+
+ destAdd = dest[0]
+ destNo = dest[1]
+ accDest = dest[2]+':'+dest[3]+':'+dest[4]+':'
+
+ makeTest = ControllerClass.doTheTest(callFrom, callAdd, accCaller, callTo, destAdd, destNo, accDest)
+ makeTest.FuncTest()
+
+ result = str(makeTest.testResult)
+
+ else:
+ print "No connection to Database"
+
+ return result
+
+def initTrueTable():
+ nanoBTS1 = None
+ nanoBTS2 = None
+ nanoBTS3 = None
+ o2Card = None
+ eplusCard = None
+ vodaCard = None
+ tmobileCard = None
+ outgoingLandline = None
+ asteriskServer = None
+
+ for x in resultsList:
+
+ destination = x[1]
+ result = x[2]
+ caller = x[0]
+
+ if destination == 'GSMRZ1':
+ if result =='486':
+ nanoBTS1 = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMRZ1':
+ if result == '200':
+ nanoBTS1 = True
+
+ if destination == 'GSMRZ1':
+ if result == '200':
+ nanoBTS1 = True
+ elif result =='200':
+ nanoBTS1 = True
+
+ elif destination == 'GSMRZ2':
+ if result =='486':
+ nanoBTS2 = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMRZ2':
+ if result == '200':
+ nanoBTS2 = True
+
+ if destination == 'GSMRZ2':
+ if result == '200':
+ nanoBTS2 = True
+ elif result =='200':
+ nanoBTS2 = True
+
+ elif destination == 'GSMRZ3':
+ if result =='486':
+ nanoBTS3 = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMRZ3':
+ if result == '200':
+ nanoBTS3 = True
+
+ if destination == 'GSMRZ2':
+ if result == '200':
+ nanoBTS3 = True
+ elif result =='200':
+ nanoBTS3 = True
+
+ elif destination == 'GSMExt.O2':
+ if result =='486':
+ o2Card = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.O2':
+ if result == '200':
+ o2Card = True
+
+ if destination == 'GSMExt.O2':
+ if result == '200':
+ o2Card = True
+ elif result =='200':
+ o2Card = True
+
+ elif destination == 'GSMExt.Voda':
+ if result =='486':
+ vodaCard = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.Voda':
+ if result == '200':
+ vodaCard = True
+
+ if destination == 'GSMExt.Voda':
+ if result == '200':
+ vodaCard = True
+ elif result =='200':
+ vodaCard = True
+
+ elif destination == 'GSMExt.Eplus':
+ if result =='486':
+ eplusCard = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.Eplus':
+ if result == '200':
+ eplusCard = True
+
+ if destination == 'GSMExt.Eplus':
+ if result == '200':
+ eplusCard = True
+ elif result =='200':
+ eplusCard = True
+
+ elif destination == 'GSMExt.Tm':
+ if result =='486':
+ tmobileCard = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.Tm':
+ if result == '200':
+ tmobileCard = True
+
+ if destination == 'GSMExt.Tm':
+ if result == '200':
+ tmobileCard = True
+ elif result =='200':
+ tmobileCard = True
+
+ elif destination == 'sip':
+ if result =='486':
+ asteriskServer = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'sip':
+ if result == '200':
+ asteriskServer = True
+
+ if destination == 'sip':
+ if result == '200':
+ asteriskServer = True
+
+ elif result =='200':
+ asteriskServer = True
+
+ if caller == 'GSMRZ1' or caller == 'GSMRZ2' or caller == 'GSMRZ3':
+
+ if destination == 'landline':
+ if result =='486':
+ outgoingLandline = False
+ for y in resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if caller == 'GSMRZ1' or caller == 'GSMRZ2' or caller == 'GSMRZ3':
+ if destination == 'landline':
+ if result == '200':
+ outgoingLandline = True
+
+ print '\n'
+ if o2Card == False and eplusCard == False and vodaCard == False and tmobileCard == False:
+ print 'GSM BOX Modem down'
+ else:
+ if o2Card == False:
+ print "O2 card indicate having problem"
+ if eplusCard == False:
+ print "eplus card indicate having problem"
+ if vodaCard == False:
+ print "vodaphone card indicate having problem"
+ if tmobileCard == False:
+ print "T-Mobile card indicate having problem"
+ print '\n'
+
+ if nanoBTS1 == False and nanoBTS2 == False and nanoBTS3 == False:
+ print 'openBSC down'
+ else:
+ if nanoBTS1 == False:
+ print "nanoBTS 1 indicate having problem"
+ if nanoBTS2 == False:
+ print "nanoBTS 2 indicate having problem"
+ if nanoBTS3 == False:
+ print "nanoBTS 3 indicate having problem"
+
+ if outgoingLandline == False:
+ print 'outgoing from GSM RZ to landline having problem'
+ print '\n'
+
+ if asteriskServer == False:
+ print "Asterisk server indicate having problem"
+ elif asteriskServer == True:
+ print 'Asterisk server working good'
+ print '\n'
+
+
+def doTest(callFrom,callTo):
+ ping(callFrom)
+
+ if serverStatus <> 0:
+
+ ping(callTo)
+ if serverStatus <> 0:
+ print 'Call From : ', callFrom
+ print 'Call Destination : ', callTo
+ initTest(callFrom,callTo)
+ resultsList.append([callFrom, callTo, result])
+ db.errorCode(result)
+ print 'Result : ' +result+ ' ' +db.errCode
+ sleep(5)
+ else:
+ print '[failed] 500 '+callTo+ ' Server Internal Error'
+ else:
+ print '[failed] 500 '+callFrom+ ' Server Internal Error'
+
+def doSipTest():
+
+ print '--SIP Part Test--'
+ destList = ['gsmr1','gsmr2', 'gsmr3', 'landline', 'unisip', 'GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm' ]
+ for callTo in destList:
+
+ callFrom = 'sip'
+ doTest(callFrom, callTo)
+
+def doLandlineTest():
+
+ print '--Landline Part Test--'
+ destList = ['GSMRZ1','unisip', 'sip']
+
+ for callTo in destList:
+
+ callFrom = 'landline'
+ doTest(callFrom, callTo)
+
+def doGsmrzTest():
+
+ print '--GSM Part Test--'
+ destList = ['GSMRZ1','GSMRZ2', 'GSMRZ3']
+ callList = ['sip']
+
+ for callFrom in callList:
+
+ for callTo in destList:
+ doTest(callFrom, callTo)
+ resultsList.append([callFrom, callTo, result])
+ initTrueTable()
+
+def doGsmExtTest():
+
+ destList = ['GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm']
+ callList = ['sip']
+
+ for callFrom in callList:
+ for callTo in destList:
+ doTest(callFrom, callTo)
+ resultsList.append([callFrom, callTo, result])
+ initTrueTable()
+
+def doAllTest():
+
+ doSipTest()
+ doLandlineTest()
+ doGsmrzTest()
+ doGsmExtTest()
+
+def smartTest():
+ ping('sip')
+ if serverStatus == 0:
+ print "Dont have connection to SIP Asterisk server, can't make a test"
+ sys.exit(1)
+
+ callerList = ['sip']
+ destinationList = ['SIP', 'GSMExt']
+ #destinationList = ['GSMExt', 'GSMRZ', 'SIP', 'RZOutgoing', 'RZincoming']
+ for callFrom in callerList:
+ for destination in destinationList:
+
+ if destination == 'GSMRZ':
+ print "make a call to GSMRZ1"
+ initTest(callFrom,'GSMRZ1')
+
+ if result == '200':
+ print "make a call to GSMRZ2"
+ initTest(callFrom,'GSMRZ2')
+
+ if result == '200':
+ print "make a call to GSMRZ3"
+ initTest(callFrom,'GSMRZ3')
+
+ if result == '200':
+ print "all network on GSMRZ are working"
+ elif result == '486':
+ print "BTS 3 Down"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+ print "make a call to GSMRZ3"
+ initTest(callFrom,'GSMRZ3')
+
+ if result == '200':
+ print "BTS 2 Down"
+ elif result == '486':
+ print "BTS 2 and 3 indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+ print "make a call to GSMRZ2"
+ initTest(callFrom,'GSMRZ2')
+
+ if result == '200':
+ print "make a call to GSMRZ3"
+ initTest(callFrom,'GSMRZ3')
+
+ if result == '200':
+ print "BTS 1 Down"
+ elif result == '486':
+ print "BTS 1 & 3 indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+ print "make a call to GSMRZ3"
+
+ if result == '200':
+ print "BTS 1 & 2 indicate having problem"
+ elif result == '486':
+ print "OpenBSc Down"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+
+ elif destination == 'GSMExt':
+
+ initTest(callFrom,'GSMExt.O2')
+ if result == '200':
+
+ initTest(callFrom,'GSMExt.Voda')
+ if result == '200':
+
+ initTest(callFrom,'GSMExt.Eplus')
+ if result == '200':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "All network on GSM external are working"
+ elif result == '486':
+ print "T-Mobile card indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "E-Plus card indicate having problem"
+ elif result == '486':
+ print "T-Mobile and E-Plus card indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+
+ initTest(callFrom,'GSMExt.Eplus')
+ if result == '200':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "Vodaphone card indicate having problem"
+ elif result == '486':
+ print "T-Mobile and Vodaphone cards indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "Vodaphone and E-Plus card indicate having problem"
+ elif result == '486':
+ print "T-Mobile, E-Plus and Vodaphone cards indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "Incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+
+ initTest(callFrom,'GSMExt.Voda')
+ if result == '200':
+
+ initTest(callFrom,'GSMExt.Eplus')
+ if result == '200':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "O2 card indicate having problem"
+ elif result == '486':
+ print "T-Mobile and O2 cards indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "O2 and E-Plus cards indicate having problem"
+ elif result == '486':
+ print "T-Mobile, E-Plus and O2 cards indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+
+ initTest(callFrom,'GSMExt.Eplus')
+ if result == '200':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "O2 and Vodaphone cards indicate having problem"
+ elif result == '486':
+ print "T-Mobile, O2 and Vodaphone cards indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '486':
+
+ initTest(callFrom,'GSMExt.Tm')
+ if result == '200':
+ print "O2, E-Plus and Vodaphone cards indicate having problem"
+ elif result == '486':
+ print "GSM External Modem Down"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif destination == 'SIP':
+
+ ping('landline')
+ if serverStatus <> 0:
+ initTest(callFrom,'landline')
+
+ if result == '200':
+ ping('unisip')
+ if serverStatus <> 0:
+ initTest(callFrom,'unisip')
+
+ if result =='200':
+ print "All SIP network are working"
+ elif result == '486':
+ print "University telephone network indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "No connection to University telephone network server, check your connection"
+
+ elif result == '486':
+ ping('unisip')
+ if serverStatus <> 0:
+ initTest(callFrom,'unisip')
+
+ if result == '200':
+ print "Landline indicate having problem"
+ elif result == '486':
+ print "SIP Network Down"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "No connection to University telephone network server, check your connection"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "No connection to SIP Gate server, check your connection"
+
+ elif destination == 'RZOutgoing':
+
+ ping('landline')
+ if serverStatus <> 0:
+ initTest('GSMRZ1','landline')
+
+ if result == '200':
+ ping('unisip')
+ if serverStatus <> 0:
+ initTest('GSMRZ1','unisip')
+
+ if result =='200':
+ print "Outgoing call from GSM RZ is working"
+
+ elif result == '486':
+ print "Outgoing call from GSM RZ to UTN indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "No connection to University telephone network server, check your connection"
+
+ elif result == '486':
+ ping('unisip')
+ if serverStatus <> 0:
+ initTest('GSMRZ1','unisip')
+
+ if result == '200':
+ print "Outgoing call from GSM RZ to Landline indicate having problem"
+
+ elif result == '486':
+ print "Outgoing call from GSM RZ to Landline and UTN indicate having problem"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "No connection to University telephone network server, check your connection"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+ else:
+ print "No connection to SIP Gate server, check your connection"
+
+ elif destination == 'RZincoming':
+
+ ping('landline')
+ if serverStatus <> 0:
+ initTest('landline', 'GSMRZ1')
+
+ if result == '486':
+
+ initTest('GSMExt.O2','GSMRZ1')
+
+ if result =='200':
+ print "incoming call to GSM RZ working"
+
+ elif result == '486':
+
+ initTest('GSMExt.Voda','GSMRZ1')
+ if result =='200':
+ print "incoming call to GSM RZ working"
+ elif result == '486':
+ print "incoming call to GSM RZ notworking"
+ else:
+ print "incomplete test, GSM Handler having error, please do one more test"
+ else:
+ print "incomplete test, Handler having error, please do one more test"
+
+ elif result == '200':
+ print "incoming call to GSM RZ working"
+ else:
+ print "No connection to SIP Gate server, check your connection"
+
+
+if len(sys.argv) > 1:
+
+ command = sys.argv[1]
+ print ' '
+
+ if command == '--all':
+ doAllTest()
+
+ elif command == '--sip':
+ doSipTest()
+
+ elif command == '--gsmrz':
+ doGsmrzTest()
+
+ elif command == '--gsmext':
+ doGsmExtTest()
+
+ elif command == '--landline':
+ doLandlineTest()
+
+ elif command == '--smart':
+ smartTest()
+
+ elif command == '--help':
+ file = open('help.txt', 'r')
+ print file.read()
+
+ else:
+ print "command not found, Type '--help', '--credits' for more information."
+ print '\n'
+else:
+
+ initDB()
+ if dbStatus == 1:
+
+ if db.anyTasksToDo() == 1:
+
+ #allPing()
+ i=0
+ 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
+
+ ping(callFrom)
+
+ if serverStatus <> 0:
+
+ ping(callTo)
+ if serverStatus <> 0:
+
+ initTest(callFrom,callTo)
+
+ db.addResult(taskID, result)
+
+ resultsList.append([callFrom, callTo, result])
+
+ db.errorCode(result)
+ print 'Result : ' +result+ ' ' +db.errCode
+
+ db.deleteTempTask(taskID)
+ i = i+1
+
+ sleep(5)
+
+ else:
+ db.addResult(taskID, '500')
+ print '[failed] 500 '+callTo+ ' Server Internal Error'
+ else:
+ db.addResult(taskID, '500')
+ print '[failed] 500 '+callFrom+' Server Internal Error'
+ db.cleanTasksList()
+
+ # fetch result list and make adjustment about the result
+ print '\n'
+ initTrueTable()
+ else:
+ print "--- No job at all ---"
+ else:
+ sys.exit(1)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/notFinishedCode/tricode/gsmselftest1.py b/notFinishedCode/tricode/gsmselftest1.py
new file mode 100755
index 0000000..69cbffa
--- /dev/null
+++ b/notFinishedCode/tricode/gsmselftest1.py
@@ -0,0 +1,300 @@
+#! /usr/bin/env python
+from serial import * #serial port library
+import sys
+import ControllerClass
+import DbClass
+import PingClass
+import trueTableClass
+import initTestClass
+import usbDetectClass
+from time import sleep
+
+global resultsList
+resultsList = list()
+
+GSMListPrefix = [['GSMExt.Tm','0151'],['GSMExt.Tm','0160'],['GSMExt.Tm','0170'],['GSMExt.Tm','0171'],['GSMExt.Tm','0175'],['GSMExt.Voda','0152'],['GSMExt.Voda','0162'],['GSMExt.Voda','0172'],['GSMExt.Voda','0173'],['GSMExt.Voda','0174'],['GSMExt.Eplus','0157'],['GSMExt.Eplus','0177'],['GSMExt.Eplus','0155'],['GSMExt.Eplus','0163'],['GSMExt.Eplus','0178'],['GSMExt.O2','0159'],['GSMExt.O2','0176'],['GSMExt.O2','0179']]
+
+
+def allPing():
+
+ global sipGate
+ global sipServer
+ global unisip
+ global gsmBox1
+ global gsmBox2
+
+ server = PingClass.Ping('sipgate.de')
+ sipGate = server.ping(1)
+
+ server = PingClass.Ping('132.230.4.8')
+ sipServer = server.ping(1)
+
+ server = PingClass.Ping('132.230.252.228')
+ unisip = server.ping(1)
+
+ server = PingClass.Ping('localhost')
+ gsmBox1 = server.ping(1)
+
+ server = PingClass.Ping('10.4.58.241')
+ gsmBox2 = server.ping(1)
+
+def initDB():
+ global dbStatus
+ global db
+
+ db = DbClass.DBMySQLConnection('root', 'randompasswordSQL', 'localhost', 'gsmselftesting')
+ db.connectDB()
+ dbStatus = db.connectDB()
+
+
+def initTrueTable():
+ initResult = trueTableClass.trueTable(resultsList)
+ initResult.initTrueTable()
+
+ if initResult.o2Card == False and initResult.eplusCard == False and initResult.vodaCard == False and initResult.tmobileCard == False:
+ print 'GSM BOX Modem down'
+ else:
+ if initResult.o2Card == False:
+ print "O2 card indicate having problem"
+ if initResult.eplusCard == False:
+ print "eplus card indicate having problem"
+ if initResult.vodaCard == False:
+ print "vodaphone card indicate having problem"
+ if initResult.tmobileCard == False:
+ print "T-Mobile card indicate having problem"
+ print '\n'
+
+ if initResult.nanoBTS1 == False and initResult.nanoBTS2 == False and initResult.nanoBTS3 == False:
+ print 'openBSC down'
+ else:
+ if initResult.nanoBTS1 == False:
+ print "nanoBTS 1 indicate having problem"
+ if initResult.nanoBTS2 == False:
+ print "nanoBTS 2 indicate having problem"
+ if initResult.nanoBTS3 == False:
+ print "nanoBTS 3 indicate having problem"
+
+ if initResult.outgoingLandline == False:
+ print 'outgoing from GSM RZ to landline having problem'
+ print '\n'
+
+ if initResult.asteriskServer == False:
+ print "Asterisk server indicate having problem"
+ elif initResult.asteriskServer == True:
+ print 'Asterisk server working good'
+ print '\n'
+
+def doSipTest():
+
+ destList = ['gsmr1','gsmr2', 'gsmr3', 'landline', 'unisip', 'GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm' ]
+ doTest = initTestClass.doTest()
+ for callTo in destList:
+
+ callFrom = 'sip'
+ doTest.initTest(callFrom,callTo)
+ resultsList.append([callFrom, callTo, doTest.result])
+
+def doLandlineTest():
+
+ destList = ['GSMRZ1','unisip', 'sip']
+ doTest = initTestClass.doTest()
+ for callTo in destList:
+
+ callFrom = 'landline'
+ doTest.initTest(callFrom,callTo)
+ resultsList.append([callFrom, callTo, doTest.result])
+ initTrueTable()
+
+def doGsmrzTest():
+
+ destList = ['GSMRZ1','GSMRZ2', 'GSMRZ3']
+ callList = ['sip']
+ doTest = initTestClass.doTest()
+
+ for callFrom in callList:
+
+ for callTo in destList:
+ doTest.initTest(callFrom,callTo)
+ resultsList.append([callFrom, callTo, doTest.result])
+ initTrueTable()
+
+def doGsmExtTest():
+
+ destList = ['GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm']
+ callList = ['sip']
+
+ doTest = initTestClass.doTest()
+
+ for callFrom in callList:
+ for callTo in destList:
+ doTest.initTest(callFrom,callTo)
+ resultsList.append([callFrom, callTo, doTest.result])
+ initTrueTable()
+
+def doAllTest():
+
+ doSipTest()
+ doLandlineTest()
+ doGsmrzTest()
+ doGsmExtTest()
+
+def regularTest():
+ regulartest = initTestClass.doTest()
+ regulartest.smartTest()
+
+def findPort(portName):
+ 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 updateDevice():
+
+ while True:
+ print "Mobile device configuration"
+ print "Menu: s = start device configuration, q = quit : ",
+ input = sys.stdin.readline().rstrip("\r\n")
+ print ''
+ if input == 's':
+ i = 0
+ while i !=10:
+ portName ='ttyUSB'+str(i)
+ findPort(portName)
+ i=i+1
+ if connect == 1:
+ for listNum in GSMListPrefix:
+ if prefix == listNum[1]:
+ print 'Device Name :', listNum[0]
+ print 'IME :',IMEI
+ print 'Phone Number :',num
+ print 'Port Name : /dev/'+portName
+
+ newPortName = '/dev/'+portName
+ portClass.initUpdate(listNum[0], newPortName, num)
+ print '\n'
+
+
+
+ if input == "q":
+ break
+ sys.exit()
+
+if len(sys.argv) > 1:
+
+ command = sys.argv[1]
+ print ' '
+
+ if command == '--all':
+ doAllTest()
+
+ elif command == '--sip':
+ doSipTest()
+
+ elif command == '--gsmrz':
+ doGsmrzTest()
+
+ elif command == '--gsmext':
+ doGsmExtTest()
+
+ elif command == '--landline':
+ doLandlineTest()
+
+ elif command == '--smart':
+ regularTest()
+
+ elif command == '--devconf':
+ updateDevice()
+
+ elif command == '--help':
+ file = open('help.txt', 'r')
+ print file.read()
+
+ else:
+ print "command not found, Type '--help', '--credits' for more information."
+ print '\n'
+else:
+
+ initDB()
+ if dbStatus == 1:
+
+ if db.anyTasksToDo() == 1:
+
+ #allPing()
+ i=0
+ makeTest = initTestClass.doTest()
+ 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)
+ print 'Result : ' +makeTest.result+ ' ' +db.errCode
+
+ db.deleteTempTask(taskID)
+ i = i+1
+
+ db.cleanTasksList()
+
+
+ print '\n'
+ initTrueTable() # fetch result list and make adjustment about the result
+ else:
+ print "--- No job at all ---"
+ else:
+ sys.exit(1)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/notFinishedCode/tricode/gsmselftest2.py b/notFinishedCode/tricode/gsmselftest2.py
new file mode 100755
index 0000000..37272c1
--- /dev/null
+++ b/notFinishedCode/tricode/gsmselftest2.py
@@ -0,0 +1,370 @@
+#! /usr/bin/env python
+from serial import * #serial port library
+import sys
+import ControllerClass
+import DbClass
+import PingClass
+import trueTableClass
+import initTestClass
+import usbDetectClass
+from time import sleep
+import ServerClassSoftware
+
+global resultsList
+resultsList = list()
+
+GSMListPrefix = [['GSMExt.Tm','0151'],['GSMExt.Tm','0160'],['GSMExt.Tm','0170'],['GSMExt.Tm','0171'],['GSMExt.Tm','0175'],['GSMExt.Voda','0152'],['GSMExt.Voda','0162'],['GSMExt.Voda','0172'],['GSMExt.Voda','0173'],['GSMExt.Voda','0174'],['GSMExt.Eplus','0157'],['GSMExt.Eplus','0177'],['GSMExt.Eplus','0155'],['GSMExt.Eplus','0163'],['GSMExt.Eplus','0178'],['GSMExt.O2','0159'],['GSMExt.O2','0176'],['GSMExt.O2','0179'],['GSMRZ1','0761']]
+
+
+def allPing():
+
+ global sipGate
+ global sipServer
+ global unisip
+ global gsmBox1
+ global gsmBox2
+
+ server = PingClass.Ping('sipgate.de')
+ sipGate = server.ping(1)
+
+ server = PingClass.Ping('132.230.4.8')
+ sipServer = server.ping(1)
+
+ server = PingClass.Ping('132.230.252.228')
+ unisip = server.ping(1)
+
+ server = PingClass.Ping('localhost')
+ gsmBox1 = server.ping(1)
+
+ server = PingClass.Ping('10.4.58.241')
+ gsmBox2 = server.ping(1)
+
+def initDB():
+ global dbStatus
+ global db
+
+ db = DbClass.DBMySQLConnection('root', 'randompasswordSQL', 'localhost', 'gsmselftesting')
+ db.connectDB()
+ dbStatus = db.connectDB()
+ if dbStatus == 1:
+ print 'Lock the mutex: ' + str(db.lockMutex(100))
+
+def initTrueTable(x):
+ initResult = trueTableClass.trueTable(x)
+ initResult.initTrueTable()
+ print '\n'
+ if initResult.o2Card == False and initResult.eplusCard == False and initResult.vodaCard == False and initResult.tmobileCard == False:
+ print 'GSM BOX Modem down'
+ else:
+ if initResult.o2Card == False:
+ print "O2 card indicate having problem"
+ if initResult.eplusCard == False:
+ print "eplus card indicate having problem"
+ if initResult.vodaCard == False:
+ print "vodaphone card indicate having problem"
+ if initResult.tmobileCard == False:
+ print "T-Mobile card indicate having problem"
+ print '\n'
+
+ if initResult.nanoBTS1 == True or initResult.nanoBTS2 == True or initResult.nanoBTS3 == True:
+ print 'openBSC working'
+
+ if initResult.nanoBTS1 == False and initResult.nanoBTS2 == False and initResult.nanoBTS3 == False:
+ print 'openBSC down'
+ else:
+ if initResult.nanoBTS1 == False:
+ print "nanoBTS 1 indicate having problem"
+ if initResult.nanoBTS2 == False:
+ print "nanoBTS 2 indicate having problem"
+ if initResult.nanoBTS3 == False:
+ print "nanoBTS 3 indicate having problem"
+
+ if initResult.outgoingLandline == False:
+ print 'outgoing call to outside network having problem'
+ print '\n'
+
+ if initResult.asteriskServer == False:
+ print "Asterisk server indicate having problem"
+ elif initResult.asteriskServer == True:
+ print 'Asterisk server working good'
+ print '\n'
+
+def doSipTest():
+
+ destList = ['gsmr1','gsmr2', 'gsmr3', 'landline', 'unisip', 'GSMExt.O2', 'GSMExt.Voda', 'GSMExt.Eplus', 'GSMExt.Tm' ]
+ doTest = initTestClass.doTest()
+ for callTo in destList:
+
+ callFrom = 'sip'
+ doTest.initTest(callFrom,callTo)
+ resultsList.append([callFrom, callTo, doTest.result])
+
+def doLandlineTest():
+
+ destList = ['GSMRZ1','unisip', 'sip']
+ doTest = initTestClass.doTest()
+ 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.doTest()
+
+ 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.doTest()
+
+ for callFrom in callList:
+ for callTo in destList:
+ doTest.initTest(callFrom,callTo)
+ resultsList.append([callFrom, callTo, doTest.result])
+ initTrueTable(resultsList)
+
+def doAllTest():
+
+ doSipTest()
+ doLandlineTest()
+ doGsmrzTest()
+ doGsmExtTest()
+
+def regularTest():
+ regulartest = initTestClass.doTest()
+ regulartest.smartTest()
+ initTrueTable(regulartest.smartResultList)
+
+def findPort(portName):
+ 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 deviceName == 'GSMRZ2' or deviceName == 'GSMRZ2':
+ if number =='':
+ print ' == cant save device configuration, number missing =='
+ else:
+ portClass.initUpdate(deviceName, portName, number)
+ else:
+ if imei == '' or portName == '':
+ print ' == cant save device configuration, please fill IMEI / port name of the device =='
+ else:
+ findPort(portName)
+ if connect == 1:
+ if str(IMEI) != str(imei) and str(num) != str(number):
+ print '== error, device not found =='
+ elif str(IMEI) == str(imei):
+ portClass.initUpdate(deviceName, portName, number)
+ print '== Device succeced added =='
+ elif str(num) == str(number) and str(IMEI) != str(imei):
+ portClass.initUpdate(deviceName, portName, number)
+ print '== Device succeced added, but have different IMEI =='
+ else:
+ print '== error, no device connected =='
+
+
+def updateDevice():
+ quit = False
+ while quit != True:
+ print ''
+ print "Mobile device configuration"
+ print "Menu: s = automatic device configuration, m = Manual configuration, q = quit : ",
+ input = sys.stdin.readline().rstrip("\r\n")
+ print ''
+ if input == 'm':
+
+ 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. GSM RZ 2"
+ print " 7. GSM RZ 3"
+ print " 8. Back to menu"
+ print ""
+ print "you choise : ",
+ input = sys.stdin.readline().rstrip("\r\n")
+
+ if input == '8':
+ 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')
+ elif input == '6':
+ initDevice('GSMRZ2')
+ elif input == '7':
+ initDevice('GSMRZ3')
+ else:
+ print 'please choose between 1-8'
+ if input == 's':
+ i = 0
+ x = 0
+ while i !=10:
+ portName ='ttyUSB'+str(i)
+ findPort(portName)
+ i=i+1
+ 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'
+
+ print '== FINISH =='
+ print 'Found '+str(x)+' devices'
+
+ 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()
+
+
+initDB()
+resultsList = list()
+if dbStatus == 1:
+ server = ServerClassSoftware.ServerHandlerSoftware(34500) #define the port
+ tried = server.openSocket(3)
+
+ if tried == 'TIMEOUT':
+ closeFunction(db,server)
+
+ test = server.receiveData(2)
+ if test == 'TIMEOUT':
+ closeFunction(db,server)
+
+ print test
+ if test == 'START TEST':
+ server.sendData('CONFIRM\n')
+ print 'TEST STARTED'
+ else:
+ sys.exit('WE DIDN\'T RECEIVE THE CONFIRMATION')
+
+# updateDevice()
+ if db.anyTasksToDo() == 1:
+ #allPing()
+ i=0
+ makeTest = initTestClass.doTest()
+ 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)
+ print 'Result : ' +str(makeTest.result)+ ' ' +str(db.errCode)
+
+ message = '|' + str(callFrom) + '|' + str(callTo) + '|' + str(makeTest.result) + '|' + str(db.errCode)
+
+ if server.sendData(message+ chr(10)) == 1:
+ print 'data sent successfully'
+ test = server.receiveData(2)
+ if test == 'TIMEOUT':
+ closeFunction(db,server)
+ print test
+ if test == 'CONTINUE':
+ print 'continue test'
+
+
+
+ db.deleteTempTask(taskID)
+ i = i+1
+ db.cleanTasksList()
+
+ if server.connected == 1:
+ server.sendData('TEST DONE\n')
+ test = server.receiveData(2)
+ 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()
+
+ print '\n'
+ #initTrueTable(resultsList) # fetch result list and make adjustment about the result
+ else:
+ print "--- No job at all ---"
+
+print db.closeDBConn()
+
+del db
+del server
diff --git a/notFinishedCode/tricode/help.txt b/notFinishedCode/tricode/help.txt
new file mode 100755
index 0000000..5a9062e
--- /dev/null
+++ b/notFinishedCode/tricode/help.txt
@@ -0,0 +1,15 @@
+
+
+Usage: python gsmselftest.py [option]
+
+Options and arguments (and corresponding environment variables):
+
+--all : To execute all test case
+--sip : To execute ALL test case
+--gsmrz : To check whether GSM RZ network having problem or not
+--gsmext : To check whether GSM BOX modem having problem or not
+--landline : To check incoming call from Landline
+--smart : To test only important point in the network and identify which part having problem.
+--devconf : To configuration USB device
+
+ example : gsmselftest.py --devconf
diff --git a/notFinishedCode/tricode/icons/blackberry_dunno.png b/notFinishedCode/tricode/icons/blackberry_dunno.png
new file mode 100644
index 0000000..4ee9ee0
--- /dev/null
+++ b/notFinishedCode/tricode/icons/blackberry_dunno.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/blackberry_fail.png b/notFinishedCode/tricode/icons/blackberry_fail.png
new file mode 100644
index 0000000..650d942
--- /dev/null
+++ b/notFinishedCode/tricode/icons/blackberry_fail.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/blackberry_work.png b/notFinishedCode/tricode/icons/blackberry_work.png
new file mode 100644
index 0000000..3fe1d09
--- /dev/null
+++ b/notFinishedCode/tricode/icons/blackberry_work.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/box_dunno.png b/notFinishedCode/tricode/icons/box_dunno.png
new file mode 100644
index 0000000..744ec7a
--- /dev/null
+++ b/notFinishedCode/tricode/icons/box_dunno.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/box_fail.png b/notFinishedCode/tricode/icons/box_fail.png
new file mode 100644
index 0000000..3398e05
--- /dev/null
+++ b/notFinishedCode/tricode/icons/box_fail.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/box_work.png b/notFinishedCode/tricode/icons/box_work.png
new file mode 100644
index 0000000..666fced
--- /dev/null
+++ b/notFinishedCode/tricode/icons/box_work.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/server_dunno.png b/notFinishedCode/tricode/icons/server_dunno.png
new file mode 100644
index 0000000..588514e
--- /dev/null
+++ b/notFinishedCode/tricode/icons/server_dunno.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/server_fail.png b/notFinishedCode/tricode/icons/server_fail.png
new file mode 100644
index 0000000..a699864
--- /dev/null
+++ b/notFinishedCode/tricode/icons/server_fail.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/server_work.png b/notFinishedCode/tricode/icons/server_work.png
new file mode 100644
index 0000000..210979f
--- /dev/null
+++ b/notFinishedCode/tricode/icons/server_work.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/sip_dunno.png b/notFinishedCode/tricode/icons/sip_dunno.png
new file mode 100644
index 0000000..e494a61
--- /dev/null
+++ b/notFinishedCode/tricode/icons/sip_dunno.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/sip_fail.png b/notFinishedCode/tricode/icons/sip_fail.png
new file mode 100644
index 0000000..02d7029
--- /dev/null
+++ b/notFinishedCode/tricode/icons/sip_fail.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/sip_work.png b/notFinishedCode/tricode/icons/sip_work.png
new file mode 100644
index 0000000..5774487
--- /dev/null
+++ b/notFinishedCode/tricode/icons/sip_work.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/telephone_dunno.png b/notFinishedCode/tricode/icons/telephone_dunno.png
new file mode 100644
index 0000000..2ac9dd6
--- /dev/null
+++ b/notFinishedCode/tricode/icons/telephone_dunno.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/telephone_fail.png b/notFinishedCode/tricode/icons/telephone_fail.png
new file mode 100644
index 0000000..222050d
--- /dev/null
+++ b/notFinishedCode/tricode/icons/telephone_fail.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/telephone_work.png b/notFinishedCode/tricode/icons/telephone_work.png
new file mode 100644
index 0000000..5086dd2
--- /dev/null
+++ b/notFinishedCode/tricode/icons/telephone_work.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/uni-network_dunno.png b/notFinishedCode/tricode/icons/uni-network_dunno.png
new file mode 100644
index 0000000..7d99f0e
--- /dev/null
+++ b/notFinishedCode/tricode/icons/uni-network_dunno.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/uni-network_fail.png b/notFinishedCode/tricode/icons/uni-network_fail.png
new file mode 100644
index 0000000..3da0a70
--- /dev/null
+++ b/notFinishedCode/tricode/icons/uni-network_fail.png
Binary files differ
diff --git a/notFinishedCode/tricode/icons/uni-network_work.png b/notFinishedCode/tricode/icons/uni-network_work.png
new file mode 100644
index 0000000..fdc7989
--- /dev/null
+++ b/notFinishedCode/tricode/icons/uni-network_work.png
Binary files differ
diff --git a/notFinishedCode/tricode/initTestClass.py b/notFinishedCode/tricode/initTestClass.py
new file mode 100755
index 0000000..8552e20
--- /dev/null
+++ b/notFinishedCode/tricode/initTestClass.py
@@ -0,0 +1,147 @@
+import sys
+import ControllerClass
+import DbClass
+import PingClass
+import random
+from time import sleep
+
+class doTest:
+
+ def ping(self,handler):
+
+ if handler == 'landline':
+ server = PingClass.Ping('sipgate.de')
+ self.serverStatus = server.ping(2)
+
+ elif handler == 'sip':
+ server = PingClass.Ping('132.230.4.8')
+ self.serverStatus = server.ping(2)
+
+ elif handler == 'unisip':
+ server = PingClass.Ping('132.230.252.228')
+ self.serverStatus = server.ping(2)
+
+ elif handler == 'GSMRZ3':
+ server = PingClass.Ping('localhost')
+ self.serverStatus = server.ping(2)
+
+ elif handler == 'GSMRZ2':
+ server = PingClass.Ping('10.4.58.241')
+ self.serverStatus = server.ping(2)
+ else:
+ self.serverStatus = 1
+
+
+ def initDB(self):
+
+ self.db = DbClass.DBMySQLConnection('root', 'randompasswordSQL', 'localhost', 'gsmselftesting')
+ 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
+
+ def initTest(self, callFrom, callTo):
+
+ self.initDB()
+
+ if self.dbStatus != 0:
+
+ self.ping(callFrom)
+ if self.serverStatus <> 0:
+ self.ping(callTo)
+ if self.serverStatus <> 0:
+
+ dest = self.db.deviceAddress(str(callTo))
+ caller = self.db.deviceAddress(str(callFrom))
+
+ self.initaccount(caller,callFrom)
+ if self.status == 1:
+ self.initaccount(dest,callTo)
+ if self.status == 1:
+ callPortName = caller[0]
+ accCaller = caller[2]+':'+caller[3]+':'+caller[4]+':'
+
+ destPortName = dest[0]
+ destNo = dest[1]
+ accDest = dest[2]+':'+dest[3]+':'+dest[4]+':'
+
+ makeTest = ControllerClass.doTheTest(callFrom, callPortName, accCaller, callTo, destPortName, destNo, accDest)
+ makeTest.FuncTest()
+ self.result = str(makeTest.testResult)
+ else:
+ self.result = 100
+ else:
+ self.result = 100
+
+ sleep(5)
+ else:
+ self.result = 500
+ else:
+ self.result = 500
+
+ else:
+ self.result = 333
+
+ return self.result
+
+ def isThere(keyword,lists):
+ x = 0
+ for item in lists:
+
+ if item == keyword:
+ return 1
+ else:
+ x = x+1
+
+ def smartTest(self):
+ global handlerError
+ smartResultList = list()
+ testPendingList = list()
+ #callerList = ['sip']
+ destList = ['GSMRZ1','GSMRZ2','GSMRZ3','GSMExt.O2','GSMExt.Voda','GSMExt.Eplus','GSMExt.Tm']
+ gsmList = ['GSMExt.O2','GSMExt.Voda','GSMExt.Eplus','GSMExt.Tm']
+ gsmRZList = ['GSMRZ1','GSMRZ2','GSMRZ3']
+
+ i = random.randint(0, len(gsmRZList)-1)
+ callTo = gsmRZList[i]
+ self.initTest('unisip',callTo)
+ gsmRZList.remove(callTo)
+ destList.remove(callTo)
+ openBSC = self.result
+ self.smartResultList.append(['unisip', callTo, self.result])
+
+ if openBSC == 200:
+ for callFrom in gsmRZList:
+ i = random.randint(3, len(destList)-1) # need to check wheter the caller and dest is same
+ callTo = destList[i]
+ self.initTest(callFrom,callTo)
+ destList.remove(callTo)
+ self.smartResultList.append([callFrom, callTo, self.result])
+
+ i = random.randint(0, len(gsmRZList)-1) #
+ callTo = gsmRZList[i]
+ self.initTest('landline',callTo)
+ gsmRZList.remove(callTo)
+ destList.remove(callTo)
+ self.smartResultList.append(['landline', callTo, self.result])
+
+ for callTo in destList:
+ callFrom = 'sip'
+ self.initTest(callFrom,callTo)
+ self.smartResultList.append([callFrom, callTo, self.result])
+
+ return self.smartResultList
+
+
+
+
diff --git a/notFinishedCode/tricode/initTestClass.pyc b/notFinishedCode/tricode/initTestClass.pyc
new file mode 100755
index 0000000..8447c84
--- /dev/null
+++ b/notFinishedCode/tricode/initTestClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/insertData.php b/notFinishedCode/tricode/insertData.php
new file mode 100644
index 0000000..fe77587
--- /dev/null
+++ b/notFinishedCode/tricode/insertData.php
@@ -0,0 +1,81 @@
+<?
+/*
+//Connection stuff
+//DB
+$dbhost = 'localhost';
+$dbuser = 'root';
+$dbpass = 'randompasswordSQL';
+
+
+$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error connecting to mysql');
+
+$dbname = 'gsmselftesting';
+mysql_select_db($dbname);
+//End of connection stuff
+*/
+function getNewTaskNo()
+{
+ $sql = "SELECT MAX(taskNo) FROM TaskTable"; //the SQL command to find the max value in taskNo
+ $execute = mysql_query($sql); //execute the command
+ $result = mysql_result($execute,0);
+
+ if ($result == NULL)
+ {
+ // there is no single job in the table
+ return 1;
+ }
+ else
+ {
+ //increment the new taskNo
+ return $result + 1;
+ }
+}
+
+function insertTask($taskNo, $from, $to)
+{
+ $trans = "START TRANSACTION;";
+ $execute = mysql_query($trans);
+
+ if ($execute!=1)
+ {
+ return 3; //could not start transaction
+ }
+
+ $sql = "INSERT INTO `TaskTable` (`taskNo`, `from`, `to`) VALUES($taskNo, '$from', '$to')";
+ $execute = mysql_query($sql); //insert new task into the TaskTable
+
+ if ($execute == 1) //I added to the DB the task!
+ {
+ $sql = "SELECT @taskID := LAST_INSERT_ID()"; //find the last taskId
+ $execute = mysql_query($sql);
+ $taskId = mysql_result($execute,0); //I have the last taskId which I will use to insert it into TempTaskTable
+
+ $sql = "INSERT INTO `TempTaskTable` (`taskID`, `taskNo`, `from`, `to`) VALUES($taskId, $taskNo, '$from', '$to')";
+ $execute = mysql_query($sql); //insert new task into the TempTaskTable
+
+ if ($execute == 1)
+ {
+ $trans = "COMMIT;"; //command to end the transaction
+ $execute = mysql_query($trans);//finish the transaction
+
+ if ($execute == 1)
+ {
+ return 1; //task was successfuly added to both tables, TaskTable and TempTaskTable
+ }
+ else
+ {
+ return 0; //nothing was added to the tables
+ }
+ }
+ else
+ {
+ return 2; //the task is in the TaskTable but not in TempTaskTable
+ }
+ }
+ else
+ {
+ return 0; //nothing was added to the table, some error occured
+ }
+}
+ //include 'post.php';
+?>
diff --git a/notFinishedCode/tricode/loader.gif b/notFinishedCode/tricode/loader.gif
new file mode 100644
index 0000000..240d4e1
--- /dev/null
+++ b/notFinishedCode/tricode/loader.gif
Binary files differ
diff --git a/notFinishedCode/tricode/moocheck.js b/notFinishedCode/tricode/moocheck.js
new file mode 100644
index 0000000..0c364aa
--- /dev/null
+++ b/notFinishedCode/tricode/moocheck.js
@@ -0,0 +1,176 @@
+/*
+* FancyForm 0.95
+* By Vacuous Virtuoso, lipidity.com
+* ---
+* Checkbox and radio input replacement script.
+* Toggles defined class when input is selected.
+*/
+
+var FancyForm = {
+ start: function(elements, options){
+ if(FancyForm.initing != undefined) return;
+ if($type(elements)!='array') elements = $$('input');
+ if(!options) options = [];
+ FancyForm.onclasses = ($type(options['onClasses']) == 'object') ? options['onClasses'] : {
+ checkbox: 'checked',
+ radio: 'selected'
+ }
+ FancyForm.offclasses = ($type(options['offClasses']) == 'object') ? options['offClasses'] : {
+ checkbox: 'unchecked',
+ radio: 'unselected'
+ }
+ if($type(options['extraClasses']) == 'object'){
+ FancyForm.extra = options['extraClasses'];
+ } else if(options['extraClasses']){
+ FancyForm.extra = {
+ checkbox: 'f_checkbox',
+ radio: 'f_radio',
+ on: 'f_on',
+ off: 'f_off',
+ all: 'fancy'
+ }
+ } else {
+ FancyForm.extra = {};
+ }
+ FancyForm.onSelect = $pick(options['onSelect'], function(el){});
+ FancyForm.onDeselect = $pick(options['onDeselect'], function(el){});
+ FancyForm.chks = [];
+ FancyForm.add(elements);
+ $each($$('form'), function(x) {
+ x.addEvent('reset', function(a) {
+ window.setTimeout(function(){FancyForm.chks.each(function(x){FancyForm.update(x);x.inputElement.blur()})}, 200);
+ });
+ });
+ },
+ add: function(elements){
+ if($type(elements) == 'element')
+ elements = [elements];
+ FancyForm.initing = 1;
+ var keeps = [];
+ var newChks = elements.filter(function(chk){
+ if($type(chk) != 'element' || chk.inputElement || (chk.get('tag') == 'input' && chk.getParent().inputElement))
+ return false;
+ if(chk.get('tag') == 'input' && (FancyForm.onclasses[chk.getProperty('type')])){
+ var el = chk.getParent();
+ if(el.getElement('input')==chk){
+ el.type = chk.getProperty('type');
+ el.inputElement = chk;
+ this.push(el);
+ } else {
+ chk.addEvent('click',function(f){
+ if(f.event.stopPropagation) f.event.stopPropagation();
+ });
+ }
+ } else if((chk.inputElement = chk.getElement('input')) && (FancyForm.onclasses[(chk.type = chk.inputElement.getProperty('type'))])){
+ return true;
+ }
+ return false;
+ }.bind(keeps));
+ newChks = newChks.combine(keeps);
+ newChks.each(function(chk){
+ var c = chk.inputElement;
+ c.setStyle('position', 'absolute');
+ c.setStyle('left', '-9999px');
+ chk.addEvent('selectStart', function(f){f.stop()});
+ chk.name = c.getProperty('name');
+ FancyForm.update(chk);
+ });
+ newChks.each(function(chk){
+ var c = chk.inputElement;
+ chk.addEvent('click', function(f){
+ f.stop(); f.type = 'prop';
+ c.fireEvent('click', f, 1);
+ });
+ chk.addEvent('mousedown', function(f){
+ if($type(c.onmousedown) == 'function')
+ c.onmousedown();
+ f.preventDefault();
+ });
+ chk.addEvent('mouseup', function(f){
+ if($type(c.onmouseup) == 'function')
+ c.onmouseup();
+ });
+ c.addEvent('focus', function(f){
+ if(FancyForm.focus)
+ chk.setStyle('outline', '1px dotted');
+ });
+ c.addEvent('blur', function(f){
+ chk.setStyle('outline', 0);
+ });
+ c.addEvent('click', function(f){
+ if(f.event.stopPropagation) f.event.stopPropagation();
+ if(c.getProperty('disabled')) // c.getStyle('position') != 'absolute'
+ return;
+ if (!chk.hasClass(FancyForm.onclasses[chk.type]))
+ c.setProperty('checked', 'checked');
+ else if(chk.type != 'radio')
+ c.setProperty('checked', false);
+ if(f.type == 'prop')
+ FancyForm.focus = 0;
+ FancyForm.update(chk);
+ FancyForm.focus = 1;
+ if(f.type == 'prop' && !FancyForm.initing && $type(c.onclick) == 'function')
+ c.onclick();
+ });
+ c.addEvent('mouseup', function(f){
+ if(f.event.stopPropagation) f.event.stopPropagation();
+ });
+ c.addEvent('mousedown', function(f){
+ if(f.event.stopPropagation) f.event.stopPropagation();
+ });
+ if(extraclass = FancyForm.extra[chk.type])
+ chk.addClass(extraclass);
+ if(extraclass = FancyForm.extra['all'])
+ chk.addClass(extraclass);
+ });
+ FancyForm.chks.combine(newChks);
+ FancyForm.initing = 0;
+ },
+ update: function(chk){
+ if(chk.inputElement.getProperty('checked')) {
+ chk.removeClass(FancyForm.offclasses[chk.type]);
+ chk.addClass(FancyForm.onclasses[chk.type]);
+ if (chk.type == 'radio'){
+ FancyForm.chks.each(function(other){
+ if (other.name == chk.name && other != chk) {
+ other.inputElement.setProperty('checked', false);
+ FancyForm.update(other);
+ }
+ });
+ }
+ if(extraclass = FancyForm.extra['on'])
+ chk.addClass(extraclass);
+ if(extraclass = FancyForm.extra['off'])
+ chk.removeClass(extraclass);
+ if(!FancyForm.initing)
+ FancyForm.onSelect(chk);
+ } else {
+ chk.removeClass(FancyForm.onclasses[chk.type]);
+ chk.addClass(FancyForm.offclasses[chk.type]);
+ if(extraclass = FancyForm.extra['off'])
+ chk.addClass(extraclass);
+ if(extraclass = FancyForm.extra['on'])
+ chk.removeClass(extraclass);
+ if(!FancyForm.initing)
+ FancyForm.onDeselect(chk);
+ }
+ if(!FancyForm.initing)
+ chk.inputElement.focus();
+ },
+ all: function(){
+ FancyForm.chks.each(function(chk){
+ chk.inputElement.setProperty('checked', 'checked');
+ FancyForm.update(chk);
+ });
+ },
+ none: function(){
+ FancyForm.chks.each(function(chk){
+ chk.inputElement.setProperty('checked', false);
+ FancyForm.update(chk);
+ });
+ }
+};
+
+window.addEvent('domready', function(){
+ FancyForm.start();
+});
diff --git a/notFinishedCode/tricode/mootools.js b/notFinishedCode/tricode/mootools.js
new file mode 100644
index 0000000..45b1f3e
--- /dev/null
+++ b/notFinishedCode/tricode/mootools.js
@@ -0,0 +1,126 @@
+//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.
+
+var MooTools={'version':'1.2.0','build':''};var Native=function(options){options=options||{};var afterImplement=options.afterImplement||function(){};var generics=options.generics;generics=(generics!==false);var legacy=options.legacy;var initialize=options.initialize;var protect=options.protect;var name=options.name;var object=initialize||legacy;object.constructor=Native;object.$family={name:'native'};if(legacy&&initialize)object.prototype=legacy.prototype;object.prototype.constructor=object;if(name){var family=name.toLowerCase();object.prototype.$family={name:family};Native.typize(object,family);}
+var add=function(obj,name,method,force){if(!protect||force||!obj.prototype[name])obj.prototype[name]=method;if(generics)Native.genericize(obj,name,protect);afterImplement.call(obj,name,method);return obj;};object.implement=function(a1,a2,a3){if(typeof a1=='string')return add(this,a1,a2,a3);for(var p in a1)add(this,p,a1[p],a2);return this;};object.alias=function(a1,a2,a3){if(typeof a1=='string'){a1=this.prototype[a1];if(a1)add(this,a2,a1,a3);}else{for(var a in a1)this.alias(a,a1[a],a2);}
+return this;};return object;};Native.implement=function(objects,properties){for(var i=0,l=objects.length;i<l;i++)objects[i].implement(properties);};Native.genericize=function(object,property,check){if((!check||!object[property])&&typeof object.prototype[property]=='function')object[property]=function(){var args=Array.prototype.slice.call(arguments);return object.prototype[property].apply(args.shift(),args);};};Native.typize=function(object,family){if(!object.type)object.type=function(item){return($type(item)===family);};};Native.alias=function(objects,a1,a2,a3){for(var i=0,j=objects.length;i<j;i++)objects[i].alias(a1,a2,a3);};(function(objects){for(var name in objects)Native.typize(objects[name],name);})({'boolean':Boolean,'native':Native,'object':Object});(function(objects){for(var name in objects)new Native({name:name,initialize:objects[name],protect:true});})({'String':String,'Function':Function,'Number':Number,'Array':Array,'RegExp':RegExp,'Date':Date});(function(object,methods){for(var i=methods.length;i--;i)Native.genericize(object,methods[i],true);return arguments.callee;})
+(Array,['pop','push','reverse','shift','sort','splice','unshift','concat','join','slice','toString','valueOf','indexOf','lastIndexOf'])
+(String,['charAt','charCodeAt','concat','indexOf','lastIndexOf','match','replace','search','slice','split','substr','substring','toLowerCase','toUpperCase','valueOf']);function $chk(obj){return!!(obj||obj===0);};function $clear(timer){clearTimeout(timer);clearInterval(timer);return null;};function $defined(obj){return(obj!=undefined);};function $empty(){};function $arguments(i){return function(){return arguments[i];};};function $lambda(value){return(typeof value=='function')?value:function(){return value;};};function $extend(original,extended){for(var key in(extended||{}))original[key]=extended[key];return original;};function $unlink(object){var unlinked;switch($type(object)){case'object':unlinked={};for(var p in object)unlinked[p]=$unlink(object[p]);break;case'hash':unlinked=$unlink(object.getClean());break;case'array':unlinked=[];for(var i=0,l=object.length;i<l;i++)unlinked[i]=$unlink(object[i]);break;default:return object;}
+return unlinked;};function $merge(){var mix={};for(var i=0,l=arguments.length;i<l;i++){var object=arguments[i];if($type(object)!='object')continue;for(var key in object){var op=object[key],mp=mix[key];mix[key]=(mp&&$type(op)=='object'&&$type(mp)=='object')?$merge(mp,op):$unlink(op);}}
+return mix;};function $pick(){for(var i=0,l=arguments.length;i<l;i++){if(arguments[i]!=undefined)return arguments[i];}
+return null;};function $random(min,max){return Math.floor(Math.random()*(max-min+1)+min);};function $splat(obj){var type=$type(obj);return(type)?((type!='array'&&type!='arguments')?[obj]:obj):[];};var $time=Date.now||function(){return new Date().getTime();};function $try(){for(var i=0,l=arguments.length;i<l;i++){try{return arguments[i]();}catch(e){}}
+return null;};function $type(obj){if(obj==undefined)return false;if(obj.$family)return(obj.$family.name=='number'&&!isFinite(obj))?false:obj.$family.name;if(obj.nodeName){switch(obj.nodeType){case 1:return'element';case 3:return(/\S/).test(obj.nodeValue)?'textnode':'whitespace';}}else if(typeof obj.length=='number'){if(obj.callee)return'arguments';else if(obj.item)return'collection';}
+return typeof obj;};var Hash=new Native({name:'Hash',initialize:function(object){if($type(object)=='hash')object=$unlink(object.getClean());for(var key in object)this[key]=object[key];return this;}});Hash.implement({getLength:function(){var length=0;for(var key in this){if(this.hasOwnProperty(key))length++;}
+return length;},forEach:function(fn,bind){for(var key in this){if(this.hasOwnProperty(key))fn.call(bind,this[key],key,this);}},getClean:function(){var clean={};for(var key in this){if(this.hasOwnProperty(key))clean[key]=this[key];}
+return clean;}});Hash.alias('forEach','each');function $H(object){return new Hash(object);};Array.implement({forEach:function(fn,bind){for(var i=0,l=this.length;i<l;i++)fn.call(bind,this[i],i,this);}});Array.alias('forEach','each');function $A(iterable){if(iterable.item){var array=[];for(var i=0,l=iterable.length;i<l;i++)array[i]=iterable[i];return array;}
+return Array.prototype.slice.call(iterable);};function $each(iterable,fn,bind){var type=$type(iterable);((type=='arguments'||type=='collection'||type=='array')?Array:Hash).each(iterable,fn,bind);};var Browser=new Hash({Engine:{name:'unknown',version:''},Platform:{name:(navigator.platform.match(/mac|win|linux/i)||['other'])[0].toLowerCase()},Features:{xpath:!!(document.evaluate),air:!!(window.runtime)},Plugins:{}});if(window.opera)Browser.Engine={name:'presto',version:(document.getElementsByClassName)?950:925};else if(window.ActiveXObject)Browser.Engine={name:'trident',version:(window.XMLHttpRequest)?5:4};else if(!navigator.taintEnabled)Browser.Engine={name:'webkit',version:(Browser.Features.xpath)?420:419};else if(document.getBoxObjectFor!=null)Browser.Engine={name:'gecko',version:(document.getElementsByClassName)?19:18};Browser.Engine[Browser.Engine.name]=Browser.Engine[Browser.Engine.name+Browser.Engine.version]=true;if(window.orientation!=undefined)Browser.Platform.name='ipod';Browser.Platform[Browser.Platform.name]=true;Browser.Request=function(){return $try(function(){return new XMLHttpRequest();},function(){return new ActiveXObject('MSXML2.XMLHTTP');});};Browser.Features.xhr=!!(Browser.Request());Browser.Plugins.Flash=(function(){var version=($try(function(){return navigator.plugins['Shockwave Flash'].description;},function(){return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');})||'0 r0').match(/\d+/g);return{version:parseInt(version[0]||0+'.'+version[1]||0),build:parseInt(version[2]||0)};})();function $exec(text){if(!text)return text;if(window.execScript){window.execScript(text);}else{var script=document.createElement('script');script.setAttribute('type','text/javascript');script.text=text;document.head.appendChild(script);document.head.removeChild(script);}
+return text;};Native.UID=1;var $uid=(Browser.Engine.trident)?function(item){return(item.uid||(item.uid=[Native.UID++]))[0];}:function(item){return item.uid||(item.uid=Native.UID++);};var Window=new Native({name:'Window',legacy:(Browser.Engine.trident)?null:window.Window,initialize:function(win){$uid(win);if(!win.Element){win.Element=$empty;if(Browser.Engine.webkit)win.document.createElement("iframe");win.Element.prototype=(Browser.Engine.webkit)?window["[[DOMElement.prototype]]"]:{};}
+return $extend(win,Window.Prototype);},afterImplement:function(property,value){window[property]=Window.Prototype[property]=value;}});Window.Prototype={$family:{name:'window'}};new Window(window);var Document=new Native({name:'Document',legacy:(Browser.Engine.trident)?null:window.Document,initialize:function(doc){$uid(doc);doc.head=doc.getElementsByTagName('head')[0];doc.html=doc.getElementsByTagName('html')[0];doc.window=doc.defaultView||doc.parentWindow;if(Browser.Engine.trident4)$try(function(){doc.execCommand("BackgroundImageCache",false,true);});return $extend(doc,Document.Prototype);},afterImplement:function(property,value){document[property]=Document.Prototype[property]=value;}});Document.Prototype={$family:{name:'document'}};new Document(document);Array.implement({every:function(fn,bind){for(var i=0,l=this.length;i<l;i++){if(!fn.call(bind,this[i],i,this))return false;}
+return true;},filter:function(fn,bind){var results=[];for(var i=0,l=this.length;i<l;i++){if(fn.call(bind,this[i],i,this))results.push(this[i]);}
+return results;},clean:function(){return this.filter($defined);},indexOf:function(item,from){var len=this.length;for(var i=(from<0)?Math.max(0,len+from):from||0;i<len;i++){if(this[i]===item)return i;}
+return-1;},map:function(fn,bind){var results=[];for(var i=0,l=this.length;i<l;i++)results[i]=fn.call(bind,this[i],i,this);return results;},some:function(fn,bind){for(var i=0,l=this.length;i<l;i++){if(fn.call(bind,this[i],i,this))return true;}
+return false;},associate:function(keys){var obj={},length=Math.min(this.length,keys.length);for(var i=0;i<length;i++)obj[keys[i]]=this[i];return obj;},link:function(object){var result={};for(var i=0,l=this.length;i<l;i++){for(var key in object){if(object[key](this[i])){result[key]=this[i];delete object[key];break;}}}
+return result;},contains:function(item,from){return this.indexOf(item,from)!=-1;},extend:function(array){for(var i=0,j=array.length;i<j;i++)this.push(array[i]);return this;},getLast:function(){return(this.length)?this[this.length-1]:null;},getRandom:function(){return(this.length)?this[$random(0,this.length-1)]:null;},include:function(item){if(!this.contains(item))this.push(item);return this;},combine:function(array){for(var i=0,l=array.length;i<l;i++)this.include(array[i]);return this;},erase:function(item){for(var i=this.length;i--;i){if(this[i]===item)this.splice(i,1);}
+return this;},empty:function(){this.length=0;return this;},flatten:function(){var array=[];for(var i=0,l=this.length;i<l;i++){var type=$type(this[i]);if(!type)continue;array=array.concat((type=='array'||type=='collection'||type=='arguments')?Array.flatten(this[i]):this[i]);}
+return array;},hexToRgb:function(array){if(this.length!=3)return null;var rgb=this.map(function(value){if(value.length==1)value+=value;return value.toInt(16);});return(array)?rgb:'rgb('+rgb+')';},rgbToHex:function(array){if(this.length<3)return null;if(this.length==4&&this[3]==0&&!array)return'transparent';var hex=[];for(var i=0;i<3;i++){var bit=(this[i]-0).toString(16);hex.push((bit.length==1)?'0'+bit:bit);}
+return(array)?hex:'#'+hex.join('');}});Function.implement({extend:function(properties){for(var property in properties)this[property]=properties[property];return this;},create:function(options){var self=this;options=options||{};return function(event){var args=options.arguments;args=(args!=undefined)?$splat(args):Array.slice(arguments,(options.event)?1:0);if(options.event)args=[event||window.event].extend(args);var returns=function(){return self.apply(options.bind||null,args);};if(options.delay)return setTimeout(returns,options.delay);if(options.periodical)return setInterval(returns,options.periodical);if(options.attempt)return $try(returns);return returns();};},pass:function(args,bind){return this.create({arguments:args,bind:bind});},attempt:function(args,bind){return this.create({arguments:args,bind:bind,attempt:true})();},bind:function(bind,args){return this.create({bind:bind,arguments:args});},bindWithEvent:function(bind,args){return this.create({bind:bind,event:true,arguments:args});},delay:function(delay,bind,args){return this.create({delay:delay,bind:bind,arguments:args})();},periodical:function(interval,bind,args){return this.create({periodical:interval,bind:bind,arguments:args})();},run:function(args,bind){return this.apply(bind,$splat(args));}});Number.implement({limit:function(min,max){return Math.min(max,Math.max(min,this));},round:function(precision){precision=Math.pow(10,precision||0);return Math.round(this*precision)/precision;},times:function(fn,bind){for(var i=0;i<this;i++)fn.call(bind,i,this);},toFloat:function(){return parseFloat(this);},toInt:function(base){return parseInt(this,base||10);}});Number.alias('times','each');(function(math){var methods={};math.each(function(name){if(!Number[name])methods[name]=function(){return Math[name].apply(null,[this].concat($A(arguments)));};});Number.implement(methods);})(['abs','acos','asin','atan','atan2','ceil','cos','exp','floor','log','max','min','pow','sin','sqrt','tan']);String.implement({test:function(regex,params){return((typeof regex=='string')?new RegExp(regex,params):regex).test(this);},contains:function(string,separator){return(separator)?(separator+this+separator).indexOf(separator+string+separator)>-1:this.indexOf(string)>-1;},trim:function(){return this.replace(/^\s+|\s+$/g,'');},clean:function(){return this.replace(/\s+/g,' ').trim();},camelCase:function(){return this.replace(/-\D/g,function(match){return match.charAt(1).toUpperCase();});},hyphenate:function(){return this.replace(/[A-Z]/g,function(match){return('-'+match.charAt(0).toLowerCase());});},capitalize:function(){return this.replace(/\b[a-z]/g,function(match){return match.toUpperCase();});},escapeRegExp:function(){return this.replace(/([-.*+?^${}()|[\]\/\\])/g,'\\$1');},toInt:function(base){return parseInt(this,base||10);},toFloat:function(){return parseFloat(this);},hexToRgb:function(array){var hex=this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);return(hex)?hex.slice(1).hexToRgb(array):null;},rgbToHex:function(array){var rgb=this.match(/\d{1,3}/g);return(rgb)?rgb.rgbToHex(array):null;},stripScripts:function(option){var scripts='';var text=this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi,function(){scripts+=arguments[1]+'\n';return'';});if(option===true)$exec(scripts);else if($type(option)=='function')option(scripts,text);return text;},substitute:function(object,regexp){return this.replace(regexp||(/\\?\{([^}]+)\}/g),function(match,name){if(match.charAt(0)=='\\')return match.slice(1);return(object[name]!=undefined)?object[name]:'';});}});Hash.implement({has:Object.prototype.hasOwnProperty,keyOf:function(value){for(var key in this){if(this.hasOwnProperty(key)&&this[key]===value)return key;}
+return null;},hasValue:function(value){return(Hash.keyOf(this,value)!==null);},extend:function(properties){Hash.each(properties,function(value,key){Hash.set(this,key,value);},this);return this;},combine:function(properties){Hash.each(properties,function(value,key){Hash.include(this,key,value);},this);return this;},erase:function(key){if(this.hasOwnProperty(key))delete this[key];return this;},get:function(key){return(this.hasOwnProperty(key))?this[key]:null;},set:function(key,value){if(!this[key]||this.hasOwnProperty(key))this[key]=value;return this;},empty:function(){Hash.each(this,function(value,key){delete this[key];},this);return this;},include:function(key,value){var k=this[key];if(k==undefined)this[key]=value;return this;},map:function(fn,bind){var results=new Hash;Hash.each(this,function(value,key){results.set(key,fn.call(bind,value,key,this));},this);return results;},filter:function(fn,bind){var results=new Hash;Hash.each(this,function(value,key){if(fn.call(bind,value,key,this))results.set(key,value);},this);return results;},every:function(fn,bind){for(var key in this){if(this.hasOwnProperty(key)&&!fn.call(bind,this[key],key))return false;}
+return true;},some:function(fn,bind){for(var key in this){if(this.hasOwnProperty(key)&&fn.call(bind,this[key],key))return true;}
+return false;},getKeys:function(){var keys=[];Hash.each(this,function(value,key){keys.push(key);});return keys;},getValues:function(){var values=[];Hash.each(this,function(value){values.push(value);});return values;},toQueryString:function(base){var queryString=[];Hash.each(this,function(value,key){if(base)key=base+'['+key+']';var result;switch($type(value)){case'object':result=Hash.toQueryString(value,key);break;case'array':var qs={};value.each(function(val,i){qs[i]=val;});result=Hash.toQueryString(qs,key);break;default:result=key+'='+encodeURIComponent(value);}
+if(value!=undefined)queryString.push(result);});return queryString.join('&');}});Hash.alias({keyOf:'indexOf',hasValue:'contains'});var Event=new Native({name:'Event',initialize:function(event,win){win=win||window;var doc=win.document;event=event||win.event;if(event.$extended)return event;this.$extended=true;var type=event.type;var target=event.target||event.srcElement;while(target&&target.nodeType==3)target=target.parentNode;if(type.test(/key/)){var code=event.which||event.keyCode;var key=Event.Keys.keyOf(code);if(type=='keydown'){var fKey=code-111;if(fKey>0&&fKey<13)key='f'+fKey;}
+key=key||String.fromCharCode(code).toLowerCase();}else if(type.match(/(click|mouse|menu)/i)){doc=(!doc.compatMode||doc.compatMode=='CSS1Compat')?doc.html:doc.body;var page={x:event.pageX||event.clientX+doc.scrollLeft,y:event.pageY||event.clientY+doc.scrollTop};var client={x:(event.pageX)?event.pageX-win.pageXOffset:event.clientX,y:(event.pageY)?event.pageY-win.pageYOffset:event.clientY};if(type.match(/DOMMouseScroll|mousewheel/)){var wheel=(event.wheelDelta)?event.wheelDelta/120:-(event.detail||0)/3;}
+var rightClick=(event.which==3)||(event.button==2);var related=null;if(type.match(/over|out/)){switch(type){case'mouseover':related=event.relatedTarget||event.fromElement;break;case'mouseout':related=event.relatedTarget||event.toElement;}
+if(!(function(){while(related&&related.nodeType==3)related=related.parentNode;return true;}).create({attempt:Browser.Engine.gecko})())related=false;}}
+return $extend(this,{event:event,type:type,page:page,client:client,rightClick:rightClick,wheel:wheel,relatedTarget:related,target:target,code:code,key:key,shift:event.shiftKey,control:event.ctrlKey,alt:event.altKey,meta:event.metaKey});}});Event.Keys=new Hash({'enter':13,'up':38,'down':40,'left':37,'right':39,'esc':27,'space':32,'backspace':8,'tab':9,'delete':46});Event.implement({stop:function(){return this.stopPropagation().preventDefault();},stopPropagation:function(){if(this.event.stopPropagation)this.event.stopPropagation();else this.event.cancelBubble=true;return this;},preventDefault:function(){if(this.event.preventDefault)this.event.preventDefault();else this.event.returnValue=false;return this;}});var Class=new Native({name:'Class',initialize:function(properties){properties=properties||{};var klass=function(empty){for(var key in this)this[key]=$unlink(this[key]);for(var mutator in Class.Mutators){if(!this[mutator])continue;Class.Mutators[mutator](this,this[mutator]);delete this[mutator];}
+this.constructor=klass;if(empty===$empty)return this;var self=(this.initialize)?this.initialize.apply(this,arguments):this;if(this.options&&this.options.initialize)this.options.initialize.call(this);return self;};$extend(klass,this);klass.constructor=Class;klass.prototype=properties;return klass;}});Class.implement({implement:function(){Class.Mutators.Implements(this.prototype,Array.slice(arguments));return this;}});Class.Mutators={Implements:function(self,klasses){$splat(klasses).each(function(klass){$extend(self,($type(klass)=='class')?new klass($empty):klass);});},Extends:function(self,klass){var instance=new klass($empty);delete instance.parent;delete instance.parentOf;for(var key in instance){var current=self[key],previous=instance[key];if(current==undefined){self[key]=previous;continue;}
+var ctype=$type(current),ptype=$type(previous);if(ctype!=ptype)continue;switch(ctype){case'function':if(!arguments.callee.caller)self[key]=eval('('+String(current).replace(/\bthis\.parent\(\s*(\))?/g,function(full,close){return'arguments.callee._parent_.call(this'+(close||', ');})+')');self[key]._parent_=previous;break;case'object':self[key]=$merge(previous,current);}}
+self.parent=function(){return arguments.callee.caller._parent_.apply(this,arguments);};self.parentOf=function(descendant){return descendant._parent_.apply(this,Array.slice(arguments,1));};}};var Chain=new Class({chain:function(){this.$chain=(this.$chain||[]).extend(arguments);return this;},callChain:function(){return(this.$chain&&this.$chain.length)?this.$chain.shift().apply(this,arguments):false;},clearChain:function(){if(this.$chain)this.$chain.empty();return this;}});var Events=new Class({addEvent:function(type,fn,internal){type=Events.removeOn(type);if(fn!=$empty){this.$events=this.$events||{};this.$events[type]=this.$events[type]||[];this.$events[type].include(fn);if(internal)fn.internal=true;}
+return this;},addEvents:function(events){for(var type in events)this.addEvent(type,events[type]);return this;},fireEvent:function(type,args,delay){type=Events.removeOn(type);if(!this.$events||!this.$events[type])return this;this.$events[type].each(function(fn){fn.create({'bind':this,'delay':delay,'arguments':args})();},this);return this;},removeEvent:function(type,fn){type=Events.removeOn(type);if(!this.$events||!this.$events[type])return this;if(!fn.internal)this.$events[type].erase(fn);return this;},removeEvents:function(type){for(var e in this.$events){if(type&&type!=e)continue;var fns=this.$events[e];for(var i=fns.length;i--;i)this.removeEvent(e,fns[i]);}
+return this;}});Events.removeOn=function(string){return string.replace(/^on([A-Z])/,function(full,first){return first.toLowerCase();});};var Options=new Class({setOptions:function(){this.options=$merge.run([this.options].extend(arguments));if(!this.addEvent)return this;for(var option in this.options){if($type(this.options[option])!='function'||!(/^on[A-Z]/).test(option))continue;this.addEvent(option,this.options[option]);delete this.options[option];}
+return this;}});Document.implement({newElement:function(tag,props){if(Browser.Engine.trident&&props){['name','type','checked'].each(function(attribute){if(!props[attribute])return;tag+=' '+attribute+'="'+props[attribute]+'"';if(attribute!='checked')delete props[attribute];});tag='<'+tag+'>';}
+return $.element(this.createElement(tag)).set(props);},newTextNode:function(text){return this.createTextNode(text);},getDocument:function(){return this;},getWindow:function(){return this.defaultView||this.parentWindow;},purge:function(){var elements=this.getElementsByTagName('*');for(var i=0,l=elements.length;i<l;i++)Browser.freeMem(elements[i]);}});var Element=new Native({name:'Element',legacy:window.Element,initialize:function(tag,props){var konstructor=Element.Constructors.get(tag);if(konstructor)return konstructor(props);if(typeof tag=='string')return document.newElement(tag,props);return $(tag).set(props);},afterImplement:function(key,value){if(!Array[key])Elements.implement(key,Elements.multi(key));Element.Prototype[key]=value;}});Element.Prototype={$family:{name:'element'}};Element.Constructors=new Hash;var IFrame=new Native({name:'IFrame',generics:false,initialize:function(){var params=Array.link(arguments,{properties:Object.type,iframe:$defined});var props=params.properties||{};var iframe=$(params.iframe)||false;var onload=props.onload||$empty;delete props.onload;props.id=props.name=$pick(props.id,props.name,iframe.id,iframe.name,'IFrame_'+$time());iframe=new Element(iframe||'iframe',props);var onFrameLoad=function(){var host=$try(function(){return iframe.contentWindow.location.host;});if(host&&host==window.location.host){var win=new Window(iframe.contentWindow);var doc=new Document(iframe.contentWindow.document);$extend(win.Element.prototype,Element.Prototype);}
+onload.call(iframe.contentWindow,iframe.contentWindow.document);};(!window.frames[props.id])?iframe.addListener('load',onFrameLoad):onFrameLoad();return iframe;}});var Elements=new Native({initialize:function(elements,options){options=$extend({ddup:true,cash:true},options);elements=elements||[];if(options.ddup||options.cash){var uniques={},returned=[];for(var i=0,l=elements.length;i<l;i++){var el=$.element(elements[i],!options.cash);if(options.ddup){if(uniques[el.uid])continue;uniques[el.uid]=true;}
+returned.push(el);}
+elements=returned;}
+return(options.cash)?$extend(elements,this):elements;}});Elements.implement({filter:function(filter,bind){if(!filter)return this;return new Elements(Array.filter(this,(typeof filter=='string')?function(item){return item.match(filter);}:filter,bind));}});Elements.multi=function(property){return function(){var items=[];var elements=true;for(var i=0,j=this.length;i<j;i++){var returns=this[i][property].apply(this[i],arguments);items.push(returns);if(elements)elements=($type(returns)=='element');}
+return(elements)?new Elements(items):items;};};Window.implement({$:function(el,nocash){if(el&&el.$family&&el.uid)return el;var type=$type(el);return($[type])?$[type](el,nocash,this.document):null;},$$:function(selector){if(arguments.length==1&&typeof selector=='string')return this.document.getElements(selector);var elements=[];var args=Array.flatten(arguments);for(var i=0,l=args.length;i<l;i++){var item=args[i];switch($type(item)){case'element':item=[item];break;case'string':item=this.document.getElements(item,true);break;default:item=false;}
+if(item)elements.extend(item);}
+return new Elements(elements);},getDocument:function(){return this.document;},getWindow:function(){return this;}});$.string=function(id,nocash,doc){id=doc.getElementById(id);return(id)?$.element(id,nocash):null;};$.element=function(el,nocash){$uid(el);if(!nocash&&!el.$family&&!(/^object|embed$/i).test(el.tagName)){var proto=Element.Prototype;for(var p in proto)el[p]=proto[p];};return el;};$.object=function(obj,nocash,doc){if(obj.toElement)return $.element(obj.toElement(doc),nocash);return null;};$.textnode=$.whitespace=$.window=$.document=$arguments(0);Native.implement([Element,Document],{getElement:function(selector,nocash){return $(this.getElements(selector,true)[0]||null,nocash);},getElements:function(tags,nocash){tags=tags.split(',');var elements=[];var ddup=(tags.length>1);tags.each(function(tag){var partial=this.getElementsByTagName(tag.trim());(ddup)?elements.extend(partial):elements=partial;},this);return new Elements(elements,{ddup:ddup,cash:!nocash});}});Element.Storage={get:function(uid){return(this[uid]||(this[uid]={}));}};Element.Inserters=new Hash({before:function(context,element){if(element.parentNode)element.parentNode.insertBefore(context,element);},after:function(context,element){if(!element.parentNode)return;var next=element.nextSibling;(next)?element.parentNode.insertBefore(context,next):element.parentNode.appendChild(context);},bottom:function(context,element){element.appendChild(context);},top:function(context,element){var first=element.firstChild;(first)?element.insertBefore(context,first):element.appendChild(context);}});Element.Inserters.inside=Element.Inserters.bottom;Element.Inserters.each(function(value,key){var Key=key.capitalize();Element.implement('inject'+Key,function(el){value(this,$(el,true));return this;});Element.implement('grab'+Key,function(el){value($(el,true),this);return this;});});Element.implement({getDocument:function(){return this.ownerDocument;},getWindow:function(){return this.ownerDocument.getWindow();},getElementById:function(id,nocash){var el=this.ownerDocument.getElementById(id);if(!el)return null;for(var parent=el.parentNode;parent!=this;parent=parent.parentNode){if(!parent)return null;}
+return $.element(el,nocash);},set:function(prop,value){switch($type(prop)){case'object':for(var p in prop)this.set(p,prop[p]);break;case'string':var property=Element.Properties.get(prop);(property&&property.set)?property.set.apply(this,Array.slice(arguments,1)):this.setProperty(prop,value);}
+return this;},get:function(prop){var property=Element.Properties.get(prop);return(property&&property.get)?property.get.apply(this,Array.slice(arguments,1)):this.getProperty(prop);},erase:function(prop){var property=Element.Properties.get(prop);(property&&property.erase)?property.erase.apply(this,Array.slice(arguments,1)):this.removeProperty(prop);return this;},match:function(tag){return(!tag||Element.get(this,'tag')==tag);},inject:function(el,where){Element.Inserters.get(where||'bottom')(this,$(el,true));return this;},wraps:function(el,where){el=$(el,true);return this.replaces(el).grab(el,where);},grab:function(el,where){Element.Inserters.get(where||'bottom')($(el,true),this);return this;},appendText:function(text,where){return this.grab(this.getDocument().newTextNode(text),where);},adopt:function(){Array.flatten(arguments).each(function(element){element=$(element,true);if(element)this.appendChild(element);},this);return this;},dispose:function(){return(this.parentNode)?this.parentNode.removeChild(this):this;},clone:function(contents,keepid){switch($type(this)){case'element':var attributes={};for(var j=0,l=this.attributes.length;j<l;j++){var attribute=this.attributes[j],key=attribute.nodeName.toLowerCase();if(Browser.Engine.trident&&(/input/i).test(this.tagName)&&(/width|height/).test(key))continue;var value=(key=='style'&&this.style)?this.style.cssText:attribute.nodeValue;if(!$chk(value)||key=='uid'||(key=='id'&&!keepid))continue;if(value!='inherit'&&['string','number'].contains($type(value)))attributes[key]=value;}
+var element=new Element(this.nodeName.toLowerCase(),attributes);if(contents!==false){for(var i=0,k=this.childNodes.length;i<k;i++){var child=Element.clone(this.childNodes[i],true,keepid);if(child)element.grab(child);}}
+return element;case'textnode':return document.newTextNode(this.nodeValue);}
+return null;},replaces:function(el){el=$(el,true);el.parentNode.replaceChild(this,el);return this;},hasClass:function(className){return this.className.contains(className,' ');},addClass:function(className){if(!this.hasClass(className))this.className=(this.className+' '+className).clean();return this;},removeClass:function(className){this.className=this.className.replace(new RegExp('(^|\\s)'+className+'(?:\\s|$)'),'$1').clean();return this;},toggleClass:function(className){return this.hasClass(className)?this.removeClass(className):this.addClass(className);},getComputedStyle:function(property){if(this.currentStyle)return this.currentStyle[property.camelCase()];var computed=this.getWindow().getComputedStyle(this,null);return(computed)?computed.getPropertyValue([property.hyphenate()]):null;},empty:function(){$A(this.childNodes).each(function(node){Browser.freeMem(node);Element.empty(node);Element.dispose(node);},this);return this;},destroy:function(){Browser.freeMem(this.empty().dispose());return null;},getSelected:function(){return new Elements($A(this.options).filter(function(option){return option.selected;}));},toQueryString:function(){var queryString=[];this.getElements('input, select, textarea').each(function(el){if(!el.name||el.disabled)return;var value=(el.tagName.toLowerCase()=='select')?Element.getSelected(el).map(function(opt){return opt.value;}):((el.type=='radio'||el.type=='checkbox')&&!el.checked)?null:el.value;$splat(value).each(function(val){if(val)queryString.push(el.name+'='+encodeURIComponent(val));});});return queryString.join('&');},getProperty:function(attribute){var EA=Element.Attributes,key=EA.Props[attribute];var value=(key)?this[key]:this.getAttribute(attribute,2);return(EA.Bools[attribute])?!!value:(key)?value:value||null;},getProperties:function(){var args=$A(arguments);return args.map(function(attr){return this.getProperty(attr);},this).associate(args);},setProperty:function(attribute,value){var EA=Element.Attributes,key=EA.Props[attribute],hasValue=$defined(value);if(key&&EA.Bools[attribute])value=(value||!hasValue)?true:false;else if(!hasValue)return this.removeProperty(attribute);(key)?this[key]=value:this.setAttribute(attribute,value);return this;},setProperties:function(attributes){for(var attribute in attributes)this.setProperty(attribute,attributes[attribute]);return this;},removeProperty:function(attribute){var EA=Element.Attributes,key=EA.Props[attribute],isBool=(key&&EA.Bools[attribute]);(key)?this[key]=(isBool)?false:'':this.removeAttribute(attribute);return this;},removeProperties:function(){Array.each(arguments,this.removeProperty,this);return this;}});(function(){var walk=function(element,walk,start,match,all,nocash){var el=element[start||walk];var elements=[];while(el){if(el.nodeType==1&&(!match||Element.match(el,match))){elements.push(el);if(!all)break;}
+el=el[walk];}
+return(all)?new Elements(elements,{ddup:false,cash:!nocash}):$(elements[0],nocash);};Element.implement({getPrevious:function(match,nocash){return walk(this,'previousSibling',null,match,false,nocash);},getAllPrevious:function(match,nocash){return walk(this,'previousSibling',null,match,true,nocash);},getNext:function(match,nocash){return walk(this,'nextSibling',null,match,false,nocash);},getAllNext:function(match,nocash){return walk(this,'nextSibling',null,match,true,nocash);},getFirst:function(match,nocash){return walk(this,'nextSibling','firstChild',match,false,nocash);},getLast:function(match,nocash){return walk(this,'previousSibling','lastChild',match,false,nocash);},getParent:function(match,nocash){return walk(this,'parentNode',null,match,false,nocash);},getParents:function(match,nocash){return walk(this,'parentNode',null,match,true,nocash);},getChildren:function(match,nocash){return walk(this,'nextSibling','firstChild',match,true,nocash);},hasChild:function(el){el=$(el,true);return(!!el&&$A(this.getElementsByTagName(el.tagName)).contains(el));}});})();Element.Properties=new Hash;Element.Properties.style={set:function(style){this.style.cssText=style;},get:function(){return this.style.cssText;},erase:function(){this.style.cssText='';}};Element.Properties.tag={get:function(){return this.tagName.toLowerCase();}};Element.Properties.href={get:function(){return(!this.href)?null:this.href.replace(new RegExp('^'+document.location.protocol+'\/\/'+document.location.host),'');}};Element.Properties.html={set:function(){return this.innerHTML=Array.flatten(arguments).join('');}};Native.implement([Element,Window,Document],{addListener:function(type,fn){if(this.addEventListener)this.addEventListener(type,fn,false);else this.attachEvent('on'+type,fn);return this;},removeListener:function(type,fn){if(this.removeEventListener)this.removeEventListener(type,fn,false);else this.detachEvent('on'+type,fn);return this;},retrieve:function(property,dflt){var storage=Element.Storage.get(this.uid);var prop=storage[property];if($defined(dflt)&&!$defined(prop))prop=storage[property]=dflt;return $pick(prop);},store:function(property,value){var storage=Element.Storage.get(this.uid);storage[property]=value;return this;},eliminate:function(property){var storage=Element.Storage.get(this.uid);delete storage[property];return this;}});Element.Attributes=new Hash({Props:{'html':'innerHTML','class':'className','for':'htmlFor','text':(Browser.Engine.trident)?'innerText':'textContent'},Bools:['compact','nowrap','ismap','declare','noshade','checked','disabled','readonly','multiple','selected','noresize','defer'],Camels:['value','accessKey','cellPadding','cellSpacing','colSpan','frameBorder','maxLength','readOnly','rowSpan','tabIndex','useMap']});Browser.freeMem=function(item){if(!item)return;if(Browser.Engine.trident&&(/object/i).test(item.tagName)){for(var p in item){if(typeof item[p]=='function')item[p]=$empty;}
+Element.dispose(item);}
+if(item.uid&&item.removeEvents)item.removeEvents();};(function(EA){var EAB=EA.Bools,EAC=EA.Camels;EA.Bools=EAB=EAB.associate(EAB);Hash.extend(Hash.combine(EA.Props,EAB),EAC.associate(EAC.map(function(v){return v.toLowerCase();})));EA.erase('Camels');})(Element.Attributes);window.addListener('unload',function(){window.removeListener('unload',arguments.callee);document.purge();if(Browser.Engine.trident)CollectGarbage();});Element.Properties.events={set:function(events){this.addEvents(events);}};Native.implement([Element,Window,Document],{addEvent:function(type,fn){var events=this.retrieve('events',{});events[type]=events[type]||{'keys':[],'values':[]};if(events[type].keys.contains(fn))return this;events[type].keys.push(fn);var realType=type,custom=Element.Events.get(type),condition=fn,self=this;if(custom){if(custom.onAdd)custom.onAdd.call(this,fn);if(custom.condition){condition=function(event){if(custom.condition.call(this,event))return fn.call(this,event);return false;};}
+realType=custom.base||realType;}
+var defn=function(){return fn.call(self);};var nativeEvent=Element.NativeEvents[realType]||0;if(nativeEvent){if(nativeEvent==2){defn=function(event){event=new Event(event,self.getWindow());if(condition.call(self,event)===false)event.stop();};}
+this.addListener(realType,defn);}
+events[type].values.push(defn);return this;},removeEvent:function(type,fn){var events=this.retrieve('events');if(!events||!events[type])return this;var pos=events[type].keys.indexOf(fn);if(pos==-1)return this;var key=events[type].keys.splice(pos,1)[0];var value=events[type].values.splice(pos,1)[0];var custom=Element.Events.get(type);if(custom){if(custom.onRemove)custom.onRemove.call(this,fn);type=custom.base||type;}
+return(Element.NativeEvents[type])?this.removeListener(type,value):this;},addEvents:function(events){for(var event in events)this.addEvent(event,events[event]);return this;},removeEvents:function(type){var events=this.retrieve('events');if(!events)return this;if(!type){for(var evType in events)this.removeEvents(evType);events=null;}else if(events[type]){while(events[type].keys[0])this.removeEvent(type,events[type].keys[0]);events[type]=null;}
+return this;},fireEvent:function(type,args,delay){var events=this.retrieve('events');if(!events||!events[type])return this;events[type].keys.each(function(fn){fn.create({'bind':this,'delay':delay,'arguments':args})();},this);return this;},cloneEvents:function(from,type){from=$(from);var fevents=from.retrieve('events');if(!fevents)return this;if(!type){for(var evType in fevents)this.cloneEvents(from,evType);}else if(fevents[type]){fevents[type].keys.each(function(fn){this.addEvent(type,fn);},this);}
+return this;}});Element.NativeEvents={click:2,dblclick:2,mouseup:2,mousedown:2,contextmenu:2,mousewheel:2,DOMMouseScroll:2,mouseover:2,mouseout:2,mousemove:2,selectstart:2,selectend:2,keydown:2,keypress:2,keyup:2,focus:2,blur:2,change:2,reset:2,select:2,submit:2,load:1,unload:1,beforeunload:2,resize:1,move:1,DOMContentLoaded:1,readystatechange:1,error:1,abort:1,scroll:1};(function(){var $check=function(event){var related=event.relatedTarget;if(related==undefined)return true;if(related===false)return false;return($type(this)!='document'&&related!=this&&related.prefix!='xul'&&!this.hasChild(related));};Element.Events=new Hash({mouseenter:{base:'mouseover',condition:$check},mouseleave:{base:'mouseout',condition:$check},mousewheel:{base:(Browser.Engine.gecko)?'DOMMouseScroll':'mousewheel'}});})();Element.Properties.styles={set:function(styles){this.setStyles(styles);}};Element.Properties.opacity={set:function(opacity,novisibility){if(!novisibility){if(opacity==0){if(this.style.visibility!='hidden')this.style.visibility='hidden';}else{if(this.style.visibility!='visible')this.style.visibility='visible';}}
+if(!this.currentStyle||!this.currentStyle.hasLayout)this.style.zoom=1;if(Browser.Engine.trident)this.style.filter=(opacity==1)?'':'alpha(opacity='+opacity*100+')';this.style.opacity=opacity;this.store('opacity',opacity);},get:function(){return this.retrieve('opacity',1);}};Element.implement({setOpacity:function(value){return this.set('opacity',value,true);},getOpacity:function(){return this.get('opacity');},setStyle:function(property,value){switch(property){case'opacity':return this.set('opacity',parseFloat(value));case'float':property=(Browser.Engine.trident)?'styleFloat':'cssFloat';}
+property=property.camelCase();if($type(value)!='string'){var map=(Element.Styles.get(property)||'@').split(' ');value=$splat(value).map(function(val,i){if(!map[i])return'';return($type(val)=='number')?map[i].replace('@',Math.round(val)):val;}).join(' ');}else if(value==String(Number(value))){value=Math.round(value);}
+this.style[property]=value;return this;},getStyle:function(property){switch(property){case'opacity':return this.get('opacity');case'float':property=(Browser.Engine.trident)?'styleFloat':'cssFloat';}
+property=property.camelCase();var result=this.style[property];if(!$chk(result)){result=[];for(var style in Element.ShortStyles){if(property!=style)continue;for(var s in Element.ShortStyles[style])result.push(this.getStyle(s));return result.join(' ');}
+result=this.getComputedStyle(property);}
+if(result){result=String(result);var color=result.match(/rgba?\([\d\s,]+\)/);if(color)result=result.replace(color[0],color[0].rgbToHex());}
+if(Browser.Engine.presto||(Browser.Engine.trident&&!$chk(parseInt(result)))){if(property.test(/^(height|width)$/)){var values=(property=='width')?['left','right']:['top','bottom'],size=0;values.each(function(value){size+=this.getStyle('border-'+value+'-width').toInt()+this.getStyle('padding-'+value).toInt();},this);return this['offset'+property.capitalize()]-size+'px';}
+if(Browser.Engine.presto&&String(result).test('px'))return result;if(property.test(/(border(.+)Width|margin|padding)/))return'0px';}
+return result;},setStyles:function(styles){for(var style in styles)this.setStyle(style,styles[style]);return this;},getStyles:function(){var result={};Array.each(arguments,function(key){result[key]=this.getStyle(key);},this);return result;}});Element.Styles=new Hash({left:'@px',top:'@px',bottom:'@px',right:'@px',width:'@px',height:'@px',maxWidth:'@px',maxHeight:'@px',minWidth:'@px',minHeight:'@px',backgroundColor:'rgb(@, @, @)',backgroundPosition:'@px @px',color:'rgb(@, @, @)',fontSize:'@px',letterSpacing:'@px',lineHeight:'@px',clip:'rect(@px @px @px @px)',margin:'@px @px @px @px',padding:'@px @px @px @px',border:'@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',borderWidth:'@px @px @px @px',borderStyle:'@ @ @ @',borderColor:'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',zIndex:'@','zoom':'@',fontWeight:'@',textIndent:'@px',opacity:'@'});Element.ShortStyles={margin:{},padding:{},border:{},borderWidth:{},borderStyle:{},borderColor:{}};['Top','Right','Bottom','Left'].each(function(direction){var Short=Element.ShortStyles;var All=Element.Styles;['margin','padding'].each(function(style){var sd=style+direction;Short[style][sd]=All[sd]='@px';});var bd='border'+direction;Short.border[bd]=All[bd]='@px @ rgb(@, @, @)';var bdw=bd+'Width',bds=bd+'Style',bdc=bd+'Color';Short[bd]={};Short.borderWidth[bdw]=Short[bd][bdw]=All[bdw]='@px';Short.borderStyle[bds]=Short[bd][bds]=All[bds]='@';Short.borderColor[bdc]=Short[bd][bdc]=All[bdc]='rgb(@, @, @)';});(function(){Element.implement({scrollTo:function(x,y){if(isBody(this)){this.getWindow().scrollTo(x,y);}else{this.scrollLeft=x;this.scrollTop=y;}
+return this;},getSize:function(){if(isBody(this))return this.getWindow().getSize();return{x:this.offsetWidth,y:this.offsetHeight};},getScrollSize:function(){if(isBody(this))return this.getWindow().getScrollSize();return{x:this.scrollWidth,y:this.scrollHeight};},getScroll:function(){if(isBody(this))return this.getWindow().getScroll();return{x:this.scrollLeft,y:this.scrollTop};},getScrolls:function(){var element=this,position={x:0,y:0};while(element&&!isBody(element)){position.x+=element.scrollLeft;position.y+=element.scrollTop;element=element.parentNode;}
+return position;},getOffsetParent:function(){var element=this;if(isBody(element))return null;if(!Browser.Engine.trident)return element.offsetParent;while((element=element.parentNode)&&!isBody(element)){if(styleString(element,'position')!='static')return element;}
+return null;},getOffsets:function(){var element=this,position={x:0,y:0};if(isBody(this))return position;while(element&&!isBody(element)){position.x+=element.offsetLeft;position.y+=element.offsetTop;if(Browser.Engine.gecko){if(!borderBox(element)){position.x+=leftBorder(element);position.y+=topBorder(element);}
+var parent=element.parentNode;if(parent&&styleString(parent,'overflow')!='visible'){position.x+=leftBorder(parent);position.y+=topBorder(parent);}}else if(element!=this&&(Browser.Engine.trident||Browser.Engine.webkit)){position.x+=leftBorder(element);position.y+=topBorder(element);}
+element=element.offsetParent;if(Browser.Engine.trident){while(element&&!element.currentStyle.hasLayout)element=element.offsetParent;}}
+if(Browser.Engine.gecko&&!borderBox(this)){position.x-=leftBorder(this);position.y-=topBorder(this);}
+return position;},getPosition:function(relative){if(isBody(this))return{x:0,y:0};var offset=this.getOffsets(),scroll=this.getScrolls();var position={x:offset.x-scroll.x,y:offset.y-scroll.y};var relativePosition=(relative&&(relative=$(relative)))?relative.getPosition():{x:0,y:0};return{x:position.x-relativePosition.x,y:position.y-relativePosition.y};},getCoordinates:function(element){if(isBody(this))return this.getWindow().getCoordinates();var position=this.getPosition(element),size=this.getSize();var obj={left:position.x,top:position.y,width:size.x,height:size.y};obj.right=obj.left+obj.width;obj.bottom=obj.top+obj.height;return obj;},computePosition:function(obj){return{left:obj.x-styleNumber(this,'margin-left'),top:obj.y-styleNumber(this,'margin-top')};},position:function(obj){return this.setStyles(this.computePosition(obj));}});Native.implement([Document,Window],{getSize:function(){var win=this.getWindow();if(Browser.Engine.presto||Browser.Engine.webkit)return{x:win.innerWidth,y:win.innerHeight};var doc=getCompatElement(this);return{x:doc.clientWidth,y:doc.clientHeight};},getScroll:function(){var win=this.getWindow();var doc=getCompatElement(this);return{x:win.pageXOffset||doc.scrollLeft,y:win.pageYOffset||doc.scrollTop};},getScrollSize:function(){var doc=getCompatElement(this);var min=this.getSize();return{x:Math.max(doc.scrollWidth,min.x),y:Math.max(doc.scrollHeight,min.y)};},getPosition:function(){return{x:0,y:0};},getCoordinates:function(){var size=this.getSize();return{top:0,left:0,bottom:size.y,right:size.x,height:size.y,width:size.x};}});var styleString=Element.getComputedStyle;function styleNumber(element,style){return styleString(element,style).toInt()||0;};function borderBox(element){return styleString(element,'-moz-box-sizing')=='border-box';};function topBorder(element){return styleNumber(element,'border-top-width');};function leftBorder(element){return styleNumber(element,'border-left-width');};function isBody(element){return(/^(?:body|html)$/i).test(element.tagName);};function getCompatElement(element){var doc=element.getDocument();return(!doc.compatMode||doc.compatMode=='CSS1Compat')?doc.html:doc.body;};})();Native.implement([Window,Document,Element],{getHeight:function(){return this.getSize().y;},getWidth:function(){return this.getSize().x;},getScrollTop:function(){return this.getScroll().y;},getScrollLeft:function(){return this.getScroll().x;},getScrollHeight:function(){return this.getScrollSize().y;},getScrollWidth:function(){return this.getScrollSize().x;},getTop:function(){return this.getPosition().y;},getLeft:function(){return this.getPosition().x;}});Native.implement([Document,Element],{getElements:function(expression,nocash){expression=expression.split(',');var items,local={};for(var i=0,l=expression.length;i<l;i++){var selector=expression[i],elements=Selectors.Utils.search(this,selector,local);if(i!=0&&elements.item)elements=$A(elements);items=(i==0)?elements:(items.item)?$A(items).concat(elements):items.concat(elements);}
+return new Elements(items,{ddup:(expression.length>1),cash:!nocash});}});Element.implement({match:function(selector){if(!selector)return true;var tagid=Selectors.Utils.parseTagAndID(selector);var tag=tagid[0],id=tagid[1];if(!Selectors.Filters.byID(this,id)||!Selectors.Filters.byTag(this,tag))return false;var parsed=Selectors.Utils.parseSelector(selector);return(parsed)?Selectors.Utils.filter(this,parsed,{}):true;}});var Selectors={Cache:{nth:{},parsed:{}}};Selectors.RegExps={id:(/#([\w-]+)/),tag:(/^(\w+|\*)/),quick:(/^(\w+|\*)$/),splitter:(/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g),combined:(/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)["']?(.*?)["']?)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g)};Selectors.Utils={chk:function(item,uniques){if(!uniques)return true;var uid=$uid(item);if(!uniques[uid])return uniques[uid]=true;return false;},parseNthArgument:function(argument){if(Selectors.Cache.nth[argument])return Selectors.Cache.nth[argument];var parsed=argument.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/);if(!parsed)return false;var inta=parseInt(parsed[1]);var a=(inta||inta===0)?inta:1;var special=parsed[2]||false;var b=parseInt(parsed[3])||0;if(a!=0){b--;while(b<1)b+=a;while(b>=a)b-=a;}else{a=b;special='index';}
+switch(special){case'n':parsed={a:a,b:b,special:'n'};break;case'odd':parsed={a:2,b:0,special:'n'};break;case'even':parsed={a:2,b:1,special:'n'};break;case'first':parsed={a:0,special:'index'};break;case'last':parsed={special:'last-child'};break;case'only':parsed={special:'only-child'};break;default:parsed={a:(a-1),special:'index'};}
+return Selectors.Cache.nth[argument]=parsed;},parseSelector:function(selector){if(Selectors.Cache.parsed[selector])return Selectors.Cache.parsed[selector];var m,parsed={classes:[],pseudos:[],attributes:[]};while((m=Selectors.RegExps.combined.exec(selector))){var cn=m[1],an=m[2],ao=m[3],av=m[4],pn=m[5],pa=m[6];if(cn){parsed.classes.push(cn);}else if(pn){var parser=Selectors.Pseudo.get(pn);if(parser)parsed.pseudos.push({parser:parser,argument:pa});else parsed.attributes.push({name:pn,operator:'=',value:pa});}else if(an){parsed.attributes.push({name:an,operator:ao,value:av});}}
+if(!parsed.classes.length)delete parsed.classes;if(!parsed.attributes.length)delete parsed.attributes;if(!parsed.pseudos.length)delete parsed.pseudos;if(!parsed.classes&&!parsed.attributes&&!parsed.pseudos)parsed=null;return Selectors.Cache.parsed[selector]=parsed;},parseTagAndID:function(selector){var tag=selector.match(Selectors.RegExps.tag);var id=selector.match(Selectors.RegExps.id);return[(tag)?tag[1]:'*',(id)?id[1]:false];},filter:function(item,parsed,local){var i;if(parsed.classes){for(i=parsed.classes.length;i--;i){var cn=parsed.classes[i];if(!Selectors.Filters.byClass(item,cn))return false;}}
+if(parsed.attributes){for(i=parsed.attributes.length;i--;i){var att=parsed.attributes[i];if(!Selectors.Filters.byAttribute(item,att.name,att.operator,att.value))return false;}}
+if(parsed.pseudos){for(i=parsed.pseudos.length;i--;i){var psd=parsed.pseudos[i];if(!Selectors.Filters.byPseudo(item,psd.parser,psd.argument,local))return false;}}
+return true;},getByTagAndID:function(ctx,tag,id){if(id){var item=(ctx.getElementById)?ctx.getElementById(id,true):Element.getElementById(ctx,id,true);return(item&&Selectors.Filters.byTag(item,tag))?[item]:[];}else{return ctx.getElementsByTagName(tag);}},search:function(self,expression,local){var splitters=[];var selectors=expression.trim().replace(Selectors.RegExps.splitter,function(m0,m1,m2){splitters.push(m1);return':)'+m2;}).split(':)');var items,match,filtered,item;for(var i=0,l=selectors.length;i<l;i++){var selector=selectors[i];if(i==0&&Selectors.RegExps.quick.test(selector)){items=self.getElementsByTagName(selector);continue;}
+var splitter=splitters[i-1];var tagid=Selectors.Utils.parseTagAndID(selector);var tag=tagid[0],id=tagid[1];if(i==0){items=Selectors.Utils.getByTagAndID(self,tag,id);}else{var uniques={},found=[];for(var j=0,k=items.length;j<k;j++)found=Selectors.Getters[splitter](found,items[j],tag,id,uniques);items=found;}
+var parsed=Selectors.Utils.parseSelector(selector);if(parsed){filtered=[];for(var m=0,n=items.length;m<n;m++){item=items[m];if(Selectors.Utils.filter(item,parsed,local))filtered.push(item);}
+items=filtered;}}
+return items;}};Selectors.Getters={' ':function(found,self,tag,id,uniques){var items=Selectors.Utils.getByTagAndID(self,tag,id);for(var i=0,l=items.length;i<l;i++){var item=items[i];if(Selectors.Utils.chk(item,uniques))found.push(item);}
+return found;},'>':function(found,self,tag,id,uniques){var children=Selectors.Utils.getByTagAndID(self,tag,id);for(var i=0,l=children.length;i<l;i++){var child=children[i];if(child.parentNode==self&&Selectors.Utils.chk(child,uniques))found.push(child);}
+return found;},'+':function(found,self,tag,id,uniques){while((self=self.nextSibling)){if(self.nodeType==1){if(Selectors.Utils.chk(self,uniques)&&Selectors.Filters.byTag(self,tag)&&Selectors.Filters.byID(self,id))found.push(self);break;}}
+return found;},'~':function(found,self,tag,id,uniques){while((self=self.nextSibling)){if(self.nodeType==1){if(!Selectors.Utils.chk(self,uniques))break;if(Selectors.Filters.byTag(self,tag)&&Selectors.Filters.byID(self,id))found.push(self);}}
+return found;}};Selectors.Filters={byTag:function(self,tag){return(tag=='*'||(self.tagName&&self.tagName.toLowerCase()==tag));},byID:function(self,id){return(!id||(self.id&&self.id==id));},byClass:function(self,klass){return(self.className&&self.className.contains(klass,' '));},byPseudo:function(self,parser,argument,local){return parser.call(self,argument,local);},byAttribute:function(self,name,operator,value){var result=Element.prototype.getProperty.call(self,name);if(!result)return false;if(!operator||value==undefined)return true;switch(operator){case'=':return(result==value);case'*=':return(result.contains(value));case'^=':return(result.substr(0,value.length)==value);case'$=':return(result.substr(result.length-value.length)==value);case'!=':return(result!=value);case'~=':return result.contains(value,' ');case'|=':return result.contains(value,'-');}
+return false;}};Selectors.Pseudo=new Hash({empty:function(){return!(this.innerText||this.textContent||'').length;},not:function(selector){return!Element.match(this,selector);},contains:function(text){return(this.innerText||this.textContent||'').contains(text);},'first-child':function(){return Selectors.Pseudo.index.call(this,0);},'last-child':function(){var element=this;while((element=element.nextSibling)){if(element.nodeType==1)return false;}
+return true;},'only-child':function(){var prev=this;while((prev=prev.previousSibling)){if(prev.nodeType==1)return false;}
+var next=this;while((next=next.nextSibling)){if(next.nodeType==1)return false;}
+return true;},'nth-child':function(argument,local){argument=(argument==undefined)?'n':argument;var parsed=Selectors.Utils.parseNthArgument(argument);if(parsed.special!='n')return Selectors.Pseudo[parsed.special].call(this,parsed.a,local);var count=0;local.positions=local.positions||{};var uid=$uid(this);if(!local.positions[uid]){var self=this;while((self=self.previousSibling)){if(self.nodeType!=1)continue;count++;var position=local.positions[$uid(self)];if(position!=undefined){count=position+count;break;}}
+local.positions[uid]=count;}
+return(local.positions[uid]%parsed.a==parsed.b);},index:function(index){var element=this,count=0;while((element=element.previousSibling)){if(element.nodeType==1&&++count>index)return false;}
+return(count==index);},even:function(argument,local){return Selectors.Pseudo['nth-child'].call(this,'2n+1',local);},odd:function(argument,local){return Selectors.Pseudo['nth-child'].call(this,'2n',local);}});Element.Events.domready={onAdd:function(fn){if(Browser.loaded)fn.call(this);}};(function(){var domready=function(){if(Browser.loaded)return;Browser.loaded=true;window.fireEvent('domready');document.fireEvent('domready');};switch(Browser.Engine.name){case'webkit':(function(){(['loaded','complete'].contains(document.readyState))?domready():arguments.callee.delay(50);})();break;case'trident':var temp=document.createElement('div');(function(){($try(function(){temp.doScroll('left');return $(temp).inject(document.body).set('html','temp').dispose();}))?domready():arguments.callee.delay(50);})();break;default:window.addEvent('load',domready);document.addEvent('DOMContentLoaded',domready);}})();var JSON=new Hash({encode:function(obj){switch($type(obj)){case'string':return'"'+obj.replace(/[\x00-\x1f\\"]/g,JSON.$replaceChars)+'"';case'array':return'['+String(obj.map(JSON.encode).filter($defined))+']';case'object':case'hash':var string=[];Hash.each(obj,function(value,key){var json=JSON.encode(value);if(json)string.push(JSON.encode(key)+':'+json);});return'{'+string+'}';case'number':case'boolean':return String(obj);case false:return'null';}
+return null;},$specialChars:{'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},$replaceChars:function(chr){return JSON.$specialChars[chr]||'\\u00'+Math.floor(chr.charCodeAt()/16).toString(16)+(chr.charCodeAt()%16).toString(16);},decode:function(string,secure){if($type(string)!='string'||!string.length)return null;if(secure&&!(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g,'@').replace(/"[^"\\\n\r]*"/g,'')))return null;return eval('('+string+')');}});Native.implement([Hash,Array,String,Number],{toJSON:function(){return JSON.encode(this);}});var Cookie=new Class({Implements:Options,options:{path:false,domain:false,duration:false,secure:false,document:document},initialize:function(key,options){this.key=key;this.setOptions(options);},write:function(value){value=encodeURIComponent(value);if(this.options.domain)value+='; domain='+this.options.domain;if(this.options.path)value+='; path='+this.options.path;if(this.options.duration){var date=new Date();date.setTime(date.getTime()+this.options.duration*24*60*60*1000);value+='; expires='+date.toGMTString();}
+if(this.options.secure)value+='; secure';this.options.document.cookie=this.key+'='+value;return this;},read:function(){var value=this.options.document.cookie.match('(?:^|;)\\s*'+this.key.escapeRegExp()+'=([^;]*)');return(value)?decodeURIComponent(value[1]):null;},dispose:function(){new Cookie(this.key,$merge(this.options,{duration:-1})).write('');return this;}});Cookie.write=function(key,value,options){return new Cookie(key,options).write(value);};Cookie.read=function(key){return new Cookie(key).read();};Cookie.dispose=function(key,options){return new Cookie(key,options).dispose();};var Swiff=new Class({Implements:[Options],options:{id:null,height:1,width:1,container:null,properties:{},params:{quality:'high',allowScriptAccess:'always',wMode:'transparent',swLiveConnect:true},callBacks:{},vars:{}},toElement:function(){return this.object;},initialize:function(path,options){this.instance='Swiff_'+$time();this.setOptions(options);options=this.options;var id=this.id=options.id||this.instance;var container=$(options.container);Swiff.CallBacks[this.instance]={};var params=options.params,vars=options.vars,callBacks=options.callBacks;var properties=$extend({height:options.height,width:options.width},options.properties);var self=this;for(var callBack in callBacks){Swiff.CallBacks[this.instance][callBack]=(function(option){return function(){return option.apply(self.object,arguments);};})(callBacks[callBack]);vars[callBack]='Swiff.CallBacks.'+this.instance+'.'+callBack;}
+params.flashVars=Hash.toQueryString(vars);if(Browser.Engine.trident){properties.classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';params.movie=path;}else{properties.type='application/x-shockwave-flash';properties.data=path;}
+var build='<object id="'+id+'"';for(var property in properties)build+=' '+property+'="'+properties[property]+'"';build+='>';for(var param in params){if(params[param])build+='<param name="'+param+'" value="'+params[param]+'" />';}
+build+='</object>';this.object=((container)?container.empty():new Element('div')).set('html',build).firstChild;},replaces:function(element){element=$(element,true);element.parentNode.replaceChild(this.toElement(),element);return this;},inject:function(element){$(element,true).appendChild(this.toElement());return this;},remote:function(){return Swiff.remote.apply(Swiff,[this.toElement()].extend(arguments));}});Swiff.CallBacks={};Swiff.remote=function(obj,fn){var rs=obj.CallFunction('<invoke name="'+fn+'" returntype="javascript">'+__flash__argumentsToXML(arguments,2)+'</invoke>');return eval(rs);};var Fx=new Class({Implements:[Chain,Events,Options],options:{fps:50,unit:false,duration:500,link:'ignore',transition:function(p){return-(Math.cos(Math.PI*p)-1)/2;}},initialize:function(options){this.subject=this.subject||this;this.setOptions(options);this.options.duration=Fx.Durations[this.options.duration]||this.options.duration.toInt();var wait=this.options.wait;if(wait===false)this.options.link='cancel';},step:function(){var time=$time();if(time<this.time+this.options.duration){var delta=this.options.transition((time-this.time)/this.options.duration);this.set(this.compute(this.from,this.to,delta));}else{this.set(this.compute(this.from,this.to,1));this.complete();}},set:function(now){return now;},compute:function(from,to,delta){return Fx.compute(from,to,delta);},check:function(caller){if(!this.timer)return true;switch(this.options.link){case'cancel':this.cancel();return true;case'chain':this.chain(caller.bind(this,Array.slice(arguments,1)));return false;}
+return false;},start:function(from,to){if(!this.check(arguments.callee,from,to))return this;this.from=from;this.to=to;this.time=0;this.startTimer();this.onStart();return this;},complete:function(){if(this.stopTimer())this.onComplete();return this;},cancel:function(){if(this.stopTimer())this.onCancel();return this;},onStart:function(){this.fireEvent('start',this.subject);},onComplete:function(){this.fireEvent('complete',this.subject);if(!this.callChain())this.fireEvent('chainComplete',this.subject);},onCancel:function(){this.fireEvent('cancel',this.subject).clearChain();},pause:function(){this.stopTimer();return this;},resume:function(){this.startTimer();return this;},stopTimer:function(){if(!this.timer)return false;this.time=$time()-this.time;this.timer=$clear(this.timer);return true;},startTimer:function(){if(this.timer)return false;this.time=$time()-this.time;this.timer=this.step.periodical(Math.round(1000/this.options.fps),this);return true;}});Fx.compute=function(from,to,delta){return(to-from)*delta+from;};Fx.Durations={'short':250,'normal':500,'long':1000};Fx.CSS=new Class({Extends:Fx,prepare:function(element,property,values){values=$splat(values);var values1=values[1];if(!$chk(values1)){values[1]=values[0];values[0]=element.getStyle(property);}
+var parsed=values.map(this.parse);return{from:parsed[0],to:parsed[1]};},parse:function(value){value=$lambda(value)();value=(typeof value=='string')?value.split(' '):$splat(value);return value.map(function(val){val=String(val);var found=false;Fx.CSS.Parsers.each(function(parser,key){if(found)return;var parsed=parser.parse(val);if($chk(parsed))found={value:parsed,parser:parser};});found=found||{value:val,parser:Fx.CSS.Parsers.String};return found;});},compute:function(from,to,delta){var computed=[];(Math.min(from.length,to.length)).times(function(i){computed.push({value:from[i].parser.compute(from[i].value,to[i].value,delta),parser:from[i].parser});});computed.$family={name:'fx:css:value'};return computed;},serve:function(value,unit){if($type(value)!='fx:css:value')value=this.parse(value);var returned=[];value.each(function(bit){returned=returned.concat(bit.parser.serve(bit.value,unit));});return returned;},render:function(element,property,value,unit){element.setStyle(property,this.serve(value,unit));},search:function(selector){if(Fx.CSS.Cache[selector])return Fx.CSS.Cache[selector];var to={};Array.each(document.styleSheets,function(sheet,j){var href=sheet.href;if(href&&href.contains('://')&&!href.contains(document.domain))return;var rules=sheet.rules||sheet.cssRules;Array.each(rules,function(rule,i){if(!rule.style)return;var selectorText=(rule.selectorText)?rule.selectorText.replace(/^\w+/,function(m){return m.toLowerCase();}):null;if(!selectorText||!selectorText.test('^'+selector+'$'))return;Element.Styles.each(function(value,style){if(!rule.style[style]||Element.ShortStyles[style])return;value=String(rule.style[style]);to[style]=(value.test(/^rgb/))?value.rgbToHex():value;});});});return Fx.CSS.Cache[selector]=to;}});Fx.CSS.Cache={};Fx.CSS.Parsers=new Hash({Color:{parse:function(value){if(value.match(/^#[0-9a-f]{3,6}$/i))return value.hexToRgb(true);return((value=value.match(/(\d+),\s*(\d+),\s*(\d+)/)))?[value[1],value[2],value[3]]:false;},compute:function(from,to,delta){return from.map(function(value,i){return Math.round(Fx.compute(from[i],to[i],delta));});},serve:function(value){return value.map(Number);}},Number:{parse:parseFloat,compute:Fx.compute,serve:function(value,unit){return(unit)?value+unit:value;}},String:{parse:$lambda(false),compute:$arguments(1),serve:$arguments(0)}});Fx.Tween=new Class({Extends:Fx.CSS,initialize:function(element,options){this.element=this.subject=$(element);this.parent(options);},set:function(property,now){if(arguments.length==1){now=property;property=this.property||this.options.property;}
+this.render(this.element,property,now,this.options.unit);return this;},start:function(property,from,to){if(!this.check(arguments.callee,property,from,to))return this;var args=Array.flatten(arguments);this.property=this.options.property||args.shift();var parsed=this.prepare(this.element,this.property,args);return this.parent(parsed.from,parsed.to);}});Element.Properties.tween={set:function(options){var tween=this.retrieve('tween');if(tween)tween.cancel();return this.eliminate('tween').store('tween:options',$extend({link:'cancel'},options));},get:function(options){if(options||!this.retrieve('tween')){if(options||!this.retrieve('tween:options'))this.set('tween',options);this.store('tween',new Fx.Tween(this,this.retrieve('tween:options')));}
+return this.retrieve('tween');}};Element.implement({tween:function(property,from,to){this.get('tween').start(arguments);return this;},fade:function(how){var fade=this.get('tween'),o='opacity',toggle;how=$pick(how,'toggle');switch(how){case'in':fade.start(o,1);break;case'out':fade.start(o,0);break;case'show':fade.set(o,1);break;case'hide':fade.set(o,0);break;case'toggle':var flag=this.retrieve('fade:flag',this.get('opacity')==1);fade.start(o,(flag)?0:1);this.store('fade:flag',!flag);toggle=true;break;default:fade.start(o,arguments);}
+if(!toggle)this.eliminate('fade:flag');return this;},highlight:function(start,end){if(!end){end=this.retrieve('highlight:original',this.getStyle('background-color'));end=(end=='transparent')?'#fff':end;}
+var tween=this.get('tween');tween.start('background-color',start||'#ffff88',end).chain(function(){this.setStyle('background-color',this.retrieve('highlight:original'));tween.callChain();}.bind(this));return this;}});Fx.Morph=new Class({Extends:Fx.CSS,initialize:function(element,options){this.element=this.subject=$(element);this.parent(options);},set:function(now){if(typeof now=='string')now=this.search(now);for(var p in now)this.render(this.element,p,now[p],this.options.unit);return this;},compute:function(from,to,delta){var now={};for(var p in from)now[p]=this.parent(from[p],to[p],delta);return now;},start:function(properties){if(!this.check(arguments.callee,properties))return this;if(typeof properties=='string')properties=this.search(properties);var from={},to={};for(var p in properties){var parsed=this.prepare(this.element,p,properties[p]);from[p]=parsed.from;to[p]=parsed.to;}
+return this.parent(from,to);}});Element.Properties.morph={set:function(options){var morph=this.retrieve('morph');if(morph)morph.cancel();return this.eliminate('morph').store('morph:options',$extend({link:'cancel'},options));},get:function(options){if(options||!this.retrieve('morph')){if(options||!this.retrieve('morph:options'))this.set('morph',options);this.store('morph',new Fx.Morph(this,this.retrieve('morph:options')));}
+return this.retrieve('morph');}};Element.implement({morph:function(props){this.get('morph').start(props);return this;}});(function(){var old=Fx.prototype.initialize;Fx.prototype.initialize=function(options){old.call(this,options);var trans=this.options.transition;if(typeof trans=='string'&&(trans=trans.split(':'))){var base=Fx.Transitions;base=base[trans[0]]||base[trans[0].capitalize()];if(trans[1])base=base['ease'+trans[1].capitalize()+(trans[2]?trans[2].capitalize():'')];this.options.transition=base;}};})();Fx.Transition=function(transition,params){params=$splat(params);return $extend(transition,{easeIn:function(pos){return transition(pos,params);},easeOut:function(pos){return 1-transition(1-pos,params);},easeInOut:function(pos){return(pos<=0.5)?transition(2*pos,params)/2:(2-transition(2*(1-pos),params))/2;}});};Fx.Transitions=new Hash({linear:$arguments(0)});Fx.Transitions.extend=function(transitions){for(var transition in transitions)Fx.Transitions[transition]=new Fx.Transition(transitions[transition]);};Fx.Transitions.extend({Pow:function(p,x){return Math.pow(p,x[0]||6);},Expo:function(p){return Math.pow(2,8*(p-1));},Circ:function(p){return 1-Math.sin(Math.acos(p));},Sine:function(p){return 1-Math.sin((1-p)*Math.PI/2);},Back:function(p,x){x=x[0]||1.618;return Math.pow(p,2)*((x+1)*p-x);},Bounce:function(p){var value;for(var a=0,b=1;1;a+=b,b/=2){if(p>=(7-4*a)/11){value=-Math.pow((11-6*a-11*p)/4,2)+b*b;break;}}
+return value;},Elastic:function(p,x){return Math.pow(2,10*--p)*Math.cos(20*p*Math.PI*(x[0]||1)/3);}});['Quad','Cubic','Quart','Quint'].each(function(transition,i){Fx.Transitions[transition]=new Fx.Transition(function(p){return Math.pow(p,[i+2]);});});var Request=new Class({Implements:[Chain,Events,Options],options:{url:'',data:'',headers:{'X-Requested-With':'XMLHttpRequest','Accept':'text/javascript, text/html, application/xml, text/xml, */*'},async:true,format:false,method:'post',link:'ignore',isSuccess:null,emulation:true,urlEncoded:true,encoding:'utf-8',evalScripts:false,evalResponse:false},initialize:function(options){this.xhr=new Browser.Request();this.setOptions(options);this.options.isSuccess=this.options.isSuccess||this.isSuccess;this.headers=new Hash(this.options.headers);},onStateChange:function(){if(this.xhr.readyState!=4||!this.running)return;this.running=false;this.status=0;$try(function(){this.status=this.xhr.status;}.bind(this));if(this.options.isSuccess.call(this,this.status)){this.response={text:this.xhr.responseText,xml:this.xhr.responseXML};this.success(this.response.text,this.response.xml);}else{this.response={text:null,xml:null};this.failure();}
+this.xhr.onreadystatechange=$empty;},isSuccess:function(){return((this.status>=200)&&(this.status<300));},processScripts:function(text){if(this.options.evalResponse||(/(ecma|java)script/).test(this.getHeader('Content-type')))return $exec(text);return text.stripScripts(this.options.evalScripts);},success:function(text,xml){this.onSuccess(this.processScripts(text),xml);},onSuccess:function(){this.fireEvent('complete',arguments).fireEvent('success',arguments).callChain();},failure:function(){this.onFailure();},onFailure:function(){this.fireEvent('complete').fireEvent('failure',this.xhr);},setHeader:function(name,value){this.headers.set(name,value);return this;},getHeader:function(name){return $try(function(){return this.xhr.getResponseHeader(name);}.bind(this));},check:function(caller){if(!this.running)return true;switch(this.options.link){case'cancel':this.cancel();return true;case'chain':this.chain(caller.bind(this,Array.slice(arguments,1)));return false;}
+return false;},send:function(options){if(!this.check(arguments.callee,options))return this;this.running=true;var type=$type(options);if(type=='string'||type=='element')options={data:options};var old=this.options;options=$extend({data:old.data,url:old.url,method:old.method},options);var data=options.data,url=options.url,method=options.method;switch($type(data)){case'element':data=$(data).toQueryString();break;case'object':case'hash':data=Hash.toQueryString(data);}
+if(this.options.format){var format='format='+this.options.format;data=(data)?format+'&'+data:format;}
+if(this.options.emulation&&['put','delete'].contains(method)){var _method='_method='+method;data=(data)?_method+'&'+data:_method;method='post';}
+if(this.options.urlEncoded&&method=='post'){var encoding=(this.options.encoding)?'; charset='+this.options.encoding:'';this.headers.set('Content-type','application/x-www-form-urlencoded'+encoding);}
+if(data&&method=='get'){url=url+(url.contains('?')?'&':'?')+data;data=null;}
+this.xhr.open(method.toUpperCase(),url,this.options.async);this.xhr.onreadystatechange=this.onStateChange.bind(this);this.headers.each(function(value,key){if(!$try(function(){this.xhr.setRequestHeader(key,value);return true;}.bind(this)))this.fireEvent('exception',[key,value]);},this);this.fireEvent('request');this.xhr.send(data);if(!this.options.async)this.onStateChange();return this;},cancel:function(){if(!this.running)return this;this.running=false;this.xhr.abort();this.xhr.onreadystatechange=$empty;this.xhr=new Browser.Request();this.fireEvent('cancel');return this;}});(function(){var methods={};['get','post','put','delete','GET','POST','PUT','DELETE'].each(function(method){methods[method]=function(){var params=Array.link(arguments,{url:String.type,data:$defined});return this.send($extend(params,{method:method.toLowerCase()}));};});Request.implement(methods);})();Element.Properties.send={set:function(options){var send=this.retrieve('send');if(send)send.cancel();return this.eliminate('send').store('send:options',$extend({data:this,link:'cancel',method:this.get('method')||'post',url:this.get('action')},options));},get:function(options){if(options||!this.retrieve('send')){if(options||!this.retrieve('send:options'))this.set('send',options);this.store('send',new Request(this.retrieve('send:options')));}
+return this.retrieve('send');}};Element.implement({send:function(url){var sender=this.get('send');sender.send({data:this,url:url||sender.options.url});return this;}});Request.HTML=new Class({Extends:Request,options:{update:false,evalScripts:true,filter:false},processHTML:function(text){var match=text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);text=(match)?match[1]:text;var container=new Element('div');return $try(function(){var root='<root>'+text+'</root>',doc;if(Browser.Engine.trident){doc=new ActiveXObject('Microsoft.XMLDOM');doc.async=false;doc.loadXML(root);}else{doc=new DOMParser().parseFromString(root,'text/xml');}
+root=doc.getElementsByTagName('root')[0];for(var i=0,k=root.childNodes.length;i<k;i++){var child=Element.clone(root.childNodes[i],true,true);if(child)container.grab(child);}
+return container;})||container.set('html',text);},success:function(text){var options=this.options,response=this.response;response.html=text.stripScripts(function(script){response.javascript=script;});var temp=this.processHTML(response.html);response.tree=temp.childNodes;response.elements=temp.getElements('*');if(options.filter)response.tree=response.elements.filter(options.filter);if(options.update)$(options.update).empty().adopt(response.tree);if(options.evalScripts)$exec(response.javascript);this.onSuccess(response.tree,response.elements,response.html,response.javascript);}});Element.Properties.load={set:function(options){var load=this.retrieve('load');if(load)send.cancel();return this.eliminate('load').store('load:options',$extend({data:this,link:'cancel',update:this,method:'get'},options));},get:function(options){if(options||!this.retrieve('load')){if(options||!this.retrieve('load:options'))this.set('load',options);this.store('load',new Request.HTML(this.retrieve('load:options')));}
+return this.retrieve('load');}};Element.implement({load:function(){this.get('load').send(Array.link(arguments,{data:Object.type,url:String.type}));return this;}});Request.JSON=new Class({Extends:Request,options:{secure:true},initialize:function(options){this.parent(options);this.headers.extend({'Accept':'application/json','X-Request':'JSON'});},success:function(text){this.response.json=JSON.decode(text,this.options.secure);this.onSuccess(this.response.json,text);}});
diff --git a/notFinishedCode/tricode/mutexFunctions.php b/notFinishedCode/tricode/mutexFunctions.php
new file mode 100644
index 0000000..af45610
--- /dev/null
+++ b/notFinishedCode/tricode/mutexFunctions.php
@@ -0,0 +1,36 @@
+<?
+//Mutex functions
+function Lock($lockName,$seconds)
+{
+ $sql = "SELECT GET_LOCK('$lockName', $seconds);";
+ $res = mysql_query($sql);
+ if (!$res)
+ {
+ die('Could not query:' . mysql_error());
+ }
+ return mysql_result($res,0);
+}
+
+function IsLocked($lockName)
+{
+ $sql = "SELECT IS_FREE_LOCK('$lockName');";
+ $res = mysql_query($sql);
+ if (!$res)
+ {
+ die('Could not query:' . mysql_error());
+ }
+ return mysql_result($res,0);
+}
+
+function ReleaseLock($lockName)
+{
+ $sql = "SELECT RELEASE_LOCK('$lockName');";
+ $res = mysql_query($sql);
+ if (!$res)
+ {
+ die('Could not query:' . mysql_error());
+ }
+ return mysql_result($res,0);
+}
+//End of mutex functions
+?>
diff --git a/notFinishedCode/tricode/mutexTry.php b/notFinishedCode/tricode/mutexTry.php
new file mode 100755
index 0000000..9e07b3d
--- /dev/null
+++ b/notFinishedCode/tricode/mutexTry.php
@@ -0,0 +1,238 @@
+<html>
+<head>
+<script src='delayedLoading.js' type="text/javascript"></script>
+<!--ADD HERE ALL THE NEEDED META DATA -->
+<title>Network test live results!</title>
+<link rel="stylesheet" href="css/tableCSS.css" type="text/css" media="screen">
+</head>
+<body onscroll="scrollEvent();" onload="loaderInit();">
+<div>
+<?php
+
+//Connection stuff
+//DB
+$dbhost = 'localhost';
+$dbuser = 'root';
+$dbpass = 'randompasswordSQL';
+
+//Socket
+$port = 34500;
+$ip = 'localhost';
+
+$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error connecting to mysql');
+
+$dbname = 'gsmselftesting';
+mysql_select_db($dbname);
+//End of connection stuff
+include 'mutexFunctions.php'; //mutex functions, isfree, lock and release
+include 'insertData.php'; //insert task functions
+
+$nameOfLock = 'Webpage';
+$timeToKeepTheMutex = 360;
+
+$locking = isLocked($nameOfLock);//Check if the webpage is already open
+
+if ($locking == '1') //1 means nobody is on the website
+{
+ $lockMe = Lock($nameOfLock,$timeToKeepTheMutex); //Set a mutex for the webpage
+ if ($lockMe == '1') //1 means a successful lock
+ {
+ include 'post.php'; // read posted data and add them to the database
+// echo 'WE had errors: '. $errorAdding;
+ //stuff to do here
+ //check if the software is running!
+ $softwareLock = 'SoftwareStarted';
+
+ if($taskAmount!=0)
+ {
+ $softwareRunning = isLocked($softwareLock);
+ if($softwareRunning == '1') //1 means software is not started yet, start it
+ {
+ $startApp = fsockopen($ip, 34600, $errno, $error, 5);
+ if (!$startApp)
+ {
+ printf('THE SOFTWARE THAT SHOULD RUN IN BACKGROUND IS NOT RUNNING!');
+ }
+ else
+ {
+ socket_set_timeout( $startApp, 50); //one should set the number of the longest test, so we can define the timeout
+ fwrite($startApp, "START APP");
+ usleep(500);
+ fclose($startApp);
+ }
+
+ //exec("/usr/bin/python /var/www/tricode/gsmselftest2.py > /dev/null 2>&1 &"); //start the software in background and don't wait for any output
+ sleep(1); //sleep half second till the software starts
+ //the software should be running already and set the lock, now we test it and then connect to it!
+
+ $softwareRunning1 = isLocked($softwareLock);
+ if($softwareRunning1 == '0') //Software running and waiting for connection!
+ {
+ //try to open the socket and connect to the software
+ $fp = fsockopen($ip, $port, $errno, $error, 5);
+
+ if (!$fp)
+ {
+ echo 'Could not open the socket or connect to the testing software! Check ports on both sides!';
+
+ }
+ else
+ {
+ socket_set_timeout($fp,50); //one should set the number of the longest test, so we can define the timeout function (it is the number after "$fp,")
+
+ fwrite($fp, "START TEST"); //send command to start the tests
+ if(!feof($fp))
+ {
+ while(!feof($fp))
+ {
+ $received = fgets($fp, 128); //receive data!
+
+ if ($received == "CONFIRM\n") //we got the confirmation from the testing software
+ {
+ //test finished successfully
+ $GSMRZ1 = 0;
+ $GSMRZ2 = 0;
+ $GSMRZ3 = 0;
+
+ $SIP = 0;
+ $UNISIP = 0;
+ $LANDLINE = 0;
+ $LSFKS = 0;
+
+ $GSMEE = 0;
+ $GSMEV = 0;
+ $GSMET = 0;
+ $GSMEO = 0;
+
+ $SIPP = 0;
+ $LANDLINEP = 0;
+ $UNISIPP = 0;
+ $NANOBTS1P = 0;
+ $NANOBTS2P = 0;
+ /////////// end of test!
+ echo '<div id="main">
+ <table summary = "Results">
+ <thead>
+ <tr>
+ <th scope = "col"> From: </th>
+ <th scope = "col" > To: </th>
+ <th scope = "col"> Message: </th>
+ <th scope = "col"> Status: </th>
+ </tr>
+ </thead>
+ <!-- start of the table rows-->
+ <tbody>';
+ echo str_repeat("\n",7024);
+ flush();
+ }
+ elseif ($received == "TEST DONE\n")
+ {
+
+ echo '</tbody></table>';
+ echo '</div>';
+ echo '<div id="sidebar">';
+ echo "<a class='pChart' href='networkResult.php?S=$SIP&RZ1=$GSMRZ1&RZ2=$GSMRZ2&RZ3=$GSMRZ3&US=$UNISIP&LL=$LANDLINE&LS=$LSFKS&EE=$GSMEE&EV=$GSMEV&ET=$GSMET&EO=$GSMEO&SP=$SIPP&SGP=$LANDLINEP&USP=$UNISIPP&NBP1=$NANOBTS1P&NBP2=$NANOBTS2P' data-pchart-alt='Picture3'>Picture 3</a></div>";
+ echo '<div id="footer">Number of tasks: '.$taskAmount.'<br> Number of tasks tried to add to the DB but had an error: '. $errorAdding .'<br> TEST SUCCESSFULLY FINISHED!</div>';
+ echo str_repeat("\n",7024);
+ flush();
+ 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]);
+ //ADD HERE THE TEST CASES BUT MAKE IT INSIDE OF A FILE (e.q. include 'testing.php'); HERE I PUT IT ONLY FOR EXAMPLE PURPOSES!
+
+ if($callFrom == 'SIP' || $callTo == 'SIP')
+ {
+ if($testStatus == '200')
+ {
+ $SIP = 1;
+ echo 'SIP set to 1';
+ }
+ }
+ if($callFrom == 'GSMRZ1' || $callTo == 'GSMRZ1')
+ {
+ if($testStatus == '200')
+ {
+ echo 'GSMRZ1 set to 1';
+ $GSMRZ1 = 1;
+ }
+ }
+
+ //END OF TEST CASE EXAMPLE
+ echo '<tr>
+ <th scope = "row" id = "r100">'. $dataForTable[1] . '</th>
+ <th scope = "row" id = "r100">'. $dataForTable[2] . '</th>
+ <td> ' . $dataForTable[4] . ' </td>
+ <td>' . $dataForTable[3] . '</td>
+ </tr>';
+ //echo $received . '<br>';
+ echo str_repeat("\n",7024);
+ flush();
+ 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!';
+ }
+
+ //$release = ReleaseLock($nameOfLock);
+ //echo $release . "<br>";
+ }
+ 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!' . "<br>";
+}
+else
+{
+ echo 'We have some serious error here';
+}
+?>
+</div>
+</body>
+</html>
+
diff --git a/notFinishedCode/tricode/networkResult.php b/notFinishedCode/tricode/networkResult.php
new file mode 100644
index 0000000..512fe86
--- /dev/null
+++ b/notFinishedCode/tricode/networkResult.php
@@ -0,0 +1,307 @@
+<?php
+ /* CAT:Drawing */
+
+ /* pChart library inclusions */
+ include("class/pData.class.php");
+
+ include("class/pDraw.class.php");
+ include("class/pImage.class.php");
+
+ include("class/pSurface.class.php");
+ //test case php defined for defining the colors and what's OK and what's wrong!
+ include 'testCase.php';
+
+ //Triangle function used for defining a triangle, used later to draw a triangle polygon!
+ function Triangle($x,$y)
+ {
+ $Bx = $x - 7;
+ $By = $y + 18;
+ $Cx = $x + 7;
+ $Cy = $y + 18;
+ return array($x,$y,$Bx,$By,$Cx,$Cy);
+ }
+
+ /* Create and populate the pData object */
+ $MyData = new pData();
+ $MyData->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","nanoBTS 1","nanoBTS 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));
+
+ $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);
+ $myPicture->drawText(460,425,"Task #:32432 07.09.2011 21:19:00",$TextSettings);
+ //###########################################################
+
+
+
+ /* Render the picture (choose the best way) */
+ $myPicture->autoOutput("example.drawFilledCircle.png");
+?>
diff --git a/notFinishedCode/tricode/post.php b/notFinishedCode/tricode/post.php
new file mode 100644
index 0000000..56d0c24
--- /dev/null
+++ b/notFinishedCode/tricode/post.php
@@ -0,0 +1,470 @@
+<?
+$sipgsmrz1 = $_REQUEST["sip_gsmrz1"]; //SIP to GSMRZ1
+$sipgsmrz2 = $_REQUEST["sip_gsmrz2"]; //SIP to GSMRZ2
+$sipgsmrz3 = $_REQUEST["sip_gsmrz3"]; //SIP to GSMRZ3
+
+$sipland = $_REQUEST["sip_landln"]; //SIP to landline
+$sipuniv = $_REQUEST["sip_sipuniv"]; //SIP to University
+
+$gsmrzsip1 = $_REQUEST["gsmrz1_sip"]; //GSMRZ1 to SIP
+$gsmrzsip2 = $_REQUEST["gsmrz2_sip"]; //GSMRZ2 to SIP
+$gsmrzsip3 = $_REQUEST["gsmrz3_sip"]; //GSMRZ3 to SIP
+
+
+$gsm2gsm12 = $_REQUEST["gsmrz1_gsmrz2"]; //GSMRZ1 to GSMRZ2
+$gsm2gsm13 = $_REQUEST["gsmrz1_gsmrz3"]; //GSMRZ1 to GSMRZ3
+$gsm2gsm23 = $_REQUEST["gsmrz2_gsmrz3"]; //GSMRZ2 to GSMRZ3
+
+$landsip = $_REQUEST["landline_sip"]; //Landline to SIP
+
+$landgsmrz1 = $_REQUEST["landline_gsmrz1"]; //Landline to GSMRZ1
+$landgsmrz2 = $_REQUEST["landline_gsmrz2"]; //Landline to GSMRZ1
+$landgsmrz3 = $_REQUEST["landline_gsmrz3"]; //Landline to GSMRZ1
+
+//Add allso for external GSM
+$gsmrz1gsmee = $_REQUEST["gsmrz1_gsmee"]; //GSMRZ1 to E-Plus
+$gsmrz1gsmev = $_REQUEST["gsmrz1_gsmev"]; //GSMRZ1 to E-Plus
+$gsmrz1gsmet = $_REQUEST["gsmrz1_gsmet"]; //GSMRZ1 to E-Plus
+$gsmrz1gsmeo = $_REQUEST["gsmrz1_gsmeo"]; //GSMRZ1 to E-Plus
+
+
+$gsmrz2gsmee = $_REQUEST["gsmrz2_gsmee"]; //GSMRZ2 to E-Plus
+$gsmrz2gsmev = $_REQUEST["gsmrz2_gsmev"]; //GSMRZ2 to E-Plus
+$gsmrz2gsmet = $_REQUEST["gsmrz2_gsmet"]; //GSMRZ2 to E-Plus
+$gsmrz2gsmeo = $_REQUEST["gsmrz2_gsmeo"]; //GSMRZ2 to E-Plus
+
+
+$gsmrz3gsmee = $_REQUEST["gsmrz3_gsmee"]; //GSMRZ3 to E-Plus
+$gsmrz3gsmev = $_REQUEST["gsmrz3_gsmev"]; //GSMRZ3 to E-Plus
+$gsmrz3gsmet = $_REQUEST["gsmrz3_gsmet"]; //GSMRZ3 to E-Plus
+$gsmrz3gsmeo = $_REQUEST["gsmrz3_gsmeo"]; //GSMRZ3 to E-Plus
+
+
+$unisipgsmee = $_REQUEST["unisip_gsmee"]; //GSMRZ3 to E-Plus
+$unisipgsmev = $_REQUEST["unisip_gsmev"]; //GSMRZ3 to E-Plus
+$unisipgsmet = $_REQUEST["unisip_gsmet"]; //GSMRZ3 to E-Plus
+$unisipgsmeo = $_REQUEST["unisip_gsmeo"]; //GSMRZ3 to E-Plus
+//############################################################
+$taskNo = getNewTaskNo();
+$errorAdding = 0;
+$taskAmount = 0;
+
+/*function insertTask($me,$mb,$md)
+{
+ echo $me.$mb.$md;
+ return 1;
+}*/
+
+if($sipgsmrz1 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'sip','GSMRZ1');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($sipgsmrz2 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'sip','GSMRZ2');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($sipgsmrz3 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'sip','GSMRZ3');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrzsip1 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ1','sip');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrzsip2 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ2','sip');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrzsip3 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ3','sip');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($sipland == 'on')
+{
+ $taskAdded = insertTask($taskNo,'sip','landline');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($sipuniv == 'on')
+{
+ $taskAdded = insertTask($taskNo,'sip','unisip');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsm2gsm12 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ1','GSMRZ2');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsm2gsm13 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ1','GSMRZ3');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsm2gsm23 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ2','GSMRZ3');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($landsip == 'on')
+{
+ $taskAdded = insertTask($taskNo,'landline','sip');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($landgsmrz1 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'landline','GSMRZ1');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($landgsmrz2 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'landline','GSMRZ2');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($landgsmrz3 == 'on')
+{
+ $taskAdded = insertTask($taskNo,'landline','GSMRZ3');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+
+
+if($gsmrz1gsmee == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ1','GSMExt.Eplus');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz1gsmev == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ1','GSMExt.Voda');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz1gsmet == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ1','GSMExt.Tm');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz1gsmeo == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ1','GSMExt.O2');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+
+
+if($gsmrz2gsmee == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ2','GSMExt.Eplus');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz2gsmev == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ2','GSMExt.Voda');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz2gsmet == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ2','GSMExt.Tm');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz2gsmeo == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ2','GSMExt.O2');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+
+
+if($gsmrz3gsmee == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ3','GSMExt.Eplus');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz3gsmev == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ3','GSMExt.Voda');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz3gsmet == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ3','GSMExt.Tm');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($gsmrz3gsmeo == 'on')
+{
+ $taskAdded = insertTask($taskNo,'GSMRZ3','GSMExt.O2');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+
+
+
+if($unisipgsmee == 'on')
+{
+ $taskAdded = insertTask($taskNo,'unisip','GSMExt.Eplus');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($unisipgsmev == 'on')
+{
+ $taskAdded = insertTask($taskNo,'unisip','GSMExt.Voda');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($unisipgsmet == 'on')
+{
+ $taskAdded = insertTask($taskNo,'unisip','GSMExt.Tm');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+if($unisipgsmeo == 'on')
+{
+ $taskAdded = insertTask($taskNo,'unisip','GSMExt.O2');
+ if($taskAdded != 1)
+ {
+ $errorAdding = 1;
+ }
+ if($taskAdded == 1)
+ {
+ $taskAmount++;
+ }
+}
+
+?>
diff --git a/notFinishedCode/tricode/script.sh b/notFinishedCode/tricode/script.sh
new file mode 100755
index 0000000..00c0279
--- /dev/null
+++ b/notFinishedCode/tricode/script.sh
@@ -0,0 +1 @@
+gnome-terminal
diff --git a/notFinishedCode/tricode/sshtest.py b/notFinishedCode/tricode/sshtest.py
new file mode 100755
index 0000000..f18139e
--- /dev/null
+++ b/notFinishedCode/tricode/sshtest.py
@@ -0,0 +1,15 @@
+import sys
+import os
+import subprocess
+import SSHTunnelBox1Class
+import SSHTunnelBox2Class
+import ClientClass
+from time import sleep
+
+portDest = 46000#should be 9
+box2 = SSHTunnelBox2Class.SSHTunneling(portDest, 50008, '132.230.4.67', 'lsfks', 'r')#ip??
+print box2.startTunneling()
+#sleep(2)
+receiver = ClientClass.Connection('localhost', portDest)
+print receiver.connect()
+box2.killTunneling()
diff --git a/notFinishedCode/tricode/startSoftware.py b/notFinishedCode/tricode/startSoftware.py
new file mode 100644
index 0000000..02e4f6a
--- /dev/null
+++ b/notFinishedCode/tricode/startSoftware.py
@@ -0,0 +1,14 @@
+import ServerClass
+import subprocess
+
+while 1:
+ server = ServerClass.ServerHandler(34600)
+ tried = server.openSocket()
+
+ test = server.receiveData(2)
+ if test == 'START APP':
+ print 'start'
+ subprocess.Popen(args=['gnome-terminal','--command=python gsmselftest2.py'])
+ print server.closeConnection()
+ del server
+
diff --git a/notFinishedCode/tricode/startTest.php b/notFinishedCode/tricode/startTest.php
new file mode 100644
index 0000000..abfa812
--- /dev/null
+++ b/notFinishedCode/tricode/startTest.php
@@ -0,0 +1,438 @@
+<html>
+<head>
+<!--ADD HERE ALL THE NEEDED META DATA -->
+<title>Uni-Freiburg Network test</title>
+<link rel="stylesheet" href="css/formCSS.css" type="text/css" media="screen">
+<link rel="stylesheet" href="css/tooltip.css" type="text/css" media="screen">
+</head>
+
+<body>
+<div>
+Please select the type of the test you would like to perform or manually choose your tests! Then please press the submit button!
+</div>
+<div>
+<form>
+ <a class="tooltip" href="#">
+ <input type=button value="Simple test" onClick="simpleTest()">
+ <span class="custom warning">
+ <img src="css/Info.png" alt="Warning" height="48" width="48" />
+ <em>Simple test</em>
+ Press simple test if you want to test the network for</span>
+ </a>
+
+ <a class="tooltip" href="#">
+ <input type=button value="Smart test" onClick="smartTest()">
+ <span class="custom warning">
+ <img src="css/Info.png" alt="Warning" height="48" width="48" />
+ <em>Smart test</em>
+ This is just an example of what you can do using a CSS tooltip, feel free to get creative and produce your own!</span>
+ </a>
+
+ <a class="tooltip" href="#">
+ <input type=button value="Full test" onClick="fullTest()">
+ <span class="custom warning">
+ <img src="css/Info.png" alt="Warning" height="48" width="48" />
+ <em>Full test</em>
+ Press full test if you want to test every part of the university network. To execute this test the highest amount of time will be required, however this test produces the highest amount of information!</span>
+ </a>
+
+ <a class="tooltip" href="#">
+ <input type=button value="Deselect all values" onClick="deselectAll()">
+ <span class="custom warning">
+ <img src="css/Info.png" alt="Warning" height="48" width="48" />
+ <em>Deselect all</em>
+ Press deselect all if you want to deselect all the values you have selected to be executed for the test!</span>
+ </a>
+</form>
+</div>
+<div class='section form'>
+<form name="testForm" form action="mutexTry.php" method="POST">
+ <div class='leftcol'>
+ <label><input type="checkbox" name='sip_gsmrz1'> SIP to RZ-GSM 1</label>
+ <label><input type="checkbox" name="sip_gsmrz2"> SIP to RZ-GSM 2</label>
+ <label><input type="checkbox" name="sip_gsmrz3"> SIP to RZ-GSM 3</label>
+
+ <label><input type="checkbox" name="sip_landln"> SIP to Landline</label>
+ <label><input type="checkbox" name="sip_sipuniv"> SIP to Uni.telephone</label>
+
+
+ <label><input type="checkbox" name="gsmrz1_sip"> RZ-GSM 1 to SIP</label>
+ <label><input type="checkbox" name="gsmrz2_sip"> RZ-GSM 2 to SIP</label>
+ <label><input type="checkbox" name="gsmrz3_sip"> RZ-GSM 3 to SIP</label>
+
+ <label><input type="checkbox" name="gsmrz1_gsmrz2"> RZ-GSM 1 to RZ-GSM 2</label>
+ <label><input type="checkbox" name="gsmrz1_gsmrz3"> RZ-GSM 1 to RZ-GSM 3</label>
+ <label><input type="checkbox" name="gsmrz2_gsmrz3"> RZ-GSM 2 to RZ-GSM 3</label>
+
+
+ <label><input type="checkbox" name="landline_sip"> Landline to SIP </label>
+
+ <label><input type="checkbox" name="landline_gsmrz1"> Landline to RZ-GSM 1</label>
+ <label><input type="checkbox" name="landline_gsmrz2"> Landline to RZ-GSM 2</label>
+ <label><input type="checkbox" name="landline_gsmrz3"> Landline to RZ-GSM 3</label>
+
+
+ <label><input type="checkbox" name="gsmrz1_gsmee"> RZ-GSM 1 to E-Plus</label>
+ <label><input type="checkbox" name="gsmrz1_gsmev"> RZ-GSM 1 to Vodaphone</label>
+ <label><input type="checkbox" name="gsmrz1_gsmet"> RZ-GSM 1 to T-Mobile</label>
+ <label><input type="checkbox" name="gsmrz1_gsmeo"> RZ-GSM 1 to O2</label>
+
+ <label><input type="checkbox" name="gsmrz2_gsmee"> RZ-GSM 2 to E-Plus</label>
+ <label><input type="checkbox" name="gsmrz2_gsmev"> RZ-GSM 2 to Vodaphone</label>
+ <label><input type="checkbox" name="gsmrz2_gsmet"> RZ-GSM 2 to T-Mobile</label>
+ <label><input type="checkbox" name="gsmrz2_gsmeo"> RZ-GSM 2 to O2</label>
+
+ <label><input type="checkbox" name="gsmrz3_gsmee"> RZ-GSM 3 to E-Plus</label>
+ <label><input type="checkbox" name="gsmrz3_gsmev"> RZ-GSM 3 to Vodaphone</label>
+ <label><input type="checkbox" name="gsmrz3_gsmet"> RZ-GSM 3 to T-Mobile</label>
+ <label><input type="checkbox" name="gsmrz3_gsmeo"> RZ-GSM 3 to O2</label>
+
+
+ <label><input type="checkbox" name="unisip_gsmee"> Uni.telephone to E-Plus</label>
+ <label><input type="checkbox" name="unisip_gsmev"> Uni.telephone to Vodaphone</label>
+ <label><input type="checkbox" name="unisip_gsmet"> Uni.telephone to T-Mobile</label>
+ <label><input type="checkbox" name="unisip_gsmeo"> Uni.telephone to O2</label>
+
+
+
+
+ <input type=SUBMIT value="Submit">
+
+ </div>
+</form>
+</div>
+
+<script type="text/javascript" src="mootools.js"></script>
+<script type="text/javascript" src="moocheck.js"></script>
+<script type = "text/javascript">
+function simpleTest()
+{
+ document.testForm.sip_gsmrz1.checked=false
+ document.testForm.sip_gsmrz2.checked=false
+ document.testForm.sip_gsmrz3.checked=false
+
+ document.testForm.sip_landln.checked=false
+ document.testForm.sip_sipuniv.checked=false
+
+ document.testForm.gsmrz1_gsmrz2.checked=false
+ document.testForm.gsmrz1_gsmrz3.checked=false
+ document.testForm.gsmrz2_gsmrz3.checked=false
+
+ document.testForm.gsmrz1_sip.checked=false
+ document.testForm.gsmrz2_sip.checked=false
+ document.testForm.gsmrz3_sip.checked=false
+
+ document.testForm.landline_sip.checked=false
+
+ document.testForm.landline_gsmrz1.checked=false
+ document.testForm.landline_gsmrz2.checked=false
+ document.testForm.landline_gsmrz3.checked=false
+
+ document.testForm.gsmrz1_gsmee.checked=false
+ document.testForm.gsmrz1_gsmev.checked=false
+ document.testForm.gsmrz1_gsmet.checked=false
+ document.testForm.gsmrz1_gsmeo.checked=false
+
+ document.testForm.gsmrz2_gsmee.checked=false
+ document.testForm.gsmrz2_gsmev.checked=false
+ document.testForm.gsmrz2_gsmet.checked=false
+ document.testForm.gsmrz2_gsmeo.checked=false
+
+ document.testForm.gsmrz3_gsmee.checked=false
+ document.testForm.gsmrz3_gsmev.checked=false
+ document.testForm.gsmrz3_gsmet.checked=false
+ document.testForm.gsmrz3_gsmeo.checked=false
+
+
+ document.testForm.unisip_gsmee.checked=false
+ document.testForm.unisip_gsmev.checked=false
+ document.testForm.unisip_gsmet.checked=false
+ document.testForm.unisip_gsmeo.checked=false
+
+ FancyForm.update(document.testForm.sip_gsmrz1.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz2.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.sip_landln.getParent())
+ FancyForm.update(document.testForm.sip_sipuniv.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz2_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz3_sip.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_gsmrz2.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.landline_sip.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz1.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz2.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmeo.getParent())
+ FancyForm.update(document.testForm.unisip_gsmee.getParent())
+ FancyForm.update(document.testForm.unisip_gsmev.getParent())
+ FancyForm.update(document.testForm.unisip_gsmet.getParent())
+ FancyForm.update(document.testForm.unisip_gsmeo.getParent())
+
+ //add here what the simple test should do!
+}
+
+function fullTest()
+{
+ document.testForm.sip_gsmrz1.checked=true
+ document.testForm.sip_gsmrz2.checked=true
+ document.testForm.sip_gsmrz3.checked=true
+
+ document.testForm.sip_landln.checked=true
+ document.testForm.sip_sipuniv.checked=true
+
+ document.testForm.gsmrz1_gsmrz2.checked=true
+ document.testForm.gsmrz1_gsmrz3.checked=true
+ document.testForm.gsmrz2_gsmrz3.checked=true
+
+ document.testForm.gsmrz1_sip.checked=true
+ document.testForm.gsmrz2_sip.checked=true
+ document.testForm.gsmrz3_sip.checked=true
+
+ document.testForm.landline_sip.checked=true
+
+ document.testForm.landline_gsmrz1.checked=true
+ document.testForm.landline_gsmrz2.checked=true
+ document.testForm.landline_gsmrz3.checked=true
+
+ document.testForm.gsmrz1_gsmee.checked=true
+ document.testForm.gsmrz1_gsmev.checked=true
+ document.testForm.gsmrz1_gsmet.checked=true
+ document.testForm.gsmrz1_gsmeo.checked=true
+
+ document.testForm.gsmrz2_gsmee.checked=true
+ document.testForm.gsmrz2_gsmev.checked=true
+ document.testForm.gsmrz2_gsmet.checked=true
+ document.testForm.gsmrz2_gsmeo.checked=true
+
+ document.testForm.gsmrz3_gsmee.checked=true
+ document.testForm.gsmrz3_gsmev.checked=true
+ document.testForm.gsmrz3_gsmet.checked=true
+ document.testForm.gsmrz3_gsmeo.checked=true
+
+ document.testForm.unisip_gsmee.checked=true
+ document.testForm.unisip_gsmev.checked=true
+ document.testForm.unisip_gsmet.checked=true
+ document.testForm.unisip_gsmeo.checked=true
+
+ FancyForm.update(document.testForm.sip_gsmrz1.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz2.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.sip_landln.getParent())
+ FancyForm.update(document.testForm.sip_sipuniv.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz2_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz3_sip.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_gsmrz2.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.landline_sip.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz1.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz2.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmeo.getParent())
+ FancyForm.update(document.testForm.unisip_gsmee.getParent())
+ FancyForm.update(document.testForm.unisip_gsmev.getParent())
+ FancyForm.update(document.testForm.unisip_gsmet.getParent())
+ FancyForm.update(document.testForm.unisip_gsmeo.getParent())
+
+}
+
+function smartTest()
+{
+ document.testForm.sip_gsmrz1.checked=false
+ document.testForm.sip_gsmrz2.checked=false
+ document.testForm.sip_gsmrz3.checked=false
+
+ document.testForm.sip_landln.checked=false
+ document.testForm.sip_sipuniv.checked=false
+
+ document.testForm.gsmrz1_gsmrz2.checked=false
+ document.testForm.gsmrz1_gsmrz3.checked=false
+ document.testForm.gsmrz2_gsmrz3.checked=false
+
+ document.testForm.gsmrz1_sip.checked=false
+ document.testForm.gsmrz2_sip.checked=false
+ document.testForm.gsmrz3_sip.checked=false
+
+ document.testForm.landline_sip.checked=false
+
+ document.testForm.landline_gsmrz1.checked=false
+ document.testForm.landline_gsmrz2.checked=false
+ document.testForm.landline_gsmrz3.checked=false
+
+ document.testForm.gsmrz1_gsmee.checked=false
+ document.testForm.gsmrz1_gsmev.checked=false
+ document.testForm.gsmrz1_gsmet.checked=false
+ document.testForm.gsmrz1_gsmeo.checked=false
+
+ document.testForm.gsmrz2_gsmee.checked=false
+ document.testForm.gsmrz2_gsmev.checked=false
+ document.testForm.gsmrz2_gsmet.checked=false
+ document.testForm.gsmrz2_gsmeo.checked=false
+
+ document.testForm.gsmrz3_gsmee.checked=false
+ document.testForm.gsmrz3_gsmev.checked=false
+ document.testForm.gsmrz3_gsmet.checked=false
+ document.testForm.gsmrz3_gsmeo.checked=false
+
+
+ document.testForm.unisip_gsmee.checked=false
+ document.testForm.unisip_gsmev.checked=false
+ document.testForm.unisip_gsmet.checked=false
+ document.testForm.unisip_gsmeo.checked=false
+
+ FancyForm.update(document.testForm.sip_gsmrz1.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz2.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.sip_landln.getParent())
+ FancyForm.update(document.testForm.sip_sipuniv.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz2_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz3_sip.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_gsmrz2.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.landline_sip.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz1.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz2.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmeo.getParent())
+ FancyForm.update(document.testForm.unisip_gsmee.getParent())
+ FancyForm.update(document.testForm.unisip_gsmev.getParent())
+ FancyForm.update(document.testForm.unisip_gsmet.getParent())
+ FancyForm.update(document.testForm.unisip_gsmeo.getParent())
+
+ //add here what the smart test should do
+}
+
+function deselectAll()
+{
+ document.testForm.sip_gsmrz1.checked=false
+ document.testForm.sip_gsmrz2.checked=false
+ document.testForm.sip_gsmrz3.checked=false
+
+ document.testForm.sip_landln.checked=false
+ document.testForm.sip_sipuniv.checked=false
+
+ document.testForm.gsmrz1_gsmrz2.checked=false
+ document.testForm.gsmrz1_gsmrz3.checked=false
+ document.testForm.gsmrz2_gsmrz3.checked=false
+
+ document.testForm.gsmrz1_sip.checked=false
+ document.testForm.gsmrz2_sip.checked=false
+ document.testForm.gsmrz3_sip.checked=false
+
+ document.testForm.landline_sip.checked=false
+
+ document.testForm.landline_gsmrz1.checked=false
+ document.testForm.landline_gsmrz2.checked=false
+ document.testForm.landline_gsmrz3.checked=false
+
+ document.testForm.gsmrz1_gsmee.checked=false
+ document.testForm.gsmrz1_gsmev.checked=false
+ document.testForm.gsmrz1_gsmet.checked=false
+ document.testForm.gsmrz1_gsmeo.checked=false
+
+ document.testForm.gsmrz2_gsmee.checked=false
+ document.testForm.gsmrz2_gsmev.checked=false
+ document.testForm.gsmrz2_gsmet.checked=false
+ document.testForm.gsmrz2_gsmeo.checked=false
+
+ document.testForm.gsmrz3_gsmee.checked=false
+ document.testForm.gsmrz3_gsmev.checked=false
+ document.testForm.gsmrz3_gsmet.checked=false
+ document.testForm.gsmrz3_gsmeo.checked=false
+
+
+ document.testForm.unisip_gsmee.checked=false
+ document.testForm.unisip_gsmev.checked=false
+ document.testForm.unisip_gsmet.checked=false
+ document.testForm.unisip_gsmeo.checked=false
+
+ FancyForm.update(document.testForm.sip_gsmrz1.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz2.getParent())
+ FancyForm.update(document.testForm.sip_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.sip_landln.getParent())
+ FancyForm.update(document.testForm.sip_sipuniv.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz2_sip.getParent())
+ FancyForm.update(document.testForm.gsmrz3_sip.getParent())
+
+ FancyForm.update(document.testForm.gsmrz1_gsmrz2.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmrz3.getParent())
+
+ FancyForm.update(document.testForm.landline_sip.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz1.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz2.getParent())
+ FancyForm.update(document.testForm.landline_gsmrz3.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz1_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz2_gsmeo.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmee.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmev.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmet.getParent())
+ FancyForm.update(document.testForm.gsmrz3_gsmeo.getParent())
+ FancyForm.update(document.testForm.unisip_gsmee.getParent())
+ FancyForm.update(document.testForm.unisip_gsmev.getParent())
+ FancyForm.update(document.testForm.unisip_gsmet.getParent())
+ FancyForm.update(document.testForm.unisip_gsmeo.getParent())
+
+}
+</script>
+</body>
+</html>
diff --git a/notFinishedCode/tricode/testCase.php b/notFinishedCode/tricode/testCase.php
new file mode 100644
index 0000000..c9e12ee
--- /dev/null
+++ b/notFinishedCode/tricode/testCase.php
@@ -0,0 +1,209 @@
+<?
+ //color definitions
+ $colorDunno = array("R"=>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);
+
+
+$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'];
+/*
+$GSMRZ1 = 0;
+$GSMRZ2 = -10;
+$GSMRZ3 = 10;
+
+$SIP = 4;
+$UNISIP = 0;
+$LANDLINE = 1;
+$LSFKS = 1;
+
+$GSMEE = 10;
+$GSMEV = 10;
+$GSMET = -10;
+$GSMEO = 10;
+*/
+$GSMEXTCOL = 'icons/box_dunno.png';
+$GSMINTCOL = "icons/server_dunno.png";
+$LSFKSCOL = "icons/server_dunno.png";
+
+$SIPCOL = 'icons/sip_dunno';
+$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
+$GSMINTPercent = rand(1,100);
+$GSMEXTPercent = rand(1,100);
+$SIPPercent = rand(1,100);
+$UNISIPPercent = rand(1,100);
+$LANDLINEPercent = rand(1,100);
+
+//print_r($GSMINTCOL);
+// add here to set the color for each node after the test ;)
+// setNode(0,$SIPCOL) or something as that :)
+?>
diff --git a/notFinishedCode/tricode/trueTableClass.py b/notFinishedCode/tricode/trueTableClass.py
new file mode 100755
index 0000000..0409527
--- /dev/null
+++ b/notFinishedCode/tricode/trueTableClass.py
@@ -0,0 +1,198 @@
+
+class trueTable:
+ def __init__(self, resultsList):
+
+ self.resultsList = resultsList
+ self.nanoBTS1 = None
+ self.nanoBTS2 = None
+ self.nanoBTS3 = None
+ self.o2Card = None
+ self.eplusCard = None
+ self.vodaCard = None
+ self.tmobileCard = None
+ self.outgoingLandline = None
+ self.asteriskServer = None
+
+ def initTrueTable(self):
+
+
+ for x in self.resultsList:
+
+ destination = x[1]
+ result = x[2]
+ caller = x[0]
+
+ if destination == 'GSMRZ1':
+ if result =='486':
+ self.nanoBTS1 = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMRZ1':
+ if result == '200':
+ self.nanoBTS1 = True
+ self.asteriskServer = True
+
+ if destination == 'GSMRZ1':
+ if result == '200':
+ self.nanoBTS1 = True
+ self.asteriskServer = True
+ elif result =='200':
+ self.nanoBTS1 = True
+ self.asteriskServer = True
+
+ elif destination == 'GSMRZ2':
+ if result =='486':
+ self.nanoBTS2 = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMRZ2':
+ if result == '200':
+ self.nanoBTS2 = True
+ self.asteriskServer = True
+
+ if destination == 'GSMRZ2':
+ if result == '200':
+ self.nanoBTS2 = True
+ self.asteriskServer = True
+ elif result =='200':
+ self.nanoBTS2 = True
+ self.asteriskServer = True
+
+ elif destination == 'GSMRZ3':
+ if result =='486':
+ self.nanoBTS3 = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMRZ3':
+ if result == '200':
+ self.nanoBTS3 = True
+ self.asteriskServer = True
+
+ if destination == 'GSMRZ2':
+ if result == '200':
+ self.nanoBTS3 = True
+ self.asteriskServer = True
+ elif result =='200':
+ self.nanoBTS3 = True
+ self.asteriskServer = True
+
+ elif destination == 'GSMExt.O2':
+ if result =='486':
+ self.o2Card = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.O2':
+ if result == '200':
+ self.o2Card = True
+ self.asteriskServer = True
+
+ if destination == 'GSMExt.O2':
+ if result == '200':
+ self.o2Card = True
+ self.asteriskServer = True
+ elif result =='200':
+ self.o2Card = True
+ self.asteriskServer = True
+
+ elif destination == 'GSMExt.Voda':
+ if result =='486':
+ self.vodaCard = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.Voda':
+ if result == '200':
+ self.vodaCard = True
+ self.asteriskServer = True
+
+ if destination == 'GSMExt.Voda':
+ if result == '200':
+ self.vodaCard = True
+ self.asteriskServer = True
+ elif result =='200':
+ self.vodaCard = True
+ self.asteriskServer = True
+
+ elif destination == 'GSMExt.Eplus':
+ if result =='486':
+ self.eplusCard = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.Eplus':
+ if result == '200':
+ self.eplusCard = True
+ self.asteriskServer = True
+
+ if destination == 'GSMExt.Eplus':
+ if result == '200':
+ self.eplusCard = True
+ self.asteriskServer = True
+ elif result =='200':
+ self.eplusCard = True
+ self.asteriskServer = True
+
+ elif destination == 'GSMExt.Tm':
+ if result =='486':
+ self.tmobileCard = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'GSMExt.Tm':
+ if result == '200':
+ self.tmobileCard = True
+ self.asteriskServer = True
+
+ if destination == 'GSMExt.Tm':
+ if result == '200':
+ self.tmobileCard = True
+ self.asteriskServer = True
+ elif result =='200':
+ self.tmobileCard = True
+ self.asteriskServer = True
+
+ elif destination == 'sip':
+ if result =='486':
+ self.asteriskServer = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if call == 'sip':
+ if result == '200':
+ self.asteriskServer = True
+
+ if destination == 'sip':
+ if result == '200':
+ self.asteriskServer = True
+
+ elif result =='200':
+ self.asteriskServer = True
+
+ if caller == 'GSMRZ1' or caller == 'GSMRZ2' or caller == 'GSMRZ3':
+
+ if destination == 'landline':
+ if result =='486':
+ self.outgoingLandline = False
+ for y in self.resultsList:
+ call = y[0]
+ destination = y[1]
+ result = y[2]
+ if caller == 'GSMRZ1' or caller == 'GSMRZ2' or caller == 'GSMRZ3':
+ if destination == 'landline':
+ if result == '200':
+ self.outgoingLandline = True
+ self.asteriskServer = True
+
+
diff --git a/notFinishedCode/tricode/trueTableClass.pyc b/notFinishedCode/tricode/trueTableClass.pyc
new file mode 100755
index 0000000..9597b8b
--- /dev/null
+++ b/notFinishedCode/tricode/trueTableClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/usbDetectClass.py b/notFinishedCode/tricode/usbDetectClass.py
new file mode 100755
index 0000000..19ed52b
--- /dev/null
+++ b/notFinishedCode/tricode/usbDetectClass.py
@@ -0,0 +1,88 @@
+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 = 'IME not found'
+ self.number = 'number not found'
+ self.updateStatus = None
+
+ def initDB(self):
+ self.db = DbClass.DBMySQLConnection('root', 'randompasswordSQL', 'localhost', 'gsmselftesting')
+ 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:
+ print 'error'
+ 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)
+ self.ser.write('AT+GSN\r')
+ result = self.ser.read(25)
+ self.IMEI = result[result.find('3'):15+result.find('3')]
+
+ 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 != '':
+ self.number = number
+ else:
+ self.number = 'number not found'
+
+ else:
+ self.number = 'port not found'
+ return 0
diff --git a/notFinishedCode/tricode/usbDetectClass.pyc b/notFinishedCode/tricode/usbDetectClass.pyc
new file mode 100755
index 0000000..9bc60bd
--- /dev/null
+++ b/notFinishedCode/tricode/usbDetectClass.pyc
Binary files differ
diff --git a/notFinishedCode/tricode/wait.gif b/notFinishedCode/tricode/wait.gif
new file mode 100644
index 0000000..1c72ebb
--- /dev/null
+++ b/notFinishedCode/tricode/wait.gif
Binary files differ
diff --git a/notFinishedCode/web/css/Critical.png b/notFinishedCode/web/css/Critical.png
new file mode 100644
index 0000000..e025d19
--- /dev/null
+++ b/notFinishedCode/web/css/Critical.png
Binary files differ
diff --git a/notFinishedCode/web/css/Help.png b/notFinishedCode/web/css/Help.png
new file mode 100644
index 0000000..42a8f7c
--- /dev/null
+++ b/notFinishedCode/web/css/Help.png
Binary files differ
diff --git a/notFinishedCode/web/css/Info.png b/notFinishedCode/web/css/Info.png
new file mode 100644
index 0000000..5a7a2c3
--- /dev/null
+++ b/notFinishedCode/web/css/Info.png
Binary files differ
diff --git a/notFinishedCode/web/css/Warning.png b/notFinishedCode/web/css/Warning.png
new file mode 100644
index 0000000..0af654e
--- /dev/null
+++ b/notFinishedCode/web/css/Warning.png
Binary files differ
diff --git a/notFinishedCode/web/css/chk_off.png b/notFinishedCode/web/css/chk_off.png
new file mode 100755
index 0000000..1514d51
--- /dev/null
+++ b/notFinishedCode/web/css/chk_off.png
Binary files differ
diff --git a/notFinishedCode/web/css/chk_on.png b/notFinishedCode/web/css/chk_on.png
new file mode 100755
index 0000000..a9925a0
--- /dev/null
+++ b/notFinishedCode/web/css/chk_on.png
Binary files differ
diff --git a/notFinishedCode/web/css/formCSS.css b/notFinishedCode/web/css/formCSS.css
new file mode 100644
index 0000000..f94bd72
--- /dev/null
+++ b/notFinishedCode/web/css/formCSS.css
@@ -0,0 +1,46 @@
+/* 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/notFinishedCode/web/css/info_rhombus.png b/notFinishedCode/web/css/info_rhombus.png
new file mode 100644
index 0000000..036733e
--- /dev/null
+++ b/notFinishedCode/web/css/info_rhombus.png
Binary files differ
diff --git a/notFinishedCode/web/css/information.png b/notFinishedCode/web/css/information.png
new file mode 100644
index 0000000..93c67f2
--- /dev/null
+++ b/notFinishedCode/web/css/information.png
Binary files differ
diff --git a/notFinishedCode/web/css/link.gif b/notFinishedCode/web/css/link.gif
new file mode 100644
index 0000000..daada04
--- /dev/null
+++ b/notFinishedCode/web/css/link.gif
Binary files differ
diff --git a/notFinishedCode/web/css/tableCSS.css b/notFinishedCode/web/css/tableCSS.css
new file mode 100644
index 0000000..2a7f54d
--- /dev/null
+++ b/notFinishedCode/web/css/tableCSS.css
@@ -0,0 +1,146 @@
+/* -------------------------------------------------------
+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: 1px;
+ padding-top: 0px;
+ padding-right: 220px;
+ padding-left: 350px;
+ border: 1px solid black;
+ }
+ 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/notFinishedCode/web/css/tooltip.css b/notFinishedCode/web/css/tooltip.css
new file mode 100644
index 0000000..3a50734
--- /dev/null
+++ b/notFinishedCode/web/css/tooltip.css
@@ -0,0 +1,33 @@
+.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/notFinishedCode/web/css/visitedLink.gif b/notFinishedCode/web/css/visitedLink.gif
new file mode 100644
index 0000000..f7f1867
--- /dev/null
+++ b/notFinishedCode/web/css/visitedLink.gif
Binary files differ