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

Revision 404, 158.5 KB (checked in by kovell, 13 years ago)

Fixes: db debug code no longer errors on some setups. upgrade now gives updates on progress. apicache returned to index.php for better eve api compatibility. cache options now has clear summary cache option. siglist shows correct urls. summary cache correctly updates. feedfetcher excludes kills before exclude date. exclude date on kills works

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