root/dev/common/includes/class.eveapi.php @ 378

Revision 378, 158.6 KB (checked in by kovell, 13 years ago)

API feed caches date properly. Rank mod has missing TopLists?. Parser has better spelling.

Line 
1<?php
2// Report all PHP errors (bitwise 63 may be used in PHP 3)
3@error_reporting(E_ALL ^ E_NOTICE);
4define ("APIVERSION", "V3.3");
5
6//
7// Eve-Dev API Killmail parser by Captain Thunk! (ISK donations are all gratefully received)
8//
9
10require_once( "common/includes/class.kill.php" );
11require_once( "common/includes/class.parser.php" );
12require_once('common/includes/class.pilot.php');
13require_once('common/includes/class.corp.php');
14require_once('common/includes/class.alliance.php');
15require_once( "common/includes/db.php" );
16require_once('common/includes/class.apicache.php');
17
18$ApiCache = new ApiCache(KB_SITE);
19
20// Checks for configuration of files and folders
21if (!file_exists("cache/api")) 
22{
23    if (!mkdir("cache/api", 0777))
24        {
25                // creating folder failed - spam something about that
26                echo "Failed to create folder 'cache/api' you should create the folder yourself and set chmod 777";
27        }
28} 
29
30// **********************************************************************************************************************************************
31// ****************                                    API KillLog - /corp/Killlog.xml.aspx                                      ****************
32// **********************************************************************************************************************************************
33
34class API_KillLog 
35{
36    function Import($keystring, $typestring, $keyindex) 
37        {
38                $this->mailcount_ = 0;
39                $this->ignoredmails_ = 0;
40                $this->malformedmails_ = 0;
41                $this->verified_ = 0;
42                $this->totalmails_ = 0;
43                $this->errorcode_ = 0;
44                $this->Output_ = "";
45                $this->isContainer = false;
46                $this->hasdownloaded_ = false;
47                $this->errortext_ = "";
48                $this->CachedUntil_ = "";
49                $this->killmailExists_ = false;
50               
51        // reduces strain on DB
52                if(function_exists("set_time_limit"))
53                set_time_limit(0);
54
55        $this->API_IgnoreFriendPos_ = config::get('API_IgnoreFriendPos');
56        $this->API_IgnoreEnemyPos_ = config::get('API_IgnoreEnemyPos');
57        $this->API_IgnoreNPC_ = config::get('API_IgnoreNPC');
58        $this->API_IgnoreCorpFF_ = config::get('API_IgnoreCorpFF');
59        $this->API_IgnoreAllianceFF_ = config::get('API_IgnoreAllianceFF');
60        $this->API_NoSpam_ = config::get('API_NoSpam');
61                $this->API_CacheTime_ = ApiCache::get('API_CachedUntil_' . $keyindex);
62                $this->API_UseCaching_ = config::get('API_UseCache');
63                $this->API_CCPErrorCorrecting = config::get('API_CCPErrorCorrecting');
64        $this->keyindex_ = $keyindex;
65
66
67                // Initialise for error correcting and missing itemID resolution
68                $this->myIDName = new API_IDtoName();
69                $this->myNameID = new API_NametoID();
70               
71        $lastdatakillid = 1;
72        $currentdatakillid = 0;
73
74                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
75                if ($this->API_CacheTime_ == "")
76        {
77                $this->API_CacheTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
78        }
79               
80                if (is_file(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml'))
81                        $cacheexists = true;
82                else
83                        $cacheexists = false;
84               
85                // if API_UseCache = 1 (off) then don't use cache
86        if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($this->API_CacheTime_) > 0) || ($this->API_UseCaching_ == 1)  || !$cacheexists )
87        {
88            // Load new XML
89                        $logsource = "New XML";
90                        $this->Output_ .= "<i>Downloading latest XML file for " . config::get('API_Name_'.$keyindex) . "</i><br><br>";
91                        $data = '<myxml thunkage="1">';
92                do {
93                $data .= $this->loaddata($currentdatakillid, $keystring, $typestring);
94                $lastdatakillid = $currentdatakillid;
95                $currentdatakillid = $this->getlastkillid($data);
96                } while ( $lastdatakillid != $currentdatakillid );
97                $data .= '</myxml>'; 
98
99                        if ( ( $this->API_UseCaching_ ) == 0 )//&& ( $this->iscronjob_ == false ) )
100                        {
101                                // save the file if no errors have occurred
102                                if ($this->errorcode_ == 0)
103                                {
104                                        $file = fopen(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml', 'w+');
105                                fwrite($file, $data);
106                                fclose($file);
107                                        //chmod the file so it can be altered by cronjobs in future
108                                        @chmod(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml',0666);
109                                }
110                        } 
111        } else { 
112            // re-use cached XML
113                        $this->Output_ .= "<i>Using cached XML file for " . config::get('API_Name_'.$keyindex) . "</i><br><br>";
114                        $logsource = "Cache";
115                       
116                        if ($fp = @fopen(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml', 'r')) {
117                $data = fread($fp, filesize(getcwd().'/cache/api/'.config::get('API_Name_'.$keyindex).'_KillLog.xml'));
118                        fclose($fp);
119                } else {
120                                return "<i>error loading cached file ".config::get('API_Name_'.$keyindex)."_KillLog.xml</i><br><br>"; 
121                }
122        }
123   
124        $xml_parser = xml_parser_create();
125        xml_set_object ( $xml_parser, $this );
126        xml_set_element_handler($xml_parser, "startElement", "endElement");
127        xml_set_character_data_handler ( $xml_parser, 'characterData' );
128
129        if (!xml_parse($xml_parser, $data, true))
130            return $this->Output_ .= "<i>Error getting XML data from api.eve-online.com</i><br><br>";
131
132        if ( strlen($data) == 28 ) 
133            return $this->Output_ .= "<i>Error contacting api.eve-online.com</i><br><br>";
134
135        xml_parser_free($xml_parser);
136
137        if ( ($this->hasdownloaded_ == false) && ($this->errortext_ != "") )
138                {
139            $this->Output_ .= "<font color = \"#FF0000\">".$this->errortext_ . "</font><br>";
140                        $logsource = "Error";
141                }
142
143        if ($this->mailcount_)
144            $this->Output_ .= "<div class=block-header2>".$this->mailcount_." kills, " . $this->malformedmails_ . " malformed, " . $this->ignoredmails_ . " ignored and " . $this->verified_ . " verified from feed: " . config::get('API_Name_'.$keyindex) . " which contained ".$this->totalmails_." mails.<br></div>";
145        else
146            $this->Output_ .= "<div class=block-header2>No kills added, ". $this->malformedmails_ . " malformed, " . $this->ignoredmails_." ignored and " . $this->verified_ . " verified from feed: " . config::get('API_Name_'.$keyindex) . " which contained ".$this->totalmails_." mails.<br></div>";
147                       
148                // Write to kb3_apilog
149                $qry = new DBQuery();
150                if ($this->iscronjob_)
151                        $logtype = "Cron Job";
152                else
153                        $logtype = "Manual";
154                       
155        $qry->execute( "insert into kb3_apilog  values( '" . KB_SITE . "', '"
156                                                                                                                . config::get('API_Name_'.$keyindex) . "',"
157                                                                                                                . $this->mailcount_ . ","
158                                                                                                                . $this->malformedmails_ . ","
159                                                                                                                . $this->ignoredmails_ . ","
160                                                                                                                . $this->verified_ . ","
161                                                                                                                . $this->totalmails_ . ",'"
162                                                                                                                . $logsource . "','"
163                                                                                                                . $logtype . "',now() )" );
164               
165        return $this->Output_;
166
167    }
168
169    function startElement($parser, $name, $attribs) 
170    {
171                if($this->killmailExists_ && ($name != "ROW" ||  !is_numeric($attribs['KILLID']))) return;
172                else $this->killmailExists_ = false;
173        if ($name == "ROWSET")
174        { 
175                        //echo $this->rowsetCounter_ . " ";
176            if (($this->pname_ == "") && ($this->typeid_ != "0"))
177            { 
178                                $this->isContainer = true;
179                                // this is to catch containers that spawn a new rowset so are missed off loot
180                if ($this->qtydropped_ !=0) 
181                                {
182                    // dropped items
183                    $this->droppeditems_['typeid'][] = $this->typeid_;
184                    $this->droppeditems_['qty'][] = $this->qtydropped_;
185                    //if ($this->isContainer)
186                                        //{
187                                        //      $this->droppeditems_['flag'][] = -1;
188                                        //} else {
189                                                $this->droppeditems_['flag'][] = $this->itemFlag_;
190                                        //}
191                } 
192                if ($this->qtydestroyed_ != 0) 
193                                {
194                    // destroyed items
195                    $this->destroyeditems_['typeid'][] =$this->typeid_;
196                    $this->destroyeditems_['qty'][] = $this->qtydestroyed_;
197                   // if ($this->isContainer)
198                                        //{
199                                        //      $this->destroyeditems_['flag'][] = -1;
200                                        //} else {
201                                                $this->destroyeditems_['flag'][] = $this->itemFlag_;
202                                        //}
203                }
204                $this->typeid_ = 0;
205                $this->itemFlag_ = 0;
206                $this->qtydropped_ = 0; 
207                $this->qtydestroyed_ = 0;
208            }
209                        // goes after so container itself doesn't count as "(in countainer)
210                       
211        }
212
213        if (count($attribs)) 
214        {
215            foreach ($attribs as $k => $v) 
216                        {
217                switch ($k) 
218                                {
219                    case "CHARACTERID":
220                        $this->charid_ = $v;
221                        break;
222                    case "CHARACTERNAME": 
223                                                $this->pname_ = $v;
224                                               
225                                                // Error Correction is on (0 = on, 1 = off(I know, just don't ask))
226                                                if ( $this->API_CCPErrorCorrecting == 0 ) 
227                                                {
228                                                        if ( ($this->charid_ != "0" ) && (strlen($this->pname_) == 0) )
229                                                        { 
230                                                                // name is blank but ID is valid - convert ID into name
231                                                                $this->myIDName->clear();
232                                                                $this->myIDName->setIDs($this->charid_); 
233                                                                $this->Output_ .= $this->myIDName->fetchXML();
234                                                                $myNames = $this->myIDName->getIDData();
235                                                                $this->pname_ = $myNames[0]['name'];
236                                                        }
237                                                } 
238                        break;
239                                        case "CORPORATIONID": 
240                        $this->corporationID_ = $v;
241                                                break;
242                    case "CORPORATIONNAME": 
243                                                $this->corporation_ = $v;
244                                               
245                                                // Error Correction is on (0 = on, 1 = off(I know, just don't ask))
246                                                if ( $this->API_CCPErrorCorrecting == 0 ) 
247                                                {
248                                                        if ( ($this->corporationID_ != "0" ) && (strlen($this->corporation_) == 0) ) 
249                                                        { // name is blank but ID is valid - convert ID into name
250                                                                $this->myIDName->clear();
251                                                                $this->myIDName->setIDs($this->corporationID_); 
252                                                                $this->Output_ .= $this->myIDName->fetchXML();
253                                                                $myNames = $this->myIDName->getIDData();
254                                                                $this->corporation_ = $myNames[0]['name'];
255                                                        }
256                                                }
257                        break;
258                    case "ALLIANCEID":
259                        $this->allianceID_ = $v;
260                        break;
261                    case "ALLIANCENAME": 
262                                                $this->alliance_ = $v;
263                                               
264                                                // Error Correction is on (0 = on, 1 = off(I know, just don't ask))
265                                                //if ( $this->API_CCPErrorCorrecting == 0 )
266                                                // conditional branch removed - ALWAYS fix alliance name bugs
267                                                {
268                                                        if ( ($this->allianceID_ != "0" ) && (strlen($this->alliance_) == 0) )
269                                                        { // name is blank but ID is valid - convert ID into name
270                                                                $this->myIDName->clear();
271                                                                $this->myIDName->setIDs($this->allianceID_); 
272                                                                $this->Output_ .= $this->myIDName->fetchXML();
273                                                                $myNames = $this->myIDName->getIDData();
274                                                                $this->alliance_ = $myNames[0]['name'];
275                                                        }
276                                                }
277                                               
278                                                if (strlen($this->alliance_) == 0)
279                                                        $this->alliance_ = "NONE";
280                        break;
281                    case "DAMAGETAKEN": 
282                        $this->damagetaken_ = $v;
283                        break;
284                    case "DAMAGEDONE": 
285                        $this->damagedone_ = $v;
286                        break;
287                    case "SHIPTYPEID": 
288                        if ($v == 0) 
289                                                {
290                            $this->shipname_ = "Unknown";
291                                                } else {
292                            $this->shipname_ = gettypeIDname($v);
293                        }
294                        break;
295                    case "FINALBLOW": 
296                        $this->finalblow_ = $v; 
297                        break;
298                    case "SECURITYSTATUS": 
299                        //$this->security_ = $v;
300                                                $this->security_ = round($v,2); // allows number to pass with strict settings (number is usually much longer than 5 chars as defined in DB)
301                        break;
302                    case "WEAPONTYPEID": 
303                        $this->weapon_ = gettypeIDname($v);
304                        break;
305                    // for items
306                    case "TYPEID": 
307                        $this->typeid_ = gettypeIDname($v);
308                                               
309                                                // Missing Item correction
310                                                if ($this->typeid_ == "")
311                                                {
312                                                        $this->myIDName->clear();
313                                                        $this->myIDName->setIDs($v); 
314                                                        $this->Output_ .= $this->myIDName->fetchXML();
315                                                        $myNames = $this->myIDName->getIDData();
316                                                        //$this->typeid_ = "Item missing from DB: " . $myNames[0]['name'];
317                                                        $this->typeid_ = $myNames[0]['name'];
318                                                }
319                        break;
320                    case "FLAG": 
321                        $this->itemFlag_ = $v;
322                        break;
323                    case "QTYDROPPED": 
324                        $this->qtydropped_ = $v;
325                        break;
326                    case "QTYDESTROYED": 
327                        $this->qtydestroyed_ = $v;
328                        break;
329
330                    // for system/kill mail details (start of mail)
331                    case "KILLID": 
332                        // print mail here - this will miss the last mail but it can be caught on exit. This weird way of doing things prevents falling foul
333                        // of the CCP API cargo bug - using function, avoids the repetition
334                        if ($this->beforekillid_ != 0) 
335                        {
336                            $this->parseendofmail();
337                        }
338                                                $this->killid_ = $v; // added v2.6 for help tracing erroneous mails
339                                                $this->totalmails_++; // Count total number of mails in XML feed
340                                                if ($this->isKillIDVerified($v) != null)
341                                                {
342                                                        $this->killmailExists_ = true;
343        unset($this->destroyeditems_ );
344        unset($this->droppeditems_);
345                $this->beforekillid_ = 0;
346                                                        return;
347                                                } else {
348                                                        $this->killmailExists_ = false;
349                                $this->beforekillid_ = $v;
350                                                }
351                        break;
352                    case "SOLARSYSTEMID": // convert to system name and fetch system security - DONE
353                        $sql = 'select sys.sys_name, sys.sys_sec from kb3_systems sys where sys.sys_eve_id = '.$v;
354
355                        $qry = new DBQuery();
356                        $qry->execute($sql);
357                        $row = $qry->getRow();
358
359                        $this->systemname_ = $row['sys_name'];
360                        $mysec = $row['sys_sec'];
361                        if ($mysec <= 0)
362                            $this->systemsecurity_ = number_format(0.0, 1);
363                        else
364                            $this->systemsecurity_ = number_format(round($mysec, 1), 1);
365                        break;
366                    case "MOONID": // only given with POS related stuff - unanchored mods however, do not have a moonid.
367                                                $this->moonid_ = $v;
368                                               
369                                                $this->moonname_ = getMoonName($v);     
370                                                // Missing Moon DB correction
371                                                if (($this->moonname_ == "") && ($this->moonid_ != 0))
372                                                {
373                                                        $this->myIDName->clear();
374                                                        $this->myIDName->setIDs($v); 
375                                                        $this->Output_ .= $this->myIDName->fetchXML();
376                                                        $myNames = $this->myIDName->getIDData();
377                                                        //$this->typeid_ = "Item missing from DB: " . $myNames[0]['name'];
378                                                        $this->moonname_ = $myNames[0]['name'];
379                                                }       
380                        break;
381                    case "KILLTIME": // Time Kill took place
382                        $this->killtime_ = $v;
383                        break;
384                                        case "FACTIONID": // Faction ID
385                        $this->factionid_ = $v;
386                        break;
387                                        case "FACTIONNAME": // Faction Name
388                                                if ( $v == "" ) {
389                                                        $this->factionname_ = "NONE";
390                        } else {
391                                                        $this->factionname_ = $v;
392                                                }
393                        break;
394                                        case "CODE": // error code
395                                                $this->errorcode_ .= $v;
396                                                break;
397                }
398            }
399        }
400    }
401
402    function endElement($parser, $name) 
403    {
404                if($this->killmailExists_ && $name != "RESULT") return;
405                else $this->killmailExists_ = false;
406        switch ($name) 
407        {
408                        case "ROWSET":
409                                $this->isContainer = false;
410                                break;
411            case "VICTIM":
412                $this->hasdownloaded_ = true;
413                // if no name is given and moonid != 0 then replace name with corp name for parsing - would lookup the moonid but we don't have that in database - replace shipname as "Unknown" this allows parsing to complete
414                if ($this->moonid_ != 0 && $this->pname_ == "")
415                {
416                    $this->pname_ = $this->moonname_;
417                    //$this->shipname_ = "Unknown"; // this is done else mail will not parse
418                    $this->isposkill_ = true;
419                } elseif (($this->moonid_ == 0) && ($this->pname_ == "") && ($this->charid_ != 0)) {
420                                        // catches unanchored POS modules - as moon is unknown, we will use system name instead
421                                        $this->pname_ = $this->systemname_;
422                    $this->isposkill_ = true;
423                                } else {
424                    $this->isposkill_ = false;
425                }
426                // print victim header
427                $this->killmail_ = substr(str_replace('-', '.' , $this->killtime_), 0, 16) . "\r\n\r\n";
428                                if ($this->isposkill_ == false )
429                        $this->killmail_ .= "Victim: ".$this->pname_ . "\r\n"; // This line would not appear on a POS mail
430                                $this->killmail_ .= "Corp: ".$this->corporation_ . "\r\n";
431                $this->killmail_ .= "Alliance: ".$this->alliance_ . "\r\n";
432                                $this->killmail_ .= "Faction: ".$this->factionname_ . "\r\n";
433                $this->killmail_ .= "Destroyed: ".$this->shipname_ . "\r\n";
434                                if ($this->isposkill_ == true )
435                                        $this->killmail_ .= "Moon: ".$this->moonname_ . "\r\n"; // This line does appear on a POS mail
436                $this->killmail_ .= "System: ".$this->systemname_ . "\r\n";
437                $this->killmail_ .= "Security: ".$this->systemsecurity_ . "\r\n";
438                $this->killmail_ .= "Damage Taken: ".$this->damagetaken_ . "\r\n\r\n";
439                $this->killmail_ .= "Involved parties:\r\n\r\n";
440
441                if ( config::get('API_Update') == 0 )
442                { 
443                                        // update Victim portrait while we're here
444                    $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->pname_ . '"';
445
446                                        $qry = new DBQuery();
447                    $qry->execute($sql);
448                    $row = $qry->getRow();
449                    if ($qry->recordCount() != 0)
450                    {
451                        $pilot_id = $row['plt_id'];
452                        $pilot_external_id = $row['plt_externalid'];
453
454                        if ( $pilot_external_id == 0 && $pilot_id != 0)
455                        {       
456                                                        // update DB with ID
457                            $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->charid_) . "
458                                            where plt_id = " . $pilot_id);
459                        } 
460                    }
461                }
462                               
463                                // update crp_external_id
464                                Update_CorpID($this->corporation_, $this->corporationID_);
465                                // update all_external_id
466                                if ($this->allianceID_ != 0)
467                                        Update_AllianceID($this->alliance_, $this->allianceID_);
468                                       
469                // set victim corp and alliance for FF check
470                $this->valliance_ = $this->alliance_;
471                $this->vcorp_ = $this->corporation_;
472
473                // now clear these
474                //$this->killtime_ = "";
475                $this->pname_ = "";
476                $this->alliance_ = "";
477                                $this->factionname_ = "";
478                $this->corporation_ = "";
479                $this->destroyed_ = 0;
480                $this->systemname_ = "";
481                $this->systemsecurity_ = 0;
482                $this->damagetaken_ = 0;
483                $this->charid_ = 0;
484                                $this->moonid_ = 0;
485                                $this->mooname_ = 0;
486                                $this->corporationID_ = 0;
487                                $this->allianceID_ = 0;
488                break;
489            case "ROW":
490                if ( $this->typeid_ != "0" )
491                { 
492                                        // it's cargo
493                    if ($this->qtydropped_ !=0) 
494                    {
495                        // dropped items
496                        $this->droppeditems_['typeid'][] = $this->typeid_;
497                        $this->droppeditems_['qty'][] = $this->qtydropped_;
498                                                if ($this->isContainer)
499                                                {
500                                                        $this->droppeditems_['flag'][] = -1;
501                                                } else {
502                                                        $this->droppeditems_['flag'][] = $this->itemFlag_;
503                                                }
504                                        } 
505                    if ($this->qtydestroyed_ != 0)
506                    {
507                    // destroyed items
508                        $this->destroyeditems_['typeid'][] = $this->typeid_;
509                        $this->destroyeditems_['qty'][] = $this->qtydestroyed_;
510                        if ($this->isContainer)
511                                                {
512                                                        $this->destroyeditems_['flag'][] = -1;
513                                                } else {
514                                                        $this->destroyeditems_['flag'][] = $this->itemFlag_;
515                                                }
516                    }
517                    $this->typeid_ = 0;
518                    $this->itemFlag_ = 0;
519                    $this->qtydropped_ = 0; 
520                    $this->qtydestroyed_ = 0;
521                } 
522                                // using corporation_ not pname_ as NPCs don't have a name *** CHANGED to corporationID 16/03/2009 to catch 'sleeper' NPCs
523                if ($this->corporationID_ != 0) 
524                { 
525                                        // it's an attacker
526                    $this->attackerslist_['name'][] = $this->pname_;
527                    $this->attackerslist_['finalblow'][] = $this->finalblow_;
528                    $this->attackerslist_['security'][] = $this->security_;
529                                        $this->attackerslist_['corporation'][] = $this->corporation_;
530                    $this->attackerslist_['alliance'][] = $this->alliance_;
531                    $this->attackerslist_['faction'][] = $this->factionname_;
532                    $this->attackerslist_['shiptypeid'][] = $this->shipname_; 
533                    $this->attackerslist_['weapon'][] = $this->weapon_; 
534                    $this->attackerslist_['damagedone'][] = $this->damagedone_;
535
536                    if ( config::get('API_Update') == 0 )
537                    { 
538                                                // update Attacker portrait while we're here
539                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->pname_ . '"';
540
541                        $qry = new DBQuery();
542                        $qry->execute($sql);
543                        $row = $qry->getRow();
544                        if ($qry->recordCount() != 0)
545                        {                                               
546                            $pilot_id = $row['plt_id'];
547                            $pilot_external_id = $row['plt_externalid'];
548
549                            if ( $pilot_external_id == 0 && $pilot_id != 0 )
550                            {   
551                                                                // update DB with ID
552                                $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->charid_) . "
553                                                where plt_id = " . $pilot_id);
554                            }
555                        }
556                    }
557                                       
558                                        // update crp_external_id
559                                        Update_CorpID($this->corporation_, $this->corporationID_);
560                                        // update all_external_id
561                                        if ($this->allianceID_ != 0)
562                                                Update_AllianceID($this->alliance_, $this->allianceID_);
563                                               
564                    $this->pname_ = "";
565                    $this->finalblow_ = 0;
566                    $this->security_ = 0;
567                    $this->alliance_ = "";
568                                        $this->factionname_ = "";
569                    $this->corporation_ = "";
570                    $this->shipname_ = 0;
571                    $this->weapon_ = 0;
572                    $this->damagedone_ = 0;
573                    $this->charid_ = 0;
574                                        $this->corporationID_ = 0;
575                                        $this->allianceID_ = 0;
576                }
577                break;
578            case "RESULT":
579                // reset beforekillid to allow processing of more chunks of data I've placed into $data
580                $this->beforekillid_ = 0;
581
582                // does last killmail
583                if ($this->hasdownloaded_) 
584                                { 
585                                        // catch to prevent processing without any mails
586                    $this->parseendofmail();
587                }
588                break;
589            case "MYXML":
590                // end of data xml, process cachedtime here
591                //$ApiCache->set('API_CachedUntil_' . $this->keyindex_, $this->cachetext_);
592                break; 
593                        case "ERROR": //  Error Message
594                                if ($this->errortext_ == "")
595                                {
596                                        $this->errortext_ .= $this->characterDataValue;
597                                }
598                                break;
599                        case "CURRENTTIME":
600                                $this->CurrentTime_ = $this->characterDataValue;
601                                break;
602                        case "CACHEDUNTIL":
603                                // kill log can be several xml sheets stuck together, we only want the first CachedUntil_
604                                if ($this->CachedUntil_ == "")
605                                {
606                                        // Do not save cache key if this is an error sheet
607                                        $this->CachedUntil_ = $this->characterDataValue;
608                                        ApiCache::set('API_CachedUntil_' . $this->keyindex_, $this->CachedUntil_);
609                                }
610                                break;
611        }
612    }
613
614    function characterData($parser, $data) 
615    {
616                $this->characterDataValue = $data;
617    }
618
619    function parseendofmail()
620    {
621            // print attacks
622                $attackercounter = count($this->attackerslist_['name']);
623        // sort array into descending damage
624        if ($attackercounter != 0 ) 
625        {
626                array_multisort($this->attackerslist_['damagedone'], SORT_NUMERIC, SORT_DESC,
627                $this->attackerslist_['name'], SORT_ASC, SORT_STRING,
628                $this->attackerslist_['finalblow'], SORT_NUMERIC, SORT_DESC,
629                $this->attackerslist_['security'], SORT_NUMERIC, SORT_DESC,
630                                $this->attackerslist_['corporation'], SORT_ASC, SORT_STRING,
631                $this->attackerslist_['alliance'], SORT_ASC, SORT_STRING,
632                $this->attackerslist_['faction'], SORT_ASC, SORT_STRING,
633                $this->attackerslist_['shiptypeid'], SORT_ASC, SORT_STRING,
634                $this->attackerslist_['weapon'], SORT_ASC, SORT_STRING );
635        }
636
637        // Initialise some flags to use                         
638        $hasplayersonmail = false;
639        $this->corpFF_ = true;
640        $this->allianceFF_ = true;
641        $poswasfriendly = false;
642                               
643        // catch for victim being in no alliance
644        if ($this->valliance_ == "NONE")
645                $this->allianceFF_ = false;
646
647        for ($attackerx = 0; $attackerx < $attackercounter; $attackerx++) 
648        {
649                // if NPC (name will be "") then set pname_ as corporation_ for mail parsing
650                if  ($this->attackerslist_['name'][$attackerx] == "")
651                {
652                                // fix for Sleepers ("Unknown")
653                                if ($this->attackerslist_['corporation'][$attackerx] == "")
654                                {
655                                        $npccorpname = "Unknown";
656                                } else {
657                                        $npccorpname = $this->attackerslist_['corporation'][$attackerx];
658                                }
659                $this->killmail_ .= "Name: ".$this->attackerslist_['shiptypeid'][$attackerx] ." / ".$npccorpname."\r\n";
660                $this->killmail_ .= "Damage Done: ".$this->attackerslist_['damagedone'][$attackerx]."\r\n";
661                $this->corpFF_ = false;
662                $this->allianceFF_ = false;
663            } else {
664                $hasplayersonmail = true;       
665                $this->killmail_ .= "Name: ".$this->attackerslist_['name'][$attackerx];
666                if ($this->attackerslist_['finalblow'][$attackerx] == 1)
667                {
668                    $this->killmail_ .= " (laid the final blow)";
669                }
670                $this->killmail_ .= "\r\n";
671
672                $this->killmail_ .= "Security: ".$this->attackerslist_['security'][$attackerx]."\r\n";
673                                $this->killmail_ .= "Corp: ".$this->attackerslist_['corporation'][$attackerx]."\r\n";
674                $this->killmail_ .= "Alliance: ".$this->attackerslist_['alliance'][$attackerx]."\r\n";
675                $this->killmail_ .= "Faction: ".$this->attackerslist_['faction'][$attackerx]."\r\n";
676                $this->killmail_ .= "Ship: ".$this->attackerslist_['shiptypeid'][$attackerx]."\r\n"; 
677                $this->killmail_ .= "Weapon: ".$this->attackerslist_['weapon'][$attackerx]."\r\n"; 
678                $this->killmail_ .= "Damage Done: ".$this->attackerslist_['damagedone'][$attackerx]."\r\n";
679
680                // set Friendly Fire matches
681                if ($this->attackerslist_['alliance'][$attackerx] != $this->valliance_)
682                        $this->allianceFF_ = false;
683                if ($this->attackerslist_['corporation'][$attackerx] != $this->vcorp_)
684                        $this->corpFF_ = false;                         
685            }
686            $this->killmail_ .= "\r\n";
687        } //end for next loop
688               
689        // clear attackerslist
690        $this->attackerslist_ = array();
691
692        if (count($this->destroyeditems_['qty']) != 0) 
693        {
694            $this->killmail_ .= "\r\nDestroyed items:\r\n\r\n";
695
696            $counter = count($this->destroyeditems_['qty']);
697            for ($x = 0; $x < $counter; $x++) 
698            {
699                if ($this->destroyeditems_['qty'][$x] > 1)
700                { 
701                                        // show quantity
702                        $this->killmail_ .= $this->destroyeditems_['typeid'][$x].", Qty: ".$this->destroyeditems_['qty'][$x];
703                } else { 
704                                        // just the one
705                        $this->killmail_ .= $this->destroyeditems_['typeid'][$x];
706                }
707       
708                if ($this->destroyeditems_['flag'][$x] == 5) {
709                        $this->killmail_ .= " (Cargo)";
710                } elseif ($this->destroyeditems_['flag'][$x] == 87) {
711                        $this->killmail_ .= " (Drone Bay)";
712                }  elseif ($this->destroyeditems_['flag'][$x] == -1) 
713                                {
714                                        $this->killmail_ .= " (In Container)";
715                                }
716                $this->killmail_ .= "\r\n";
717            }
718        }       
719
720        if (count($this->droppeditems_['qty']) != 0) 
721        {
722            $this->killmail_ .= "\r\nDropped items:\r\n\r\n";
723
724            $counter = count($this->droppeditems_['qty']);
725            for ($x = 0; $x < $counter; $x++) 
726            {
727                if ($this->droppeditems_['qty'][$x] > 1)
728                { 
729                                        // show quantity
730                    $this->killmail_ .= $this->droppeditems_['typeid'][$x].", Qty: ".$this->droppeditems_['qty'][$x];
731                } else { 
732                                        // just the one
733                    $this->killmail_ .= $this->droppeditems_['typeid'][$x];
734                }
735
736                if ($this->droppeditems_['flag'][$x] == 5) 
737                {
738                        $this->killmail_ .= " (Cargo)";
739                } elseif ($this->droppeditems_['flag'][$x] == 87) 
740                {
741                        $this->killmail_ .= " (Drone Bay)";
742                } elseif ($this->droppeditems_['flag'][$x] == -1) 
743                                {
744                                        $this->killmail_ .= " (In Container)";
745                                }
746                $this->killmail_ .= "\r\n";
747            }
748        }
749
750        // If ignoring friendly POS Structures
751        if ($this->isposkill_) {
752        // is board an alliance board?
753                if ( ALLIANCE_ID == 0)
754            { 
755                                // no it's set as a corp
756                $thiscorp = new Corporation(CORP_ID);
757                if ( $this->vcorp_ == $thiscorp->getName() )
758                        $poswasfriendly = true;
759            } else { 
760                                // yes it's an Alliance board
761                $thisalliance = new Alliance(ALLIANCE_ID);
762                if ( $this->valliance_ == $thisalliance->getName() )
763                    $poswasfriendly = true;
764            }
765        }
766
767        if ( ( $this->API_IgnoreFriendPos_ == 0 ) &&  ( $poswasfriendly ) &&  ( $this->isposkill_ ) ) 
768        {
769                if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) ) 
770                {
771                // do not write to $this->Output_
772            } else {
773                $this->Output_ .= "Killmail ID:".$this->killid_." containing friendly POS structure has been ignored.<br>";
774            }
775            $this->ignoredmails_++;
776        } elseif ( ( $this->API_IgnoreEnemyPos_ == 0 ) &&  ( !$poswasfriendly ) &&  ( $this->isposkill_ ) ) 
777        {
778                if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) ) 
779            {
780                // do not write to $this->Output_
781            } else {
782                $this->Output_ .= "Killmail ID:".$this->killid_." containing enemy POS structure been ignored.<br>";
783            }
784            $this->ignoredmails_++;
785        } elseif ( ( $this->API_IgnoreNPC_ == 0 ) && ($hasplayersonmail == false) ) 
786        {
787            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) )
788            {
789                // do not write to $this->Output_
790            } else {
791                $this->Output_ .= "Killmail ID:".$this->killid_." containing only NPCs has been ignored.<br>";
792            }
793            $this->ignoredmails_++;
794        } elseif ( ( $this->API_IgnoreCorpFF_ == 0 ) && ($this->corpFF_ == true ) ) 
795        {
796            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) ) 
797            {
798                // do not write to $this->Output_
799                } else {
800                $this->Output_ .= "Killmail ID:".$this->killid_." containing corporation friendly fire has been ignored.<br>";
801            }
802            $this->ignoredmails_++;
803        } elseif ( ( $this->API_IgnoreAllianceFF_ == 0 ) && ($this->allianceFF_ == true ) ) 
804        {
805            if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_) ) 
806            {
807                 // do not write to $this->Output_
808            } else {
809                $this->Output_ .= "Killmail ID:".$this->killid_." containing alliance friendly fire has been ignored.<br>";
810            }
811            $this->ignoredmails_++;
812        } else {
813            $this->postimportmail();
814        }       
815
816        // clear destroyed/dropped arrays
817        unset($this->destroyeditems_ );
818        unset($this->droppeditems_);
819    }
820
821    function postimportmail()
822    {
823        if ( ( isset( $this->killmail_ ) ) && ( !$this->killmailExists_ ) ) 
824        {
825            $parser = new Parser( $this->killmail_ );
826            //$killid = $parser->parse( true );
827                       
828                        if (config::get('filter_apply'))
829                {
830                $filterdate = config::get('filter_date');
831                $year = substr($this->killmail_, 0, 4);
832                $month = substr($this->killmail_, 5, 2);
833                $day = substr($this->killmail_, 8, 2);
834                        $killstamp = mktime(0, 0, 0, $month, $day, $year);
835                if ($killstamp < $filterdate)
836                {
837                        $killid = -3;
838                }
839                else
840                {
841                        $killid = $parser->parse(true);
842                }
843                } else {
844                $killid = $parser->parse(true);
845                }
846
847            if ( $killid == 0 || $killid == -1 || $killid == -2 || $killid == -3 ) 
848            {
849                if ( $killid == 0 )
850                {
851                    $this->Output_ .= "Killmail ID:".$this->killid_." is malformed.<br>";
852                                        $this->malformedmails_++;
853                                       
854                    if ($errors = $parser->getError())
855                    {
856                        foreach ($errors as $error)
857                        {
858                            $this->Output_ .= 'Error: '.$error[0];
859                            if ($error[1])
860                            {
861                                $this->Output_ .= ' The text lead to this error was: "'.$error[1].'"<br>';
862                            }
863                        }
864                                               
865                                                //if ( $this->iscronjob_ )
866                                                //{
867                                                //      $this->Output_ .= $this->killmail_; // experimental - output the killmail as the API Parser understood it
868                                                //} else {
869                                                //      $this->Output_ .= str_replace("\r\n", "<br>", $this->killmail_);
870                                                //}
871                                                $this->Output_ .= '<br/>';
872                    }
873                }
874                                if ($killid == -3)
875                {
876                        $filterdate = kbdate("j F Y", config::get("filter_date"));
877                        //$html = "Killmail older than $filterdate ignored.";
878                                        $this->Output_ .= "Killmail ID:".$this->killid_. " has been ignored as mails before $filterdate are restricted.<br>";
879                                        $this->ignoredmails_++;
880                }
881                               
882                if ( $killid == -2 )
883                                {
884                    $this->Output_ .= "Killmail ID:".$this->killid_. " is not related to ".KB_TITLE.".<br>";
885                                        $this->ignoredmails_++;
886                }
887                                // Killmail exists - as we're here and the mail was posted, it is not a verified mail, so verify it now.
888                if ( $killid == -1 )
889                {
890                    if ( ( $this->API_NoSpam_ == 0 ) && ( $this->iscronjob_ ) ) 
891                    {
892                    // do not write to $this->Output_
893                    } else {
894                        // $this->Output_ .= "Killmail already exists <a href=\"?a=kill_detail&amp;kll_id=".$parser->dupeid_."\">here</a>.<br>";
895                                                // write API KillID to kb3_kills killID column row $parser->dupeid_
896                                                $this->VerifyKill($this->killid_, $parser->dupeid_);
897                                                $this->verified_++;
898                    }
899                } 
900            } else {
901                $qry = new DBQuery();
902                $qry->execute( "insert into kb3_log     values( ".$killid.", '".KB_SITE."','API ".APIVERSION."',now() )" );
903                $this->Output_ .= "API Killmail ID:".$this->killid_. " successfully imported <a href=\"?a=kill_detail&amp;kll_id=".$killid."\">here</a> as KB ID:". $killid ."<br>";
904                       
905                                // Now place killID (API) into killboard row $killid
906                                $this->VerifyKill($this->killid_, $killid);
907                               
908                                // mail forward
909                                event::call('killmail_imported', $this);
910
911                                // For testing purposes
912                                //$this->Output_ .= str_replace("\r\n", "<br>", $this->killmail_);
913                               
914                                if ( file_exists("common/includes/class.comments.php") ) 
915                                        require_once( "common/includes/class.comments.php" );
916                if (class_exists('Comments') && config::get('API_Comment')) { // for the Eve-Dev Comment Class
917                    $comments = new Comments($killid);
918                    $comments->addComment("Captain Thunks API " . APIVERSION, config::get('API_Comment'));
919                }
920                $this->mailcount_++;
921            }
922        }
923    }
924
925    function loaddata($refid, $keystring, $typestring)
926    {
927        $url = "http://api.eve-online.com/" . $typestring . "/KillLog.xml.aspx";
928
929        if ($refid != 0)
930            $keystring .= '&beforeKillID=' . $refid;
931
932        $path = '/' . $typestring . '/Killlog.xml.aspx';
933        $fp = fsockopen("api.eve-online.com", 80);
934
935        if (!$fp)
936        {
937            $this->Output_ .= "Could not connect to API URL";
938        } else {
939            // request the xml
940            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
941            fputs ($fp, "Host: api.eve-online.com\r\n");
942            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
943            fputs ($fp, "User-Agent: PHPApi\r\n");
944            fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
945            fputs ($fp, "Connection: close\r\n\r\n");
946            fputs ($fp, $keystring."\r\n");
947
948            // retrieve contents
949            $contents = "";
950            while (!feof($fp))
951            {
952                $contents .= fgets($fp);
953            }
954
955            // close connection
956            fclose($fp);
957
958            $start = strpos($contents, "?>");
959            if ($start !== FALSE)
960            {
961                $contents = substr($contents, $start + strlen("\r\n\r\n"));
962            }
963        } 
964        return $contents;
965    }
966
967    function mystrripos($haystack, $needle, $offset=0) 
968    {
969        if($offset<0)
970        {
971            $temp_cut = strrev(  substr( $haystack, 0, abs($offset) )  );
972        } else {
973            $temp_cut = strrev(  substr( $haystack, $offset )  );
974        }
975        $pos = strlen($haystack) - (strpos($temp_cut, strrev($needle)) + $offset + strlen($needle));
976        if ($pos == strlen($haystack)) { $pos = 0; }
977
978        if(strpos($temp_cut, strrev($needle))===false)
979        {
980            return false;
981        } else return $pos;
982    }
983
984    function getlastkillid($data)
985    {
986        $mylastkillid = 0;
987        $startpoint = intval;
988        $endpoint = intval;
989
990        $startpoint = $this->mystrripos($data, 'row killID="');
991        if ( $startpoint != "0" )
992        {
993            $startpoint = $startpoint + 12;
994            $endpoint = strpos($data, '"', $startpoint);
995            $mylength = $endpoint-$startpoint;
996            $mylastkillid = substr($data, $startpoint, $mylength);
997        }
998        return $mylastkillid;
999    }
1000
1001    function getAllianceName($v)
1002    {
1003        $alliancenamereturn = "";
1004
1005        $counter = count($this->alliancearray_['Name']);
1006        for ($x = 0; $x < $counter; $x++) 
1007        {
1008            if ($this->alliancearray_['allianceID'][$x] == $v)
1009                $alliancenamereturn = $this->alliancearray_['Name'][$x];
1010        }
1011
1012        return $alliancenamereturn;
1013    }
1014       
1015        function VerifyKill($killid, $mailid)
1016        {
1017                $qry = new DBQuery();
1018        $qry->execute( "UPDATE `kb3_kills` SET `kll_external_id` = '" . $killid . "' WHERE `kb3_kills`.`kll_id` =" . $mailid . " LIMIT 1" );
1019        }
1020       
1021        function isKillIDVerified($killid)
1022        {
1023                $qry = new DBQuery();
1024        $qry->execute( "SELECT * FROM `kb3_kills` WHERE `kll_external_id` =" . $killid );
1025                $row = $qry->getRow();
1026                return $row['kll_external_id'];
1027        }
1028}
1029
1030// **********************************************************************************************************************************************
1031// ****************                                   API Char list - /account/Characters.xml.aspx                               ****************
1032// **********************************************************************************************************************************************
1033
1034class APIChar 
1035{
1036    function fetchChars($apistring) 
1037    {
1038        $data = $this->loaddata($apistring);
1039
1040        $xml_parser = xml_parser_create();
1041        xml_set_object ( $xml_parser, $this );
1042        xml_set_element_handler($xml_parser, "startElement", "endElement");
1043        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1044
1045        if (!xml_parse($xml_parser, $data, true))
1046            return "<i>Error getting XML data from api.eve-online.com/account/Characters.xml.aspx  </i><br><br>";
1047
1048        xml_parser_free($xml_parser);
1049       
1050        // add any characters not already in the kb
1051        $numchars = count($this->chars_);
1052        for ( $x = 0; $x < $numchars; $x++ )
1053        {
1054            // check if chars eveid exists in kb
1055            $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $this->chars_[$x]['Name'] . '"';
1056
1057            $qry = new DBQuery();
1058            $qry->execute($sql);
1059            if ($qry->recordCount() != 0)
1060            { 
1061                                // pilot is in kb db, check he has his char id
1062                $row = $qry->getRow();
1063
1064                $pilot_id = $row['plt_id'];
1065                $pilot_external_id = $row['plt_externalid'];
1066
1067                if ( $pilot_external_id == 0 && $pilot_id != 0 )
1068                {       
1069                                        // update DB with ID
1070                    $qry->execute("update kb3_pilots set plt_externalid = " . intval($this->chars_[$x]['charID']) . "
1071                                     where plt_id = " . $pilot_id);
1072                }
1073            } else {
1074                // pilot is not in DB
1075
1076                // Set Corp
1077                                $pilotscorp = new Corporation();
1078                                $pilotscorp->lookup($this->chars_[$x]['corpName']);
1079                // Check Corp was set, if not, add the Corp
1080                if ( !$pilotscorp->getID() )
1081                {
1082                    $ialliance = new Alliance();
1083                    $ialliance->add('NONE');
1084                    $pilotscorp->add($this->chars_[$x]['corpName'], $ialliance, gmdate("Y-m-d H:i:s"));
1085                }
1086                $ipilot = new Pilot();
1087                $ipilot->add($this->chars_[$x]['Name'], $pilotscorp, gmdate("Y-m-d H:i:s"));
1088                                $ipilot->setCharacterID(intval($this->chars_[$x]['charID']));
1089            }
1090        }
1091
1092        return $this->chars_;
1093    }
1094
1095    function startElement($parser, $name, $attribs) 
1096    {
1097                global $character;
1098               
1099        if ($name == "ROW") 
1100        { 
1101            if (count($attribs)) 
1102            {
1103                foreach ($attribs as $k => $v) 
1104                {
1105                    switch ($k) 
1106                    {
1107                        case "NAME":
1108                            $character['Name'] = $v;
1109                            break;
1110                        case "CORPORATIONNAME": 
1111                            $character['corpName'] = $v;
1112                            break;
1113                        case "CHARACTERID": 
1114                            $character['charID'] = $v;
1115                            break;
1116                        case "CORPORATIONID": 
1117                            $character['corpID'] = $v;
1118                            break;
1119                    }
1120                }
1121            }
1122        }
1123    }
1124
1125    function endElement($parser, $name) 
1126    {
1127                global $character;
1128               
1129        if ($name == "ROW")
1130                {
1131                        $this->chars_[] = $character;
1132                        $character = array();
1133                        unset($character);
1134                }
1135    }
1136
1137    function characterData($parser, $data) 
1138    {
1139        // nothing
1140    }
1141
1142    function loaddata($apistring)
1143    {
1144        $path = '/account/Characters.xml.aspx';
1145        $fp = fsockopen("api.eve-online.com", 80);
1146
1147        if (!$fp)
1148        {
1149            echo "Error", "Could not connect to API URL<br>";
1150        } else {
1151            // request the xml
1152            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
1153            fputs ($fp, "Host: api.eve-online.com\r\n");
1154            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
1155            fputs ($fp, "User-Agent: PHPApi\r\n");
1156            fputs ($fp, "Content-Length: " . strlen($apistring) . "\r\n");
1157            fputs ($fp, "Connection: close\r\n\r\n");
1158            fputs ($fp, $apistring."\r\n");
1159
1160            // retrieve contents
1161            $contents = "";
1162            while (!feof($fp))
1163            {
1164                $contents .= fgets($fp);
1165            }
1166
1167            // close connection
1168            fclose($fp);
1169
1170            $start = strpos($contents, "?>");
1171            if ($start != false)
1172            {
1173                $contents = substr($contents, $start + strlen("\r\n\r\n"));
1174            }
1175        } 
1176        return $contents;
1177    }
1178}
1179
1180// **********************************************************************************************************************************************
1181// ****************                                 API Alliance list - /eve/AllianceList.xml.aspx                               ****************
1182// **********************************************************************************************************************************************
1183
1184class AllianceAPI 
1185{
1186        function getCachedUntil()
1187        {
1188                return $this->CachedUntil_;
1189        }
1190       
1191        function getCurrentTime()
1192        {
1193                return $this->CurrentTime_;
1194        }
1195       
1196       
1197        function initXML()
1198        {
1199                global $myalliancelist;
1200               
1201                $data = LoadGlobalData('/eve/AllianceList.xml.aspx');
1202
1203        $xml_parser = xml_parser_create();
1204        xml_set_object ( $xml_parser, $this );
1205        xml_set_element_handler($xml_parser, "startElement", "endElement");
1206        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1207
1208        if (!xml_parse($xml_parser, $data, true))
1209                return false;
1210       
1211                xml_parser_free($xml_parser);
1212                return true;
1213        }
1214       
1215    function fetchalliances($overide=false) 
1216    {
1217        global $myalliancelist;
1218               
1219                if (!isset($this->alliances_))
1220                        $this->initXML($overide);
1221                       
1222        return $myalliancelist;
1223    }
1224
1225    function startElement($parser, $name, $attribs) 
1226    {
1227        global $myalliancelist, $alliancedetail, $membercorps, $membercorp, $iscorpsection;
1228
1229        if ($name == "ROW") 
1230        {
1231            if (count($attribs)) 
1232            {
1233                foreach ($attribs as $k => $v) 
1234                {
1235                    switch ($k) 
1236                    {
1237                        case "NAME":
1238                            $alliancedetail['allianceName'] = $v;
1239                            break;
1240                                                case "SHORTNAME":
1241                            $alliancedetail['shortName'] = $v;
1242                            break;
1243                        case "ALLIANCEID": 
1244                            $alliancedetail['allianceID'] = $v;
1245                            break;
1246                                                case "EXECUTORCORPID": 
1247                            $alliancedetail['executorCorpID'] = $v;
1248                            break;
1249                                                case "MEMBERCOUNT": 
1250                            $alliancedetail['memberCount'] = $v;
1251                            break;
1252                                                case "STARTDATE": 
1253                                                        if (!$iscorpsection) 
1254                                                        {
1255                                $alliancedetail['startDate'] = $v;
1256                                                        } else {
1257                                                                $membercorp['startDate'] = $v;
1258                                                                $membercorps[] = $membercorp;
1259                                                        }
1260                            break;
1261                                                case "CORPORATIONID": 
1262                            $membercorp['corporationID'] = $v;
1263                                                        $iscorpsection = true;
1264                            break;
1265                    }
1266                }
1267            }
1268        }
1269    }
1270
1271    function endElement($parser, $name) 
1272    {
1273        global $myalliancelist, $alliancedetail, $membercorps, $membercorp, $iscorpsection;
1274                global $tempvalue;
1275               
1276                if ($name == "CURRENTTIME")
1277                        $this->CurrentTime_ = $tempvalue;
1278                if ($name == "CACHEDUNTIL")
1279                {
1280                        if  (config::get('API_extendedtimer_alliancelist') == 0)
1281                        {
1282                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1283                        } else {
1284                                $this->CachedUntil_ = $tempvalue;
1285                        }
1286                        ApiCache::set('API_eve_AllianceList' , $this->CachedUntil_);
1287                }
1288               
1289        switch ($name) 
1290        {
1291            case "ROWSET":
1292                if ($alliancedetail['allianceName'] != "" && $alliancedetail['allianceID'] != "0") 
1293                {
1294                    $myalliancelist['Name'][] = $alliancedetail['allianceName'];
1295                    $myalliancelist['allianceID'][] = $alliancedetail['allianceID'];
1296                }
1297                                $alliancedetail['memberCorps'] = $membercorps;
1298                                $this->alliances_[] = $alliancedetail;
1299                               
1300                                $alliancedetail['allianceName'] = "";
1301                                $alliancedetail['shortName'] = "";
1302                                $alliancedetail['allianceID'] = "";
1303                                $alliancedetail['executorCorpID'] = "";
1304                                $alliancedetail['memberCount'] = "";
1305                                $alliancedetail['startDate'] = "";
1306                                $alliancedetail['memberCorps'] = array();
1307                                $membercorps = array();
1308                                $membercorp = array();
1309                                unset($alliancedetail['memberCorps']);
1310                                unset($membercorps);
1311                                unset($membercorp);
1312                                $iscorpsection = false;
1313                break;
1314        }
1315    }
1316
1317    function characterData($parser, $data) 
1318    {
1319                global $tempvalue;
1320       
1321                $tempvalue = $data;
1322    }
1323       
1324        function updatealliancetable()
1325    {
1326        if (!isset($this->alliances_))
1327            $this->initXML();
1328       
1329        if (!isset($this->alliances_))
1330            return false;
1331           
1332        $qry = new DBQuery();
1333        $qry->execute("DROP TABLE IF EXISTS `kb3_all_corp`;");
1334        $qry->execute("CREATE TABLE kb3_all_corp (
1335              all_id bigint(3) unsigned default '0',
1336              corp_id bigint(3) unsigned default '0',
1337              all_name varchar(200) default NULL
1338            ) ");
1339
1340        $alliances = $this->alliances_;
1341       
1342        foreach ($alliances as $arraykey => $arrayvalue)
1343        {
1344            $tempally = $arrayvalue;
1345
1346            foreach ($tempally as $key => $value)
1347            {
1348                switch ($key)
1349                {
1350                    case "allianceName":
1351                        $allyname = $value;
1352                        break;
1353                    case "allianceID":
1354                        $allyid = $value;
1355                        break;
1356                    case "memberCorps":
1357                        $allycorps = $value;
1358                        $q='';
1359                        foreach ($allycorps as $corpkey => $corpvalue)
1360                        {
1361                            $tempcorp = $corpvalue;
1362                            foreach ($tempcorp as $tempkey => $tempvalue)
1363                            {
1364                                switch ($tempkey)
1365                                {
1366                                    case "corporationID":
1367                                        $q.="(".$allyid.",".$tempvalue.",'".slashfix($allyname)."'),";
1368                                        break;
1369                                }
1370                            }
1371                        }
1372                        if (strlen($q)>0)
1373                                $qry->execute("INSERT INTO kb3_all_corp values ".substr($q,0,strlen($q)-1));
1374                        break;
1375                }
1376            }                 
1377        }
1378        return true;
1379    }
1380       
1381        function LocateAlliance($name)
1382        {
1383                if (!isset($this->alliances_))
1384            $this->initXML();
1385       
1386        if (!isset($this->alliances_))
1387            return false;
1388                       
1389                $alliances = $this->alliances_;
1390       
1391        foreach ($alliances as $arraykey => $arrayvalue)
1392        {
1393            $tempally = $arrayvalue;
1394
1395            foreach ($tempally as $key => $value)
1396            {
1397                switch ($key)
1398                {
1399                    case "allianceName":
1400                        //return $tempally;
1401                                                if ( $value == $name )
1402                                                {
1403                                                        return $tempally;
1404                                                }
1405                        break;
1406                }
1407            }                 
1408        }
1409                return false;
1410        }
1411       
1412        function LocateAllianceID($id)
1413        {
1414                if (!isset($this->alliances_))
1415            $this->initXML();
1416       
1417        if (!isset($this->alliances_))
1418            return false;
1419                       
1420                $alliances = $this->alliances_;
1421       
1422        foreach ($alliances as $arraykey => $arrayvalue)
1423        {
1424            $tempally = $arrayvalue;
1425
1426            foreach ($tempally as $key => $value)
1427            {
1428                switch ($key)
1429                {
1430                    case "allianceID":
1431                        //return $tempally;
1432                                                if ( $value == $id )
1433                                                {
1434                                                        return $tempally;
1435                                                }
1436                        break;
1437                }
1438            }                 
1439        }
1440                return false;
1441        }
1442       
1443        function UpdateAlliances($andCorps = false)
1444        {
1445                if (!isset($this->alliances_))
1446            $this->initXML();
1447       
1448        if (!isset($this->alliances_))
1449            return false;
1450               
1451                if ($andCorps)
1452                {
1453                        // Remove every single corp in the Killboard DB from their current Alliance
1454                        $db = new DBQuery(true);
1455                        $db->execute("UPDATE kb3_corps
1456                                                        SET crp_all_id = 14");
1457                }
1458               
1459                $alliances = $this->alliances_;
1460                $alliance = new Alliance();
1461                $tempMyCorp = new Corporation();                               
1462                $myCorpAPI = new API_CorporationSheet();
1463               
1464                $NumberOfAlliances = 0;
1465                $NumberOfCorps = 0;
1466                $NumberOfAlliancesAdded = 0; // we won't know this
1467                $NumberOfCorpsAdded = 0;
1468               
1469                foreach ($alliances as $arraykey => $arrayvalue)
1470        {
1471            $tempally = $arrayvalue;
1472                        $NumberOfAlliances++;
1473                       
1474            foreach ($tempally as $key => $value)
1475            {
1476                switch ($key)
1477                {
1478                    case "allianceName":
1479                        $alliance->add($value);
1480                        break;
1481                                        case "memberCorps":
1482                                                // if $andCorps = true then add each and every single corp to the evekb db - resolving each name (expect this to be slow)
1483                                                // WARNING: Processing 5000+ corps this way is extremely slow and is almost guaranteed not to complete
1484                                                if ($andCorps)
1485                                                {
1486                                                        foreach ($value as $tempcorp)
1487                                                        {
1488                                                                $NumberOfCorps++;
1489                                                               
1490                                                                $myCorpAPI->setCorpID($tempcorp["corporationID"]);
1491                                                                $result .= $myCorpAPI->fetchXML();
1492       
1493                                                                //$NumberOfCorpsAdded++;
1494                                                                $tempMyCorp->add($myCorpAPI->getCorporationName(), $alliance , gmdate("Y-m-d H:i:s"));
1495                                                               
1496                                                        }
1497                                               
1498                                                }
1499                                                break;
1500                }
1501            }                 
1502        }
1503                $returnarray["NumAlliances"] = $NumberOfAlliances;
1504                $returnarray["NumCorps"] = $NumberOfCorps;
1505                $returnarray["NumAlliancesAdded"] = $NumberOfAlliancesAdded;
1506                $returnarray["NumCorpsAdded"] = $NumberOfCorpsAdded;
1507                return $returnarray;
1508               
1509        }
1510}
1511
1512// **********************************************************************************************************************************************
1513// ****************                 API Conquerable Station/Outpost list - /eve/ConquerableStationList.xml.aspx                  ****************
1514// **********************************************************************************************************************************************
1515
1516class API_ConquerableStationList 
1517{
1518        function getCachedUntil()
1519        {
1520                return $this->CachedUntil_;
1521        }
1522       
1523        function getCurrentTime()
1524        {
1525                return $this->CurrentTime_;
1526        }
1527       
1528        function getStations()
1529        {
1530                return $this->Stations_;
1531        }
1532       
1533    function fetchXML() 
1534    {
1535        $data = LoadGlobalData('/eve/ConquerableStationList.xml.aspx');
1536
1537        $xml_parser = xml_parser_create();
1538        xml_set_object ( $xml_parser, $this );
1539        xml_set_element_handler($xml_parser, "startElement", "endElement");
1540        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1541
1542        if (!xml_parse($xml_parser, $data, true))
1543            return "<i>Error getting XML data from api.eve-online.com/eve/ConquerableStationList.xml.aspx </i><br><br>";
1544
1545        xml_parser_free($xml_parser);
1546     
1547        return $this->html;
1548    }
1549
1550    function startElement($parser, $name, $attribs) 
1551    {
1552                global $Station;
1553               
1554        if ($name == "ROW") 
1555        { 
1556            if (count($attribs)) 
1557            {
1558                foreach ($attribs as $k => $v) 
1559                {
1560                    switch ($k) 
1561                    {
1562                        case "STATIONID":
1563                            $Station['stationID'] = $v;
1564                            break;
1565                        case "STATIONNAME": 
1566                            $Station['stationName'] = $v;
1567                            break;
1568                        case "STATIONTYPEID": 
1569                            $Station['stationTypeID'] = $v;
1570                            break;
1571                        case "SOLARSYSTEMID": 
1572                            $Station['solarSystemID'] = $v;
1573                            break;
1574                                                case "CORPORATIONID": 
1575                            $Station['corporationID'] = $v;
1576                            break;
1577                                                case "CORPORATIONNAME": 
1578                            $Station['corporationName'] = $v;
1579                            break;
1580                    }
1581                }
1582            }
1583        }
1584    }
1585
1586    function endElement($parser, $name) 
1587    {
1588                global $Station;
1589                global $tempvalue;
1590               
1591                if ($name == "CURRENTTIME")
1592                        $this->CurrentTime_ = $tempvalue;
1593                if ($name == "CACHEDUNTIL")
1594                {
1595                        if  (config::get('API_extendedtimer_conq') == 0)
1596                        {
1597                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
1598                        } else {
1599                                $this->CachedUntil_ = $tempvalue;
1600                        }
1601                        ApiCache::set('API_eve_ConquerableStationList' , $this->CachedUntil_);
1602                }
1603               
1604        if ($name == "ROW")
1605                {
1606                        $this->Stations_[] = $Station;
1607                        $Station = array();
1608                        unset($Station);
1609                }
1610    }
1611
1612    function characterData($parser, $data) 
1613    {
1614        global $tempvalue;
1615       
1616                $tempvalue = $data;
1617    }
1618}
1619
1620// **********************************************************************************************************************************************
1621// ****************                                   API Error list - /eve/ErrorList.xml.aspx                                   ****************
1622// **********************************************************************************************************************************************
1623
1624class API_ErrorList 
1625{
1626        function getCachedUntil()
1627        {
1628                return $this->CachedUntil_;
1629        }
1630       
1631        function getCurrentTime()
1632        {
1633                return $this->CurrentTime_;
1634        }
1635       
1636        function getErrorList()
1637        {
1638                return $this->Error_;
1639        }
1640       
1641    function fetchXML() 
1642    {
1643        $data = LoadGlobalData('/eve/ErrorList.xml.aspx');
1644
1645        $xml_parser = xml_parser_create();
1646        xml_set_object ( $xml_parser, $this );
1647        xml_set_element_handler($xml_parser, "startElement", "endElement");
1648        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1649
1650        if (!xml_parse($xml_parser, $data, true))
1651            return "<i>Error getting XML data from api.eve-online.com/eve/ErrorList.xml.aspx </i><br><br>";
1652
1653        xml_parser_free($xml_parser);
1654     
1655        return $this->html;
1656    }
1657
1658    function startElement($parser, $name, $attribs) 
1659    {
1660                global $ErrorData;
1661               
1662        if ($name == "ROW") 
1663        { 
1664            if (count($attribs)) 
1665            {
1666                foreach ($attribs as $k => $v) 
1667                {
1668                    switch ($k) 
1669                    {
1670                        case "ERRORCODE":
1671                            $ErrorData['errorCode'] = $v;
1672                            break;
1673                        case "ERRORTEXT": 
1674                            $ErrorData['errorText'] = $v;
1675                            break;
1676                    }
1677                }
1678            }
1679        }
1680    }
1681
1682    function endElement($parser, $name) 
1683    {
1684                global $ErrorData;
1685                global $tempvalue;
1686               
1687                if ($name == "CURRENTTIME")
1688                        $this->CurrentTime_ = $tempvalue;
1689                if ($name == "CACHEDUNTIL")
1690                {
1691                        $this->CachedUntil_ = $tempvalue;
1692                        ApiCache::set('API_eve_ErrorList' , $tempvalue);
1693                }
1694               
1695        if ($name == "ROW")
1696                {
1697                        $this->Error_[] = $ErrorData;
1698                        $ErrorData = array();
1699                        unset($ErrorData);
1700                }
1701    }
1702
1703    function characterData($parser, $data) 
1704    {
1705        global $tempvalue;
1706       
1707                $tempvalue = $data;
1708    }
1709}
1710
1711// **********************************************************************************************************************************************
1712// ****************                                   API Jumps list - /map/Jumps.xml.aspx                                   ****************
1713// **********************************************************************************************************************************************
1714
1715class API_Jumps 
1716{
1717        function getCachedUntil()
1718        {
1719                return $this->CachedUntil_;
1720        }
1721       
1722        function getCurrentTime()
1723        {
1724                return $this->CurrentTime_;
1725        }
1726       
1727        function getDataTime()
1728        {
1729                return $this->DataTime_;
1730        }
1731       
1732        function getJumps()
1733        {
1734                return $this->Jumps_;
1735        }
1736       
1737    function fetchXML() 
1738    {
1739        $data = LoadGlobalData('/map/Jumps.xml.aspx');
1740
1741        $xml_parser = xml_parser_create();
1742        xml_set_object ( $xml_parser, $this );
1743        xml_set_element_handler($xml_parser, "startElement", "endElement");
1744        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1745
1746        if (!xml_parse($xml_parser, $data, true))
1747            return "<i>Error getting XML data from api.eve-online.com/map/Jumps.xml.aspx </i><br><br>";
1748
1749        xml_parser_free($xml_parser);
1750     
1751        return $this->html;
1752    }
1753
1754    function startElement($parser, $name, $attribs) 
1755    {
1756                global $JumpData;
1757               
1758        if ($name == "ROW") 
1759        { 
1760            if (count($attribs)) 
1761            {
1762                foreach ($attribs as $k => $v) 
1763                {
1764                    switch ($k) 
1765                    {
1766                        case "SOLARSYSTEMID":
1767                            $JumpData['solarSystemID'] = $v;
1768                            break;
1769                        case "SHIPJUMPS": 
1770                            $JumpData['shipJumps'] = $v;
1771                            break;
1772                    }
1773                }
1774            }
1775        }
1776    }
1777
1778    function endElement($parser, $name) 
1779    {
1780                global $JumpData;
1781                global $tempvalue;
1782               
1783                if ($name == "CURRENTTIME")
1784                        $this->CurrentTime_ = $tempvalue;
1785                if ($name == "DATATIME")
1786                        $this->DataTime_ = $tempvalue;
1787                if ($name == "CACHEDUNTIL")
1788                {
1789                        $this->CachedUntil_ = $tempvalue;
1790                        ApiCache::set('API_map_Jumps' , $tempvalue);
1791                }
1792               
1793        if ($name == "ROW")
1794                {
1795                        $this->Jumps_[] = $JumpData;
1796                        $JumpData = array();
1797                        unset($JumpData);
1798                }
1799    }
1800
1801    function characterData($parser, $data) 
1802    {
1803        global $tempvalue;
1804       
1805                $tempvalue = $data;
1806    }
1807}
1808
1809// **********************************************************************************************************************************************
1810// ****************                                   API Kills list - /map/Kills.xml.aspx                                   ****************
1811// **********************************************************************************************************************************************
1812
1813class API_Kills 
1814{
1815        function getCachedUntil()
1816        {
1817                return $this->CachedUntil_;
1818        }
1819       
1820        function getCurrentTime()
1821        {
1822                return $this->CurrentTime_;
1823        }
1824       
1825        function getDataTime()
1826        {
1827                return $this->DataTime_;
1828        }
1829       
1830        function getkills()
1831        {
1832                return $this->kills_;
1833        }
1834       
1835    function fetchXML() 
1836    {
1837        $data = LoadGlobalData('/map/Kills.xml.aspx');
1838
1839        $xml_parser = xml_parser_create();
1840        xml_set_object ( $xml_parser, $this );
1841        xml_set_element_handler($xml_parser, "startElement", "endElement");
1842        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1843
1844        if (!xml_parse($xml_parser, $data, true))
1845            return "<i>Error getting XML data from api.eve-online.com/map/Kills.xml.aspx </i><br><br>";
1846
1847        xml_parser_free($xml_parser);
1848     
1849        return $this->html;
1850    }
1851
1852    function startElement($parser, $name, $attribs) 
1853    {
1854                global $KillsData;
1855               
1856        if ($name == "ROW") 
1857        { 
1858            if (count($attribs)) 
1859            {
1860                foreach ($attribs as $k => $v) 
1861                {
1862                    switch ($k) 
1863                    {
1864                        case "SOLARSYSTEMID":
1865                            $KillsData['solarSystemID'] = $v;
1866                            break;
1867                        case "SHIPKILLS": 
1868                            $KillsData['shipKills'] = $v;
1869                            break;
1870                                                case "FACTIONKILLS": 
1871                            $KillsData['factionKills'] = $v;
1872                            break;
1873                                                case "PODKILLS": 
1874                            $KillsData['podKills'] = $v;
1875                            break;
1876                    }
1877                }
1878            }
1879        }
1880    }
1881
1882    function endElement($parser, $name) 
1883    {
1884                global $KillsData;
1885                global $tempvalue;
1886               
1887                if ($name == "CURRENTTIME")
1888                        $this->CurrentTime_ = $tempvalue;
1889                if ($name == "DATATIME")
1890                        $this->DataTime_ = $tempvalue;
1891                if ($name == "CACHEDUNTIL")
1892                {
1893                        $this->CachedUntil_ = $tempvalue;
1894                        ApiCache::set('API_map_Kills' , $tempvalue);
1895                }
1896               
1897        if ($name == "ROW")
1898                {
1899                        $this->kills_[] = $KillsData;
1900                        $KillsData = array();
1901                        unset($KillsData);
1902                }
1903    }
1904
1905    function characterData($parser, $data) 
1906    {
1907        global $tempvalue;
1908       
1909                $tempvalue = $data;
1910    }
1911}
1912
1913// **********************************************************************************************************************************************
1914// ****************                            API Alliance Sovereignty - /map/Sovereignty.xml.aspx                              ****************
1915// **********************************************************************************************************************************************
1916
1917class API_Sovereignty
1918{
1919        function getCachedUntil()
1920        {
1921                return $this->CachedUntil_;
1922        }
1923       
1924        function getCurrentTime()
1925        {
1926                return $this->CurrentTime_;
1927        }
1928       
1929        function getDataTime()
1930        {
1931                return $this->DataTime_;
1932        }
1933       
1934        function getSovereignty()
1935        {
1936                return $this->Sovereignty_;
1937        }
1938
1939    function fetchXML() 
1940    {
1941        $data = LoadGlobalData('/map/Sovereignty.xml.aspx');
1942
1943        $xml_parser = xml_parser_create();
1944        xml_set_object ( $xml_parser, $this );
1945        xml_set_element_handler($xml_parser, "startElement", "endElement");
1946        xml_set_character_data_handler ( $xml_parser, 'characterData' );
1947
1948        if (!xml_parse($xml_parser, $data, true))
1949            return "<i>Error getting XML data from api.eve-online.com/map/Sovereignty.xml.aspx  </i><br><br>";
1950
1951        xml_parser_free($xml_parser);
1952     
1953        return $this->html;
1954    }
1955
1956    function startElement($parser, $name, $attribs) 
1957    {
1958                global $SovereigntyData;
1959               
1960        if ($name == "ROW") 
1961        { 
1962            if (count($attribs)) 
1963            {
1964                foreach ($attribs as $k => $v) 
1965                {
1966                    switch ($k) 
1967                    {
1968                        case "SOLARSYSTEMID":
1969                            $SovereigntyData['solarSystemID'] = $v;
1970                            break;
1971                        case "ALLIANCEID": 
1972                            $SovereigntyData['allianceID'] = $v;
1973                            break;
1974                                                case "CONSTELLATIONSOVEREIGNTY": 
1975                            $SovereigntyData['constellationSovereignty'] = $v;
1976                            break;
1977                                                case "SOVEREIGNTYLEVEL": 
1978                            $SovereigntyData['sovereigntyLevel'] = $v;
1979                            break;
1980                                                case "FACTIONID": 
1981                            $SovereigntyData['factionID'] = $v;
1982                            break;
1983                                                case "SOLARSYSTEMNAME": 
1984                            $SovereigntyData['solarSystemName'] = $v;
1985                            break;
1986                    }
1987                }
1988            }
1989        }
1990    }
1991
1992    function endElement($parser, $name) 
1993    {
1994                global $SovereigntyData;
1995                global $tempvalue;
1996               
1997                if ($name == "CURRENTTIME")
1998                        $this->CurrentTime_ = $tempvalue;
1999                if ($name == "DATATIME")
2000                        $this->DataTime_ = $tempvalue;
2001                if ($name == "CACHEDUNTIL")
2002                {
2003                        if  (config::get('API_extendedtimer_sovereignty') == 0)
2004                        {
2005                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
2006                        } else {
2007                                $this->CachedUntil_ = $tempvalue;
2008                        }
2009                        ApiCache::set('API_map_Sovereignty' , $this->CachedUntil_);
2010                }
2011                       
2012        if ($name == "ROW")
2013                {
2014                        $this->Sovereignty_[] = $SovereigntyData;
2015                        $SovereigntyData = array();
2016                        unset($SovereigntyData);
2017                }
2018    }
2019
2020    function characterData($parser, $data) 
2021    {
2022                global $tempvalue;
2023       
2024                $tempvalue = $data;
2025    }
2026       
2027        function getSystemDetails($sysname)
2028        {
2029                if (!isset($this->Sovereignty_))
2030            $this->fetchXML();
2031       
2032        if (!isset($this->Sovereignty_))
2033            return false;
2034               
2035                $Sov = $this->Sovereignty_;
2036               
2037                foreach ($Sov as $myTempData)
2038                {
2039                        if ($myTempData['solarSystemName'] == $sysname)
2040                                return $myTempData;
2041                }
2042               
2043                return;
2044        }
2045       
2046        function getSystemIDDetails($sysID)
2047        {
2048                if (!isset($this->Sovereignty_))
2049            $this->fetchXML();
2050       
2051        if (!isset($this->Sovereignty_))
2052            return false;
2053                       
2054                //echo var_dump($this->Sovereignty_);
2055               
2056                $Sov = $this->Sovereignty_;
2057               
2058                foreach ($Sov as $myTempData)
2059                {
2060                        if ($myTempData['solarSystemID'] == $sysID)
2061                                return $myTempData;
2062                }
2063               
2064                return false;
2065        }
2066}
2067
2068// **********************************************************************************************************************************************
2069// ****************                               API Reference Types - /eve/RefTypes.xml.aspx                                   ****************
2070// **********************************************************************************************************************************************
2071
2072class API_RefTypes
2073{
2074        function getCachedUntil()
2075        {
2076                return $this->CachedUntil_;
2077        }
2078       
2079        function getCurrentTime()
2080        {
2081                return $this->CurrentTime_;
2082        }
2083       
2084        function getRefTypes()
2085        {
2086                return $this->RefTypes_;
2087        }
2088       
2089    function fetchXML() 
2090    {
2091        $data = LoadGlobalData('/eve/RefTypes.xml.aspx');
2092
2093        $xml_parser = xml_parser_create();
2094        xml_set_object ( $xml_parser, $this );
2095        xml_set_element_handler($xml_parser, "startElement", "endElement");
2096        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2097
2098        if (!xml_parse($xml_parser, $data, true))
2099            return "<i>Error getting XML data from api.eve-online.com/eve/RefTypes.xml.aspx  </i><br><br>";
2100
2101        xml_parser_free($xml_parser);
2102     
2103        return $this->html;
2104    }
2105
2106    function startElement($parser, $name, $attribs) 
2107    {
2108                global $RefTypeData;
2109               
2110        if ($name == "ROW") 
2111        { 
2112            if (count($attribs)) 
2113            {
2114                foreach ($attribs as $k => $v) 
2115                {
2116                    switch ($k) 
2117                    {
2118                        case "REFTYPEID":
2119                            $RefTypeData['refTypeID'] = $v;
2120                            break;
2121                        case "REFTYPENAME": 
2122                            $RefTypeData['refTypeName'] = $v;
2123                            break;
2124                    }
2125                }
2126            }
2127        }
2128    }
2129
2130    function endElement($parser, $name) 
2131    {
2132                global $RefTypeData;
2133                global $tempvalue;
2134               
2135                if ($name == "CURRENTTIME")
2136                        $this->CurrentTime_ = $tempvalue;
2137                if ($name == "CACHEDUNTIL")
2138                {
2139                        $this->CachedUntil_ = $tempvalue;
2140                        ApiCache::set('API_eve_RefTypes' , $tempvalue);
2141                }
2142                       
2143        if ($name == "ROW")
2144                {
2145                        $this->RefTypes_[] = $RefTypeData;
2146                        $RefTypeData = array();
2147                        unset($RefTypeData);
2148                }
2149    }
2150
2151    function characterData($parser, $data) 
2152    {
2153        global $tempvalue;
2154       
2155                $tempvalue = $data;
2156    }
2157}
2158
2159// **********************************************************************************************************************************************
2160// ****************                           API Faction War Systems - /map/FacWarSystems.xml.aspx                              ****************
2161// **********************************************************************************************************************************************
2162
2163class API_FacWarSystems
2164{
2165        function getCachedUntil()
2166        {
2167                return $this->CachedUntil_;
2168        }
2169       
2170        function getCurrentTime()
2171        {
2172                return $this->CurrentTime_;
2173        }
2174       
2175        function getFacWarSystems()
2176        {
2177                return $this->FacWarSystems_;
2178        }
2179       
2180    function fetchXML() 
2181    {
2182        $data = LoadGlobalData('/map/FacWarSystems.xml.aspx');
2183
2184        $xml_parser = xml_parser_create();
2185        xml_set_object ( $xml_parser, $this );
2186        xml_set_element_handler($xml_parser, "startElement", "endElement");
2187        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2188
2189        if (!xml_parse($xml_parser, $data, true))
2190            return "<i>Error getting XML data from api.eve-online.com/map/FacWarSystems.xml.aspx  </i><br><br>";
2191
2192        xml_parser_free($xml_parser);
2193     
2194        return $this->FacWarSystems_;
2195    }
2196
2197    function startElement($parser, $name, $attribs) 
2198    {
2199                global $FacWarSystem;
2200               
2201        if ($name == "ROW") 
2202        { 
2203            if (count($attribs)) 
2204            {
2205                foreach ($attribs as $k => $v) 
2206                {
2207                    switch ($k) 
2208                    {
2209                        case "SOLARSYSTEMID":
2210                            $FacWarSystem['solarSystemID'] = $v;
2211                            break;
2212                        case "SOLARSYSTEMNAME": 
2213                            $FacWarSystem['solarSystemName'] = $v;
2214                            break;
2215                                                case "OCCUPYINGFACTIONID":
2216                            $FacWarSystem['occupyingFactionID'] = $v;
2217                            break;
2218                                                case "OCCUPYINGFACTIONNAME":
2219                            $FacWarSystem['occupyingFactionName'] = $v;
2220                            break;
2221                                                case "CONTESTED":
2222                            $FacWarSystem['contested'] = $v;
2223                            break;
2224                    }
2225                }
2226            }
2227        }
2228    }
2229
2230    function endElement($parser, $name) 
2231    {
2232                global $FacWarSystem;
2233                global $tempvalue;
2234               
2235                if ($name == "CURRENTTIME")
2236                        $this->CurrentTime_ = $tempvalue;
2237                if ($name == "CACHEDUNTIL")
2238                {
2239                        if  (config::get('API_extendedtimer_facwarsystems') == 0)
2240                        {
2241                                $this->CachedUntil_ = date("Y-m-d H:i:s", (strtotime($this->CurrentTime_)) + 85500);
2242                        } else {
2243                                $this->CachedUntil_ = $tempvalue;
2244                        }
2245                        ApiCache::set('API_map_FacWarSystems' , $this->CachedUntil_);
2246                }
2247               
2248        if ($name == "ROW")
2249                {
2250                        $this->FacWarSystems_[] = $FacWarSystem;
2251                        $FacWarSystem = array();
2252                        unset($FacWarSystem);
2253                }
2254    }
2255
2256    function characterData($parser, $data) 
2257    {
2258        global $tempvalue;
2259       
2260                $tempvalue = $data;
2261    }
2262}
2263
2264// **********************************************************************************************************************************************
2265// ****************                                  API Standings - /corp & char/Standings.xml.aspx                             ****************
2266// **********************************************************************************************************************************************
2267class API_Standings
2268{               
2269        function getCachedUntil()
2270        {
2271                return $this->CachedUntil_;
2272        }
2273       
2274        function getCurrentTime()
2275        {
2276                return $this->CurrentTime_;
2277        }
2278       
2279        // boolean value - sets between char/corp
2280        function isUser($value) 
2281        {
2282                $this->isUser_ = $value;
2283        }
2284       
2285        function setAPIKey($key)
2286        {
2287                $this->API_apiKey_ = $key;
2288        }
2289       
2290        function setUserID($uid)
2291        {
2292                $this->API_userID_ = $uid;
2293        }
2294       
2295        function setCharacterID($cid)
2296        {
2297                $this->API_characterID_ = $cid;
2298        }
2299       
2300        function getCharacters()
2301        {
2302                return $this->Characters_;
2303        }
2304        function getCorporations()
2305        {
2306                return $this->Corporations_;
2307        }
2308        function getAlliances()
2309        {
2310                return $this->Alliances_;
2311        }
2312        function getAgents()
2313        {
2314                return $this->Agents_;
2315        }
2316        function getNPCCorporations()
2317        {
2318                return $this->NPCCorporations_;
2319        }
2320        function getFactions()
2321        {
2322                return $this->Factions_;
2323        }
2324        function getAllianceCorporations()
2325        {
2326                return $this->AllianceCorporations_;
2327        }
2328        function getAliianceAlliances()
2329        {
2330                return $this->AliianceAlliances_;
2331        }
2332       
2333        function fetchXML()
2334        {
2335                $this->isAllianceStandings_ = false;
2336                $this->isCorporationStandings_ = false;
2337               
2338                if ($this->isUser_)
2339                { 
2340                        // is a player feed - take details from logged in user
2341                        if (user::get('usr_pilot_id'))
2342                {
2343                                $myEveCharAPI = new API_CharacterSheet();
2344                                $this->html .= $myEveCharAPI->fetchXML();
2345       
2346                                $skills = $myEveCharAPI->getSkills();
2347       
2348                                $this->connections_ = 0;
2349                                $this->diplomacy_ = 0;
2350       
2351                                foreach ((array)$skills as $myTempData)
2352                                {
2353                                        if ($myTempData['typeID'] == "3359")
2354                                                $this->connections_ = $myTempData['Level'];
2355                                        if ($myTempData['typeID'] == "3357")
2356                                                $this->diplomacy_ = $myTempData['Level'];
2357                                }
2358
2359                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_characterID_;
2360                               
2361                                $data = $this->loaddata($myKeyString, "char");
2362                        } else {
2363                                return "You are not logged in.";
2364                        }
2365               
2366                } else { 
2367                        // is a corp feed
2368                        $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_characterID_;
2369                        $data = $this->loaddata($myKeyString, "corp");
2370                }
2371
2372        $xml_parser = xml_parser_create();
2373        xml_set_object ( $xml_parser, $this );
2374        xml_set_element_handler($xml_parser, "startElement", "endElement");
2375        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2376
2377        if (!xml_parse($xml_parser, $data, true))
2378            return "<i>Error getting XML data from api.eve-online.com/Standings.xml.aspx  </i><br><br>";
2379
2380        xml_parser_free($xml_parser);
2381               
2382                // sort the arrays (in descending order of standing)
2383                $this->Factions_ = $this->mysortarray($this->Factions_);
2384                $this->Characters_ = $this->mysortarray($this->Characters_);
2385                $this->Corporations_ = $this->mysortarray($this->Corporations_);
2386                $this->Alliances_ = $this->mysortarray($this->Alliances_);
2387                $this->Agents_ = $this->mysortarray($this->Agents_);
2388                $this->NPCCorporations_ = $this->mysortarray($this->NPCCorporations_);
2389                $this->AllianceCorporations_ = $this->mysortarray($this->AllianceCorporations_);
2390                $this->AllianceAlliances_ = $this->mysortarray($this->AliianceAlliances_);
2391               
2392                return $this->html;
2393        }
2394       
2395        function mysortarray($arraydata)
2396        {
2397                if (count($arraydata) != 0 ) 
2398                { 
2399                        foreach ((array)$arraydata as $key => $row) {
2400                        $standing[$key]  = $row['Standing'];
2401                        $name[$key] = $row['Name'];
2402                                $id[$key] = $row['ID'];
2403                        }
2404                       
2405                        array_multisort($standing, SORT_DESC, $name, SORT_ASC, $id, SORT_ASC, $arraydata);
2406                               
2407                        $standing = array();
2408                        unset($standing);
2409                        $name = array();
2410                        unset($name);
2411                        $id = array();
2412                        unset($id);
2413                       
2414                        return $arraydata;
2415                }
2416        }
2417       
2418        function startElement($parser, $name, $attribs) 
2419    {
2420               
2421                if ($name == "CORPORATIONSTANDINGS")
2422                {
2423                        $this->isAllianceStandings_ = false;
2424                        $this->isCorporationStandings_ = true;
2425                }
2426                if ($name == "STANDINGSTO")
2427                {
2428                        $this->StandingsTo_ = true; // used to determine if/when to apply diplomacy/connections bonus
2429                }
2430                if ($name == "STANDINGSFROM")
2431                {
2432                        $this->StandingsTo_ = false;
2433                }
2434                if ($name == "ALLIANCESTANDINGS")
2435                {
2436                        $this->isAllianceStandings_ = true;
2437                        $this->isCorporationStandings_ = false;
2438                }
2439               
2440                if ($name == "ROWSET") // In this If statement we set booleans to ultimately determine where the data in the next If statement is stored
2441        {
2442            if (count($attribs)) 
2443            {
2444                foreach ($attribs as $k => $v) 
2445                {
2446                    switch ($k) 
2447                    {
2448                        case "NAME":
2449                                                        switch ($v) 
2450                                {       
2451                                                                // bitwise or numeric flag would be better and more concise - but fuck it!
2452                                                                case "characters": // can only be personal/corp
2453                                                                        $this->isCharacters_ = true;
2454                                                                        $this->isCorporations_ = false;
2455                                                                        $this->isAlliances_ = false;
2456                                                                        $this->isAgents_ = false;
2457                                                                        $this->isNPCCorporations_ = false;
2458                                                                        $this->isFactions_ = false;
2459                                                                        $this->isAllianceCorporations_ = false;
2460                                                                        $this->isAllianceAlliances_ = false;
2461                                                                        break;
2462                                                                case "corporations": // can be either personal/corp or alliance
2463                                                                        $this->isCharacters_ = false;
2464                                                                        $this->isCorporations_ = false;
2465                                                                        $this->isAlliances_ = false;
2466                                                                        $this->isAgents_ = false;
2467                                                                        $this->isNPCCorporations_ = false;
2468                                                                        $this->isFactions_ = false;
2469                                                                        $this->isAllianceCorporations_ = false;
2470                                                                        $this->isAllianceAlliances_ = false;
2471                                                                       
2472                                                                        if (!$this->isAllianceStandings_) // then it is personal/corp
2473                                                                        {
2474                                                                                $this->isCorporations_ = true;
2475                                                                        } else { // then it is alliance
2476                                                                                $this->isAllianceCorporations_ = true;
2477                                                                        }
2478                                                                        break;
2479                                                                case "alliances": // can be either personal/corp or alliance
2480                                                                        $this->isCharacters_ = false;
2481                                                                        $this->isCorporations_ = false;
2482                                                                        $this->isAlliances_ = false;
2483                                                                        $this->isAgents_ = false;
2484                                                                        $this->isNPCCorporations_ = false;
2485                                                                        $this->isFactions_ = false;
2486                                                                        $this->isAllianceCorporations_ = false;
2487                                                                        $this->isAllianceAlliances_ = false;
2488                                                                       
2489                                                                        if (!$this->isAllianceStandings_) // then it is personal/corp
2490                                                                        {
2491                                                                                $this->isAlliances_ = true;
2492                                                                        } else { // then it is alliance
2493                                                                                $this->isAllianceAlliances_ = true;
2494                                                                        }       
2495                                                                        break;
2496                                                                case "agents": // can only be personal/corp
2497                                                                        $this->isCharacters_ = false;
2498                                                                        $this->isCorporations_ = false;
2499                                                                        $this->isAlliances_ = false;
2500                                                                        $this->isAgents_ = true;
2501                                                                        $this->isNPCCorporations_ = false;
2502                                                                        $this->isFactions_ = false;
2503                                                                        $this->isAllianceCorporations_ = false;
2504                                                                        $this->isAllianceAlliances_ = false;
2505                                                                        break;
2506                                                                case "NPCCorporations": // can only be personal/corp
2507                                                                        $this->isCharacters_ = false;
2508                                                                        $this->isCorporations_ = false;
2509                                                                        $this->isAlliances_ = false;
2510                                                                        $this->isAgents_ = false;
2511                                                                        $this->isNPCCorporations_ = true;
2512                                                                        $this->isFactions_ = false;
2513                                                                        $this->isAllianceCorporations_ = false;
2514                                                                        $this->isAllianceAlliances_ = false;
2515                                                                        break;
2516                                                                case "factions": // can only be personal/corp
2517                                                                        $this->isCharacters_ = false;
2518                                                                        $this->isCorporations_ = false;
2519                                                                        $this->isAlliances_ = false;
2520                                                                        $this->isAgents_ = false;
2521                                                                        $this->isNPCCorporations_ = false;
2522                                                                        $this->isFactions_ = true;
2523                                                                        $this->isAllianceCorporations_ = false;
2524                                                                        $this->isAllianceAlliances_ = false;
2525                                                                        break; 
2526                                                        }
2527                            break;
2528                                        }
2529                                }
2530                        }
2531                }
2532               
2533                if ($name == "ROW") 
2534        {
2535                        global $tempdata;
2536                       
2537                        if (count($attribs)) 
2538            {
2539                foreach ($attribs as $k => $v) 
2540                {
2541                    switch ($k) 
2542                    {
2543                                                case "TOID":
2544                                                        $tempdata['ID'] = $v;
2545                            break;     
2546                                                case "FROMID":
2547                                                        $tempdata['ID'] = $v;
2548                            break;     
2549                                                case "TONAME":
2550                                                        $tempdata['Name'] = $v;
2551                            break;     
2552                                                case "FROMNAME":
2553                                                        $tempdata['Name'] = $v;
2554                            break;     
2555                                                case "STANDING":
2556                                                        // use flags determined in previous If... to load the correct array[]
2557                                                        if ($this->isUser_ && !$this->StandingsTo_)
2558                                                        { 
2559                                                                // set standings bonus where applicable
2560                                                                // calculate bonus
2561                                                                if ($v >= 0) // Connections
2562                                                                        $tempdata['Standing'] = number_format($v + ((10 - $v) * (0.04 * $this->connections_)), 2, '.', '');
2563                                                                else  // Diplomacy
2564                                                                        $tempdata['Standing'] = number_format($v + ((10 - $v) * (0.04 * $this->diplomacy_)), 2, '.', '');
2565                                                        } else {
2566                                                                $tempdata['Standing'] = $v;
2567                                                        }
2568                                                       
2569                                                        // check that 'Name' isn't empty as this means the value was reset
2570                                                        if ($tempdata['Name'] != "")
2571                                                        {       
2572                                                                if ($this->isCharacters_) {
2573                                                                        $this->Characters_[] = $tempdata;
2574                                                                } elseif ($this->isCorporations_) {
2575                                                                        $this->Corporations_[] = $tempdata;
2576                                                                } elseif ($this->isAlliances_ ) {
2577                                                                        $this->Alliances_[] = $tempdata;
2578                                                                } elseif ($this->isAgents_) {
2579                                                                        $this->Agents_[] = $tempdata;
2580                                                                } elseif ($this->isNPCCorporations_) {
2581                                                                        $this->NPCCorporations_[] = $tempdata;
2582                                                                } elseif ($this->isFactions_) {
2583                                                                        $this->Factions_[] = $tempdata;
2584                                                                } elseif ($this->isAllianceCorporations_) {
2585                                                                        $this->AllianceCorporations_[] = $tempdata;
2586                                                                } elseif ($this->isAllianceAlliances_) {
2587                                                                        $this->AllianceAlliances_[] = $tempdata;
2588                                                                }
2589                                                        }
2590                                                       
2591                                                        $tempdata = array();
2592                                                        unset($tempdata);
2593                            break;                     
2594                                        }
2595                                }
2596                        }
2597                }
2598    }                           
2599
2600    function endElement($parser, $name) 
2601    {
2602       
2603                if ($name == "CURRENTTIME")
2604                        $this->CurrentTime_ = $this->characterDataValue;
2605                if ($name == "CACHEDUNTIL")
2606                {
2607                        $this->CachedUntil_ = $this->characterDataValue;
2608                        ApiCache::set( $this->API_characterID_ . '_Standings' , $this->characterDataValue);
2609                }
2610    }
2611
2612    function characterData($parser, $data) 
2613    {
2614                $this->characterDataValue = $data;
2615    }
2616       
2617        function loaddata($keystring, $typestring)
2618    {
2619                $configvalue = $this->API_characterID_ . '_Standings';
2620               
2621                $CachedTime = ApiCache::get($configvalue);
2622                $UseCaching = config::get('API_UseCache');
2623               
2624        $url = "http://api.eve-online.com/" . $typestring . "/Standings.xml.aspx" . $keystring;
2625        $path = "/" . $typestring . "/Standings.xml.aspx";
2626                       
2627                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
2628                if ($CachedTime == "")
2629        {
2630                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
2631        }
2632               
2633                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
2634                        $cacheexists = true;
2635                else
2636                        $cacheexists = false;
2637                       
2638               
2639                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )// if API_UseCache = 1 (off) then don't use cache
2640        {
2641                $fp = fsockopen("api.eve-online.com", 80);
2642
2643                if (!$fp)
2644                {
2645                                $this->Output_ .= "Could not connect to API URL";
2646                } else {
2647                // request the xml
2648                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
2649                fputs ($fp, "Host: api.eve-online.com\r\n");
2650                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
2651                fputs ($fp, "User-Agent: PHPApi\r\n");
2652                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
2653                fputs ($fp, "Connection: close\r\n\r\n");
2654                fputs ($fp, $keystring."\r\n");
2655
2656                // retrieve contents
2657                $contents = "";
2658                while (!feof($fp))
2659                {
2660                    $contents .= fgets($fp);
2661                }
2662
2663                // close connection
2664                fclose($fp);
2665
2666                $start = strpos($contents, "?>");
2667                if ($start !== FALSE)
2668                {
2669                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
2670                        }
2671                       
2672                                if ($UseCaching == 0) // Save the file if we're caching (0 = true in Thunks world)
2673                                {
2674                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
2675                                fwrite($file, $contents);
2676                                fclose($file);
2677                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
2678                                } 
2679                } 
2680                } else {
2681                        // re-use cached XML
2682                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
2683                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
2684                        fclose($fp);
2685                } else {
2686                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>"; 
2687                }
2688                }
2689        return $contents;
2690    }
2691}
2692
2693// **********************************************************************************************************************************************
2694// ****************                                 API Character Sheet - char/CharacterSheet.xml.aspx                           ****************
2695// **********************************************************************************************************************************************
2696// Incomplete - Does not read Certificates or Roles
2697class API_CharacterSheet 
2698{               
2699        function getCachedUntil()
2700        {
2701                return $this->CachedUntil_;
2702        }
2703       
2704        function getCurrentTime()
2705        {
2706                return $this->CurrentTime_;
2707        }
2708       
2709        function getSkills()
2710        {
2711                return $this->Skills_;
2712        }
2713       
2714        // array 1-5 based on implant slot position. 6-10 don't seem to appear, presumably because Hardwirings do not affect skill training.
2715        function getImplants() 
2716        {
2717                return $this->Implant_;
2718        }
2719       
2720        function getIntelligence()
2721        {
2722                return $this->Intelligence_;
2723        }
2724       
2725        function getMemory()
2726        {
2727                return $this->Memory_;
2728        }
2729       
2730        function getCharisma()
2731        {
2732                return $this->Charisma_;
2733        }
2734       
2735        function getPerception()
2736        {
2737                return $this->Perception_;
2738        }
2739       
2740        function getWillpower()
2741        {
2742                return $this->Willpower_;
2743        }       
2744        function getCharacterID()
2745        {
2746                return $this->CharacterID_;
2747        }
2748        function getName()
2749        {
2750                return $this->Name_;
2751        }
2752        function getRace()
2753        {
2754                return $this->Race_;
2755        }
2756        function getBloodLine()
2757        {
2758                return $this->BloodLine_;
2759        }
2760        function getGender()
2761        {
2762                return $this->Gender_;
2763        }
2764        function getCorporationName()
2765        {
2766                return $this->CorporationName_;
2767        }
2768        function getCorporationID()
2769        {
2770                return $this->CorporationID_;
2771        }
2772        function getCloneName()
2773        {
2774                return $this->CloneName_;
2775        }
2776        function getCloneSkillPoints()
2777        {
2778                return $this->CloneSkillPoints_;
2779        }
2780        function getBalance()
2781        {
2782                return $this->Balance_;
2783        }
2784        function fetchXML()
2785        {
2786                // is a player feed - take details from logged in user
2787                if (user::get('usr_pilot_id'))
2788        {
2789                        require_once('class.pilot.php');
2790                        $plt = new pilot(user::get('usr_pilot_id'));
2791                        $usersname = $plt->getName();
2792                       
2793                        $this->CharName_ = $usersname;  // $this->CharName_ is used later for config key value for caching
2794                       
2795                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
2796
2797                $qry = new DBQuery();
2798                        $qry->execute($sql);
2799                        $row = $qry->getRow();
2800
2801                $pilot_id = $row['plt_id'];
2802                $API_charID = $row['plt_externalid'];
2803
2804                if ( $pilot_id == 0 )
2805                        {
2806                        return "Something went wrong with finiding pilots external ID<br>";
2807                }
2808               
2809                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
2810                        $qry->execute($newsql);
2811                $userrow = $qry->getRow();
2812               
2813                        $API_userID = $userrow['userID'];
2814                        $API_apiKey = $userrow['apiKey'];
2815                       
2816                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
2817                               
2818                        $data = $this->loaddata($myKeyString);
2819                } else {
2820                        return "You are not logged in.";
2821                }
2822
2823        $xml_parser = xml_parser_create();
2824        xml_set_object ( $xml_parser, $this );
2825        xml_set_element_handler($xml_parser, "startElement", "endElement");
2826        xml_set_character_data_handler ( $xml_parser, 'characterData' );
2827
2828        if (!xml_parse($xml_parser, $data, true))
2829            return "<i>Error getting XML data from api.eve-online.com/CharacterSheet.xml.aspx  </i><br><br>";
2830
2831        xml_parser_free($xml_parser);
2832               
2833                return $this->html;
2834        }
2835       
2836        function startElement($parser, $name, $attribs) 
2837    {
2838                if ($name == "ROW") 
2839        {
2840                        global $tempdata;
2841                       
2842                        if (count($attribs)) 
2843            {
2844                foreach ($attribs as $k => $v) 
2845                {
2846                    switch ($k) 
2847                    {
2848                                                case "TYPEID":
2849                                                        $tempdata['typeID'] = $v;
2850                                                        $tempdata['SkillName'] = gettypeIDname($v);
2851                                                        $tempdata['GroupID'] = getgroupID($v);
2852                                                        $tempdata['GroupName'] = getgroupIDname($tempdata['GroupID']);
2853                                                        $tempdata['Rank'] = gettypeIDrank($v);
2854                            break;     
2855                                                case "SKILLPOINTS":
2856                                                        $tempdata['SkillPoints'] = $v;
2857                            break;     
2858                                                case "LEVEL":
2859                                                        $tempdata['Level'] = $v;
2860                                                       
2861                                                        $this->Skills_[] = $tempdata;
2862                                                       
2863                                                        $tempdata = array();
2864                                                        unset($tempdata);
2865                            break;     
2866                                                case "UNPUBLISHED": // unused skill eg. Black Market Trading
2867                                                        $tempdata = array();
2868                                                        unset($tempdata);
2869                            break;
2870                                        }
2871                                }
2872                        }
2873                }
2874    }                           
2875
2876    function endElement($parser, $name) 
2877    {
2878                // Player Details
2879                if ($name == "CHARACTERID")
2880                        $this->CharacterID_ = $this->characterDataValue;
2881                if ($name == "NAME")
2882                        $this->Name_ = $this->characterDataValue;
2883                if ($name == "RACE")
2884                        $this->Race_ = $this->characterDataValue;
2885                if ($name == "BLOODLINE")
2886                        $this->BloodLine_ = $this->characterDataValue;
2887                if ($name == "GENDER")
2888                        $this->Gender_ = $this->characterDataValue;
2889                if ($name == "CORPORATIONNAME")
2890                        $this->CorporationName_ = $this->characterDataValue;
2891                if ($name == "CORPORATIONID")
2892                        $this->CorporationID_ = $this->characterDataValue;
2893                if ($name == "CLONENAME")
2894                        $this->CloneName_ = $this->characterDataValue; 
2895                if ($name == "CLONESKILLPOINTS")
2896                        $this->CloneSkillPoints_ = $this->characterDataValue;
2897                if ($name == "BALANCE")
2898                        $this->Balance_ = $this->characterDataValue;   
2899               
2900                // Augmentations
2901                if ($name == "AUGMENTATORNAME")
2902                        $tempaug['Name'] = $this->characterDataValue;
2903                if ($name == "AUGMENTATORVALUE")
2904                        $tempaug['Value'] = $this->characterDataValue;
2905               
2906                if ($name == "PERCEPTIONBONUS")
2907                {
2908                        $this->Implant_[1] = $tempaug;
2909                       
2910                        $tempaug = array();
2911                        unset($tempaug);
2912                }
2913                if ($name == "MEMORYBONUS")
2914                {
2915                        $this->Implant_[2] = $tempaug;
2916                       
2917                        $tempaug = array();
2918                        unset($tempaug);
2919                }
2920                if ($name == "WILLPOWERBONUS")
2921                {
2922                        $this->Implant_[3] = $tempaug;
2923                       
2924                        $tempaug = array();
2925                        unset($tempaug);
2926                }
2927                if ($name == "INTELLIGENCEBONUS")
2928                {
2929                        $this->Implant_[4] = $tempaug;
2930                       
2931                        $tempaug = array();
2932                        unset($tempaug);
2933                }
2934                if ($name == "CHARISMABONUS")
2935                {
2936                        $this->Implant_[5] = $tempaug;
2937                       
2938                        $tempaug = array();
2939                        unset($tempaug);
2940                }
2941                       
2942                // Attributes
2943                if ($name == "INTELLIGENCE")
2944                        $this->Intelligence_ = $this->characterDataValue;
2945                if ($name == "MEMORY")
2946                        $this->Memory_ = $this->characterDataValue;
2947                if ($name == "CHARISMA")
2948                        $this->Charisma_ = $this->characterDataValue;   
2949                if ($name == "PERCEPTION")
2950                        $this->Perception_ = $this->characterDataValue;
2951                if ($name == "WILLPOWER")
2952                        $this->Willpower_ = $this->characterDataValue;
2953               
2954                if ($name == "CURRENTTIME")
2955                        $this->CurrentTime_ = $this->characterDataValue;
2956                if ($name == "CACHEDUNTIL")
2957                {
2958                        $this->CachedUntil_ = $this->characterDataValue;
2959                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
2960                        ApiCache::set( $this->CharName_ . '_CharacterSheet' , $this->characterDataValue);
2961                }
2962    }
2963
2964    function characterData($parser, $data) 
2965    {
2966                $this->characterDataValue = $data;
2967    }
2968
2969        function loaddata($keystring)
2970    {
2971                $configvalue = $this->CharName_ . '_CharacterSheet';
2972               
2973                $CachedTime = ApiCache::get($configvalue);
2974                $UseCaching = config::get('API_UseCache');
2975               
2976        $url = "http://api.eve-online.com/char/CharacterSheet.xml.aspx" . $keystring;
2977
2978        $path = '/char/CharacterSheet.xml.aspx';
2979               
2980                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
2981                if ($CachedTime == "")
2982        {
2983                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
2984        }
2985               
2986                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
2987                        $cacheexists = true;
2988                else
2989                        $cacheexists = false;
2990                       
2991                // if API_UseCache = 1 (off) then don't use cache
2992                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
2993        {
2994                $fp = fsockopen("api.eve-online.com", 80);
2995
2996                if (!$fp)
2997                {
2998                $this->Output_ .= "Could not connect to API URL";
2999                } else {
3000                        // request the xml
3001                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
3002                fputs ($fp, "Host: api.eve-online.com\r\n");
3003                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
3004                fputs ($fp, "User-Agent: PHPApi\r\n");
3005                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
3006                fputs ($fp, "Connection: close\r\n\r\n");
3007                fputs ($fp, $keystring."\r\n");
3008
3009                        // retrieve contents
3010                $contents = "";
3011                while (!feof($fp))
3012                {
3013                        $contents .= fgets($fp);
3014                }
3015
3016                // close connection
3017                fclose($fp);
3018
3019                $start = strpos($contents, "?>");
3020                if ($start !== FALSE)
3021                {
3022                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3023                }
3024                               
3025                                // Save the file if we're caching (0 = true in Thunks world)
3026                                if ($UseCaching == 0) 
3027                                {
3028                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3029                                fwrite($file, $contents);
3030                                fclose($file);
3031                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3032                                } 
3033                } 
3034                } else {
3035                        // re-use cached XML
3036                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3037                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3038                        fclose($fp);
3039                } else {
3040                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>"; 
3041                }
3042                }
3043        return $contents;
3044    }
3045}
3046
3047// **********************************************************************************************************************************************
3048// ****************                                 API Skill Training Sheet - char/SkillInTraining.xml.aspx                     ****************
3049// **********************************************************************************************************************************************
3050class API_SkillInTraining 
3051{               
3052
3053        function getSkillInTraining()
3054        {
3055                return $this->SkillInTraining_;
3056        }
3057       
3058        function getCurrentTQTime()
3059        {
3060                return $this->CurrentTQTime_;
3061        }
3062       
3063        function getTrainingEndTime()
3064        {
3065                return $this->TrainingEndTime_;
3066        }
3067       
3068        function getTrainingStartTime()
3069        {
3070                return $this->TrainingStartTime_;
3071        }
3072       
3073        function getTrainingTypeID()
3074        {
3075                return $this->TrainingTypeID_;
3076        }
3077       
3078        function getTrainingStartSP()
3079        {
3080                return $this->TrainingStartSP_;
3081        }
3082       
3083        function getTrainingDestinationSP()
3084        {
3085                return $this->TrainingDestinationSP_;
3086        }
3087       
3088        function getTrainingToLevel()
3089        {
3090                return $this->TrainingToLevel_;
3091        }
3092       
3093        function getCachedUntil()
3094        {
3095                return $this->CachedUntil_;
3096        }
3097       
3098        function getCurrentTime()
3099        {
3100                return $this->CurrentTime_;
3101        }
3102
3103        function getSPTrained()
3104        {
3105                return $this->SPTrained_;
3106        }
3107       
3108        function getTrainingTimeRemaining()
3109        {
3110                return $this->TrainingTimeRemaining_;
3111        }
3112       
3113        function fetchXML()
3114        {
3115                // is a player feed - take details from logged in user
3116                if (user::get('usr_pilot_id'))
3117        {
3118                        require_once('class.pilot.php');
3119                        $plt = new pilot(user::get('usr_pilot_id'));
3120                        $usersname = $plt->getName();
3121                       
3122                        $this->CharName_ = $usersname;
3123                       
3124                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
3125
3126                $qry = new DBQuery();
3127                        $qry->execute($sql);
3128                        $row = $qry->getRow();
3129
3130                $pilot_id = $row['plt_id'];
3131                $API_charID = $row['plt_externalid'];
3132
3133                if ( $pilot_id == 0 )
3134                        {
3135                        return "Something went wrong with finiding pilots external ID<br>";
3136                }
3137               
3138                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
3139                        $qry->execute($newsql);
3140                $userrow = $qry->getRow();
3141               
3142                        $API_userID = $userrow['userID'];
3143                        $API_apiKey = $userrow['apiKey'];
3144                       
3145                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
3146                               
3147                        $data = $this->loaddata($myKeyString);
3148                } else {
3149                        return "You are not logged in.";
3150                }
3151
3152        $xml_parser = xml_parser_create();
3153        xml_set_object ( $xml_parser, $this );
3154        xml_set_element_handler($xml_parser, "startElement", "endElement");
3155        xml_set_character_data_handler ( $xml_parser, 'characterData' );
3156
3157        if (!xml_parse($xml_parser, $data, true))
3158            return "<i>Error getting XML data from api.eve-online.com/SkillInTraining.xml.aspx  </i><br><br>";
3159
3160        xml_parser_free($xml_parser);
3161               
3162                // Calculate Time Training remaining and amount of SP Done
3163                if ($this->SkillInTraining_ == 1)
3164                {
3165                        $trainingleft = $this->TrainingEndTime_;
3166
3167                $now       = time();
3168                        $gmmktime  = gmmktime();
3169                $finaltime = $gmmktime - $now;
3170
3171                $year   = (int)substr($trainingleft, 0, 4);
3172                $month  = (int)substr($trainingleft, 5, 2);
3173                $day    = (int)substr($trainingleft, 8, 2);
3174                $hour   = (int)substr($trainingleft, 11, 2) + (($finaltime > 0) ? floor($finaltime / 60 / 60) : 0); //2007-06-22 16:47:50
3175                $minute = (int)substr($trainingleft, 14, 2);
3176                $second = (int)substr($trainingleft, 17, 2);
3177
3178                $difference = gmmktime($hour, $minute, $second, $month, $day, $year) - $now;
3179                        $timedone = $difference;
3180                if ($difference >= 1) 
3181                        {
3182                        $days = floor($difference/86400);
3183                        $difference = $difference - ($days*86400);
3184                        $hours = floor($difference/3600);
3185                        $difference = $difference - ($hours*3600);
3186                        $minutes = floor($difference/60);
3187                        $difference = $difference - ($minutes*60);
3188                        $seconds = $difference;
3189                                $this->TrainingTimeRemaining_ = "$days Days, $hours Hours, $minutes Minutes and $seconds Seconds.";
3190                } else {
3191                        $this->TrainingTimeRemaining_ = "Done !";
3192                }
3193               
3194                        // Calculate SP done by using the ratio gained from Time spent training so far.
3195                $finaltime = strtotime($this->TrainingEndTime_) - strtotime($this->TrainingStartTime_); // in seconds
3196                        $ratio =  1 - ($timedone / $finaltime);
3197                        $this->SPTrained_ = ($this->TrainingDestinationSP_ - $this->TrainingStartSP_) * $ratio;
3198                }
3199               
3200                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
3201        }
3202       
3203        function startElement($parser, $name, $attribs) 
3204    {
3205                // Nothing to do here
3206    }                           
3207
3208    function endElement($parser, $name) 
3209    {
3210                // Details
3211                if ($name == "SKILLINTRAINING")
3212                        $this->SkillInTraining_ = $this->characterDataValue;
3213                if ($name == "CURRENTTQTIME")
3214                        $this->CurrentTQTime_ = $this->characterDataValue;
3215                if ($name == "TRAININGENDTIME")
3216                        $this->TrainingEndTime_ = $this->characterDataValue;
3217                if ($name == "TRAININGSTARTTIME")
3218                        $this->TrainingStartTime_ = $this->characterDataValue;
3219                if ($name == "TRAININGTYPEID")
3220                        $this->TrainingTypeID_ = $this->characterDataValue;
3221                if ($name == "TRAININGSTARTSP")
3222                        $this->TrainingStartSP_ = $this->characterDataValue;
3223                if ($name == "TRAININGDESTINATIONSP")
3224                        $this->TrainingDestinationSP_ = $this->characterDataValue;
3225                if ($name == "TRAININGTOLEVEL")
3226                        $this->TrainingToLevel_ = $this->characterDataValue;
3227                       
3228                if ($name == "CURRENTTIME")
3229                        $this->CurrentTime_ = $this->characterDataValue;
3230                if ($name == "CACHEDUNTIL")
3231                {
3232                        $this->CachedUntil_ = $this->characterDataValue;
3233                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
3234                        ApiCache::set( $this->CharName_ . '_SkillInTraining' , $this->characterDataValue);
3235                }
3236    }
3237
3238    function characterData($parser, $data) 
3239    {
3240                $this->characterDataValue = $data;
3241    }
3242       
3243        function loaddata($keystring)
3244    {
3245                $configvalue = $this->CharName_ . '_SkillInTraining';
3246               
3247                $CachedTime = ApiCache::get($configvalue);
3248                $UseCaching = config::get('API_UseCache');
3249               
3250        $url = "http://api.eve-online.com/char/SkillInTraining.xml.aspx" . $keystring;
3251
3252        $path = '/char/SkillInTraining.xml.aspx';
3253               
3254                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
3255                if ($CachedTime == "")
3256        {
3257                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
3258        }
3259               
3260                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
3261                        $cacheexists = true;
3262                else
3263                        $cacheexists = false;
3264                       
3265                // if API_UseCache = 1 (off) then don't use cache
3266                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
3267        {
3268                $fp = fsockopen("api.eve-online.com", 80);
3269
3270                if (!$fp)
3271                {
3272                $this->Output_ .= "Could not connect to API URL";
3273                } else {
3274                        // request the xml
3275                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
3276                fputs ($fp, "Host: api.eve-online.com\r\n");
3277                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
3278                fputs ($fp, "User-Agent: PHPApi\r\n");
3279                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
3280                fputs ($fp, "Connection: close\r\n\r\n");
3281                fputs ($fp, $keystring."\r\n");
3282
3283                        // retrieve contents
3284                $contents = "";
3285                while (!feof($fp))
3286                {
3287                        $contents .= fgets($fp);
3288                }
3289
3290                // close connection
3291                fclose($fp);
3292
3293                $start = strpos($contents, "?>");
3294                if ($start !== FALSE)
3295                {
3296                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3297                }
3298                               
3299                                // Save the file if we're caching (0 = true in Thunks world)
3300                                if ($UseCaching == 0) 
3301                                {
3302                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3303                                fwrite($file, $contents);
3304                                fclose($file);
3305                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3306                                } 
3307                } 
3308                } else {
3309                        // re-use cached XML
3310                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3311                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3312                        fclose($fp);
3313                } else {
3314                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>"; 
3315                }
3316                }
3317        return $contents;
3318    }
3319}
3320
3321// **********************************************************************************************************************************************
3322// ****************                                       API StarbaseList - /corp/StarbaseList.xml.aspx                         ****************
3323// **********************************************************************************************************************************************
3324class API_StarbaseList 
3325{               
3326        function getCachedUntil()
3327        {
3328                return $this->CachedUntil_;
3329        }
3330       
3331        function getCurrentTime()
3332        {
3333                return $this->CurrentTime_;
3334        }
3335       
3336        function setAPIKey($key)
3337        {
3338                $this->API_apiKey_ = $key;
3339        }
3340       
3341        function setUserID($uid)
3342        {
3343                $this->API_userID_ = $uid;
3344        }
3345       
3346        function setCharacterID($cid)
3347        {
3348                $this->API_charID_ = $cid;
3349        }
3350       
3351        function getStarbases()
3352        {
3353                return $this->Starbase_;
3354        }
3355       
3356        function fetchXML()
3357        {
3358                // is a player feed - take details from logged in user
3359                if (user::get('usr_pilot_id'))
3360        {
3361                        require_once('class.pilot.php');
3362                        $plt = new pilot(user::get('usr_pilot_id'));
3363                        $usersname = $plt->getName();
3364                       
3365                        $this->CharName_ = $usersname;
3366                       
3367                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
3368
3369                $qry = new DBQuery();
3370                        $qry->execute($sql);
3371                        $row = $qry->getRow();
3372
3373                $pilot_id = $row['plt_id'];
3374                $API_charID = $row['plt_externalid'];
3375
3376                if ( $pilot_id == 0 )
3377                        {
3378                        return "Something went wrong with finiding pilots external ID<br>";
3379                }
3380               
3381                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
3382                        $qry->execute($newsql);
3383                $userrow = $qry->getRow();
3384               
3385                        $API_userID = $userrow['userID'];
3386                        $API_apiKey = $userrow['apiKey'];
3387                       
3388                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
3389                               
3390                        $data = $this->loaddata($myKeyString);
3391                } else {
3392                        if ($this->API_userID_ != "" && $this->API_apiKey_ != "" && $this->API_charID_ != "")
3393                        {
3394                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_charID_;
3395                                $this->CharName_ = $this->API_charID_;
3396                                $data = $this->loaddata($myKeyString);
3397                        } else {
3398                                return "You are not logged in and have not set API details.";
3399                        }
3400                }
3401
3402        $xml_parser = xml_parser_create();
3403        xml_set_object ( $xml_parser, $this );
3404        xml_set_element_handler($xml_parser, "startElement", "endElement");
3405        xml_set_character_data_handler ( $xml_parser, 'characterData' );
3406
3407        if (!xml_parse($xml_parser, $data, true))
3408            return "<i>Error getting XML data from api.eve-online.com/StarbaseList.xml.aspx  </i><br><br>";
3409
3410        xml_parser_free($xml_parser);
3411               
3412                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
3413        }
3414       
3415        function startElement($parser, $name, $attribs) 
3416    {
3417                if ($name == "ROW") 
3418        {
3419                        global $tempdata;
3420                       
3421                        if (count($attribs)) 
3422            {
3423                foreach ($attribs as $k => $v) 
3424                {
3425                    switch ($k) 
3426                    {
3427                                                case "ITEMID":
3428                                                        $tempdata['itemID'] = $v;
3429                            break;     
3430                                                case "TYPEID":
3431                                                        $tempdata['typeID'] = $v;
3432                                                        $tempdata['typeName'] = gettypeIDname($v);
3433                            break;     
3434                                                case "LOCATIONID":
3435                                                        $tempdata['locationID'] = $v;
3436                                                        $sql = 'select sys.sys_name, sys.sys_sec from kb3_systems sys where sys.sys_eve_id = '.$v;
3437
3438                                $qry = new DBQuery();
3439                                $qry->execute($sql);
3440                                $row = $qry->getRow();
3441
3442                                $tempdata['locationName'] = $row['sys_name'];
3443                                $mysec = $row['sys_sec'];
3444                                if ($mysec <= 0)
3445                                $tempdata['locationSec'] = number_format(0.0, 1);
3446                                else
3447                                $tempdata['locationSec'] = number_format(round($mysec, 1), 1);
3448                            break;     
3449                                                case "MOONID":
3450                                                        $tempdata['moonID'] = $v;
3451                                                        $tempmoon = getMoonName($v);
3452                                                       
3453                                                        if ($tempmoon == "")
3454                                                        {
3455                                                                // Use API IDtoName to get Moon Name.
3456                                                                $this->myIDName = new API_IDtoName();
3457                                                                $this->myIDName->clear();
3458                                                                $this->myIDName->setIDs($v); 
3459                                                                $this->Output_ .= $this->myIDName->fetchXML();
3460                                                                $myNames = $this->myIDName->getIDData();
3461                                                                $tempdata['moonName'] = $myNames[0]['name'];           
3462                                                        } else {
3463                                                                $tempdata['moonName'] = $tempmoon;
3464                                                        }
3465                            break;     
3466                                                case "STATE": 
3467                                                        $tempdata['state'] = $v;
3468                            break;
3469                                                case "STATETIMESTAMP": 
3470                                                        $tempdata['stateTimestamp'] = $v;
3471                            break;
3472                                                case "ONLINETIMESTAMP": 
3473                                                        $tempdata['onlineTimestamp'] = $v;
3474                                                        $this->Starbase_[] = $tempdata;
3475                                                       
3476                                                        $tempdata = array();
3477                                                        unset($tempdata);
3478                            break;
3479                                        }
3480                                }
3481                        }
3482                }
3483    }                           
3484
3485    function endElement($parser, $name) 
3486    {
3487                // Details
3488                if ($name == "ERROR")
3489                        $this->html .= $this->characterDataValue;
3490                if ($name == "CURRENTTIME")
3491                        $this->CurrentTime_ = $this->characterDataValue;
3492                if ($name == "CACHEDUNTIL")
3493                {
3494                        $this->CachedUntil_ = $this->characterDataValue;
3495                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
3496                        ApiCache::set( $this->CharName_ . '_StarbaseList' , $this->characterDataValue);
3497                }
3498    }
3499
3500    function characterData($parser, $data) 
3501    {
3502                $this->characterDataValue = $data;
3503    }
3504       
3505        function loaddata($keystring)
3506    {
3507                $configvalue = $this->CharName_ . '_StarbaseList';
3508               
3509                $CachedTime = ApiCache::get($configvalue);
3510                $UseCaching = config::get('API_UseCache');
3511               
3512        $url = "http://api.eve-online.com/corp/StarbaseList.xml.aspx" . $keystring;
3513
3514        $path = '/corp/StarbaseList.xml.aspx';
3515               
3516                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
3517                if ($CachedTime == "")
3518        {
3519                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
3520        }
3521               
3522                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
3523                        $cacheexists = true;
3524                else
3525                        $cacheexists = false;
3526                       
3527                // if API_UseCache = 1 (off) then don't use cache
3528                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
3529        {
3530                $fp = fsockopen("api.eve-online.com", 80);
3531
3532                if (!$fp)
3533                {
3534                $this->Output_ .= "Could not connect to API URL";
3535                } else {
3536                        // request the xml
3537                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
3538                fputs ($fp, "Host: api.eve-online.com\r\n");
3539                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
3540                fputs ($fp, "User-Agent: PHPApi\r\n");
3541                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
3542                fputs ($fp, "Connection: close\r\n\r\n");
3543                fputs ($fp, $keystring."\r\n");
3544
3545                        // retrieve contents
3546                $contents = "";
3547                while (!feof($fp))
3548                {
3549                        $contents .= fgets($fp);
3550                }
3551
3552                // close connection
3553                fclose($fp);
3554
3555                $start = strpos($contents, "?>");
3556                if ($start !== FALSE)
3557                {
3558                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3559                }
3560                               
3561                                // Save the file if we're caching (0 = true in Thunks world)
3562                                if ($UseCaching == 0) 
3563                                {
3564                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3565                                fwrite($file, $contents);
3566                                fclose($file);
3567                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3568                                } 
3569                } 
3570                } else {
3571                        // re-use cached XML
3572                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3573                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3574                        fclose($fp);
3575                } else {
3576                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>"; 
3577                }
3578                }
3579        return $contents;
3580    }
3581}
3582
3583// **********************************************************************************************************************************************
3584// ****************                                       API StarbaseDetail - /corp/StarbaseDetail.xml.aspx                          ****************
3585// **********************************************************************************************************************************************
3586class API_StarbaseDetail 
3587{               
3588        function getCachedUntil()
3589        {
3590                return $this->CachedUntil_;
3591        }
3592       
3593        function getCurrentTime()
3594        {
3595                return $this->CurrentTime_;
3596        }
3597       
3598        function setAPIKey($key)
3599        {
3600                $this->API_apiKey_ = $key;
3601        }
3602       
3603        function setUserID($uid)
3604        {
3605                $this->API_userID_ = $uid;
3606        }
3607       
3608        function setCharacterID($cid)
3609        {
3610                $this->API_charID_ = $cid;
3611        }
3612       
3613        function setitemID($itemID)
3614        {
3615                $this->API_itemID_ = $itemID;
3616        }
3617        function getFuel()
3618        {
3619                return $this->Fuel_;
3620        }
3621        function getState()
3622        {
3623                return $this->State_;
3624        }
3625        function getstateTimestamp()
3626        {
3627                return $this->stateTimestamp_;
3628        }
3629        function getonlineTimestamp()
3630        {
3631                return $this->onlineTimestamp_;
3632        }
3633        function getusageFlags()
3634        {
3635                return $this->usageFlags_;
3636        }
3637        function getdeployFlags()
3638        {
3639                return $this->deployFlags_;
3640        }
3641        function getallowCorporationMembers()
3642        {
3643                return $this->allowCorporationMembers_;
3644        }
3645        function getallowAllianceMembers()
3646        {
3647                return $this->allowAllianceMembers_;
3648        }
3649        function getclaimSovereignty()
3650        {
3651                return $this->claimSovereignty_;
3652        }
3653        function getonStandingDrop()
3654        {
3655                return $this->onStandingDrop_;
3656        }
3657        function getonStatusDrop()
3658        {
3659                return $this->onStatusDrop_;
3660        }
3661        function getonAggression()
3662        {
3663                return $this->onAggression_;
3664        }
3665        function getonCorporationWar()
3666        {
3667                return $this->onCorporationWar_;
3668        }
3669       
3670       
3671        function fetchXML()
3672        {
3673                // is a player feed - take details from logged in user
3674                if (user::get('usr_pilot_id'))
3675        {
3676                        require_once('class.pilot.php');
3677                        $plt = new pilot(user::get('usr_pilot_id'));
3678                        $usersname = $plt->getName();
3679                       
3680                        $this->CharName_ = $usersname;
3681                       
3682                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
3683
3684                $qry = new DBQuery();
3685                        $qry->execute($sql);
3686                        $row = $qry->getRow();
3687
3688                $pilot_id = $row['plt_id'];
3689                $API_charID = $row['plt_externalid'];
3690
3691                if ( $pilot_id == 0 )
3692                        {
3693                        return "Something went wrong with finding pilots external ID<br>";
3694                }
3695               
3696                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
3697                        $qry->execute($newsql);
3698                $userrow = $qry->getRow();
3699               
3700                        $API_userID = $userrow['userID'];
3701                        $API_apiKey = $userrow['apiKey'];
3702                       
3703                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID . "&itemID=" . $this->API_itemID_;
3704                               
3705                        $data = $this->loaddata($myKeyString);
3706                } else {
3707                        if (($this->API_userID_ != "") && ($this->API_apiKey_ != "") && ($this->API_charID_ != "") && ($this->API_itemID_ != ""))
3708                        {
3709                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_charID_ . "&itemID=" . $this->API_itemID_;
3710                                $this->CharName_ = $this->API_charID_;
3711                                $data = $this->loaddata($myKeyString);
3712                        } else {
3713                                return "You are not logged in and have not set API details.";
3714                        }
3715                }
3716
3717        $xml_parser = xml_parser_create();
3718        xml_set_object ( $xml_parser, $this );
3719        xml_set_element_handler($xml_parser, "startElement", "endElement");
3720        xml_set_character_data_handler ( $xml_parser, 'characterData' );
3721
3722        if (!xml_parse($xml_parser, $data, true))
3723            return "<i>Error getting XML data from api.eve-online.com/StarbaseDetail.xml.aspx  </i><br><br>";
3724
3725        xml_parser_free($xml_parser);
3726               
3727                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
3728        }
3729       
3730        function startElement($parser, $name, $attribs) 
3731    {
3732                if ($name == "ROW") 
3733        {
3734                        global $tempdata;
3735                       
3736                        if (count($attribs)) 
3737            {
3738                foreach ($attribs as $k => $v) 
3739                {
3740                    switch ($k) 
3741                    {
3742                                                case "TYPEID":
3743                                                        $fueldata['typeID'] = $v;
3744                                                        $fueldata['typeName'] = gettypeIDname($v);
3745                            break;     
3746                                                case "QUANTITY":
3747                                                        $fueldata['quantity'] = $v;
3748                                                        $this->Fuel_[] = $fueldata;
3749                                                       
3750                                                        $fueldata = array();
3751                                                        unset($fueldata);
3752                            break;     
3753                                        }
3754                                }
3755                        }
3756                }
3757               
3758                if ($name == "ONSTANDINGDROP") 
3759        {
3760                        if (count($attribs)) 
3761            {
3762                foreach ($attribs as $k => $v) 
3763                {
3764                    switch ($k) 
3765                    {
3766                                                case "ENABLED":
3767                                                        $this->onStandingDrop_['enabled'] = $v;
3768                            break;     
3769                                                case "STANDING":
3770                                                        $this->onStandingDrop_['standing'] = $v;
3771                            break;     
3772                                        }
3773                                }
3774                        }
3775                }
3776               
3777                if ($name == "ONSTATUSDROP") 
3778        {
3779                        if (count($attribs)) 
3780            {
3781                foreach ($attribs as $k => $v) 
3782                {
3783                    switch ($k) 
3784                    {
3785                                                case "ENABLED":
3786                                                        $this->onStatusDrop_['enabled'] = $v;
3787                            break;     
3788                                                case "STANDING":
3789                                                        $this->onStatusDrop_['standing'] = $v;
3790                            break;             
3791                                        }
3792                                }
3793                        }
3794                }
3795               
3796                if ($name == "ONAGGRESSION") 
3797        {
3798                        if (count($attribs)) 
3799            {
3800                foreach ($attribs as $k => $v) 
3801                {
3802                    switch ($k) 
3803                    {
3804                                                case "ENABLED":
3805                                                        $this->onAggression_['enabled'] = $v;
3806                            break;     
3807                                        }
3808                                }
3809                        }
3810                }
3811               
3812                if ($name == "ONCORPORATIONWAR") 
3813        {
3814                        if (count($attribs)) 
3815            {
3816                foreach ($attribs as $k => $v) 
3817                {
3818                    switch ($k) 
3819                    {
3820                                                case "ENABLED":
3821                                                        $this->onCorporationWar_['enabled'] = $v;
3822                            break;     
3823                                        }
3824                                }
3825                        }
3826                }
3827    }                           
3828
3829    function endElement($parser, $name) 
3830    {
3831                // Details
3832                if ($name == "ERROR")
3833                        $this->html .= $this->characterDataValue;
3834               
3835                if ($name == "STATE")
3836                        $this->State_ .= $this->characterDataValue;
3837                if ($name == "STATETIMESTAMP")
3838                        $this->stateTimestamp_ .= $this->characterDataValue;
3839                if ($name == "ONLINETIMESTAMP")
3840                        $this->onlineTimestamp_ .= $this->characterDataValue;
3841               
3842                // General Settings
3843                if ($name == "USAGEFLAGS")
3844                        $this->usageFlags_ .= $this->characterDataValue;
3845                if ($name == "DEPLOYFLAGS")
3846                        $this->deployFlags_ .= $this->characterDataValue;
3847                if ($name == "ALLOWCORPORATIONMEMBERS")
3848                        $this->allowCorporationMembers_ .= $this->characterDataValue;
3849                if ($name == "ALLOWALLIANCEMEMBERS")
3850                        $this->allowAllianceMembers_ .= $this->characterDataValue;
3851                if ($name == "CLAIMSOVEREIGNTY")
3852                        $this->claimSovereignty_ .= $this->characterDataValue;
3853                       
3854                if ($name == "CURRENTTIME")
3855                        $this->CurrentTime_ = $this->characterDataValue;
3856                if ($name == "CACHEDUNTIL")
3857                {
3858                        $this->CachedUntil_ = $this->characterDataValue;
3859                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
3860                        ApiCache::set( $this->API_itemID_ . '_StarbaseDetail' , $this->characterDataValue);
3861                }
3862    }
3863
3864    function characterData($parser, $data) 
3865    {
3866                $this->characterDataValue = $data;
3867    }
3868       
3869        function loaddata($keystring)
3870    {
3871                $configvalue = $this->API_itemID_ . '_StarbaseDetail';
3872               
3873                $CachedTime = ApiCache::get($configvalue);
3874                $UseCaching = config::get('API_UseCache');
3875
3876        $url = "http://api.eve-online.com/corp/StarbaseDetail.xml.aspx" . $keystring;
3877
3878        $path = '/corp/StarbaseDetail.xml.aspx';
3879               
3880                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
3881                if ($CachedTime == "")
3882        {
3883                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
3884        }
3885               
3886                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
3887                        $cacheexists = true;
3888                else
3889                        $cacheexists = false;
3890                       
3891                // if API_UseCache = 1 (off) then don't use cache
3892                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
3893        {
3894                $fp = fsockopen("api.eve-online.com", 80);
3895
3896                if (!$fp)
3897                {
3898                $this->Output_ .= "Could not connect to API URL";
3899                } else {
3900                        // request the xml
3901                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
3902                fputs ($fp, "Host: api.eve-online.com\r\n");
3903                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
3904                fputs ($fp, "User-Agent: PHPApi\r\n");
3905                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
3906                fputs ($fp, "Connection: close\r\n\r\n");
3907                fputs ($fp, $keystring."\r\n");
3908
3909                        // retrieve contents
3910                $contents = "";
3911                while (!feof($fp))
3912                {
3913                        $contents .= fgets($fp);
3914                }
3915
3916                // close connection
3917                fclose($fp);
3918
3919                $start = strpos($contents, "?>");
3920                if ($start !== FALSE)
3921                {
3922                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
3923                }
3924                               
3925                                // Save the file if we're caching (0 = true in Thunks world)
3926                                if ($UseCaching == 0) 
3927                                {
3928                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
3929                                fwrite($file, $contents);
3930                                fclose($file);
3931                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
3932                                } 
3933                } 
3934                } else {
3935                        // re-use cached XML
3936                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
3937                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
3938                        fclose($fp);
3939                } else {
3940                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>"; 
3941                }
3942                }
3943        return $contents;
3944    }
3945}
3946
3947// **********************************************************************************************************************************************
3948// ****************                                   API Corporation Sheet - /corp/CorporationSheet.xml.aspx                    ****************
3949// **********************************************************************************************************************************************
3950// INCOMPLETE - MISSING CORP DIVISIONS AND WALLET DIVISIONS
3951class API_CorporationSheet 
3952{               
3953        function getCachedUntil()
3954        {
3955                return $this->CachedUntil_;
3956        }
3957       
3958        function getCurrentTime()
3959        {
3960                return $this->CurrentTime_;
3961        }
3962       
3963        function setAPIKey($key)
3964        {
3965                $this->API_apiKey_ = $key;
3966        }
3967       
3968        function setUserID($uid)
3969        {
3970                $this->API_userID_ = $uid;
3971        }
3972       
3973        function setCharacterID($cid)
3974        {
3975                $this->API_charID_ = $cid;
3976        }
3977       
3978        function setCorpID($corpid)
3979        {
3980                $this->API_corpID_ = $corpid;
3981        }
3982       
3983        function getAllianceID()
3984        {
3985                return $this->allianceID_;
3986        }
3987       
3988        function getAllianceName()
3989        {
3990                return $this->allianceName_;
3991        }
3992       
3993        function getCorporationID()
3994        {
3995                return $this->corporationID_;
3996        }
3997       
3998        function getCorporationName()
3999        {
4000                return $this->corporationName_;
4001        }
4002       
4003        function getTicker()
4004        {
4005                return $this->ticker_;
4006        }
4007       
4008        function getCeoID()
4009        {
4010                return $this->ceoID_;
4011        }
4012       
4013        function getCeoName()
4014        {
4015                return $this->ceoName_;
4016        }
4017               
4018        function getStationID()
4019        {
4020                return $this->stationID_;
4021        }
4022       
4023        function getStationName()
4024        {
4025                return $this->stationName_;
4026        }       
4027       
4028        function getDescription()
4029        {
4030                return $this->description_;
4031        }               
4032       
4033        function getUrl()
4034        {
4035                return $this->url_;
4036        }
4037               
4038        function getLogo()
4039        {
4040                return $this->logo_;
4041        }       
4042       
4043        function getTaxRate()
4044        {
4045                return $this->taxRate_;
4046        }
4047       
4048        function getMemberCount()
4049        {
4050                return $this->memberCount_;
4051        }
4052       
4053        function getMemberLimit()
4054        {
4055                return $this->memberLimit_;
4056        }
4057       
4058        function getShares()
4059        {
4060                return $this->shares_;
4061        }
4062               
4063        function fetchXML()
4064        {
4065                // is a player feed - take details from logged in user
4066                if ($this->API_corpID_ != "") 
4067                {
4068                        $myKeyString = "corporationID=" . $this->API_corpID_;
4069                        $this->CharName_ = $this->API_corpID_;
4070                        $data = $this->loaddata($myKeyString);
4071                       
4072                } elseif (user::get('usr_pilot_id')) {
4073                        require_once('class.pilot.php');
4074                        $plt = new pilot(user::get('usr_pilot_id'));
4075                        $usersname = $plt->getName();
4076                       
4077                        $this->CharName_ = $usersname;
4078                       
4079                        $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "' . $usersname . '"';
4080
4081                $qry = new DBQuery();
4082                        $qry->execute($sql);
4083                        $row = $qry->getRow();
4084
4085                $pilot_id = $row['plt_id'];
4086                $API_charID = $row['plt_externalid'];
4087
4088                if ( $pilot_id == 0 )
4089                        {
4090                        return "Something went wrong with finding pilots external ID<br>";
4091                }
4092               
4093                        $newsql = 'SELECT userID , apiKey FROM kb3_api_user WHERE charID = "' . $API_charID . '"';
4094                        $qry->execute($newsql);
4095                $userrow = $qry->getRow();
4096               
4097                        $API_userID = $userrow['userID'];
4098                        $API_apiKey = $userrow['apiKey'];
4099                       
4100                        $myKeyString = "userID=" . $API_userID . "&apiKey=" . $API_apiKey . "&characterID=" . $API_charID;
4101                               
4102                        $data = $this->loaddata($myKeyString);
4103                } else {
4104                        if (($this->API_userID_ != "") && ($this->API_apiKey_ != "") && ($this->API_charID_ != ""))
4105                        {
4106                                $myKeyString = "userID=" . $this->API_userID_ . "&apiKey=" . $this->API_apiKey_ . "&characterID=" . $this->API_charID_;
4107                                $this->CharName_ = $this->API_charID_;
4108                                $data = $this->loaddata($myKeyString);
4109                        } else {
4110                                return "You are not logged in and have not set API details.";
4111                        }
4112                }
4113
4114        $xml_parser = xml_parser_create();
4115        xml_set_object ( $xml_parser, $this );
4116        xml_set_element_handler($xml_parser, "startElement", "endElement");
4117        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4118
4119        if (!xml_parse($xml_parser, $data, true))
4120            return "<i>Error getting XML data from api.eve-online.com/CorporationSheet.xml.aspx  </i><br><br>";
4121
4122        xml_parser_free($xml_parser);
4123               
4124                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
4125        }
4126       
4127        function startElement($parser, $name, $attribs) 
4128    {
4129                $this->characterDataValue = "";
4130               
4131                if ($name == "DESCRIPTION")
4132                {
4133                        $this->DataIsDescription = true;
4134                        //$this->characterDataValue = "";
4135                } else {
4136                        $this->DataIsDescription = false;
4137                }
4138    }                           
4139
4140    function endElement($parser, $name) 
4141    {
4142                // Details
4143                switch ($name) 
4144        {
4145                        case "ERROR":
4146                                $this->html .= $this->characterDataValue;
4147                break;
4148                        case "CORPORATIONID":
4149                                $this->corporationID_ = $this->characterDataValue;
4150                break;         
4151                        case "CORPORATIONNAME":
4152                                $this->corporationName_ = $this->characterDataValue;
4153                break; 
4154                        case "TICKER":
4155                                $this->ticker_ = $this->characterDataValue;
4156                break; 
4157                        case "CEOID":
4158                                $this->ceoID_ = $this->characterDataValue;
4159                break;
4160                        case "CEONAME":
4161                                $this->ceoName_ = $this->characterDataValue;
4162                break;
4163                        case "STATIONID":
4164                                $this->stationID_ = $this->characterDataValue; 
4165                break;
4166                        case "STATIONNAME":
4167                                $this->stationName_ = $this->characterDataValue;
4168                break;
4169                        case "DESCRIPTION":
4170                                $this->description_ = $this->characterDataValue;
4171                break;
4172                        case "URL":
4173                                $this->url_ = $this->characterDataValue;
4174                break;
4175                        case "ALLIANCEID":
4176                                $this->allianceID_ = $this->characterDataValue;
4177                break;
4178                        case "ALLIANCENAME":
4179                                $this->allianceName_ = $this->characterDataValue;
4180                break;
4181                        case "TAXRATE":
4182                                $this->taxRate_ = $this->characterDataValue;
4183                break;
4184                        case "MEMBERCOUNT":
4185                                $this->memberCount_ = $this->characterDataValue;
4186                break;
4187                        case "MEMBERLIMIT":
4188                                $this->memberLimit_ = $this->characterDataValue;
4189                break;
4190                        case "SHARES":
4191                                $this->shares_ = $this->characterDataValue;     
4192                break;
4193                               
4194                        case "GRAPHICID":
4195                                $this->logo_["graphicID"] = $this->characterDataValue;
4196                break;
4197                        case "SHAPE1":
4198                                $this->logo_["shape1"] = $this->characterDataValue;
4199                break;
4200                        case "SHAPE2":
4201                                $this->logo_["shape2"] = $this->characterDataValue;
4202                break;
4203                        case "SHAPE3":
4204                                $this->logo_["shape3"] = $this->characterDataValue;
4205                break;
4206                        case "COLOR1":
4207                                $this->logo_["colour1"] = $this->characterDataValue;
4208                break; 
4209                        case "COLOR2":
4210                                $this->logo_["colour2"] = $this->characterDataValue;
4211                break; 
4212                        case "COLOR3":
4213                                $this->logo_["colour3"] = $this->characterDataValue;
4214                break; 
4215                }
4216                       
4217                if ($name == "CURRENTTIME")
4218                        $this->CurrentTime_ = $this->characterDataValue;
4219                if ($name == "CACHEDUNTIL")
4220                {
4221                        $this->CachedUntil_ = $this->characterDataValue;
4222                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
4223                        ApiCache::set( $this->CharName_ . '_CorporationSheet' , $this->characterDataValue);
4224                }
4225    }
4226
4227    function characterData($parser, $data) 
4228    {
4229                //  This is a fix for some hosts that strip "<" and ">" from the API XML when it's put into a string. I have no idea why this happens, where or how - but this puts them back
4230                if ($this->DataIsDescription)
4231                {
4232                        if ( $data == "<" )
4233                        {
4234                                $this->tagsareworking = true;
4235                        }
4236               
4237                        if (!$this->tagsareworking)
4238                        {
4239                                if ( ($data == "br") || ($data == "b") || ($data == "/a") || ($data == "/b") || ($data == "/font") || (substr($data,0,4)== "font") || (substr($data,0,6)== "a href"))
4240                                {
4241                                        $data = "<" .$data.">";
4242                                }
4243                        }
4244                        $this->characterDataValue .= $data;
4245                } else {
4246                        $this->characterDataValue = $data;
4247                }
4248               
4249               
4250                //echo $data;
4251    }
4252       
4253        function loaddata($keystring)
4254    {   
4255                $configvalue = $this->CharName_ . '_CorporationSheet';
4256               
4257                $CachedTime = ApiCache::get($configvalue);
4258                $UseCaching = config::get('API_UseCache');
4259
4260        $url = "http://api.eve-online.com/corp/CorporationSheet.xml.aspx" . $keystring;
4261
4262        $path = '/corp/CorporationSheet.xml.aspx';
4263               
4264                // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
4265                if ($CachedTime == "")
4266        {
4267                $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
4268        }
4269               
4270                if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
4271                        $cacheexists = true;
4272                else
4273                        $cacheexists = false;
4274                       
4275                // if API_UseCache = 1 (off) then don't use cache
4276                if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )
4277        {
4278                $fp = fsockopen("api.eve-online.com", 80);
4279
4280                if (!$fp)
4281                {
4282                $this->Output_ .= "Could not connect to API URL";
4283                } else {
4284                        // request the xml
4285                fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4286                fputs ($fp, "Host: api.eve-online.com\r\n");
4287                fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4288                fputs ($fp, "User-Agent: PHPApi\r\n");
4289                fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
4290                fputs ($fp, "Connection: close\r\n\r\n");
4291                fputs ($fp, $keystring."\r\n");
4292
4293                        // retrieve contents
4294                $contents = "";
4295                while (!feof($fp))
4296                {
4297                        $contents .= fgets($fp);
4298                }
4299
4300                // close connection
4301                fclose($fp);
4302
4303                $start = strpos($contents, "?>");
4304                if ($start !== FALSE)
4305                {
4306                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
4307                }
4308                               
4309                                // Save the file if we're caching (0 = true in Thunks world)
4310                                if ($UseCaching == 0) 
4311                                {
4312                                        $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
4313                                fwrite($file, $contents);
4314                                fclose($file);
4315                                        @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
4316                                } 
4317                } 
4318                } else {
4319                        // re-use cached XML
4320                        if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
4321                $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
4322                        fclose($fp);
4323                } else {
4324                                return "<i>error loading cached file ".$configvalue.".xml</i><br><br>"; 
4325                }
4326                }
4327        return $contents;
4328    }
4329}
4330// **********************************************************************************************************************************************
4331// ****************                                   API Name -> ID Conversion /eve/CharacterID.xml.aspx                            ****************
4332// **********************************************************************************************************************************************
4333class API_NametoID 
4334{               
4335        function getCachedUntil()
4336        {
4337                return $this->CachedUntil_;
4338        }
4339       
4340        function getCurrentTime()
4341        {
4342                return $this->CurrentTime_;
4343        }
4344       
4345        function setNames($names)
4346        {
4347                $this->API_Names_ = $names;
4348        }
4349        function getNameData()
4350        {
4351                return $this->NameData_;
4352        }
4353       
4354        function clear()
4355        {
4356                $this->NameData_ = array();
4357                unset($this->NameData_);
4358        }
4359       
4360        function fetchXML()
4361        {
4362                if ($this->API_Names_ != "") 
4363                {
4364                        $myKeyString = "names=" . $this->API_Names_;
4365                        $data = $this->loaddata($myKeyString);
4366                } else {
4367                        return "No Names have been input.";
4368                }
4369
4370        $xml_parser = xml_parser_create();
4371        xml_set_object ( $xml_parser, $this );
4372        xml_set_element_handler($xml_parser, "startElement", "endElement");
4373        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4374
4375        if (!xml_parse($xml_parser, $data, true))
4376            return "<i>Error getting XML data from api.eve-online.com/CharacterID.xml.aspx  </i><br><br>";
4377
4378        xml_parser_free($xml_parser);
4379               
4380                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
4381        }
4382       
4383        function startElement($parser, $name, $attribs) 
4384    {
4385                global $NameData;
4386               
4387                if ($name == "ROW") 
4388        { 
4389            if (count($attribs)) 
4390            {
4391                foreach ($attribs as $k => $v) 
4392                {
4393                    switch ($k) 
4394                    {
4395                        case "NAME":
4396                            $NameData['name'] = $v;
4397                            break;
4398                        case "CHARACTERID": 
4399                            $NameData['characterID'] = $v;
4400                            break;
4401                    }
4402                }
4403            }
4404        }
4405    }                           
4406
4407    function endElement($parser, $name) 
4408    {
4409                global $NameData;
4410               
4411                // Details
4412                if ($name == "ERROR")
4413                        $this->html .= $this->characterDataValue;
4414               
4415                if ($name == "ROW")
4416                {
4417                        $this->NameData_[] = $NameData;
4418                        $NameData = array();
4419                        unset($NameData);
4420                }
4421                       
4422                if ($name == "CURRENTTIME")
4423                        $this->CurrentTime_ = $this->characterDataValue;
4424                if ($name == "CACHEDUNTIL") // cache not needed for this process
4425                {
4426                        $this->CachedUntil_ = $this->characterDataValue;
4427                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
4428                        //ApiCache::set( $this->CharName_ . 'CharacterID' , $this->characterDataValue);
4429                } 
4430    }
4431
4432    function characterData($parser, $data) 
4433    {
4434                $this->characterDataValue = $data;
4435    }
4436       
4437        function loaddata($keystring)
4438    {   
4439        $url = "http://api.eve-online.com/eve/CharacterID.xml.aspx" . $keystring;
4440
4441        $path = '/eve/CharacterID.xml.aspx';
4442               
4443               
4444        $fp = fsockopen("api.eve-online.com", 80);
4445
4446        if (!$fp)
4447        {
4448            $this->Output_ .= "Could not connect to API URL";
4449        } else {
4450                 // request the xml
4451            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4452            fputs ($fp, "Host: api.eve-online.com\r\n");
4453            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4454            fputs ($fp, "User-Agent: PHPApi\r\n");
4455            fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
4456            fputs ($fp, "Connection: close\r\n\r\n");
4457            fputs ($fp, $keystring."\r\n");
4458
4459                 // retrieve contents
4460            $contents = "";
4461            while (!feof($fp))
4462            {
4463                $contents .= fgets($fp);
4464            }
4465
4466            // close connection
4467            fclose($fp);
4468
4469            $start = strpos($contents, "?>");
4470            if ($start !== FALSE)
4471            {
4472                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
4473            }
4474        } 
4475
4476        return $contents;
4477    }
4478}
4479// **********************************************************************************************************************************************
4480// ****************                                   API ID -> Name Conversion /eve/CharacterID.xml.aspx                            ****************
4481// **********************************************************************************************************************************************
4482class API_IDtoName 
4483{               
4484        function getCachedUntil()
4485        {
4486                return $this->CachedUntil_;
4487        }
4488       
4489        function getCurrentTime()
4490        {
4491                return $this->CurrentTime_;
4492        }
4493       
4494        function setIDs($IDs)
4495        {
4496                $this->API_IDs_ = $IDs;
4497        }
4498        function getIDData()
4499        {
4500                return $this->NameData_;
4501        }
4502       
4503        function clear()
4504        {
4505                $this->NameData_ = array();
4506                unset($this->NameData_);
4507        }
4508       
4509        function fetchXML()
4510        {
4511                if ($this->API_IDs_ != "") 
4512                {
4513                        $myKeyString = "ids=" . $this->API_IDs_;
4514                        $data = $this->loaddata($myKeyString);
4515                } else {
4516                        return "No IDs have been input.";
4517                }
4518
4519        $xml_parser = xml_parser_create();
4520        xml_set_object ( $xml_parser, $this );
4521        xml_set_element_handler($xml_parser, "startElement", "endElement");
4522        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4523
4524        if (!xml_parse($xml_parser, $data, true))
4525            return "<i>Error getting XML data from api.eve-online.com/CharacterName.xml.aspx  </i><br><br>";
4526
4527        xml_parser_free($xml_parser);
4528               
4529                return $this->html; // should be empty, but keeping just incase - errors are returned by Text so worth looking anyway.
4530        }
4531       
4532        function startElement($parser, $name, $attribs) 
4533    {
4534                global $NameData;
4535               
4536                if ($name == "ROW") 
4537        { 
4538            if (count($attribs)) 
4539            {
4540                foreach ($attribs as $k => $v) 
4541                {
4542                    switch ($k) 
4543                    {
4544                        case "NAME":
4545                            $NameData['name'] = $v;
4546                            break;
4547                        case "CHARACTERID": 
4548                            $NameData['characterID'] = $v;
4549                            break;
4550                    }
4551                }
4552            }
4553        }
4554    }                           
4555
4556    function endElement($parser, $name) 
4557    {
4558                global $NameData;
4559               
4560                // Details
4561                if ($name == "ERROR")
4562                        $this->html .= $this->characterDataValue;
4563               
4564                if ($name == "ROW")
4565                {
4566                        $this->NameData_[] = $NameData;
4567                        $NameData = array();
4568                        unset($NameData);
4569                }
4570                       
4571                if ($name == "CURRENTTIME")
4572                        $this->CurrentTime_ = $this->characterDataValue;
4573                if ($name == "CACHEDUNTIL") // cache not needed for this process
4574                {
4575                        $this->CachedUntil_ = $this->characterDataValue;
4576                        //ApiCache::set('API_eve_RefTypes' , $this->characterDataValue);
4577                        //ApiCache::set( $this->CharName_ . 'CharacterID' , $this->characterDataValue);
4578                } 
4579    }
4580
4581    function characterData($parser, $data) 
4582    {
4583                $this->characterDataValue = $data;
4584    }
4585       
4586        function loaddata($keystring)
4587    {   
4588        $url = "http://api.eve-online.com/eve/CharacterName.xml.aspx" . $keystring;
4589
4590        $path = '/eve/CharacterName.xml.aspx';
4591               
4592               
4593        $fp = fsockopen("api.eve-online.com", 80);
4594
4595        if (!$fp)
4596        {
4597            $this->Output_ .= "Could not connect to API URL";
4598        } else {
4599                 // request the xml
4600            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4601            fputs ($fp, "Host: api.eve-online.com\r\n");
4602            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4603            fputs ($fp, "User-Agent: PHPApi\r\n");
4604            fputs ($fp, "Content-Length: " . strlen($keystring) . "\r\n");
4605            fputs ($fp, "Connection: close\r\n\r\n");
4606            fputs ($fp, $keystring."\r\n");
4607
4608                 // retrieve contents
4609            $contents = "";
4610            while (!feof($fp))
4611            {
4612                $contents .= fgets($fp);
4613            }
4614
4615            // close connection
4616            fclose($fp);
4617
4618            $start = strpos($contents, "?>");
4619            if ($start !== FALSE)
4620            {
4621                        $contents = substr($contents, $start + strlen("\r\n\r\n"));
4622            }
4623        } 
4624
4625        return $contents;
4626    }
4627}
4628
4629// **********************************************************************************************************************************************
4630// ****************                                API Server Status - /server/ServerStatus.xml.aspx                             ****************
4631// **********************************************************************************************************************************************
4632
4633class API_ServerStatus
4634{
4635   function getCachedUntil()
4636   {
4637      return $this->CachedUntil_;
4638   }
4639   
4640   function getCurrentTime()
4641   {
4642      return $this->CurrentTime_;
4643   }
4644   
4645   function getserverOpen()
4646   {
4647      return $this->serverOpen_;
4648   }
4649   
4650   function getonlinePlayers()
4651   {
4652      return $this->onlinePlayers_;
4653   }
4654
4655    function fetchXML() 
4656    {
4657        $data = LoadGlobalData('/server/ServerStatus.xml.aspx');
4658
4659        $xml_parser = xml_parser_create();
4660        xml_set_object ( $xml_parser, $this );
4661        xml_set_element_handler($xml_parser, "startElement", "endElement");
4662        xml_set_character_data_handler ( $xml_parser, 'characterData' );
4663
4664        if (!xml_parse($xml_parser, $data, true))
4665            return "<i>Error getting XML data from api.eve-online.com/server/ServerStatus.xml.aspx</i><br><br>";
4666
4667        xml_parser_free($xml_parser);
4668     
4669        return $this->html;
4670    }
4671
4672        function startElement($parser, $name, $attribs)
4673    {
4674    // nothing to do here...
4675    }
4676
4677    function endElement($parser, $name) 
4678    {
4679      global $tempvalue;
4680     
4681      if ($name == "CURRENTTIME")
4682         $this->CurrentTime_ = $tempvalue;
4683      if ($name == "SERVEROPEN")
4684         $this->serverOpen_ = $tempvalue;
4685      if ($name == "ONLINEPLAYERS")
4686         $this->onlinePlayers_ = $tempvalue;
4687      if ($name == "CACHEDUNTIL")
4688      {
4689         $this->CachedUntil_ = $tempvalue;
4690                 ApiCache::set( 'API_server_ServerStatus' , $tempvalue);
4691      }
4692    }
4693   
4694        function characterData($parser, $data) 
4695    {
4696      global $tempvalue;
4697       
4698      $tempvalue = $data;
4699    }
4700}
4701
4702// **********************************************************************************************************************************************
4703// **********************************************************************************************************************************************
4704// ****************                                                               GENERIC FUNCTIONS                                                                  ****************
4705// **********************************************************************************************************************************************
4706// **********************************************************************************************************************************************
4707
4708// **********************************************************************************************************************************************
4709// ****************                                                                Load Generic XML                                                                  ****************
4710// **********************************************************************************************************************************************
4711
4712// loads a generic XML sheet that requires no API Login as such
4713function LoadGlobalData($path) 
4714{
4715        $temppath = substr($path, 0, strlen($path) - 14);
4716        $configvalue = "API" . str_replace("/", "_", $temppath);
4717               
4718        $CachedTime = ApiCache::get($configvalue);
4719        $UseCaching = config::get('API_UseCache');
4720               
4721        // API Caching system, If we're still under cachetime reuse the last XML, if not download the new one. Helps with Bug hunting and just better all round.
4722        if ($CachedTime == "")
4723    {
4724        $CachedTime = "2005-01-01 00:00:00"; // fake date to ensure that it runs first time.
4725    }
4726               
4727        if (is_file(getcwd().'/cache/api/'.$configvalue.'.xml'))
4728                $cacheexists = true;
4729        else
4730                $cacheexists = false;
4731       
4732        if ((strtotime(gmdate("M d Y H:i:s")) - strtotime($CachedTime) > 0) || ($UseCaching == 1)  || !$cacheexists )// if API_UseCache = 1 (off) then don't use cache
4733    {
4734        $fp = fsockopen("api.eve-online.com", 80);
4735
4736        if (!$fp)
4737        {
4738            echo "Error", "Could not connect to API URL<br>";
4739        } else {
4740            // request the xml
4741            fputs ($fp, "POST " . $path . " HTTP/1.0\r\n");
4742            fputs ($fp, "Host: api.eve-online.com\r\n");
4743            fputs ($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
4744            fputs ($fp, "User-Agent: PHPApi\r\n");
4745            fputs ($fp, "Content-Length: 0\r\n");
4746            fputs ($fp, "Connection: close\r\n\r\n");
4747            fputs ($fp, "\r\n");
4748
4749                 // retrieve contents
4750            $contents = "";
4751                 while (!feof($fp))
4752            {
4753                $contents .= fgets($fp);
4754            }
4755
4756            // close connection
4757            fclose($fp);
4758
4759            $start = strpos($contents, "?>");
4760            if ($start != false)
4761            {
4762                $contents = substr($contents, $start + strlen("\r\n\r\n"));
4763            }
4764                       
4765                        // Save the file if we're caching (0 = true in Thunks world)
4766                        if ( $UseCaching == 0 ) 
4767                        {
4768                                $file = fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'w+');
4769                        fwrite($file, $contents);
4770                        fclose($file);
4771                                @chmod(getcwd().'/cache/api/'.$configvalue.'.xml',0666);
4772                        } 
4773        } 
4774        } else {
4775                // re-use cached XML
4776                if ($fp = @fopen(getcwd().'/cache/api/'.$configvalue.'.xml', 'r')) {
4777            $contents = fread($fp, filesize(getcwd().'/cache/api/'.$configvalue.'.xml'));
4778                fclose($fp);
4779        } else {
4780                        return "<i>error loading cached file ".$configvalue.".xml</i><br><br>"; 
4781        }
4782        }
4783        return $contents;
4784}
4785
4786// **********************************************************************************************************************************************
4787// ****************                                                             Convert ID -> Name                                                                   ****************
4788// **********************************************************************************************************************************************
4789function gettypeIDname($id)
4790{
4791        $sql = 'select inv.typeName from kb3_invtypes inv where inv.typeID = ' . $id;
4792                               
4793    $qry = new DBQuery();
4794    $qry->execute($sql);
4795    $row = $qry->getRow();
4796                       
4797    return $row['typeName'];
4798}
4799
4800// **********************************************************************************************************************************************
4801// ****************                                                             Get GroupID from ID                                                                  ****************
4802// **********************************************************************************************************************************************
4803function getgroupID($id)
4804{
4805        $sql = 'select inv.groupID from kb3_invtypes inv where inv.typeID = ' . $id;
4806                               
4807    $qry = new DBQuery();
4808    $qry->execute($sql);
4809    $row = $qry->getRow();
4810                       
4811    return $row['groupID'];
4812}
4813
4814// **********************************************************************************************************************************************
4815// ****************                                                 Convert groupID -> groupName                                                             ****************
4816// **********************************************************************************************************************************************
4817function getgroupIDname($id)
4818{               
4819        $sql = 'select itt.itt_name from kb3_item_types itt where itt.itt_id = ' . $id;
4820       
4821    $qry = new DBQuery();
4822    $qry->execute($sql);
4823    $row = $qry->getRow();
4824       
4825        return $row['itt_name'];
4826}
4827
4828// **********************************************************************************************************************************************
4829// ****************                                                             Get Skill Rank from ID                                                       ****************
4830// **********************************************************************************************************************************************
4831function gettypeIDrank($id)
4832{
4833        $sql = 'select att.value from kb3_dgmtypeattributes att where att.typeID = ' . $id . ' and att.attributeID = 275';
4834                               
4835    $qry = new DBQuery();
4836    $qry->execute($sql);
4837    $row = $qry->getRow();
4838                       
4839    return $row['value'];
4840}
4841
4842// **********************************************************************************************************************************************
4843// ****************                                                 Convert MoonID -> MoonName                                                               ****************
4844// **********************************************************************************************************************************************
4845function getMoonName($id)
4846{
4847        if ($id != 0)
4848        {
4849                $sql = 'select moon.itemID, moon.itemName from kb3_moons moon where moon.itemID = '.$id;
4850
4851        $qry = new DBQuery();
4852        $qry->execute($sql);
4853        $row = $qry->getRow();
4854                                               
4855        return $row['itemName'];
4856        } else {
4857                return "Unknown";
4858        }                               
4859}
4860
4861// **********************************************************************************************************************************************
4862// ****************                                                             Find Thunky                                                                          ****************
4863// **********************************************************************************************************************************************
4864function FindThunk()
4865{ // round about now would probably be a good time for apologising about my sense of humour :oD
4866    $sql = 'select plts.plt_id, plts.plt_externalid from kb3_pilots plts where plts.plt_name = "Captain Thunk"';
4867
4868    $qry = new DBQuery();
4869    $qry->execute($sql);
4870    $row = $qry->getRow();
4871
4872    $pilot_id = $row['plt_id'];
4873    $pilot_charid = $row['plt_externalid'];
4874
4875    if ( $pilot_id != 0 )       {
4876        return '<a href="?a=pilot_detail&amp;plt_id=' . $pilot_id . '" ><font size="2">Captain Thunk</font></a>';
4877    } else {
4878        return "Captain Thunk";
4879    }
4880}
4881
4882// **********************************************************************************************************************************************
4883// ****************                                                      Update  CCP CorpID                                                                  ****************
4884// **********************************************************************************************************************************************
4885function Update_CorpID($corpName, $corpID)
4886{
4887        if ( (strlen($corpName) != 0) && ($corpID != 0) )
4888        {       
4889                $qry = new DBQuery();
4890                $qry->execute( "SELECT * FROM `kb3_corps` WHERE `crp_name` = '" . slashfix($corpName) . "'");
4891               
4892                if ($qry->recordCount() != 0)
4893        {
4894                        $row = $qry->getRow();
4895                        if ($row['crp_external_id'] == NULL)
4896                        {
4897                                $qry->execute("update kb3_corps set crp_external_id = " . $corpID . " where `crp_id` = " . $row['crp_id']);
4898                        }
4899                }
4900        }
4901}
4902
4903// **********************************************************************************************************************************************
4904// ****************                                                     Update CCP AllianceID                                                                ****************
4905// **********************************************************************************************************************************************
4906function Update_AllianceID($allianceName, $allianceID)
4907{
4908        if ( ($allianceName != "NONE") && ($allianceID != 0) )
4909        {
4910                $qry = new DBQuery();
4911                $qry->execute( "SELECT * FROM `kb3_alliances` WHERE `all_name` = '" . slashfix($allianceName) . "'");
4912               
4913                if ($qry->recordCount() != 0)
4914        {
4915                        $row = $qry->getRow();
4916                        if ($row['all_external_id'] == NULL)
4917                        {
4918                                $qry->execute("update kb3_alliances set all_external_id = " . $allianceID . " where `all_id` = " . $row['all_id']);
4919                        }
4920                }
4921        }
4922}
4923
4924// **********************************************************************************************************************************************
4925// ****************                                     Convert GMT Timestamp to local time                                                          ****************
4926// **********************************************************************************************************************************************
4927function ConvertTimestamp($timeStampGMT)
4928{
4929        if (!config::get('API_ConvertTimestamp'))
4930        {
4931                // set gmt offset
4932                $gmoffset = (strtotime(date("M d Y H:i:s")) - strtotime(gmdate("M d Y H:i:s")));
4933                //if (!config::get('API_ForceDST'))
4934                        //$gmoffset = $gmoffset + 3600;
4935               
4936                $cachetime = date("Y-m-d H:i:s",  strtotime($timeStampGMT) + $gmoffset);
4937        } else {
4938                $cachetime = $timeStampGMT;
4939        }
4940       
4941        return $cachetime;
4942}
4943?>
Note: See TracBrowser for help on using the browser.