root/dev/common/includes/class.contract.php @ 240

Revision 240, 24.8 KB (checked in by ralle030583, 15 years ago)

Implemented exi's involvedloader class

Line 
1<?php
2require_once("db.php");
3require_once("class.killlist.php");
4require_once("class.graph.php");
5require_once("class.pagesplitter.php");
6
7class Contract
8{
9    function Contract($ctr_id = 0)
10    {
11        $this->ctr_id_ = $ctr_id;
12        $this->contracttargets_ = array();
13
14        // overall kill/losslist
15        $this->klist_ = new KillList();
16        $this->llist_ = new KillList();
17        involved::load($this->klist_,'kill');
18        involved::load($this->llist_,'loss');
19        $this->contractpointer_ = 0;
20        $this->qry_ = null;
21    }
22
23    function execQuery()
24    {
25        if ($this->qry_)
26            return;
27
28        $this->qry_ = new DBQuery();
29        // general
30        $sql = "select * from kb3_contracts ctr
31                where ctr.ctr_id = ".$this->ctr_id_;
32
33        $this->qry_ = new DBQuery();
34        if (!$this->qry_->execute($sql))
35            die($this->qry_->getErrorMsg());
36
37        $row = $this->qry_->getRow();
38        $this->ctr_name_ = $row['ctr_name'];
39        $this->ctr_started_ = $row['ctr_started'];
40        $this->ctr_ended_ = $row['ctr_ended'];
41        $this->campaign_ = ($row['ctr_campaign'] == "1");
42
43        // get corps & alliances for contract
44        $sql = "select ctd.ctd_crp_id, ctd.ctd_all_id, ctd.ctd_reg_id, ctd.ctd_sys_id
45                from kb3_contract_details ctd
46                where ctd.ctd_ctr_id = ".$row['ctr_id']."
47                    order by 3, 2, 1";
48
49        $caqry = new DBQuery();
50        if (!$caqry->execute($sql))
51        {
52            include_once('autoupgrade.php');
53            check_contracts();
54            $caqry->execute($sql);
55        }
56
57        while ($carow = $caqry->getRow())
58        {
59            $contracttarget = &new ContractTarget($this, $carow['ctd_crp_id'], $carow['ctd_all_id'], $carow['ctd_reg_id'], $carow['ctd_sys_id']);
60            array_push($this->contracttargets_, $contracttarget);
61            if ($carow['ctd_crp_id'])
62            {
63                $this->klist_->addVictimCorp(new Corporation($carow['ctd_crp_id']));
64                $this->llist_->addInvolvedCorp(new Corporation($carow['ctd_crp_id']));
65            }
66            elseif ($carow['ctd_all_id'])
67            {
68                $this->klist_->addVictimAlliance(new Alliance($carow['ctd_all_id']));
69                $this->llist_->addInvolvedAlliance(new Alliance($carow['ctd_all_id']));
70            }
71            elseif ($carow['ctd_reg_id'])
72            {
73                $this->klist_->addRegion(new Region($carow['ctd_reg_id']));
74                $this->llist_->addRegion(new Region($carow['ctd_reg_id']));
75            }
76            elseif ($carow['ctd_sys_id'])
77            {
78                $this->klist_->addSystem(new SolarSystem($carow['ctd_sys_id']));
79                $this->llist_->addSystem(new SolarSystem($carow['ctd_sys_id']));
80            }
81        }
82
83        $this->klist_->setStartDate($this->getStartDate());
84        $this->llist_->setStartDate($this->getStartDate());
85        if ($this->getEndDate() != "")
86        {
87            $this->klist_->setEndDate($this->getEndDate());
88            $this->llist_->setEndDate($this->getEndDate());
89        }
90    }
91
92    function getID()
93    {
94        return $this->ctr_id_;
95    }
96
97    function getName()
98    {
99        $this->execQuery();
100        return $this->ctr_name_;
101    }
102
103    function getStartDate()
104    {
105        $this->execQuery();
106        return $this->ctr_started_;
107    }
108
109    function getEndDate()
110    {
111        $this->execQuery();
112        return $this->ctr_ended_;
113    }
114
115    function getRunTime()
116    {
117        if (!$datet = $this->getEndDate())
118        {
119            $datet = 'now';
120        }
121
122        $diff = strtotime($datet) - strtotime($this->getStartDate());
123        return floor($diff/86400);
124    }
125
126    function getCampaign()
127    {
128        $this->execQuery();
129        return $this->campaign_;
130    }
131
132    function getCorps()
133    {
134        $this->execQuery();
135        return $this->corps_;
136    }
137
138    function getAlliances()
139    {
140        $this->execQuery();
141        return $this->alliances_;
142    }
143
144    function getKills()
145    {
146        $this->execQuery();
147        return $this->klist_->getCount();
148    }
149
150    function getLosses()
151    {
152        $this->execQuery();
153        return $this->llist_->getCount();
154    }
155
156    function getKillISK()
157    {
158        $this->execQuery();
159        if (!$this->klist_->getISK()) $this->klist_->getAllKills();
160        return $this->klist_->getISK();
161    }
162
163    function getLossISK()
164    {
165        $this->execQuery();
166        if (!$this->llist_->getISK()) $this->llist_->getAllKills();
167        return $this->llist_->getISK();
168    }
169
170    function getEfficiency()
171    {
172        $this->execQuery();
173        if ($this->klist_->getISK())
174            $efficiency = round($this->klist_->getISK() / ($this->klist_->getISK() + $this->llist_->getISK()) * 100, 2);
175        else
176            $efficiency = 0;
177
178        return $efficiency;
179    }
180
181    function getKillList()
182    {
183        $this->execQuery();
184        return $this->klist_;
185    }
186
187    function getLossList()
188    {
189        $this->execQuery();
190        return $this->llist_;
191    }
192
193    function getContractTarget()
194    {
195        if ($this->contractpointer_ > 30)
196            return null;
197
198        $target = $this->contracttargets_[$this->contractpointer_];
199        if ($target)
200            $this->contractpointer_++;
201        return $target;
202    }
203
204    function add($name, $type, $startdate, $enddate = "")
205    {
206        $qry = new DBQuery();
207        if ($type == "campaign") $campaign = 1;
208        else $campaign = 0;
209        if ($enddate != "") $enddate = "'".$enddate." 23:59:59'";
210        else $enddate = "null";
211
212        if (!$this->ctr_id_)
213        {
214            $sql = "insert into kb3_contracts values ( null, '".$name."',
215                                                   '".KB_SITE."', ".$campaign.",
216                                                   '".$startdate." 00:00:00',
217                                                   ".$enddate." )";
218            $qry->execute($sql) or die($qry->getErrorMsg());
219            $this->ctr_id_ = $qry->getInsertID();
220        }
221        else
222        {
223            $sql = "update kb3_contracts set ctr_name = '".$name."',
224                                         ctr_started = '".$startdate." 00:00:00',
225                                         ctr_ended = ".$enddate."
226                                     where ctr_id = ".$this->ctr_id_;
227            $qry->execute($sql) or die($qry->getErrorMsg());
228            $this->ctr_id_ = $qry->getInsertID();
229        }
230    }
231
232    function remove()
233    {
234        $qry = new DBQuery();
235
236        $qry->execute("delete from kb3_contracts
237                       where ctr_id = ".$this->ctr_id_);
238
239        $qry->execute("delete from kb3_contract_details
240                       where ctd_ctr_id = ".$this->ctr_id_);
241    }
242
243    function validate()
244    {
245        $qry = new DBQuery();
246
247        $qry->execute("select * from kb3_contracts
248                       where ctr_id = ".$this->ctr_id_."
249                         and ctr_site = '".KB_SITE."'");
250        return ($qry->recordCount() > 0);
251    }
252}
253
254class ContractTarget
255{
256    function ContractTarget($contract, $crp_id, $all_id, $reg_id , $sys_id)
257    {
258        $this->contract_ = $contract;
259        $this->crp_id_ = $crp_id;
260        $this->all_id_ = $all_id;
261        $this->reg_id_ = $reg_id;
262        $this->sys_id_ = $sys_id;
263
264        $this->klist_ = &new KillList();
265        $this->llist_ = &new KillList();
266
267        if ($this->crp_id_)
268        {
269            $this->type_ = "corp";
270            $this->klist_->addVictimCorp(new Corporation($this->crp_id_));
271            $this->llist_->addInvolvedCorp(new Corporation($this->crp_id_));
272            $this->id_ = $this->crp_id_;
273        }
274        elseif ($this->all_id_)
275        {
276            $this->type_ = "alliance";
277            $this->klist_->addVictimAlliance(new Alliance($this->all_id_));
278            $this->llist_->addInvolvedAlliance(new Alliance($this->all_id_));
279            $this->id_ = $this->all_id_;
280        }
281        elseif ($this->reg_id_)
282        {
283            $this->type_ = "region";
284            $this->klist_->addRegion(new Region($this->reg_id_));
285            $this->llist_->addRegion(new Region($this->reg_id_));
286            $this->id_ = $this->reg_id_;
287        }
288        elseif ($this->sys_id_)
289        {
290            $this->type_ = "system";
291            $this->klist_->addSystem(new SolarSystem($this->sys_id_));
292            $this->llist_->addSystem(new SolarSystem($this->sys_id_));
293            $this->id_ = $this->sys_id_;
294        }
295       
296        involved::load($this->klist_,'kill');
297        involved::load($this->llist_,'loss');
298
299        $this->klist_->setStartDate($contract->getStartDate());
300        $this->llist_->setStartDate($contract->getStartDate());
301        if ($contract->getEndDate() != "")
302        {
303            $this->klist_->setEndDate($contract->getEndDate());
304            $this->llist_->setEndDate($contract->getEndDate());
305        }
306    }
307
308    function getID()
309    {
310        return $this->id_;
311    }
312
313    function getName()
314    {
315        if ($this->name_ == "")
316        {
317            $qry = new DBQuery();
318            switch ($this->type_)
319            {
320                case "corp":
321                    $qry->execute("select crp_name as name from kb3_corps where crp_id = ".$this->crp_id_);
322                    break;
323                case "alliance":
324                    $qry->execute("select all_name as name from kb3_alliances where all_id = ".$this->all_id_);
325                    break;
326                case "region":
327                    $qry->execute("select reg_name as name from kb3_regions where reg_id = ".$this->reg_id_);
328                    break;
329                case "system":
330                    $qry->execute("select sys_name as name from kb3_systems where sys_id = ".$this->sys_id_);
331                    break;
332            }
333            $row = $qry->getRow();
334            $this->name_ = $row['name'];
335        }
336        return $this->name_;
337    }
338
339    function getType()
340    {
341        return $this->type_;
342    }
343
344    function getKillList()
345    {
346        return $this->klist_;
347    }
348
349    function getLossList()
350    {
351        return $this->llist_;
352    }
353
354    function getEfficiency()
355    {
356        if ($this->klist_->getISK())
357            $efficiency = round($this->klist_->getISK() / ($this->klist_->getISK() + $this->llist_->getISK()) * 100, 2);
358        else
359            $efficiency = 0;
360
361        return $efficiency;
362    }
363
364    function getKills()
365    {
366    }
367
368    function getLosses()
369    {
370    }
371
372    function add()
373    {
374        $qry = new DBQuery();
375        $sql = "insert into kb3_contract_details
376                     values ( ".$this->contract_->getID().",";
377        switch ($this->type_)
378        {
379            case "corp":
380                $sql .= $this->id_.", 0, 0, 0 )";
381                break;
382            case "alliance":
383                $sql .= "0, ".$this->id_.", 0, 0 )";
384                break;
385            case "region":
386                $sql .= "0, 0, ".$this->id_.",0 )";
387                break;
388            case "system":
389                $sql .= "0, 0, 0, ".$this->id_." )";
390                break;
391        }
392        $qry->execute($sql) or die($qry->getErrorMsg());
393    }
394
395    function remove()
396    {
397        $qry = new DBQuery();
398        $sql = "delete from kb3_contract_details
399                    where ctd_ctr_id = ".$this->contract_->getID();
400        switch ($this->type_)
401        {
402            case "corp":
403                $sql .= " and ctd_crp_id = ".$this->id_;
404                break;
405            case "alliance":
406                $sql .= " and ctd_all_id = ".$this->id_;
407                break;
408            case "region":
409                $sql .= " and ctd_reg_id = ".$this->id_;
410                break;
411            case "system":
412                $sql .= " and ctd_sys_id = ".$this->id_;
413                break;
414        }
415        $qry->execute($sql) or die($qry->getErrorMsg());
416    }
417}
418
419class ContractList
420{
421    function ContractList()
422    {
423        $this->qry_ = new DBQuery();
424        $this->active_ = "both";
425        $this->contractcounter_ = 1;
426    }
427
428    function execQuery()
429    {
430        if ($this->qry_->executed())
431            return;
432
433        $sql = "select ctr.ctr_id, ctr.ctr_started, ctr.ctr_ended, ctr.ctr_name
434                from kb3_contracts ctr
435               where ctr.ctr_site = '".KB_SITE."'";
436        if ($this->active_ == "yes")
437            $sql .= " and ( ctr_ended is null or now() <= ctr_ended )";
438        elseif ($this->active_ == "no")
439            $sql .= " and ( now() >= ctr_ended )";
440
441        if ($this->campaigns_)
442            $sql .= " and ctr.ctr_campaign = 1";
443        else
444            $sql .= " and ctr.ctr_campaign = 0";
445
446        $sql .= " order by ctr_ended, ctr_started desc";
447        // if ( $this->limit_ )
448        // $sql .= " limit ".( $this->page_ / $this->limit_ ).", ".$this->limit_;
449        $this->qry_ = new DBQuery();
450        $this->qry_->execute($sql) or die($this->qry_->getErrorMsg());
451    }
452
453    function setActive($active)
454    {
455        $this->active_ = $active;
456    }
457
458    function setCampaigns($campaigns)
459    {
460        $this->campaigns_ = $campaigns;
461    }
462
463    function setLimit($limit)
464    {
465        $this->limit_ = $limit;
466    }
467
468    function setPage($page)
469    {
470        $this->page_ = $page;
471        $this->offset_ = ($page * $this->limit_) - $this->limit_;
472    }
473
474    function getContract()
475    {
476        // echo "off: ".$this->offset_."<br>";
477        // echo "cnt: ".$this->contractcounter_."<br>";
478        // echo "limit: ".$this->limit_."<br>";
479        $this->execQuery();
480        if ($this->offset_ && $this->contractcounter_ < $this->offset_)
481        {
482            for ($i = 0; $i < $this->offset_; $i++)
483            {
484                $row = $this->qry_->getRow();
485                $this->contractcounter_++;
486            }
487        }
488        if ($this->limit_ && ($this->contractcounter_ - $this->offset_) > $this->limit_)
489            return null;
490
491        $row = $this->qry_->getRow();
492        if ($row)
493        {
494            $this->contractcounter_++;
495            return new Contract($row['ctr_id']);
496        }
497        else
498            return null;
499    }
500
501    function getCount()
502    {
503        $this->execQuery();
504        return $this->qry_->recordCount();
505    }
506
507    function getActive()
508    {
509        return $this->active_;
510    }
511}
512
513class ContractListTable
514{
515    function ContractListTable($contractlist)
516    {
517        $this->contractlist_ = $contractlist;
518    }
519
520    function paginate($paginate, $page = 1)
521    {
522        if (!$page) $page = 1;
523        $this->paginate_ = $paginate;
524        $this->contractlist_->setLimit($paginate);
525        $this->contractlist_->setPage($page);
526    }
527
528    function getTableStats()
529    {
530        $qry = new DBQuery();
531        while ($contract = $this->contractlist_->getContract())
532        {
533            // generate all neccessary objects within the contract
534            $contract->execQuery();
535
536
537            for ($i = 0; $i < 2; $i++)
538            {
539                if ($i == 0)
540                {
541                    $list = &$contract->llist_;
542                }
543                else
544                {
545                    $list = &$contract->klist_;
546                }
547
548                // take care of the subquery needed (mysql > 4.1)
549                if (KB_MYSQL41)
550                {
551                    $sql = 'select count(kll_id) AS ships, sum(lossisk) as isk from (select distinct kll_id,';
552                }
553                else
554                {
555                    $sql = 'select distinct kll_id,';
556                }
557
558
559                if (config::get('ship_values'))
560                {
561                    $sql .= ' ifnull(ksv.shp_value,scl.scl_value) AS lossisk FROM kb3_kills kll
562                            INNER JOIN kb3_ships shp ON ( shp.shp_id = kll.kll_ship_id )
563                            left join kb3_ships_values ksv on (shp.shp_id = ksv.shp_id)';
564                }
565                else
566                {
567                    $sql .= ' scl.scl_value AS lossisk FROM kb3_kills kll
568                            INNER JOIN kb3_ships shp ON ( shp.shp_id = kll.kll_ship_id )';
569                }
570                $sql .= ' INNER JOIN kb3_ship_classes scl ON ( scl.scl_id = shp.shp_class )
571                          inner join kb3_systems sys on ( sys.sys_id = kll.kll_system_id )';
572
573                if ($list->regions_)
574                {
575                    $sql .= ' inner join kb3_constellations con
576                           on ( con.con_id = sys.sys_con_id )
577                                   inner join kb3_regions reg on ( reg.reg_id = con.con_reg_id
578                                   and reg.reg_id in ( '.join(',', $list->regions_).' ) )';
579                }
580                if ($list->systems_)
581                {
582                    $sql .= ' and kll.kll_system_id in ( '.join(',', $list->systems_).')';
583                }
584                if ($list->inv_crp_)
585                {
586                    $sql .= ' inner join kb3_inv_crp inc on ( kll.kll_id = inc.inc_kll_id ) ';
587                }
588                if ($list->inv_all_)
589                {
590                    $sql .= ' inner join kb3_inv_all ina on ( kll.kll_id = ina.ina_kll_id ) ';
591                }
592                if ($list->inv_plt_)
593                {
594                    $sql .= ' inner join kb3_inv_plt inp on ( kll.kll_id = inp.inp_kll_id ) ';
595                }
596
597                $sql .= ' where 1=1 ';
598
599                $tmp = array();
600                if ($list->vic_plt_)
601                {
602                    $tmp[] = 'kll.kll_victim_id in ( '.join(',', $list->vic_plt_).' )';
603                }
604                if ($list->vic_crp_)
605                {
606                    $tmp[] = 'kll.kll_crp_id in ( '.join(',', $list->vic_crp_).' )';
607                }
608                if ($list->vic_all_)
609                {
610                    $tmp[] = 'kll.kll_all_id in ( '.join(',', $list->vic_all_).' )';
611                }
612                if (count($tmp))
613                {
614                    $sql .= ' and (';
615                    $sql .= join(' or ', $tmp);
616                    $sql .= ')';
617                }
618
619
620                $tmp = array();
621                if ($list->inv_crp_)
622                {
623                    $tmp[] = 'inc.inc_crp_id in ( '.join(',', $list->inv_crp_).')';
624                }
625                if ($list->inv_all_)
626                {
627                    $tmp[] = 'ina.ina_all_id in ( '.join(',', $list->inv_all_).')';
628                }
629                if ($list->inv_plt_)
630                {
631                    $tmp[] = 'inp.inp_plt_id in ( '.join(',', $list->inv_plt_).')';
632                }
633                if (count($tmp))
634                {
635                    $sql .= ' and (';
636                    $sql .= join(' or ', $tmp);
637                    $sql .= ')';
638                }
639
640                if ($list->timeframe_)
641                {
642                    $sql .= $list->timeframe_;
643                }
644                if (KB_MYSQL41)
645                {
646                    // this is the last part from the outer query
647                    $sql .= ') as kb3_shadow';
648                }
649
650                $result = $qry->execute($sql);
651                if (KB_MYSQL41)
652                {
653                    $row = $qry->getRow($result);
654                }
655                else
656                {
657                    $sum = array();
658                    $sum['isk'] = 0;
659                    $sum['ships'] = 0;
660                    while ($row = $qry->getRow($result))
661                    {
662                        $sum['ships'] += 1;
663                        $sum['isk'] += $row['lossisk'];
664                    }
665                    $row = $sum;
666                }
667
668                if ($i == 0)
669                {
670                    $ldata = array('losses' => $row['ships'], 'lossisk' => $row['isk']);
671                }
672                else
673                {
674                    $kdata = array('kills' => $row['ships'], 'killisk' => $row['isk']);
675                }
676            }
677            if ($kdata['killisk'])
678            {
679                $efficiency = round($kdata['killisk'] / ($kdata['killisk']+$ldata['lossisk']) *100, 2);
680            }
681            else
682            {
683                $efficiency = 0;
684            }
685            $bar = new BarGraph($efficiency, 100, 75);
686
687            $tbldata[] = array_merge(array('name' => $contract->getName(), 'startdate' => $contract->getStartDate(), 'bar' => $bar->generate(),
688                                     'enddate' => $contract->getEndDate(), 'efficiency' => $efficiency, 'id' => $contract->getID()), $kdata, $ldata);
689        }
690        $this->contractlist_->contractcounter_ = 1;
691        $this->contractlist_->qry_->rewind();
692        return $tbldata;
693    }
694
695    function generate()
696    {
697        if ($table = $this->getTableStats())
698        {
699            global $smarty;
700
701            $smarty->assign('contract_getactive', $this->contractlist_->getActive());
702            $smarty->assign_by_ref('contracts', $table);
703            $pagesplitter = new PageSplitter($this->contractlist_->getCount(), 10);
704
705            return $smarty->fetch(get_tpl('contractlisttable')).$pagesplitter->generate();
706        }
707
708        // old stuff, not used anymore (kept for reference)
709        if ($this->contractlist_->getCount())
710        {
711            $rowid = 0;
712            $html .= "<table class=kb-table width=\"98%\" align=center cellspacing=1>";
713            $html .= "<tr class=kb-table-header>";
714            $html .= "<td class=kb-table-cell width=180>Name</td>";
715            $html .= "<td class=kb-table-cell width=80 align=center>Start date</td>";
716            if ($this->contractlist_->getActive() == "no")
717                $html .= "<td class=kb-table-cell width=80 align=center>End date</td>";
718            $html .= "<td class=kb-table-cell width=50 align=center>Kills</td>";
719            $html .= "<td class=kb-table-cell width=70 align=center>ISK (M)</td>";
720            $html .= "<td class=kb-table-cell width=50 align=center>Losses</td>";
721            $html .= "<td class=kb-table-cell width=70 align=center>ISK (M)</td>";
722            $html .= "<td class=kb-table-cell width=70 align=center colspan=2>Efficiency</td>";
723            $html .= "</tr>";
724
725            $odd = false;
726            $rowclass = "kb-table-row-even";
727            while ($contract = $this->contractlist_->getContract())
728            {
729                if ($odd)
730                {
731                    $rowclass = "kb-table-row-even";
732                    $odd = false;
733                }
734                else
735                {
736                    $rowclass = "kb-table-row-odd";
737                    $odd = true;
738                }
739
740                $html .= "<tr class=".$rowclass." onmouseover=\"this.className='kb-table-row-hover';\" onmouseout=\"this.className='".$rowclass."';\" onClick=\"window.location.href='?a=cc_detail&ctr_id=".$contract->getID()."';\">";
741                $html .= "<td class=kb-table-cell><b>".$contract->getName()."</b></td>";
742                $html .= "<td class=kb-table-cell align=center>".substr($contract->getStartDate(), 0, 10)."</td>";
743                if ($this->contractlist_->getActive() == "no")
744                {
745                    if ($contract->getEndDate() == "")
746                        $ended = "Active";
747                    else
748                        $ended = substr($contract->getEndDate(), 0, 10);
749                    $html .= "<td class=kb-table-cell align=center>".$ended."</td>";
750                }
751                if ($contract->getKills() == 0)
752                    $kclass = "kl-null";
753                else
754                    $kclass = "kl-kill";
755
756                if ($contract->getLosses() == 0)
757                    $lclass = "kl-null";
758                else
759                    $lclass = "kl-loss";
760
761                $html .= "<td class=".$kclass." align=center>".$contract->getKills()."</td>";
762                $html .= "<td class=".$kclass." align=center>".round($contract->getKillISK()/1000000, 2)."</td>";
763                $html .= "<td class=".$lclass." align=center>".$contract->getLosses()."</td>";
764                $html .= "<td class=".$lclass." align=center>".round($contract->getLossISK()/1000000, 2)."</td>";
765                $bar = new BarGraph($contract->getEfficiency(), 100, 75);
766                $html .= "<td class=kb-table-cell align=center width=40><b>".$contract->getEfficiency()."%</b></td>";
767                $html .= "<td class=kb-table-cell align=left width=75>".$bar->generate()."</td>";
768                $html .= "</tr>";
769            }
770            $html .= "</table>";
771            $pagesplitter = new PageSplitter($this->contractlist_->getCount(), 10);
772            $html .= $pagesplitter->generate();
773        }
774        else $html .= "None.";
775
776        return $html;
777    }
778}
779?>
Note: See TracBrowser for help on using the browser.