diff --git a/.drone.yml b/.drone.yml index b05c253..af479b3 100644 --- a/.drone.yml +++ b/.drone.yml @@ -64,7 +64,6 @@ steps: trigger: event: - - cron - push - tag diff --git a/htdocs/ajax_flotte.php b/htdocs/ajax_flotte.php index af900cb..669ac90 100644 --- a/htdocs/ajax_flotte.php +++ b/htdocs/ajax_flotte.php @@ -1,20 +1,16 @@ values['connected']) && $SESS->values['connected'] && !empty($SESS->values['id']) && !empty($SESS->values['idPlan'])) { - $idPrep = gpc("cds_temp", "post"); +if (isset($sess) && isset($sess->values['connected']) && $sess->values['connected'] && !empty($sess->values['id']) && !empty($sess->level) && !empty($sess->values['idPlan'])) { $json = new Services_JSON(); $nbtrajet = 2; - if (empty($VAR['flottes']) && $SESS->level <= 1) { + if (empty($config['flottes']) && $sess->level <= 1) { $datas = array( 'root' => array( 'destination' => '::', @@ -32,7 +28,8 @@ if (isset($SESS) && isset($SESS->values['connected']) && $SESS->values['connecte $destin = gpc('fav_dest', 'post'); $chapeau = new bdd(); - $idPlan = $SESS->values['idPlan']; + $chapeau->connexion(); + $idPlan = $sess->values['idPlan']; $queryPlanete = $chapeau->unique_query("SELECT * FROM $table_planete WHERE id = '$idPlan'"); if (!empty($destin)) { $chapeau->escape($destin); @@ -48,11 +45,18 @@ if (isset($SESS) && isset($SESS->values['connected']) && $SESS->values['connecte $start_ss = $queryPlanete['ss']; $start_position = $queryPlanete['position']; - if (empty($SESS->values["prepFlottes"][$idPrep]['time']) || - $SESS->values["prepFlottes"][$idPrep]['time'] + 1200 < time() || - empty($SESS->values["prepFlottes"][$idPrep]['nbVaisseaux']) || - empty($SESS->values["prepFlottes"][$idPrep]['vitesse']) && - isset($SESS->values['auth_level'])) { + $met = gpc('met', 'post'); + $cri = gpc('cri', 'post'); + $hyd = gpc('hyd', 'post'); + if (!empty($sess->values['flcontenu']) && $met+$cri+$hyd >= 0 && $met >= 0 && $cri >= 0 && $hyd >= 0) { + $places = $sess->values['flcontenu'] - ($met+$cri+$hyd); + } else { + $places = 'inconnu'; + } + + + + if (empty($sess->values['fltime']) || $sess->values['fltime'] + 600 < time() || empty($sess->values['flnbvais']) || empty($sess->values['flvitesse']) && isset($sess->values['auth_level'])) { $datas = array( 'root' => array( 'destination' => $destinRapid, @@ -60,7 +64,7 @@ if (isset($SESS) && isset($SESS->values['connected']) && $SESS->values['connecte 'deblok' => 'Une erreur est survenue lors de la création de la flotte. Veuillez recommencer', 'conso' => '-', 'tactique' => '', - 'places' => '', + 'places' => separerNombres($places) ) ); } elseif (empty($_POST['nom']) || preg_replace('@[^a-zA-Z0-9_ ]@i', '', $_POST['nom']) != $_POST['nom']) { @@ -71,10 +75,10 @@ if (isset($SESS) && isset($SESS->values['connected']) && $SESS->values['connecte 'deblok' => 'Nom de la flotte incorrect !', 'conso' => '-', 'tactique' => '', - 'places' => '', + 'places' => separerNombres($places) ) ); - } elseif ($_POST['galaxie'] > $VAR['nb_amas'] || $_POST['ss'] > $VAR['nb_systeme'] || $_POST['pos'] > $VAR['nb_planete'] || $_POST['galaxie'] < 0 || $_POST['ss'] < 1 || $_POST['pos'] < 1 || ($_POST['galaxie'] < 1 && $SESS->values['auth_level'] < 6)) { + } elseif ($_POST['galaxie'] > MAX_AMAS || $_POST['ss'] > MAX_SYSTEME || $_POST['pos'] > MAX_PLANETE || $_POST['galaxie'] < 0 || $_POST['ss'] < 1 || $_POST['pos'] < 1 || ($_POST['galaxie'] < 1 && $sess->values['auth_level'] < 6)) { $datas = array( 'root' => array( 'destination' => $destinRapid, @@ -82,38 +86,23 @@ if (isset($SESS) && isset($SESS->values['connected']) && $SESS->values['connecte 'deblok' => 'Corrigez la destination !', 'conso' => '-', 'tactique' => '', - 'places' => '', + 'places' => separerNombres($places) ) ); } else { $_POST['vitesse'] /= 100; - - $planete = new planete($idPlan); - $flotte = new flotte(); - $temps = $flotte->calc_deplacement($planete, $_POST['galaxie'], $_POST['ss'], $_POST['pos'], $_POST['vitesse'], $SESS->values["prepFlottes"][$idPrep]['vaisseaux'], 1000); + $temps = vais_tempsDeplacement($start_galaxie, $start_ss, $start_position, $_POST['galaxie'], $_POST['ss'], $_POST['pos'], $sess->values['flvitesse'], $_POST['vitesse'], $sess->values['flpreparation'], $sess->values['flchauffe']); if ($temps <= 0) { $temps = 454; } - $conso = $flotte->calc_deplacement($planete, $_POST['galaxie'], $_POST['ss'], $_POST['pos'], $_POST['vitesse'], $SESS->values["prepFlottes"][$idPrep]['vaisseaux'], 1000, false, true); - // $conso renvoi le temps ET la conso dans un array - $conso = intval($conso[1]); - - $met = intval(gpc('met', 'post')); - $cri = intval(gpc('cri', 'post')); - $hyd = intval(gpc('hyd', 'post')); - $places = $flotte->calcStockage($SESS->values["prepFlottes"][$idPrep]['vaisseaux'], $planete); - $places -= ceil($conso * $nbtrajet); - if (($met+$cri+$hyd) > 0) { - $places -= ($met+$cri+$hyd); - } + $conso = vais_conso($temps, $sess->values['flnbvais'])*$_POST['vitesse']/45; + $places -= ceil($conso*$nbtrajet); $tactique = ''; - // si la mission est une mission d'attaque - if ($_POST['mission'] == '3') { + if ($_POST['mission'] == '1') { $tactique = '
'; } - $SESS->values['flcds'] = $idPrep; - $SESS->put(); + $cds = sha1('flotte'.$conso.'ß10'.time().'|HB;'.rand(10, 99).$temps); + $sess->values['flcds'] = $cds; + $sess->put(); $datas = array( 'root' => array( 'destination' => $destinRapid, 'temps' => affTemp(floor($temps)), - 'deblok' => '', - 'conso' => ceil($conso*2), + 'deblok' => '', + 'conso' => separerNombres(ceil($conso*2)), 'tactique' => $tactique, - 'places' => $places + 'places' => separerNombres($places) ) ); } diff --git a/htdocs/images/planetes/1.jpg b/htdocs/images/planetes/1.jpg index 0ae5fb0..282fcde 100644 Binary files a/htdocs/images/planetes/1.jpg and b/htdocs/images/planetes/1.jpg differ diff --git a/htdocs/images/planetes/10.jpg b/htdocs/images/planetes/10.jpg index 061b8ba..84e2412 100644 Binary files a/htdocs/images/planetes/10.jpg and b/htdocs/images/planetes/10.jpg differ diff --git a/htdocs/images/planetes/100.jpg b/htdocs/images/planetes/100.jpg deleted file mode 100644 index 25521eb..0000000 Binary files a/htdocs/images/planetes/100.jpg and /dev/null differ diff --git a/htdocs/images/planetes/101.jpg b/htdocs/images/planetes/101.jpg deleted file mode 100644 index 2d9105d..0000000 Binary files a/htdocs/images/planetes/101.jpg and /dev/null differ diff --git a/htdocs/images/planetes/102.jpg b/htdocs/images/planetes/102.jpg deleted file mode 100644 index a57e0a8..0000000 Binary files a/htdocs/images/planetes/102.jpg and /dev/null differ diff --git a/htdocs/images/planetes/103.jpg b/htdocs/images/planetes/103.jpg deleted file mode 100644 index 9b553ec..0000000 Binary files a/htdocs/images/planetes/103.jpg and /dev/null differ diff --git a/htdocs/images/planetes/104.jpg b/htdocs/images/planetes/104.jpg deleted file mode 100644 index da2ec38..0000000 Binary files a/htdocs/images/planetes/104.jpg and /dev/null differ diff --git a/htdocs/images/planetes/105.jpg b/htdocs/images/planetes/105.jpg deleted file mode 100644 index ebcc807..0000000 Binary files a/htdocs/images/planetes/105.jpg and /dev/null differ diff --git a/htdocs/images/planetes/106.jpg b/htdocs/images/planetes/106.jpg deleted file mode 100644 index 020dd14..0000000 Binary files a/htdocs/images/planetes/106.jpg and /dev/null differ diff --git a/htdocs/images/planetes/107.jpg b/htdocs/images/planetes/107.jpg deleted file mode 100644 index 8e34aa7..0000000 Binary files a/htdocs/images/planetes/107.jpg and /dev/null differ diff --git a/htdocs/images/planetes/108.jpg b/htdocs/images/planetes/108.jpg deleted file mode 100644 index 02408be..0000000 Binary files a/htdocs/images/planetes/108.jpg and /dev/null differ diff --git a/htdocs/images/planetes/109.jpg b/htdocs/images/planetes/109.jpg deleted file mode 100644 index 5e36180..0000000 Binary files a/htdocs/images/planetes/109.jpg and /dev/null differ diff --git a/htdocs/images/planetes/11.jpg b/htdocs/images/planetes/11.jpg index 9a6fabf..6435940 100644 Binary files a/htdocs/images/planetes/11.jpg and b/htdocs/images/planetes/11.jpg differ diff --git a/htdocs/images/planetes/110.jpg b/htdocs/images/planetes/110.jpg deleted file mode 100644 index 8944616..0000000 Binary files a/htdocs/images/planetes/110.jpg and /dev/null differ diff --git a/htdocs/images/planetes/111.jpg b/htdocs/images/planetes/111.jpg deleted file mode 100644 index b613a08..0000000 Binary files a/htdocs/images/planetes/111.jpg and /dev/null differ diff --git a/htdocs/images/planetes/112.jpg b/htdocs/images/planetes/112.jpg deleted file mode 100644 index 1fdc3dd..0000000 Binary files a/htdocs/images/planetes/112.jpg and /dev/null differ diff --git a/htdocs/images/planetes/113.jpg b/htdocs/images/planetes/113.jpg deleted file mode 100644 index 51ca960..0000000 Binary files a/htdocs/images/planetes/113.jpg and /dev/null differ diff --git a/htdocs/images/planetes/114.jpg b/htdocs/images/planetes/114.jpg deleted file mode 100644 index aee7160..0000000 Binary files a/htdocs/images/planetes/114.jpg and /dev/null differ diff --git a/htdocs/images/planetes/115.jpg b/htdocs/images/planetes/115.jpg deleted file mode 100644 index 9649e4e..0000000 Binary files a/htdocs/images/planetes/115.jpg and /dev/null differ diff --git a/htdocs/images/planetes/116.jpg b/htdocs/images/planetes/116.jpg deleted file mode 100644 index 71cd646..0000000 Binary files a/htdocs/images/planetes/116.jpg and /dev/null differ diff --git a/htdocs/images/planetes/117.jpg b/htdocs/images/planetes/117.jpg deleted file mode 100644 index 1607abb..0000000 Binary files a/htdocs/images/planetes/117.jpg and /dev/null differ diff --git a/htdocs/images/planetes/118.jpg b/htdocs/images/planetes/118.jpg deleted file mode 100644 index 83de29e..0000000 Binary files a/htdocs/images/planetes/118.jpg and /dev/null differ diff --git a/htdocs/images/planetes/119.jpg b/htdocs/images/planetes/119.jpg deleted file mode 100644 index b688916..0000000 Binary files a/htdocs/images/planetes/119.jpg and /dev/null differ diff --git a/htdocs/images/planetes/12.jpg b/htdocs/images/planetes/12.jpg index edb244a..416508d 100644 Binary files a/htdocs/images/planetes/12.jpg and b/htdocs/images/planetes/12.jpg differ diff --git a/htdocs/images/planetes/120.jpg b/htdocs/images/planetes/120.jpg deleted file mode 100644 index 86520fc..0000000 Binary files a/htdocs/images/planetes/120.jpg and /dev/null differ diff --git a/htdocs/images/planetes/121.jpg b/htdocs/images/planetes/121.jpg deleted file mode 100644 index c5b63b1..0000000 Binary files a/htdocs/images/planetes/121.jpg and /dev/null differ diff --git a/htdocs/images/planetes/122.jpg b/htdocs/images/planetes/122.jpg deleted file mode 100644 index a5bdb84..0000000 Binary files a/htdocs/images/planetes/122.jpg and /dev/null differ diff --git a/htdocs/images/planetes/123.jpg b/htdocs/images/planetes/123.jpg deleted file mode 100644 index 7ce69c7..0000000 Binary files a/htdocs/images/planetes/123.jpg and /dev/null differ diff --git a/htdocs/images/planetes/124.jpg b/htdocs/images/planetes/124.jpg deleted file mode 100644 index 5a9491e..0000000 Binary files a/htdocs/images/planetes/124.jpg and /dev/null differ diff --git a/htdocs/images/planetes/125.jpg b/htdocs/images/planetes/125.jpg deleted file mode 100644 index d99d9ac..0000000 Binary files a/htdocs/images/planetes/125.jpg and /dev/null differ diff --git a/htdocs/images/planetes/126.jpg b/htdocs/images/planetes/126.jpg deleted file mode 100644 index d2379e0..0000000 Binary files a/htdocs/images/planetes/126.jpg and /dev/null differ diff --git a/htdocs/images/planetes/127.jpg b/htdocs/images/planetes/127.jpg deleted file mode 100644 index 4572d89..0000000 Binary files a/htdocs/images/planetes/127.jpg and /dev/null differ diff --git a/htdocs/images/planetes/128.jpg b/htdocs/images/planetes/128.jpg deleted file mode 100644 index 25442e5..0000000 Binary files a/htdocs/images/planetes/128.jpg and /dev/null differ diff --git a/htdocs/images/planetes/129.jpg b/htdocs/images/planetes/129.jpg deleted file mode 100644 index 4d4524b..0000000 Binary files a/htdocs/images/planetes/129.jpg and /dev/null differ diff --git a/htdocs/images/planetes/13.jpg b/htdocs/images/planetes/13.jpg index 1e896df..6861c8d 100644 Binary files a/htdocs/images/planetes/13.jpg and b/htdocs/images/planetes/13.jpg differ diff --git a/htdocs/images/planetes/130.jpg b/htdocs/images/planetes/130.jpg deleted file mode 100644 index e1cd78a..0000000 Binary files a/htdocs/images/planetes/130.jpg and /dev/null differ diff --git a/htdocs/images/planetes/131.jpg b/htdocs/images/planetes/131.jpg deleted file mode 100644 index 3477dc1..0000000 Binary files a/htdocs/images/planetes/131.jpg and /dev/null differ diff --git a/htdocs/images/planetes/132.jpg b/htdocs/images/planetes/132.jpg deleted file mode 100644 index 816864d..0000000 Binary files a/htdocs/images/planetes/132.jpg and /dev/null differ diff --git a/htdocs/images/planetes/133.jpg b/htdocs/images/planetes/133.jpg deleted file mode 100644 index a0e9a67..0000000 Binary files a/htdocs/images/planetes/133.jpg and /dev/null differ diff --git a/htdocs/images/planetes/134.jpg b/htdocs/images/planetes/134.jpg deleted file mode 100644 index 10b7c00..0000000 Binary files a/htdocs/images/planetes/134.jpg and /dev/null differ diff --git a/htdocs/images/planetes/135.jpg b/htdocs/images/planetes/135.jpg deleted file mode 100644 index bb4c87f..0000000 Binary files a/htdocs/images/planetes/135.jpg and /dev/null differ diff --git a/htdocs/images/planetes/136.jpg b/htdocs/images/planetes/136.jpg deleted file mode 100644 index 2fd079a..0000000 Binary files a/htdocs/images/planetes/136.jpg and /dev/null differ diff --git a/htdocs/images/planetes/137.jpg b/htdocs/images/planetes/137.jpg deleted file mode 100644 index 42a9c65..0000000 Binary files a/htdocs/images/planetes/137.jpg and /dev/null differ diff --git a/htdocs/images/planetes/138.jpg b/htdocs/images/planetes/138.jpg deleted file mode 100644 index f77f748..0000000 Binary files a/htdocs/images/planetes/138.jpg and /dev/null differ diff --git a/htdocs/images/planetes/139.jpg b/htdocs/images/planetes/139.jpg deleted file mode 100644 index 1888d90..0000000 Binary files a/htdocs/images/planetes/139.jpg and /dev/null differ diff --git a/htdocs/images/planetes/14.jpg b/htdocs/images/planetes/14.jpg index e8cbef9..bac8568 100644 Binary files a/htdocs/images/planetes/14.jpg and b/htdocs/images/planetes/14.jpg differ diff --git a/htdocs/images/planetes/140.jpg b/htdocs/images/planetes/140.jpg deleted file mode 100644 index 6fea310..0000000 Binary files a/htdocs/images/planetes/140.jpg and /dev/null differ diff --git a/htdocs/images/planetes/141.jpg b/htdocs/images/planetes/141.jpg deleted file mode 100644 index 3ac391e..0000000 Binary files a/htdocs/images/planetes/141.jpg and /dev/null differ diff --git a/htdocs/images/planetes/142.jpg b/htdocs/images/planetes/142.jpg deleted file mode 100644 index 1de0da6..0000000 Binary files a/htdocs/images/planetes/142.jpg and /dev/null differ diff --git a/htdocs/images/planetes/143.jpg b/htdocs/images/planetes/143.jpg deleted file mode 100644 index 3b97809..0000000 Binary files a/htdocs/images/planetes/143.jpg and /dev/null differ diff --git a/htdocs/images/planetes/144.jpg b/htdocs/images/planetes/144.jpg deleted file mode 100644 index 3375755..0000000 Binary files a/htdocs/images/planetes/144.jpg and /dev/null differ diff --git a/htdocs/images/planetes/145.jpg b/htdocs/images/planetes/145.jpg deleted file mode 100644 index 8fb7394..0000000 Binary files a/htdocs/images/planetes/145.jpg and /dev/null differ diff --git a/htdocs/images/planetes/146.jpg b/htdocs/images/planetes/146.jpg deleted file mode 100644 index 32ef681..0000000 Binary files a/htdocs/images/planetes/146.jpg and /dev/null differ diff --git a/htdocs/images/planetes/147.jpg b/htdocs/images/planetes/147.jpg deleted file mode 100644 index 5fdbd9c..0000000 Binary files a/htdocs/images/planetes/147.jpg and /dev/null differ diff --git a/htdocs/images/planetes/148.jpg b/htdocs/images/planetes/148.jpg deleted file mode 100644 index 386781e..0000000 Binary files a/htdocs/images/planetes/148.jpg and /dev/null differ diff --git a/htdocs/images/planetes/149.jpg b/htdocs/images/planetes/149.jpg deleted file mode 100644 index 2311f69..0000000 Binary files a/htdocs/images/planetes/149.jpg and /dev/null differ diff --git a/htdocs/images/planetes/15.jpg b/htdocs/images/planetes/15.jpg index 90c11d8..d9f82a7 100644 Binary files a/htdocs/images/planetes/15.jpg and b/htdocs/images/planetes/15.jpg differ diff --git a/htdocs/images/planetes/150.jpg b/htdocs/images/planetes/150.jpg deleted file mode 100644 index f287a95..0000000 Binary files a/htdocs/images/planetes/150.jpg and /dev/null differ diff --git a/htdocs/images/planetes/16.jpg b/htdocs/images/planetes/16.jpg index 68b3f8e..305d244 100644 Binary files a/htdocs/images/planetes/16.jpg and b/htdocs/images/planetes/16.jpg differ diff --git a/htdocs/images/planetes/17.jpg b/htdocs/images/planetes/17.jpg index 0dcf0e8..ab33da0 100644 Binary files a/htdocs/images/planetes/17.jpg and b/htdocs/images/planetes/17.jpg differ diff --git a/htdocs/images/planetes/18.jpg b/htdocs/images/planetes/18.jpg index 6da6ebb..1e2e208 100644 Binary files a/htdocs/images/planetes/18.jpg and b/htdocs/images/planetes/18.jpg differ diff --git a/htdocs/images/planetes/19.jpg b/htdocs/images/planetes/19.jpg index 82ed8cf..6885bf2 100644 Binary files a/htdocs/images/planetes/19.jpg and b/htdocs/images/planetes/19.jpg differ diff --git a/htdocs/images/planetes/2.jpg b/htdocs/images/planetes/2.jpg index 57b297c..cd05f75 100644 Binary files a/htdocs/images/planetes/2.jpg and b/htdocs/images/planetes/2.jpg differ diff --git a/htdocs/images/planetes/20.jpg b/htdocs/images/planetes/20.jpg index 4c6201f..19bc5fb 100644 Binary files a/htdocs/images/planetes/20.jpg and b/htdocs/images/planetes/20.jpg differ diff --git a/htdocs/images/planetes/21.jpg b/htdocs/images/planetes/21.jpg index 0ffe38f..6c584d4 100644 Binary files a/htdocs/images/planetes/21.jpg and b/htdocs/images/planetes/21.jpg differ diff --git a/htdocs/images/planetes/22.jpg b/htdocs/images/planetes/22.jpg index 17b31f1..a318072 100644 Binary files a/htdocs/images/planetes/22.jpg and b/htdocs/images/planetes/22.jpg differ diff --git a/htdocs/images/planetes/23.jpg b/htdocs/images/planetes/23.jpg index bd2f024..2418250 100644 Binary files a/htdocs/images/planetes/23.jpg and b/htdocs/images/planetes/23.jpg differ diff --git a/htdocs/images/planetes/24.jpg b/htdocs/images/planetes/24.jpg index bf74178..3f851a5 100644 Binary files a/htdocs/images/planetes/24.jpg and b/htdocs/images/planetes/24.jpg differ diff --git a/htdocs/images/planetes/25.jpg b/htdocs/images/planetes/25.jpg index 3d60c12..8ff95dc 100644 Binary files a/htdocs/images/planetes/25.jpg and b/htdocs/images/planetes/25.jpg differ diff --git a/htdocs/images/planetes/26.jpg b/htdocs/images/planetes/26.jpg index 1acd25e..d184eea 100644 Binary files a/htdocs/images/planetes/26.jpg and b/htdocs/images/planetes/26.jpg differ diff --git a/htdocs/images/planetes/27.jpg b/htdocs/images/planetes/27.jpg index e0a25fc..df15458 100644 Binary files a/htdocs/images/planetes/27.jpg and b/htdocs/images/planetes/27.jpg differ diff --git a/htdocs/images/planetes/28.jpg b/htdocs/images/planetes/28.jpg index c417500..2b2dd3b 100644 Binary files a/htdocs/images/planetes/28.jpg and b/htdocs/images/planetes/28.jpg differ diff --git a/htdocs/images/planetes/29.jpg b/htdocs/images/planetes/29.jpg index 19a10d5..c92e144 100644 Binary files a/htdocs/images/planetes/29.jpg and b/htdocs/images/planetes/29.jpg differ diff --git a/htdocs/images/planetes/3.jpg b/htdocs/images/planetes/3.jpg index 97c7df6..a1c898a 100644 Binary files a/htdocs/images/planetes/3.jpg and b/htdocs/images/planetes/3.jpg differ diff --git a/htdocs/images/planetes/30.jpg b/htdocs/images/planetes/30.jpg index 25bfeca..6b9f9a1 100644 Binary files a/htdocs/images/planetes/30.jpg and b/htdocs/images/planetes/30.jpg differ diff --git a/htdocs/images/planetes/31.jpg b/htdocs/images/planetes/31.jpg index 7c86808..471a2bc 100644 Binary files a/htdocs/images/planetes/31.jpg and b/htdocs/images/planetes/31.jpg differ diff --git a/htdocs/images/planetes/32.jpg b/htdocs/images/planetes/32.jpg index d30d28b..fe7e629 100644 Binary files a/htdocs/images/planetes/32.jpg and b/htdocs/images/planetes/32.jpg differ diff --git a/htdocs/images/planetes/33.jpg b/htdocs/images/planetes/33.jpg deleted file mode 100644 index 5077615..0000000 Binary files a/htdocs/images/planetes/33.jpg and /dev/null differ diff --git a/htdocs/images/planetes/34.jpg b/htdocs/images/planetes/34.jpg deleted file mode 100644 index 356367d..0000000 Binary files a/htdocs/images/planetes/34.jpg and /dev/null differ diff --git a/htdocs/images/planetes/35.jpg b/htdocs/images/planetes/35.jpg deleted file mode 100644 index 0af0c61..0000000 Binary files a/htdocs/images/planetes/35.jpg and /dev/null differ diff --git a/htdocs/images/planetes/36.jpg b/htdocs/images/planetes/36.jpg deleted file mode 100644 index b21afc8..0000000 Binary files a/htdocs/images/planetes/36.jpg and /dev/null differ diff --git a/htdocs/images/planetes/37.jpg b/htdocs/images/planetes/37.jpg deleted file mode 100644 index 65ba113..0000000 Binary files a/htdocs/images/planetes/37.jpg and /dev/null differ diff --git a/htdocs/images/planetes/38.jpg b/htdocs/images/planetes/38.jpg deleted file mode 100644 index 41b911a..0000000 Binary files a/htdocs/images/planetes/38.jpg and /dev/null differ diff --git a/htdocs/images/planetes/39.jpg b/htdocs/images/planetes/39.jpg deleted file mode 100644 index 58966d3..0000000 Binary files a/htdocs/images/planetes/39.jpg and /dev/null differ diff --git a/htdocs/images/planetes/4.jpg b/htdocs/images/planetes/4.jpg index 1c81beb..391ed50 100644 Binary files a/htdocs/images/planetes/4.jpg and b/htdocs/images/planetes/4.jpg differ diff --git a/htdocs/images/planetes/40.jpg b/htdocs/images/planetes/40.jpg deleted file mode 100644 index 69bf891..0000000 Binary files a/htdocs/images/planetes/40.jpg and /dev/null differ diff --git a/htdocs/images/planetes/41.jpg b/htdocs/images/planetes/41.jpg deleted file mode 100644 index 86ce529..0000000 Binary files a/htdocs/images/planetes/41.jpg and /dev/null differ diff --git a/htdocs/images/planetes/42.jpg b/htdocs/images/planetes/42.jpg deleted file mode 100644 index 38eee57..0000000 Binary files a/htdocs/images/planetes/42.jpg and /dev/null differ diff --git a/htdocs/images/planetes/43.jpg b/htdocs/images/planetes/43.jpg deleted file mode 100644 index 9605173..0000000 Binary files a/htdocs/images/planetes/43.jpg and /dev/null differ diff --git a/htdocs/images/planetes/44.jpg b/htdocs/images/planetes/44.jpg deleted file mode 100644 index 02f58bb..0000000 Binary files a/htdocs/images/planetes/44.jpg and /dev/null differ diff --git a/htdocs/images/planetes/45.jpg b/htdocs/images/planetes/45.jpg deleted file mode 100644 index 817251c..0000000 Binary files a/htdocs/images/planetes/45.jpg and /dev/null differ diff --git a/htdocs/images/planetes/46.jpg b/htdocs/images/planetes/46.jpg deleted file mode 100644 index caab9ae..0000000 Binary files a/htdocs/images/planetes/46.jpg and /dev/null differ diff --git a/htdocs/images/planetes/47.jpg b/htdocs/images/planetes/47.jpg deleted file mode 100644 index acac44e..0000000 Binary files a/htdocs/images/planetes/47.jpg and /dev/null differ diff --git a/htdocs/images/planetes/48.jpg b/htdocs/images/planetes/48.jpg deleted file mode 100644 index f8a7895..0000000 Binary files a/htdocs/images/planetes/48.jpg and /dev/null differ diff --git a/htdocs/images/planetes/49.jpg b/htdocs/images/planetes/49.jpg deleted file mode 100644 index 8ab4d32..0000000 Binary files a/htdocs/images/planetes/49.jpg and /dev/null differ diff --git a/htdocs/images/planetes/5.jpg b/htdocs/images/planetes/5.jpg index 30edd36..353f705 100644 Binary files a/htdocs/images/planetes/5.jpg and b/htdocs/images/planetes/5.jpg differ diff --git a/htdocs/images/planetes/50.jpg b/htdocs/images/planetes/50.jpg deleted file mode 100644 index 7ed5a59..0000000 Binary files a/htdocs/images/planetes/50.jpg and /dev/null differ diff --git a/htdocs/images/planetes/51.jpg b/htdocs/images/planetes/51.jpg deleted file mode 100644 index d574f59..0000000 Binary files a/htdocs/images/planetes/51.jpg and /dev/null differ diff --git a/htdocs/images/planetes/52.jpg b/htdocs/images/planetes/52.jpg deleted file mode 100644 index eeb56ab..0000000 Binary files a/htdocs/images/planetes/52.jpg and /dev/null differ diff --git a/htdocs/images/planetes/53.jpg b/htdocs/images/planetes/53.jpg deleted file mode 100644 index 84bd9f8..0000000 Binary files a/htdocs/images/planetes/53.jpg and /dev/null differ diff --git a/htdocs/images/planetes/54.jpg b/htdocs/images/planetes/54.jpg deleted file mode 100644 index a8602fe..0000000 Binary files a/htdocs/images/planetes/54.jpg and /dev/null differ diff --git a/htdocs/images/planetes/55.jpg b/htdocs/images/planetes/55.jpg deleted file mode 100644 index e1c97cb..0000000 Binary files a/htdocs/images/planetes/55.jpg and /dev/null differ diff --git a/htdocs/images/planetes/56.jpg b/htdocs/images/planetes/56.jpg deleted file mode 100644 index 5a77732..0000000 Binary files a/htdocs/images/planetes/56.jpg and /dev/null differ diff --git a/htdocs/images/planetes/57.jpg b/htdocs/images/planetes/57.jpg deleted file mode 100644 index e3ae5cd..0000000 Binary files a/htdocs/images/planetes/57.jpg and /dev/null differ diff --git a/htdocs/images/planetes/58.jpg b/htdocs/images/planetes/58.jpg deleted file mode 100644 index be04b2a..0000000 Binary files a/htdocs/images/planetes/58.jpg and /dev/null differ diff --git a/htdocs/images/planetes/59.jpg b/htdocs/images/planetes/59.jpg deleted file mode 100644 index 28f5a02..0000000 Binary files a/htdocs/images/planetes/59.jpg and /dev/null differ diff --git a/htdocs/images/planetes/6.jpg b/htdocs/images/planetes/6.jpg index dd6c466..39d266a 100644 Binary files a/htdocs/images/planetes/6.jpg and b/htdocs/images/planetes/6.jpg differ diff --git a/htdocs/images/planetes/60.jpg b/htdocs/images/planetes/60.jpg deleted file mode 100644 index 472872c..0000000 Binary files a/htdocs/images/planetes/60.jpg and /dev/null differ diff --git a/htdocs/images/planetes/61.jpg b/htdocs/images/planetes/61.jpg deleted file mode 100644 index a38d82a..0000000 Binary files a/htdocs/images/planetes/61.jpg and /dev/null differ diff --git a/htdocs/images/planetes/62.jpg b/htdocs/images/planetes/62.jpg deleted file mode 100644 index 7741875..0000000 Binary files a/htdocs/images/planetes/62.jpg and /dev/null differ diff --git a/htdocs/images/planetes/63.jpg b/htdocs/images/planetes/63.jpg deleted file mode 100644 index 88e05f8..0000000 Binary files a/htdocs/images/planetes/63.jpg and /dev/null differ diff --git a/htdocs/images/planetes/64.jpg b/htdocs/images/planetes/64.jpg deleted file mode 100644 index eb4b432..0000000 Binary files a/htdocs/images/planetes/64.jpg and /dev/null differ diff --git a/htdocs/images/planetes/65.jpg b/htdocs/images/planetes/65.jpg deleted file mode 100644 index 74a6531..0000000 Binary files a/htdocs/images/planetes/65.jpg and /dev/null differ diff --git a/htdocs/images/planetes/66.jpg b/htdocs/images/planetes/66.jpg deleted file mode 100644 index fc21fd4..0000000 Binary files a/htdocs/images/planetes/66.jpg and /dev/null differ diff --git a/htdocs/images/planetes/67.jpg b/htdocs/images/planetes/67.jpg deleted file mode 100644 index 7f42702..0000000 Binary files a/htdocs/images/planetes/67.jpg and /dev/null differ diff --git a/htdocs/images/planetes/68.jpg b/htdocs/images/planetes/68.jpg deleted file mode 100644 index 3910727..0000000 Binary files a/htdocs/images/planetes/68.jpg and /dev/null differ diff --git a/htdocs/images/planetes/69.jpg b/htdocs/images/planetes/69.jpg deleted file mode 100644 index 29c4de7..0000000 Binary files a/htdocs/images/planetes/69.jpg and /dev/null differ diff --git a/htdocs/images/planetes/7.jpg b/htdocs/images/planetes/7.jpg index ba61b23..2cf0298 100644 Binary files a/htdocs/images/planetes/7.jpg and b/htdocs/images/planetes/7.jpg differ diff --git a/htdocs/images/planetes/70.jpg b/htdocs/images/planetes/70.jpg deleted file mode 100644 index fd73f83..0000000 Binary files a/htdocs/images/planetes/70.jpg and /dev/null differ diff --git a/htdocs/images/planetes/71.jpg b/htdocs/images/planetes/71.jpg deleted file mode 100644 index a5885ac..0000000 Binary files a/htdocs/images/planetes/71.jpg and /dev/null differ diff --git a/htdocs/images/planetes/72.jpg b/htdocs/images/planetes/72.jpg deleted file mode 100644 index f5992b8..0000000 Binary files a/htdocs/images/planetes/72.jpg and /dev/null differ diff --git a/htdocs/images/planetes/73.jpg b/htdocs/images/planetes/73.jpg deleted file mode 100644 index 885d400..0000000 Binary files a/htdocs/images/planetes/73.jpg and /dev/null differ diff --git a/htdocs/images/planetes/74.jpg b/htdocs/images/planetes/74.jpg deleted file mode 100644 index 200af78..0000000 Binary files a/htdocs/images/planetes/74.jpg and /dev/null differ diff --git a/htdocs/images/planetes/75.jpg b/htdocs/images/planetes/75.jpg deleted file mode 100644 index 39c0534..0000000 Binary files a/htdocs/images/planetes/75.jpg and /dev/null differ diff --git a/htdocs/images/planetes/76.jpg b/htdocs/images/planetes/76.jpg deleted file mode 100644 index f45f8fb..0000000 Binary files a/htdocs/images/planetes/76.jpg and /dev/null differ diff --git a/htdocs/images/planetes/77.jpg b/htdocs/images/planetes/77.jpg deleted file mode 100644 index a6e6842..0000000 Binary files a/htdocs/images/planetes/77.jpg and /dev/null differ diff --git a/htdocs/images/planetes/78.jpg b/htdocs/images/planetes/78.jpg deleted file mode 100644 index b7785ba..0000000 Binary files a/htdocs/images/planetes/78.jpg and /dev/null differ diff --git a/htdocs/images/planetes/79.jpg b/htdocs/images/planetes/79.jpg deleted file mode 100644 index b5c3c17..0000000 Binary files a/htdocs/images/planetes/79.jpg and /dev/null differ diff --git a/htdocs/images/planetes/8.jpg b/htdocs/images/planetes/8.jpg index fe868a8..e2f7df0 100644 Binary files a/htdocs/images/planetes/8.jpg and b/htdocs/images/planetes/8.jpg differ diff --git a/htdocs/images/planetes/80.jpg b/htdocs/images/planetes/80.jpg deleted file mode 100644 index 86d4cc9..0000000 Binary files a/htdocs/images/planetes/80.jpg and /dev/null differ diff --git a/htdocs/images/planetes/81.jpg b/htdocs/images/planetes/81.jpg deleted file mode 100644 index 8016a06..0000000 Binary files a/htdocs/images/planetes/81.jpg and /dev/null differ diff --git a/htdocs/images/planetes/82.jpg b/htdocs/images/planetes/82.jpg deleted file mode 100644 index 60f21a4..0000000 Binary files a/htdocs/images/planetes/82.jpg and /dev/null differ diff --git a/htdocs/images/planetes/83.jpg b/htdocs/images/planetes/83.jpg deleted file mode 100644 index 94f381d..0000000 Binary files a/htdocs/images/planetes/83.jpg and /dev/null differ diff --git a/htdocs/images/planetes/84.jpg b/htdocs/images/planetes/84.jpg deleted file mode 100644 index d8d2ed6..0000000 Binary files a/htdocs/images/planetes/84.jpg and /dev/null differ diff --git a/htdocs/images/planetes/85.jpg b/htdocs/images/planetes/85.jpg deleted file mode 100644 index bc64d9c..0000000 Binary files a/htdocs/images/planetes/85.jpg and /dev/null differ diff --git a/htdocs/images/planetes/86.jpg b/htdocs/images/planetes/86.jpg deleted file mode 100644 index b81cd35..0000000 Binary files a/htdocs/images/planetes/86.jpg and /dev/null differ diff --git a/htdocs/images/planetes/87.jpg b/htdocs/images/planetes/87.jpg deleted file mode 100644 index 6383e55..0000000 Binary files a/htdocs/images/planetes/87.jpg and /dev/null differ diff --git a/htdocs/images/planetes/88.jpg b/htdocs/images/planetes/88.jpg deleted file mode 100644 index 6b1fb93..0000000 Binary files a/htdocs/images/planetes/88.jpg and /dev/null differ diff --git a/htdocs/images/planetes/89.jpg b/htdocs/images/planetes/89.jpg deleted file mode 100644 index ab6fa92..0000000 Binary files a/htdocs/images/planetes/89.jpg and /dev/null differ diff --git a/htdocs/images/planetes/9.jpg b/htdocs/images/planetes/9.jpg index 4f486dc..331e188 100644 Binary files a/htdocs/images/planetes/9.jpg and b/htdocs/images/planetes/9.jpg differ diff --git a/htdocs/images/planetes/90.jpg b/htdocs/images/planetes/90.jpg deleted file mode 100644 index 71be830..0000000 Binary files a/htdocs/images/planetes/90.jpg and /dev/null differ diff --git a/htdocs/images/planetes/91.jpg b/htdocs/images/planetes/91.jpg deleted file mode 100644 index 60ece52..0000000 Binary files a/htdocs/images/planetes/91.jpg and /dev/null differ diff --git a/htdocs/images/planetes/92.jpg b/htdocs/images/planetes/92.jpg deleted file mode 100644 index a609ea7..0000000 Binary files a/htdocs/images/planetes/92.jpg and /dev/null differ diff --git a/htdocs/images/planetes/93.jpg b/htdocs/images/planetes/93.jpg deleted file mode 100644 index 28cb911..0000000 Binary files a/htdocs/images/planetes/93.jpg and /dev/null differ diff --git a/htdocs/images/planetes/94.jpg b/htdocs/images/planetes/94.jpg deleted file mode 100644 index 7351432..0000000 Binary files a/htdocs/images/planetes/94.jpg and /dev/null differ diff --git a/htdocs/images/planetes/95.jpg b/htdocs/images/planetes/95.jpg deleted file mode 100644 index 46f2dce..0000000 Binary files a/htdocs/images/planetes/95.jpg and /dev/null differ diff --git a/htdocs/images/planetes/96.jpg b/htdocs/images/planetes/96.jpg deleted file mode 100644 index 07009bd..0000000 Binary files a/htdocs/images/planetes/96.jpg and /dev/null differ diff --git a/htdocs/images/planetes/97.jpg b/htdocs/images/planetes/97.jpg deleted file mode 100644 index 947d5eb..0000000 Binary files a/htdocs/images/planetes/97.jpg and /dev/null differ diff --git a/htdocs/images/planetes/98.jpg b/htdocs/images/planetes/98.jpg deleted file mode 100644 index 88b6642..0000000 Binary files a/htdocs/images/planetes/98.jpg and /dev/null differ diff --git a/htdocs/images/planetes/99.jpg b/htdocs/images/planetes/99.jpg deleted file mode 100644 index 4b8f062..0000000 Binary files a/htdocs/images/planetes/99.jpg and /dev/null differ diff --git a/htdocs/js/flotte.js b/htdocs/js/flotte.js index 129e9c7..061a7b1 100644 --- a/htdocs/js/flotte.js +++ b/htdocs/js/flotte.js @@ -91,26 +91,11 @@ window.onload = function(){ function tempsFlotte() { document.getElementById('deblok').innerHTML = '...'; - var url_string = (window.location.href).toLowerCase(); - var url = new URL(url_string); - var cds = url.searchParams.get("c"); new Ajax.Request( 'ajax_flotte.php', { method: 'post', - parameters: { - cds_temp: cds, - fav_dest: document.getElementById('fav_dest').value, - nom: document.getElementById('nom').value, - mission: document.getElementById('mission').value, - met: document.getElementById('metal').value, - cri: document.getElementById('cristal').value, - hyd: document.getElementById('hydrogene').value, - galaxie: document.getElementById('amas').value, - ss: document.getElementById('ss').value, - pos: document.getElementById('plan').value, - vitesse: document.getElementById('vitesse').value - }, + parameters: {fav_dest: document.getElementById('fav_dest').value, nom: document.getElementById('nom').value, mission: document.getElementById('mission').value, met: document.getElementById('metal').value, cri: document.getElementById('cristal').value, hyd: document.getElementById('hydrogene').value, galaxie: document.getElementById('amas').value, ss: document.getElementById('ss').value, pos: document.getElementById('plan').value, vitesse: document.getElementById('vitesse').value}, onSuccess: function(transport, json) { document.getElementById('destination').innerHTML = json.root.destination; document.getElementById('temps').innerHTML = json.root.temps; @@ -122,4 +107,4 @@ function tempsFlotte() { } } ); -} +} \ No newline at end of file diff --git a/onyx2/config/root.xml b/onyx2/config/root.xml index 2eaf7be..8b3583e 100644 --- a/onyx2/config/root.xml +++ b/onyx2/config/root.xml @@ -81,7 +81,7 @@ ?p=classement ?p=chat http://www.halo-battle.fr/forum/ - # + http://issues.halo-battle.s-fr.com/ ?p=faq ?p=deconnexion ?p=pilori @@ -159,4 +159,4 @@ - + \ No newline at end of file diff --git a/onyx2/include/Class/Donnees/batiments.php b/onyx2/include/Class/Donnees/batiments.php index 9c8b4a0..5cd6e81 100644 --- a/onyx2/include/Class/Donnees/batiments.php +++ b/onyx2/include/Class/Donnees/batiments.php @@ -311,15 +311,6 @@ class dBatiments implements Donnees $sec /= (pow(1.23, $planete->batiments[11]) + 1.0025 * $planete->casernes[7]); } - //Bonus technologique de vitesse de construction : Constructions Planétaires - if ($planete->technologies[2]& dTechnologies::idToBit(2)) { - $sec /= 1.15; - } elseif ($planete->technologies[2]& dTechnologies::idToBit(1)) { - $sec /= 1.10; - } elseif ($planete->technologies[2]& dTechnologies::idToBit(0)) { - $sec /= 1.05; - } - //Accélération du temps de construction $sec /= VITESSE; diff --git a/onyx2/include/Class/Donnees/interface.php b/onyx2/include/Class/Donnees/interface.php index 55d5975..adf1587 100644 --- a/onyx2/include/Class/Donnees/interface.php +++ b/onyx2/include/Class/Donnees/interface.php @@ -87,12 +87,10 @@ class dDonnees } } - public static function print_neededCheck($tableau, surface $planete, $race = null) + public static function print_neededCheck($tableau, surface $planete) { global $LANG; - if ($race == null) { - $race = $planete->race; - } + $race = $planete->race; if (!is_array($tableau)) { return 'Débloqué'; } else { diff --git a/onyx2/include/Class/Donnees/spatial.php b/onyx2/include/Class/Donnees/spatial.php index ce4282a..56c772b 100644 --- a/onyx2/include/Class/Donnees/spatial.php +++ b/onyx2/include/Class/Donnees/spatial.php @@ -3,12 +3,9 @@ require_once("Class/Donnees/interface.php"); class dSpatial implements Donnees { - public static function metal($id, $nombre, surface $planete, $race = null) + public static function metal($id, $nombre, surface $planete) { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { + if ($planete->race == "humain") { switch ($id) { case 0: $metal = 1000; @@ -121,12 +118,9 @@ class dSpatial implements Donnees return $metal * $nombre; } - public static function cristal($id, $nombre, surface $planete, $race = null) + public static function cristal($id, $nombre, surface $planete) { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { + if ($planete->race == "humain") { switch ($id) { case 0: $cristal = 800; @@ -220,7 +214,7 @@ class dSpatial implements Donnees case 14: $cristal = 19400; break; - case 15: + case 16: $cristal = 23000; break; case 16: @@ -239,12 +233,9 @@ class dSpatial implements Donnees return $cristal * $nombre; } - public static function hydrogene($id, $nombre, surface $planete, $race = null) + public static function hydrogene($id, $nombre, surface $planete) { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { + if ($planete->race == "humain") { switch ($id) { case 0: $hydrogene = 180; @@ -338,7 +329,7 @@ class dSpatial implements Donnees case 14: $hydrogene = 3740; break; - case 15: + case 16: $hydrogene = 4050; break; case 16: @@ -357,17 +348,14 @@ class dSpatial implements Donnees return $hydrogene * $nombre; } - public static function credits($id, $nombre, surface $planete, $race = null) + public static function credits($id, $nombre, surface $planete) { return 0; } - public static function temps($id, $nombre, surface $planete, $race = null) + public static function temps($id, $nombre, surface $planete) { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { + if ($planete->race == "humain") { switch ($id) { case 0: $temps = 733; @@ -422,7 +410,7 @@ class dSpatial implements Donnees $moins = 12; break; case 13: - $temps = 2000; + $temps = 34900; $moins = 12; break; default: @@ -514,12 +502,10 @@ class dSpatial implements Donnees } } - public static function image($id, surface $planete, $race = null) + + public static function image($id, surface $planete) { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { + if ($planete->race == "humain") { switch ($id) { case 0: return "csnucargoparabola2mc9.jpg"; @@ -556,7 +542,7 @@ class dSpatial implements Donnees break; } return Donnees::image_humain_default; - } else { + } elseif ($planete->race == "covenant") { switch ($id) { case 0: return "cargo2pb6.jpg"; @@ -567,32 +553,39 @@ class dSpatial implements Donnees case 2: return "colocopiers4.jpg"; break; - case 6: - return "chasseurlourd7id.jpg"; - break; - case 7: + case 3: return "sonde_despionnage1.jpg"; break; - case 8: + case 4: + return "chasseurlourd7id.jpg"; + break; + case 5: return "contactharvestbynameleszk3.jpg"; break; - case 9: + case 6: return "vaisseauuu0.jpg"; break; - case 10: + case 7: return "vaisseaudebataille9na.jpg"; break; - case 14: + case 8: return "pv.jpg"; break; - case 16: + case 9: + return "stationorbitalezt7.jpg"; + break; + case 10: return "citecovenant.jpg"; break; } return Donnees::image_covenant_default; + } else { + trigger_error("Impossible de trouver la race pour ".$planete->race, E_USER_ERROR); } } + + public static function needed($id, surface $planete, $print = false, $race = null) { if ($race == null) { @@ -655,8 +648,8 @@ class dSpatial implements Donnees array('technologies', 7,9) ), array( - array('batiments', 8, 3), - array('technologies', 7, 4) + array('batiments', 8, 10), + array('technologies', 7,10) ) ); } else { @@ -672,7 +665,7 @@ class dSpatial implements Donnees ), array( array('batiments', 8, 3), - array('technologies', 8, 0) + array('technologies', 8, 1) ), array( array('batiments', 8, 3), @@ -734,18 +727,16 @@ class dSpatial implements Donnees } if ($print) { - return dDonnees::print_neededCheck($neededSpatial[$id], $planete, $race); + return dDonnees::print_neededCheck($neededSpatial[$id], $planete); } else { return dDonnees::neededCheck($neededSpatial[$id], $planete); } } - public static function tailleCales($id, surface $planete, $race = null) + + public static function tailleCales($id) { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { + if ($planete->race == "humain") { switch ($id) { case 0: $vitesse = 10000; @@ -790,7 +781,7 @@ class dSpatial implements Donnees $vitesse = 15000; break; default: - $vitesse = 0; + trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); } } else { switch ($id) { @@ -846,7 +837,7 @@ class dSpatial implements Donnees $vitesse = 20000000; break; default: - $vitesse = 0; + trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); } } @@ -854,7 +845,8 @@ class dSpatial implements Donnees return $vitesse; } - public static function vitesseP($id, surface $planete) + + public static function vitesseP($id) { if ($planete->race == "humain") { switch ($id) { @@ -965,7 +957,7 @@ class dSpatial implements Donnees return $vitesse; } - public static function vitesseS($id, surface $planete) + public static function vitesseS($id) { if ($planete->race == "humain") { switch ($id) { @@ -1076,7 +1068,7 @@ class dSpatial implements Donnees return $vitesse; } - public static function vitesseG($id, surface $planete) + public static function vitesseG($id) { if ($planete->race == "humain") { switch ($id) { @@ -1186,418 +1178,4 @@ class dSpatial implements Donnees //On tient compte des bonus return $vitesse; } - - public static function attaque($id, surface $planete, $race = null) - { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { - switch ($id) { - case 0: - $attaque = 10; - break; - case 1: - $attaque = 20; - break; - case 2: - $attaque = 20; - break; - case 3: - $attaque = 20; - break; - case 4: - $attaque = 50; - break; - case 5: - $attaque = 250; - break; - case 6: - $attaque = 720; - break; - case 7: - $attaque = 1240; - break; - case 8: - $attaque = 1990; - break; - case 9: - $attaque = 3250; - break; - case 10: - $attaque = 4250; - break; - case 11: - $attaque = 8500; - break; - case 12: - $attaque = 16000; - break; - case 13: - $attaque = 20; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } else { - switch ($id) { - case 0: - $attaque = 0; - break; - case 1: - $attaque = 25; - break; - case 2: - $attaque = 25; - break; - case 3: - $attaque = 25; - break; - case 4: - $attaque = 50; - break; - case 5: - $attaque = 100; - break; - case 6: - $attaque = 250; - break; - case 7: - $attaque = 740; - break; - case 8: - $attaque = 1300; - break; - case 9: - $attaque = 2000; - break; - case 10: - $attaque = 3400; - break; - case 11: - $attaque = 4400; - break; - case 12: - $attaque = 9300; - break; - case 13: - $attaque = 8400; - break; - case 14: - $attaque = 8300; - break; - case 15: - $attaque = 11500; - break; - case 16: - $attaque = 0; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } - - //On tient compte des bonus - //Bonus pour les vaisseaux léger - if ($id <= 3) { - //Bonus Assistance de visée - if ($planete->technologies[4]& dTechnologies::idToBit(5)) { - $attaque *= 1.30; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(4)) { - $attaque *= 1.20; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(3)) { - $attaque *= 1.10; - } - } - - //Bonus pour les vaisseaux moyen - if ($id >= 4 && $id <= 7) { - //Bonus Guidage laser - if ($planete->technologies[4]& dTechnologies::idToBit(8)) { - $attaque *= 1.30; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(7)) { - $attaque *= 1.20; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(6)) { - $attaque *= 1.10; - } - } - - //Bonus pour les vaisseaux lourds - if ($id >= 8) { - //Bonus Condensateurs Rapides - if ($planete->technologies[4]& dTechnologies::idToBit(11)) { - $attaque *= 1.30; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(10)) { - $attaque *= 1.20; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(9)) { - $attaque *= 1.10; - } - } - - return $attaque; - } - - public static function bouclier($id, surface $planete, $race = null) - { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { - switch ($id) { - case 0: - $bouclier = 500; - break; - case 1: - $bouclier = 2000; - break; - case 2: - $bouclier = 2000; - break; - case 3: - $bouclier = 1500; - break; - case 4: - $bouclier = 250; - break; - case 5: - $bouclier = 1000; - break; - case 6: - $bouclier = 1750; - break; - case 7: - $bouclier = 3000; - break; - case 8: - $bouclier = 5000; - break; - case 9: - $bouclier = 9000; - break; - case 10: - $bouclier = 10000; - break; - case 11: - $bouclier = 10250; - break; - case 12: - $bouclier = 12750; - break; - case 13: - $bouclier = 750; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } else { - switch ($id) { - case 0: - $bouclier = 400; - break; - case 1: - $bouclier = 1800; - break; - case 2: - $bouclier = 2000; - break; - case 3: - $bouclier = 400; - break; - case 4: - $bouclier = 200; - break; - case 5: - $bouclier = 300; - break; - case 6: - $bouclier = 900; - break; - case 7: - $bouclier = 1500; - break; - case 8: - $bouclier = 3000; - break; - case 9: - $bouclier = 4600; - break; - case 10: - $bouclier = 8000; - break; - case 11: - $bouclier = 9000; - break; - case 12: - $bouclier = 15000; - break; - case 13: - $bouclier = 10400; - break; - case 14: - $bouclier = 9700; - break; - case 15: - $bouclier = 11500; - break; - case 16: - $bouclier = 50000; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } - - //On tient compte des bonus - return $bouclier; - } - - public static function armature($id, surface $planete, $race = null) - { - if ($race == null) { - $race = $planete->race; - } - if ($race == "humain") { - switch ($id) { - case 0: - $armature = 100; - break; - case 1: - $armature = 400; - break; - case 2: - $armature = 400; - break; - case 3: - $armature = 300; - break; - case 4: - $armature = 50; - break; - case 5: - $armature = 200; - break; - case 6: - $armature = 350; - break; - case 7: - $armature = 600; - break; - case 8: - $armature = 1000; - break; - case 9: - $armature = 1800; - break; - case 10: - $armature = 2000; - break; - case 11: - $armature = 2050; - break; - case 12: - $armature = 2550; - break; - case 13: - $armature = 150; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } else { - switch ($id) { - case 0: - $armature = 200; - break; - case 1: - $armature = 600; - break; - case 2: - $armature = 800; - break; - case 3: - $armature = 120; - break; - case 4: - $armature = 100; - break; - case 5: - $armature = 150; - break; - case 6: - $armature = 300; - break; - case 7: - $armature = 600; - break; - case 8: - $armature = 600; - break; - case 9: - $armature = 1400; - break; - case 10: - $armature = 2800; - break; - case 11: - $armature = 3000; - break; - case 12: - $armature = 3000; - break; - case 13: - $armature = 3600; - break; - case 14: - $armature = 3600; - break; - case 15: - $armature = 3500; - break; - case 16: - $armature = 30000; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } - - //On tient compte des bonus - //Bonus pour les vaisseaux léger - if ($id <= 3) { - //Bonus Alliage - if ($planete->technologies[5]& dTechnologies::idToBit(20)) { - $armature *= 1.30; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(19)) { - $armature *= 1.20; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(18)) { - $armature *= 1.10; - } - } - - //Bonus pour les vaisseaux moyen - if ($id >= 4 && $id <= 7) { - //Bonus Alliage avancé - if ($planete->technologies[5]& dTechnologies::idToBit(23)) { - $armature *= 1.30; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(22)) { - $armature *= 1.20; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(21)) { - $armature *= 1.10; - } - } - - //Bonus pour les vaisseaux lourds - if ($id >= 8) { - //Bonus Armure Moléculaire - if ($planete->technologies[5]& dTechnologies::idToBit(26)) { - $armature *= 1.30; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(25)) { - $armature *= 1.20; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(24)) { - $armature *= 1.10; - } - } - - return $armature; - } } diff --git a/onyx2/include/Class/Donnees/technologies.php b/onyx2/include/Class/Donnees/technologies.php index f6b9db0..b83d177 100644 --- a/onyx2/include/Class/Donnees/technologies.php +++ b/onyx2/include/Class/Donnees/technologies.php @@ -1046,11 +1046,8 @@ class dTechnologies implements Donnees } - public static function needed($object, surface $planete, $print = false, $race = null) + public static function needed($object, surface $planete, $print = false) { - if ($race == null) { - $race = $planete->race; - } switch ($object[0]) { case 0: $tableau = array( @@ -1491,125 +1488,64 @@ class dTechnologies implements Donnees ); break; case 7: - if ($race == "humain") { - $tableau = array( - array( - array('batiments', 6, 1) - ), - array( - array("technologies", 7, 0), - array('batiments', 6, 2) - ), - array( - array("technologies", 7, 1), - array('batiments', 6, 3) - ), - array( - array("technologies", 7, 2), - array('batiments', 6, 5) - ), - array( - array("technologies", 7, 1), - array('batiments', 6, 3) - ), - array( - array("technologies", 7, 3), - array('batiments', 6, 8) - ), - array( - array("technologies", 7, 5), - array('batiments', 6, 10) - ), - array( - array("technologies", 7, 6), - array('batiments', 6, 15) - ), - array( - array("technologies", 7, 7), - array('batiments', 6, 20) - ), - array( - array("technologies", 7, 8), - array('batiments', 6, 30) - ), - array( - array("technologies", 7, 5), - array('batiments', 6, 10) - ), - array( - array("technologies", 7, 4), - array('batiments', 6, 3) - ), - array( - array('batiments', 6, 5) - ), - array( - array("technologies", 7, 12) - ), - array( - array("technologies", 7, 13) - ), - ); - } else { - $tableau = array( - array( - array('batiments', 6, 1) - ), - array( - array("technologies", 7, 0), - array('batiments', 6, 2) - ), - array( - array("technologies", 7, 1), - array('batiments', 6, 3) - ), - array( - array("technologies", 7, 2), - array('batiments', 6, 5) - ), - array( - array("technologies", 7, 1), - array('batiments', 6, 3) - ), - array( - array("technologies", 7, 3), - array('batiments', 6, 8) - ), - array( - array("technologies", 7, 5), - array('batiments', 6, 10) - ), - array( - array("technologies", 7, 6), - array('batiments', 6, 15) - ), - array( - array("technologies", 7, 7), - array('batiments', 6, 20) - ), - array( - array("technologies", 7, 8), - array('batiments', 6, 30) - ), - array( - array("technologies", 7, 5), - array('batiments', 6, 10) - ), - array( - array("technologies", 7, 5), - array('batiments', 6, 10) - ), - array( - array('batiments', 6, 5) - ), - array( - array("technologies", 7, 12) - ), - array( - array("technologies", 7, 13) - ), - ); - } + $tableau = array( + array( + array('batiments', 6, 1) + ), + array( + array("technologies", 7, 0), + array('batiments', 6, 2) + ), + array( + array("technologies", 7, 1), + array('batiments', 6, 3) + ), + array( + array("technologies", 7, 2), + array('batiments', 6, 5) + ), + array( + array("technologies", 7, 1), + array('batiments', 6, 3) + ), + array( + array("technologies", 7, 3), + array('batiments', 6, 8) + ), + array( + array("technologies", 7, 5), + array('batiments', 6, 10) + ), + array( + array("technologies", 7, 6), + array('batiments', 6, 15) + ), + array( + array("technologies", 7, 7), + array('batiments', 6, 20) + ), + array( + array("technologies", 7, 8), + array('batiments', 6, 30) + ), + array( + array("technologies", 7, 5), + array('batiments', 6, 10) + ), + array( + array("technologies", 7, 5), + array('batiments', 6, 10) + ), + array( + array('batiments', 6, 5) + ), + array( + array("technologies", 7, 12) + ), + array( + array("technologies", 7, 13) + ), + ); break; case 8: $tableau = array( @@ -1617,9 +1553,6 @@ class dTechnologies implements Donnees array("technologies", 1, 0), array('batiments', 6, 2) ), - array( - array("technologies", 8, 0) - ), array( array("technologies", 8, 1) ), @@ -1671,6 +1604,9 @@ class dTechnologies implements Donnees array( array("technologies", 8, 17) ), + array( + array("technologies", 8, 18) + ), ); break; default: @@ -1678,7 +1614,7 @@ class dTechnologies implements Donnees } if ($print) { - return dDonnees::print_neededCheck($tableau[$object[1]], $planete, $race); + return dDonnees::print_neededCheck($tableau[$object[1]], $planete); } else { return dDonnees::neededCheck($tableau[$object[1]], $planete); } diff --git a/onyx2/include/Class/Donnees/terrestre.php b/onyx2/include/Class/Donnees/terrestre.php index 3df2f67..005413e 100644 --- a/onyx2/include/Class/Donnees/terrestre.php +++ b/onyx2/include/Class/Donnees/terrestre.php @@ -471,15 +471,6 @@ class dTerrestre implements Donnees $temps /= VITESSE; //On tient compte des bonus - //Bonus technologique de vitesse de construction : Constructions Planétaires - if ($planete->technologies[2]& dTechnologies::idToBit(2)) { - $temps /= 1.15; - } elseif ($planete->technologies[2]& dTechnologies::idToBit(1)) { - $temps /= 1.10; - } elseif ($planete->technologies[2]& dTechnologies::idToBit(0)) { - $temps /= 1.05; - } - return ceil($temps/pow(1.25, ($planete->batiments[7] - $moins))) * $nombre; } @@ -747,274 +738,9 @@ class dTerrestre implements Donnees } if ($print) { - return dDonnees::print_neededCheck($neededTerrestre[$id], $planete, $race); + return dDonnees::print_neededCheck($neededTerrestre[$id], $planete); } else { return dDonnees::neededCheck($neededTerrestre[$id], $planete); } } - - - public static function attaque($id, surface $planete, $race = null) - { - if ($race == null) { - $race = $planete->race; - } - //Les véhicules ne sont pas implémenté pour le moment - if ($id < 8) { - return 0; - } - if ($race == "humain") { - switch ($id) { - case 8: - $attaque = 15; - break; - case 9: - $attaque = 50; - break; - case 10: - $attaque = 1000; - break; - case 11: - $attaque = 2000; - break; - case 12: - $attaque = 3000; - break; - case 13: - $attaque = 3500; - break; - case 14: - $attaque = 6000; - break; - case 15: - $attaque = 15000; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } else { - switch ($id) { - case 8: - $attaque = 15; - break; - case 9: - $attaque = 50; - break; - case 10: - $attaque = 1000; - break; - case 11: - $attaque = 2000; - break; - case 12: - $attaque = 3000; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } - - //On tient compte des bonus - //Bonus pour les défenses légère - if ($id == 8 || $id == 9) { - //Bonus Projectiles haute densité - if ($planete->technologies[4]& dTechnologies::idToBit(2)) { - $attaque *= 1.30; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(1)) { - $attaque *= 1.20; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(0)) { - $attaque *= 1.10; - } - } - - //Bonus pour les défenses moyenne - if ($id == 10 || $id == 11) { - //Bonus Ballistique avancée - if ($planete->technologies[4]& dTechnologies::idToBit(14)) { - $attaque *= 1.30; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(13)) { - $attaque *= 1.20; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(12)) { - $attaque *= 1.10; - } - } - - //Bonus pour les défenses lourdes - if ($id >= 12) { - //Bonus Accélération Magnétique - if ($planete->technologies[4]& dTechnologies::idToBit(17)) { - $attaque *= 1.30; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(16)) { - $attaque *= 1.20; - } elseif ($planete->technologies[4]& dTechnologies::idToBit(15)) { - $attaque *= 1.10; - } - } - - return $attaque; - } - - public static function bouclier($id, surface $planete, $race = null) - { - if ($race == null) { - $race = $planete->race; - } - //Les véhicules ne sont pas implémenté pour le moment - if ($id < 8) { - return 0; - } - if ($race == "humain") { - switch ($id) { - case 8: - $bouclier = 25; - break; - case 9: - $bouclier = 75; - break; - case 10: - $bouclier = 1500; - break; - case 11: - $bouclier = 1800; - break; - case 12: - $bouclier = 4850; - break; - case 13: - $bouclier = 5000; - break; - case 14: - $bouclier = 5000; - break; - case 15: - $bouclier = 7500; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } else { - switch ($id) { - case 8: - $bouclier = 40; - break; - case 9: - $bouclier = 120; - break; - case 10: - $bouclier = 2600; - break; - case 11: - $bouclier = 5000; - break; - case 12: - $bouclier = 8600; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } - - //On tient compte des bonus - return $bouclier; - } - - public static function armature($id, surface $planete, $race = null) - { - if ($race == null) { - $race = $planete->race; - } - //Les véhicules ne sont pas implémenté pour le moment - if ($id < 8) { - return 0; - } - if ($race == "humain") { - switch ($id) { - case 8: - $armature = 25; - break; - case 9: - $armature = 75; - break; - case 10: - $armature = 1500; - break; - case 11: - $armature = 1800; - break; - case 12: - $armature = 4850; - break; - case 13: - $armature = 5000; - break; - case 14: - $armature = 5000; - break; - case 15: - $armature = 7500; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } else { - switch ($id) { - case 8: - $armature = 10; - break; - case 9: - $armature = 30; - break; - case 10: - $armature = 400; - break; - case 11: - $armature = 700; - break; - case 12: - $armature = 1400; - break; - default: - trigger_error("Vaisseau ".$id." introuvable dans les données", E_USER_ERROR); - } - } - - //On tient compte des bonus - //Bonus pour les défenses légères - if ($id == 8 || $id == 9) { - //Bonus Alliage - if ($planete->technologies[5]& dTechnologies::idToBit(20)) { - $armature *= 1.30; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(19)) { - $armature *= 1.20; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(18)) { - $armature *= 1.10; - } - } - - //Bonus pour les défense moyennes - if ($id == 10 || $id == 11) { - //Bonus Alliage avancé - if ($planete->technologies[5]& dTechnologies::idToBit(23)) { - $armature *= 1.30; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(22)) { - $armature *= 1.20; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(21)) { - $armature *= 1.10; - } - } - - //Bonus pour les défenses lourdes - if ($id >= 12) { - //Bonus Armure Moléculaire - if ($planete->technologies[5]& dTechnologies::idToBit(26)) { - $armature *= 1.30; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(25)) { - $armature *= 1.20; - } elseif ($planete->technologies[5]& dTechnologies::idToBit(24)) { - $armature *= 1.10; - } - } - - return $armature; - } } diff --git a/onyx2/include/Class/flotte.php b/onyx2/include/Class/flotte.php index 2753972..1a7559c 100644 --- a/onyx2/include/Class/flotte.php +++ b/onyx2/include/Class/flotte.php @@ -88,13 +88,12 @@ class Flotte public function calculer() { - global $planete; $this->nb_vais = 0; //Calcul de la capacité maximale d'embarquement de la flotte foreach ($this->vaisseaux as $key => $vais) { $this->nb_vais += $vais; - $this->contenuMax += dSpatial::tailleCales($key, $planete) * $vais; + $this->contenuMax += dSpatial::tailleCales($key) * $vais; } } @@ -266,20 +265,20 @@ class Flotte //Calcul du temps de déplacement entre planètes if ($start_planete->ss == $end_systeme && $start_planete->galaxie == $end_galaxie) { - $temps[0][$key] = (1000/dSpatial::vitesseP($key, $start_planete)) * (1 + 0.1 * $diff_position); + $temps[0][$key] = (1000/dSpatial::vitesseP($key)) * (1 + 0.1 * $diff_position); $temps[1][$key] = $temps[2][$key] = 0; } //Calcul du temps de déplacement entre système elseif ($start_planete->galaxie == $end_galaxie) { - $temps[0][$key] = (1000/dSpatial::vitesseP($key, $start_planete)) * (1 + 0.1 * ($diff_centre_position_start + $diff_centre_position_end)); - $temps[1][$key] = (2000/dSpatial::vitesseS($key, $start_planete)) * (2 + 1 * $diff_systeme); + $temps[0][$key] = (1000/dSpatial::vitesseP($key)) * (1 + 0.1 * ($diff_centre_position_start + $diff_centre_position_end)); + $temps[1][$key] = (2000/dSpatial::vitesseS($key)) * (2 + 1 * $diff_systeme); $temps[2][$key] = 0; } //Calcul du temps de déplacement entre galaxies else { - $temps[0][$key] = (1000/dSpatial::vitesseP($key, $start_planete)) * (1 + 0.1 * ($diff_centre_position_start + $diff_centre_position_end)); - $temps[1][$key] = (2000/dSpatial::vitesseS($key, $start_planete)) * (2 + 1 * ($diff_centre_systeme_start + $diff_centre_systeme_end)); - $temps[2][$key] = (5000/dSpatial::vitesseG($key, $start_planete)) * (2 + 1.5 * $diff_galaxie); + $temps[0][$key] = (1000/dSpatial::vitesseP($key)) * (1 + 0.1 * ($diff_centre_position_start + $diff_centre_position_end)); + $temps[1][$key] = (2000/dSpatial::vitesseS($key)) * (2 + 1 * ($diff_centre_systeme_start + $diff_centre_systeme_end)); + $temps[2][$key] = (5000/dSpatial::vitesseG($key)) * (2 + 1.5 * $diff_galaxie); } //Calcul du bonus pour le réacteur à combustion @@ -333,7 +332,7 @@ class Flotte } //Si les chasseurs peuvent rentrer dans les cales des vaisseaux, on les enlèves - if ($contenuDispo - ceil($conso[0]+$conso[1]+$conso[2]) - ($vaisseaux[4] * dSpatial::tailleCales(4, $start_planete) + $vaisseaux[5] * dSpatial::tailleCales(5, $start_planete)) >= ($vaisseaux[4] + $vaisseaux[5]) * 200) { + if ($contenuDispo - ceil($conso[0]+$conso[1]+$conso[2]) - ($vaisseaux[4] * dSpatial::tailleCales(4) + $vaisseaux[5] * dSpatial::tailleCales(5)) >= ($vaisseaux[4] + $vaisseaux[5]) * 200) { $temps[2][4] = $temps[2][5] = $temps[1][4] = $temps[1][5] = $temps[0][4] = $temps[0][5] = 0; } @@ -348,21 +347,6 @@ class Flotte } - public function calcStockage($vaisseaux, surface $planete) - { - global $LANG; - - $contenuMax = 0; - foreach ($vaisseaux as $key => $vais) { - if (!isset($LANG[$planete->race]["vaisseaux"]["noms_sing"][$key])) { - continue; - } - $contenuMax += dSpatial::tailleCales($key, $planete) * $vais; - } - return $contenuMax; - } - - public function check_mission() { //On vérifie qu'un calcul ne soit pas déjà en cours @@ -562,26 +546,6 @@ class Flotte } - public function attaquer() - { - //Si la planète d'arrivé n'est pas chargée, on charge les planètes - if (is_numeric($this->end_planete)) { - $this->load_planete(); - } - - //On charge la classe des combats - - //On réalise le combat - - //On envoit le résultat - - //On update la flotte avec les pertes et gains - - //On dis à la flotte de rentrer - $this->statut = 1; - $this->addModifFlotte("statut"); - } - public function espionner() { //Si la planète d'arrivé n'est pas chargée, on charge les planètes @@ -593,17 +557,17 @@ class Flotte if (($this->start_planete->technologies[1]& 67108864) == 67108864) { $espionnage_A = 3; } elseif (($this->start_planete->technologies[1]& 33554432) == 33554432) { - $espionnage_A = 2; + $espionnage_A = 3; } elseif (($this->start_planete->technologies[1]& 16777216) == 16777216) { - $espionnage_A = 1; + $espionnage_A = 3; } else { $espionnage_A = 0; } - if (($this->end_planete->technologies[1]& 536870912) == 536870912) { + if (($this->start_planete->technologies[1]& 536870912) == 536870912) { $contreespionnage_B = 3; - } elseif (($this->end_planete->technologies[1]& 268435456) == 268435456) { + } elseif (($this->start_planete->technologies[1]& 268435456) == 268435456) { $contreespionnage_B = 2; - } elseif (($this->end_planete->technologies[1]& 134217728) == 134217728) { + } elseif (($this->start_planete->technologies[1]& 134217728) == 134217728) { $contreespionnage_B = 1; } else { $contreespionnage_B = 0; @@ -612,20 +576,8 @@ class Flotte //Création du rapport $rapport = new Rapport(5, $this->start_planete, $this->end_planete, $this->start_time + $this->end_time); $rapport->addInfo($this->end_planete, 0); - //Rend aléatoire le niveau affiché des bâtiments - $diff_esp = $espionnage_A - $contreespionnage_B; - //Il y a au moins 2 niveaux d'erreur (soit 1 positif et 1 négatif) - if ($diff_esp == 0) { - $diff_esp = 1; - } - $rapport->addInfo($diff_esp, 1); - //Où x est le résultat de cette formule, si x >= y, ça donne accès a plus d'informations - // si y >= 1 : ressources - // si y >= 2 : batiment - // si y >= 3 : défenses - // si y >= 4 : flottes - $rapport->addInfo($espionnage_A + 2 - $contreespionnage_B + 1, 2); - //Si le joueur a au moins le niveau 1 du contre-espionnage, on le prévient qu'il a été espionné, sinon il n'en sait rien + $rapport->addInfo($contreespionnage_B/$espionnage_A/10, 1); + $rapport->addInfo($espionnage_A+2-$contreespionnage_B+1, 2); $rapport->addInfo($contreespionnage_B, 3); $rapport->send(); diff --git a/onyx2/include/Class/planete.php b/onyx2/include/Class/planete.php index 43ee8fb..a65e153 100644 --- a/onyx2/include/Class/planete.php +++ b/onyx2/include/Class/planete.php @@ -128,7 +128,7 @@ class Planete extends Surface $this->file_cas = new FileCaserne(); } - foreach ($terrestreVAR[$this->race] as $ter) { + foreach ($terrestreVAR as $ter) { $this->terrestres[] = $plan[$ter]; } if (!empty($plan["file_ter"])) { @@ -273,12 +273,11 @@ class Planete extends Surface $popPlus *= 1.05; } //Démocratie : 5 % de population qui arrive en plus. - //Bonus techno immigration coloniale - if ($this->technologies[3] & 4) { + if ($this->technologies[2] & 4) { $popPlus *= 1.15; - } elseif ($this->technologies[3] & 2) { + } elseif ($this->technologies[2] & 2) { $popPlus *= 1.10; - } elseif ($this->technologies[3] & 1) { + } elseif ($this->technologies[2] & 1) { $popPlus *= 1.05; } @@ -672,27 +671,7 @@ class Planete extends Surface $prod_hy -= $conso_h; if ($retarray) { - return array( - array( - ceil($this->coeff_bat[0]*100), - ceil($this->coeff_bat[1]*100), - ceil($this->coeff_bat[2]*100), - ceil($this->coeff_bat[3]*100), - ceil($this->coeff_bat[4]*100)), - array( - $prod_met, - $prod_cri, - $prod_hy + $conso_h, - $energie_s*$this->coeff_bat[3], - $energie_f*$this->coeff_bat[4]), - array( - $energie_m*$this->coeff_bat[0], - $energie_c*$this->coeff_bat[1], - $energie_h*$this->coeff_bat[2], - $conso_h, - ($energie_s*$this->coeff_bat[3] + $energie_f*$this->coeff_bat[4])-($energie_m*$this->coeff_bat[0] + $energie_c*$this->coeff_bat[1] + $energie_h*$this->coeff_bat[2]) - ) - ); + return array(array(ceil($this->coeff_bat[0]*100), ceil($this->coeff_bat[1]*100), ceil($this->coeff_bat[2]*100), ceil($this->coeff_bat[3]*100), ceil($this->coeff_bat[4]*100)), array($prod_met, $prod_cri, $prod_hy + $conso_h, $energie_s*$this->coeff_bat[3], $energie_f*$this->coeff_bat[4]), array($energie_m*$this->coeff_bat[0], $energie_c*$this->coeff_bat[1], $energie_h*$this->coeff_bat[2], $conso_h, ($energie_s*$this->coeff_bat[3] + $energie_f*$this->coeff_bat[4])-($energie_m*$this->coeff_bat[0] + $energie_c*$this->coeff_bat[1] + $energie_h*$this->coeff_bat[2]))); } else { return array($prod_met, $prod_cri, $prod_hy); } @@ -705,17 +684,21 @@ class Planete extends Surface $this->id_user = $id_user; //Génération du nombre de case et de l'image en fonction de la position dans le système - $this->image = mt_rand(1, 150); if ($mere) { $this->cases = 225; + $this->image = mt_rand(1, 19); } elseif ($this->position > $VAR['nb_planete']*0.75) { $this->cases = mt_rand(200, 255); + $this->image = mt_rand(1, 19); } elseif ($this->position > $VAR['nb_planete']/2) { $this->cases = mt_rand(250, 300); + $this->image = mt_rand(1, 19); } elseif ($this->position > $VAR['nb_planete']/4) { $this->cases = mt_rand(175, 260); + $this->image = mt_rand(1, 19); } else { $this->cases = mt_rand(150, 220); + $this->image = mt_rand(1, 19); } //Définition des principaux paramètres de la planète @@ -729,10 +712,7 @@ class Planete extends Surface $this->cristal = 700; $this->hydrogene = 0; - // on met le moment où la planete a été crée, comme ça, à la première actualisation, on ne remplit pas les silos - $this->timestamp = time(); - - $this->modif = array("id_user", "nom_planete", "galaxie", "ss", "position", "image", "cases", "timestamp", "metal", "cristal", "hydrogene"); + $this->modif = array("id_user", "nom_planete", "galaxie", "ss", "position", "image", "cases"); } /** @@ -764,11 +744,7 @@ class Planete extends Surface global ${$calc.'VAR'}; } - if ($calc == "terrestre") { - $outNomChamps[] = ${$calc.'VAR'}[$this->race][$modif[1]]; - } else { - $outNomChamps[] = ${$calc.'VAR'}[$modif[1]]; - } + $outNomChamps[] = ${$calc.'VAR'}[$modif[1]]; $outValeurs[] = $this->{$modif[0]}[$modif[1]]; } elseif ($modif == "force") { continue; @@ -794,11 +770,6 @@ class Planete extends Surface } foreach ($this->{$modif} as $j => $value) { - if ($calc == "terrestre") { - $outNomChamps[] = ${$calc.'VAR'}[$this->race][$j]; - } else { - $outNomChamps[] = ${$calc.'VAR'}[$j]; - } $outNomChamps[] = ${$calc.'VAR'}[$j]; $outValeurs[] = $value; } @@ -825,11 +796,7 @@ class Planete extends Surface trigger_error('Impossible de trouver les données pour '.$modif[0], E_USER_ERROR); } - if ($calc == "terrestre") { - $out[] = ${$calc.'VAR'}[$this->race][$modif[1]]." = ".$this->{$modif[0]}[$modif[1]]; - } else { - $out[] = ${$calc.'VAR'}[$modif[1]]." = ".$this->{$modif[0]}[$modif[1]]; - } + $out[] = ${$calc.'VAR'}[$modif[1]]." = ".$this->{$modif[0]}[$modif[1]]; } elseif ($modif == "force") { $out[] = "timestamp = timestamp"; } elseif (!is_array($this->{$modif}) && !is_object($this->{$modif})) { @@ -852,11 +819,7 @@ class Planete extends Surface } foreach ($this->{$modif} as $j => $value) { - if ($calc == "terrestre") { - $out[] = ${$calc.'VAR'}[$this->race][$j]." = ".$value; - } else { - $out[] = ${$calc.'VAR'}[$j]." = ".$value; - } + $out[] = ${$calc.'VAR'}[$j]." = ".$value; } } } diff --git a/onyx2/include/Class/rapport.php b/onyx2/include/Class/rapport.php index 9226a5e..58969a5 100644 --- a/onyx2/include/Class/rapport.php +++ b/onyx2/include/Class/rapport.php @@ -18,8 +18,6 @@ class Rapport public $rapportA = ""; public $rapportB = ""; - public $table = "mail"; - /** * Constructor * @access protected @@ -91,42 +89,36 @@ class Rapport if ($this->var[2] > 2) { $this->rapportA .= ""; foreach ($this->var[0]->batiments as $key => $batiment) { - $this->rapportA .= ""; + $this->rapportA .= ""; } $this->rapportA .= "
NiveauBâtiment
".rand(($batiment - $this->var[1]), ($batiment + $this->var[1]))."".$LANG[$this->var[0]->race]["batiments"]["noms_sing"][$key]."
".rand($batiment * (1 - $this->var[1]), $batiment * (1 + $this->var[1]))."".$LANG[$this->var[0]->race]["batiments"]["noms_sing"][$key]."

"; } + //Flottes en orbite + if ($this->var[2] > 3) { + } + //Flottes au sol - if ($this->var[2] > 4) { + if ($this->var[2] > 5) { $this->rapportA .= ""; foreach ($this->var[0]->vaisseaux as $key => $vaisseau) { - $this->rapportA .= ""; + $this->rapportA .= ""; } $this->rapportA .= "
NombreVaisseaux
".rand(($vaisseau - $this->var[1]), ($vaisseau + $this->var[1]))."".$LANG[$this->var[0]->race]["vaisseaux"]["noms_sing"][$key]."
".rand($vaisseau * (1 - $this->var[1]), $vaisseau * (1 + $this->var[1]))."".$LANG[$this->var[0]->race]["vaisseaux"]["noms_sing"][$key]."

"; } //Défenses - if ($this->var[2] > 3) { + if ($this->var[2] > 4) { $this->rapportA .= ""; foreach ($this->var[0]->terrestres as $key => $unite) { - if (!dTerrestre::type($key, $this->var[0])) { - $this->rapportA .= ""; + if (!dTerrestre::type($key)) { + $this->rapportA .= ""; } } $this->rapportA .= "
NombreDéfenses
".rand($unite * floor(1 - $this->var[1]), $unite * ceil(1 + $this->var[1]))."".$LANG[$this->var[0]->race]["terrestre"]["noms_sing"][$key]."
".rand($unite * (1 - $this->var[1]), $unite * (1 + $this->var[1]))."".$LANG[$this->var[0]->race]["terrestre"]["noms_sing"][$key]."

"; } } - //On envoit le rapport d'espionnage - $temps = $this->timestamp; - $db = new BDD(); - $db->escape($this->titreA); - $db->escape($this->rapportA); - - $db->query("INSERT INTO ".$this->table." (destinataire, sujet, contenu, temps) VALUES(".$this->utilA->id_user.", '$this->titreA', '$this->rapportA', '$temps');"); - $db->deconnexion(); - - //On envoit le rapport de cdontre-espionnage if ($this->var[3] >= 1) { $this->titreB = "Rapport de contre-espionnage"; if (!isset($this->var[0]->nom_planete)) { @@ -134,15 +126,8 @@ class Rapport } else { $this->rapportB = "Nous venons d'apprendre que notre planète : ".$this->var[0]->nom_planete."[".$this->var[0]->galaxie.":".$this->var[0]->ss.":".$this->var[0]->position."] a été la cible d'un espionnage de la part de ".$this->utilA->pseudo; } - - $temps = $this->timestamp; - $db = new BDD(); - $db->escape($this->titreB); - $db->escape($this->rapportB); - - $db->query("INSERT INTO ".$this->table." (destinataire, sujet, contenu, temps) VALUES(".$this->utilB->id_user.", '$this->titreB', '$this->rapportB', '$temps');"); - $db->deconnexion(); } + $this->rapportA = $this->rapportA; } public function sendTransport() diff --git a/onyx2/include/admin/alliance.php b/onyx2/include/admin/alliance.php index ceb4cca..e6e54d2 100644 --- a/onyx2/include/admin/alliance.php +++ b/onyx2/include/admin/alliance.php @@ -12,7 +12,7 @@ if (!empty($_GET['id']) && !empty($_GET['key']) && $_GET['key'] != 'id') { $pagea = 'print_key'; $id_plan = $_GET['id']; $key = $_GET['key']; - $chapeau = new BDD(); + $chapeau->connexion(); $chapeau->escape($id_plan); $chapeau->escape($key); $reqA = $chapeau->unique_query("SELECT * FROM $table_alliances WHERE id = '$id_plan';"); @@ -27,20 +27,20 @@ if (!empty($_GET['id']) && !empty($_GET['key']) && $_GET['key'] != 'id') { if (isset($_POST['key']) && isset($_POST['mod'])) { $key = $_POST['key']; $mod = $_POST['mod']; - $chapeau = new BDD(); + $chapeau->connexion(); $chapeau->escape($mod); $chapeau->escape($id_plan); $chapeau->query("UPDATE $table_alliances SET $key = '$mod' WHERE id = '$id_plan';"); $chapeau->deconnexion(); } - $chapeau = new BDD(); + $chapeau->connexion(); $req = $chapeau->unique_query("SELECT * FROM $table_alliances WHERE id = '$id_plan';"); $chapeau->deconnexion(); $template->assign('tableau', $req); $template->assign('idPlan', $id_plan); } elseif (!empty($_GET['name'])) { $name = $_GET['name']; - $chapeau = new BDD(); + $chapeau->connexion(); $chapeau->escape($name); $req = $chapeau->unique_query("SELECT * FROM $table_alliances WHERE nom = '$name';"); $chapeau->deconnexion(); diff --git a/onyx2/include/admin/planete.php b/onyx2/include/admin/planete.php index cbac82d..a31fd20 100644 --- a/onyx2/include/admin/planete.php +++ b/onyx2/include/admin/planete.php @@ -65,9 +65,5 @@ if (!empty($_GET['id']) && !empty($_GET['key']) && $_GET['key'] == 'hash_planete header('Location: '.$VAR["menu"]["vplanetes"].'&id='.$req['id']); exit; } else { - $bdd = new BDD(); - $req = $bdd->query("SELECT planete.id, nom_planete, pseudo, galaxie, ss, position FROM planete LEFT JOIN user ON (id_user=user.id) LIMIT 1000;"); - $bdd->deconnexion(); - $template->assign('planetes', $req); $pagea = 'print_choixP'; } diff --git a/onyx2/include/donnees.php b/onyx2/include/donnees.php index 28ef6b0..fbc849e 100644 --- a/onyx2/include/donnees.php +++ b/onyx2/include/donnees.php @@ -29,7 +29,5 @@ $technologiesVAR = array("techno_indu", "techno_inge", "techno_inge2", "techno_p $batimentsVAR = array("mine_m", "mine_c", "mine_h", "centrale_s", "centrale_f", "radar", "labo", "chantier_terrestre", "chantier_spatial", "caserne", "silo", "centre_info", "habitation", "arcologies", "bunker", "stations", "commercial", "loisir", "administration"); $caserneVAR = array("soldat1", "soldat2", "soldat3", "soldat4", "sniper", "spartan", "medecin", "ingenieur", "soldat_lourd"); $spatialVAR = array("vaisseau_1", "vaisseau_2", "vaisseau_3", "vaisseau_4", "vaisseau_5", "vaisseau_6", "vaisseau_7", "vaisseau_8", "vaisseau_9", "vaisseau_10", "vaisseau_11", "vaisseau_12", "vaisseau_13", "vaisseau_14", "vaisseau_15", "vaisseau_16", "vaisseau_17"); -$terrestreVAR = array(); -$terrestreVAR["humain"] = array("vais_0", "vais_1", "vais_2", "vais_3", "vcl_1", "vcl_2", "vcl_3", "vcl_4", "def_1", "def_2", "def_3", "def_4", "def_5", "def_6", "def_7", "def_8"); -$terrestreVAR["covenant"] = array("vais_0", "vais_1", "vais_2", "vais_3", "vcl_1", "vcl_2", "vcl_3", "vcl_4", "def_1", "def_2", "def_3", "def_4", "def_5"); +$terrestreVAR = array("vais_0", "vais_1", "vais_2", "vais_3", "vcl_1", "vcl_2", "vcl_3", "vcl_4", "def_1", "def_2", "def_3", "def_4", "def_5", "def_6", "def_7", "def_8"); $coeffVAR = array("coeff_mine_m", "coeff_mine_c", "coeff_mine_h", "coeff_centrale_s", "coeff_centrale_f"); diff --git a/onyx2/include/flottes.php b/onyx2/include/flottes.php index ac65513..3ff81ff 100644 --- a/onyx2/include/flottes.php +++ b/onyx2/include/flottes.php @@ -5,29 +5,7 @@ if (!defined('INDEX')) { } $bdd->reconnexion(); -$sql = ""; -if ($planete->id_user != null) { - $sql = "id_user = " . $planete->id_user . " "; -} -if ($planete->id != null) { - if ($sql != "") { - $sql .= " OR "; - } - $sql .= "end_planete = " . $planete->id . " "; -} -if ($planete->id_alliance != null) { - if ($sql != "") { - $sql .= " OR "; - } - $sql .= "id_alliance = " . $planete->id_alliance . " "; -} -if ($planete->id_alliance != null) { - if ($sql != "") { - $sql .= " OR "; - } - $sql .= "end_planete = " . $planete->id_alliance . " "; -} -$flottes = $bdd->query("SELECT id FROM $table_flottes WHERE (" . $sql . ") AND (start_time + end_time) <= ".time()." AND last < ".(time()-10).";"); +$flottes = $bdd->query("SELECT id FROM $table_flottes WHERE (id_user = ".$planete->id_user." OR end_planete = ".$planete->id." OR id_alliance = ".$planete->id_alliance." OR end_planete = ".$planete->id_alliance.") AND (start_time + end_time) <= ".time()." AND last < ".(time()-10).";"); $bdd->deconnexion(); if (!empty($flottes)) { diff --git a/onyx2/include/game/arbre.php b/onyx2/include/game/arbre.php index 4b94b48..76f47be 100644 --- a/onyx2/include/game/arbre.php +++ b/onyx2/include/game/arbre.php @@ -44,13 +44,13 @@ if (SURFACE == "asteroide") { } -function traiterBrancheTechnologie($TEMP_liste, $branche, $i, $race) +function traiterBrancheTechnologie($TEMP_liste, $branche, $i) { global $LANG, $planete; foreach ($i as $key => $id) { if (is_array($id)) { - $TEMP_liste = traiterBrancheTechnologie($TEMP_liste, $branche, $id, $race); + $TEMP_liste = traiterBrancheTechnologie($TEMP_liste, $branche, $id); } else { $niveau = dTechnologies::niveau_du_joueur($branche, $id, $planete); $niveau_max = dTechnologies::niveau_max($branche, $id, $planete, $LANG); @@ -61,7 +61,7 @@ function traiterBrancheTechnologie($TEMP_liste, $branche, $i, $race) 'branche' => $branche, 'niveau' => $niveau, 'niveau_max' => $niveau_max, - 'etat' => dTechnologies::needed($object, $planete, true, $race) + 'etat' => dTechnologies::needed($object, $planete, true) ); } } @@ -72,7 +72,7 @@ $TEMP_liste = array(); $branche = 0; while ($branche < 9) { $TEMP_liste[$branche] = array(); - $TEMP_liste = traiterBrancheTechnologie($TEMP_liste, $branche, dTechnologies::type($branche, $planete->race), $race); + $TEMP_liste = traiterBrancheTechnologie($TEMP_liste, $branche, dTechnologies::type($branche, $planete->race)); $branche++; } $template->assign('technologies', $TEMP_liste); @@ -89,12 +89,12 @@ foreach ($planete->casernes as $id => $unite) { $template->assign('caserne', $TEMP_liste); $TEMP_liste = array(); -$id = 0; +$id = 1; $max_unite = count($LANG[$race]["terrestre"]["noms_sing"]); while ($id <= $max_unite) { if (!empty($LANG[$race]["terrestre"]["noms_sing"][$id])) { $TEMP_liste[$id] = array( - 'niveau' => ($race == $planete->race) ? $planete->terrestres[$id] : 0, + 'niveau' => $planete->terrestres[$id], 'etat' => dTerrestre::needed($id, $planete, true, $race) ); } @@ -103,7 +103,7 @@ while ($id <= $max_unite) { $template->assign('unites', $TEMP_liste); $TEMP_liste = array(); -$id = 0; +$id = 1; $max_unite = count($LANG[$race]["vaisseaux"]["noms_sing"]); while ($id <= $max_unite) { if (!empty($LANG[$race]["vaisseaux"]["noms_sing"][$id])) { diff --git a/onyx2/include/game/description.php b/onyx2/include/game/description.php index 7883647..30df0fc 100644 --- a/onyx2/include/game/description.php +++ b/onyx2/include/game/description.php @@ -110,12 +110,12 @@ if (isset($_GET['t']) && is_numeric($_GET['t']) && !empty($LANG[$race]["technolo $template->assign('type', 'vaisseaux'); $t = intval(gpc('v')); $template->assign('id', $t); - $template->assign('image', dSpatial::image($t, $planete, $race)); + $template->assign('image', dSpatial::image($t, $planete)); - $template->assign('ressourcesNext', array(dSpatial::metal($t, 1, $planete, $race), dSpatial::cristal($t, 1, $planete, $race), dSpatial::hydrogene($t, 1, $planete, $race), dSpatial::temps($t, 1, $planete, $race))); + $template->assign('ressourcesNext', array(dSpatial::metal($t, 1, $planete), dSpatial::cristal($t, 1, $planete), dSpatial::hydrogene($t, 1, $planete), dSpatial::temps($t, 1, $planete))); $template->assign('etat', dSpatial::needed($t, $planete, $race)); - $template->assign('caract', array(dSpatial::attaque($t, $planete, $race), dSpatial::bouclier($t, $planete, $race), dSpatial::armature($t, $planete, $race), dSpatial::tailleCales($t, $planete, $race))); + $template->assign('caract', array($nomvais_at[$t], $nomvais_bc[$t], $nomvais_pv[$t], $nomvais_rs[$t])); } elseif (isset($_GET['d']) && is_numeric($_GET['d']) && !empty($LANG[$race]["terrestre"]["noms_sing"][$_GET['d']])) { $template->assign('type', 'terrestre'); $t = gpc('d'); @@ -125,7 +125,10 @@ if (isset($_GET['t']) && is_numeric($_GET['t']) && !empty($LANG[$race]["technolo $template->assign('ressourcesNext', array(dTerrestre::metal($t, 1, $planete), dTerrestre::cristal($t, 1, $planete), dTerrestre::hydrogene($t, 1, $planete), dTerrestre::temps($t, 1, $planete))); $template->assign('etat', dTerrestre::needed($t, $planete, true)); - $template->assign('caract', array(dTerrestre::attaque($t, $planete, $race), dTerrestre::bouclier($t, $planete, $race), dTerrestre::armature($t, $planete, $race))); + if ($t-8 >= 0) { + $t -= 8; + $template->assign('caract', array($defense_at[$t], $defense_bc[$t], $defense_pv[$t])); + } } elseif (isset($_GET['c']) && is_numeric($_GET['c']) && !empty($LANG[$race]["caserne"]["noms_sing"][$_GET['c']])) { $template->assign('type', 'caserne'); $t = gpc('c'); diff --git a/onyx2/include/game/flottes/details.php b/onyx2/include/game/flottes/details.php index c7464d3..b1773f2 100644 --- a/onyx2/include/game/flottes/details.php +++ b/onyx2/include/game/flottes/details.php @@ -28,18 +28,16 @@ if (!defined('INDEX')) { if ($flotteN->mission == '6') { erreur('Votre flotte est déjà en train de revenir !', 'red', '?p=flotte&n='.$idN, 1500); } elseif ($flotteN->end_time > $tpsDD) { - $bdd = new BDD(); - $bdd->query("UPDATE $table_flottes SET mission = '6', end_time = $tpsDD, end_planete = start_planete WHERE id_user = ".$planete->id_user." AND id = $idN;"); - $bdd->deconnexion(); + $bdd->query("UPDATE $table_flottes SET mission = '6', effectue = '1', end_time = $tpsDD, end_galaxie = start_galaxie, end_ss = start_ss, end_position = start_position WHERE id_user = ".$planete->id_user." AND id = $idN;"); redirection("?p=flotte&n=".$idN); } else { erreur('Impossible d\'annuler la mission, elle a déjà commencée.', "red", '?p=flotte&n='.$idN, 1500); } } - + $SESS->values['ret_fleet'] = md5('HB.fleet_'.rand().'☺ß☻'); $SESS->put(); - + $template->assign('ret_fleet', $SESS->values['ret_fleet']); $template->assign('flotte', $flotteN); $page = 'flotten'; diff --git a/onyx2/include/game/flottes/envoyer.php b/onyx2/include/game/flottes/envoyer.php index ac75b7b..815d6d3 100644 --- a/onyx2/include/game/flottes/envoyer.php +++ b/onyx2/include/game/flottes/envoyer.php @@ -4,8 +4,6 @@ if (!defined('INDEX')) { exit; } -require_once("Class/class.donnee.php"); - //Récupération des informations envoyées $idPrep = gpc("cds", "post"); @@ -59,18 +57,6 @@ if ($mission == 2) { erreur('Fonder d\'abord une alliance avant de coloniser un astéroide !', "red", $VAR["menu"]["flotte"]); } } - - // on vérifie que le joueur n'essaye pas de coloniser plus de planète que sa techno expansion lui permet - $bdd->reconnexion(); - $resultat = $bdd->unique_query("SELECT COUNT(id) as nb_planete FROM $table_planete WHERE id_user = ".$planete->id_user.";"); - $bdd->deconnexion(); - $nb_planete = $resultat["nb_planete"]; - $branche = 8; - $idTechnologie = $nb_planete; - $neededTechnologies = Donnee::donneeTechnologie($branche, $idTechnologie, "needed", $planete); - if (((int)$planete->technologies[$branche]& $neededTechnologies) != $neededTechnologies) { - erreur('Vous ne pouvez pas coloniser plus de planète que votre niveau d\'expansion'); - } } //On vérifie que les attaques soient bien activées @@ -84,7 +70,7 @@ if ($mission == 4 && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][3] <= 0) } //On vérifie la mission, si elle est d'espionner, il faut qu'il y ait des sondes -if ($mission == 5 && (($planete->race == "humain" && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][13] <= 0) || ($planete->race == "covenant" && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][7] <= 0))) { +if ($mission == 5 && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][6] <= 0 && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][13] <= 0) { erreur('Vous ne pouvez pas espionner sans sonde d\'espionnage !', "red", '?p=flotte'); } @@ -170,18 +156,9 @@ elseif ($mission == 5) { erreur('La planète sur laquelle vous désirez stationner ne vous appartient pas.', "red", '?p=flotte', 3000); } elseif ($mission == 7 && !$resultat) { erreur('La planète sur laquelle vous désirez donner vos vaisseaux n\'existe pas.', "red", '?p=flotte', 3000); -} elseif ($mission == 7) { - $bdd->reconnexion(); - $resultatu = $bdd->unique_query("SELECT race FROM $table_user WHERE id = ".$resultat['id_user'].";"); - $bdd->deconnexion(); - - if ($resultatu['race'] != $planete->race) { - erreur("Vous ne pouvez pas donner vos vaisseaux a une autre race que la votre", "red"); - } } - //Création de la flotte $flotte = new flotte(); $flotte->creer($planete, $SESS->values["prepFlottes"][$idPrep], $resultat); diff --git a/onyx2/include/game/flottes/preparer.php b/onyx2/include/game/flottes/preparer.php index 32fe26e..6540043 100644 --- a/onyx2/include/game/flottes/preparer.php +++ b/onyx2/include/game/flottes/preparer.php @@ -7,10 +7,6 @@ if (!defined('INDEX')) { //Génération d'un ID unique pour identifier la flotte durant sa création $idPrep = random(); -//Supression des précédentes flottes, sinon il y a un risque de remplir le champs de BDD qui sauvegarde les flottes -$SESS->values["prepFlottes"] = null; -$SESS->values["prepFlottes"] = array(); - //Création du tableau de session $SESS->values["prepFlottes"][$idPrep] = array(); @@ -45,7 +41,6 @@ $SESS->values["prepFlottes"][$idPrep]['nbVaisseaux'] = $nombreVaisseau; $SESS->values['forceFlotte'] = false; $SESS->values["prepFlottes"][$idPrep]['time'] = time(); $SESS->values["prepFlottes"][$idPrep]['statut'] = 1; -$SESS->values["prepFlottes"][$idPrep]['vitesse'] = 100; // vitesse par défaut: 100% $SESS->put(); unset($nombreVaisseau, $key, $vaisseau, $v); diff --git a/onyx2/include/game/flottes/restaure.php b/onyx2/include/game/flottes/restaure.php index f28d72d..d776764 100644 --- a/onyx2/include/game/flottes/restaure.php +++ b/onyx2/include/game/flottes/restaure.php @@ -23,14 +23,13 @@ if ($SESS->values["prepFlottes"][$idPrep]['type'] == 1) { if ($SESS->values["prepFlottes"][$idPrep]['vaisseaux'][2]) { $missions[2] = "Coloniser"; } -//Stratégie millitaire est nécessaire -if ($planete->technologies[3]& 4096 && $VAR["attaques"]) { +if ($planete->technologies[7]& 16 && $VAR["attaques"]) { $missions[3] = "Attaquer"; } if ($SESS->values["prepFlottes"][$idPrep]['type'] == 1 && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][3]) { $missions[4] = "Recycler"; } -if ($SESS->values["prepFlottes"][$idPrep]['type'] == 1 && (($planete->race == "humain" && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][13]) || ($planete->race == "covenant" && $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][7]))) { +if ($SESS->values["prepFlottes"][$idPrep]['type'] == 1 && ($SESS->values["prepFlottes"][$idPrep]['vaisseaux'][6] || $SESS->values["prepFlottes"][$idPrep]['vaisseaux'][13])) { $missions[5] = "Espionner"; } diff --git a/onyx2/include/game/laboratoire.php b/onyx2/include/game/laboratoire.php index f9598a9..479cc03 100644 --- a/onyx2/include/game/laboratoire.php +++ b/onyx2/include/game/laboratoire.php @@ -81,35 +81,14 @@ function traiterBranche($onglet, $branche, $start = false) } } - //La technologie Expansion peut monter jusqu'au niveau 18 \o/ - if ($onglet == 8) { - $i = 1; - while ($i < 18) { - $b = $origin_b; - if ((dTechnologies::idToBit($b + ($i - 1)) & $planete->technologies[$onglet]) && - isset($LANG[$planete->race]["technologies"]["noms_sing"][$onglet][$b+$i]) && - $LANG[$planete->race]["technologies"]["noms_sing"][$onglet][$b] == - $LANG[$planete->race]["technologies"]["noms_sing"][$onglet][$b+$i]) { - //La techno est déjà a ce niveau, on ne fait rien - } else { - $b += ($i - 1); - break; - } - $i++; - } - } - if ($key >= 1) { $return .= "
"; } - //La techno est au plus haut niveau if (dTechnologies::idToBit($b) & $planete->technologies[$onglet]) { $return .= '
'; - //La techno peut encore être augmentée } elseif (dTechnologies::idToBit($origin_b) & $planete->technologies[$onglet]) { $return .= '
'; - //La techno n'a pas encore été recherchée } else { $return .= '
'; } diff --git a/onyx2/include/jpgraph/README b/onyx2/include/jpgraph/README deleted file mode 100644 index 358cec2..0000000 --- a/onyx2/include/jpgraph/README +++ /dev/null @@ -1,63 +0,0 @@ -README FOR JPGRAPH 4.3.4 -========================= - -This package contains the JpGraph PHP library version 4.3.4 - -The library is Copyright (C) 2000-2010 Asial Corporatoin and -released under dual license QPL 1.0 for open source and educational -use and JpGraph Professional License for commercial use. - -Please see full license details at -http://jpgraph.net/pro/ -http://jpgraph.net/download/ - - -Requirements: -------------- -Miminum: -* PHP 5.1.0 or higher -* GD 2.0.28 or higher -Note: Earlier versions might work but is unsupported. - -Recommended: -* >= PHP 5.2.0 -* PHP Builtin GD library - -Installation ------------- -1. Make sure that the PHP version is compatible with the stated - requirements and that the PHP installation has support for - the GD library. Please run phpinfo() to check if GD library - is supported in the installation. - If the GD library doesn't seem to be installed - please consult the PHP manual under section "Image" for - instructions on where to find this library. Please refer to - the manual section "Verifying your PHP installation" - -2. Unzip and copy the files to a directory of your choice where Your - httpd sever can access them. - For a global site installation you should copy the files to - somewhere in the PHP search path. - -3. Check that the default directory paths in jpg-config.inc.php - for cache directory and TTF directory suits your installation. - Note1: The default directories are different depending on if - the library is running on Windows or UNIX. - Note2: Apache/PHP must have write permission to your cache - directory if you enable the cache feature. By default the cache - is disabled. - - -Documentation -------------- -The installation includes HTML documentation and reference guide for the -library. The portal page for all documentation is -/docs/index.html - - -Bug reports and suggestions ---------------------------- -Should be reported using the contact form at - -http://jpgraph.net/contact/ - diff --git a/onyx2/include/jpgraph/flag_mapping b/onyx2/include/jpgraph/flag_mapping deleted file mode 100755 index 7f9c3c5..0000000 --- a/onyx2/include/jpgraph/flag_mapping +++ /dev/null @@ -1,237 +0,0 @@ -class JpCountryFlags { - -$iCountryFlags = array( - 'Afghanistan' => 'afgh.gif', - 'Republic of Angola' => 'agla.gif', - 'Republic of Albania' => 'alba.gif', - 'Alderney' => 'alde.gif', - 'Democratic and Popular Republic of Algeria' => 'alge.gif', - 'Territory of American Samoa' => 'amsa.gif', - 'Principality of Andorra' => 'andr.gif', - 'British Overseas Territory of Anguilla' => 'angu.gif', - 'Antarctica' => 'anta.gif', - 'Argentine Republic' => 'arge.gif', - 'League of Arab States' => 'arle.gif', - 'Republic of Armenia' => 'arme.gif', - 'Aruba' => 'arub.gif', - 'Commonwealth of Australia' => 'astl.gif', - 'Republic of Austria' => 'aust.gif', - 'Azerbaijani Republic' => 'azer.gif', - 'British Antarctic Territory' => 'bant.gif', - 'Kingdom of Belgium' => 'belg.gif', - 'British Overseas Territory of Bermuda' => 'berm.gif', - 'Commonwealth of the Bahamas' => 'bhms.gif', - 'Kingdom of Bahrain' => 'bhrn.gif', - 'Republic of Belarus' => 'blru.gif', - 'Republic of Bolivia' => 'blva.gif', - 'Belize' => 'blze.gif', - 'Republic of Benin' => 'bnin.gif', - 'Republic of Botswana' => 'bots.gif', - 'Federative Republic of Brazil' => 'braz.gif', - 'Barbados' => 'brbd.gif', - 'British Indian Ocean Territory' => 'brin.gif', - 'Brunei Darussalam' => 'brun.gif', - 'Republic of Burkina' => 'bufa.gif', - 'Republic of Bulgaria' => 'bulg.gif', - 'Republic of Burundi' => 'buru.gif', - 'Overseas Territory of the British Virgin Islands' => 'bvis.gif', - 'Central African Republic' => 'cafr.gif', - 'Kingdom of Cambodia' => 'camb.gif', - 'Republic of Cameroon' => 'came.gif', - 'Dominion of Canada' => 'cana.gif', - 'Caribbean Community' => 'cari.gif', - 'Republic of Cape Verde' => 'cave.gif', - 'Republic of Chad' => 'chad.gif', - 'Republic of Chile' => 'chil.gif', - 'Territory of Christmas Island' => 'chms.gif', - 'Commonwealth of Independent States' => 'cins.gif', - 'Cook Islands' => 'ckis.gif', - 'Republic of Colombia' => 'clmb.gif', - 'Territory of Cocos Islands' => 'cois.gif', - 'Commonwealth' => 'comn.gif', - 'Union of the Comoros' => 'como.gif', - 'Republic of the Congo' => 'cong.gif', - 'Republic of Costa Rica' => 'corc.gif', - 'Republic of Croatia' => 'croa.gif', - 'Republic of Cuba' => 'cuba.gif', - 'British Overseas Territory of the Cayman Islands' => 'cyis.gif', - 'Republic of Cyprus' => 'cypr.gif', - 'The Czech Republic' => 'czec.gif', - 'Kingdom of Denmark' => 'denm.gif', - 'Republic of Djibouti' => 'djib.gif', - 'Commonwealth of Dominica' => 'domn.gif', - 'Dominican Republic' => 'dore.gif', - 'Republic of Ecuador' => 'ecua.gif', - 'Arab Republic of Egypt' => 'egyp.gif', - 'Republic of El Salvador' => 'elsa.gif', - 'England' => 'engl.gif', - 'Republic of Equatorial Guinea' => 'eqgu.gif', - 'State of Eritrea' => 'erit.gif', - 'Republic of Estonia' => 'estn.gif', - 'Ethiopia' => 'ethp.gif', - 'European Union' => 'euun.gif', - 'British Overseas Territory of the Falkland Islands' => 'fais.gif', - 'International Federation of Vexillological Associations' => 'fiav.gif', - 'Republic of Fiji' => 'fiji.gif', - 'Republic of Finland' => 'finl.gif', - 'Territory of French Polynesia' => 'fpol.gif', - 'French Republic' => 'fran.gif', - 'Overseas Department of French Guiana' => 'frgu.gif', - 'Gabonese Republic' => 'gabn.gif', - 'Republic of the Gambia' => 'gamb.gif', - 'Republic of Georgia' => 'geor.gif', - 'Federal Republic of Germany' => 'germ.gif', - 'Republic of Ghana' => 'ghan.gif', - 'Gibraltar' => 'gibr.gif', - 'Hellenic Republic' => 'grec.gif', - 'State of Grenada' => 'gren.gif', - 'Overseas Department of Guadeloupe' => 'guad.gif', - 'Territory of Guam' => 'guam.gif', - 'Republic of Guatemala' => 'guat.gif', - 'The Bailiwick of Guernsey' => 'guer.gif', - 'Republic of Guinea' => 'guin.gif', - 'Republic of Haiti' => 'hait.gif', - 'Hong Kong Special Administrative Region' => 'hokn.gif', - 'Republic of Honduras' => 'hond.gif', - 'Republic of Hungary' => 'hung.gif', - 'Republic of Iceland' => 'icel.gif', - 'International Committee of the Red Cross' => 'icrc.gif', - 'Republic of India' => 'inda.gif', - 'Republic of Indonesia' => 'indn.gif', - 'Republic of Iraq' => 'iraq.gif', - 'Republic of Ireland' => 'irel.gif', - 'Organization of the Islamic Conference' => 'isco.gif', - 'Isle of Man' => 'isma.gif', - 'State of Israel' => 'isra.gif', - 'Italian Republic' => 'ital.gif', - 'Jamaica' => 'jama.gif', - 'Japan' => 'japa.gif', - 'The Bailiwick of Jersey' => 'jers.gif', - 'Hashemite Kingdom of Jordan' => 'jord.gif', - 'Republic of Kazakhstan' => 'kazk.gif', - 'Republic of Kenya' => 'keny.gif', - 'Republic of Kiribati' => 'kirb.gif', - 'State of Kuwait' => 'kuwa.gif', - 'Kyrgyz Republic' => 'kyrg.gif', - 'Republic of Latvia' => 'latv.gif', - 'Lebanese Republic' => 'leba.gif', - 'Kingdom of Lesotho' => 'lest.gif', - 'Republic of Liberia' => 'libe.gif', - 'Principality of Liechtenstein' => 'liec.gif', - 'Republic of Lithuania' => 'lith.gif', - 'Grand Duchy of Luxembourg' => 'luxe.gif', - 'Macao Special Administrative Region' => 'maca.gif', - 'Republic of Macedonia' => 'mace.gif', - 'Republic of Madagascar' => 'mada.gif', - 'Republic of the Marshall Islands' => 'mais.gif', - 'Republic of Maldives' => 'mald.gif', - 'Republic of Mali' => 'mali.gif', - 'Federation of Malaysia' => 'mals018.gif', - 'Republic of Malta' => 'malt.gif', - 'Republic of Malawi' => 'malw.gif', - 'Overseas Department of Martinique' => 'mart.gif', - 'Islamic Republic of Mauritania' => 'maur.gif', - 'Territorial Collectivity of Mayotte' => 'mayt.gif', - 'United Mexican States' => 'mexc.gif', - 'Federated States of Micronesia' => 'micr.gif', - 'Midway Islands' => 'miis.gif', - 'Republic of Moldova' => 'mold.gif', - 'Principality of Monaco' => 'mona.gif', - 'Republic of Mongolia' => 'mong.gif', - 'British Overseas Territory of Montserrat' => 'mont.gif', - 'Kingdom of Morocco' => 'morc.gif', - 'Republic of Mozambique' => 'moza.gif', - 'Republic of Mauritius' => 'mrts.gif', - 'Union of Myanmar' => 'myan.gif', - 'Republic of Namibia' => 'namb.gif', - 'North Atlantic Treaty Organization' => 'nato.gif', - 'Republic of Nauru' => 'naur.gif', - 'Turkish Republic of Northern Cyprus' => 'ncyp.gif', - 'Netherlands Antilles' => 'nean.gif', - 'Kingdom of Nepal' => 'nepa.gif', - 'Kingdom of the Netherlands' => 'neth.gif', - 'Territory of Norfolk Island' => 'nfis.gif', - 'Federal Republic of Nigeria' => 'ngra.gif', - 'Republic of Nicaragua' => 'nica.gif', - 'Republic of Niger' => 'nigr.gif', - 'Niue' => 'niue.gif', - 'Commonwealth of the Northern Mariana Islands' => 'nmar.gif', - 'Province of Northern Ireland' => 'noir.gif', - 'Nordic Council' => 'nord.gif', - 'Kingdom of Norway' => 'norw.gif', - 'Territory of New Caledonia and Dependencies' => 'nwca.gif', - 'New Zealand' => 'nwze.gif', - 'Organization of American States' => 'oast.gif', - 'Organization of African Unity' => 'oaun.gif', - 'International Olympic Committee' => 'olym.gif', - 'Sultanate of Oman' => 'oman.gif', - 'Organization of Petroleum Exporting Countries' => 'opec.gif', - 'Islamic Republic of Pakistan' => 'paks.gif', - 'Republic of Palau' => 'pala.gif', - 'Independent State of Papua New Guinea' => 'pang.gif', - 'Republic of Paraguay' => 'para.gif', - 'Republic of the Philippines' => 'phil.gif', - 'British Overseas Territory of the Pitcairn Islands' => 'piis.gif', - 'Republic of Poland' => 'pola.gif', - 'Republic of Portugal' => 'port.gif', - 'Commonwealth of Puerto Rico' => 'purc.gif', - 'State of Qatar' => 'qata.gif', - 'Russian Federation' => 'russ.gif', - 'Republic of Rwanda' => 'rwan.gif', - 'Kingdom of Saudi Arabia' => 'saar.gif', - 'Republic of San Marino' => 'sama.gif', - 'Nordic Sami Conference' => 'sami.gif', - 'Sark' => 'sark.gif', - 'Scotland' => 'scot.gif', - 'Principality of Seborga' => 'sebo.gif', - 'Republic of Sierra Leone' => 'sile.gif', - 'Republic of Singapore' => 'sing.gif', - 'Republic of Korea' => 'skor.gif', - 'Republic of Slovenia' => 'slva.gif', - 'Somali Republic' => 'smla.gif', - 'Republic of Somaliland' => 'smld.gif', - 'Republic of South Africa' => 'soaf.gif', - 'Solomon Islands' => 'sois.gif', - 'Kingdom of Spain' => 'span.gif', - 'Secretariat of the Pacific Community' => 'spco.gif', - 'Democratic Socialist Republic of Sri Lanka' => 'srla.gif', - 'Saint Lucia' => 'stlu.gif', - 'Republic of the Sudan' => 'suda.gif', - 'Republic of Suriname' => 'surn.gif', - 'Slovak Republic' => 'svka.gif', - 'Kingdom of Sweden' => 'swdn.gif', - 'Swiss Confederation' => 'swit.gif', - 'Syrian Arab Republic' => 'syra.gif', - 'Kingdom of Swaziland' => 'szld.gif', - 'Republic of China' => 'taiw.gif', - 'Republic of Tajikistan' => 'tajk.gif', - 'United Republic of Tanzania' => 'tanz.gif', - 'Kingdom of Thailand' => 'thal.gif', - 'Autonomous Region of Tibet' => 'tibe.gif', - 'Turkmenistan' => 'tkst.gif', - 'Togolese Republic' => 'togo.gif', - 'Tokelau' => 'toke.gif', - 'Kingdom of Tonga' => 'tong.gif', - 'Tristan da Cunha' => 'trdc.gif', - 'Tromelin' => 'tris.gif', - 'Republic of Tunisia' => 'tuns.gif', - 'Republic of Turkey' => 'turk.gif', - 'Tuvalu' => 'tuva.gif', - 'United Arab Emirates' => 'uaem.gif', - 'Republic of Uganda' => 'ugan.gif', - 'Ukraine' => 'ukrn.gif', - 'United Kingdom of Great Britain' => 'unkg.gif', - 'United Nations' => 'unna.gif', - 'United States of America' => 'unst.gif', - 'Oriental Republic of Uruguay' => 'urgy.gif', - 'Virgin Islands of the United States' => 'usvs.gif', - 'Republic of Uzbekistan' => 'uzbk.gif', - 'State of the Vatican City' => 'vacy.gif', - 'Republic of Vanuatu' => 'vant.gif', - 'Bolivarian Republic of Venezuela' => 'venz.gif', - 'Republic of Yemen' => 'yemn.gif', - 'Democratic Republic of Congo' => 'zare.gif', - 'Republic of Zimbabwe' => 'zbwe.gif' -) ; - - diff --git a/onyx2/include/jpgraph/fonts/DejaVuSans-Bold.ttf b/onyx2/include/jpgraph/fonts/DejaVuSans-Bold.ttf deleted file mode 100755 index ac313d2..0000000 Binary files a/onyx2/include/jpgraph/fonts/DejaVuSans-Bold.ttf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/DejaVuSans-BoldOblique.ttf b/onyx2/include/jpgraph/fonts/DejaVuSans-BoldOblique.ttf deleted file mode 100755 index c818ae6..0000000 Binary files a/onyx2/include/jpgraph/fonts/DejaVuSans-BoldOblique.ttf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/DejaVuSans-Oblique.ttf b/onyx2/include/jpgraph/fonts/DejaVuSans-Oblique.ttf deleted file mode 100755 index d5ac60d..0000000 Binary files a/onyx2/include/jpgraph/fonts/DejaVuSans-Oblique.ttf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/DejaVuSans.ttf b/onyx2/include/jpgraph/fonts/DejaVuSans.ttf deleted file mode 100755 index a99969e..0000000 Binary files a/onyx2/include/jpgraph/fonts/DejaVuSans.ttf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/FF_FONT0-Bold.gdf b/onyx2/include/jpgraph/fonts/FF_FONT0-Bold.gdf deleted file mode 100755 index 3b371f8..0000000 Binary files a/onyx2/include/jpgraph/fonts/FF_FONT0-Bold.gdf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/FF_FONT0.gdf b/onyx2/include/jpgraph/fonts/FF_FONT0.gdf deleted file mode 100755 index e231b71..0000000 Binary files a/onyx2/include/jpgraph/fonts/FF_FONT0.gdf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/FF_FONT1-Bold.gdf b/onyx2/include/jpgraph/fonts/FF_FONT1-Bold.gdf deleted file mode 100755 index d62f0b3..0000000 Binary files a/onyx2/include/jpgraph/fonts/FF_FONT1-Bold.gdf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/FF_FONT1.gdf b/onyx2/include/jpgraph/fonts/FF_FONT1.gdf deleted file mode 100755 index 7b5b0f6..0000000 Binary files a/onyx2/include/jpgraph/fonts/FF_FONT1.gdf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/FF_FONT2-Bold.gdf b/onyx2/include/jpgraph/fonts/FF_FONT2-Bold.gdf deleted file mode 100755 index 6e40284..0000000 Binary files a/onyx2/include/jpgraph/fonts/FF_FONT2-Bold.gdf and /dev/null differ diff --git a/onyx2/include/jpgraph/fonts/FF_FONT2.gdf b/onyx2/include/jpgraph/fonts/FF_FONT2.gdf deleted file mode 100755 index 50bca09..0000000 Binary files a/onyx2/include/jpgraph/fonts/FF_FONT2.gdf and /dev/null differ diff --git a/onyx2/include/jpgraph/gd_image.inc.php b/onyx2/include/jpgraph/gd_image.inc.php index a9ea65e..6adee70 100644 --- a/onyx2/include/jpgraph/gd_image.inc.php +++ b/onyx2/include/jpgraph/gd_image.inc.php @@ -1,73 +1,47 @@ original_width = $aWidth; - $this->original_height = $aHeight; $this->CreateImgCanvas($aWidth, $aHeight); - if ($aSetAutoMargin) { $this->SetAutoMargin(); } @@ -101,12 +63,6 @@ class Image } $this->ttf = new TTF(); $this->langconv = new LanguageConv(); - - $this->ff_font0 = imageloadfont(dirname(__FILE__) . "/fonts/FF_FONT0.gdf"); - $this->ff_font1 = imageloadfont(dirname(__FILE__) . "/fonts/FF_FONT1.gdf"); - $this->ff_font2 = imageloadfont(dirname(__FILE__) . "/fonts/FF_FONT2.gdf"); - $this->ff_font1_bold = imageloadfont(dirname(__FILE__) . "/fonts/FF_FONT1-Bold.gdf"); - $this->ff_font2_bold = imageloadfont(dirname(__FILE__) . "/fonts/FF_FONT2-Bold.gdf"); } // Enable interlacing in images @@ -126,26 +82,26 @@ class Image } } - public function GetAntiAliasing() - { - return $this->use_anti_aliasing ; - } - public function CreateRawCanvas($aWidth=0, $aHeight=0) { - $aWidth *= SUPERSAMPLING_SCALE; - $aHeight *= SUPERSAMPLING_SCALE; - if ($aWidth <= 1 || $aHeight <= 1) { JpGraphError::RaiseL(25082, $aWidth, $aHeight);//("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)"); } - $this->img = @imagecreatetruecolor($aWidth, $aHeight); - if ($this->img < 1) { - JpGraphError::RaiseL(25126); - //die("Can't create truecolor image. Check that you really have GD2 library installed."); + if (USE_TRUECOLOR) { + $this->img = @imagecreatetruecolor($aWidth, $aHeight); + if ($this->img < 1) { + JpGraphError::RaiseL(25126); + //die("Can't create truecolor image. Check that you really have GD2 library installed."); + } + $this->SetAlphaBlending(); + } else { + $this->img = @imagecreate($aWidth, $aHeight); + if ($this->img < 1) { + JpGraphError::RaiseL(25126); + //die("JpGraph Error: Can't create image. Check that you really have the GD library installed."); + } } - $this->SetAlphaBlending(); if ($this->iInterlace) { imageinterlace($this->img, 1); @@ -164,18 +120,18 @@ class Image imagecopy($this->img, $oldimage, 0, 0, 0, 0, $this->width, $this->height); return $oldimage; } - + public function CreateImgCanvas($aWidth=0, $aHeight=0) { $old = array($this->img,$this->width,$this->height); - + $aWidth = round($aWidth); $aHeight = round($aHeight); $this->width=$aWidth; $this->height=$aHeight; - + if ($aWidth==0 || $aHeight==0) { // We will set the final size later. // Note: The size must be specified before any other @@ -184,12 +140,12 @@ class Image $this->rgb = null; return $old; } - + $this->CreateRawCanvas($aWidth, $aHeight); // Set canvas color (will also be the background color for a // a pallett image $this->SetColor($this->canvascolor); - $this->FilledRectangle(0, 0, $this->width-1, $this->height-1); + $this->FilledRectangle(0, 0, $aWidth, $aHeight); return $old ; } @@ -208,7 +164,18 @@ class Image public function Copy($fromImg, $toX, $toY, $fromX, $fromY, $toWidth, $toHeight, $fromWidth=-1, $fromHeight=-1) { - $this->CopyCanvasH($this->img, $fromImg, $toX, $toY, $fromX, $fromY, $toWidth, $toHeight, $fromWidth, $fromHeight); + $this->CopyCanvasH( + $this->img, + $fromImg, + $toX, + $toY, + $fromX, + $fromY, + $toWidth, + $toHeight, + $fromWidth, + $fromHeight + ); } public function CopyMerge($fromImg, $toX, $toY, $fromX, $fromY, $toWidth, $toHeight, $fromWidth=-1, $fromHeight=-1, $aMix=100) @@ -227,14 +194,17 @@ class Image $fromHeight ); } else { - if (($fromWidth != -1 && ($fromWidth != $toWidth)) || ($fromHeight != -1 && ($fromHeight != $fromHeight))) { + if (($fromWidth != -1 && ($fromWidth != $toWidth)) || + ($fromHeight != -1 && ($fromHeight != $fromHeight))) { // Create a new canvas that will hold the re-scaled original from image if ($toWidth <= 1 || $toHeight <= 1) { JpGraphError::RaiseL(25083);//('Illegal image size when copying image. Size for copied to image is 1 pixel or less.'); } - - $tmpimg = @imagecreatetruecolor($toWidth, $toHeight); - + if (USE_TRUECOLOR) { + $tmpimg = @imagecreatetruecolor($toWidth, $toHeight); + } else { + $tmpimg = @imagecreate($toWidth, $toHeight); + } if ($tmpimg < 1) { JpGraphError::RaiseL(25084);//('Failed to create temporary GD canvas. Out of memory ?'); } @@ -256,22 +226,27 @@ class Image } } - public static function GetWidth($aImg) + public static function GetWidth($aImg=null) { + if ($aImg === null) { + $aImg = $this->img; + } return imagesx($aImg); } - public static function GetHeight($aImg) + public static function GetHeight($aImg=null) { + if ($aImg === null) { + $aImg = $this->img; + } return imagesy($aImg); } - + public static function CreateFromString($aStr) { $img = imagecreatefromstring($aStr); if ($img === false) { - JpGraphError::RaiseL(25085); - //('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.'); + JpGraphError::RaiseL(25085);//('An image can not be created from the supplied string. It is either in a format not supported or the string is representing an corrupt image.'); } return $img; } @@ -292,24 +267,31 @@ class Image ImageAlphaBlending($this->img, $aFlg); } + public function SetAutoMargin() { + global $gJpgBrandTiming; $min_bm=5; + /* + if( $gJpgBrandTiming ) + $min_bm=15; + */ $lm = min(40, $this->width/7); $rm = min(20, $this->width/10); $tm = max(5, $this->height/7); - $bm = max($min_bm, $this->height/6); + $bm = max($min_bm, $this->height/7); $this->SetMargin($lm, $rm, $tm, $bm); } + //--------------- // PUBLIC METHODS - + public function SetFont($family, $style=FS_NORMAL, $size=10) { $this->font_family=$family; $this->font_style=$style; - $this->font_size=$size*SUPERSAMPLING_SCALE; + $this->font_size=$size; $this->font_file=''; if (($this->font_family==FF_FONT1 || $this->font_family==FF_FONT2) && $this->font_style==FS_BOLD) { ++$this->font_family; @@ -318,19 +300,16 @@ class Image // Check that this PHP has support for TTF fonts if (!function_exists('imagettfbbox')) { - // use internal font when php is configured without '--with-ttf' - $this->font_family = FF_FONT1; -// JpGraphError::RaiseL(25087);//('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.'); - } else { - $this->font_file = $this->ttf->File($this->font_family, $this->font_style); + JpGraphError::RaiseL(25087);//('This PHP build has not been configured with TTF support. You need to recompile your PHP installation with FreeType support.'); } + $this->font_file = $this->ttf->File($this->font_family, $this->font_style); } } // Get the specific height for a text string public function GetTextHeight($txt="", $angle=0) { - $tmp = preg_split('/\n/', $txt); + $tmp = split("\n", $txt); $n = count($tmp); $m=0; for ($i=0; $i< $n; ++$i) { @@ -355,30 +334,28 @@ class Image } } else { $bbox = $this->GetTTFBBox($txt, $angle); - return $bbox[1]-$bbox[5]+1; + return $bbox[1]-$bbox[5]; } } - + // Estimate font height public function GetFontHeight($angle=0) { $txt = "XOMg"; return $this->GetTextHeight($txt, $angle); } - + // Approximate font width with width of letter "O" public function GetFontWidth($angle=0) { $txt = 'O'; return $this->GetTextWidth($txt, $angle); } - - // Get actual width of text in absolute pixels. Note that the width is the - // texts projected with onto the x-axis. Call with angle=0 to get the true - // etxt width. + + // Get actual width of text in absolute pixels public function GetTextWidth($txt, $angle=0) { - $tmp = preg_split('/\n/', $txt); + $tmp = split("\n", $txt); $n = count($tmp); if ($this->font_family <= FF_FONT2+1) { $m=0; @@ -418,8 +395,7 @@ class Image return $m; } } - - + // Draw text with a box around it public function StrokeBoxedText( $x, @@ -435,9 +411,6 @@ class Image $cornerradius=0, $dropwidth=3 ) { - $oldx = $this->lastx; - $oldy = $this->lasty; - if (!is_numeric($dir)) { if ($dir=="h") { $dir=0; @@ -447,7 +420,7 @@ class Image JpGraphError::RaiseL(25090, $dir); }//(" Unknown direction specified in call to StrokeBoxedText() [$dir]"); } - + if ($this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { $width=$this->GetTextWidth($txt, $dir) ; $height=$this->GetTextHeight($txt, $dir) ; @@ -464,13 +437,12 @@ class Image } elseif ($this->text_halign=="center") { $x -= $width/2; } - if ($this->text_valign=="bottom") { $y -= $height; } elseif ($this->text_valign=="center") { $y -= $height/2; } - + $olda = $this->SetAngle(0); if ($shadowcolor) { @@ -515,191 +487,16 @@ class Image $this->current_color=$oc; } } - + $h=$this->text_halign; $v=$this->text_valign; $this->SetTextAlign("left", "top"); - - $debug=false; - $this->StrokeText($x, $y, $txt, $dir, $paragraph_align, $debug); - + $this->StrokeText($x, $y, $txt, $dir, $paragraph_align); $bb = array($x-$xmarg,$y+$height-$ymarg,$x+$width,$y+$height-$ymarg, - $x+$width,$y-$ymarg,$x-$xmarg,$y-$ymarg); + $x+$width,$y-$ymarg,$x-$xmarg,$y-$ymarg); $this->SetTextAlign($h, $v); $this->SetAngle($olda); - $this->lastx = $oldx; - $this->lasty = $oldy; - - return $bb; - } - - // Draw text with a box around it. This time the box will be rotated - // with the text. The previous method will just make a larger enough non-rotated - // box to hold the text inside. - public function StrokeBoxedText2( - $x, - $y, - $txt, - $dir=0, - $fcolor="white", - $bcolor="black", - $shadowcolor=false, - $paragraph_align="left", - $xmarg=6, - $ymarg=4, - $cornerradius=0, - $dropwidth=3 - ) { - - // This version of boxed text will stroke a rotated box round the text - // thta will follow the angle of the text. - // This has two implications: - // 1) This methos will only support TTF fonts - // 2) The only two alignment that makes sense are centered or baselined - - if ($this->font_family <= FF_FONT2+1) { - JpGraphError::RaiseL(25131);//StrokeBoxedText2() Only support TTF fonts and not built in bitmap fonts - } - - $oldx = $this->lastx; - $oldy = $this->lasty; - $dir = $this->NormAngle($dir); - - if (!is_numeric($dir)) { - if ($dir=="h") { - $dir=0; - } elseif ($dir=="v") { - $dir=90; - } else { - JpGraphError::RaiseL(25090, $dir); - }//(" Unknown direction specified in call to StrokeBoxedText() [$dir]"); - } - - $width=$this->GetTextWidth($txt, 0) + 2*$xmarg; - $height=$this->GetTextHeight($txt, 0) + 2*$ymarg ; - $rect_width=$this->GetBBoxWidth($txt, $dir) ; - $rect_height=$this->GetBBoxHeight($txt, $dir) ; - - $baseline_offset = $this->bbox_cache[1]-1; - - if ($this->text_halign=="center") { - if ($dir >= 0 && $dir <= 90) { - $x -= $rect_width/2; - $x += sin($dir*M_PI/180)*$height; - $y += $rect_height/2; - } elseif ($dir >= 270 && $dir <= 360) { - $x -= $rect_width/2; - $y -= $rect_height/2; - $y += cos($dir*M_PI/180)*$height; - } elseif ($dir >= 90 && $dir <= 180) { - $x += $rect_width/2; - $y += $rect_height/2; - $y += cos($dir*M_PI/180)*$height; - } else { - // $dir > 180 && $dir < 270 - $x += $rect_width/2; - $x += sin($dir*M_PI/180)*$height; - $y -= $rect_height/2; - } - } - - // Rotate the box around this point - $this->SetCenter($x, $y); - $olda = $this->SetAngle(-$dir); - - // We need to use adjusted coordinats for the box to be able - // to draw the box below the baseline. This cannot be done before since - // the rotating point must be the original x,y since that is arounbf the - // point where the text will rotate and we cannot change this since - // that is where the GD/GreeType will rotate the text - - - // For smaller <14pt font we need to do some additional - // adjustments to make it look good - if ($this->font_size < 14) { - $x -= 2; - $y += 2; - } else { - // $y += $baseline_offset; - } - - if ($shadowcolor) { - $this->PushColor($shadowcolor); - $this->FilledRectangle( - $x-$xmarg+$dropwidth, - $y+$ymarg+$dropwidth-$height, - $x+$width+$dropwidth, - $y+$ymarg+$dropwidth - ); - //$cornerradius); - $this->PopColor(); - $this->PushColor($fcolor); - $this->FilledRectangle( - $x-$xmarg, - $y+$ymarg-$height, - $x+$width, - $y+$ymarg - ); - //$cornerradius); - $this->PopColor(); - $this->PushColor($bcolor); - $this->Rectangle( - $x-$xmarg, - $y+$ymarg-$height, - $x+$width, - $y+$ymarg - ); - //$cornerradius); - $this->PopColor(); - } else { - if ($fcolor) { - $oc=$this->current_color; - $this->SetColor($fcolor); - $this->FilledRectangle($x-$xmarg, $y+$ymarg-$height, $x+$width, $y+$ymarg);//,$cornerradius); - $this->current_color=$oc; - } - if ($bcolor) { - $oc=$this->current_color; - $this->SetColor($bcolor); - $this->Rectangle($x-$xmarg, $y+$ymarg-$height, $x+$width, $y+$ymarg);//,$cornerradius); - $this->current_color=$oc; - } - } - - if ($this->font_size < 14) { - $x += 2; - $y -= 2; - } else { - - // Restore the original y before we stroke the text - // $y -= $baseline_offset; - } - - $this->SetCenter(0, 0); - $this->SetAngle($olda); - - $h=$this->text_halign; - $v=$this->text_valign; - if ($this->text_halign == 'center') { - $this->SetTextAlign('center', 'basepoint'); - } else { - $this->SetTextAlign('basepoint', 'basepoint'); - } - - $debug=false; - $this->StrokeText($x, $y, $txt, $dir, $paragraph_align, $debug); - - $bb = array($x-$xmarg, $y+$height-$ymarg, - $x+$width, $y+$height-$ymarg, - $x+$width, $y-$ymarg, - $x-$xmarg, $y-$ymarg); - - $this->SetTextAlign($h, $v); - $this->SetAngle($olda); - - $this->lastx = $oldx; - $this->lasty = $oldy; return $bb; } @@ -710,8 +507,9 @@ class Image $this->text_halign=$halign; $this->text_valign=$valign; } + - public function _StrokeBuiltinFont($x, $y, $txt, $dir, $paragraph_align, &$aBoundingBox, $aDebug=false) + public function _StrokeBuiltinFont($x, $y, $txt, $dir=0, $paragraph_align="left", &$aBoundingBox, $aDebug=false) { if (is_numeric($dir) && $dir!=90 && $dir!=0) { JpGraphError::RaiseL(25091); @@ -720,7 +518,7 @@ class Image $h=$this->GetTextHeight($txt); $fh=$this->GetFontHeight(); $w=$this->GetTextWidth($txt); - + if ($this->text_halign=="right") { $x -= $dir==0 ? $w : $h; } elseif ($this->text_halign=="center") { @@ -733,11 +531,9 @@ class Image } elseif ($this->text_valign=="center") { $y += $dir==0 ? $h/2 : $w/2; } - - $use_font = $this->font_family; - + if ($dir==90) { - imagestringup($this->img, $use_font, $x, $y, $txt, $this->current_color); + imagestringup($this->img, $this->font_family, $x, $y, $txt, $this->current_color); $aBoundingBox = array(round($x),round($y),round($x),round($y-$w),round($x+$h),round($y-$w),round($x+$h),round($y)); if ($aDebug) { // Draw bounding box @@ -746,26 +542,40 @@ class Image $this->PopColor(); } } else { - if (preg_match('/\n/', $txt)) { - $tmp = preg_split('/\n/', $txt); + if (ereg("\n", $txt)) { + $tmp = split("\n", $txt); for ($i=0; $i < count($tmp); ++$i) { $w1 = $this->GetTextWidth($tmp[$i]); if ($paragraph_align=="left") { - imagestring($this->img, $use_font, $x, $y-$h+1+$i*$fh, $tmp[$i], $this->current_color); + imagestring($this->img, $this->font_family, $x, $y-$h+1+$i*$fh, $tmp[$i], $this->current_color); } elseif ($paragraph_align=="right") { - imagestring($this->img, $use_font, $x+($w-$w1), $y-$h+1+$i*$fh, $tmp[$i], $this->current_color); + imagestring( + $this->img, + $this->font_family, + $x+($w-$w1), + $y-$h+1+$i*$fh, + $tmp[$i], + $this->current_color + ); } else { - imagestring($this->img, $use_font, $x+$w/2-$w1/2, $y-$h+1+$i*$fh, $tmp[$i], $this->current_color); + imagestring( + $this->img, + $this->font_family, + $x+$w/2-$w1/2, + $y-$h+1+$i*$fh, + $tmp[$i], + $this->current_color + ); } } } else { //Put the text - imagestring($this->img, $use_font, $x, $y-$h+1, $txt, $this->current_color); + imagestring($this->img, $this->font_family, $x, $y-$h+1, $txt, $this->current_color); } if ($aDebug) { // Draw the bounding rectangle and the bounding box $p1 = array(round($x),round($y),round($x),round($y-$h),round($x+$w),round($y-$h),round($x+$w),round($y)); - + // Draw bounding box $this->PushColor('green'); $this->Polygon($p1, true); @@ -789,111 +599,13 @@ class Image return implode("\n\r", $e); } - public function NormAngle($a) + public function GetTTFBBox($aTxt, $aAngle=0) { - // Normalize angle in degrees - // Normalize angle to be between 0-360 - while ($a > 360) { - $a -= 360; - } - while ($a < -360) { - $a += 360; - } - if ($a < 0) { - $a = 360 + $a; - } - return $a; - } - - public function imagettfbbox_fixed($size, $angle, $fontfile, $text) - { - if (! USE_LIBRARY_IMAGETTFBBOX) { - $bbox = @imagettfbbox($size, $angle, $fontfile, $text); - if ($bbox === false) { - JpGraphError::RaiseL(25092, $this->font_file); - //("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library."); - } - $this->bbox_cache = $bbox; - return $bbox; - } - - // The built in imagettfbbox is buggy for angles != 0 so - // we calculate this manually by getting the bounding box at - // angle = 0 and then rotate the bounding box manually - $bbox = @imagettfbbox($size, 0, $fontfile, $text); + $bbox = @ImageTTFBBox($this->font_size, $aAngle, $this->font_file, $aTxt); if ($bbox === false) { JpGraphError::RaiseL(25092, $this->font_file); //("There is either a configuration problem with TrueType or a problem reading font file (".$this->font_file."). Make sure file exists and is in a readable place for the HTTP process. (If 'basedir' restriction is enabled in PHP then the font file must be located in the document root.). It might also be a wrongly installed FreeType library. Try uppgrading to at least FreeType 2.1.13 and recompile GD with the correct setup so it can find the new FT library."); } - - $angle = $this->NormAngle($angle); - - $a = $angle*M_PI/180; - $ca = cos($a); - $sa = sin($a); - $ret = array(); - - // We always add 1 pixel to the left since the left edge of the bounding - // box is sometimes coinciding with the first pixel of the text - //$bbox[0] -= 1; - //$bbox[6] -= 1; - - // For roatated text we need to add extra width for rotated - // text since the kerning and stroking of the TTF is not the same as for - // text at a 0 degree angle - - if ($angle > 0.001 && abs($angle-360) > 0.001) { - $h = abs($bbox[7]-$bbox[1]); - $w = abs($bbox[2]-$bbox[0]); - - $bbox[0] -= 2; - $bbox[6] -= 2; - // The width is underestimated so compensate for that - $bbox[2] += round($w*0.06); - $bbox[4] += round($w*0.06); - - // and we also need to compensate with increased height - $bbox[5] -= round($h*0.1); - $bbox[7] -= round($h*0.1); - - if ($angle > 90) { - // For angles > 90 we also need to extend the height further down - // by the baseline since that is also one more problem - $bbox[1] += round($h*0.15); - $bbox[3] += round($h*0.15); - - // and also make it slighty less height - $bbox[7] += round($h*0.05); - $bbox[5] += round($h*0.05); - - // And we need to move the box slightly top the rright (from a tetx perspective) - $bbox[0] += round($w*0.02); - $bbox[6] += round($w*0.02); - - if ($angle > 180) { - // And we need to move the box slightly to the left (from a text perspective) - $bbox[0] -= round($w*0.02); - $bbox[6] -= round($w*0.02); - $bbox[2] -= round($w*0.02); - $bbox[4] -= round($w*0.02); - } - } - for ($i = 0; $i < 7; $i += 2) { - $ret[$i] = round($bbox[$i] * $ca + $bbox[$i+1] * $sa); - $ret[$i+1] = round($bbox[$i+1] * $ca - $bbox[$i] * $sa); - } - $this->bbox_cache = $ret; - return $ret; - } else { - $this->bbox_cache = $bbox; - return $bbox; - } - } - - // Deprecated - public function GetTTFBBox($aTxt, $aAngle=0) - { - $bbox = $this->imagettfbbox_fixed($this->font_size, $aAngle, $this->font_file, $aTxt); return $bbox; } @@ -908,39 +620,38 @@ class Image JpGraphError::RaiseL(25093, $this->font_file); //('Can not read font file ('.$this->font_file.') in call to Image::GetBBoxTTF. Please make sure that you have set a font before calling this method and that the font is installed in the TTF directory.'); } - $bbox = $this->imagettfbbox_fixed($this->font_size, $aAngle, $this->font_file, $aTxt); + $bbox = $this->GetTTFBBox($aTxt, $aAngle); if ($aAngle==0) { return $bbox; } - if ($aAngle >= 0) { if ($aAngle <= 90) { //<=0 $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], - $bbox[2],$bbox[5],$bbox[6],$bbox[5]); + $bbox[2],$bbox[5],$bbox[6],$bbox[5]); } elseif ($aAngle <= 180) { //<= 2 $bbox = array($bbox[4],$bbox[7],$bbox[0],$bbox[7], - $bbox[0],$bbox[3],$bbox[4],$bbox[3]); + $bbox[0],$bbox[3],$bbox[4],$bbox[3]); } elseif ($aAngle <= 270) { //<= 3 $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], - $bbox[6],$bbox[1],$bbox[2],$bbox[1]); + $bbox[6],$bbox[1],$bbox[2],$bbox[1]); } else { $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], - $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); } } elseif ($aAngle < 0) { if ($aAngle <= -270) { // <= -3 $bbox = array($bbox[6],$bbox[1],$bbox[2],$bbox[1], - $bbox[2],$bbox[5],$bbox[6],$bbox[5]); + $bbox[2],$bbox[5],$bbox[6],$bbox[5]); } elseif ($aAngle <= -180) { // <= -2 $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], - $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); } elseif ($aAngle <= -90) { // <= -1 $bbox = array($bbox[2],$bbox[5],$bbox[6],$bbox[5], - $bbox[6],$bbox[1],$bbox[2],$bbox[1]); + $bbox[6],$bbox[1],$bbox[2],$bbox[1]); } else { $bbox = array($bbox[0],$bbox[3],$bbox[4],$bbox[3], - $bbox[4],$bbox[7],$bbox[0],$bbox[7]); + $bbox[4],$bbox[7],$bbox[0],$bbox[7]); } } return $bbox; @@ -949,7 +660,7 @@ class Image public function GetBBoxHeight($aTxt, $aAngle=0) { $box = $this->GetBBoxTTF($aTxt, $aAngle); - return abs($box[7]-$box[1]); + return $box[1]-$box[7]+1; } public function GetBBoxWidth($aTxt, $aAngle=0) @@ -958,13 +669,12 @@ class Image return $box[2]-$box[0]+1; } - - public function _StrokeTTF($x, $y, $txt, $dir, $paragraph_align, &$aBoundingBox, $debug=false) + public function _StrokeTTF($x, $y, $txt, $dir=0, $paragraph_align="left", &$aBoundingBox, $debug=false) { - // Setup default inter line margin for paragraphs to be - // 3% of the font height. - $ConstLineSpacing = 0.03 ; + // Setupo default inter line margin for paragraphs to + // 25% of the font height. + $ConstLineSpacing = 0.25 ; // Remember the anchor point before adjustment if ($debug) { @@ -972,45 +682,31 @@ class Image $oy=$y; } - if (!preg_match('/\n/', $txt) || ($dir>0 && preg_match('/\n/', $txt))) { + if (!ereg("\n", $txt) || ($dir>0 && ereg("\n", $txt))) { // Format a single line $txt = $this->AddTxtCR($txt); + $bbox=$this->GetBBoxTTF($txt, $dir); - $width = $this->GetBBoxWidth($txt, $dir); - $height = $this->GetBBoxHeight($txt, $dir); + + // Align x,y ot lower left corner of bbox + $x -= $bbox[0]; + $y -= $bbox[1]; - // The special alignment "basepoint" is mostly used internally - // in the library. This will put the anchor position at the left - // basepoint of the tetx. This is the default anchor point for - // TTF text. - - if ($this->text_valign != 'basepoint') { - // Align x,y ot lower left corner of bbox - - - if ($this->text_halign=='right') { - $x -= $width; - $x -= $bbox[0]; - } elseif ($this->text_halign=='center') { - $x -= $width/2; - $x -= $bbox[0]; - } elseif ($this->text_halign=='baseline') { - // This is only support for text at 90 degree !! - // Do nothing the text is drawn at baseline by default - } - - if ($this->text_valign=='top') { - $y -= $bbox[1]; // Adjust to bottom of text - $y += $height; - } elseif ($this->text_valign=='center') { - $y -= $bbox[1]; // Adjust to bottom of text - $y += $height/2; - } elseif ($this->text_valign=='baseline') { - // This is only support for text at 0 degree !! - // Do nothing the text is drawn at baseline by default - } + // Note to self: "topanchor" is deprecated after we changed the + // bopunding box stuff. + if ($this->text_halign=="right" || $this->text_halign=="topanchor") { + $x -= $bbox[2]-$bbox[0]; + } elseif ($this->text_halign=="center") { + $x -= ($bbox[2]-$bbox[0])/2; } + + if ($this->text_valign=="top") { + $y += abs($bbox[5])+$bbox[1]; + } elseif ($this->text_valign=="center") { + $y -= ($bbox[5]-$bbox[1])/2; + } + ImageTTFText( $this->img, $this->font_size, @@ -1023,9 +719,10 @@ class Image ); // Calculate and return the co-ordinates for the bounding box - $box = $this->imagettfbbox_fixed($this->font_size, $dir, $this->font_file, $txt); + $box=@ImageTTFBBox($this->font_size, $dir, $this->font_file, $txt); $p1 = array(); + for ($i=0; $i < 4; ++$i) { $p1[] = round($box[$i*2]+$x); $p1[] = round($box[$i*2+1]+$y); @@ -1037,27 +734,26 @@ class Image // same if ($debug) { // Draw the bounding rectangle and the bounding box - + $box=@ImageTTFBBox($this->font_size, $dir, $this->font_file, $txt); $p = array(); $p1 = array(); - for ($i=0; $i < 4; ++$i) { - $p[] = $bbox[$i*2]+$x ; - $p[] = $bbox[$i*2+1]+$y; - $p1[] = $box[$i*2]+$x ; - $p1[] = $box[$i*2+1]+$y ; + $p[] = $bbox[$i*2]+$x; + $p[] = $bbox[$i*2+1]+$y; + $p1[] = $box[$i*2]+$x; + $p1[] = $box[$i*2+1]+$y; } // Draw bounding box $this->PushColor('green'); $this->Polygon($p1, true); $this->PopColor(); - + // Draw bounding rectangle $this->PushColor('darkgreen'); $this->Polygon($p, true); $this->PopColor(); - + // Draw a cross at the anchor point $this->PushColor('red'); $this->Line($ox-15, $oy, $ox+15, $oy); @@ -1074,20 +770,20 @@ class Image $w=$this->GetTextWidth($txt); $y -= $linemargin/2; - $tmp = preg_split('/\n/', $txt); + $tmp = split("\n", $txt); $nl = count($tmp); $h = $nl * $fh; - if ($this->text_halign=='right') { + if ($this->text_halign=="right") { $x -= $dir==0 ? $w : $h; - } elseif ($this->text_halign=='center') { + } elseif ($this->text_halign=="center") { $x -= $dir==0 ? $w/2 : $h/2; } - - if ($this->text_valign=='top') { - $y += $dir==0 ? $h : $w; - } elseif ($this->text_valign=='center') { - $y += $dir==0 ? $h/2 : $w/2; + + if ($this->text_valign=="top") { + $y += $dir==0 ? $h : $w; + } elseif ($this->text_valign=="center") { + $y += $dir==0 ? $h/2 : $w/2; } // Here comes a tricky bit. @@ -1106,21 +802,18 @@ class Image for ($i=0; $i < $nl; ++$i) { $wl = $this->GetTextWidth($tmp[$i]); $bbox = $this->GetTTFBBox($tmp[$i], $dir); - if ($paragraph_align=='left') { + if ($paragraph_align=="left") { $xl = $x; - } elseif ($paragraph_align=='right') { + } elseif ($paragraph_align=="right") { $xl = $x + ($w-$wl); } else { // Center $xl = $x + $w/2 - $wl/2 ; } - // In theory we should adjust with full pre-lead to get the lines - // lined up but this doesn't look good so therfore we only adjust with - // half th pre-lead - $xl -= $bbox[0]/2; + $xl -= $bbox[0]; $yl = $y - $yadj; - //$xl = $xl- $xadj; + $xl = $xl - $xadj; ImageTTFText( $this->img, $this->font_size, @@ -1132,7 +825,6 @@ class Image $tmp[$i] ); - // echo "xl=$xl,".$tmp[$i]."
"; if ($debug) { // Draw the bounding rectangle around each line $box=@ImageTTFBBox($this->font_size, $dir, $this->font_file, $tmp[$i]); @@ -1141,7 +833,7 @@ class Image $p[] = $bbox[$j*2]+$xl; $p[] = $bbox[$j*2+1]+$yl-($h-$fh)+$fh*$i; } - + // Draw bounding rectangle $this->PushColor('darkgreen'); $this->Polygon($p, true); @@ -1166,7 +858,7 @@ class Image } } } - + public function StrokeText($x, $y, $txt, $dir=0, $paragraph_align="left", $debug=false) { $x = round($x); @@ -1176,33 +868,30 @@ class Image $txt = $this->langconv->Convert($txt, $this->font_family); if (!is_numeric($dir)) { - JpGraphError::RaiseL(25094);//(" Direction for text most be given as an angle between 0 and 90."); - } - + JpGraphError::RaiseL(25094); + }//(" Direction for text most be given as an angle between 0 and 90."); + if ($this->font_family >= FF_FONT0 && $this->font_family <= FF_FONT2+1) { $this->_StrokeBuiltinFont($x, $y, $txt, $dir, $paragraph_align, $boundingbox, $debug); } elseif ($this->font_family >= _FIRST_FONT && $this->font_family <= _LAST_FONT) { $this->_StrokeTTF($x, $y, $txt, $dir, $paragraph_align, $boundingbox, $debug); } else { - JpGraphError::RaiseL(25095);//(" Unknown font font family specification. "); - } + JpGraphError::RaiseL(25095); + }//(" Unknown font font family specification. "); return $boundingbox; } - + public function SetMargin($lm, $rm, $tm, $bm) { $this->left_margin=$lm; $this->right_margin=$rm; $this->top_margin=$tm; $this->bottom_margin=$bm; - - $this->plotwidth = $this->width - $this->left_margin - $this->right_margin; - $this->plotheight = $this->height - $this->top_margin - $this->bottom_margin; - + $this->plotwidth=$this->width - $this->left_margin-$this->right_margin ; + $this->plotheight=$this->height - $this->top_margin-$this->bottom_margin ; if ($this->width > 0 && $this->height > 0) { if ($this->plotwidth < 0 || $this->plotheight < 0) { - JpGraphError::RaiseL(25130, $this->plotwidth, $this->plotheight); - //JpGraphError::raise("To small plot area. ($lm,$rm,$tm,$bm : $this->plotwidth x $this->plotheight). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins."); + JpGraphError::raise("To small plot area. ($lm,$rm,$tm,$bm : $this->plotwidth x $this->plotheight). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins."); } } } @@ -1211,7 +900,7 @@ class Image { imagecolortransparent($this->img, $this->rgb->allocate($color)); } - + public function SetColor($color, $aAlpha=0) { $this->current_color_name = $color; @@ -1223,7 +912,7 @@ class Image } return $this->current_color; } - + public function PushColor($color) { if ($color != "") { @@ -1235,31 +924,29 @@ class Image JpGraphError::RaiseL(25097);//("Color specified as empty string in PushColor()."); } } - + public function PopColor() { - if ($this->colorstackidx < 1) { - JpGraphError::RaiseL(25098);//(" Negative Color stack index. Unmatched call to PopColor()"); - } + if ($this->colorstackidx<1) { + JpGraphError::RaiseL(25098); + }//(" Negative Color stack index. Unmatched call to PopColor()"); $this->current_color=$this->colorstack[--$this->colorstackidx]; $this->current_color_name=$this->colorstack[--$this->colorstackidx]; } - - + + public function SetLineWeight($weight) { - $old = $this->line_weight; imagesetthickness($this->img, $weight); $this->line_weight = $weight; - return $old; } - + public function SetStartPoint($x, $y) { $this->lastx=round($x); $this->lasty=round($y); } - + public function Arc($cx, $cy, $w, $h, $s, $e) { // GD Arc doesn't like negative angles @@ -1269,13 +956,21 @@ class Image while ($e < 0) { $e += 360; } - imagearc($this->img, round($cx), round($cy), round($w), round($h), $s, $e, $this->current_color); + + imagearc( + $this->img, + round($cx), + round($cy), + round($w), + round($h), + $s, + $e, + $this->current_color + ); } - + public function FilledArc($xc, $yc, $w, $h, $s, $e, $style='') { - $s = round($s); - $e = round($e); while ($s < 0) { $s += 360; } @@ -1285,9 +980,18 @@ class Image if ($style=='') { $style=IMG_ARC_PIE; } - if (abs($s-$e) > 0) { - imagefilledarc($this->img, round($xc), round($yc), round($w), round($h), $s, $e, $this->current_color, $style); -// $this->DrawImageSmoothArc($this->img,round($xc),round($yc),round($w),round($h),$s,$e,$this->current_color,$style); + if (abs($s-$e) > 0.001) { + imagefilledarc( + $this->img, + round($xc), + round($yc), + round($w), + round($h), + round($s), + round($e), + $this->current_color, + $style + ); } } @@ -1304,18 +1008,12 @@ class Image $h = round($h); $xc = round($xc); $yc = round($yc); - if ($s == $e) { + if ($s ==$e) { // A full circle. We draw this a plain circle $this->PushColor($fillcolor); imagefilledellipse($this->img, $xc, $yc, 2*$w, 2*$h, $this->current_color); - - // If antialiasing is used then we often don't have any color no the surrounding - // arc. So, we need to check for this special case so we don't send an empty - // color to the push function. In this case we use the fill color for the arc as well - if ($arccolor != '') { - $this->PopColor(); - $this->PushColor($arccolor); - } + $this->PopColor(); + $this->PushColor($arccolor); imageellipse($this->img, $xc, $yc, 2*$w, 2*$h, $this->current_color); $this->Line($xc, $yc, cos($s*M_PI/180)*$w+$xc, $yc+sin($s*M_PI/180)*$h); $this->PopColor(); @@ -1337,20 +1035,17 @@ class Image { $this->Arc($xc, $yc, $w, $h, 0, 360); } - + public function Circle($xc, $yc, $r) { imageellipse($this->img, round($xc), round($yc), $r*2, $r*2, $this->current_color); -// $this->DrawImageSmoothArc($this->img,round($xc),round($yc),$r*2+1,$r*2+1,0,360,$this->current_color); -// $this->imageSmoothCircle($this->img, round($xc),round($yc), $r*2+1, $this->current_color); } - + public function FilledCircle($xc, $yc, $r) { imagefilledellipse($this->img, round($xc), round($yc), 2*$r, 2*$r, $this->current_color); -// $this->DrawImageSmoothArc($this->img, round($xc), round($yc), 2*$r, 2*$r, 0, 360, $this->current_color); } - + // Linear Color InterPolation public function lip($f, $t, $p) { @@ -1366,8 +1061,8 @@ class Image { if (is_numeric($s)) { if ($s<1 || $s>4) { - JpGraphError::RaiseL(25101, $s);//(" Illegal numeric argument to SetLineStyle(): ($s)"); - } + JpGraphError::RaiseL(25101, $s); + }//(" Illegal numeric argument to SetLineStyle(): ($s)"); } elseif (is_string($s)) { if ($s == "solid") { $s=1; @@ -1378,8 +1073,8 @@ class Image } elseif ($s == "longdashed") { $s=4; } else { - JpGraphError::RaiseL(25102, $s);//(" Illegal string argument to SetLineStyle(): $s"); - } + JpGraphError::RaiseL(25102, $s); + }//(" Illegal string argument to SetLineStyle(): $s"); } else { JpGraphError::RaiseL(25103, $s);//(" Illegal argument to SetLineStyle $s"); } @@ -1387,9 +1082,9 @@ class Image $this->line_style=$s; return $old; } - + // Same as Line but take the line_style into account - public function StyleLine($x1, $y1, $x2, $y2, $aStyle='', $from_grid_class = false) + public function StyleLine($x1, $y1, $x2, $y2, $aStyle='') { if ($this->line_weight <= 0) { return; @@ -1399,46 +1094,28 @@ class Image $aStyle = $this->line_style; } - $dashed_line_method = 'DashedLine'; - if ($from_grid_class) { - $dashed_line_method = 'DashedLineForGrid'; - } - // Add error check since dashed line will only work if anti-alias is disabled // this is a limitation in GD - if ($aStyle == 1) { - // Solid style. We can handle anti-aliasing for this - $this->Line($x1, $y1, $x2, $y2); - } else { - // Since the GD routines doesn't handle AA for styled line - // we have no option than to turn it off to get any lines at - // all if the weight > 1 - $oldaa = $this->GetAntiAliasing(); - if ($oldaa && $this->line_weight > 1) { - $this->SetAntiAliasing(false); - } - - switch ($aStyle) { - case 2: // Dotted - $this->$dashed_line_method($x1, $y1, $x2, $y2, 2, 6); - break; - case 3: // Dashed - $this->$dashed_line_method($x1, $y1, $x2, $y2, 5, 9); - break; - case 4: // Longdashes - $this->$dashed_line_method($x1, $y1, $x2, $y2, 9, 13); - break; - default: - JpGraphError::RaiseL(25104, $this->line_style);//(" Unknown line style: $this->line_style "); - break; - } - if ($oldaa) { - $this->SetAntiAliasing(true); - } - } + switch ($aStyle) { + case 1:// Solid + $this->Line($x1, $y1, $x2, $y2); + break; + case 2: // Dotted + $this->DashedLine($x1, $y1, $x2, $y2, 2, 6); + break; + case 3: // Dashed + $this->DashedLine($x1, $y1, $x2, $y2, 5, 9); + break; + case 4: // Longdashes + $this->DashedLine($x1, $y1, $x2, $y2, 9, 13); + break; + default: + JpGraphError::RaiseL(25104, $this->line_style);//(" Unknown line style: $this->line_style "); + break; } - + } + public function DashedLine($x1, $y1, $x2, $y2, $dash_length=1, $dash_space=4) { if ($this->line_weight <= 0) { @@ -1449,59 +1126,21 @@ class Image // Dashed line does not work with anti-alias enabled. This // is a limitation in GD. if ($this->use_anti_aliasing) { -// JpGraphError::RaiseL(25129); // Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines. + JpGraphError::RaiseL(25129); // Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines. } - + + $x1 = round($x1); $x2 = round($x2); $y1 = round($y1); $y2 = round($y2); - $dash_length *= SUPERSAMPLING_SCALE; - $dash_space *= SUPERSAMPLING_SCALE; - $style = array_fill(0, $dash_length, $this->current_color); $style = array_pad($style, $dash_space, IMG_COLOR_TRANSPARENT); imagesetstyle($this->img, $style); imageline($this->img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED); - - $this->lastx = $x2; - $this->lasty = $y2; - } - - public function DashedLineForGrid($x1, $y1, $x2, $y2, $dash_length=1, $dash_space=4) - { - if ($this->line_weight <= 0) { - return; - } - - // Add error check to make sure anti-alias is not enabled. - // Dashed line does not work with anti-alias enabled. This - // is a limitation in GD. - if ($this->use_anti_aliasing) { -// JpGraphError::RaiseL(25129); // Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines. - } - - $x1 = round($x1); - $x2 = round($x2); - $y1 = round($y1); - $y2 = round($y2); - - /* - $dash_length *= $this->scale; - $dash_space *= $this->scale; - */ - - $dash_length = 2; - $dash_length = 4; - imagesetthickness($this->img, 1); - $style = array_fill(0, $dash_length, $this->current_color); //hexdec('CCCCCC')); - $style = array_pad($style, $dash_space, IMG_COLOR_TRANSPARENT); - imagesetstyle($this->img, $style); - imageline($this->img, $x1, $y1, $x2, $y2, IMG_COLOR_STYLED); - - $this->lastx = $x2; - $this->lasty = $y2; + $this->lastx=$x2; + $this->lasty=$y2; } public function Line($x1, $y1, $x2, $y2) @@ -1516,7 +1155,6 @@ class Image $y2 = round($y2); imageline($this->img, $x1, $y1, $x2, $y2, $this->current_color); -// $this->DrawLine($this->img, $x1, $y1, $x2, $y2, $this->line_weight, $this->current_color); $this->lastx=$x2; $this->lasty=$y2; } @@ -1550,7 +1188,7 @@ class Image } } } - + public function FilledPolygon($pts) { $n=count($pts); @@ -1560,18 +1198,14 @@ class Image for ($i=0; $i < $n; ++$i) { $pts[$i] = round($pts[$i]); } - $old = $this->line_weight; - imagesetthickness($this->img, 1); imagefilledpolygon($this->img, $pts, count($pts)/2, $this->current_color); - $this->line_weight = $old; - imagesetthickness($this->img, $old); } - + public function Rectangle($xl, $yu, $xr, $yl) { $this->Polygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl,$xl,$yu)); } - + public function FilledRectangle($xl, $yu, $xr, $yl) { $this->FilledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl)); @@ -1610,39 +1244,14 @@ class Image } } - public function ShadowRectangle($xl, $yu, $xr, $yl, $fcolor=false, $shadow_width=4, $shadow_color='darkgray', $useAlpha=true) + public function ShadowRectangle($xl, $yu, $xr, $yl, $fcolor=false, $shadow_width=3, $shadow_color=array(102,102,102)) { // This is complicated by the fact that we must also handle the case where // the reactangle has no fill color - $xl = floor($xl); - $yu = floor($yu); - $xr = floor($xr); - $yl = floor($yl); $this->PushColor($shadow_color); - $shadowAlpha=0; - $this->SetLineWeight(1); - $this->SetLineStyle('solid'); - $basecolor = $this->rgb->Color($shadow_color); - $shadow_color = array($basecolor[0],$basecolor[1],$basecolor[2],); - for ($i=0; $i < $shadow_width; ++$i) { - $this->SetColor($shadow_color, $shadowAlpha); - $this->Line( - $xr-$shadow_width+$i, - $yu+$shadow_width, - $xr-$shadow_width+$i, - $yl-$shadow_width-1+$i - ); - $this->Line( - $xl+$shadow_width, - $yl-$shadow_width+$i, - $xr-$shadow_width+$i, - $yl-$shadow_width+$i - ); - if ($useAlpha) { - $shadowAlpha += 1.0/$shadow_width; - } - } - + $this->FilledRectangle($xr-$shadow_width, $yu+$shadow_width, $xr, $yl-$shadow_width-1); + $this->FilledRectangle($xl+$shadow_width, $yl-$shadow_width, $xr, $yl); + //$this->FilledRectangle($xl+$shadow_width,$yu+$shadow_width,$xr,$yl); $this->PopColor(); if ($fcolor==false) { $this->Rectangle($xl, $yu, $xr-$shadow_width-1, $yl-$shadow_width-1); @@ -1664,17 +1273,17 @@ class Image // To avoid overlapping fillings (which will look strange // when alphablending is enabled) we have no choice but // to fill the five distinct areas one by one. - + // Center square $this->FilledRectangle($xt+$r, $yt+$r, $xr-$r, $yl-$r); // Top band - $this->FilledRectangle($xt+$r, $yt, $xr-$r, $yt+$r); + $this->FilledRectangle($xt+$r, $yt, $xr-$r, $yt+$r-1); // Bottom band - $this->FilledRectangle($xt+$r, $yl-$r, $xr-$r, $yl); + $this->FilledRectangle($xt+$r, $yl-$r+1, $xr-$r, $yl); // Left band - $this->FilledRectangle($xt, $yt+$r, $xt+$r, $yl-$r); + $this->FilledRectangle($xt, $yt+$r+1, $xt+$r-1, $yl-$r); // Right band - $this->FilledRectangle($xr-$r, $yt+$r, $xr, $yl-$r); + $this->FilledRectangle($xr-$r+1, $yt+$r, $xr, $yl-$r); // Topleft & Topright arc $this->FilledArc($xt+$r, $yt+$r, $r*2, $r*2, 180, 270); @@ -1723,7 +1332,7 @@ class Image $this->Line($x1+$i, $y1+$i, $x2-$i, $y1+$i); } $this->PopColor(); - + $this->PushColor($color2); for ($i=0; $i < $depth; ++$i) { $this->Line($x1+$i, $y2-$i, $x2-$i, $y2-$i); @@ -1738,19 +1347,19 @@ class Image $this->lastx=$x; $this->lasty=$y; } - + public function LineTo($x, $y) { $this->Line($this->lastx, $this->lasty, $x, $y); $this->lastx=$x; $this->lasty=$y; } - + public function Point($x, $y) { imagesetpixel($this->img, round($x), round($y), $this->current_color); } - + public function Fill($x, $y) { imagefill($this->img, round($x), round($y), $this->current_color); @@ -1769,12 +1378,12 @@ class Image { $this->expired = $aFlg; } - + // Generate image header public function Headers() { - - // In case we are running from the command line with the client version of + + // In case we are running from the command line with the client version of // PHP we can't send any headers. $sapi = php_sapi_name(); if ($sapi == 'cli') { @@ -1791,7 +1400,7 @@ class Image $msg = $t->Get(10, $file, $lineno); die($msg); } - + if ($this->expired) { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); @@ -1806,58 +1415,34 @@ class Image { $this->quality = $q; } - + // Stream image to browser or to file - public function Stream($aFile=null) + public function Stream($aFile="") { - $this->DoSupersampling(); - $func="image".$this->img_format; if ($this->img_format=="jpeg" && $this->quality != null) { $res = @$func($this->img, $aFile, $this->quality); - - if (!$res) { - if ($aFile != null) { - JpGraphError::RaiseL(25107, $aFile);//("Can't write to file '$aFile'. Check that the process running PHP has enough permission."); - } else { - JpGraphError::RaiseL(25108);//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP."); - } - } } else { - if ($aFile != null) { + if ($aFile != "") { $res = @$func($this->img, $aFile); if (!$res) { - JpGraphError::RaiseL(25107, $aFile);//("Can't write to file '$aFile'. Check that the process running PHP has enough permission."); - } + JpGraphError::RaiseL(25107, $aFile); + }//("Can't write to file '$aFile'. Check that the process running PHP has enough permission."); } else { $res = @$func($this->img); if (!$res) { - JpGraphError::RaiseL(25108);//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP."); - } + JpGraphError::RaiseL(25108); + }//("Can't stream image. This is most likely due to a faulty PHP/GD setup. Try to recompile PHP and use the built-in GD library that comes with PHP."); } } } - - // Do SuperSampling using $scale - public function DoSupersampling() - { - if (SUPERSAMPLING_SCALE <= 1) { - return $this->img; - } - - $dst_img = @imagecreatetruecolor($this->original_width, $this->original_height); - imagecopyresampled($dst_img, $this->img, 0, 0, 0, 0, $this->original_width, $this->original_height, $this->width, $this->height); - $this->Destroy(); - return $this->img = $dst_img; - } - - // Clear resources used by image (this is normally not used since all resources are/should be - // returned when the script terminates + + // Clear resource tide up by image public function Destroy() { imagedestroy($this->img); } - + // Specify image format. Note depending on your installation // of PHP not all formats may be supported. public function SetImgFormat($aFormat, $aQuality=75) @@ -1878,8 +1463,9 @@ class Image } elseif ($supported & IMG_XPM) { $this->img_format="xpm"; } else { - JpGraphError::RaiseL(25109);//("Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details."); - } + JpGraphError::RaiseL(25109); + }//("Your PHP (and GD-lib) installation does not appear to support any known graphic formats. You need to first make sure GD is compiled as a module to PHP. If you also want to use JPEG images you must get the JPEG library. Please see the PHP docs for details."); + return true; } else { if ($aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif") { @@ -1901,210 +1487,10 @@ class Image $tst=false; } if (!$tst) { - JpGraphError::RaiseL(25110, $aFormat);//(" Your PHP installation does not support the chosen graphic format: $aFormat"); - } + JpGraphError::RaiseL(25110, $aFormat); + }//(" Your PHP installation does not support the chosen graphic format: $aFormat"); } } - - /** - * Draw Line - */ - public function DrawLine($im, $x1, $y1, $x2, $y2, $weight, $color) - { - if ($weight == 1) { - return imageline($im, $x1, $y1, $x2, $y2, $color); - } - - $angle=(atan2(($y1 - $y2), ($x2 - $x1))); - - $dist_x = $weight * (sin($angle)) / 2; - $dist_y = $weight * (cos($angle)) / 2; - - $p1x=ceil(($x1 + $dist_x)); - $p1y=ceil(($y1 + $dist_y)); - $p2x=ceil(($x2 + $dist_x)); - $p2y=ceil(($y2 + $dist_y)); - $p3x=ceil(($x2 - $dist_x)); - $p3y=ceil(($y2 - $dist_y)); - $p4x=ceil(($x1 - $dist_x)); - $p4y=ceil(($y1 - $dist_y)); - - $array=array($p1x,$p1y,$p2x,$p2y,$p3x,$p3y,$p4x,$p4y); - imagefilledpolygon($im, $array, (count($array)/2), $color); - - // for antialias - imageline($im, $p1x, $p1y, $p2x, $p2y, $color); - imageline($im, $p3x, $p3y, $p4x, $p4y, $color); - return; - - - - return imageline($this->img, $x1, $y1, $x2, $y2, $this->current_color); - $weight = 8; - if ($weight <= 1) { - return imageline($this->img, $x1, $y1, $x2, $y2, $this->current_color); - } - - $pts = array(); - - $weight /= 2; - - if ($y2 - $y1 == 0) { - // x line - $pts = array(); - $pts[] = $x1; - $pts[] = $y1 - $weight; - $pts[] = $x1; - $pts[] = $y1 + $weight; - $pts[] = $x2; - $pts[] = $y2 + $weight; - $pts[] = $x2; - $pts[] = $y2 - $weight; - } elseif ($x2 - $x1 == 0) { - // y line - $pts = array(); - $pts[] = $x1 - $weight; - $pts[] = $y1; - $pts[] = $x1 + $weight; - $pts[] = $y1; - $pts[] = $x2 + $weight; - $pts[] = $y2; - $pts[] = $x2 - $weight; - $pts[] = $y2; - } else { - var_dump($x1, $x2, $y1, $y2); - $length = sqrt(pow($x2 - $x1, 2) + pow($y2 - $y1, 2)); - var_dump($length); - exit; - exit; - - /* - $lean = ($y2 - $y1) / ($x2 - $x1); - $lean2 = -1 / $lean; - $sin = $lean / ($y2 - $y1); - $cos = $lean / ($x2 - $x1); - - $pts[] = $x1 + (-$weight * $sin); $pts[] = $y1 + (-$weight * $cos); - $pts[] = $x1 + (+$weight * $sin); $pts[] = $y1 + (+$weight * $cos); - $pts[] = $x2 + (+$weight * $sin); $pts[] = $y2 + (+$weight * $cos); - $pts[] = $x2 + (-$weight * $sin); $pts[] = $y2 + (-$weight * $cos); - */ - } - - //print_r($pts);exit; - if (count($pts)/2 < 3) { - return; - } - - imagesetthickness($im, 1); - imagefilledpolygon($im, $pts, count($pts)/2, $color); - - - $weight *= 2; - -// $this->DrawImageSmoothArc($im, $x1, $y1, $weight, $weight, 0, 360, $color); -// $this->DrawImageSmoothArc($im, $x2, $y2, $weight, $weight, 0, 360, $color); - } - - - public function DrawImageSmoothArc($im, $xc, $yc, $w, $h, $s, $e, $color, $style = null) - { - $tmp = $s; - $s = (360 - $e) / 180 * M_PI; - $e = (360 - $tmp) / 180 * M_PI; - return imageSmoothArc($im, round($xc), round($yc), round($w), round($h), $this->CreateColorForImageSmoothArc($color), $s, $e); - } - - public function CreateColorForImageSmoothArc($color) - { - $alpha = $color >> 24 & 0xFF; - $red = $color >> 16 & 0xFF; - $green = $color >> 8 & 0xFF; - $blue = $color & 0xFF; - - //var_dump($alpha, $red, $green, $blue);exit; - - return array($red, $green, $blue, $alpha); - } - - public function imageSmoothCircle(&$img, $cx, $cy, $cr, $color) - { - $ir = $cr; - $ix = 0; - $iy = $ir; - $ig = 2 * $ir - 3; - $idgr = -6; - $idgd = 4 * $ir - 10; - $fill = imageColorExactAlpha($img, $color[ 'R' ], $color[ 'G' ], $color[ 'B' ], 0); - imageLine($img, $cx + $cr - 1, $cy, $cx, $cy, $fill); - imageLine($img, $cx - $cr + 1, $cy, $cx - 1, $cy, $fill); - imageLine($img, $cx, $cy + $cr - 1, $cx, $cy + 1, $fill); - imageLine($img, $cx, $cy - $cr + 1, $cx, $cy - 1, $fill); - $draw = imageColorExactAlpha($img, $color[ 'R' ], $color[ 'G' ], $color[ 'B' ], 42); - imageSetPixel($img, $cx + $cr, $cy, $draw); - imageSetPixel($img, $cx - $cr, $cy, $draw); - imageSetPixel($img, $cx, $cy + $cr, $draw); - imageSetPixel($img, $cx, $cy - $cr, $draw); - while ($ix <= $iy - 2) { - if ($ig < 0) { - $ig += $idgd; - $idgd -= 8; - $iy--; - } else { - $ig += $idgr; - $idgd -= 4; - } - $idgr -= 4; - $ix++; - imageLine($img, $cx + $ix, $cy + $iy - 1, $cx + $ix, $cy + $ix, $fill); - imageLine($img, $cx + $ix, $cy - $iy + 1, $cx + $ix, $cy - $ix, $fill); - imageLine($img, $cx - $ix, $cy + $iy - 1, $cx - $ix, $cy + $ix, $fill); - imageLine($img, $cx - $ix, $cy - $iy + 1, $cx - $ix, $cy - $ix, $fill); - imageLine($img, $cx + $iy - 1, $cy + $ix, $cx + $ix, $cy + $ix, $fill); - imageLine($img, $cx + $iy - 1, $cy - $ix, $cx + $ix, $cy - $ix, $fill); - imageLine($img, $cx - $iy + 1, $cy + $ix, $cx - $ix, $cy + $ix, $fill); - imageLine($img, $cx - $iy + 1, $cy - $ix, $cx - $ix, $cy - $ix, $fill); - $filled = 0; - for ($xx = $ix - 0.45; $xx < $ix + 0.5; $xx += 0.2) { - for ($yy = $iy - 0.45; $yy < $iy + 0.5; $yy += 0.2) { - if (sqrt(pow($xx, 2) + pow($yy, 2)) < $cr) { - $filled += 4; - } - } - } - $draw = imageColorExactAlpha($img, $color[ 'R' ], $color[ 'G' ], $color[ 'B' ], (100 - $filled)); - imageSetPixel($img, $cx + $ix, $cy + $iy, $draw); - imageSetPixel($img, $cx + $ix, $cy - $iy, $draw); - imageSetPixel($img, $cx - $ix, $cy + $iy, $draw); - imageSetPixel($img, $cx - $ix, $cy - $iy, $draw); - imageSetPixel($img, $cx + $iy, $cy + $ix, $draw); - imageSetPixel($img, $cx + $iy, $cy - $ix, $draw); - imageSetPixel($img, $cx - $iy, $cy + $ix, $draw); - imageSetPixel($img, $cx - $iy, $cy - $ix, $draw); - } - } - - public function __get($name) - { - if (strpos($name, 'raw_') !== false) { - // if $name == 'raw_left_margin' , return $this->_left_margin; - $variable_name = '_' . str_replace('raw_', '', $name); - return $this->$variable_name; - } - - $variable_name = '_' . $name; - - if (isset($this->$variable_name)) { - return $this->$variable_name * SUPERSAMPLING_SCALE; - } else { - JpGraphError::RaiseL('25132', $name); - } - } - - public function __set($name, $value) - { - $this->{'_'.$name} = $value; - } } // CLASS //=================================================== @@ -2120,15 +1506,15 @@ class RotImage extends Image public $transx=0; public $transy=0; private $m=array(); - - public function __construct($aWidth, $aHeight, $a=0, $aFormat=DEFAULT_GFORMAT, $aSetAutoMargin=true) + + public function RotImage($aWidth, $aHeight, $a=0, $aFormat=DEFAULT_GFORMAT, $aSetAutoMargin=true) { - parent::__construct($aWidth, $aHeight, $aFormat, $aSetAutoMargin); - $this->dx=$this->width/2; - $this->dy=$this->height/2; + $this->Image($aWidth, $aHeight, $aFormat, $aSetAutoMargin); + $this->dx=$this->left_margin+$this->plotwidth/2; + $this->dy=$this->top_margin+$this->plotheight/2; $this->SetAngle($a); } - + public function SetCenter($dx, $dy) { $old_dx = $this->dx; @@ -2138,7 +1524,7 @@ class RotImage extends Image $this->SetAngle($this->a); return array($old_dx,$old_dy); } - + public function SetTranslation($dx, $dy) { $old = array($this->transx,$this->transy); @@ -2182,7 +1568,7 @@ class RotImage extends Image parent::FilledCircle($xc, $yc, $r); } - + public function Arc($xc, $yc, $w, $h, $s, $e) { list($xc, $yc) = $this->Rotate($xc, $yc); @@ -2202,9 +1588,11 @@ class RotImage extends Image public function SetMargin($lm, $rm, $tm, $bm) { parent::SetMargin($lm, $rm, $tm, $bm); + $this->dx=$this->left_margin+$this->plotwidth/2; + $this->dy=$this->top_margin+$this->plotheight/2; $this->UpdateRotMatrice(); } - + public function Rotate($x, $y) { // Optimization. Ignore rotation if Angle==0 || Angle==360 @@ -2216,7 +1604,7 @@ class RotImage extends Image return array($x1,$y1); } } - + public function CopyMerge($fromImg, $toX, $toY, $fromX, $fromY, $toWidth, $toHeight, $fromWidth=-1, $fromHeight=-1, $aMix=100) { list($toX, $toY) = $this->Rotate($toX, $toY); @@ -2240,7 +1628,7 @@ class RotImage extends Image list($x2, $y2) = $this->Rotate($x2, $y2); parent::DashedLine($x1, $y1, $x2, $y2, $dash_length, $dash_space); } - + public function Line($x1, $y1, $x2, $y2) { list($x1, $y1) = $this->Rotate($x1, $y1); @@ -2253,7 +1641,7 @@ class RotImage extends Image // Rectangle uses Line() so it will be rotated through that call parent::Rectangle($x1, $y1, $x2, $y2); } - + public function FilledRectangle($x1, $y1, $x2, $y2) { if ($y1==$y2 || $x1==$x2) { @@ -2262,7 +1650,7 @@ class RotImage extends Image $this->FilledPolygon(array($x1,$y1,$x2,$y1,$x2,$y2,$x1,$y2)); } } - + public function Polygon($pnts, $closed=false, $fast=false) { // Polygon uses Line() so it will be rotated through that call unless @@ -2273,18 +1661,18 @@ class RotImage extends Image parent::Polygon($pnts, $closed, $fast); } } - + public function FilledPolygon($pnts) { parent::FilledPolygon($this->ArrRotate($pnts)); } - + public function Point($x, $y) { list($xp, $yp) = $this->Rotate($x, $y); parent::Point($xp, $yp); } - + public function StrokeText($x, $y, $txt, $dir=0, $paragraph_align="left", $debug=false) { list($xp, $yp) = $this->Rotate($x, $y); @@ -2292,19 +1680,20 @@ class RotImage extends Image } } -//======================================================================= +//=================================================== // CLASS ImgStreamCache -// Description: Handle caching of graphs to files. All image output goes -// through this class -//======================================================================= +// Description: Handle caching of graphs to files +//=================================================== class ImgStreamCache { private $cache_dir; - private $timeout=0; // Infinite timeout + private $img=null; + private $timeout=0; // Infinite timeout //--------------- // CONSTRUCTOR - public function __construct($aCacheDir=CACHE_DIR) + public function ImgStreamCache($aImg, $aCacheDir=CACHE_DIR) { + $this->img = $aImg; $this->cache_dir = $aCacheDir; } @@ -2319,45 +1708,42 @@ class ImgStreamCache { $this->timeout=$aTimeout; } - + // Output image to browser and also write it to the cache public function PutAndStream($aImage, $aCacheFileName, $aInline, $aStrokeFileName) { + // Some debugging code to brand the image with numbe of colors + // used + global $gJpgBrandTiming; - // Check if we should always stroke the image to a file + if ($gJpgBrandTiming) { + global $tim; + $t=$tim->Pop()/1000.0; + $c=$aImage->SetColor("black"); + $t=sprintf(BRAND_TIME_FORMAT, round($t, 3)); + imagestring($this->img->img, 2, 5, $this->img->height-20, $t, $c); + } + + // Check if we should stroke the image to an arbitrary file if (_FORCE_IMGTOFILE) { $aStrokeFileName = _FORCE_IMGDIR.GenImgName(); } - if ($aStrokeFileName != '') { - if ($aStrokeFileName == 'auto') { + if ($aStrokeFileName!="") { + if ($aStrokeFileName == "auto") { $aStrokeFileName = GenImgName(); } - if (file_exists($aStrokeFileName)) { - - // Wait for lock (to make sure no readers are trying to access the image) - $fd = fopen($aStrokeFileName, 'w'); - $lock = flock($fd, LOCK_EX); - - // Since the image write routines only accepts a filename which must not - // exist we need to delete the old file first + // Delete the old file if (!@unlink($aStrokeFileName)) { - $lock = flock($fd, LOCK_UN); JpGraphError::RaiseL(25111, $aStrokeFileName); - //(" Can't delete cached image $aStrokeFileName. Permission problem?"); - } - $aImage->Stream($aStrokeFileName); - $lock = flock($fd, LOCK_UN); - fclose($fd); - } else { - $aImage->Stream($aStrokeFileName); + }//(" Can't delete cached image $aStrokeFileName. Permission problem?"); } - + $aImage->Stream($aStrokeFileName); return; } - if ($aCacheFileName != '' && USE_CACHE) { + if ($aCacheFileName != "" && USE_CACHE) { $aCacheFileName = $this->cache_dir . $aCacheFileName; if (file_exists($aCacheFileName)) { if (!$aInline) { @@ -2367,122 +1753,89 @@ class ImgStreamCache $diff=time()-filemtime($aCacheFileName); if ($diff < 0) { JpGraphError::RaiseL(25112, $aCacheFileName); - //(" Cached imagefile ($aCacheFileName) has file date in the future!!"); - } + }//(" Cached imagefile ($aCacheFileName) has file date in the future!!"); if ($this->timeout>0 && ($diff <= $this->timeout*60)) { return; } } - - // Wait for lock (to make sure no readers are trying to access the image) - $fd = fopen($aCacheFileName, 'w'); - $lock = flock($fd, LOCK_EX); - if (!@unlink($aCacheFileName)) { - $lock = flock($fd, LOCK_UN); JpGraphError::RaiseL(25113, $aStrokeFileName); - //(" Can't delete cached image $aStrokeFileName. Permission problem?"); - } + }//(" Can't delete cached image $aStrokeFileName. Permission problem?"); $aImage->Stream($aCacheFileName); - $lock = flock($fd, LOCK_UN); - fclose($fd); } else { $this->MakeDirs(dirname($aCacheFileName)); if (!is_writeable(dirname($aCacheFileName))) { - JpGraphError::RaiseL(25114, $aCacheFileName); - //('PHP has not enough permissions to write to the cache file '.$aCacheFileName.'. Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.'); + JpGraphError::RaiseL(25114, $aCacheFileName);//('PHP has not enough permissions to write to the cache file '.$aCacheFileName.'. Please make sure that the user running PHP has write permission for this file if you wan to use the cache system with JpGraph.'); } $aImage->Stream($aCacheFileName); } - + $res=true; // Set group to specified - if (CACHE_FILE_GROUP != '') { + if (CACHE_FILE_GROUP != "") { $res = @chgrp($aCacheFileName, CACHE_FILE_GROUP); } - if (CACHE_FILE_MOD != '') { + if (CACHE_FILE_MOD != "") { $res = @chmod($aCacheFileName, CACHE_FILE_MOD); } if (!$res) { JpGraphError::RaiseL(25115, $aStrokeFileName); - //(" Can't set permission for cached image $aStrokeFileName. Permission problem?"); - } - + }//(" Can't set permission for cached image $aStrokeFileName. Permission problem?"); + $aImage->Destroy(); if ($aInline) { if ($fh = @fopen($aCacheFileName, "rb")) { - $aImage->Headers(); + $this->img->Headers(); fpassthru($fh); return; } else { - JpGraphError::RaiseL(25116, $aFile);//(" Cant open file from cache [$aFile]"); - } + JpGraphError::RaiseL(25116, $aFile); + }//(" Cant open file from cache [$aFile]"); } } elseif ($aInline) { - $aImage->Headers(); + $this->img->Headers(); $aImage->Stream(); return; } } - - public function IsValid($aCacheFileName) + + // Check if a given image is in cache and in that case + // pass it directly on to web browser. Return false if the + // image file doesn't exist or exists but is to old + public function GetAndStream($aCacheFileName) { $aCacheFileName = $this->cache_dir.$aCacheFileName; - if (USE_CACHE && file_exists($aCacheFileName)) { + if (USE_CACHE && file_exists($aCacheFileName) && $this->timeout>=0) { $diff=time()-filemtime($aCacheFileName); if ($this->timeout>0 && ($diff > $this->timeout*60)) { return false; } else { - return true; + if ($fh = @fopen($aCacheFileName, "rb")) { + $this->img->Headers(); + fpassthru($fh); + return true; + } else { + JpGraphError::RaiseL(25117, $aCacheFileName); + }//(" Can't open cached image \"$aCacheFileName\" for reading."); } - } else { - return false; } + return false; } - - public function StreamImgFile($aImage, $aCacheFileName) - { - $aCacheFileName = $this->cache_dir.$aCacheFileName; - if ($fh = @fopen($aCacheFileName, 'rb')) { - $lock = flock($fh, LOCK_SH); - $aImage->Headers(); - fpassthru($fh); - $lock = flock($fh, LOCK_UN); - fclose($fh); - return true; - } else { - JpGraphError::RaiseL(25117, $aCacheFileName);//(" Can't open cached image \"$aCacheFileName\" for reading."); - } - } - - // Check if a given image is in cache and in that case - // pass it directly on to web browser. Return false if the - // image file doesn't exist or exists but is to old - public function GetAndStream($aImage, $aCacheFileName) - { - if ($this->Isvalid($aCacheFileName)) { - return $this->StreamImgFile($aImage, $aCacheFileName); - } else { - return false; - } - } - + //--------------- // PRIVATE METHODS // Create all necessary directories in a path public function MakeDirs($aFile) { $dirs = array(); - // In order to better work when open_basedir is enabled - // we do not create directories in the root path - while ($aFile != '/' && !(file_exists($aFile))) { - $dirs[] = $aFile.'/'; + while (!(file_exists($aFile))) { + $dirs[] = $aFile; $aFile = dirname($aFile); } for ($i = sizeof($dirs)-1; $i>=0; $i--) { if (! @mkdir($dirs[$i], 0777)) { - JpGraphError::RaiseL(25118, $aFile);//(" Can't create directory $aFile. Make sure PHP has write permission to this directory."); - } + JpGraphError::RaiseL(25118, $aFile); + }//(" Can't create directory $aFile. Make sure PHP has write permission to this directory."); // We also specify mode here after we have changed group. // This is necessary if Apache user doesn't belong the // default group and hence can't specify group permission @@ -2492,8 +1845,8 @@ class ImgStreamCache $res =@chgrp($dirs[$i], CACHE_FILE_GROUP); $res = @chmod($dirs[$i], 0777); if (!$res) { - JpGraphError::RaiseL(25119, $aFile);//(" Can't set permissions for $aFile. Permission problems?"); - } + JpGraphError::RaiseL(25119, $aFile); + }//(" Can't set permissions for $aFile. Permission problems?"); } } return true; diff --git a/onyx2/include/jpgraph/imageSmoothArc.php b/onyx2/include/jpgraph/imageSmoothArc.php deleted file mode 100755 index 589c9b8..0000000 --- a/onyx2/include/jpgraph/imageSmoothArc.php +++ /dev/null @@ -1,391 +0,0 @@ -= abs($yStart)) { - $aaStartX = true; - } else { - $aaStartX = false; - } - if ($xStop >= $yStop) { - $aaStopX = true; - } else { - $aaStopX = false; - } - //$xp = +1; $yp = -1; $xa = +1; $ya = 0; - for ($x = 0; $x < $a; $x += 1) { - /*$y = $b * sqrt( 1 - ($x*$x)/($a*$a) ); - - $error = $y - (int)($y); - $y = (int)($y); - - $diffColor = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error );*/ - - $_y1 = $dyStop*$x; - $_y2 = $dyStart*$x; - if ($xStart > $xStop) { - $error1 = $_y1 - (int)($_y1); - $error2 = 1 - $_y2 + (int)$_y2; - $_y1 = $_y1-$error1; - $_y2 = $_y2+$error2; - } else { - $error1 = 1 - $_y1 + (int)$_y1; - $error2 = $_y2 - (int)($_y2); - $_y1 = $_y1+$error1; - $_y2 = $_y2-$error2; - } - /* - if ($aaStopX) - $diffColor1 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1 ); - if ($aaStartX) - $diffColor2 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2 ); - */ - - if ($seg == 0 || $seg == 2) { - $i = $seg; - if (!($start > $i*M_PI/2 && $x > $xStart)) { - if ($i == 0) { - $xp = +1; - $yp = -1; - $xa = +1; - $ya = 0; - } else { - $xp = -1; - $yp = +1; - $xa = 0; - $ya = +1; - } - if ($stop < ($i+1)*(M_PI/2) && $x <= $xStop) { - $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1); - $y1 = $_y1; - if ($aaStopX) { - imageSetPixel($img, $cx+$xp*($x)+$xa, $cy+$yp*($y1+1)+$ya, $diffColor1); - } - } else { - $y = $b * sqrt(1 - ($x*$x)/($a*$a)); - $error = $y - (int)($y); - $y = (int)($y); - $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error); - $y1 = $y; - if ($x < $aaAngleX) { - imageSetPixel($img, $cx+$xp*$x+$xa, $cy+$yp*($y1+1)+$ya, $diffColor); - } - } - if ($start > $i*M_PI/2 && $x <= $xStart) { - $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2); - $y2 = $_y2; - if ($aaStartX) { - imageSetPixel($img, $cx+$xp*$x+$xa, $cy+$yp*($y2-1)+$ya, $diffColor2); - } - } else { - $y2 = 0; - } - if ($y2 <= $y1) { - imageLine($img, $cx+$xp*$x+$xa, $cy+$yp*$y1+$ya, $cx+$xp*$x+$xa, $cy+$yp*$y2+$ya, $fillColor); - } - } - } - - if ($seg == 1 || $seg == 3) { - $i = $seg; - if (!($stop < ($i+1)*M_PI/2 && $x > $xStop)) { - if ($i == 1) { - $xp = -1; - $yp = -1; - $xa = 0; - $ya = 0; - } else { - $xp = +1; - $yp = +1; - $xa = 1; - $ya = 1; - } - if ($start > $i*M_PI/2 && $x < $xStart) { - $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2); - $y1 = $_y2; - if ($aaStartX) { - imageSetPixel($img, $cx+$xp*$x+$xa, $cy+$yp*($y1+1)+$ya, $diffColor2); - } - } else { - $y = $b * sqrt(1 - ($x*$x)/($a*$a)); - $error = $y - (int)($y); - $y = (int) $y; - $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error); - $y1 = $y; - if ($x < $aaAngleX) { - imageSetPixel($img, $cx+$xp*$x+$xa, $cy+$yp*($y1+1)+$ya, $diffColor); - } - } - if ($stop < ($i+1)*M_PI/2 && $x <= $xStop) { - $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1); - $y2 = $_y1; - if ($aaStopX) { - imageSetPixel($img, $cx+$xp*$x+$xa, $cy+$yp*($y2-1)+$ya, $diffColor1); - } - } else { - $y2 = 0; - } - if ($y2 <= $y1) { - imageLine($img, $cx+$xp*$x+$xa, $cy+$yp*$y1+$ya, $cx+$xp*$x+$xa, $cy+$yp*$y2+$ya, $fillColor); - } - } - } - } - - ///YYYYY - - for ($y = 0; $y < $b; $y += 1) { - /*$x = $a * sqrt( 1 - ($y*$y)/($b*$b) ); - - $error = $x - (int)($x); - $x = (int)($x); - - $diffColor = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error ); - */ - $_x1 = $dxStop*$y; - $_x2 = $dxStart*$y; - if ($yStart > $yStop) { - $error1 = $_x1 - (int)($_x1); - $error2 = 1 - $_x2 + (int)$_x2; - $_x1 = $_x1-$error1; - $_x2 = $_x2+$error2; - } else { - $error1 = 1 - $_x1 + (int)$_x1; - $error2 = $_x2 - (int)($_x2); - $_x1 = $_x1+$error1; - $_x2 = $_x2-$error2; - } - /* - if (!$aaStopX) - $diffColor1 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1 ); - if (!$aaStartX) - $diffColor2 = imageColorExactAlpha( $img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2 ); - */ - - if ($seg == 0 || $seg == 2) { - $i = $seg; - if (!($start > $i*M_PI/2 && $y > $yStop)) { - if ($i == 0) { - $xp = +1; - $yp = -1; - $xa = 1; - $ya = 0; - } else { - $xp = -1; - $yp = +1; - $xa = 0; - $ya = 1; - } - if ($stop < ($i+1)*(M_PI/2) && $y <= $yStop) { - $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1); - $x1 = $_x1; - if (!$aaStopX) { - imageSetPixel($img, $cx+$xp*($x1-1)+$xa, $cy+$yp*($y)+$ya, $diffColor1); - } - } - if ($start > $i*M_PI/2 && $y < $yStart) { - $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2); - $x2 = $_x2; - if (!$aaStartX) { - imageSetPixel($img, $cx+$xp*($x2+1)+$xa, $cy+$yp*($y)+$ya, $diffColor2); - } - } else { - $x = $a * sqrt(1 - ($y*$y)/($b*$b)); - $error = $x - (int)($x); - $x = (int)($x); - $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error); - $x1 = $x; - if ($y < $aaAngleY && $y <= $yStop) { - imageSetPixel($img, $cx+$xp*($x1+1)+$xa, $cy+$yp*$y+$ya, $diffColor); - } - } - } - } - - if ($seg == 1 || $seg == 3) { - $i = $seg; - if (!($stop < ($i+1)*M_PI/2 && $y > $yStart)) { - if ($i == 1) { - $xp = -1; - $yp = -1; - $xa = 0; - $ya = 0; - } else { - $xp = +1; - $yp = +1; - $xa = 1; - $ya = 1; - } - if ($start > $i*M_PI/2 && $y < $yStart) { - $diffColor2 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error2); - $x1 = $_x2; - if (!$aaStartX) { - imageSetPixel($img, $cx+$xp*($x1-1)+$xa, $cy+$yp*$y+$ya, $diffColor2); - } - } - if ($stop < ($i+1)*M_PI/2 && $y <= $yStop) { - $diffColor1 = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error1); - $x2 = $_x1; - if (!$aaStopX) { - imageSetPixel($img, $cx+$xp*($x2+1)+$xa, $cy+$yp*$y+$ya, $diffColor1); - } - } else { - $x = $a * sqrt(1 - ($y*$y)/($b*$b)); - $error = $x - (int)($x); - $x = (int)($x); - $diffColor = imageColorExactAlpha($img, $color[0], $color[1], $color[2], 127-(127-$color[3])*$error); - $x1 = $x; - if ($y < $aaAngleY && $y < $yStart) { - imageSetPixel($img, $cx+$xp*($x1+1)+$xa, $cy+$yp*$y+$ya, $diffColor); - } - } - } - } - } -} - - -function imageSmoothArc(&$img, $cx, $cy, $w, $h, $color, $start, $stop) -{ - // Originally written from scratch by Ulrich Mierendorff, 06/2006 - // Rewritten and improved, 04/2007, 07/2007 - // compared to old version: - // + Support for transparency added - // + Improved quality of edges & antialiasing - - // note: This function does not represent the fastest way to draw elliptical - // arcs. It was written without reading any papers on that subject. Better - // algorithms may be twice as fast or even more. - - // what it cannot do: It does not support outlined arcs, only filled - - // Parameters: - // $cx - Center of ellipse, X-coord - // $cy - Center of ellipse, Y-coord - // $w - Width of ellipse ($w >= 2) - // $h - Height of ellipse ($h >= 2 ) - // $color - Color of ellipse as a four component array with RGBA - // $start - Starting angle of the arc, no limited range! - // $stop - Stop angle of the arc, no limited range! - // $start _can_ be greater than $stop! - // If any value is not in the given range, results are undefined! - - // This script does not use any special algorithms, everything is completely - // written from scratch; see http://de.wikipedia.org/wiki/Ellipse for formulas. - - while ($start < 0) { - $start += 2*M_PI; - } - while ($stop < 0) { - $stop += 2*M_PI; - } - - while ($start > 2*M_PI) { - $start -= 2*M_PI; - } - - while ($stop > 2*M_PI) { - $stop -= 2*M_PI; - } - - - if ($start > $stop) { - imageSmoothArc($img, $cx, $cy, $w, $h, $color, $start, 2*M_PI); - imageSmoothArc($img, $cx, $cy, $w, $h, $color, 0, $stop); - return; - } - - $a = 1.0*round($w/2); - $b = 1.0*round($h/2); - $cx = 1.0*round($cx); - $cy = 1.0*round($cy); - - $aaAngle = atan(($b*$b)/($a*$a)*tan(0.25*M_PI)); - $aaAngleX = $a*cos($aaAngle); - $aaAngleY = $b*sin($aaAngle); - - $a -= 0.5; // looks better... - $b -= 0.5; - - for ($i=0; $i<4;$i++) { - if ($start < ($i+1)*M_PI/2) { - if ($start > $i*M_PI/2) { - if ($stop > ($i+1)*M_PI/2) { - imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $start, ($i+1)*M_PI/2, $i); - } else { - imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $start, $stop, $i); - break; - } - } else { - if ($stop > ($i+1)*M_PI/2) { - imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $i*M_PI/2, ($i+1)*M_PI/2, $i); - } else { - imageSmoothArcDrawSegment($img, $cx, $cy, $a, $b, $aaAngleX, $aaAngleY, $color, $i*M_PI/2, $stop, $i); - break; - } - } - } - } -} diff --git a/onyx2/include/jpgraph/imgdata_balls.inc.php b/onyx2/include/jpgraph/imgdata_balls.inc.php index 48183cb..2742538 100644 --- a/onyx2/include/jpgraph/imgdata_balls.inc.php +++ b/onyx2/include/jpgraph/imgdata_balls.inc.php @@ -1,51 +1,51 @@ 'imgdata_large', - MARK_IMG_MBALL => 'imgdata_small', - MARK_IMG_SBALL => 'imgdata_xsmall', - MARK_IMG_BALL => 'imgdata_xsmall'); + MARK_IMG_MBALL => 'imgdata_small', + MARK_IMG_SBALL => 'imgdata_xsmall', + MARK_IMG_BALL => 'imgdata_xsmall'); protected $colors; protected $index; protected $maxidx; private $colors_1 = array('blue','lightblue','brown','darkgreen', - 'green','purple','red','gray','yellow','silver','gray'); + 'green','purple','red','gray','yellow','silver','gray'); private $index_1 = array('blue'=>9,'lightblue'=>1,'brown'=>6,'darkgreen'=>7, - 'green'=>8,'purple'=>4,'red'=>0,'gray'=>5,'silver'=>3,'yellow'=>2); + 'green'=>8,'purple'=>4,'red'=>0,'gray'=>5,'silver'=>3,'yellow'=>2); private $maxidx_1 = 9 ; private $colors_2 = array('blue','bluegreen','brown','cyan', - 'darkgray','greengray','gray','green', - 'greenblue','lightblue','lightred', - 'purple','red','white','yellow'); - - + 'darkgray','greengray','gray','green', + 'greenblue','lightblue','lightred', + 'purple','red','white','yellow'); + + private $index_2 = array('blue'=>9,'bluegreen'=>13,'brown'=>8,'cyan'=>12, - 'darkgray'=>5,'greengray'=>6,'gray'=>2,'green'=>10, - 'greenblue'=>3,'lightblue'=>1,'lightred'=>14, - 'purple'=>7,'red'=>0,'white'=>11,'yellow'=>4); - + 'darkgray'=>5,'greengray'=>6,'gray'=>2,'green'=>10, + 'greenblue'=>3,'lightblue'=>1,'lightred'=>14, + 'purple'=>7,'red'=>0,'white'=>11,'yellow'=>4); + private $maxidx_2 = 14 ; private $colors_3 = array('bluegreen','cyan','darkgray','greengray', - 'gray','graypurple','green','greenblue','lightblue', - 'lightred','navy','orange','purple','red','yellow'); - + 'gray','graypurple','green','greenblue','lightblue', + 'lightred','navy','orange','purple','red','yellow'); + private $index_3 = array('bluegreen'=>1,'cyan'=>11,'darkgray'=>14,'greengray'=>10, - 'gray'=>3,'graypurple'=>4,'green'=>9,'greenblue'=>7, - 'lightblue'=>13,'lightred'=>0,'navy'=>2,'orange'=>12, - 'purple'=>8,'red'=>5,'yellow'=>6); + 'gray'=>3,'graypurple'=>4,'green'=>9,'greenblue'=>7, + 'lightblue'=>13,'lightred'=>0,'navy'=>2,'orange'=>12, + 'purple'=>8,'red'=>5,'yellow'=>6); private $maxidx_3 = 14 ; protected $imgdata_large; @@ -56,429 +56,429 @@ class ImgData_Balls extends ImgData public function GetImg($aMark, $aIdx) { switch ($aMark) { - case MARK_IMG_SBALL: - case MARK_IMG_BALL: - $this->colors = $this->colors_3; - $this->index = $this->index_3 ; - $this->maxidx = $this->maxidx_3 ; - break; - case MARK_IMG_MBALL: - $this->colors = $this->colors_2; - $this->index = $this->index_2 ; - $this->maxidx = $this->maxidx_2 ; - break; - default: - $this->colors = $this->colors_1; - $this->index = $this->index_1 ; - $this->maxidx = $this->maxidx_1 ; - break; - } + case MARK_IMG_SBALL: + case MARK_IMG_BALL: + $this->colors = $this->colors_3; + $this->index = $this->index_3 ; + $this->maxidx = $this->maxidx_3 ; + break; + case MARK_IMG_MBALL: + $this->colors = $this->colors_2; + $this->index = $this->index_2 ; + $this->maxidx = $this->maxidx_2 ; + break; + default: + $this->colors = $this->colors_1; + $this->index = $this->index_1 ; + $this->maxidx = $this->maxidx_1 ; + break; + } return parent::GetImg($aMark, $aIdx); } - public function __construct() + public function ImgData_Balls() { - //========================================================== +//========================================================== // File: bl_red.png //========================================================== $this->imgdata_large[0][0]= 1072 ; $this->imgdata_large[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAByF'. - 'BMVEX/////////xsb/vb3/lIz/hIT/e3v/c3P/c2v/a2v/Y2P/'. - 'UlL/Skr/SkL/Qjn/MTH/MSn/KSn/ISH/IRj/GBj/GBD/EBD/EA'. - 'j/CAj/CAD/AAD3QkL3MTH3KSn3KSH3GBj3EBD3CAj3AAD1zMzv'. - 'QkLvISHvIRjvGBjvEBDvEAjvAADnUlLnSkrnMTnnKSnnIRjnGB'. - 'DnEBDnCAjnAADec3PeSkreISHeGBjeGBDeEAjWhITWa2vWUlLW'. - 'SkrWISnWGBjWEBDWEAjWCAjWAADOnp7Oa2vOGCHOGBjOGBDOEB'. - 'DOCAjOAADJrq7Gt7fGGBjGEBDGCAjGAADEpKS/v7+9QkK9GBC9'. - 'EBC9CAi9AAC1e3u1a2u1Skq1KSm1EBC1CAi1AACtEBCtCBCtCA'. - 'itAACngYGlCAilAACghIScOTmcCAicAACYgYGUGAiUCAiUAAiU'. - 'AACMKSmMEACMAACEa2uEGAiEAAB7GBh7CAB7AABzOTlzGBBzCA'. - 'BzAABrSkprOTlrGBhrAABjOTljAABaQkJaOTlaCABaAABSKSlS'. - 'GBhSAABKKSlKGBhKAABCGBhCCABCAAA5CAA5AAAxCAAxAAApCA'. - 'ApAAAhAAAYAACc9eRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFD'. - 'UHLytKAAAB4UlEQVR4nGNgIAK4mGjrmNq6BmFIWMmISUpKSmk5'. - 'B8ZEokj4qoiLiQCBgqald3xaBpKMj6y4sLCQkJCIvIaFV0RaUR'. - 'lCSk5cWEiAn19ASN7QwisuraihHiajKyEixM/NwckjoKrvEACU'. - 'qumpg7pAUlREiJdNmZmLT9/cMzwps7Smc3I2WEpGUkxYkJuFiY'. - 'lTxszePzY1v7Shc2oX2D+K4iLCgjzsrOw8embuYUmZeTVtPVOn'. - 'gqSslYAOF+Ln4ZHWtXMPTcjMrWno7J82rRgoZWOsqaCgrqaqqm'. - 'fn5peQmlsK1DR52vRaoFSIs5GRoYG5ub27n19CYm5pdVPnxKnT'. - 'pjWDpLydnZwcHTz8QxMSEnJLgDL9U6dNnQ6Sio4PDAgICA+PTU'. - 'zNzSkph8hADIxKS46Pj0tKTc3MLSksqWrtmQySAjuDIT8rKy0r'. - 'Kz+vtLSmur6jb9JUIJgGdjxDQUVRUVFpaUVNQ1NrZ9+kKVOmTZ'. - 'k6vR0sldJUAwQNTU2dnX0TgOJTQLrSIYFY2dPW1NbW2TNxwtQp'. - 'U6ZMmjJt2rRGWNB3TO7vnzh5MsgSoB6gy7sREdY7bRrQEDAGOb'. - 'wXOQW0TJsOEpwClmxBTTbZ7UDVIPkp7dkYaYqhuLa5trYYUxwL'. - 'AADzm6uekAAcXAAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAByF'. + 'BMVEX/////////xsb/vb3/lIz/hIT/e3v/c3P/c2v/a2v/Y2P/'. + 'UlL/Skr/SkL/Qjn/MTH/MSn/KSn/ISH/IRj/GBj/GBD/EBD/EA'. + 'j/CAj/CAD/AAD3QkL3MTH3KSn3KSH3GBj3EBD3CAj3AAD1zMzv'. + 'QkLvISHvIRjvGBjvEBDvEAjvAADnUlLnSkrnMTnnKSnnIRjnGB'. + 'DnEBDnCAjnAADec3PeSkreISHeGBjeGBDeEAjWhITWa2vWUlLW'. + 'SkrWISnWGBjWEBDWEAjWCAjWAADOnp7Oa2vOGCHOGBjOGBDOEB'. + 'DOCAjOAADJrq7Gt7fGGBjGEBDGCAjGAADEpKS/v7+9QkK9GBC9'. + 'EBC9CAi9AAC1e3u1a2u1Skq1KSm1EBC1CAi1AACtEBCtCBCtCA'. + 'itAACngYGlCAilAACghIScOTmcCAicAACYgYGUGAiUCAiUAAiU'. + 'AACMKSmMEACMAACEa2uEGAiEAAB7GBh7CAB7AABzOTlzGBBzCA'. + 'BzAABrSkprOTlrGBhrAABjOTljAABaQkJaOTlaCABaAABSKSlS'. + 'GBhSAABKKSlKGBhKAABCGBhCCABCAAA5CAA5AAAxCAAxAAApCA'. + 'ApAAAhAAAYAACc9eRyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFD'. + 'UHLytKAAAB4UlEQVR4nGNgIAK4mGjrmNq6BmFIWMmISUpKSmk5'. + 'B8ZEokj4qoiLiQCBgqald3xaBpKMj6y4sLCQkJCIvIaFV0RaUR'. + 'lCSk5cWEiAn19ASN7QwisuraihHiajKyEixM/NwckjoKrvEACU'. + 'qumpg7pAUlREiJdNmZmLT9/cMzwps7Smc3I2WEpGUkxYkJuFiY'. + 'lTxszePzY1v7Shc2oX2D+K4iLCgjzsrOw8embuYUmZeTVtPVOn'. + 'gqSslYAOF+Ln4ZHWtXMPTcjMrWno7J82rRgoZWOsqaCgrqaqqm'. + 'fn5peQmlsK1DR52vRaoFSIs5GRoYG5ub27n19CYm5pdVPnxKnT'. + 'pjWDpLydnZwcHTz8QxMSEnJLgDL9U6dNnQ6Sio4PDAgICA+PTU'. + 'zNzSkph8hADIxKS46Pj0tKTc3MLSksqWrtmQySAjuDIT8rKy0r'. + 'Kz+vtLSmur6jb9JUIJgGdjxDQUVRUVFpaUVNQ1NrZ9+kKVOmTZ'. + 'k6vR0sldJUAwQNTU2dnX0TgOJTQLrSIYFY2dPW1NbW2TNxwtQp'. + 'U6ZMmjJt2rRGWNB3TO7vnzh5MsgSoB6gy7sREdY7bRrQEDAGOb'. + 'wXOQW0TJsOEpwClmxBTTbZ7UDVIPkp7dkYaYqhuLa5trYYUxwL'. + 'AADzm6uekAAcXAAAAABJRU5ErkJggg==' ; //========================================================== // File: bl_bluegreen.png //========================================================== $this->imgdata_large[1][0]= 1368 ; $this->imgdata_large[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMMFi8hE9b2uAAABOVJREFUeNq9lk2sJFUVx3+3qv'. - 'tW95t57zFvhiFxmCFRUJRoNCQiJARMhiFx/Igxii5goTG6ZDAu'. - '/EhcSCIrTAgLEiKsJ8ywABNZEMJXEDYCukAmjgjzBkK/j35V1d'. - '333FtV97io97pfzwxfG86qcu/N+Z3zP+fcW/Apmfk4hx57+R/6'. - 'Rqmc9ykhsWjlsUngAA1fXIQ7b73pI/186IGHnn9dH/8frC8v4I'. - 'PiG53uaerR4GmKkv31mB8cyfjd946ZTwR66qVX9OTWIi8UKUv9'. - 'BOrZXpYZvFeiBvzI0fgSUSFKwbVG+Pl1V3HH0VvNR4KeeukV/f'. - 'PmMmdHhst76aXD64AbeVQ9bjNHaiGOC2o3wLrAb2/4LL/84ffn'. - 'fCdzkOdayKpLppBemrBsU5Y1Zdmm9LJdGU6E/t4M24Q26jRDRL'. - 'j3mdc49cSTekFsMzs5XuTsyLDUNSDQ25NwKOly9YIl22MYhJr/'. - 'uoDtBBoT0CxBRGYOAhibIaOCe//2MpfM6KHnX9cXipSlbkKWmS'. - 'nk9iv38J0jixw7vJfrTMYBOvhSoQHJBS09ANELloAGDxW8tfoW'. - 'J+5/UC8CPS0LU7r3SpYarr7M8rmFjMPLXT6/33L4si7Z2GCrQC'. - '+0ctlOaNs9DReV8vSLr85ndPLpZ/WNvHW+01kAVFBOGvJx0wYg'. - 'Sp47RIQ4Emwa8FGJXlDxSCFo5YlVgAo2hwPue/hRndboTV3EW2'. - 'Wp3k6wBp8q56QiWzecW6vwQfnPRkAWhFgILnq08jQ+R2nlUzzN'. - 'uES9Q7Vd+9fba7NmWJW61db2247qACmcjxXr45psYphsFGSLBu'. - 'kIajxqtjNwHkvAjQt0sg3crhPA2+fPz0CuyNFOghsGsr19mnFg'. - 'DGwrRm8UoAtNmQPQtRXDgdC4HImCFEKcCE0oieUWUYq2LtbiGp'. - 'mBQmppfIkjw45DK0QNNkvQ0jMBtPL0UnDRM1rN+cxKwzvOo2NP'. - 'tykR9a1kfpZNDLMG6QDYJqCTBvUe1+uxs+YKyPoGrTwY2HhvC4'. - 'CDWQd5d4xNApNQEEMgjgLdUCLBQ5cprL/trwNwKG2IUmDqDFd5'. - 'sr5BWrlxuSdLDFEFlqAzXGc4zFjupqh6uqYihpxJcEgp026l2w'. - '7wFUv7Z6AvrfRo/n0OYzPwIKE3HUKAJg2otMBiElnsF7wngis9'. - '3ZDjNnLi7huCWUZfueZKTu/M0V3HvmkOFDVxVKDG04ScejSgW5'. - 'V0q5JYFEghuDLHlTmToqDeGOCKIVtrW9hsdmXufEcNLPSXuPHa'. - 'a+bvuh9df5AH/v5PDFmbWQC3Mx+TVvfGVTRB2CodNgT2JBX003'. - 'aANZAYS/BxCv32TV/l2C03G7jgmfjGiT/qmeEmibEYm7XzAO2k'. - 'A+pbgHhBgydqu54YO5eRiLCy7yDvPP6Xqf+5Z+Lu277OYuOpiw'. - 'H15oBmlNOMcmK5RbP+PrEscGU+DSAxdg4CICIkxnLP8aNz63Og'. - 'H3/rdvOb795GVhuaYo0oBc3GGrEsUPVTwO6a7LYd+X51x3Hu/t'. - 'lP5tS65FN+6okn9U+n/sqb596dTvhOF+02myXTmkQNrOw7yD3H'. - 'j14E+UDQjp24/0E9/eKrbA4HH3aMK1b2ccvXvswjv//1J/s5ud'. - 'Due/hRPfP+OmfOrk7vrn7a48ihA3zh8CH+8Iuffiw/n4r9H1ZZ'. - '0zz7G56hAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMMFi8hE9b2uAAABOVJREFUeNq9lk2sJFUVx3+3qv'. + 'tW95t57zFvhiFxmCFRUJRoNCQiJARMhiFx/Igxii5goTG6ZDAu'. + '/EhcSCIrTAgLEiKsJ8ywABNZEMJXEDYCukAmjgjzBkK/j35V1d'. + '333FtV97io97pfzwxfG86qcu/N+Z3zP+fcW/Apmfk4hx57+R/6'. + 'Rqmc9ykhsWjlsUngAA1fXIQ7b73pI/186IGHnn9dH/8frC8v4I'. + 'PiG53uaerR4GmKkv31mB8cyfjd946ZTwR66qVX9OTWIi8UKUv9'. + 'BOrZXpYZvFeiBvzI0fgSUSFKwbVG+Pl1V3HH0VvNR4KeeukV/f'. + 'PmMmdHhst76aXD64AbeVQ9bjNHaiGOC2o3wLrAb2/4LL/84ffn'. + 'fCdzkOdayKpLppBemrBsU5Y1Zdmm9LJdGU6E/t4M24Q26jRDRL'. + 'j3mdc49cSTekFsMzs5XuTsyLDUNSDQ25NwKOly9YIl22MYhJr/'. + 'uoDtBBoT0CxBRGYOAhibIaOCe//2MpfM6KHnX9cXipSlbkKWmS'. + 'nk9iv38J0jixw7vJfrTMYBOvhSoQHJBS09ANELloAGDxW8tfoW'. + 'J+5/UC8CPS0LU7r3SpYarr7M8rmFjMPLXT6/33L4si7Z2GCrQC'. + '+0ctlOaNs9DReV8vSLr85ndPLpZ/WNvHW+01kAVFBOGvJx0wYg'. + 'Sp47RIQ4Emwa8FGJXlDxSCFo5YlVgAo2hwPue/hRndboTV3EW2'. + 'Wp3k6wBp8q56QiWzecW6vwQfnPRkAWhFgILnq08jQ+R2nlUzzN'. + 'uES9Q7Vd+9fba7NmWJW61db2247qACmcjxXr45psYphsFGSLBu'. + 'kIajxqtjNwHkvAjQt0sg3crhPA2+fPz0CuyNFOghsGsr19mnFg'. + 'DGwrRm8UoAtNmQPQtRXDgdC4HImCFEKcCE0oieUWUYq2LtbiGp'. + 'mBQmppfIkjw45DK0QNNkvQ0jMBtPL0UnDRM1rN+cxKwzvOo2NP'. + 'tykR9a1kfpZNDLMG6QDYJqCTBvUe1+uxs+YKyPoGrTwY2HhvC4'. + 'CDWQd5d4xNApNQEEMgjgLdUCLBQ5cprL/trwNwKG2IUmDqDFd5'. + 'sr5BWrlxuSdLDFEFlqAzXGc4zFjupqh6uqYihpxJcEgp026l2w'. + '7wFUv7Z6AvrfRo/n0OYzPwIKE3HUKAJg2otMBiElnsF7wngis9'. + '3ZDjNnLi7huCWUZfueZKTu/M0V3HvmkOFDVxVKDG04ScejSgW5'. + 'V0q5JYFEghuDLHlTmToqDeGOCKIVtrW9hsdmXufEcNLPSXuPHa'. + 'a+bvuh9df5AH/v5PDFmbWQC3Mx+TVvfGVTRB2CodNgT2JBX003'. + 'aANZAYS/BxCv32TV/l2C03G7jgmfjGiT/qmeEmibEYm7XzAO2k'. + 'A+pbgHhBgydqu54YO5eRiLCy7yDvPP6Xqf+5Z+Lu277OYuOpiw'. + 'H15oBmlNOMcmK5RbP+PrEscGU+DSAxdg4CICIkxnLP8aNz63Og'. + 'H3/rdvOb795GVhuaYo0oBc3GGrEsUPVTwO6a7LYd+X51x3Hu/t'. + 'lP5tS65FN+6okn9U+n/sqb596dTvhOF+02myXTmkQNrOw7yD3H'. + 'j14E+UDQjp24/0E9/eKrbA4HH3aMK1b2ccvXvswjv//1J/s5ud'. + 'Due/hRPfP+OmfOrk7vrn7a48ihA3zh8CH+8Iuffiw/n4r9H1ZZ'. + '0zz7G56hAAAAAElFTkSuQmCC' ; //========================================================== // File: bl_yellow.png //========================================================== $this->imgdata_large[2][0]= 1101 ; $this->imgdata_large[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. - 'BMVEX//////////+///+f//9b//8b//73//7X//63//6X//5T/'. - '/4z//4T//3P//2v//1r//0r//0L//zH//yn//yH//xj//xD//w'. - 'j//wD/90L/9zn/9zH/9xj/9xD/9wj/9wD39yn37zn37zH37yH3'. - '7xD37wj37wDv70Lv50rv50Lv5znv5yHv5xjv5wjv5wDn51Ln5x'. - 'Dn3jHn3iHn3hjn3hDn3gje3oze3nPe3lLe1oze1nPe1lLe1ine'. - '1iHe1hje1hDe1gje1gDW1qXW1mvWzqXWzkLWzhjWzhDWzgjWzg'. - 'DOzrXOzq3OzpzOzgDOxkrOxinOxhjOxhDOxgjOxgDGxqXGxnvG'. - 'xmvGvRjGvRDGvQjGvQDFxbnAvr6/v7+9vaW9vZS9vQi9vQC9tR'. - 'C9tQi9tQC7u7W1tZS1tXu1tTG1tQi1rRC1rQi1rQCtrYytrSGt'. - 'rQitrQCtpYStpSGtpQitpQClpYSlpXulpQClnBClnAilnACcnG'. - 'ucnAicnACclAiclACUlFqUlCmUlAiUlACUjFKUjAiUjACMjFKM'. - 'jEqMjACMhACEhACEewB7ezF7exB7ewB7cwBzcylzcwBzaxBzaw'. - 'BraxhrawhrawBrYxBrYwBjYwBjWgBaWgBaUgCXBwRMAAAAAXRS'. - 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. - 'LdfvwAAAAHdElNRQfTAwkRFBKiJZ4hAAAB7ElEQVR4nI3S+1vS'. - 'UBgHcB67WJmIMWAVdDHEDLBC6Go0slj3Ft0m9RRBWQEmFZFDEM'. - 'Qgt0EMFBY7p/+198hj1kM/9N1+++x73rOd6XT/kStnTx4fPzd9'. - 'uwfOjFhomj7smAhwj/6Cm2O0xUwy6g7cCL99uCW3jtBmE7lsdr'. - 'fvejgpzP7uEDFRRoqy2k8xQPnypo2BUMP6waF9Vpf3ciiSzErL'. - 'XTkPc0zDe3bsHDAcc00yoVgqL3UWN2iENpspff+2vn6D0+NnZ9'. - '6lC5K6RuSqBTZn1O/a3rd7v/MSez+WyIpVFX8GuuCA9SjD4N6B'. - 'oRNTfo5PCAVR0fBXoIuOQzab1XjwwNHx00GOj8/nKtV1DdeArk'. - '24R+0ul9PjmbrHPYl+EipyU0OoQSjg8/m83kl/MMhx0fjCkqio'. - 'SMOE7t4JMAzDsizH81AqSdW2hroLPg4/CEF4PhKNx98vlevrbY'. - 'QQXgV6kXwVfjkTiSXmhYVcSa7DIE1DOENe7GM6lUym0l+EXKks'. - 'K20VAeH2M0JvVgrZfL5Qqkiy0lRVaMBd7H7EZUmsiJJcrTdVja'. - 'wGpdbTLj3/3qwrUOjAfGgg4LnNA5tdQx14Hm00QFBm65hfNzAm'. - '+yIFhFtzuj+z2MI/MQn6Uez5pz4Ua41G7VumB/6RX4zMr1TKBr'. - 'SXAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. + 'BMVEX//////////+///+f//9b//8b//73//7X//63//6X//5T/'. + '/4z//4T//3P//2v//1r//0r//0L//zH//yn//yH//xj//xD//w'. + 'j//wD/90L/9zn/9zH/9xj/9xD/9wj/9wD39yn37zn37zH37yH3'. + '7xD37wj37wDv70Lv50rv50Lv5znv5yHv5xjv5wjv5wDn51Ln5x'. + 'Dn3jHn3iHn3hjn3hDn3gje3oze3nPe3lLe1oze1nPe1lLe1ine'. + '1iHe1hje1hDe1gje1gDW1qXW1mvWzqXWzkLWzhjWzhDWzgjWzg'. + 'DOzrXOzq3OzpzOzgDOxkrOxinOxhjOxhDOxgjOxgDGxqXGxnvG'. + 'xmvGvRjGvRDGvQjGvQDFxbnAvr6/v7+9vaW9vZS9vQi9vQC9tR'. + 'C9tQi9tQC7u7W1tZS1tXu1tTG1tQi1rRC1rQi1rQCtrYytrSGt'. + 'rQitrQCtpYStpSGtpQitpQClpYSlpXulpQClnBClnAilnACcnG'. + 'ucnAicnACclAiclACUlFqUlCmUlAiUlACUjFKUjAiUjACMjFKM'. + 'jEqMjACMhACEhACEewB7ezF7exB7ewB7cwBzcylzcwBzaxBzaw'. + 'BraxhrawhrawBrYxBrYwBjYwBjWgBaWgBaUgCXBwRMAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwkRFBKiJZ4hAAAB7ElEQVR4nI3S+1vS'. + 'UBgHcB67WJmIMWAVdDHEDLBC6Go0slj3Ft0m9RRBWQEmFZFDEM'. + 'Qgt0EMFBY7p/+198hj1kM/9N1+++x73rOd6XT/kStnTx4fPzd9'. + 'uwfOjFhomj7smAhwj/6Cm2O0xUwy6g7cCL99uCW3jtBmE7lsdr'. + 'fvejgpzP7uEDFRRoqy2k8xQPnypo2BUMP6waF9Vpf3ciiSzErL'. + 'XTkPc0zDe3bsHDAcc00yoVgqL3UWN2iENpspff+2vn6D0+NnZ9'. + '6lC5K6RuSqBTZn1O/a3rd7v/MSez+WyIpVFX8GuuCA9SjD4N6B'. + 'oRNTfo5PCAVR0fBXoIuOQzab1XjwwNHx00GOj8/nKtV1DdeArk'. + '24R+0ul9PjmbrHPYl+EipyU0OoQSjg8/m83kl/MMhx0fjCkqio'. + 'SMOE7t4JMAzDsizH81AqSdW2hroLPg4/CEF4PhKNx98vlevrbY'. + 'QQXgV6kXwVfjkTiSXmhYVcSa7DIE1DOENe7GM6lUym0l+EXKks'. + 'K20VAeH2M0JvVgrZfL5Qqkiy0lRVaMBd7H7EZUmsiJJcrTdVja'. + 'wGpdbTLj3/3qwrUOjAfGgg4LnNA5tdQx14Hm00QFBm65hfNzAm'. + '+yIFhFtzuj+z2MI/MQn6Uez5pz4Ua41G7VumB/6RX4zMr1TKBr'. + 'SXAAAAAElFTkSuQmCC' ; //========================================================== // File: bl_silver.png //========================================================== $this->imgdata_large[3][0]= 1481 ; $this->imgdata_large[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAADAF'. - 'BMVEUAAADOzs7Gxsa9vb21tbXOxsbOzsbGzsb3///O1ta1vb2c'. - 'paVSWlpKWlpSY2ve5+97hIze7/9aY2vO5/9zhJRaa3tSY3PGzt'. - 'aMlJxrc3tja3NKUlpCSlK1vcZze4RSWmPW5/+Upb3G3v9zhJxS'. - 'Y3t7jKVaa4TO3veltc6ElK1re5Rjc4ycpbV7hJRaY3M5QlLn7/'. - '/Gzt6lrb2EjJzO3v9ja3vG1ve9zu+1xueltdacrc6UpcaMnL1C'. - 'SlqElLV7jK1zhKVre5zW3u/O1ue1vc6ttcaMlKVze4xrc4RSWm'. - 'tKUmPG1v+9zve1xu+tveeltd6crdbe5/+9xt6cpb17hJxaY3s5'. - 'QlrW3vfO1u/Gzue1vdattc6lrcaUnLWMlK2EjKVze5Rrc4xja4'. - 'RSWnNKUmtCSmO9xuecpcZ7hKVaY4TW3v/O1vfGzu+1vd6ttdal'. - 'rc69xu+UnL2MlLWEjK1ze5xrc5R7hK1ja4zO1v+1veettd6lrd'. - 'aMlL3Gzv/39//W1t7Gxs61tb29vcatrbWlpa2cnKWUlJyEhIx7'. - 'e4TW1ufGxta1tcZSUlqcnK3W1u+UlKW9vda1tc57e4ytrcalpb'. - '1ra3vOzu9jY3OUlK29vd6MjKWEhJxaWmtSUmNzc4xKSlpjY3tK'. - 'SmNCQlqUjJzOxs7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. - 'AAAAAAAAAAAAAAAAAAAAAAAAD///9fnkWVAAAAAnRSTlP/AOW3'. - 'MEoAAAABYktHRP+lB/LFAAAACXBIWXMAAABFAAAARQBP+QatAA'. - 'AB/klEQVR42mNgxAsYqCdd3+lcb4hLmj8wMMvEu8DCMqYbU9op'. - 'UEFB2MTb26eyysomFl06XEEhUCHLpAKo2z/fujikEUVaXUFBMB'. - 'BouLePuV+VVWGRciIXknSEsImCQd3//xwmPr65llaFcSFJHkjS'. - '3iYmWUDZ//8NfCr989NjNUMSUyTg0jneSiaCINn/gmlVQM12qg'. - 'lJnp5waTMTE5NAkCyHWZW/lXWNfUlikmdYK0zax7siS4EDKJtd'. - 'mQeU1XRwLBdLkRGASucWmGVnZ4dnhZvn5lmm29iVOWpnJqcuko'. - 'JKR1Wm5eTkRKYF5eblp9sU2ZeUJiV7zbfVg0pH56UFBQXNjIqK'. - 'jgkujItX1koKTVmYajsdKu2qETVhwgSXiUDZ2Bn9xqUeoZ5e0t'. - 'LzYYZ3B092ndjtOnmKTmycW1s7SHa+l5dtB8zlccE6RlN0dGbM'. - 'mDVbd5KupNBcL6+F82XgHouLj5vRP2PWLGNdd4+ppnxe8tJec6'. - 'XnNsKkm0uVQ5RDRHQTPTym68nPlZbvkfYCexsa5rpJ2qXa5Umm'. - 'ocmec3m8vHjmSs+fgxyhC5JDQ8WSPT2lvbzm8vDIe0nbtiBLN8'. - '8BigNdu1B6Lsje+fPbUFMLi5TMfGmvHi/puUAv23q2YCTFNqH5'. - 'MvPnSwPh3HasCbm3XUpv+nS5VtrkEkwAANSTpGHdye9PAAAASn'. - 'RFWHRzaWduYXR1cmUANGJkODkyYmE4MWZhNTk4MTIyNDJjNjUx'. - 'NzZhY2UxMDAzOGFhZjdhZWIyNzliNTM2ZGFmZDlkM2RiNDU3Zm'. - 'NlNT9CliMAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAMAAAAM7l6QAAADAF'. + 'BMVEUAAADOzs7Gxsa9vb21tbXOxsbOzsbGzsb3///O1ta1vb2c'. + 'paVSWlpKWlpSY2ve5+97hIze7/9aY2vO5/9zhJRaa3tSY3PGzt'. + 'aMlJxrc3tja3NKUlpCSlK1vcZze4RSWmPW5/+Upb3G3v9zhJxS'. + 'Y3t7jKVaa4TO3veltc6ElK1re5Rjc4ycpbV7hJRaY3M5QlLn7/'. + '/Gzt6lrb2EjJzO3v9ja3vG1ve9zu+1xueltdacrc6UpcaMnL1C'. + 'SlqElLV7jK1zhKVre5zW3u/O1ue1vc6ttcaMlKVze4xrc4RSWm'. + 'tKUmPG1v+9zve1xu+tveeltd6crdbe5/+9xt6cpb17hJxaY3s5'. + 'QlrW3vfO1u/Gzue1vdattc6lrcaUnLWMlK2EjKVze5Rrc4xja4'. + 'RSWnNKUmtCSmO9xuecpcZ7hKVaY4TW3v/O1vfGzu+1vd6ttdal'. + 'rc69xu+UnL2MlLWEjK1ze5xrc5R7hK1ja4zO1v+1veettd6lrd'. + 'aMlL3Gzv/39//W1t7Gxs61tb29vcatrbWlpa2cnKWUlJyEhIx7'. + 'e4TW1ufGxta1tcZSUlqcnK3W1u+UlKW9vda1tc57e4ytrcalpb'. + '1ra3vOzu9jY3OUlK29vd6MjKWEhJxaWmtSUmNzc4xKSlpjY3tK'. + 'SmNCQlqUjJzOxs7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'. + 'AAAAAAAAAAAAAAAAAAAAAAAAD///9fnkWVAAAAAnRSTlP/AOW3'. + 'MEoAAAABYktHRP+lB/LFAAAACXBIWXMAAABFAAAARQBP+QatAA'. + 'AB/klEQVR42mNgxAsYqCdd3+lcb4hLmj8wMMvEu8DCMqYbU9op'. + 'UEFB2MTb26eyysomFl06XEEhUCHLpAKo2z/fujikEUVaXUFBMB'. + 'BouLePuV+VVWGRciIXknSEsImCQd3//xwmPr65llaFcSFJHkjS'. + '3iYmWUDZ//8NfCr989NjNUMSUyTg0jneSiaCINn/gmlVQM12qg'. + 'lJnp5waTMTE5NAkCyHWZW/lXWNfUlikmdYK0zax7siS4EDKJtd'. + 'mQeU1XRwLBdLkRGASucWmGVnZ4dnhZvn5lmm29iVOWpnJqcuko'. + 'JKR1Wm5eTkRKYF5eblp9sU2ZeUJiV7zbfVg0pH56UFBQXNjIqK'. + 'jgkujItX1koKTVmYajsdKu2qETVhwgSXiUDZ2Bn9xqUeoZ5e0t'. + 'LzYYZ3B092ndjtOnmKTmycW1s7SHa+l5dtB8zlccE6RlN0dGbM'. + 'mDVbd5KupNBcL6+F82XgHouLj5vRP2PWLGNdd4+ppnxe8tJec6'. + 'XnNsKkm0uVQ5RDRHQTPTym68nPlZbvkfYCexsa5rpJ2qXa5Umm'. + 'ocmec3m8vHjmSs+fgxyhC5JDQ8WSPT2lvbzm8vDIe0nbtiBLN8'. + '8BigNdu1B6Lsje+fPbUFMLi5TMfGmvHi/puUAv23q2YCTFNqH5'. + 'MvPnSwPh3HasCbm3XUpv+nS5VtrkEkwAANSTpGHdye9PAAAASn'. + 'RFWHRzaWduYXR1cmUANGJkODkyYmE4MWZhNTk4MTIyNDJjNjUx'. + 'NzZhY2UxMDAzOGFhZjdhZWIyNzliNTM2ZGFmZDlkM2RiNDU3Zm'. + 'NlNT9CliMAAAAASUVORK5CYII=' ; //========================================================== // File: bl_purple.png //========================================================== $this->imgdata_large[4][0]= 1149 ; $this->imgdata_large[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACAV'. - 'BMVEX/////////7///5///1v//xv//rf//pf//lP//jP//hP//'. - 'c///a///Wv//Wvf/Uv//Sv//Qv//Qvf/Off/Mf//Kf//If//If'. - 'f/GP//GPf/EP//EPf/CP//CPf/CO//AP//APf3Oe/3Kff3Ke/3'. - 'Ie/3GO/3EO/3AO/vSu/vSufvOefvMefvIefvGOfvEOfvCOfvAO'. - 'fnUufnSufnMd7nId7nGN7nGNbnEN7nCN7nAN7ejN7ejNbec97e'. - 'c9beUtbeQtbeIdbeGNbeENbeCNbeANbWpdbWa9bWQs7WGM7WEM'. - '7WCM7WAM7Otc7Orc7OnM7OSsbOIb3OGMbOEMbOCMbOAM7OAMbG'. - 'pcbGnMbGe8bGa8bGKbXGEL3GCL3GAL3FucXBu73AvsC/v7+9pb'. - '29Ka29GLW9ELW9CLW9AL29ALW5rrm1lLW1e7W1MbW1GKW1EK21'. - 'CLW1CK21AK2tjK2thKWtMaWtIaWtGJytCK2tCKWtAK2tAKWlhK'. - 'Wle6WlEJylCJylAKWlAJyca5ycGJScEJScCJScAJycAJSUWpSU'. - 'UoyUKZSUEIyUCIyUAJSUAIyMUoyMSoyMIYSMEISMCISMAIyMAI'. - 'SECHuEAISEAHt7MXt7EHt7CHt7AHt7AHNzKXNzEGtzAHNzAGtr'. - 'GGtrEGNrCGtrAGtrAGNjCFpjAGNjAFpaAFpaAFIpZn4bAAAAAX'. - 'RSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsS'. - 'AdLdfvwAAAAHdElNRQfTAwkRFB0ymoOwAAAB9UlEQVR4nGNgIA'. - 'K42hhqGtm5+WFIWClKycvLK6gbuARGoEj4aMjLSElISUir6Tt7'. - 'x+aEIWR8leQlwEBSTc/CK7awLguuR0lGQkJMVFRUTFJVzwko1d'. - 'oFk9OQl5IQE+Dh5hVR0TV3CkkvbJgyASJjDZIR5GBl5eRX0TH1'. - 'DEqrbJ2ypBEspSgvJSXKw8bMxMavbOLoGZNf1TZlybw4oIyfLN'. - 'BxotxsLEzsQiaOHkFpBQ2905esrAZK2SpIAaUEuDm5+LTNPAKj'. - 'C+pbps1evrIDKGWnLictKSkuLKyoZQyUya9o7Z2+YMXKGUApew'. - 'M9PTVdXR0TEwf3wOjUirruafOXL18xFyjl72Kpb25qaurg4REU'. - 'EFVe2zJ5zpLlK1aCpbydnZ2dnDwDA6NTopLLeiZNXbB8BcTAyP'. - 'TQ0JDg4KCY1NS83JKmiVOBepYvX9UPlAovzEiPSU/LLyior2vq'. - 'mjZr3vLlIF01IC+XVhUWFlZW1Lc290ycOGfxohVATSsXx4Oksn'. - 'vaWlsb2tq6J0+bM2/RohVA81asbIcEYueU3t7JU6ZNnwNyGkhm'. - '+cp5CRCppJnzZ8+ZM3/JUogECBbBIixr8Yqly8FCy8F6ltUgoj'. - 'lz7sqVK2ByK+cVMSCDxoUrwWDVysXt8WhJKqG4Y8bcuTP6qrGk'. - 'QwwAABiMu7T4HMi4AAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACAV'. + 'BMVEX/////////7///5///1v//xv//rf//pf//lP//jP//hP//'. + 'c///a///Wv//Wvf/Uv//Sv//Qv//Qvf/Off/Mf//Kf//If//If'. + 'f/GP//GPf/EP//EPf/CP//CPf/CO//AP//APf3Oe/3Kff3Ke/3'. + 'Ie/3GO/3EO/3AO/vSu/vSufvOefvMefvIefvGOfvEOfvCOfvAO'. + 'fnUufnSufnMd7nId7nGN7nGNbnEN7nCN7nAN7ejN7ejNbec97e'. + 'c9beUtbeQtbeIdbeGNbeENbeCNbeANbWpdbWa9bWQs7WGM7WEM'. + '7WCM7WAM7Otc7Orc7OnM7OSsbOIb3OGMbOEMbOCMbOAM7OAMbG'. + 'pcbGnMbGe8bGa8bGKbXGEL3GCL3GAL3FucXBu73AvsC/v7+9pb'. + '29Ka29GLW9ELW9CLW9AL29ALW5rrm1lLW1e7W1MbW1GKW1EK21'. + 'CLW1CK21AK2tjK2thKWtMaWtIaWtGJytCK2tCKWtAK2tAKWlhK'. + 'Wle6WlEJylCJylAKWlAJyca5ycGJScEJScCJScAJycAJSUWpSU'. + 'UoyUKZSUEIyUCIyUAJSUAIyMUoyMSoyMIYSMEISMCISMAIyMAI'. + 'SECHuEAISEAHt7MXt7EHt7CHt7AHt7AHNzKXNzEGtzAHNzAGtr'. + 'GGtrEGNrCGtrAGtrAGNjCFpjAGNjAFpaAFpaAFIpZn4bAAAAAX'. + 'RSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsS'. + 'AdLdfvwAAAAHdElNRQfTAwkRFB0ymoOwAAAB9UlEQVR4nGNgIA'. + 'K42hhqGtm5+WFIWClKycvLK6gbuARGoEj4aMjLSElISUir6Tt7'. + 'x+aEIWR8leQlwEBSTc/CK7awLguuR0lGQkJMVFRUTFJVzwko1d'. + 'oFk9OQl5IQE+Dh5hVR0TV3CkkvbJgyASJjDZIR5GBl5eRX0TH1'. + 'DEqrbJ2ypBEspSgvJSXKw8bMxMavbOLoGZNf1TZlybw4oIyfLN'. + 'BxotxsLEzsQiaOHkFpBQ2905esrAZK2SpIAaUEuDm5+LTNPAKj'. + 'C+pbps1evrIDKGWnLictKSkuLKyoZQyUya9o7Z2+YMXKGUApew'. + 'M9PTVdXR0TEwf3wOjUirruafOXL18xFyjl72Kpb25qaurg4REU'. + 'EFVe2zJ5zpLlK1aCpbydnZ2dnDwDA6NTopLLeiZNXbB8BcTAyP'. + 'TQ0JDg4KCY1NS83JKmiVOBepYvX9UPlAovzEiPSU/LLyior2vq'. + 'mjZr3vLlIF01IC+XVhUWFlZW1Lc290ycOGfxohVATSsXx4Oksn'. + 'vaWlsb2tq6J0+bM2/RohVA81asbIcEYueU3t7JU6ZNnwNyGkhm'. + '+cp5CRCppJnzZ8+ZM3/JUogECBbBIixr8Yqly8FCy8F6ltUgoj'. + 'lz7sqVK2ByK+cVMSCDxoUrwWDVysXt8WhJKqG4Y8bcuTP6qrGk'. + 'QwwAABiMu7T4HMi4AAAAAElFTkSuQmCC' ; //========================================================== // File: bl_gray.png //========================================================== $this->imgdata_large[5][0]= 905 ; $this->imgdata_large[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAABO1'. - 'BMVEX////////3///39/fv7+/e5+fW3t7Wzs7WxsbG1tbGzsbG'. - 'xsbDxMS/v7++wMC+v7+9zsa9xsa9vb29tbW9ra29pa24uLi1xs'. - 'a1vb21tbWxtrattbWmpqalra2cra2cpaWcnJycjIyUpaWUnJyU'. - 'lJSUjIyMnJyMnJSMlJSMlIyMjJSMjIyElJSElIyEjIyEhIR7jI'. - 'x7hIR7hHt7e3t7e3N7e2tzhIRze3tze3Nzc3Nre3trc3Nrc2tr'. - 'a2tjc3Njc2tja3Nja2tjY2NjWlpaa2taY2taY2NaY1paWlpaUl'. - 'JSY2NSY1pSWlpSWlJSUlJSUkpKWlpKWlJKUlpKUlJKUkpKSkpK'. - 'SkJCUlJCUkJCSkpCSkJCQkI5Sko5QkI5Qjk5OUI5OTkxQkIxOT'. - 'kxMTkxMTEpMTEhMTEhKSkYISEpy7AFAAAAAXRSTlMAQObYZgAA'. - 'AAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdE'. - 'lNRQfTAwkRFQfW40uLAAABx0lEQVR4nI3SbXfSMBQA4NV3nce5'. - 'TecAHUywRMHSgFuBCFsQUqwBS1OsWQh0GTj//y8wZUzdwQ/efM'. - 'tzcm/uuXdj4z9ic/PR9k4qk1qDnf0X2/uZzKt8GaRvSubg4LVp'. - 'mkWzCGAT/i3Zsm2XNQHLsm2n2937LaaNnGoJFAEo27B50qN0ay'. - 'Wg26lXsw8fP8nmzcJb2CbsnF5JmmCE8ncN404KvLfsYwd7/MdV'. - 'Pdgl/VbKMIzbuwVgVZw2JlSKJTVJ3609vWUY957lgAUd1KNcqr'. - 'yWnOcOPn8q7d5/8PywAqsOOiVDrn42NFk+HQ7dVuXNYeFdBTpN'. - 'nY5JdZl8xI5Y+HXYaTVqEDp1hAnRohZM03EUjMdhn5wghOoNnD'. - 'wSK7KiiDPqEtz+iD4ctdyAifNYzUnScBSxwPd6GLfRURW7Ay5i'. - 'pS5bmrY8348C5vvUI+TLiIVSJrVA0heK/GDkJxYMRoyfCSmk4s'. - 'uWc3yic/oBo4yF374LGQs5Xw0GyQljI8bYmEsxVUoKxa6HMpAT'. - 'vgyhU2mR8uU1pXmsa8ezqb6U4mwWF/5MeY8uLtQ0nmmQ8UWYvb'. - 'EcJaYWar7QhztrO5Wr4Q4hDbAG/4hfTAF2iCiWrCEAAAAASUVO'. - 'RK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAABO1'. + 'BMVEX////////3///39/fv7+/e5+fW3t7Wzs7WxsbG1tbGzsbG'. + 'xsbDxMS/v7++wMC+v7+9zsa9xsa9vb29tbW9ra29pa24uLi1xs'. + 'a1vb21tbWxtrattbWmpqalra2cra2cpaWcnJycjIyUpaWUnJyU'. + 'lJSUjIyMnJyMnJSMlJSMlIyMjJSMjIyElJSElIyEjIyEhIR7jI'. + 'x7hIR7hHt7e3t7e3N7e2tzhIRze3tze3Nzc3Nre3trc3Nrc2tr'. + 'a2tjc3Njc2tja3Nja2tjY2NjWlpaa2taY2taY2NaY1paWlpaUl'. + 'JSY2NSY1pSWlpSWlJSUlJSUkpKWlpKWlJKUlpKUlJKUkpKSkpK'. + 'SkJCUlJCUkJCSkpCSkJCQkI5Sko5QkI5Qjk5OUI5OTkxQkIxOT'. + 'kxMTkxMTEpMTEhMTEhKSkYISEpy7AFAAAAAXRSTlMAQObYZgAA'. + 'AAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdE'. + 'lNRQfTAwkRFQfW40uLAAABx0lEQVR4nI3SbXfSMBQA4NV3nce5'. + 'TecAHUywRMHSgFuBCFsQUqwBS1OsWQh0GTj//y8wZUzdwQ/efM'. + 'tzcm/uuXdj4z9ic/PR9k4qk1qDnf0X2/uZzKt8GaRvSubg4LVp'. + 'mkWzCGAT/i3Zsm2XNQHLsm2n2937LaaNnGoJFAEo27B50qN0ay'. + 'Wg26lXsw8fP8nmzcJb2CbsnF5JmmCE8ncN404KvLfsYwd7/MdV'. + 'Pdgl/VbKMIzbuwVgVZw2JlSKJTVJ3609vWUY957lgAUd1KNcqr'. + 'yWnOcOPn8q7d5/8PywAqsOOiVDrn42NFk+HQ7dVuXNYeFdBTpN'. + 'nY5JdZl8xI5Y+HXYaTVqEDp1hAnRohZM03EUjMdhn5wghOoNnD'. + 'wSK7KiiDPqEtz+iD4ctdyAifNYzUnScBSxwPd6GLfRURW7Ay5i'. + 'pS5bmrY8348C5vvUI+TLiIVSJrVA0heK/GDkJxYMRoyfCSmk4s'. + 'uWc3yic/oBo4yF374LGQs5Xw0GyQljI8bYmEsxVUoKxa6HMpAT'. + 'vgyhU2mR8uU1pXmsa8ezqb6U4mwWF/5MeY8uLtQ0nmmQ8UWYvb'. + 'EcJaYWar7QhztrO5Wr4Q4hDbAG/4hfTAF2iCiWrCEAAAAASUVO'. + 'RK5CYII=' ; //========================================================== // File: bl_brown.png //========================================================== $this->imgdata_large[6][0]= 1053 ; $this->imgdata_large[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABoV'. - 'BMVEX////Gzs7GvbXGrZTGpXu9nHO1nHO1nIy9taXGxs7GtaXO'. - 'nHPGlFrGjEq9hEq1hEqte0Klczmcazmce1KtnIzGxsbGvb3OlF'. - 'LOlFq9hFKte0qcc0KUYzGEWimMc1K9ta3OnGvOnGPWnGO9jFq9'. - 'jFKlc0KUazmMYzl7UilzUjGtpZzGxr3GnGPWpWvepXO1hFJ7Wj'. - 'FrSiFjUjG1ra3GnHPvxpT/5733zpythFKUa0KEYzlzUilaOSF7'. - 'Wjm9jErvvYz/99b///f/78bnrYS1hFqle0p7UjFrSiljQiFCMR'. - 'iMhHO9lGvGjFLWnGv/3q3////erXuthEqlc0paQiFKMRhSQin/'. - '1qX/997//++cc0pjSilaQilKORhCKRiclIy9pYzGlGPntYT33q'. - '3vvZSEWjlSOSE5KRB7c2O1lHutczmthFqte1JrWkqtjGtCKRBa'. - 'SjmljGuca0KMYzGMaznOztaclISUYzmEWjFKOSF7a1qEYzFaSi'. - 'GUjISEa0pKOSm9vb2llIxaQhg5IQiEc2tzY0paORilnJy1raVS'. - 'OSljUkJjWkKTpvQWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. - 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkREiei'. - 'zP2EAAAB9UlEQVR4nGWS/VfSUBjHL5QluhhBxtwyWcCus5Blpm'. - 'wDC4ONaWXCyBi7RMZmpQ2Bypm9W/byV3cHHo/W88s95/s5z/d5'. - 'uwCcCh/4L3zAf+bs0NC588On9QAYGSUuBINk6GI4cmnsBLk8Go'. - '1SFEGMkzRzZeLq5JE8FvDHouw1lqXiCZJOcnCKnx4AcP0GBqmZ'. - 'mRgRT9MMB4Wbs7cGSXNRik3dnp9fiMUzNCNKgpzN9bsaWaQo9s'. - '7dfH7pXiFTZCBU1JK27LmtBO8TDx7mV1eXHqXXyiIUFLWiVzHx'. - 'BxcJIvV4/cn6wkqmWOOwmVE3UQOAp6HxRKL5bGPj+VwhUhalFq'. - '8alm5vAt+LlySZTsebzcKrraIIW4JqZC3N3ga+1+EQTZKZta1M'. - 'pCZCSeDViqVrThsEdsLJZLJYLpZrHVGScrKBvTQNtQHY6XIM02'. - 'E6Ik7odRW1Dzy3N28n3kGuB3tQagm7UMBFXI/sATAs7L5vdbEs'. - '8Lycm923NB0j5wMe6KOsKIIyxcuqauxbrmlqyEWfPmPy5assY1'. - 'U1SvWKZWom9nK/HfQ3+v2HYZSMStayTNN0PYKqg11P1nWsWq7u'. - '4gJeY8g9PLrddNXRdW8Iryv86I3ja/9s26gvukhDdvUQnIjlKr'. - 'IdZCNH+3Xw779qbG63f//ZOzb6C4+ofdbzERrSAAAAAElFTkSu'. - 'QmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAMAAADzN3VRAAABoV'. + 'BMVEX////Gzs7GvbXGrZTGpXu9nHO1nHO1nIy9taXGxs7GtaXO'. + 'nHPGlFrGjEq9hEq1hEqte0Klczmcazmce1KtnIzGxsbGvb3OlF'. + 'LOlFq9hFKte0qcc0KUYzGEWimMc1K9ta3OnGvOnGPWnGO9jFq9'. + 'jFKlc0KUazmMYzl7UilzUjGtpZzGxr3GnGPWpWvepXO1hFJ7Wj'. + 'FrSiFjUjG1ra3GnHPvxpT/5733zpythFKUa0KEYzlzUilaOSF7'. + 'Wjm9jErvvYz/99b///f/78bnrYS1hFqle0p7UjFrSiljQiFCMR'. + 'iMhHO9lGvGjFLWnGv/3q3////erXuthEqlc0paQiFKMRhSQin/'. + '1qX/997//++cc0pjSilaQilKORhCKRiclIy9pYzGlGPntYT33q'. + '3vvZSEWjlSOSE5KRB7c2O1lHutczmthFqte1JrWkqtjGtCKRBa'. + 'SjmljGuca0KMYzGMaznOztaclISUYzmEWjFKOSF7a1qEYzFaSi'. + 'GUjISEa0pKOSm9vb2llIxaQhg5IQiEc2tzY0paORilnJy1raVS'. + 'OSljUkJjWkKTpvQWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkREiei'. + 'zP2EAAAB9UlEQVR4nGWS/VfSUBjHL5QluhhBxtwyWcCus5Blpm'. + 'wDC4ONaWXCyBi7RMZmpQ2Bypm9W/byV3cHHo/W88s95/s5z/d5'. + 'uwCcCh/4L3zAf+bs0NC588On9QAYGSUuBINk6GI4cmnsBLk8Go'. + '1SFEGMkzRzZeLq5JE8FvDHouw1lqXiCZJOcnCKnx4AcP0GBqmZ'. + 'mRgRT9MMB4Wbs7cGSXNRik3dnp9fiMUzNCNKgpzN9bsaWaQo9s'. + '7dfH7pXiFTZCBU1JK27LmtBO8TDx7mV1eXHqXXyiIUFLWiVzHx'. + 'BxcJIvV4/cn6wkqmWOOwmVE3UQOAp6HxRKL5bGPj+VwhUhalFq'. + '8alm5vAt+LlySZTsebzcKrraIIW4JqZC3N3ga+1+EQTZKZta1M'. + 'pCZCSeDViqVrThsEdsLJZLJYLpZrHVGScrKBvTQNtQHY6XIM02'. + 'E6Ik7odRW1Dzy3N28n3kGuB3tQagm7UMBFXI/sATAs7L5vdbEs'. + '8Lycm923NB0j5wMe6KOsKIIyxcuqauxbrmlqyEWfPmPy5assY1'. + 'U1SvWKZWom9nK/HfQ3+v2HYZSMStayTNN0PYKqg11P1nWsWq7u'. + '4gJeY8g9PLrddNXRdW8Iryv86I3ja/9s26gvukhDdvUQnIjlKr'. + 'IdZCNH+3Xw779qbG63f//ZOzb6C4+ofdbzERrSAAAAAElFTkSu'. + 'QmCC' ; //========================================================== // File: bl_darkgreen.png //========================================================== $this->imgdata_large[7][0]= 1113 ; $this->imgdata_large[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. - 'BMVEX////////3///v///n/+/e99bW/+/W99bO786/v7++vr69'. - '/96999a7wb24vbu1/9a1zqW1u7itxrWosq6l772l1qWlxrWlxq'. - '2lva2cxpSU562U3q2UxqWUvaWUpZyM77WM57WMvYyMtZyMrZyM'. - 'pZSMnJSEvZyEtYyErZSElIx7zpR7xpx7xpR7vZR7jIRz1pRzxp'. - 'RzjIRrzpRrzoxrxoxrtYRrrYxrrXtrpYRrhHNjzoxjxoxjxoRj'. - 'vYRjtYRjrXtjpXtjlGNje2tazoxazoRaxoxaxoRavYRatYRatX'. - 'tarXtapXNanHNajFpae2tSzoRSxoRSvXtStXtSrXtSrXNSpXNS'. - 'nHNSnGtSlGtSlGNSjGtSjGNKvXtKtXNKrXNKpWtKnGtKlGNKjG'. - 'NKhGNKhFJKc1pKa1JCrWtCpWtCnGtClGNCjGNCjFpChFpCe1JC'. - 'a1JCY1I5pWs5nGM5lGM5jFo5hFo5e1o5c0o5WkoxjFoxhFoxhF'. - 'Ixe1Ixc1Ixc0oxa0ophFIpe0opc0opa0opa0IpY0IpWkIpWjkp'. - 'UkIpUjkhc0oha0IhY0IhWjkhWjEhUjkhUjEhSjEhSikhQjEhQi'. - 'kYWjkYSjEYSikYQjEYQikQSikQQikQQiEQOSExf8saAAAAAXRS'. - 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. - 'LdfvwAAAAHdElNRQfTAwkRFCaDkWqUAAAB+ElEQVR4nI3S+1vS'. - 'UBgHcGZlPV0ks/vFrmQWFimJjiwiYUJWjFBWFhClyZCy5hLrwA'. - 'x2EIwJC1w7zf2vnU0re+iHvs9++7x7zznvORbLf+TA6ct9fYMX'. - 'jrfAUYefpp+/iM1ykxf/lmuhUZ/PTwXC8dml5Wcd23o5H5Mk6b'. - '5NUU8icXbhS67rNzn9JDnguOEYGQtEEtwC+Crs3RJ76P5A/znr'. - 'vsNX7wQnEiwHCtK7TTkW8rvdZ9uJtvZTLkxpHhSrP66bNEj7/P'. - '3WNoLYeeSWQQCIpe9lQw7RNEU5rDsIYtcJ14Nocg7kRUlBNkxn'. - 'YmGKcp7cv3vPwR7XOJPmc0VYU3Sv0e9NOBAYG7Hbz/cMjTMveZ'. - 'CHkqxuTBv0PhYJB4N3XR6PJ5rMAPMnpGUxDX1IxSeMTEaZp1OZ'. - 'nGAIQiYtsalUIhFlmGTy3sO3AizJCKn6DKYryxzHsWyaneMzr6'. - 'cWxRVZVlFTe4SpE3zm+U/4+whyiwJcWVMQNr3XONirVWAklxcE'. - 'EdbqchPhjhVzGpeqhUKhWBQhLElr9fo3pDaQPrw5xOl1CGG1JE'. - 'k1uYEBIVkrb02+o6RItfq6rBhbw/tuINT96766KhuqYpY3UFPF'. - 'BbY/19yZ1XF1U0UNBa9T7rZsz80K0jWk6bpWGW55UzbvTHZ+3t'. - 'vbAv/IT+K1uCmhIrKJAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAAB2l'. + 'BMVEX////////3///v///n/+/e99bW/+/W99bO786/v7++vr69'. + '/96999a7wb24vbu1/9a1zqW1u7itxrWosq6l772l1qWlxrWlxq'. + '2lva2cxpSU562U3q2UxqWUvaWUpZyM77WM57WMvYyMtZyMrZyM'. + 'pZSMnJSEvZyEtYyErZSElIx7zpR7xpx7xpR7vZR7jIRz1pRzxp'. + 'RzjIRrzpRrzoxrxoxrtYRrrYxrrXtrpYRrhHNjzoxjxoxjxoRj'. + 'vYRjtYRjrXtjpXtjlGNje2tazoxazoRaxoxaxoRavYRatYRatX'. + 'tarXtapXNanHNajFpae2tSzoRSxoRSvXtStXtSrXtSrXNSpXNS'. + 'nHNSnGtSlGtSlGNSjGtSjGNKvXtKtXNKrXNKpWtKnGtKlGNKjG'. + 'NKhGNKhFJKc1pKa1JCrWtCpWtCnGtClGNCjGNCjFpChFpCe1JC'. + 'a1JCY1I5pWs5nGM5lGM5jFo5hFo5e1o5c0o5WkoxjFoxhFoxhF'. + 'Ixe1Ixc1Ixc0oxa0ophFIpe0opc0opa0opa0IpY0IpWkIpWjkp'. + 'UkIpUjkhc0oha0IhY0IhWjkhWjEhUjkhUjEhSjEhSikhQjEhQi'. + 'kYWjkYSjEYSikYQjEYQikQSikQQikQQiEQOSExf8saAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwkRFCaDkWqUAAAB+ElEQVR4nI3S+1vS'. + 'UBgHcGZlPV0ks/vFrmQWFimJjiwiYUJWjFBWFhClyZCy5hLrwA'. + 'x2EIwJC1w7zf2vnU0re+iHvs9++7x7zznvORbLf+TA6ct9fYMX'. + 'jrfAUYefpp+/iM1ykxf/lmuhUZ/PTwXC8dml5Wcd23o5H5Mk6b'. + '5NUU8icXbhS67rNzn9JDnguOEYGQtEEtwC+Crs3RJ76P5A/znr'. + 'vsNX7wQnEiwHCtK7TTkW8rvdZ9uJtvZTLkxpHhSrP66bNEj7/P'. + '3WNoLYeeSWQQCIpe9lQw7RNEU5rDsIYtcJ14Nocg7kRUlBNkxn'. + 'YmGKcp7cv3vPwR7XOJPmc0VYU3Sv0e9NOBAYG7Hbz/cMjTMveZ'. + 'CHkqxuTBv0PhYJB4N3XR6PJ5rMAPMnpGUxDX1IxSeMTEaZp1OZ'. + 'nGAIQiYtsalUIhFlmGTy3sO3AizJCKn6DKYryxzHsWyaneMzr6'. + 'cWxRVZVlFTe4SpE3zm+U/4+whyiwJcWVMQNr3XONirVWAklxcE'. + 'EdbqchPhjhVzGpeqhUKhWBQhLElr9fo3pDaQPrw5xOl1CGG1JE'. + 'k1uYEBIVkrb02+o6RItfq6rBhbw/tuINT96766KhuqYpY3UFPF'. + 'BbY/19yZ1XF1U0UNBa9T7rZsz80K0jWk6bpWGW55UzbvTHZ+3t'. + 'vbAv/IT+K1uCmhIrKJAAAAAElFTkSuQmCC' ; //========================================================== // File: bl_green.png //========================================================== $this->imgdata_large[8][0]= 1484 ; $this->imgdata_large[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMMFjM4kcoDJQAABVlJREFUeNq9ll2MJFUVx3/11V'. - 'Vd/TE9vU0v4zLDwJIF16jBqLAPhsRXEiDqg0QTJiQSjcSNvCzw'. - 'sBEDDxizhvAAxBgf1oR9QF9NiE9ESFZkQyZB5WtddmdnZ3qqqr'. - 'uqbt367Cofqu3ZZpWVaDzJfbkf53//55z/PVdZXV3l/2H6f7Lp'. - '5VdOV/4Nb+GmHpUeA7AdBNxc3kafNb73jRPK9Xwon8ToxVefqU'. - 'b91wibH5EkCQBCizFihTSviHUHR0hWws9xe3wvJ7/7nPKpgX5y'. - '9oFqt3eOgWniRBoAbUBGGqZUibSYaeoT2B5bnkdaSA6793Cv/S'. - 'QPPbihXBfo5VdOV+8dfgnvwAU62YH5fCZ12sDujFkwyegCqTrB'. - 'iUOKTOJKj8jr88jS8zy6cXwBTP048nuHX0I0nDlIp7RpTG7kM0'. - 'sdyAYsTVukUuWGhlWHMq0ITL92lnUp9R1Obz/GmTNnqn9bDD8/'. - '+0D1oX0O0zQZZDYCsK2j3Gl9jQqDfHiei8GfiKVLlsZkJaBAN1'. - '0i6PgwUbB0GxG5/PrtE/xLRr959Znqw9452oVNI+jiJhnr1pe4'. - 'k29zB1/nFr5Kj7tpt1YYhJ0FJ7nUYbcJQBgahN2MzeCP/OipR6'. - 'prgN6Qr6ELFQFUWoRpNVjlKwxZB8DCpE+PtfEKqV1cUzxpVudu'. - 'GTBHA5Y1g99e+dUio9O/P1Vpq+/WE5GGjDSMoAtAQjrf3C52IP'. - 'QxpY4WK2hpReka9Gfrhqgz0bACRoCWjDh56kQ1z9FeuUUQxVhK'. - 'B92sD1VahM+bAJgcoJhGjP/6Ln8rAgDiRCVRKiIzxMkkodBJ85'. - 'im1IlEHbE4k1xyNveL4YP8HarmGJIOpqyjeQmfNHmTvnqZTWBt'. - 'vIJXpPwlukJSuSTKGK3pEwtJmiX00ZlInTyNscImO6XBITvH1c'. - '8vVt2OucdKvIyeKRTNCivsEMgcpg6taYs30nfq0Gqg6hOSSFJ4'. - 'BSnJPht0IqEjWmOGocEI6F0J94F0qaL6BntTF0MtUfweKQKAPU'. - 'Wwp4OcVnQAmVb0p9DLOzjEhEKnGRmoRc7EzRGlwA6NujAKG4yP'. - '6Sjwc4aVznZ7DK0xXdkDoJf0kGmFBniFBOBGcZSCCSKd0IwN0k'. - 'IS+QZWCGVZex4BnUxya3+Zt9iugQbcRFpIAtuHvAZulPUdLhUJ'. - 'RqegI3WcqaSXddlT3idsWMSRRGkEtNwmyTifAwyBo7LP+11J0e'. - '7tM7pZOYblHkBLcqZ5LcYtw6Wbd4CM3SpE9foYZsIHoqDKCrbz'. - 'mLSQtPwmuhXgtBLs0GBdbXOhFGB7WBKO2F8GXt9/VO97Ya3atF'. - '7nUHnwGjGGQqcPxFEdFqURkEidiZszAERoYIsGju1hq21kWee3'. - 'bw15+8WpsvAy3K1+i3JkkhZyPpxxjjPOsfOYiZ+TFhLPzQnHOU'. - 'tpzGB2dgA4tscIkKIx19Cxg/fPL7vQJu47eXt1VvsDK8pwPueZ'. - 'PuZoQMOqhRoJHSs0kKLBWjvjYinmeQGw1TaX1RFdfZ3LMzYLjA'. - 'C++dkn6AaH2Nobk6cxEzdnuG0TdC8zvdJkN0hqkFkO/jwL0fxa'. - 'so8sBcuFzQ+/+MRC+BeAHnpwQzn++ee5KT9Eshuy46dcKAXm32'. - '0uzPQhS4GttkH2GQID2Wc0Y4LtAbDxhZ/x5A+e/uTG9+jGceXH'. - '9/ySnnIXnUzOxXe1038mW3ZynNmam4yYWkO+f9cv+Oljz16/lV'. - '9tDz/9nerc1hm8ZEScSRK7VvtYl1i1dklsOKyvc+zg/bzw1O8+'. - '/efkajt56kR1ydlEJBc5H46xzbrJ3dY9wrB7hGcff+6/+279L+'. - '0fHxyiE8XMLl4AAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAYAAACpSkzOAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMMFjM4kcoDJQAABVlJREFUeNq9ll2MJFUVx3/11V'. + 'Vd/TE9vU0v4zLDwJIF16jBqLAPhsRXEiDqg0QTJiQSjcSNvCzw'. + 'sBEDDxizhvAAxBgf1oR9QF9NiE9ESFZkQyZB5WtddmdnZ3qqqr'. + 'uqbt367Cofqu3ZZpWVaDzJfbkf53//55z/PVdZXV3l/2H6f7Lp'. + '5VdOV/4Nb+GmHpUeA7AdBNxc3kafNb73jRPK9Xwon8ToxVefqU'. + 'b91wibH5EkCQBCizFihTSviHUHR0hWws9xe3wvJ7/7nPKpgX5y'. + '9oFqt3eOgWniRBoAbUBGGqZUibSYaeoT2B5bnkdaSA6793Cv/S'. + 'QPPbihXBfo5VdOV+8dfgnvwAU62YH5fCZ12sDujFkwyegCqTrB'. + 'iUOKTOJKj8jr88jS8zy6cXwBTP048nuHX0I0nDlIp7RpTG7kM0'. + 'sdyAYsTVukUuWGhlWHMq0ITL92lnUp9R1Obz/GmTNnqn9bDD8/'. + '+0D1oX0O0zQZZDYCsK2j3Gl9jQqDfHiei8GfiKVLlsZkJaBAN1'. + '0i6PgwUbB0GxG5/PrtE/xLRr959Znqw9452oVNI+jiJhnr1pe4'. + 'k29zB1/nFr5Kj7tpt1YYhJ0FJ7nUYbcJQBgahN2MzeCP/OipR6'. + 'prgN6Qr6ELFQFUWoRpNVjlKwxZB8DCpE+PtfEKqV1cUzxpVudu'. + 'GTBHA5Y1g99e+dUio9O/P1Vpq+/WE5GGjDSMoAtAQjrf3C52IP'. + 'QxpY4WK2hpReka9Gfrhqgz0bACRoCWjDh56kQ1z9FeuUUQxVhK'. + 'B92sD1VahM+bAJgcoJhGjP/6Ln8rAgDiRCVRKiIzxMkkodBJ85'. + 'im1IlEHbE4k1xyNveL4YP8HarmGJIOpqyjeQmfNHmTvnqZTWBt'. + 'vIJXpPwlukJSuSTKGK3pEwtJmiX00ZlInTyNscImO6XBITvH1c'. + '8vVt2OucdKvIyeKRTNCivsEMgcpg6taYs30nfq0Gqg6hOSSFJ4'. + 'BSnJPht0IqEjWmOGocEI6F0J94F0qaL6BntTF0MtUfweKQKAPU'. + 'Wwp4OcVnQAmVb0p9DLOzjEhEKnGRmoRc7EzRGlwA6NujAKG4yP'. + '6Sjwc4aVznZ7DK0xXdkDoJf0kGmFBniFBOBGcZSCCSKd0IwN0k'. + 'IS+QZWCGVZex4BnUxya3+Zt9iugQbcRFpIAtuHvAZulPUdLhUJ'. + 'RqegI3WcqaSXddlT3idsWMSRRGkEtNwmyTifAwyBo7LP+11J0e'. + '7tM7pZOYblHkBLcqZ5LcYtw6Wbd4CM3SpE9foYZsIHoqDKCrbz'. + 'mLSQtPwmuhXgtBLs0GBdbXOhFGB7WBKO2F8GXt9/VO97Ya3atF'. + '7nUHnwGjGGQqcPxFEdFqURkEidiZszAERoYIsGju1hq21kWee3'. + 'bw15+8WpsvAy3K1+i3JkkhZyPpxxjjPOsfOYiZ+TFhLPzQnHOU'. + 'tpzGB2dgA4tscIkKIx19Cxg/fPL7vQJu47eXt1VvsDK8pwPueZ'. + 'PuZoQMOqhRoJHSs0kKLBWjvjYinmeQGw1TaX1RFdfZ3LMzYLjA'. + 'C++dkn6AaH2Nobk6cxEzdnuG0TdC8zvdJkN0hqkFkO/jwL0fxa'. + 'so8sBcuFzQ+/+MRC+BeAHnpwQzn++ee5KT9Eshuy46dcKAXm32'. + '0uzPQhS4GttkH2GQID2Wc0Y4LtAbDxhZ/x5A+e/uTG9+jGceXH'. + '9/ySnnIXnUzOxXe1038mW3ZynNmam4yYWkO+f9cv+Oljz16/lV'. + '9tDz/9nerc1hm8ZEScSRK7VvtYl1i1dklsOKyvc+zg/bzw1O8+'. + '/efkajt56kR1ydlEJBc5H46xzbrJ3dY9wrB7hGcff+6/+279L+'. + '0fHxyiE8XMLl4AAAAASUVORK5CYII=' ; //========================================================== // File: bl_blue.png //========================================================== $this->imgdata_large[9][0]= 1169 ; $this->imgdata_large[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACEF'. - 'BMVEX/////////7//35//v1v/exv/Wvf/Wrf/Wpf/Orf+/v7+9'. - 'tc69jP+9hP+5ucW1tc6tlP+rq7Wlpdalpcalpb2cnM6cnMacc/'. - '+cWv+UlLWUjN6UjK2Uc/+Ma/+MUv+EhKWEa/+EQvd7e8Z7e7V7'. - 'e6V7c957Wv9za9Zza8ZzSv9ra5xrSv9rOf9rMe9jUudjQv9jOe'. - '9aWpRaUt5aUpRaSu9aSudSUoxSSs5SSoxSMf9KQtZKOfdKMedK'. - 'Kf9KKe9CKf9CKb1CKa1CIfdCIedCId45MXs5Kfc5If85Iec5Id'. - 'Y5GP8xMbUxMXsxKc4xKZQxIf8xGP8xGO8xGN4xGNYxGL0xGK0p'. - 'KXMpIYwpGP8pGO8pGOcpGNYpGM4pEP8pEPcpEOcpEN4pENYpEM'. - 'YpEL0hGKUhEP8hEPchEO8hEOchEN4hENYhEM4hEMYhELUhCP8h'. - 'CO8hCN4YGJwYGGsYEL0YEK0YEHMYCN4YCM4YCMYYCL0YCKUYAP'. - '8QEJQQEIwQEHsQEGsQCM4QCLUQCK0QCKUQCJwQCJQQCIwQCHMQ'. - 'CGsQAP8QAPcQAO8QAOcQAN4QANYQAM4QAMYQAL0QALUQAKUQAJ'. - 'QQAIQICGsICGMIAO8IANYIAL0IALUIAK0IAKUIAJwIAJQIAIwI'. - 'AIQIAHsIAHMIAGsIAGMAAN4AAMYAAK0AAJQAAIwAAIQAAHMAAG'. - 'sAAGMAAFrR1dDlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFRPMOZ'. - '/2AAAB+klEQVR4nGNgIAIIqeqZmBqpi2JISNml5lVXV3d198Yo'. - 'oUjwm1SnxsbGRsSm5ZfNXO4tjCTjVh0ABhFx6QV9E1Y0S8JkuN'. - '3yAgLc7W3t/QPi4jPKJ8ye1yoIlTKpjvVy15eVUbN0i4zKLJ8w'. - 'ae6qcKgLqmMj3PUFWFl5NJ0CExLLJzbNW7BWCyxlXR0ba6/Axs'. - 'zELmfnkRBT0QiSKgXJCOflxUbYy3KyMHEoOrtEZ1c2TZ6/cMl6'. - 'eaCUamdsbIC7tjgPr4SBS3BMMVDTwkXr1hsDpYy6UmMj/O0tdX'. - 'QNbDxjknJLWqYsXLx0vStQynxGflpkZGCgs7Onp29SbtNkoMy6'. - 'pevCgFJWy3oyMuKjgoKCPWNCvEuqWhcsWrJ06XqQlPnMvrKyrM'. - 'TomJjkZAfHlNa2qdOWrlu63gcopbG8v7+hvLwip7g4JdSxsLZu'. - '8dKlS9ettwBKic2eNXHChIkTG5tKqgpr2uo6loLAehWQx0LnzJ'. - '49p6mpeXLLlNq6RUvqly6dvnR9Bx9ISnnlvLmT582bMr9t4aL2'. - '+vrp60GaDCGB6Ld6wfwFCxYCJZYsXQ+SmL6+FBryInVrFi1atH'. - 'jJkqVQsH6pNCzCJNvXrQW6CmQJREYFEc2CYevXrwMLAyXXl0oz'. - 'IAOt0vVQUGSIkabkDV3DwlzNVDAksAAAfUbNQRCwr88AAAAASU'. - 'VORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAMAAACelLz8AAACEF'. + 'BMVEX/////////7//35//v1v/exv/Wvf/Wrf/Wpf/Orf+/v7+9'. + 'tc69jP+9hP+5ucW1tc6tlP+rq7Wlpdalpcalpb2cnM6cnMacc/'. + '+cWv+UlLWUjN6UjK2Uc/+Ma/+MUv+EhKWEa/+EQvd7e8Z7e7V7'. + 'e6V7c957Wv9za9Zza8ZzSv9ra5xrSv9rOf9rMe9jUudjQv9jOe'. + '9aWpRaUt5aUpRaSu9aSudSUoxSSs5SSoxSMf9KQtZKOfdKMedK'. + 'Kf9KKe9CKf9CKb1CKa1CIfdCIedCId45MXs5Kfc5If85Iec5Id'. + 'Y5GP8xMbUxMXsxKc4xKZQxIf8xGP8xGO8xGN4xGNYxGL0xGK0p'. + 'KXMpIYwpGP8pGO8pGOcpGNYpGM4pEP8pEPcpEOcpEN4pENYpEM'. + 'YpEL0hGKUhEP8hEPchEO8hEOchEN4hENYhEM4hEMYhELUhCP8h'. + 'CO8hCN4YGJwYGGsYEL0YEK0YEHMYCN4YCM4YCMYYCL0YCKUYAP'. + '8QEJQQEIwQEHsQEGsQCM4QCLUQCK0QCKUQCJwQCJQQCIwQCHMQ'. + 'CGsQAP8QAPcQAO8QAOcQAN4QANYQAM4QAMYQAL0QALUQAKUQAJ'. + 'QQAIQICGsICGMIAO8IANYIAL0IALUIAK0IAKUIAJwIAJQIAIwI'. + 'AIQIAHsIAHMIAGsIAGMAAN4AAMYAAK0AAJQAAIwAAIQAAHMAAG'. + 'sAAGMAAFrR1dDlAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkRFRPMOZ'. + '/2AAAB+klEQVR4nGNgIAIIqeqZmBqpi2JISNml5lVXV3d198Yo'. + 'oUjwm1SnxsbGRsSm5ZfNXO4tjCTjVh0ABhFx6QV9E1Y0S8JkuN'. + '3yAgLc7W3t/QPi4jPKJ8ye1yoIlTKpjvVy15eVUbN0i4zKLJ8w'. + 'ae6qcKgLqmMj3PUFWFl5NJ0CExLLJzbNW7BWCyxlXR0ba6/Axs'. + 'zELmfnkRBT0QiSKgXJCOflxUbYy3KyMHEoOrtEZ1c2TZ6/cMl6'. + 'eaCUamdsbIC7tjgPr4SBS3BMMVDTwkXr1hsDpYy6UmMj/O0tdX'. + 'QNbDxjknJLWqYsXLx0vStQynxGflpkZGCgs7Onp29SbtNkoMy6'. + 'pevCgFJWy3oyMuKjgoKCPWNCvEuqWhcsWrJ06XqQlPnMvrKyrM'. + 'TomJjkZAfHlNa2qdOWrlu63gcopbG8v7+hvLwip7g4JdSxsLZu'. + '8dKlS9ettwBKic2eNXHChIkTG5tKqgpr2uo6loLAehWQx0LnzJ'. + '49p6mpeXLLlNq6RUvqly6dvnR9Bx9ISnnlvLmT582bMr9t4aL2'. + '+vrp60GaDCGB6Ld6wfwFCxYCJZYsXQ+SmL6+FBryInVrFi1atH'. + 'jJkqVQsH6pNCzCJNvXrQW6CmQJREYFEc2CYevXrwMLAyXXl0oz'. + 'IAOt0vVQUGSIkabkDV3DwlzNVDAksAAAfUbNQRCwr88AAAAASU'. + 'VORK5CYII=' ; //========================================================== // File: bs_red.png //========================================================== $this->imgdata_small[0][0]= 437 ; $this->imgdata_small[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. - 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. - 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. - 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. - 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. - 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGDNEMgOYAAAAm0'. - 'lEQVR4nI3Q3RKCIBAFYGZMy9RKzX7MVUAUlQTe/+kS0K49d3wD'. - '7JlFaG+CvIR3FvzPXgpLatxevVVS+Jzv0BDGk/UJwOkQ1ph2g/'. - 'Ct5ACX4wNT1o/zzUoJUFUGBiGfVnDTYGJgmrWy8iKEtp0Bpd2d'. - 'jLGu56MB7f4JOOfDJAwoNwslk/jOUi+Jts6RVNrC1hkhPy50Ef'. - 'u79/ADQMQSGQ8bBywAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. + 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. + 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. + 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. + 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. + 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGDNEMgOYAAAAm0'. + 'lEQVR4nI3Q3RKCIBAFYGZMy9RKzX7MVUAUlQTe/+kS0K49d3wD'. + '7JlFaG+CvIR3FvzPXgpLatxevVVS+Jzv0BDGk/UJwOkQ1ph2g/'. + 'Ct5ACX4wNT1o/zzUoJUFUGBiGfVnDTYGJgmrWy8iKEtp0Bpd2d'. + 'jLGu56MB7f4JOOfDJAwoNwslk/jOUi+Jts6RVNrC1hkhPy50Ef'. + 'u79/ADQMQSGQ8bBywAAAAASUVORK5CYII=' ; //========================================================== @@ -486,108 +486,108 @@ class ImgData_Balls extends ImgData //========================================================== $this->imgdata_small[1][0]= 657 ; $this->imgdata_small[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABVl'. - 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. - 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. - '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. - 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. - 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. - 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. - 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. - 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. - 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. - 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. - 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGTok'. - '9Yp9AAAAtElEQVR4nGNgIBaw8wkpKghzwvksPAKiUsraprYiLF'. - 'ARXkE2JiZ1PXMHXzGIAIekOFBE08TGLTCOCyzCLyvDxsZqZOnk'. - 'E56kAhaRV9NQUjW2tPcMjs9wBYsY6Oobmlk7egRGpxZmgkW0zC'. - '2s7Jy9giKT8gohaiQcnVzc/UNjkrMLCyHmcHr7BYREJKTlFxbm'. - 'QOxiEIuKTUzJKgQCaZibpdOzQfwCOZibGRi4dcJyw3S4iQ4HAL'. - 'qvIlIAMH7YAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABVl'. + 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. + 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. + '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. + 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. + 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. + 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. + 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. + 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. + 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. + 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGTok'. + '9Yp9AAAAtElEQVR4nGNgIBaw8wkpKghzwvksPAKiUsraprYiLF'. + 'ARXkE2JiZ1PXMHXzGIAIekOFBE08TGLTCOCyzCLyvDxsZqZOnk'. + 'E56kAhaRV9NQUjW2tPcMjs9wBYsY6Oobmlk7egRGpxZmgkW0zC'. + '2s7Jy9giKT8gohaiQcnVzc/UNjkrMLCyHmcHr7BYREJKTlFxbm'. + 'QOxiEIuKTUzJKgQCaZibpdOzQfwCOZibGRi4dcJyw3S4iQ4HAL'. + 'qvIlIAMH7YAAAAAElFTkSuQmCC' ; //========================================================== // File: bs_gray.png //========================================================== $this->imgdata_small[2][0]= 550 ; $this->imgdata_small[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAMAAADH72RtAAABI1'. - 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. - 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. - 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. - 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. - 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. - 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. - '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. - 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. - 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIA'. - 'AAsSAdLdfvwAAAAHdElNRQfTAwkUGiIctEHoAAAAfElEQVR4nI'. - '2N2xKDIAwF+bZ2kAa8cNFosBD//yvKWGh9dN+yk9kjxH28R7ze'. - 'wzBOYSX6CaNB927Z9qZ66KTSNmBM7UU9Hx2c5qjmJaWCaV5j4t'. - 'o1ANr40sn5a+x4biElrqHgrXMeac/c1nEpFHG0LSFoo/jO/BeF'. - 'lJnFbT58ayUf0BpA8wAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAMAAADH72RtAAABI1'. + 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. + 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. + 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. + 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. + 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. + 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. + '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. + 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. + 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIA'. + 'AAsSAdLdfvwAAAAHdElNRQfTAwkUGiIctEHoAAAAfElEQVR4nI'. + '2N2xKDIAwF+bZ2kAa8cNFosBD//yvKWGh9dN+yk9kjxH28R7ze'. + 'wzBOYSX6CaNB927Z9qZ66KTSNmBM7UU9Hx2c5qjmJaWCaV5j4t'. + 'o1ANr40sn5a+x4biElrqHgrXMeac/c1nEpFHG0LSFoo/jO/BeF'. + 'lJnFbT58ayUf0BpA8wAAAABJRU5ErkJggg==' ; //========================================================== // File: bs_greenblue.png //========================================================== $this->imgdata_small[3][0]= 503 ; $this->imgdata_small[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAxl'. - 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. - '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. - '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. - 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. - 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. - 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. - 'dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfT'. - 'AwkUGTIqLgJPAAAAqklEQVR4nI2QVxOCMBCEM6Mi2OiCvSslJB'. - 'CUoqjn//9TYgCfubf9Zu9uZxFqO+rscO7b6l/LljMZX29J2pNr'. - 'YjmX4ZaIEs2NeiWO19NNacl8rHAyD4LR6jjw6PMRdTjZE0JOiU'. - 'dDv2ALTlzRvSdCCfAHGCc7yRPSrAQRQOWxKc3C/IUjBlDdUcM8'. - '97vFGwBY9QsZGBc/A4DWZNbeXIPWZEZI0c2lqSute/gCO9MXGY'. - '4/IOkAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAxl'. + 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. + '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. + '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. + 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. + 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. + 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. + 'dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfT'. + 'AwkUGTIqLgJPAAAAqklEQVR4nI2QVxOCMBCEM6Mi2OiCvSslJB'. + 'CUoqjn//9TYgCfubf9Zu9uZxFqO+rscO7b6l/LljMZX29J2pNr'. + 'YjmX4ZaIEs2NeiWO19NNacl8rHAyD4LR6jjw6PMRdTjZE0JOiU'. + 'dDv2ALTlzRvSdCCfAHGCc7yRPSrAQRQOWxKc3C/IUjBlDdUcM8'. + '97vFGwBY9QsZGBc/A4DWZNbeXIPWZEZI0c2lqSute/gCO9MXGY'. + '4/IOkAAAAASUVORK5CYII=' ; //========================================================== // File: bs_yellow.png //========================================================== $this->imgdata_small[4][0]= 507 ; $this->imgdata_small[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAzF'. - 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. - 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. - 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. - 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. - 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. - '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. - 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAH'. - 'dElNRQfTAwkUGSDZl3MHAAAAqElEQVR4nI3QWRNDMBAA4My09E'. - 'IF1SME0VT1okXvM/3//6kEfbZv+81eswA0DfHxRpOV+M+zkDGG'. - 'rL63zCoJ2ef2RLZDIqNqYexyvFrY9ePkxGWdpvfzC7tEGtIRly'. - 'nqzboFKMlizAXbNnZyiFUKAy4bZ+B6W0lRaQDLmg4h/k7eFwDL'. - 'OWIky8qhXUBQ7gKGmsxpC+ah1TdriwByqG8GQNDNr6kLjf/wAx'. - 'KgEq+FpPbfAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAzF'. + 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. + 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. + 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. + 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. + 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. + '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. + 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAH'. + 'dElNRQfTAwkUGSDZl3MHAAAAqElEQVR4nI3QWRNDMBAA4My09E'. + 'IF1SME0VT1okXvM/3//6kEfbZv+81eswA0DfHxRpOV+M+zkDGG'. + 'rL63zCoJ2ef2RLZDIqNqYexyvFrY9ePkxGWdpvfzC7tEGtIRly'. + 'nqzboFKMlizAXbNnZyiFUKAy4bZ+B6W0lRaQDLmg4h/k7eFwDL'. + 'OWIky8qhXUBQ7gKGmsxpC+ah1TdriwByqG8GQNDNr6kLjf/wAx'. + 'KgEq+FpPbfAAAAAElFTkSuQmCC' ; //========================================================== // File: bs_darkgray.png //========================================================== $this->imgdata_small[5][0]= 611 ; $this->imgdata_small[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABJl'. - 'BMVEX////////o8v/f6O7W4OnR3PXL1OTL0evEyLvCzePAwMC/'. - 'v7a8wsq7t7C1xum1vtS1q6GzopmyxeKsrsOqvNWoq7anvN+nsb'. - 'qhrcGgqbGfpq6cp7+bqMuVmJKRm7yPlKKMnL6FkKWFipOEkLSE'. - 'j6qEhoqAiaB+jqd8haF7hZR4iJt4g5l3hZl2gIt2cod1hJVzeY'. - 'VzboJvhp9sfJJsb41peY1pd5xpdoVod4xndI5lcHxka4BjcYVg'. - 'Z3BfboFbb4lbZnZbYntaZ4laZYVZV3JYYWpXX3JWWm5VX4RVW2'. - 'NUYX9SXHxPWn5OVFxNWWtNVXVMVWFKV3xHUGZGU3dGTldFSlxE'. - 'Sk9ESXBCRlNBS3k/SGs/RU4+R1k9R2U6RFU2PUg0PEQxNU0ECL'. - 'QWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAA'. - 'CxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGQmbJetrAAAAtklEQV'. - 'R4nGNgwAK4JZTNNOWlYDxhMT4ZDTOzQE1uMF9CiJWVU0LbxDlS'. - 'G8QVF+FnZ2KRNHAIiPUHaZGSlmZj5lH19A1KjLUA8lXU5MWllF'. - 'yjo30TYr2BfG19G11b37CEeN84H38gX1HbwTUkOjo+zjfG3hLI'. - 'l1exCvCNCwnxjfMz0gTyRdXNHXx9fUNCQu2MwU6SN3ZwD42LCH'. - 'W30IK4T8vUJSAkNMhDiwPqYiktXWN9JZj7UQAAjWEfhlG+kScA'. - 'AAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAMAAAAMCGV4AAABJl'. + 'BMVEX////////o8v/f6O7W4OnR3PXL1OTL0evEyLvCzePAwMC/'. + 'v7a8wsq7t7C1xum1vtS1q6GzopmyxeKsrsOqvNWoq7anvN+nsb'. + 'qhrcGgqbGfpq6cp7+bqMuVmJKRm7yPlKKMnL6FkKWFipOEkLSE'. + 'j6qEhoqAiaB+jqd8haF7hZR4iJt4g5l3hZl2gIt2cod1hJVzeY'. + 'VzboJvhp9sfJJsb41peY1pd5xpdoVod4xndI5lcHxka4BjcYVg'. + 'Z3BfboFbb4lbZnZbYntaZ4laZYVZV3JYYWpXX3JWWm5VX4RVW2'. + 'NUYX9SXHxPWn5OVFxNWWtNVXVMVWFKV3xHUGZGU3dGTldFSlxE'. + 'Sk9ESXBCRlNBS3k/SGs/RU4+R1k9R2U6RFU2PUg0PEQxNU0ECL'. + 'QWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAA'. + 'CxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGQmbJetrAAAAtklEQV'. + 'R4nGNgwAK4JZTNNOWlYDxhMT4ZDTOzQE1uMF9CiJWVU0LbxDlS'. + 'G8QVF+FnZ2KRNHAIiPUHaZGSlmZj5lH19A1KjLUA8lXU5MWllF'. + 'yjo30TYr2BfG19G11b37CEeN84H38gX1HbwTUkOjo+zjfG3hLI'. + 'l1exCvCNCwnxjfMz0gTyRdXNHXx9fUNCQu2MwU6SN3ZwD42LCH'. + 'W30IK4T8vUJSAkNMhDiwPqYiktXWN9JZj7UQAAjWEfhlG+kScA'. + 'AAAASUVORK5CYII=' ; //========================================================== @@ -595,42 +595,42 @@ class ImgData_Balls extends ImgData //========================================================== $this->imgdata_small[6][0]= 666 ; $this->imgdata_small[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABX1'. - 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. - 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. - 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. - 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. - '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. - 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. - 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. - 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. - 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. - 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAwkUGRjxlcuZAAAAtElEQVR4nGNgIBZw8osqqIpzw/msfI'. - 'IiUmr6lo6SbFARASEOJiYtQ2uXADmIAJeEGFBE18LBMySBBywi'. - 'LC/LwcFiZuvmH5WiAxZR0tRW1DC3dfYJS8zyAouYGBibWtm7+o'. - 'TEpZfkgEX0rG3snNx9Q2NSCksgaqRd3Ty8gyLiU/NKSiDmcPsF'. - 'BodHJ2UUlZTkQ+xikIlNSE7LLgECZagL2VQyc0H8YnV2uD94jS'. - 'ILIo14iQ4HALarJBNwbJVNAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABX1'. + 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. + 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. + 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. + 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. + '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. + 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. + 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. + 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. + 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. + 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAwkUGRjxlcuZAAAAtElEQVR4nGNgIBZw8osqqIpzw/msfI'. + 'IiUmr6lo6SbFARASEOJiYtQ2uXADmIAJeEGFBE18LBMySBBywi'. + 'LC/LwcFiZuvmH5WiAxZR0tRW1DC3dfYJS8zyAouYGBibWtm7+o'. + 'TEpZfkgEX0rG3snNx9Q2NSCksgaqRd3Ty8gyLiU/NKSiDmcPsF'. + 'BodHJ2UUlZTkQ+xikIlNSE7LLgECZagL2VQyc0H8YnV2uD94jS'. + 'ILIo14iQ4HALarJBNwbJVNAAAAAElFTkSuQmCC' ; //========================================================== // File: bs_purple.png //========================================================== $this->imgdata_small[7][0]= 447 ; $this->imgdata_small[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAnF'. - 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. - 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. - 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. - 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. - 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGS'. - 'o5QpoZAAAAnElEQVR4nI3Q2xJDMBAG4MyQokWrZz3oSkJISJH3'. - 'f7dK0Gv/Xb7J7vyzCK0NjtPsHuH/2wlhTE7LnTNLCO/TFQjjIp'. - 'hHAA6bY06LSqppMAY47x+04HXTba2kAFlmQKr+YuVDCGUG2k6/'. - 'rNwYK8rKwKCnPxHnVS0aA3rag4UQslUGhrlk0Kpv1+sx3tLZ6w'. - 'dtYemMkOsnz8R3V9/hB87DEu2Wos5+AAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAnF'. + 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. + 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. + 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. + 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. + 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGS'. + 'o5QpoZAAAAnElEQVR4nI3Q2xJDMBAG4MyQokWrZz3oSkJISJH3'. + 'f7dK0Gv/Xb7J7vyzCK0NjtPsHuH/2wlhTE7LnTNLCO/TFQjjIp'. + 'hHAA6bY06LSqppMAY47x+04HXTba2kAFlmQKr+YuVDCGUG2k6/'. + 'rNwYK8rKwKCnPxHnVS0aA3rag4UQslUGhrlk0Kpv1+sx3tLZ6w'. + 'dtYemMkOsnz8R3V9/hB87DEu2Wos5+AAAAAElFTkSuQmCC' ; //========================================================== @@ -638,62 +638,62 @@ class ImgData_Balls extends ImgData //========================================================== $this->imgdata_small[8][0]= 677 ; $this->imgdata_small[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABaF'. - 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. - 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. - 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. - 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. - '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. - 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. - 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. - 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. - 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. - 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. - 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLd'. - 'fvwAAAAHdElNRQfTAwkUGho0tvl2AAAAtklEQVR4nGNgIBaoSg'. - 'mLKGpowfkGMty8AqJKpi4mRlAROR5ONg4JFUv3YHOIgDo/HwsT'. - 'q6yps29EsjZYREFIkJ2ZS9/OMzA20wEsIi8uKSZtaOPmH5WSFw'. - 'YW0VRW07Vw8vCLSMguLwCL6FlaObp6B0TGZxSXQ9TouHv6+IXG'. - 'JGYWlpdDzNEKCgmPjkvLKS0vL4LYxWAen5SelV8OBNZQFxrZ5h'. - 'aC+GX2MDczMBh7pZakehkTHQ4AA0Am/jsB5gkAAAAASUVORK5C'. - 'YII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABaF'. + 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. + 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. + 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. + 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. + '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. + 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. + 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. + 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. + 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. + 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. + 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLd'. + 'fvwAAAAHdElNRQfTAwkUGho0tvl2AAAAtklEQVR4nGNgIBaoSg'. + 'mLKGpowfkGMty8AqJKpi4mRlAROR5ONg4JFUv3YHOIgDo/HwsT'. + 'q6yps29EsjZYREFIkJ2ZS9/OMzA20wEsIi8uKSZtaOPmH5WSFw'. + 'YW0VRW07Vw8vCLSMguLwCL6FlaObp6B0TGZxSXQ9TouHv6+IXG'. + 'JGYWlpdDzNEKCgmPjkvLKS0vL4LYxWAen5SelV8OBNZQFxrZ5h'. + 'aC+GX2MDczMBh7pZakehkTHQ4AA0Am/jsB5gkAAAAASUVORK5C'. + 'YII=' ; //========================================================== // File: bs_blue.png //========================================================== $this->imgdata_small[9][0]= 436 ; $this->imgdata_small[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. - 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. - 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. - 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. - 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. - 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGhNNakHSAAAAmk'. - 'lEQVR4nI3P2xKCIBAGYGfM6SBWo1nauIqogaDA+z9dK9Lhrv47'. - 'vtl/2A2CfxNlJRRp9IETYGraJeEb7ocLNKznia8A7Db7umWDUG'. - 'sxAzhurxRHxok4KQGqCuEhlL45oU1D2w5BztY4KRhj/bCAsetM'. - '2uObjwvY8/oX50JItYDxSyZSTrO2mNhvGMbaWAevnbFIcpuTr7'. - 't+5AkyfBIKSJHdSQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAk1'. + 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. + 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. + 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. + 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. + 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGhNNakHSAAAAmk'. + 'lEQVR4nI3P2xKCIBAGYGfM6SBWo1nauIqogaDA+z9dK9Lhrv47'. + 'vtl/2A2CfxNlJRRp9IETYGraJeEb7ocLNKznia8A7Db7umWDUG'. + 'sxAzhurxRHxok4KQGqCuEhlL45oU1D2w5BztY4KRhj/bCAsetM'. + '2uObjwvY8/oX50JItYDxSyZSTrO2mNhvGMbaWAevnbFIcpuTr7'. + 't+5AkyfBIKSJHdSQAAAABJRU5ErkJggg==' ; //========================================================== // File: bs_green.png //========================================================== $this->imgdata_small[10][0]= 452 ; $this->imgdata_small[10][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAn1'. - 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. - '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. - 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. - '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. - 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. - 'AIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAw'. - 'kUGgW5vvSDAAAAnklEQVR4nI3QSxKCMAwA0M4gqCgoiiJ+kEAL'. - 'LQUq0PufzX7ENdnlJZNkgtDS2CYZvK6bf+7EoKLA9cH5SQzv6A'. - 'YloTywsAbYr44FrlgrXCMJwHl3xxVtuuFkJAPIcw2tGB9GcFli'. - 'oqEf5GTkSUhVMw2TtD0XSlnDOw3SznE5520vNEi7CwW9+Ayjyq'. - 'U/3+yPuq5gvhkhL0xlGnqL//AFf14UIh4mkEkAAAAASUVORK5C'. - 'YII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAn1'. + 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. + '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. + 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. + '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. + 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. + 'AIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAw'. + 'kUGgW5vvSDAAAAnklEQVR4nI3QSxKCMAwA0M4gqCgoiiJ+kEAL'. + 'LQUq0PufzX7ENdnlJZNkgtDS2CYZvK6bf+7EoKLA9cH5SQzv6A'. + 'YloTywsAbYr44FrlgrXCMJwHl3xxVtuuFkJAPIcw2tGB9GcFli'. + 'oqEf5GTkSUhVMw2TtD0XSlnDOw3SznE5520vNEi7CwW9+Ayjyq'. + 'U/3+yPuq5gvhkhL0xlGnqL//AFf14UIh4mkEkAAAAASUVORK5C'. + 'YII=' ; //========================================================== @@ -701,19 +701,19 @@ class ImgData_Balls extends ImgData //========================================================== $this->imgdata_small[11][0]= 480 ; $this->imgdata_small[11][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFTsY/ewvBQAAAW1JREFUeJytkz2u4jAUhT/jic'. - 'gfBUKiZhE0bIKeVbCWrIKenp6eDiGlCEEEBArIxvzGU4xeZjLk'. - 'jWb05lRXuvbx+exr4bouX1Xjyw7Atz81F4uFBYjjGIDhcCjq1o'. - 'k6nN1uZwFerxfP55Msy1itVmRZBsB4PK6YveHkeW5d18XzPIIg'. - 'wPd9Wq0WnU6HMAxJkoQoiuynOIfDwUopkVIihKAoCgAcx6Hdbm'. - 'OMIU1T5vN55eBKEikljUYDIX6kFUKU9e8aDAZlmjcca+1b7TgO'. - '1+uVy+VS9nzfr8e53++VzdZaiqIgz3OMMWitOZ/PaK0JgqDeRC'. - 'mF53lIKYGfr3O73TDGoJQiTVO01nS73XqT4/FIs9kkCAIej0eZ'. - 'brPZEMcxSZKgtQZgMpmIWpN+vy+m06n1PK9yTx8Gy+WS/X5Pr9'. - 'er9GuHLYoiG4YhSilOpxPr9Zrtdlti/JriU5MPjUYjq7UuEWaz'. - '2d+P/b/qv/zi75oetJcv7QQXAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAAQCAYAAADwMZRfAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFTsY/ewvBQAAAW1JREFUeJytkz2u4jAUhT/jic'. + 'gfBUKiZhE0bIKeVbCWrIKenp6eDiGlCEEEBArIxvzGU4xeZjLk'. + 'jWb05lRXuvbx+exr4bouX1Xjyw7Atz81F4uFBYjjGIDhcCjq1o'. + 'k6nN1uZwFerxfP55Msy1itVmRZBsB4PK6YveHkeW5d18XzPIIg'. + 'wPd9Wq0WnU6HMAxJkoQoiuynOIfDwUopkVIihKAoCgAcx6Hdbm'. + 'OMIU1T5vN55eBKEikljUYDIX6kFUKU9e8aDAZlmjcca+1b7TgO'. + '1+uVy+VS9nzfr8e53++VzdZaiqIgz3OMMWitOZ/PaK0JgqDeRC'. + 'mF53lIKYGfr3O73TDGoJQiTVO01nS73XqT4/FIs9kkCAIej0eZ'. + 'brPZEMcxSZKgtQZgMpmIWpN+vy+m06n1PK9yTx8Gy+WS/X5Pr9'. + 'er9GuHLYoiG4YhSilOpxPr9Zrtdlti/JriU5MPjUYjq7UuEWaz'. + '2d+P/b/qv/zi75oetJcv7QQXAAAAAElFTkSuQmCC' ; //========================================================== @@ -721,346 +721,346 @@ class ImgData_Balls extends ImgData //========================================================== $this->imgdata_small[12][0]= 633 ; $this->imgdata_small[12][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABPl'. - 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. - '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. - 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. - '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. - 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. - '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. - '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. - 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. - 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwkUGQDi+VPPAAAAtElEQVR4nGNgIBawikipyIiy'. - 'wfksfJpGRkamNtr8LFARPiMFHmFDcztXfwGoFi0jLiZuZRtnry'. - 'BddrCIiJEGL6eklYO7X3iCOFhE2thESdHawdUnJDZFDiyiamZh'. - 'aevk5h0UlZSpBhaRtbN3dPHwDY5MSM+EqBFzc/f0DgiLTkjLzI'. - 'SYw6bjHxgaEZeckZmpD7GLQSAqJj4xNRMIBGFuFtRLA/ENhGBu'. - 'ZmDgkJBXl5fgIDocAAKcINaFePT4AAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAABPl'. + 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. + '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. + 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. + '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. + 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. + '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. + '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. + 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. + 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwkUGQDi+VPPAAAAtElEQVR4nGNgIBawikipyIiy'. + 'wfksfJpGRkamNtr8LFARPiMFHmFDcztXfwGoFi0jLiZuZRtnry'. + 'BddrCIiJEGL6eklYO7X3iCOFhE2thESdHawdUnJDZFDiyiamZh'. + 'aevk5h0UlZSpBhaRtbN3dPHwDY5MSM+EqBFzc/f0DgiLTkjLzI'. + 'SYw6bjHxgaEZeckZmpD7GLQSAqJj4xNRMIBGFuFtRLA/ENhGBu'. + 'ZmDgkJBXl5fgIDocAAKcINaFePT4AAAAAElFTkSuQmCC' ; //========================================================== // File: bs_bluegreen.png //========================================================== $this->imgdata_small[13][0]= 493 ; $this->imgdata_small[13][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAvV'. - 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. - 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. - '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. - 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. - '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. - 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. - 'AJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGxNUcXCT'. - 'AAAAqUlEQVR4nI2Q1xKCMBREM2NHLCCogAGCjd6SqLT8/2cZKT'. - '6zb3tm987OBWCsXoejp8rC35fi4+l6gXFZlD0Rz6fZ1tdDmKR9'. - 'RdOmkzmP7DDpilfX3SzvRgQ/Vr1uiZplfsCBiVf03RJd140wgj'. - 'kmNqMtuYXcxyYmNWJdRoYwzpM9qRvGujuCmSR7q7ARY00/MiWk'. - 'sCnjkobNEm1+HknDZgAqR0GKU43+wxdu2hYzbsHU6AAAAABJRU'. - '5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAvV'. + 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. + 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. + '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. + 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. + '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. + 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. + 'AJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGxNUcXCT'. + 'AAAAqUlEQVR4nI2Q1xKCMBREM2NHLCCogAGCjd6SqLT8/2cZKT'. + '6zb3tm987OBWCsXoejp8rC35fi4+l6gXFZlD0Rz6fZ1tdDmKR9'. + 'RdOmkzmP7DDpilfX3SzvRgQ/Vr1uiZplfsCBiVf03RJd140wgj'. + 'kmNqMtuYXcxyYmNWJdRoYwzpM9qRvGujuCmSR7q7ARY00/MiWk'. + 'sCnjkobNEm1+HknDZgAqR0GKU43+wxdu2hYzbsHU6AAAAABJRU'. + '5ErkJggg==' ; //========================================================== // File: bs_lightred.png //========================================================== $this->imgdata_small[14][0]= 532 ; $this->imgdata_small[14][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAA3l'. - 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. - 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. - 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. - 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. - 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. - 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. - 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGjoP2Nm+AAAAr0'. - 'lEQVR4nGNgIBaYiOk62imYwPnMkiIyso76yhJSzFARMxkRNk49'. - 'a3t5OW6oFk1LVkYOfWUHKxUXiEYzLS12DnN3VXkjIRtFsIiSk5'. - '6evqGqhYGKugAfWMRa1FpD2UHeQEXQRlgALCJur+rgbCUNFOAS'. - 'hqjRkZe3MpBTcwEKCEPMMTGSs3Xz8OQHCnBBHckt6OJpIyAMBD'. - 'wwN/MYc4H4LK4wNzMwmGrzcvFqmxIdDgDiHRT6VVQkrAAAAABJ'. - 'RU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAA3l'. + 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. + 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. + 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. + 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. + 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. + 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. + 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAwkUGjoP2Nm+AAAAr0'. + 'lEQVR4nGNgIBaYiOk62imYwPnMkiIyso76yhJSzFARMxkRNk49'. + 'a3t5OW6oFk1LVkYOfWUHKxUXiEYzLS12DnN3VXkjIRtFsIiSk5'. + '6evqGqhYGKugAfWMRa1FpD2UHeQEXQRlgALCJur+rgbCUNFOAS'. + 'hqjRkZe3MpBTcwEKCEPMMTGSs3Xz8OQHCnBBHckt6OJpIyAMBD'. + 'wwN/MYc4H4LK4wNzMwmGrzcvFqmxIdDgDiHRT6VVQkrAAAAABJ'. + 'RU5ErkJggg==' ; //========================================================== // File: bxs_lightred.png //========================================================== $this->imgdata_xsmall[0][0]= 432 ; $this->imgdata_xsmall[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAA3l'. - 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. - 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. - 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. - 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. - 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. - 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. - 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKBOgGhWjAAAAS0'. - 'lEQVR4nGNgQAEmunYmEJaMCKe1vBxYzJKVQ9lKBSSupKdnaKGi'. - 'zgdkiqs6WKnYcIGYJnK2HvzCwmCNgi42wsLCECNMeXlNUY0HAL'. - 'DaB7Du8MiEAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAA3l'. + 'BMVEX///////+/v7/Gvb0hGBj/5///3v//zu//1u//xucpGCG9'. + 'nK21lKVSQkp7Wms5KTExISlaOUpjQlIhEBj/tdbOhKXnrcbGjK'. + 'Wla4TetcbGnK2EWmv/rc73pcZ7UmOcY3vOpbW1jJzenLW9e5Rz'. + 'Slq1c4xrQlJSOULGhJz/pcb3nL2chIzOnK33rcbelK3WjKWMWm'. + 'vGe5SEUmM5ISnOtb3GrbXerb3vpb2ca3v/rcaUY3POhJxCKTF7'. + 'SlrWnK21e4ytc4TvnLXnlK2la3taOUK1lJxrSlLGhJRjQkpSMT'. + 'lw+q2nAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKBOgGhWjAAAAS0'. + 'lEQVR4nGNgQAEmunYmEJaMCKe1vBxYzJKVQ9lKBSSupKdnaKGi'. + 'zgdkiqs6WKnYcIGYJnK2HvzCwmCNgi42wsLCECNMeXlNUY0HAL'. + 'DaB7Du8MiEAAAAAElFTkSuQmCC' ; //========================================================== // File: bxs_bluegreen.png //========================================================== $this->imgdata_xsmall[1][0]= 397 ; $this->imgdata_xsmall[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAvV'. - 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. - 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. - '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. - 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. - '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. - 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. - 'AJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKDVyF5Be'. - 'AAAASUlEQVR4nGNgQAFmYqJcEJaEOJ+UrD5YTJKFTZrfGCQuaq'. - 'glLWvMaQ5kqujo6hnbKIKYXPr68gp2dmCNJiZAlh3ECGsREWtU'. - '4wF1kwdpAHfnSwAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAvV'. + 'BMVEX///////+/v79j//855/8x3v851v9Spb1C1v8AOUqEtcZK'. + 'lK1StdYxzv8hxv8AY4QASmNSlK1KpcZKtd4YQlIYnM4YrecIvf'. + '8AtfcAre8AjL0AhLUAc5wAa5QAWnsAQloAKTkAGCFKhJxKrdYY'. + 'jL0Ypd4Atf8ArfcApecAnN4AlM4AjMYAe60Ac6UAY4wAUnNSnL'. + '0AlNYAWoQASmsAOVIAITGEtc4YWnsAUnsAMUqtvcaErcYAKUIA'. + 'GCkAECHUyVh/AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAA'. + 'AJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUKDVyF5Be'. + 'AAAASUlEQVR4nGNgQAFmYqJcEJaEOJ+UrD5YTJKFTZrfGCQuaq'. + 'glLWvMaQ5kqujo6hnbKIKYXPr68gp2dmCNJiZAlh3ECGsREWtU'. + '4wF1kwdpAHfnSwAAAABJRU5ErkJggg==' ; //========================================================== // File: bxs_navy.png //========================================================== $this->imgdata_xsmall[2][0]= 353 ; $this->imgdata_xsmall[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. - 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. - 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. - 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. - 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. - 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJxXO4axZAAAAR0'. - 'lEQVR4nGNgQAGskhKsEJaslIi8ijpYTJaDU1FVAyQuKSujoKKh'. - 'LQ5kSigpqWro6oOYrOoaWroGBmCNWiCWAdQwUVFWVOMBOp4GCJ'. - 's5S60AAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. + 'BMVEX///////+/v7+trcbGxv+EhM6EhNaEhP97e/9zc/9ra/9S'. + 'UsZKSrVSUs5jY/9SUtZKSsZSUudKSt5KSudKSv8YGIQpKf8YGK'. + 'UYGN4YGO8YGPcQEP8ICP8AAP8AAPcAAO8AAOcAAN4AANYAAM4A'. + 'AMYAAL0AALUAAK0AAKUAAJwAAJQAAIwAAIQAAHsAAHMAAGsAAG'. + 'ONFkFbAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJxXO4axZAAAAR0'. + 'lEQVR4nGNgQAGskhKsEJaslIi8ijpYTJaDU1FVAyQuKSujoKKh'. + 'LQ5kSigpqWro6oOYrOoaWroGBmCNWiCWAdQwUVFWVOMBOp4GCJ'. + 's5S60AAAAASUVORK5CYII=' ; //========================================================== // File: bxs_gray.png //========================================================== $this->imgdata_xsmall[3][0]= 492 ; $this->imgdata_xsmall[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABI1'. - 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. - 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. - 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. - 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. - 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. - 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. - '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. - 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. - 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEA'. - 'AAsRAX9kX5EAAAAHdElNRQfTAwkUKC74clmyAAAAQklEQVR4nG'. - 'NgQAVBYVCGt5dXYEQ0mOnp5h4QFgVmeri6+4dHxYMVeHoFRUTH'. - 'gTUFBIZBWAwMkZEx8bFQM2Lj0UwHANc/DV6yq/BiAAAAAElFTk'. - 'SuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABI1'. + 'BMVEX///8AAAD8EAD8IAD8NAD8RAD8VAAYGBi/v7+goKCCgoJk'. + 'ZGRGRkb8yAD83AD87AD8/AD4+ADo+ADY+ADI+AC0+ACk+ACU+A'. + 'CE+AB0/ABk/ABU/ABE/AAw/AAg/AAQ/AAA/AAA+AAA6BAA2CAA'. + 'yDQAtEQApFQAlGQAhHQAdIgAZJgAVKgARLgAMMgAINwAEOwAAP'. + 'wAAPgIAPAQAOgYAOAkANgsANA0AMg8AMBEALhMALBUAKhcAKBo'. + 'AJhwAJB4AIiAAID////4+Pjy8vLs7Ozm5ubg4ODa2trT09PNzc'. + '3Hx8fBwcG7u7u1tbWurq6oqKiioqKcnJyWlpaQkJCJiYmDg4N9'. + 'fX13d3dxcXFra2tkZGReXl5YWFhSUlJMTExGRkZAQEA1BLn4AA'. + 'AAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEA'. + 'AAsRAX9kX5EAAAAHdElNRQfTAwkUKC74clmyAAAAQklEQVR4nG'. + 'NgQAVBYVCGt5dXYEQ0mOnp5h4QFgVmeri6+4dHxYMVeHoFRUTH'. + 'gTUFBIZBWAwMkZEx8bFQM2Lj0UwHANc/DV6yq/BiAAAAAElFTk'. + 'SuQmCC' ; //========================================================== // File: bxs_graypurple.png //========================================================== $this->imgdata_xsmall[4][0]= 542 ; $this->imgdata_xsmall[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABSl'. - 'BMVEX////////11P/MqdvKrNfAwMC+u7+9u7+4rr24lsi3rby3'. - 'lMe1rLq1o720q7i0oL20ksSzoryyqbaykMGxlb2wkL+vnbiujb'. - '2sjLuri7qpl7GoirWoibenmK2mla6mjLKmhrSllauki7CjhrCj'. - 'hLGihLChg6+ggq2fkqadkKOcfqqai6Gag6WYe6WXeqSWeaOTd6'. - 'CTd5+Rdp6RdZ6RdZ2Qg5eOc5qMcpiLcZeJb5WIbpOHbZKGbJGE'. - 'a4+CaY2AZ4t/Z4p/Zop/Zol+Zol7ZIZ6Y4V5YoR1ZH11X391Xn'. - '9zXX1yXXtxXHtvWnluWXhsV3VqVnNpVXJoVHFnU3BmUm9jUGth'. - 'VGdgTmheTGZcS2RcSmRaSWJYR19XRl5SQllRQlhQQVdPQFZOP1'. - 'VLPlFJO09IPE5IOk5FOEtEN0lDOEpDOElDNklCNkc/M0XhbrfD'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. - 'EAAAsRAX9kX5EAAAAHdElNRQfTAwkUKCgREfyHAAAATUlEQVR4'. - 'nGNgQAEcIko8EBY3M5Ougy+IxSXMwmTsFsAHZMqrSRvZB0W7A5'. - 'k6FlYugXEZICaPr394Um4uSAFDRFRCbm4uxAihsDAhVOMBHT0L'. - 'hkeRpo8AAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABSl'. + 'BMVEX////////11P/MqdvKrNfAwMC+u7+9u7+4rr24lsi3rby3'. + 'lMe1rLq1o720q7i0oL20ksSzoryyqbaykMGxlb2wkL+vnbiujb'. + '2sjLuri7qpl7GoirWoibenmK2mla6mjLKmhrSllauki7CjhrCj'. + 'hLGihLChg6+ggq2fkqadkKOcfqqai6Gag6WYe6WXeqSWeaOTd6'. + 'CTd5+Rdp6RdZ6RdZ2Qg5eOc5qMcpiLcZeJb5WIbpOHbZKGbJGE'. + 'a4+CaY2AZ4t/Z4p/Zop/Zol+Zol7ZIZ6Y4V5YoR1ZH11X391Xn'. + '9zXX1yXXtxXHtvWnluWXhsV3VqVnNpVXJoVHFnU3BmUm9jUGth'. + 'VGdgTmheTGZcS2RcSmRaSWJYR19XRl5SQllRQlhQQVdPQFZOP1'. + 'VLPlFJO09IPE5IOk5FOEtEN0lDOEpDOElDNklCNkc/M0XhbrfD'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'EAAAsRAX9kX5EAAAAHdElNRQfTAwkUKCgREfyHAAAATUlEQVR4'. + 'nGNgQAEcIko8EBY3M5Ougy+IxSXMwmTsFsAHZMqrSRvZB0W7A5'. + 'k6FlYugXEZICaPr394Um4uSAFDRFRCbm4uxAihsDAhVOMBHT0L'. + 'hkeRpo8AAAAASUVORK5CYII=' ; //========================================================== // File: bxs_red.png //========================================================== $this->imgdata_xsmall[5][0]= 357 ; $this->imgdata_xsmall[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. - 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. - 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. - 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. - 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. - 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. - 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIyjy5SVMAAAAS0'. - 'lEQVR4nGNgQAFsUpJsEJastIi8ijpYTJaDU0FVgxXIlJKVUVDR'. - '0BYHMiUUlVQ1dPVBTDZ1dS1dAwOQAgYtbSDLAGIEq6goK6rxAD'. - 'yXBg73lwGUAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAk1'. + 'BMVEX////////GxsbGra3/xsbOhITWhIT/hIT/e3v/c3P/a2vG'. + 'UlK1SkrOUlL/Y2PWUlLGSkrnUlLeSkrnSkr/SkqEGBj/KSmlGB'. + 'jeGBjvGBj3GBj/EBD/CAj/AAD3AADvAADnAADeAADWAADOAADG'. + 'AAC9AAC1AACtAAClAACcAACUAACMAACEAAB7AABzAABrAABjAA'. + 'BuukXBAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZ'. + 'cwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIyjy5SVMAAAAS0'. + 'lEQVR4nGNgQAFsUpJsEJastIi8ijpYTJaDU0FVgxXIlJKVUVDR'. + '0BYHMiUUlVQ1dPVBTDZ1dS1dAwOQAgYtbSDLAGIEq6goK6rxAD'. + 'yXBg73lwGUAAAAAElFTkSuQmCC' ; //========================================================== // File: bxs_yellow.png //========================================================== $this->imgdata_xsmall[6][0]= 414 ; $this->imgdata_xsmall[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAzF'. - 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. - 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. - 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. - 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. - 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. - '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. - 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAH'. - 'dElNRQfTAwkUIzoBXFQEAAAAS0lEQVR4nGNgQAFsDhJsEJaTo5'. - '2skj5YzMnSSk7ZwBzIlOSUklPiMxYHMnW4FXT5VNVBTDZeXiNV'. - 'QUGQAgYBYyBLEGIEq5gYK6rxAH4kBmHBaMQQAAAAAElFTkSuQm'. - 'CC' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAzF'. + 'BMVEX///////+/v79zYwCMewDOxoTWzoTezkr/5wj/5wDnzgDe'. + 'xgC1pQCtnACllACcjACUhABjWgDGvVK1rUrOxlLGvUqEexilnB'. + 'jv3hj35xj/7wj/7wD35wDv3gDn1gDezgDWxgDOvQDGtQC9rQCE'. + 'ewB7cwBzawBrYwDWzlLn3lLe1krn3kre1hi9tQC1rQCtpQClnA'. + 'CclACUjACMhAD/9wC/v7///8bOzoT//4T//3v//3P//2v//2Pn'. + '50r//0r//yn39xj//xD//wBjYwDO8noaAAAAAXRSTlMAQObYZg'. + 'AAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAH'. + 'dElNRQfTAwkUIzoBXFQEAAAAS0lEQVR4nGNgQAFsDhJsEJaTo5'. + '2skj5YzMnSSk7ZwBzIlOSUklPiMxYHMnW4FXT5VNVBTDZeXiNV'. + 'QUGQAgYBYyBLEGIEq5gYK6rxAH4kBmHBaMQQAAAAAElFTkSuQm'. + 'CC' ; //========================================================== // File: bxs_greenblue.png //========================================================== $this->imgdata_xsmall[7][0]= 410 ; $this->imgdata_xsmall[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAxl'. - 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. - '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. - '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. - 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. - 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. - 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. - 'dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfT'. - 'AwkUJy5/6kV9AAAATUlEQVR4nGNgQAGCyuyCEJaGugKHviVYzF'. - 'hO3sxCWwDIVNLTM9PXtpEGMhW12Cy0DR1ATEFLSxZ7BweQAgYd'. - 'HUMHBweIEQKiogKoxgMAo/4H5AfSehsAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAxl'. + 'BMVEX///////+/v79znJQhSkJ7raU5hHtjraVKnJRCjIRClIyU'. + '9++E595avbVaxr2/v7+ctbWcvb17nJxrjIx7paUxQkK9//+Mvb'. + '17ra2Evb17tbVCY2MQGBiU5+ec9/eM5+d71tZanJxjra1rvb1j'. + 'tbVSnJxara1rzs5jxsZKlJRChIQpUlIhQkJatbVSpaU5c3MxY2'. + 'MYMTEQISFavb1Sra1KnJxCjIw5e3sxa2spWlpClJQhSkoYOTkp'. + 'Y2MhUlIQKSkIGBgQMTH+e30mAAAAAXRSTlMAQObYZgAAAAFiS0'. + 'dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfT'. + 'AwkUJy5/6kV9AAAATUlEQVR4nGNgQAGCyuyCEJaGugKHviVYzF'. + 'hO3sxCWwDIVNLTM9PXtpEGMhW12Cy0DR1ATEFLSxZ7BweQAgYd'. + 'HUMHBweIEQKiogKoxgMAo/4H5AfSehsAAAAASUVORK5CYII=' ; //========================================================== // File: bxs_purple.png //========================================================== $this->imgdata_xsmall[8][0]= 364 ; $this->imgdata_xsmall[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAnF'. - 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. - 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. - 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. - 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. - 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIj'. - 'mBTjT/AAAASUlEQVR4nGNgQAGskhKsEJaCrJiSuhZYTEFASFlD'. - 'GyQuqSCnrK6tJwpkiquoamgbGIGYrFpaugbGxmCNunpAljHECB'. - 'ZBQRZU4wFSMAZsXeM71AAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAnF'. + 'BMVEX///////+/v7/Gvca9rb3Grcb/xv+1hLWte629hL21e7XG'. + 'hMbWhNbOe87We9b/hP//e/97OXv/c///a///Y/+cOZz/Sv/WOd'. + 'bnOefvOe//Kf9jCGNrCGv/EP//CP/nCOf/AP/3APfvAO/nAOfe'. + 'AN7WANbOAM7GAMa9AL21ALWtAK2lAKWcAJyUAJSMAIyEAIR7AH'. + 'tzAHNrAGtjAGPP1sZnAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUIj'. + 'mBTjT/AAAASUlEQVR4nGNgQAGskhKsEJaCrJiSuhZYTEFASFlD'. + 'GyQuqSCnrK6tJwpkiquoamgbGIGYrFpaugbGxmCNunpAljHECB'. + 'ZBQRZU4wFSMAZsXeM71AAAAABJRU5ErkJggg==' ; //========================================================== // File: bxs_green.png //========================================================== $this->imgdata_xsmall[9][0]= 370 ; $this->imgdata_xsmall[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAn1'. - 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. - '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. - 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. - '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. - 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. - 'AIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAw'. - 'kUKBrZxq0HAAAATElEQVR4nGNgQAGccrIcEJaivISyhjaIxa7I'. - 'I6CiqcMKZMopKqho6OhLA5kyqmqaOobGICartraeoYkJSAGDnj'. - '6QZQIxgk1Skg3VeABlVgbItqEBUwAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAn1'. + 'BMVEX///////+/v7+/v7/G/8aUxpSMvYyUzpSMzoyM1oxarVqE'. + '/4R7/3tavVpKnEpaxlpz/3Nr/2tKtUpj/2Na51pKzkpK1kpK50'. + 'pK/0oYcxgp/ykYlBgY3hgY7xgY9xgQ/xAI/wgA/wAA9wAA7wAA'. + '5wAA3gAA1gAAzgAAxgAAvQAAtQAArQAApQAAnAAAlAAAjAAAhA'. + 'AAewAAcwAAawAAYwA0tyxUAAAAAXRSTlMAQObYZgAAAAFiS0dE'. + 'AIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAw'. + 'kUKBrZxq0HAAAATElEQVR4nGNgQAGccrIcEJaivISyhjaIxa7I'. + 'I6CiqcMKZMopKqho6OhLA5kyqmqaOobGICartraeoYkJSAGDnj'. + '6QZQIxgk1Skg3VeABlVgbItqEBUwAAAABJRU5ErkJggg==' ; //========================================================== // File: bxs_darkgreen.png //========================================================== $this->imgdata_xsmall[10][0]= 563 ; $this->imgdata_xsmall[10][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABX1'. - 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. - 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. - 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. - 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. - '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. - 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. - 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. - 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. - 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. - 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. - 'RQfTAwkUKCFozUQjAAAATUlEQVR4nGNgQAGcoqrcEJYQB5OhSw'. - 'CIxSXGwWThGcIDZCppK5o7hyV6AZl6NnbuoSmFICZ3YHB0RkkJ'. - 'SAFDbEJaSUkJxAjeyEheVOMBQj4MOEkWew4AAAAASUVORK5CYI'. - 'I=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABX1'. + 'BMVEX////////l/+nAwMC86r+8wb28wby8wLy78sCzw7SywrSx'. + 'wLKwvrGuvK+syK+ryq2rx62n36ym3aumxKmk2qij0Keh16ahva'. + 'Og1aSguKKe06KeuaCetZ+d0KGdtZ+bz6Cay56ZyZ2Zwp2Zr5qZ'. + 'rpqYwJuXyZuXrJmVw5mUxZiTxJeTw5eTq5WRwJWPtJKOvZKKuI'. + '6Kt42Kn4yJt42ItIuGsomFsYmEsIiEr4eDr4eBrIR/qoN+qIJ8'. + 'poB7pH56o356on14nnt2nXl0mndzmnZzmXZymHVwlXNvlHJukn'. + 'FtiHBqjm1qjW1oi2toiWpniWplh2hlhmdkhWdig2VggGNgf2Je'. + 'fmFdfGBde19bbl1aeFxXdFpWclhVclhVcVdUcFZTb1VSbVRQal'. + 'JPaVFKY0xKYkxJYUtIYEpHX0lEWkZCWERCV0NCVkM/U0A+U0A+'. + 'UUA+UEA9Uj89UT48Tj45TDvewfrHAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. + 'RQfTAwkUKCFozUQjAAAATUlEQVR4nGNgQAGcoqrcEJYQB5OhSw'. + 'CIxSXGwWThGcIDZCppK5o7hyV6AZl6NnbuoSmFICZ3YHB0RkkJ'. + 'SAFDbEJaSUkJxAjeyEheVOMBQj4MOEkWew4AAAAASUVORK5CYI'. + 'I=' ; //========================================================== // File: bxs_cyan.png //========================================================== $this->imgdata_xsmall[11][0]= 530 ; $this->imgdata_xsmall[11][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABPl'. - 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. - '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. - 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. - '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. - 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. - '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. - '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. - 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. - 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA'. - 'AHdElNRQfTAwkUKQFKuFWqAAAATUlEQVR4nGNgQAGsUjJsEJaR'. - 'grC5qz9YzIiL28YriB3IlDZRsnYNiZUDMmXtHT2CE9JBTDb/wI'. - 'jkzEyQAoaomMTMzEyIERzy8hyoxgMAN2MLVPW0f4gAAAAASUVO'. - 'RK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABPl'. + 'BMVEX////////F///AwMCvxsaC1NSC0dGCz8+CzMyA//94//91'. + '//9q//9j//9X4uJX09NXz89Xx8dXxMRL//9L5uZL3d1L2NhLxs'. + 'ZLt7cv//8e9fUe8fEe7u4e398epqYehoYX//8L+PgK//8F9fUE'. + '/v4E5+cEb28EZ2cC//8C/v4C/f0CzMwCrq4Cjo4CdXUCaWkCZW'. + 'UB/PwA//8A/f0A+/sA8/MA7e0A7OwA6+sA5eUA5OQA4uIA4eEA'. + '3NwA2toA2NgA1dUA09MA0tIA0NAAysoAxsYAxcUAxMQAv78Avr'. + '4AvLwAtrYAtbUAs7MAsLAAra0Aq6sAqKgApaUApKQAoqIAoKAA'. + 'n58AmpoAlZUAk5MAkpIAkJAAj48AjIwAiYkAh4cAf38AfX0Ae3'. + 'sAenoAcnIAcHAAa2sAaWkAaGgAYmIUPEuTAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAA'. + 'AHdElNRQfTAwkUKQFKuFWqAAAATUlEQVR4nGNgQAGsUjJsEJaR'. + 'grC5qz9YzIiL28YriB3IlDZRsnYNiZUDMmXtHT2CE9JBTDb/wI'. + 'jkzEyQAoaomMTMzEyIERzy8hyoxgMAN2MLVPW0f4gAAAAASUVO'. + 'RK5CYII=' ; //========================================================== // File: bxs_orange.png //========================================================== $this->imgdata_xsmall[12][0]= 572 ; $this->imgdata_xsmall[12][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABaF'. - 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. - 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. - 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. - 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. - '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. - 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. - 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. - 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. - 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. - 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. - 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9k'. - 'X5EAAAAHdElNRQfTAwkUJBSSy88MAAAATUlEQVR4nGNgQAGqwo'. - 'paEBYPJ4eKezCIpc7HwmrqG6ENZMpLihm6RaWEAZl6Vo7ekRnF'. - 'IKZWSHhcTnk5SAFDfFJWeXk5xAjj1FRjVOMBeFwNcWYSLjsAAA'. - 'AASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABaF'. + 'BMVEX//////////8X/3oD/3nj/1HX/0Gr/xGP/rkv/gBf+iS/2'. + 'bAL1agDxaQDuZwDrZwLpZQDmZQLlZADjcx7gZATeYQDdZgraXw'. + 'DZXwHYXgDXiEvXZAvUjlfUXwXTjVfTbR7ShUvRbR7RWwDMWQDL'. + 'WADKooLKWADJoYLJgkvHWATGoILFn4LFgEvFVgDEZx7EVQDDt6'. + '/DVQDCt6/CnoLChlfCVADAwMC+hFe+UgC8UgC6UQC4gVe4UAC3'. + 'gVe3UAC1gFe1eUu1TwC1TgCzTgCwTQKuTACrSgCqSgCpSgCpSQ'. + 'CodEulSACkRwCiRgCdRACcRACaQwCYQgCWQgKVQQCVQACUQACS'. + 'UR6RPwCOPgCNPQCLPACKPACJOwCEOQCBOAB+NwB9NgB8NgB7NQ'. + 'B6NwJ4NAB3RR52MwB0MgBuLwBtLwBsLwBqLgBpLQBkLQJiKgBh'. + 'KgBgKwRcKABbKQJbJwBaKQRaJwBYKAJVJQDZvdIYAAAAAXRSTl'. + 'MAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9k'. + 'X5EAAAAHdElNRQfTAwkUJBSSy88MAAAATUlEQVR4nGNgQAGqwo'. + 'paEBYPJ4eKezCIpc7HwmrqG6ENZMpLihm6RaWEAZl6Vo7ekRnF'. + 'IKZWSHhcTnk5SAFDfFJWeXk5xAjj1FRjVOMBeFwNcWYSLjsAAA'. + 'AASUVORK5CYII=' ; //========================================================== // File: bxs_lightblue.png //========================================================== $this->imgdata_xsmall[13][0]= 554 ; $this->imgdata_xsmall[13][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABVl'. - 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. - 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. - '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. - 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. - 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. - 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. - 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. - 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. - 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. - 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. - 'gAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJziL'. - 'PvAsAAAATUlEQVR4nGNgQAHsQgqcEJYgG5Oegy+IxSHOxmTiFs'. - 'gFZMprKBnbB8e7AplaFlbOQUl5ICanX0BEWmEhSAFDVGxKYWEh'. - 'xAjusDBuVOMBJO8LrFHRAykAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAABVl'. + 'BMVEX////////d///AwMC7wcS08P+y+P+xxdCwxM+uws2twMur'. + 'vsinzNynytylzuKhyN6e5v6d5P+d1fOcwNWcu8ub4f+at8iZ3v'. + '+ZvdGY2/yW2f+VscGU1vuT1fqTr72Sx+SSxeKR0fWRz/GPz/OP'. + 'rr+OyeqMy+6Myu2LyeyKxueJudSGw+SGorGDvt+Cvd6CvN2Aud'. + 'p+uNd+t9Z9tdV8tdR8tNN6sc94r813rct2q8h0qcZ0qMVzp8Rx'. + 'o8Bwor5tn7ptnrptnrlsnbhqmbRpmbNpi51ol7Flkqtkkqtkka'. + 'pjj6hijaRhjaZgi6NfiqJfiaFdh55bhJtag5pZgphYgJZYf5VX'. + 'cn9Ve5FSeI1RdopRdYlQdYlPc4dPcoZPcoVNcINLboBLbH9GZn'. + 'hGZXdFZHZEY3RDYnJCXW4/W2s/WWg+Wmo7VmU7VGM7U2E6VGM6'. + 'VGI5UV82T1wGxheQAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHU'. + 'gAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElNRQfTAwkUJziL'. + 'PvAsAAAATUlEQVR4nGNgQAHsQgqcEJYgG5Oegy+IxSHOxmTiFs'. + 'gFZMprKBnbB8e7AplaFlbOQUl5ICanX0BEWmEhSAFDVGxKYWEh'. + 'xAjusDBuVOMBJO8LrFHRAykAAAAASUVORK5CYII=' ; //========================================================== // File: bxs_darkgray.png //========================================================== $this->imgdata_xsmall[14][0]= 574 ; $this->imgdata_xsmall[14][1]= - 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABm'. - 'JLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB'. - 'iElEQVR42k3QPU8TYRwA8P//ebkXrgdIColXRAOEkJqbaExMut'. - 'DBhE1GNjYHPg+DG6ODiU6QOLjVxITBcFKBYCstlAC2Bz17fe76'. - 'vLD6+wg/1FpTRFR5lpaub/u1eGBGaAT4HneD4OlXx7avtDYUjT'. - 'HQabd2Ti8e3vVSKzxrtHS32wIpFVldno22Nqvvg2Bhl0gp/aNm'. - 'vJ3qqXAtLIva+ks1H0wqlSXi4+d6+OFTfRsAfHJx2d1od24rZP'. - 'xP2HzopINr1mkesX7ccojqif0v9crxWXODZTno3+dNGA7uWLsd'. - 'mUYU4fHJCViMG9umLBmM4L6fagZGg9QKfjZ+Qfy3C3G/B3mugF'. - 'IHHNcDf64E3KJALApk2p8CSolUUqLjFkyxOGMsTtFyJ+Wz57NQ'. - '8DghS4sLB0svioeZZo7nPhFoUKZDIVFbglkTTnl5/rC8snjAkJ'. - 'Bk/XV5LxHC/v7tR8jzTFPbg8LENK9WX0Vv31T2AEmCSmlKCCoh'. - 'ROnP1U1tPFYjJBRcbtzSf+GPsFTAQBq1n4AAAABKdEVYdHNpZ2'. - '5hdHVyZQBiYzYyMDIyNjgwYThjODMyMmUxNjk0NWUzZjljOGFh'. - 'N2VmZWFhMjA4OTE2ZjkwOTdhZWE1MzYyMjk0MWRkM2I5EqaPDA'. - 'AAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAABm'. + 'JLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAAsRAAALEQF/ZF+RAAAB'. + 'iElEQVR42k3QPU8TYRwA8P//ebkXrgdIColXRAOEkJqbaExMut'. + 'DBhE1GNjYHPg+DG6ODiU6QOLjVxITBcFKBYCstlAC2Bz17fe76'. + 'vLD6+wg/1FpTRFR5lpaub/u1eGBGaAT4HneD4OlXx7avtDYUjT'. + 'HQabd2Ti8e3vVSKzxrtHS32wIpFVldno22Nqvvg2Bhl0gp/aNm'. + 'vJ3qqXAtLIva+ks1H0wqlSXi4+d6+OFTfRsAfHJx2d1od24rZP'. + 'xP2HzopINr1mkesX7ccojqif0v9crxWXODZTno3+dNGA7uWLsd'. + 'mUYU4fHJCViMG9umLBmM4L6fagZGg9QKfjZ+Qfy3C3G/B3mugF'. + 'IHHNcDf64E3KJALApk2p8CSolUUqLjFkyxOGMsTtFyJ+Wz57NQ'. + '8DghS4sLB0svioeZZo7nPhFoUKZDIVFbglkTTnl5/rC8snjAkJ'. + 'Bk/XV5LxHC/v7tR8jzTFPbg8LENK9WX0Vv31T2AEmCSmlKCCoh'. + 'ROnP1U1tPFYjJBRcbtzSf+GPsFTAQBq1n4AAAABKdEVYdHNpZ2'. + '5hdHVyZQBiYzYyMDIyNjgwYThjODMyMmUxNjk0NWUzZjljOGFh'. + 'N2VmZWFhMjA4OTE2ZjkwOTdhZWE1MzYyMjk0MWRkM2I5EqaPDA'. + 'AAAABJRU5ErkJggg==' ; } } diff --git a/onyx2/include/jpgraph/imgdata_bevels.inc.php b/onyx2/include/jpgraph/imgdata_bevels.inc.php index eb8bd27..3c3b75a 100644 --- a/onyx2/include/jpgraph/imgdata_bevels.inc.php +++ b/onyx2/include/jpgraph/imgdata_bevels.inc.php @@ -1,102 +1,102 @@ 'imgdata'); - + protected $colors = array('green','purple','orange','red','yellow'); protected $index = array('green'=>1,'purple'=>4,'orange'=>2,'red'=>0,'yellow'=>3); protected $maxidx = 4 ; protected $imgdata ; - public function __construct() + public function ImgData_Bevels() { //========================================================== // File: bullets_balls_red_013.png //========================================================== $this->imgdata[0][0]= 337 ; $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/f3+LFwcmNxMuxm62DmqKth1VpZmIWg6fv'. - 'HCa7K0BwMEytCjFnIyUlEBg9vhQvAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNhk+pYJVAAAAl0lEQVR4nE2Q2xLDIAgFHUWBKJf//9'. - 'oekmbafVDZARRbK/pYTKP9WNcNv64zzUdd9BjmrgnsVXRNSzO3'. - 'CJ5ahdhy0XKQkxld1kxb45j7dp0x2lBNOyVgQpMaoadX7Hs7zr'. - 'P1yKj47DKBnKaBKiSAkNss7O6PkMx6kIgYXISQJpcZCqdY6KR+'. - 'J1PkS5Xob/h7MNz8x6D3fz5DKQjpkZOBYAAAAABJRU5ErkJggg'. - '==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/f3+LFwcmNxMuxm62DmqKth1VpZmIWg6fv'. + 'HCa7K0BwMEytCjFnIyUlEBg9vhQvAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNhk+pYJVAAAAl0lEQVR4nE2Q2xLDIAgFHUWBKJf//9'. + 'oekmbafVDZARRbK/pYTKP9WNcNv64zzUdd9BjmrgnsVXRNSzO3'. + 'CJ5ahdhy0XKQkxld1kxb45j7dp0x2lBNOyVgQpMaoadX7Hs7zr'. + 'P1yKj47DKBnKaBKiSAkNss7O6PkMx6kIgYXISQJpcZCqdY6KR+'. + 'J1PkS5Xob/h7MNz8x6D3fz5DKQjpkZOBYAAAAABJRU5ErkJggg'. + '==' ; //========================================================== // File: bullets_balls_green_013.png //========================================================== $this->imgdata[1][0]= 344 ; $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/e3+K3vriUub/Dm18j4xc3ob10k0ItqQlU'. - 'e5JBmwpxY1ENaKBgUh0iHgwsSre9AAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNTfJXtxZAAAAnklEQVR4nE2QWY4EMQhDUVhSIRC4/2'. - 'kbaqLp9p+f2AxAayAzDfiK9znPORuvH0x8Ss9z6I9sHp6tcxE9'. - 'nLmWmebmt5F5p2AR0+C9AWpLBjXRaZsCAT3SqklVp0YkAWaGtd'. - 'c5Z41/STYpPzW7BjyiRrwkVmQto/Cw9tNEMvsgcekyCyFPboIu'. - 'IsuXiKffYB4NK4r/h6d4g9HPPwCR7i8+GscIiiaonUAAAAAASU'. - 'VORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/e3+K3vriUub/Dm18j4xc3ob10k0ItqQlU'. + 'e5JBmwpxY1ENaKBgUh0iHgwsSre9AAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNTfJXtxZAAAAnklEQVR4nE2QWY4EMQhDUVhSIRC4/2'. + 'kbaqLp9p+f2AxAayAzDfiK9znPORuvH0x8Ss9z6I9sHp6tcxE9'. + 'nLmWmebmt5F5p2AR0+C9AWpLBjXRaZsCAT3SqklVp0YkAWaGtd'. + 'c5Z41/STYpPzW7BjyiRrwkVmQto/Cw9tNEMvsgcekyCyFPboIu'. + 'IsuXiKffYB4NK4r/h6d4g9HPPwCR7i8+GscIiiaonUAAAAAASU'. + 'VORK5CYII=' ; //========================================================== // File: bullets_balls_oy_035.png //========================================================== $this->imgdata[2][0]= 341 ; $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/f3+K5tbqNwcjnkjXjbxR2i5anfEoNkbis'. - 'PBxpU0sZbZejKgdqIRIlERIwYtkYAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNgK0wEu5AAAAm0lEQVR4nE3QVxIEIQgEUErAgTHA/U'. - '+7zbipf9RXgoGo0liMmX6RdSPLPtZM9F4LuuSIaZtZWffiU6Iz'. - 'Y8SOMF0NogBj30ioGRGLZgiPvce1TbIRz6oBQEbOFGK0rIoxrn'. - '5hDomMA1cfGRCaRVhjS3gkzheM+4HtnlkXcvdZhWG4qZawewe6'. - '9Jnz/TKLB/ML6HUepn//QczazuwFO/0Ivpolhi4AAAAASUVORK'. - '5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/f3+K5tbqNwcjnkjXjbxR2i5anfEoNkbis'. + 'PBxpU0sZbZejKgdqIRIlERIwYtkYAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNgK0wEu5AAAAm0lEQVR4nE3QVxIEIQgEUErAgTHA/U'. + '+7zbipf9RXgoGo0liMmX6RdSPLPtZM9F4LuuSIaZtZWffiU6Iz'. + 'Y8SOMF0NogBj30ioGRGLZgiPvce1TbIRz6oBQEbOFGK0rIoxrn'. + '5hDomMA1cfGRCaRVhjS3gkzheM+4HtnlkXcvdZhWG4qZawewe6'. + '9Jnz/TKLB/ML6HUepn//QczazuwFO/0Ivpolhi4AAAAASUVORK'. + '5CYII=' ; //========================================================== // File: bullets_balls_oy_036.png //========================================================== $this->imgdata[3][0]= 340 ; $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////////27t/e3+LO3hfYzz65ubiNwci6uQ12ipadgVGa'. - 'fwsNkbhnVkcaZ5dwSA8lFg7CEepmAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. - 'RQfTAxcCBySi1nevAAAAjElEQVR4nFXPWw7EIAgFUNMoCMhj/6'. - 'staKczc/2RkwjS2glQ+w3YytgXCXCZpRo8gJdGxZadJws13CUP'. - '4SZI4MYiUxypeiGGw1XShVBTNN9kLXP2GRrZPFvKgd7z/sqGGV'. - '7C7r7r3l09alYN3iA8Yn+ImdVrNoEeSRqJPAaHfhZzLYwXstdZ'. - 'rP3n2bvdAI4INwtihiwAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////////27t/e3+LO3hfYzz65ubiNwci6uQ12ipadgVGa'. + 'fwsNkbhnVkcaZ5dwSA8lFg7CEepmAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxEAAAsRAX9kX5EAAAAHdElN'. + 'RQfTAxcCBySi1nevAAAAjElEQVR4nFXPWw7EIAgFUNMoCMhj/6'. + 'staKczc/2RkwjS2glQ+w3YytgXCXCZpRo8gJdGxZadJws13CUP'. + '4SZI4MYiUxypeiGGw1XShVBTNN9kLXP2GRrZPFvKgd7z/sqGGV'. + '7C7r7r3l09alYN3iA8Yn+ImdVrNoEeSRqJPAaHfhZzLYwXstdZ'. + 'rP3n2bvdAI4INwtihiwAAAAASUVORK5CYII=' ; //========================================================== // File: bullets_balls_pp_019.png //========================================================== $this->imgdata[4][0]= 334 ; $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. - 'BMVEX////+/v7i4eO/w8eHxcvKroNVormtfkjrMN2BeXQrepPc'. - 'Esy4IL+OFaR7F25LHF8mFRh5XXtUAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAxcBNgkjEpIxAAAAlElEQVR4nE2QAQ7FIAhDDTAVndL7n3'. - 'ZV/7JfEwMvFIWUlkTMVNInbVv5ZeJqG7Smh2QTBwJBpsdizAZP'. - '5NyW0awhK8kYodnZxS6ECvPRp2sI+y7PBv1mN02KH7h77QCJ8D'. - '4VvY5NUgEmCwj6ZMzHtJRgRSXwC1gfcqJJH0GBnSnK1kUQ72DY'. - 'CPBv+MCS/e0jib77eQAJxwiEWm7hFwAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABEAAAARCAMAAAAMs7fIAAAAM1'. + 'BMVEX////+/v7i4eO/w8eHxcvKroNVormtfkjrMN2BeXQrepPc'. + 'Esy4IL+OFaR7F25LHF8mFRh5XXtUAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAxcBNgkjEpIxAAAAlElEQVR4nE2QAQ7FIAhDDTAVndL7n3'. + 'ZV/7JfEwMvFIWUlkTMVNInbVv5ZeJqG7Smh2QTBwJBpsdizAZP'. + '5NyW0awhK8kYodnZxS6ECvPRp2sI+y7PBv1mN02KH7h77QCJ8D'. + '4VvY5NUgEmCwj6ZMzHtJRgRSXwC1gfcqJJH0GBnSnK1kUQ72DY'. + 'CPBv+MCS/e0jib77eQAJxwiEWm7hFwAAAABJRU5ErkJggg==' ; } } diff --git a/onyx2/include/jpgraph/imgdata_diamonds.inc.php b/onyx2/include/jpgraph/imgdata_diamonds.inc.php index 837730f..8ca2395 100644 --- a/onyx2/include/jpgraph/imgdata_diamonds.inc.php +++ b/onyx2/include/jpgraph/imgdata_diamonds.inc.php @@ -1,11 +1,11 @@ 'imgdata'); protected $colors = array('lightblue','darkblue','gray', - 'blue','pink','purple','red','yellow'); + 'blue','pink','purple','red','yellow'); protected $index = array('lightblue' =>7,'darkblue'=>2,'gray'=>6, - 'blue'=>4,'pink'=>1,'purple'=>5,'red'=>0,'yellow'=>3); + 'blue'=>4,'pink'=>1,'purple'=>5,'red'=>0,'yellow'=>3); protected $maxidx = 7 ; protected $imgdata ; - public function __construct() + public function ImgData_Diamonds() { //========================================================== // File: diam_red.png //========================================================== $this->imgdata[0][0]= 668 ; $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. - 'BMVEX///////+cAAD/AADOAABjAABrAADWGBjOCAj/CAj/GBj/'. - 'EBCcCAiMOTl7KSl7ISFzGBilGBjOEBBrCAjv5+eMQkK1QkKtMT'. - 'GtKSnWKSn/KSlzEBCcEBDexsb/tbXOe3ucWlqcUlKUSkr/e3vn'. - 'a2u9UlL/a2uEMTHeUlLeSkqtOTn/UlL/SkrWOTn/QkL/OTmlIS'. - 'H/MTH/ISH39/f/9/f35+fezs7/5+fvzs7WtbXOra3nvb3/zs7G'. - 'nJzvtbXGlJTepaW9jIy1hITWlJS1e3uta2ulY2P/lJTnhITne3'. - 'vGY2O9Wlr/c3PeY2O1Skr/Y2P/WlreQkLWISGlEBCglEUaAAAA'. - 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. - 'sSAdLdfvwAAAAHdElNRQfTAwsWEw5WI4qnAAABGUlEQVR4nHXQ'. - '1XLDMBAFUKUCM1NiO8zcpIxpp8z0//9SWY7b2LHv6EU6s1qtAN'. - 'iMBAojLPkigpJvogKC4pxDuQipjanlICXof1RQDkYEF21mKIfg'. - '/GGKtjAmOKt9oSyuCU7OhyiDCQnjowGfRnooCJIkiWJvv8NxnG'. - 'nyNAwFcekvZpPP3mu7Vrp8fOq8DYbTyjdnAvBj7Jbd7nP95urs'. - '+MC2D6unF+Cu0VJULQBAlsOQuueN3Hrp2nGUvqppemBZ0aU7Se'. - 'SXvYZFMKaLJn7MH3btJmZEMEmGSOreqy0SI/4ffo3uiUOYEACy'. - 'OFopmNWlP5uZd9uPWmUoxvK9ilO9NtBo6mS7KkZD0fOJYqgGBU'. - 'S/T7OKCAA9tfsFOicXcbxt29cAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. + 'BMVEX///////+cAAD/AADOAABjAABrAADWGBjOCAj/CAj/GBj/'. + 'EBCcCAiMOTl7KSl7ISFzGBilGBjOEBBrCAjv5+eMQkK1QkKtMT'. + 'GtKSnWKSn/KSlzEBCcEBDexsb/tbXOe3ucWlqcUlKUSkr/e3vn'. + 'a2u9UlL/a2uEMTHeUlLeSkqtOTn/UlL/SkrWOTn/QkL/OTmlIS'. + 'H/MTH/ISH39/f/9/f35+fezs7/5+fvzs7WtbXOra3nvb3/zs7G'. + 'nJzvtbXGlJTepaW9jIy1hITWlJS1e3uta2ulY2P/lJTnhITne3'. + 'vGY2O9Wlr/c3PeY2O1Skr/Y2P/WlreQkLWISGlEBCglEUaAAAA'. + 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. + 'sSAdLdfvwAAAAHdElNRQfTAwsWEw5WI4qnAAABGUlEQVR4nHXQ'. + '1XLDMBAFUKUCM1NiO8zcpIxpp8z0//9SWY7b2LHv6EU6s1qtAN'. + 'iMBAojLPkigpJvogKC4pxDuQipjanlICXof1RQDkYEF21mKIfg'. + '/GGKtjAmOKt9oSyuCU7OhyiDCQnjowGfRnooCJIkiWJvv8NxnG'. + 'nyNAwFcekvZpPP3mu7Vrp8fOq8DYbTyjdnAvBj7Jbd7nP95urs'. + '+MC2D6unF+Cu0VJULQBAlsOQuueN3Hrp2nGUvqppemBZ0aU7Se'. + 'SXvYZFMKaLJn7MH3btJmZEMEmGSOreqy0SI/4ffo3uiUOYEACy'. + 'OFopmNWlP5uZd9uPWmUoxvK9ilO9NtBo6mS7KkZD0fOJYqgGBU'. + 'S/T7OKCAA9tfsFOicXcbxt29cAAAAASUVORK5CYII=' ; //========================================================== // File: diam_pink.png //========================================================== $this->imgdata[1][0]= 262 ; $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX///+AgID/M5n/Zpn/zMz/mZn1xELhAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWEi3tX8qUAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgID/M5n/Zpn/zMz/mZn1xELhAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEi3tX8qUAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; //========================================================== // File: diam_blue.png //========================================================== $this->imgdata[2][0]= 662 ; $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA+V'. - 'BMVEX///+AgIAAAJwAAP8AAM4AAGMAAGsQEP8YGHMQEHMYGP8Q'. - 'EKUICJwICM5KSpQxMYQpKXsYGNYQEM4ICGsICP97e85aWpw5OY'. - 'xSUv85ObVCQt4xMa0pKa0hIaUpKf+9vd6EhLVra+dzc/9SUr1r'. - 'a/9aWt5SUt5CQrVaWv9KSv8hIXs5Of8xMf8pKdYhIdYYGKUhIf'. - '/Ozs739//v7/fn5+/v7//n5/fW1ufOzufOzu/W1v+trc69veel'. - 'pc6trd6UlMa9vf+MjL21tfe1tf+UlNZzc61ra6Wlpf+EhOeMjP'. - '9ra8ZSUpyEhP9CQoxKSrVCQv85Od4xMdYQENZnJhlWAAAAAXRS'. - 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. - 'LdfvwAAAAHdElNRQfTAwsWEx3Snct5AAABFklEQVR4nHXR5XbD'. - 'IBgGYM6AuHsaqbvOfeuknev9X8xISbplSd5/8JyXwwcA/I0AKm'. - 'PFchVBdvKNKggKQx2VIoRwMZihMiQE49YUlWBCcPL0hYq4ITh+'. - 'qKECUoLDZWqoQNA766F/mJHlHXblPJJNiyURhM5eU9cNw5BlmS'. - 'IrLOLxhzfotF7vwO2j3ez2ap/TmW4AIM7DoN9+tu+vLk6Pdg9O'. - '6ufXjfXLm6pxPACSJIpRFAa+/26DhuK6qjbiON40k0N3skjOvm'. - 'NijBmchF5mi+1jhQqDmWyIzPp1hUlrv8On5l+6mMm1tigFNyrt'. - '5R97g+FKKyGKkTNKesXPJTZXOFIrUoKiypcTQVHjK4g8H2dWEQ'. - 'B8bvUDLSQXSr41rmEAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA+V'. + 'BMVEX///+AgIAAAJwAAP8AAM4AAGMAAGsQEP8YGHMQEHMYGP8Q'. + 'EKUICJwICM5KSpQxMYQpKXsYGNYQEM4ICGsICP97e85aWpw5OY'. + 'xSUv85ObVCQt4xMa0pKa0hIaUpKf+9vd6EhLVra+dzc/9SUr1r'. + 'a/9aWt5SUt5CQrVaWv9KSv8hIXs5Of8xMf8pKdYhIdYYGKUhIf'. + '/Ozs739//v7/fn5+/v7//n5/fW1ufOzufOzu/W1v+trc69veel'. + 'pc6trd6UlMa9vf+MjL21tfe1tf+UlNZzc61ra6Wlpf+EhOeMjP'. + '9ra8ZSUpyEhP9CQoxKSrVCQv85Od4xMdYQENZnJhlWAAAAAXRS'. + 'TlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAd'. + 'LdfvwAAAAHdElNRQfTAwsWEx3Snct5AAABFklEQVR4nHXR5XbD'. + 'IBgGYM6AuHsaqbvOfeuknev9X8xISbplSd5/8JyXwwcA/I0AKm'. + 'PFchVBdvKNKggKQx2VIoRwMZihMiQE49YUlWBCcPL0hYq4ITh+'. + 'qKECUoLDZWqoQNA766F/mJHlHXblPJJNiyURhM5eU9cNw5BlmS'. + 'IrLOLxhzfotF7vwO2j3ez2ap/TmW4AIM7DoN9+tu+vLk6Pdg9O'. + '6ufXjfXLm6pxPACSJIpRFAa+/26DhuK6qjbiON40k0N3skjOvm'. + 'NijBmchF5mi+1jhQqDmWyIzPp1hUlrv8On5l+6mMm1tigFNyrt'. + '5R97g+FKKyGKkTNKesXPJTZXOFIrUoKiypcTQVHjK4g8H2dWEQ'. + 'B8bvUDLSQXSr41rmEAAAAASUVORK5CYII=' ; //========================================================== // File: diam_yellow.png //========================================================== $this->imgdata[3][0]= 262 ; $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX///+AgIBmMwCZZgD/zADMmQD/QLMZAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWEwcv/zIDAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgIBmMwCZZgD/zADMmQD/QLMZAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEwcv/zIDAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; //========================================================== // File: diam_lightblue.png //========================================================== $this->imgdata[4][0]= 671 ; $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/1'. - 'BMVEX///+AgIAAnP8A//8Azv8AY/8Aa/8I//8Y1v8Izv8Y//8Q'. - '//8InP8Qzv8Ypf85jP8he/8Yc/8Ia/8pe/8p//8p1v9Ctf8xrf'. - '8prf8QnP8Qc/9CjP+1//97//9r//9S//9K//9C//85//8x//8h'. - '//9r5/9K3v9S3v851v97zv9Svf85rf8hpf/G3v9SnP9anP9KlP'. - '8xhP/n7//v7+f3///n///O//+U//9z//9j//9a//975/9C3v8h'. - '1v+E5/+17/9j3v/O7//n9/+95/+l3v9jxv+U1v8Qpf9avf9Ktf'. - '+Uxv+11v97tf9rrf+cxv+Mvf9jpf+tzv+Etf/O3v/39/8Akkxr'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. - 'IAAAsSAdLdfvwAAAAHdElNRQfTAwsWEiHk6Ya/AAABGUlEQVR4'. - 'nHXQ13KDMBAF0J2o0E01GHDvJa7p3em95/+/JQJMYjDc0Yt0Zr'. - 'VaAaxHgtxwbSGPkGQpOIeQ2ORxJiJmNWYZyAhZR0WcgQGhViU0'. - 'nEGoedDHGxgRapRPcRpXhOr7XZzCmLjaXk9IIjvkOEmSRLG62+'. - 'F5XlEElhA5sW21GvXj6mGlDBfnJ51lr9svnvEKwH1hu2QPbwd3'. - 'N9eXVzuL7/Hn29frdKaamgcgy67L3HFG9gDefV+dm5qme4YRXL'. - 'oVR374mRqUELZYosf84XAxISFRQuMh4rrH8YxGSP6HX6H97NNQ'. - 'KEAaR08qCeuSnx2a8zIPWqUowtKHSRK91rAw0elmVYQFVc8mhq'. - '7p5RD7Ps3IIwA9sfsFxFUX6eZ4Zh4AAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/1'. + 'BMVEX///+AgIAAnP8A//8Azv8AY/8Aa/8I//8Y1v8Izv8Y//8Q'. + '//8InP8Qzv8Ypf85jP8he/8Yc/8Ia/8pe/8p//8p1v9Ctf8xrf'. + '8prf8QnP8Qc/9CjP+1//97//9r//9S//9K//9C//85//8x//8h'. + '//9r5/9K3v9S3v851v97zv9Svf85rf8hpf/G3v9SnP9anP9KlP'. + '8xhP/n7//v7+f3///n///O//+U//9z//9j//9a//975/9C3v8h'. + '1v+E5/+17/9j3v/O7//n9/+95/+l3v9jxv+U1v8Qpf9avf9Ktf'. + '+Uxv+11v97tf9rrf+cxv+Mvf9jpf+tzv+Etf/O3v/39/8Akkxr'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'IAAAsSAdLdfvwAAAAHdElNRQfTAwsWEiHk6Ya/AAABGUlEQVR4'. + 'nHXQ13KDMBAF0J2o0E01GHDvJa7p3em95/+/JQJMYjDc0Yt0Zr'. + 'VaAaxHgtxwbSGPkGQpOIeQ2ORxJiJmNWYZyAhZR0WcgQGhViU0'. + 'nEGoedDHGxgRapRPcRpXhOr7XZzCmLjaXk9IIjvkOEmSRLG62+'. + 'F5XlEElhA5sW21GvXj6mGlDBfnJ51lr9svnvEKwH1hu2QPbwd3'. + 'N9eXVzuL7/Hn29frdKaamgcgy67L3HFG9gDefV+dm5qme4YRXL'. + 'oVR374mRqUELZYosf84XAxISFRQuMh4rrH8YxGSP6HX6H97NNQ'. + 'KEAaR08qCeuSnx2a8zIPWqUowtKHSRK91rAw0elmVYQFVc8mhq'. + '7p5RD7Ps3IIwA9sfsFxFUX6eZ4Zh4AAAAASUVORK5CYII=' ; //========================================================== // File: diam_purple.png //========================================================== $this->imgdata[5][0]= 657 ; $this->imgdata[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. - 'BMVEX///////8xAP/OAP+cAP9jAP9rAP+cCP85CP/OEP9SKf/O'. - 'CP9CEP9zGP9rCP+lGP/WOf/WIf9KIf9jOf+MQv+EMf97If9zEP'. - '+1Sv+lIf/ne//eUv/na//n5//Oxv/Wzv+chP9zUv97Wv9rQv9a'. - 'Mf9KGP/v5/+te/97Kf+9Y/+tOf+tKf+lEP/vtf/WMf/WKf/v7+'. - 'f39/+tnP+9rf9rSv9jQv9CGP+ljP+EY//Gtf+tlP+Ma/9zSv/e'. - 'zv+UUv+9lP+cWv+lY/+cUv+MOf+EKf+UQv/Opf/OhP/Ga/+1Qv'. - '/Oe/+9Uv/ntf/eWv/eSv/WGP/3zv/vlP/WEP//9/+pL4oHAAAA'. - 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. - 'sSAdLdfvwAAAAHdElNRQfTAwsWEjX+M1LCAAABDklEQVR4nHXQ'. - '1bLDIBAGYFqIEW+ksbr7cXd3ff93OUCamdOE/Mxw882yywLwPz'. - '+gNKotlRFUVnNUQlCxTMRFCKEdE+MgpJaEiIOU4DKaoSIygtb3'. - 'FBUQrm3xjPK4JvXjK0A5hFniYSBtIilQVYUm+X0KTVNiYah+2q'. - 'ulFb8nUbSovD2+TCavwXQWmnMA6ro+di+uR5cPzfPhVqPV3N1p'. - 'n3b3+rimAWAYhP3xnXd7P6oc9vadPsa1wYEs00dFQRAFehlX21'. - '25Sg9NOgwF5jeNTjVL9om0TjDc1lmeCKZ17nFPzhPtSRt6J06R'. - 'WKUoeG3MoXRa/wjLHGLodwZcotPqjsYngnWslRBZH91hWTbpD2'. - 'EdF1ECWW1SAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbCAMAAAC6CgRnAAAA/F'. + 'BMVEX///////8xAP/OAP+cAP9jAP9rAP+cCP85CP/OEP9SKf/O'. + 'CP9CEP9zGP9rCP+lGP/WOf/WIf9KIf9jOf+MQv+EMf97If9zEP'. + '+1Sv+lIf/ne//eUv/na//n5//Oxv/Wzv+chP9zUv97Wv9rQv9a'. + 'Mf9KGP/v5/+te/97Kf+9Y/+tOf+tKf+lEP/vtf/WMf/WKf/v7+'. + 'f39/+tnP+9rf9rSv9jQv9CGP+ljP+EY//Gtf+tlP+Ma/9zSv/e'. + 'zv+UUv+9lP+cWv+lY/+cUv+MOf+EKf+UQv/Opf/OhP/Ga/+1Qv'. + '/Oe/+9Uv/ntf/eWv/eSv/WGP/3zv/vlP/WEP//9/+pL4oHAAAA'. + 'AXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAA'. + 'sSAdLdfvwAAAAHdElNRQfTAwsWEjX+M1LCAAABDklEQVR4nHXQ'. + '1bLDIBAGYFqIEW+ksbr7cXd3ff93OUCamdOE/Mxw882yywLwPz'. + '+gNKotlRFUVnNUQlCxTMRFCKEdE+MgpJaEiIOU4DKaoSIygtb3'. + 'FBUQrm3xjPK4JvXjK0A5hFniYSBtIilQVYUm+X0KTVNiYah+2q'. + 'ulFb8nUbSovD2+TCavwXQWmnMA6ro+di+uR5cPzfPhVqPV3N1p'. + 'n3b3+rimAWAYhP3xnXd7P6oc9vadPsa1wYEs00dFQRAFehlX21'. + '25Sg9NOgwF5jeNTjVL9om0TjDc1lmeCKZ17nFPzhPtSRt6J06R'. + 'WKUoeG3MoXRa/wjLHGLodwZcotPqjsYngnWslRBZH91hWTbpD2'. + 'EdF1ECWW1SAAAAAElFTkSuQmCC' ; //========================================================== // File: diam_gray.png //========================================================== $this->imgdata[6][0]= 262 ; $this->imgdata[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX//////wAzMzNmZmbMzMyZmZlq4Qo5AAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWExZFTxLxAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX//////wAzMzNmZmbMzMyZmZlq4Qo5AAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWExZFTxLxAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; //========================================================== // File: diam_blgr.png //========================================================== $this->imgdata[7][0]= 262 ; $this->imgdata[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. - 'BMVEX///+AgIBmzP9m///M//+Z//8hMmBVAAAAAXRSTlMAQObY'. - 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. - 'AHdElNRQfTAwsWEwCxm6egAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. - 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. - '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. - 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. - '==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABsAAAAbBAMAAAB/+ulmAAAAEl'. + 'BMVEX///+AgIBmzP9m///M//+Z//8hMmBVAAAAAXRSTlMAQObY'. + 'ZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAA'. + 'AHdElNRQfTAwsWEwCxm6egAAAAbUlEQVR4nFXJwQ3AMAhDUdRm'. + 'kKojuCswABf2X6UEEiC+WF+PyDfoGEuvwXogq3Rk1Y6W0tBSG8'. + '6Uwpla6CmJnpoYKRsjjb/Y63vo9kIkLcZCCsbGYGwMRqIzEp1R'. + 'OBmFk9HQGA2N0ZEIz5HX+h/jailYpfz4dAAAAABJRU5ErkJggg'. + '==' ; } } diff --git a/onyx2/include/jpgraph/imgdata_pushpins.inc.php b/onyx2/include/jpgraph/imgdata_pushpins.inc.php index 2ffce12..c4dcfb5 100644 --- a/onyx2/include/jpgraph/imgdata_pushpins.inc.php +++ b/onyx2/include/jpgraph/imgdata_pushpins.inc.php @@ -1,19 +1,19 @@ 'imgdata_small', - MARK_IMG_SPUSHPIN => 'imgdata_small', - MARK_IMG_LPUSHPIN => 'imgdata_large'); + MARK_IMG_SPUSHPIN => 'imgdata_small', + MARK_IMG_LPUSHPIN => 'imgdata_large'); protected $colors = array('blue','green','orange','pink','red'); protected $index = array('red' => 0, 'orange' => 1, 'pink' => 2, 'blue' => 3, 'green' => 4 ) ; @@ -21,10 +21,10 @@ class ImgData_PushPins extends ImgData protected $imgdata_large; protected $imgdata_small ; - public function __construct() + public function ImgData_PushPins() { - // The anchor should be where the needle "hits" the paper + // The anchor should be where the needle "hits" the paper // (bottom left corner) $this->anchor_x = 0; $this->anchor_y = 1; @@ -34,384 +34,384 @@ class ImgData_PushPins extends ImgData //========================================================== $this->imgdata_large[0][0]= 2490 ; $this->imgdata_large[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMKBh4Ryh89CgAACUdJREFUeJy9mNtTFFcexz+/7p'. - '4Lw1wZJKDGCAwmDAqUySamcCq1ed6k9mn3UfMP7F+1T3nYqn2J'. - 'lZdoDEjpbq0KG8EBFBFBEJye6Zmenkv32Ydu5GYiUMmeqq6uqT'. - '6Xz3zP73aOcIKmAQkIFyD3N/jrBPwlKjLQEglVlJKyUjR3u7cc'. - 'WLoP3/4dvv03LNrQ8I6x1rFbDML9kOmHvh7IRHU9JKmUSG8vpF'. - 'IoXX/TV0AiEM5A5jT0noFMFMJHXUt/d5f9TUAbhtQ3cPFruDog'. - '8klHMnmO0dGYe/myOJGINEwTz3F2higFXgy8PpAkOC+h8hoaCt'. - '4ppHFcQAWSgOQlyI/p+lUjmRxWAwNJd3xca/f34yoFi4tgmjtD'. - 'NIFkJ4xcgBCgVqEBFJ9DqcZea/gNAAVEg7AOGYnHe9XoaJd3+X'. - 'LISSSwnz6lsbKCZ9sHh4UVdBkwdA6cPwNnIfJPmC3Ctgft3wwQ'. - 'QPkvTZJJnbExzfvsM2nMzVG7e5fG48d4lnXwTwEYCjJxuHQBog'. - 'BHUfKkgAIIhiGk06hTp/Dm5qS1uYlXLvtWd4gPgIiCrAEcVckT'. - 'Ab5p7TaYJrK1hQaEenrwSiVfQdc91P0kSp7Ii89D5ksY/kAkLy'. - 'IZXFdXkQjS1YUSEbdcRu168V6+HTUNIKJDRwdE+sBIQmP9Ld59'. - 'bEBA3of4F/D+uXb7rGaaCSmXI3pPj64PDaHCYfEqFVSjgWo2D2'. - '73XlJNQTgCyQykIuBWoNKEeh1aLXBPBCggGdBOgxZVSjoajVhH'. - 'o5HWlIpq4bCQSgm9vXhK4ZZKh5SUYygp4J1EQVUD9xlU18BJQD'. - 'bUbJ5T5XJStyxN9fSI099P3baxV1dRloW2h2ivx/yakg2ot6F1'. - 'EkCa4G1D+zVEq5ArKTWM42Q6HUczQV7U66w9e0ZpdRXlOIQ5vF'. - 'VHUXILKify4jiEzkOqC3peQMoBQymFlMt4Dx6wUSxSsm2UZXEK'. - 'P30QvOUt8/2Sd78CdWwFDTA+gsw3cOlPcPUD+CQB52oQ21RKXM'. - 'eRhGXhOg7VoKrx8KuS4ygZhVg3ZI8FGIfwR9BVgAtfwxdXdP3L'. - '86nUR91dXelNXTeWWy10paQHX602YAP1ADASAL7LJvFtMpOCc0'. - 'cG3FHuGlz6Gr4YEpnoTCbzsdHRbOzy5RCRiLRMk5rjyOtAimwA'. - 'U4U3SurBN/0wnAASBCVDIKpB4kiAB5Ub0/UvO9LpPAMDGfn005'. - 'AxPCzxep3Q6iqPLUseBoufCZRsAE6g5g5kKIDfKUj3wnpAG8QB'. - '/Z1OIqANQuI65AtwNScyYXR2XlAXL2YZHzcklRKWl5GVFXFtGx'. - 'MoAiV/EQaAGH6BUQNWgQpwFngv+Ca8KUAQEBcwgTJHyMV7679R'. - 'XS8YqdSI6u/PMD5ukMtJY3GR2uQkr5aXeWVZOEALmA8WsIAxfL'. - 'd0goVLAdCOd+/YpgqeVtBv4yiA++q/RKKXixe7GB8PSyoljcVF'. - 'yg8fyubyMpulEk2lyAIfAAvAC+B+oOQFoAt/+0rAejB/EzjNri'. - 'vvqNnCd64jxcE39V8spnP+vMbAgDSePKE2NcXm06dslMuUlcID'. - 'TuFvqwXMBU8N39bGgRR+ki0Dz4L5DSAe9NGD7zq+6kcN1L6H2b'. - 'ao5WWaQHllRTafPmWrVMJUimoAQrBYJFjQwre7B6A8YAi8LCgD'. - '5DVo6/hbb/iHK1KggvFeD3hHziQKEMuiNTNDbXGRTdtmw7Iwla'. - 'KGH0oqwbscLOoG46rAY6AOzRhY74PT6QuUKEN4PegXxd/yEDTT'. - 'YMWOk+oEaLkuFdNk0zTZwjfkavDUArXWgGXgFb4dEShXhfYqlI'. - 'ow3w9rg3B6ED60IOOA5oEYQBrcpG+mj9bg0VG8GMJhVDZLyzAo'. - 'VSq8rFYxXXefcjVgG9+uisDrXUCApoKSBcUHMBmHhfcgNwhtD3'. - 'q9IG6Lr15b4OUTmPwBJt8JqGuapp05o0mhoHnptLQfPsR+8IBK'. - 'uYyNH3yr+B77LHheA3tK1Ta+IrMeTL2C6Xl48TOsNWDDgAz7s5'. - '/r+krP/eddCsbj8fDQ4GBm9MqVvvRXX2VULBayRGRzaYn1SoWa'. - 'UjgB4PIB5QK4ZgBXBKaAHxQsrED1H7CRgCUPwgHZDqACmhWwXv'. - '2aDRqGYeRyufS169cvThQKV88PDuYbW1vJ5VRK+5euqxWlPMdX'. - 'SRqgreHbZGN3ijfKBXBTAeh2Fdwi2MofshP/dvKwCmKhp4m83Y'. - 'vj8Xg4l8tlCoXC0MTExMTFkZE/1m37wvLGRvKRacoD1209E7Fc'. - 'pZwYREOQqEJ4z3HskHLsz4AoXykPIBSN0t3dTTQafROoHdumXC'. - '4fjoMiog0ODiauX7+eLxQKV3O53ETdti88nJnJ3rl505ifmWm3'. - 'arWSodR8GNbycDoNHy5C5jFold1k8d+DyvELNwg93d18/vnn9P'. - 'X1oes6nufx/Plz7t+/fxhQKSWJRCI5NjaWHxkZKdj1+sjSwkJm'. - '+uZN/dZ337VqCwullGUVdZjsgIUC5LqhrUPvCugWuApeApPAzY'. - 'PKHWyaphGNRunt7WVwcBARwfM8Ojo6sCzrMKBhGLphGFEF2Wq1'. - '2jc7M5OZ/vHH0MPbt93awkJJmeZsC6ZaMK3DCwvWdNioQUb5B6'. - 'AdBR+9SzkAz/NwHIeXL18iIui6TjgcJplMMjY2th8wHo+Hh4aG'. - 'MsPDw6fddru7+Phxx51bt/RbN260qwsLpZhlFZsw9QJ+2Pbrga'. - 'oJG2FY2oKwuTtVEz9uV34NbqdtbW0xPT1NNBoF4MyZM1y5coWu'. - 'rq5dQBHRcrlc4tq1a/l8Pj9RMs38ndu3Ez//9JNXLRZNyuXZJk'. - 'xVYKoExQpsK/+IaAuYb7no8zjC/R+A4zisrq7u+53NZjl16tQ+'. - 'QIlEIslsNpuPRCJXZ2dnh2/duNFRW1oy07a96MKd575yxRqU1B'. - '5vPMpF5HHa1tYW9+7do7Ozc/eQpZTSQ6FQt1Lq8pMnT/5w7969'. - 'nuLcXE1rNufO9fRMhlKpOyvt9qPtVmvb25fFfvvWbrepVCqHwo'. - 'xaX19vff/996ZhGC8qlkW9Wt1Onz073fXxxz+6MB+9e9dUjuO+'. - '7ebq9wLdB9hoNCrr6+s/4wf3FCJW3fPmTZhXsNWCprjuW66Dfr'. - '928KAfBhJAEgiJSLuzs7OSTqctoFkqlZRt26j/I+L/AGjPTN4d'. - 'Nqn4AAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMKBh4Ryh89CgAACUdJREFUeJy9mNtTFFcexz+/7p'. + '4Lw1wZJKDGCAwmDAqUySamcCq1ed6k9mn3UfMP7F+1T3nYqn2J'. + 'lZdoDEjpbq0KG8EBFBFBEJye6Zmenkv32Ydu5GYiUMmeqq6uqT'. + '6Xz3zP73aOcIKmAQkIFyD3N/jrBPwlKjLQEglVlJKyUjR3u7cc'. + 'WLoP3/4dvv03LNrQ8I6x1rFbDML9kOmHvh7IRHU9JKmUSG8vpF'. + 'IoXX/TV0AiEM5A5jT0noFMFMJHXUt/d5f9TUAbhtQ3cPFruDog'. + '8klHMnmO0dGYe/myOJGINEwTz3F2higFXgy8PpAkOC+h8hoaCt'. + '4ppHFcQAWSgOQlyI/p+lUjmRxWAwNJd3xca/f34yoFi4tgmjtD'. + 'NIFkJ4xcgBCgVqEBFJ9DqcZea/gNAAVEg7AOGYnHe9XoaJd3+X'. + 'LISSSwnz6lsbKCZ9sHh4UVdBkwdA6cPwNnIfJPmC3Ctgft3wwQ'. + 'QPkvTZJJnbExzfvsM2nMzVG7e5fG48d4lnXwTwEYCjJxuHQBog'. + 'BHUfKkgAIIhiGk06hTp/Dm5qS1uYlXLvtWd4gPgIiCrAEcVckT'. + 'Ab5p7TaYJrK1hQaEenrwSiVfQdc91P0kSp7Ii89D5ksY/kAkLy'. + 'IZXFdXkQjS1YUSEbdcRu168V6+HTUNIKJDRwdE+sBIQmP9Ld59'. + 'bEBA3of4F/D+uXb7rGaaCSmXI3pPj64PDaHCYfEqFVSjgWo2D2'. + '73XlJNQTgCyQykIuBWoNKEeh1aLXBPBCggGdBOgxZVSjoajVhH'. + 'o5HWlIpq4bCQSgm9vXhK4ZZKh5SUYygp4J1EQVUD9xlU18BJQD'. + 'bUbJ5T5XJStyxN9fSI099P3baxV1dRloW2h2ivx/yakg2ot6F1'. + 'EkCa4G1D+zVEq5ArKTWM42Q6HUczQV7U66w9e0ZpdRXlOIQ5vF'. + 'VHUXILKify4jiEzkOqC3peQMoBQymFlMt4Dx6wUSxSsm2UZXEK'. + 'P30QvOUt8/2Sd78CdWwFDTA+gsw3cOlPcPUD+CQB52oQ21RKXM'. + 'eRhGXhOg7VoKrx8KuS4ygZhVg3ZI8FGIfwR9BVgAtfwxdXdP3L'. + '86nUR91dXelNXTeWWy10paQHX602YAP1ADASAL7LJvFtMpOCc0'. + 'cG3FHuGlz6Gr4YEpnoTCbzsdHRbOzy5RCRiLRMk5rjyOtAimwA'. + 'U4U3SurBN/0wnAASBCVDIKpB4kiAB5Ub0/UvO9LpPAMDGfn005'. + 'AxPCzxep3Q6iqPLUseBoufCZRsAE6g5g5kKIDfKUj3wnpAG8QB'. + '/Z1OIqANQuI65AtwNScyYXR2XlAXL2YZHzcklRKWl5GVFXFtGx'. + 'MoAiV/EQaAGH6BUQNWgQpwFngv+Ca8KUAQEBcwgTJHyMV7679R'. + 'XS8YqdSI6u/PMD5ukMtJY3GR2uQkr5aXeWVZOEALmA8WsIAxfL'. + 'd0goVLAdCOd+/YpgqeVtBv4yiA++q/RKKXixe7GB8PSyoljcVF'. + 'yg8fyubyMpulEk2lyAIfAAvAC+B+oOQFoAt/+0rAejB/EzjNri'. + 'vvqNnCd64jxcE39V8spnP+vMbAgDSePKE2NcXm06dslMuUlcID'. + 'TuFvqwXMBU8N39bGgRR+ki0Dz4L5DSAe9NGD7zq+6kcN1L6H2b'. + 'ao5WWaQHllRTafPmWrVMJUimoAQrBYJFjQwre7B6A8YAi8LCgD'. + '5DVo6/hbb/iHK1KggvFeD3hHziQKEMuiNTNDbXGRTdtmw7Iwla'. + 'KGH0oqwbscLOoG46rAY6AOzRhY74PT6QuUKEN4PegXxd/yEDTT'. + 'YMWOk+oEaLkuFdNk0zTZwjfkavDUArXWgGXgFb4dEShXhfYqlI'. + 'ow3w9rg3B6ED60IOOA5oEYQBrcpG+mj9bg0VG8GMJhVDZLyzAo'. + 'VSq8rFYxXXefcjVgG9+uisDrXUCApoKSBcUHMBmHhfcgNwhtD3'. + 'q9IG6Lr15b4OUTmPwBJt8JqGuapp05o0mhoHnptLQfPsR+8IBK'. + 'uYyNH3yr+B77LHheA3tK1Ta+IrMeTL2C6Xl48TOsNWDDgAz7s5'. + '/r+krP/eddCsbj8fDQ4GBm9MqVvvRXX2VULBayRGRzaYn1SoWa'. + 'UjgB4PIB5QK4ZgBXBKaAHxQsrED1H7CRgCUPwgHZDqACmhWwXv'. + '2aDRqGYeRyufS169cvThQKV88PDuYbW1vJ5VRK+5euqxWlPMdX'. + 'SRqgreHbZGN3ijfKBXBTAeh2Fdwi2MofshP/dvKwCmKhp4m83Y'. + 'vj8Xg4l8tlCoXC0MTExMTFkZE/1m37wvLGRvKRacoD1209E7Fc'. + 'pZwYREOQqEJ4z3HskHLsz4AoXykPIBSN0t3dTTQafROoHdumXC'. + '4fjoMiog0ODiauX7+eLxQKV3O53ETdti88nJnJ3rl505ifmWm3'. + 'arWSodR8GNbycDoNHy5C5jFold1k8d+DyvELNwg93d18/vnn9P'. + 'X1oes6nufx/Plz7t+/fxhQKSWJRCI5NjaWHxkZKdj1+sjSwkJm'. + '+uZN/dZ337VqCwullGUVdZjsgIUC5LqhrUPvCugWuApeApPAzY'. + 'PKHWyaphGNRunt7WVwcBARwfM8Ojo6sCzrMKBhGLphGFEF2Wq1'. + '2jc7M5OZ/vHH0MPbt93awkJJmeZsC6ZaMK3DCwvWdNioQUb5B6'. + 'AdBR+9SzkAz/NwHIeXL18iIui6TjgcJplMMjY2th8wHo+Hh4aG'. + 'MsPDw6fddru7+Phxx51bt/RbN260qwsLpZhlFZsw9QJ+2Pbrga'. + 'oJG2FY2oKwuTtVEz9uV34NbqdtbW0xPT1NNBoF4MyZM1y5coWu'. + 'rq5dQBHRcrlc4tq1a/l8Pj9RMs38ndu3Ez//9JNXLRZNyuXZJk'. + 'xVYKoExQpsK/+IaAuYb7no8zjC/R+A4zisrq7u+53NZjl16tQ+'. + 'QIlEIslsNpuPRCJXZ2dnh2/duNFRW1oy07a96MKd575yxRqU1B'. + '5vPMpF5HHa1tYW9+7do7Ozc/eQpZTSQ6FQt1Lq8pMnT/5w7969'. + 'nuLcXE1rNufO9fRMhlKpOyvt9qPtVmvb25fFfvvWbrepVCqHwo'. + 'xaX19vff/996ZhGC8qlkW9Wt1Onz073fXxxz+6MB+9e9dUjuO+'. + '7ebq9wLdB9hoNCrr6+s/4wf3FCJW3fPmTZhXsNWCprjuW66Dfr'. + '928KAfBhJAEgiJSLuzs7OSTqctoFkqlZRt26j/I+L/AGjPTN4d'. + 'Nqn4AAAAAElFTkSuQmCC' ; //========================================================== // File: ppl_orange.png //========================================================== $this->imgdata_large[1][0]= 2753 ; $this->imgdata_large[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFQ0VCkHCzQAACk5JREFUeJytmGtzG0d2hp8zNw'. - 'AEcRdJ6EJK9FL0CqZUm9jWbkwq3vhDstl8dmLvz8rP2H8Q75ZT'. - 'pkRfpLgqsS6WIFEKGYkiSBCDO+banQ8DUpRWEkklXQUUqlCDfv'. - 'rp857pgfAOQ4AMOJdg4R/hX96Hf06bvDc5iT07i8yeg8ksiIAI'. - '4TBi/ds9/vivD/njapNHvRBfHXMu410AM+BUoVSF05NQsi1sO4'. - '8402AXwLQTuP31OAZO2aG0MEn14iSlnI1z3LnMk8IZYJyBwjIs'. - '/TWsVIWPJkvMFS4zMfMhUp5BsoCpAAEBLYKaMFGn00jBxnvu02'. - '35+JHmSJEnBpQEcPo38MmCxd/nS9Ry71Ga/g1W9a8gn0GsHkgA'. - '6DGjxkqb5CoO+YxF3A3p+jGjQUzoK+L/V0ADzFMwtSR8eLbAr8'. - 'uXOTf9NzhTc0geSLUQcYHgYEH786RMg0zWJHV2Aitv4x/HpHVS'. - 'QA2YBqTTGIUq5qkPMWaWkVwPnPtAA/BevmZcjxaaUtHh8pJJGu'. - 'DpCB9FvT7A7YT7S3p5vFMNzmWo/O0MSx/Ms3TqI8r59zFTfUQe'. - 'I7SBODE3tnfoIxYnNHligwik0zAzDdVpyKbA8sff5YAeMEwgkV'. - 'cufQeTJzZoCsaFLKXPTnNpoUTNsSgJmNoGsuNQjIDwYD2HlnZy'. - 'k++yxTKXZfKTU8zOpjhneeQYkorSmGERtIlICBKRbLX+y98YN3'. - 'ADcNIm+bJD4U3pPnmbEaRgYVRTGBkDSSsmxKfY7ZLuDJA4hdjl'. - 'JEgyBB2SJOvQ9RzTpNKoEwNq0CNFvOXR3/HxMgYVPObaz8kPmh'. - 'hkEWMatAfRONGGvLizyOE9P8KkpwhPDAgQKJQbELUD0oOIhbbH'. - 'JeVTmowxjAgZutB5AoOngA+2DdYrcTyOyYZP9+QpBvI29vwEhb'. - 'It042BVQgDy9KTMfkwQG1A9ACCLlgBBGUwxxoc52WDh2ATyEPp'. - '1hoaPvrEBh0Dq5an9OUsl/9hylk5b5c+mowLc4E2Jtw4Eoljyf'. - 'ogA/AGEAagNRjGyUxOmEycyVA5EWDBxrmUp3ytLIv/NJP69Goh'. - '+9mFydIvS5PZYkvH1oY/RFtKymlwBFQAgQd+kAA6qSQ8pvn2mp'. - 'SkJkuVFHPHBnQMrEt5Sl+e4/Lvp51PF1PF5Xy6WMvOWZXMom8z'. - 'OZTQ8+j5sbQiMEwopsCIwRtBGIJSCdzbTGo9NimkDcgdC7Bg49'. - 'TG5n4/nfr0Si77WdYp1YzyZEkWPdteaEnB7pPqBTxuIf/VgciE'. - 'SgasCPwh+GNIkaNNag1RiPge5pEhMQVjfoLcF+eoXSvbKxedwn'. - 'LKzC3KWbOi5/sW5a44/SHFUSgVA7SCzRG0AvA9mPOgFIETgu4n'. - 'Ww0wNQWFAqRSL6D2ZQYBdDrQ7R7jXiwgRcvIL02makuTmWtpM/'. - '+BlLMl5vuWzLVEuwH6oYnR1KS8kJINGXMM2YdfRlALoQoQQKeb'. - 'bDVwoMdxQMaLCwLo96HZTF5HbrEhmOftianfZisfzueKv7ZmrX'. - 'MsjhxKXZGBjzyeEHmSE3oWiggtyVGmE8DTIXTC5NxgAxOAGUM8'. - 'fun9mnSSLQ/CxNzOTgJ3LIMgoGwkKBiiMyaVviHVkdCO4FEKNv'. - 'LQzWBYHfITPa4UBVM0LR/WB7ARJsdDDTjA6deYFIFUOimJ3d0E'. - 'sNdLavYYgBpthqKcjiiJRO8K6CK0CsJTjfQAGaJtD9vQFAxNNQ'. - '1FB0yBAfA8gdMAIagLoCVAen0M00zMOTYShNDtoHs9CAIUoI4E'. - '1IBihCdNhsMhsj6NuV7BCC2IBpBqQaaFOENCCeiEsO1BO4RQgy'. - 'I5Hm4k4oIU9MrgZSAdBeTabZz+ODxKQRRBFBJo6IUc51anYRQo'. - 'dto+24FNxYCiaWKkQsj00KkO4gxRRkAngJ868M0u3OkkM+hxQA'. - 'cQ7YD7GO5XYSsPZybh/TCkFIYY+kWniTW4Q7jXgHvHMhiRpmuW'. - 'ca08GZkkZ/nY6TZMNhCnf2CuPoDVJvxpB+q9BHA8Ag1uH+oP4c'. - 'YEPCzDwmzSLquShHW/E0YRbG/BjZtw40hAy7aNzJlzRn75E6N0'. - 'qiwTzafI7kOU3gWrhzZC2iHcbsPqLlxvJnCt4KC1RYAL3I5hzY'. - 'Xv/huePYCtITQMKEnyB4KQvMURuJvw889HGSwUCs7CwkLpo6tX'. - 'Ty/+7nel6VLGDn/8N9m+eZuo1UP8iNhLau6b3RfmOsHBGTUYw9'. - 'WBNeDrGB4+h/4qNLKwTnLbHj9CJw/6GoIh9Jpvq0HHcayFhYXi'. - 'l3/4w9LK8vLKexfma3G/mb/3n1njTivS7tNQaaU1grQDjJ868D'. - 'Axx6vmxnBrY9C9IcSbSXbavNjb/S3eN6/0m1JcKBScixcvllZW'. - 'Vi6uLC8v12q1v/M8b/HxVjP//YYr32yE4dYWvShO0ogi14xwxq'. - 'F4rbnxZ3cMjtpvEEeMvwA0TdOYn5/PffHFF7Vr166tvPeLXyx7'. - 'nrd4+/btyg/frFo//Xgncnd67qCn78earQqcmYD3fSi1wPCTSV'. - '3gzqvm9uFOMl5nUAqFQn5paal26dKla57vf7D+6FHph9VV88af'. - 'vgq79bo70e3VT2l9A3hYg4UiRALVHTCHSZvYBm4A//6quf8zoG'. - '3bpuM4acMwKr1+//SDe/dK31+/bv90/Xrcq9fduNW6rbVeC+E7'. - 'gWdD2DKg4UEpBmPcm10RuScida31ntb62HAigoigDw6Gh0axWH'. - 'QWFhZKi4uLZ+I4PrVer2e+u37dXPvqq6hbr7tOp1NXWq89h6/b'. - '8FBB34WGBesdcPrj38lkMkGlUuml0+mu53nR3t4eo9HoSLhMJk'. - 'OlUiGdTuN5Hq7rvgA0TdO4cOFC7vPPP6/VarXldqdTu7m2lrv7'. - '7beq++BBO263b/tKrfWSXlbvwJ6CuAtDgTYiaBFMw6BSqfDxxx'. - '+rarWqGo0GN2/eZGtrC6XenAkRoVKpcPXqVWZmZmg0Gty6desF'. - 'oIhIOp3Ol8vlmmVZK3fv3Lm09uc/Zwbr653ccPgoNIzvnmn99Z'. - '7W9QG46lAaM5mM2l95GIYUi0VOnz7N7OwsWmsymQzyuse5Q8Mw'. - 'DNLpNDMzM5w/f/7A6AGgUkoajYa9urpayOXzUz/fvZutr68Pim'. - 'F4/2y1+n2o9Q/ru7uPesPhXnyo4A+vfHp6mmazybNnz9jZ2UFr'. - 'TbPZJAhe+8/aS0Mphed5NBoNABqNBqPR6MWBVWstvu/nnj9/Pv'. - 'vo0aPq5uZmPBgM/qcwPf39xV/9ajU1M3Nvq9PZaw8GoT50PjdN'. - 'k6mpKa5cucL58+eJ45j19XWePHnCzs4OnudhmiaWZRGGIVH05r'. - 'yEYYjrumxubrKxsfFyDQJ6NBp1Pc+7C4jWumBaVm+kVL2l1H2l'. - '1G6otS+H6V6z8u3tbVzXpdFooJRicXGRqakptre3uXXr1ltrcT'. - 'Qa8ezZszemWAE9rfUdYBOwtVLRbrPZ+48ff+wDvuu6Sr3MB4Dr'. - 'uty6desgfa1WC3iRyrNnz4pSSmezWUzTfGtYtNYcdvC/9sMlgP'. - 'n5N4cAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQ0VCkHCzQAACk5JREFUeJytmGtzG0d2hp8zNw'. + 'AEcRdJ6EJK9FL0CqZUm9jWbkwq3vhDstl8dmLvz8rP2H8Q75ZT'. + 'pkRfpLgqsS6WIFEKGYkiSBCDO+banQ8DUpRWEkklXQUUqlCDfv'. + 'rp857pgfAOQ4AMOJdg4R/hX96Hf06bvDc5iT07i8yeg8ksiIAI'. + '4TBi/ds9/vivD/njapNHvRBfHXMu410AM+BUoVSF05NQsi1sO4'. + '8402AXwLQTuP31OAZO2aG0MEn14iSlnI1z3LnMk8IZYJyBwjIs'. + '/TWsVIWPJkvMFS4zMfMhUp5BsoCpAAEBLYKaMFGn00jBxnvu02'. + '35+JHmSJEnBpQEcPo38MmCxd/nS9Ry71Ga/g1W9a8gn0GsHkgA'. + '6DGjxkqb5CoO+YxF3A3p+jGjQUzoK+L/V0ADzFMwtSR8eLbAr8'. + 'uXOTf9NzhTc0geSLUQcYHgYEH786RMg0zWJHV2Aitv4x/HpHVS'. + 'QA2YBqTTGIUq5qkPMWaWkVwPnPtAA/BevmZcjxaaUtHh8pJJGu'. + 'DpCB9FvT7A7YT7S3p5vFMNzmWo/O0MSx/Ms3TqI8r59zFTfUQe'. + 'I7SBODE3tnfoIxYnNHligwik0zAzDdVpyKbA8sff5YAeMEwgkV'. + 'cufQeTJzZoCsaFLKXPTnNpoUTNsSgJmNoGsuNQjIDwYD2HlnZy'. + 'k++yxTKXZfKTU8zOpjhneeQYkorSmGERtIlICBKRbLX+y98YN3'. + 'ADcNIm+bJD4U3pPnmbEaRgYVRTGBkDSSsmxKfY7ZLuDJA4hdjl'. + 'JEgyBB2SJOvQ9RzTpNKoEwNq0CNFvOXR3/HxMgYVPObaz8kPmh'. + 'hkEWMatAfRONGGvLizyOE9P8KkpwhPDAgQKJQbELUD0oOIhbbH'. + 'JeVTmowxjAgZutB5AoOngA+2DdYrcTyOyYZP9+QpBvI29vwEhb'. + 'It042BVQgDy9KTMfkwQG1A9ACCLlgBBGUwxxoc52WDh2ATyEPp'. + '1hoaPvrEBh0Dq5an9OUsl/9hylk5b5c+mowLc4E2Jtw4Eoljyf'. + 'ogA/AGEAagNRjGyUxOmEycyVA5EWDBxrmUp3ytLIv/NJP69Goh'. + '+9mFydIvS5PZYkvH1oY/RFtKymlwBFQAgQd+kAA6qSQ8pvn2mp'. + 'SkJkuVFHPHBnQMrEt5Sl+e4/Lvp51PF1PF5Xy6WMvOWZXMom8z'. + 'OZTQ8+j5sbQiMEwopsCIwRtBGIJSCdzbTGo9NimkDcgdC7Bg49'. + 'TG5n4/nfr0Si77WdYp1YzyZEkWPdteaEnB7pPqBTxuIf/VgciE'. + 'SgasCPwh+GNIkaNNag1RiPge5pEhMQVjfoLcF+eoXSvbKxedwn'. + 'LKzC3KWbOi5/sW5a44/SHFUSgVA7SCzRG0AvA9mPOgFIETgu4n'. + 'Ww0wNQWFAqRSL6D2ZQYBdDrQ7R7jXiwgRcvIL02makuTmWtpM/'. + '+BlLMl5vuWzLVEuwH6oYnR1KS8kJINGXMM2YdfRlALoQoQQKeb'. + 'bDVwoMdxQMaLCwLo96HZTF5HbrEhmOftianfZisfzueKv7ZmrX'. + 'MsjhxKXZGBjzyeEHmSE3oWiggtyVGmE8DTIXTC5NxgAxOAGUM8'. + 'fun9mnSSLQ/CxNzOTgJ3LIMgoGwkKBiiMyaVviHVkdCO4FEKNv'. + 'LQzWBYHfITPa4UBVM0LR/WB7ARJsdDDTjA6deYFIFUOimJ3d0E'. + 'sNdLavYYgBpthqKcjiiJRO8K6CK0CsJTjfQAGaJtD9vQFAxNNQ'. + '1FB0yBAfA8gdMAIagLoCVAen0M00zMOTYShNDtoHs9CAIUoI4E'. + '1IBihCdNhsMhsj6NuV7BCC2IBpBqQaaFOENCCeiEsO1BO4RQgy'. + 'I5Hm4k4oIU9MrgZSAdBeTabZz+ODxKQRRBFBJo6IUc51anYRQo'. + 'dto+24FNxYCiaWKkQsj00KkO4gxRRkAngJ868M0u3OkkM+hxQA'. + 'cQ7YD7GO5XYSsPZybh/TCkFIYY+kWniTW4Q7jXgHvHMhiRpmuW'. + 'ca08GZkkZ/nY6TZMNhCnf2CuPoDVJvxpB+q9BHA8Ag1uH+oP4c'. + 'YEPCzDwmzSLquShHW/E0YRbG/BjZtw40hAy7aNzJlzRn75E6N0'. + 'qiwTzafI7kOU3gWrhzZC2iHcbsPqLlxvJnCt4KC1RYAL3I5hzY'. + 'Xv/huePYCtITQMKEnyB4KQvMURuJvw889HGSwUCs7CwkLpo6tX'. + 'Ty/+7nel6VLGDn/8N9m+eZuo1UP8iNhLau6b3RfmOsHBGTUYw9'. + 'WBNeDrGB4+h/4qNLKwTnLbHj9CJw/6GoIh9Jpvq0HHcayFhYXi'. + 'l3/4w9LK8vLKexfma3G/mb/3n1njTivS7tNQaaU1grQDjJ868D'. + 'Axx6vmxnBrY9C9IcSbSXbavNjb/S3eN6/0m1JcKBScixcvllZW'. + 'Vi6uLC8v12q1v/M8b/HxVjP//YYr32yE4dYWvShO0ogi14xwxq'. + 'F4rbnxZ3cMjtpvEEeMvwA0TdOYn5/PffHFF7Vr166tvPeLXyx7'. + 'nrd4+/btyg/frFo//Xgncnd67qCn78earQqcmYD3fSi1wPCTSV'. + '3gzqvm9uFOMl5nUAqFQn5paal26dKla57vf7D+6FHph9VV88af'. + 'vgq79bo70e3VT2l9A3hYg4UiRALVHTCHSZvYBm4A//6quf8zoG'. + '3bpuM4acMwKr1+//SDe/dK31+/bv90/Xrcq9fduNW6rbVeC+E7'. + 'gWdD2DKg4UEpBmPcm10RuScida31ntb62HAigoigDw6Gh0axWH'. + 'QWFhZKi4uLZ+I4PrVer2e+u37dXPvqq6hbr7tOp1NXWq89h6/b'. + '8FBB34WGBesdcPrj38lkMkGlUuml0+mu53nR3t4eo9HoSLhMJk'. + 'OlUiGdTuN5Hq7rvgA0TdO4cOFC7vPPP6/VarXldqdTu7m2lrv7'. + '7beq++BBO263b/tKrfWSXlbvwJ6CuAtDgTYiaBFMw6BSqfDxxx'. + '+rarWqGo0GN2/eZGtrC6XenAkRoVKpcPXqVWZmZmg0Gty6desF'. + 'oIhIOp3Ol8vlmmVZK3fv3Lm09uc/Zwbr653ccPgoNIzvnmn99Z'. + '7W9QG46lAaM5mM2l95GIYUi0VOnz7N7OwsWmsymQzyuse5Q8Mw'. + 'DNLpNDMzM5w/f/7A6AGgUkoajYa9urpayOXzUz/fvZutr68Pim'. + 'F4/2y1+n2o9Q/ru7uPesPhXnyo4A+vfHp6mmazybNnz9jZ2UFr'. + 'TbPZJAhe+8/aS0Mphed5NBoNABqNBqPR6MWBVWstvu/nnj9/Pv'. + 'vo0aPq5uZmPBgM/qcwPf39xV/9ajU1M3Nvq9PZaw8GoT50PjdN'. + 'k6mpKa5cucL58+eJ45j19XWePHnCzs4OnudhmiaWZRGGIVH05r'. + 'yEYYjrumxubrKxsfFyDQJ6NBp1Pc+7C4jWumBaVm+kVL2l1H2l'. + '1G6otS+H6V6z8u3tbVzXpdFooJRicXGRqakptre3uXXr1ltrcT'. + 'Qa8ezZszemWAE9rfUdYBOwtVLRbrPZ+48ff+wDvuu6Sr3MB4Dr'. + 'uty6desgfa1WC3iRyrNnz4pSSmezWUzTfGtYtNYcdvC/9sMlgP'. + 'n5N4cAAAAASUVORK5CYII=' ; //========================================================== // File: ppl_pink.png //========================================================== $this->imgdata_large[2][0]= 2779 ; $this->imgdata_large[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFQolY9lkpgAACmhJREFUeJy9mOtzFNl5h5+3b9'. - 'Mz0kzPBWmEVtIiWYhIiC0HCDhB8lb8ISk7nzdZ5+/zJ/8BTmpT'. - '660CZLwG1pVFgBkgGIHECEaa+/T9nHzQCCQuRpCNz6mp6g893U'. - '8/c37ve3qEjxiC4OA4n/Lp/EUu/tsMM/+aEWduVBx7WhdkShcY'. - 'xUH2zo0Dwod/5N6vf8V//PoGdx8M8EOFPtK9jI8BdHCcMuVSmf'. - 'LxHLmSZdm2U8xIbmKETDGDZZnIy4dBbCynyGhphurEDBOlHFnn'. - 'qPcyPxTOwDCOccw7w5nlBRZWylI+ny/mZ6rL1dzUZ5/IWGZU3D'. - 'ZIOMQDDaJcHDVGWUbJBi9odVr0QoVSPzigIEaZ8vgSS/8wZU3/'. - 'k1fylipz5dLM2WlrZqHKaGCKbEbontq3KAKWQyZfZKTgYqc9Bp'. - '2I2PcJ4ogk/UEBQcwipbFZmT13vDBx8fhnE1Ofnp9yJopFyT3X'. - 'yANfks0QHSQMDaL37pOxMLIu2UyVkjVKLjyKSeuD8dAYCFkso1'. - 'gYMaeWJ40T56cl8yAi/O4FSa2P6kYczIDsgVpAqcDImZPMuAB1'. - 'dkLQtcc8a/bwox8IUHAxZVxGZMouSLVYwKuMkD5IxN+JSdsRJB'. - 'pexuTVgYYM6EoGmxkmg3/hEhNUMr/hd7dqbOzExMn/GRDAxWZc'. - 'j3I8HiXfMjF2FQowKw7pjoN6E/Llw/GBJj8qxVOMlX4ipxc/lY'. - 'kl2zBLkmrTcEzMkoNoRLVidLi/9g+Z3I+1xRHX5EcAihxnbPRv'. - 'OTU9kZSmpKPy9FTGrLimPZ1H+UiyGaF67w6n7E1DwMngFDxGvc'. - 'w70v0xZUby5IxjlIyMssUJrJwVWkXBdbXvSvwEibcSdKCAFI16'. - '4/sc0SRo9cGAGq1DwvQFzV6DVuBiV4zYnlEts6A2TSPcSiXoxo'. - 'QqJCEEFMbQ2b69o5qMiOOPqIMQkagu/aSL7waE8101WFShLjk9'. - 'yxgEvjRUiyYd+gwAjY2J9VpXfZ/JEXLhDp3OR6U4T97+hEnPwx'. - 'tv4HsRjy2tTQSFzQgDUnwSLBQRI+x1ZgcH87Vcv4SF19Kt0ezS'. - '1h9s0Ma25pgr/YJfnLnEysok0+ezjM6EBLldGqKIJYuDRhOQEJ'. - 'Oih8X9Q0xmcXNjlCofBJgn78wxVz7L2YWf8tPPz1hnfjbjzfxN'. - 'qVwutq2etZXUQSXikcXGIgUiUkJSDIQMJgYGJsaB3c7b1qQ4GZ'. - 'xSkdGZIwMeNLfK6uezMnvJK3pLxeVixfvMsyVjSNSO6IV9adPG'. - 'AArkEEz8oUkFmBjYGO80qfd6pCWIayD59wIKcsjcKqufn7JO/S'. - 'xfyi+5c24pey5rZ09mJRNkiDdT/tzbkBr3SYkpMYpgEaIJSYhI'. - 'kSOY1GhilAQk5ntDIojxCZ/kf87Pl85xbuWEnLiUy+cW3NNuJX'. - 'MmY5meKf6mT7wZS+THdOjxlG06tIlIOMZxchSxcFFEGAwAGGME'. - 'jwyZYSnWL3cXWiIUbUI6hO/vxXuFOV84ycmlBWthNeflTjuzTi'. - 'lzJmM5s46Ej0J63/ZoPmoy6PYxtYVNhmfs0mbAND1mmKVMBY1L'. - 'mxA1LN7WgXQbCApNhKJHRIM+DQbv7yQGhjnJ5NgFuXBuxpu5mD'. - 'udm3LPuY7pmZLUE6L1SIJaIPFuDAqyw9lnwDYv6NFHkWJh4ZDB'. - 'wCBFD3uMxsTAwcBAiElpE/KcPg36dIiOvpsRxDCyhmlP2YY9ZU'. - 'v8NMb/1id+FGO0DTztkSXLOONUqeITsMkW2zwnJEIDFhYGx+A1'. - 'kwK4mASkvKDPc3p0iYhRRwYUhZLUTyV6Eu0t4s1Y4kcx6W6KaM'. - 'EZThcXH59RRhGEgIAddnBwNEBKqqpUtWBIF22YDIhJsbEkJqFN'. - 'qLtERHs7GnUkwISEQAf0uj30bY39PzbiC6qrDu2cExJ69Nhhhz'. - '59UlIUipCQOnVi4sjG7ubJBy6um0C+he/0iDHQKIQERYyKFLqr'. - 'SI/W6kJCnvOcrWSLSquC1/Jw9Ks3R0FQKHr0uMc9bnCDGjX69A'. - 'H0XlcJkibN5jOe/alCZStHbjJL9lSMLkXExvCXRiDV6GZEeGeX'. - '3TvvBVQoEjfBL/v0rT75Th7VU5C8gktI6NLlMY+5yU3WWGODDf'. - 'r098tHpNFNH7/2lKdXXdz7efLzVaqJIBOCmK8AJUlI6g0aV+9y'. - '9+p7AR3bMQpTBWPy7yeN6fy0jNwewfpvC9Xe+3kFoUuXe9zj5n'. - 'BusEGHjh6GIAGawC2FWuvSvbbF1maFylZAsC1ISZADBiVNSJrP'. - 'eX73MY//skHP85z5+fnSxQsXj//4n39cmnPn7LbZlsajBmEnBL'. - '1nuEGDG9x4aa5Ldz+h0RCuBqwBv1Wo+7vs9r7n++0MmYeAM+zB'. - '+61EK1QUEnbbtN+9Bh3Hsebn54u//PdfLq9eWl2ZnZ1dSnaSwu'. - 'Pin40b9g3doKE0WoNIl65xj3v75njd3BBubQi6ExKmDWkMRKSl'. - 'tSbVKQcMao1Go5Ugb0+x53nOyZMnSysrKydXLq1cWlxa/McgCB'. - 'Yev3hU+GPrD3I5/q94k3pXYQY58q6B5Bs0HB//neaGx00gyWaz'. - 'VCoV7bquCoKAnZ0dfN/f03egLGj0m3XQNE1jdnY2/+WXXy6trq'. - '6uzP3oR5eCIFi4detW5feXL1vr679Let37zVB3/mQytjXJwmSB'. - 'wikHp9ShY0RESqObwPrr5oBERKhUKly4cIFqtUq9XufmzZtsbW'. - '2hXvuDwTTNtxZq8TyvsLy8vLS4uLgahOHphw8elL69fNlc++qr'. - 'uFOrNXPddm1cczVL5f5P+Lv5MuOJgTGxwYbZpZsCdeAq8M1Bcw'. - 'CGYeC6LtVqlRMnTjAyMkKn0yGXyx0N0LZt03Ec1zCMSrfXO37v'. - 'zp3S769csb+/ciXt1mrNdHf3ltZ6Lca8ZpJsduhtCdb2gEFJoQ'. - 'xADYHuHDS3f32lFEEQUK/XGRkZoVAocP78eZaXl9FaI/Jq25Uk'. - 'yWHAYrHozM/PlxYWFibTND32sFbLXrtyxVz76qukXas1M61WTW'. - 'm99gx+20TdN9jqtfjP7QzOwwYNp037Zd0DukDnIByA1pqdnR2+'. - '++472u02Z8+eZWJiAsMwDsEBRNGBzYJpmsaJEyfyX3zxxdLS0t'. - 'KlVqu1dP3q1cLta9ekU6u1dat1J9b6Sk9kraV1rYXegW7apDYw'. - 'kFY6fPc4MNTw88bwfZ/NzU2UUnieRxAEiAiGcXiXfcigiIjruo'. - 'VyubxkWdbK7fX1xWvffFMInjzBM82uMT5+p++6V1UUrSe7u03t'. - '+8lezlKt3gHyl0aSJDQaDa5fv876+vo+w6FzDq1BpZRsb2/bly'. - '9f9vL5/Njdu3fzG0+eMJHNxsfn532vXN5NPG/7abPZal6/Hvfe'. - 'kroPHfsm98f7AHW9Xo+//vrrlmVZm71+37QNw3JnZ9PK4uJGpV'. - 'pt4Dh+vLGhsrmcfv1iHzu01m89HjIdCon2fb8TBMHtvYeRUn50'. - '1Oj4vqp3Ok1f5LYSadfr9dQfDN642P/XeF2DA+SBAuA4jkOhUK'. - 'BQKESO43S11p3BYBDt7u4y+CtB/i/q7jp1GMiw2AAAAABJRU5E'. - 'rkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQolY9lkpgAACmhJREFUeJy9mOtzFNl5h5+3b9'. + 'Mz0kzPBWmEVtIiWYhIiC0HCDhB8lb8ISk7nzdZ5+/zJ/8BTmpT'. + '660CZLwG1pVFgBkgGIHECEaa+/T9nHzQCCQuRpCNz6mp6g893U'. + '8/c37ve3qEjxiC4OA4n/Lp/EUu/tsMM/+aEWduVBx7WhdkShcY'. + 'xUH2zo0Dwod/5N6vf8V//PoGdx8M8EOFPtK9jI8BdHCcMuVSmf'. + 'LxHLmSZdm2U8xIbmKETDGDZZnIy4dBbCynyGhphurEDBOlHFnn'. + 'qPcyPxTOwDCOccw7w5nlBRZWylI+ny/mZ6rL1dzUZ5/IWGZU3D'. + 'ZIOMQDDaJcHDVGWUbJBi9odVr0QoVSPzigIEaZ8vgSS/8wZU3/'. + 'k1fylipz5dLM2WlrZqHKaGCKbEbontq3KAKWQyZfZKTgYqc9Bp'. + '2I2PcJ4ogk/UEBQcwipbFZmT13vDBx8fhnE1Ofnp9yJopFyT3X'. + 'yANfks0QHSQMDaL37pOxMLIu2UyVkjVKLjyKSeuD8dAYCFkso1'. + 'gYMaeWJ40T56cl8yAi/O4FSa2P6kYczIDsgVpAqcDImZPMuAB1'. + 'dkLQtcc8a/bwox8IUHAxZVxGZMouSLVYwKuMkD5IxN+JSdsRJB'. + 'pexuTVgYYM6EoGmxkmg3/hEhNUMr/hd7dqbOzExMn/GRDAxWZc'. + 'j3I8HiXfMjF2FQowKw7pjoN6E/Llw/GBJj8qxVOMlX4ipxc/lY'. + 'kl2zBLkmrTcEzMkoNoRLVidLi/9g+Z3I+1xRHX5EcAihxnbPRv'. + 'OTU9kZSmpKPy9FTGrLimPZ1H+UiyGaF67w6n7E1DwMngFDxGvc'. + 'w70v0xZUby5IxjlIyMssUJrJwVWkXBdbXvSvwEibcSdKCAFI16'. + '4/sc0SRo9cGAGq1DwvQFzV6DVuBiV4zYnlEts6A2TSPcSiXoxo'. + 'QqJCEEFMbQ2b69o5qMiOOPqIMQkagu/aSL7waE8101WFShLjk9'. + 'yxgEvjRUiyYd+gwAjY2J9VpXfZ/JEXLhDp3OR6U4T97+hEnPwx'. + 'tv4HsRjy2tTQSFzQgDUnwSLBQRI+x1ZgcH87Vcv4SF19Kt0ezS'. + '1h9s0Ma25pgr/YJfnLnEysok0+ezjM6EBLldGqKIJYuDRhOQEJ'. + 'Oih8X9Q0xmcXNjlCofBJgn78wxVz7L2YWf8tPPz1hnfjbjzfxN'. + 'qVwutq2etZXUQSXikcXGIgUiUkJSDIQMJgYGJsaB3c7b1qQ4GZ'. + 'xSkdGZIwMeNLfK6uezMnvJK3pLxeVixfvMsyVjSNSO6IV9adPG'. + 'AArkEEz8oUkFmBjYGO80qfd6pCWIayD59wIKcsjcKqufn7JO/S'. + 'xfyi+5c24pey5rZ09mJRNkiDdT/tzbkBr3SYkpMYpgEaIJSYhI'. + 'kSOY1GhilAQk5ntDIojxCZ/kf87Pl85xbuWEnLiUy+cW3NNuJX'. + 'MmY5meKf6mT7wZS+THdOjxlG06tIlIOMZxchSxcFFEGAwAGGME'. + 'jwyZYSnWL3cXWiIUbUI6hO/vxXuFOV84ycmlBWthNeflTjuzTi'. + 'lzJmM5s46Ej0J63/ZoPmoy6PYxtYVNhmfs0mbAND1mmKVMBY1L'. + 'mxA1LN7WgXQbCApNhKJHRIM+DQbv7yQGhjnJ5NgFuXBuxpu5mD'. + 'udm3LPuY7pmZLUE6L1SIJaIPFuDAqyw9lnwDYv6NFHkWJh4ZDB'. + 'wCBFD3uMxsTAwcBAiElpE/KcPg36dIiOvpsRxDCyhmlP2YY9ZU'. + 'v8NMb/1id+FGO0DTztkSXLOONUqeITsMkW2zwnJEIDFhYGx+A1'. + 'kwK4mASkvKDPc3p0iYhRRwYUhZLUTyV6Eu0t4s1Y4kcx6W6KaM'. + 'EZThcXH59RRhGEgIAddnBwNEBKqqpUtWBIF22YDIhJsbEkJqFN'. + 'qLtERHs7GnUkwISEQAf0uj30bY39PzbiC6qrDu2cExJ69Nhhhz'. + '59UlIUipCQOnVi4sjG7ubJBy6um0C+he/0iDHQKIQERYyKFLqr'. + 'SI/W6kJCnvOcrWSLSquC1/Jw9Ks3R0FQKHr0uMc9bnCDGjX69A'. + 'H0XlcJkibN5jOe/alCZStHbjJL9lSMLkXExvCXRiDV6GZEeGeX'. + '3TvvBVQoEjfBL/v0rT75Th7VU5C8gktI6NLlMY+5yU3WWGODDf'. + 'r098tHpNFNH7/2lKdXXdz7efLzVaqJIBOCmK8AJUlI6g0aV+9y'. + '9+p7AR3bMQpTBWPy7yeN6fy0jNwewfpvC9Xe+3kFoUuXe9zj5n'. + 'BusEGHjh6GIAGawC2FWuvSvbbF1maFylZAsC1ISZADBiVNSJrP'. + 'eX73MY//skHP85z5+fnSxQsXj//4n39cmnPn7LbZlsajBmEnBL'. + '1nuEGDG9x4aa5Ldz+h0RCuBqwBv1Wo+7vs9r7n++0MmYeAM+zB'. + '+61EK1QUEnbbtN+9Bh3Hsebn54u//PdfLq9eWl2ZnZ1dSnaSwu'. + 'Pin40b9g3doKE0WoNIl65xj3v75njd3BBubQi6ExKmDWkMRKSl'. + 'tSbVKQcMao1Go5Ugb0+x53nOyZMnSysrKydXLq1cWlxa/McgCB'. + 'Yev3hU+GPrD3I5/q94k3pXYQY58q6B5Bs0HB//neaGx00gyWaz'. + 'VCoV7bquCoKAnZ0dfN/f03egLGj0m3XQNE1jdnY2/+WXXy6trq'. + '6uzP3oR5eCIFi4detW5feXL1vr679Let37zVB3/mQytjXJwmSB'. + 'wikHp9ShY0RESqObwPrr5oBERKhUKly4cIFqtUq9XufmzZtsbW'. + '2hXvuDwTTNtxZq8TyvsLy8vLS4uLgahOHphw8elL69fNlc++qr'. + 'uFOrNXPddm1cczVL5f5P+Lv5MuOJgTGxwYbZpZsCdeAq8M1Bcw'. + 'CGYeC6LtVqlRMnTjAyMkKn0yGXyx0N0LZt03Ec1zCMSrfXO37v'. + 'zp3S769csb+/ciXt1mrNdHf3ltZ6Lca8ZpJsduhtCdb2gEFJoQ'. + 'xADYHuHDS3f32lFEEQUK/XGRkZoVAocP78eZaXl9FaI/Jq25Uk'. + 'yWHAYrHozM/PlxYWFibTND32sFbLXrtyxVz76qukXas1M61WTW'. + 'm99gx+20TdN9jqtfjP7QzOwwYNp037Zd0DukDnIByA1pqdnR2+'. + '++472u02Z8+eZWJiAsMwDsEBRNGBzYJpmsaJEyfyX3zxxdLS0t'. + 'KlVqu1dP3q1cLta9ekU6u1dat1J9b6Sk9kraV1rYXegW7apDYw'. + 'kFY6fPc4MNTw88bwfZ/NzU2UUnieRxAEiAiGcXiXfcigiIjruo'. + 'VyubxkWdbK7fX1xWvffFMInjzBM82uMT5+p++6V1UUrSe7u03t'. + '+8lezlKt3gHyl0aSJDQaDa5fv876+vo+w6FzDq1BpZRsb2/bly'. + '9f9vL5/Njdu3fzG0+eMJHNxsfn532vXN5NPG/7abPZal6/Hvfe'. + 'kroPHfsm98f7AHW9Xo+//vrrlmVZm71+37QNw3JnZ9PK4uJGpV'. + 'pt4Dh+vLGhsrmcfv1iHzu01m89HjIdCon2fb8TBMHtvYeRUn50'. + '1Oj4vqp3Ok1f5LYSadfr9dQfDN642P/XeF2DA+SBAuA4jkOhUK'. + 'BQKESO43S11p3BYBDt7u4y+CtB/i/q7jp1GMiw2AAAAABJRU5E'. + 'rkJggg==' ; //========================================================== // File: ppl_blue.png //========================================================== $this->imgdata_large[3][0]= 2284 ; $this->imgdata_large[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFRAiTZAL3gAACHlJREFUeJy9mGtv29YZgJ9zKF'. - 'F3y/Q9jh05tuQkarKgbYasde0UBdZgwNou/Vqga/sD9mP2B4a1'. - 'BbZ9atFPxb5sqOtmXbI19bqsluPYiR3HN90vFEWRZx/IJI5zqa'. - 'x0OwBBSgR5Hj7v+55zSEFXTUgIJyA9C6/9RsjMjAyFIxxJCDc7'. - 'iBqKgyZACGg3G2x9+xXf/fG33P3mC9qNKsp1O+1JdkEnQTdgIO'. - 'ttCSMUi8gj072MnugllAyB9G8rBGi6RsToJTF6iuRoFi1kHKZf'. - '7fB8Iggj0/Dy23D2dakNTR3JDsXPvzstxmZGRMER1EwHhQAEgE'. - 'CLhIkPD6InY9S3djGLJVBtQP1Qb4HDAyoJYQOOZkPx49nhTH9i'. - '7MUBGT7egxkJgd70wZS/CUkoZtA/fRoE1DZ2ACiv52ibReCp4e'. - '7CIEHomxDiuVdGTqUnf/ZeOjR8fpiVXZul5ZrY3bWwbdcLr/dA'. - 'AAIpAwQjUWIjQ+g9HZvswiCgBVF9/SI6OSLGzo0i+oLi6+Utbq'. - '+bKEftgwOE/0Ohocf66M+cBjo22U2RQLIHMhmYnvaOpR9S8bSU'. - 'UqCURGpRkuMZMm9cIvPGJZLj0yBjT2LprkiSkykx9cuXIhOnUs'. - 'm+QNC2XdG02ggBTcvFabsPWwTPpBAChSCgh4kYBpoeplWp47Qs'. - '7EYDt21xINzd5GCAxLExRl89Z+nHjpbKMmjbmkgfDzI0JEW53K'. - 'Jaa6NcAOEX8v52uJzsBlAS6u0hcnTIccPRqhWPCUcLD+s1EaUp'. - 'HCEhEMCyHNpt9SjgIU12A6iw6xb123vYhaaKjB9tlgMD5X+uBp'. - 'zdkpg6azA8EaNQtKlVba+Xez4eCntnJrsDdFsW5nYFpxlFN846'. - 'DXe8utkM4mhi+EgQmjYbS2WqexZKk6BpjwJ2YlK5VjeA3pNDiH'. - 'YjRWPzPE7tmBo8EWwGhkXx+z3uXL7D3rU97LIF8RBEAl6lK/Uo'. - '6JNM1rZ2aTcr3eUgIQOGTgbdwXMGyRejenLYTvQGbAdRuetSud'. - 'OivVuFZgtCEgICghICnZoMhmlVTPR49LCAEkQUhk/B7KXe0MWf'. - 'nxj8xVR/cDheK14WZmtVMJSBnlGoN6FmQq0FLfdwJgORKPHRo/'. - 'Snzx4G0F/FjJ4KiOdmjPCrrx8bffnMybMv9MQGNG3rzlVqtR1B'. - 'sh/CYXCD4Aag1oCW7ZnUOjSp6WFi/QNEB8Y7BfTNjZyCmUvJ0I'. - 'XXT47MTp98Ybon9VZCk8cVazfqlNargsY34G7ByAlIjkHd9CCr'. - 'LbBdiHViUgiECuDKYCdz8b2cywREdiYZOj8zNnLuzOTzx6ODp+'. - 'OaGaqwVzBFqz0Idhz2loE7YEwBLaAJLQcKbW8qjAcBF5Jh0AMP'. - 'IOHe6kxgtb3UMO2OxkF//ffK28nQqxfvm3szrtnDVa799Qb/+v'. - 'NtsbNSpm3tAv8B+w7Ub0FhAyoBcMPec9oK6raXk48ziQBXQcmC'. - 'pT3YqHa0mpEBkTR6wz/Jjo2cy04+fzwxdDquNfQKO7sFUbpu0c'. - 'wp3JoAYsA42Bbkl4GCryUNDEM7Avm6Z/CgSYBWG8pNuFuDu1Wo'. - 'tjoxKIJGeHIiM/jmK9NnX5ycuJQMtUcqXPvLDTa+qIie4hAJ1U'. - 'vdrmO2HaDfB931twJgAn1A4lGT96obPHPLBbhVgUoTHHWo9aAA'. - 'JVAKpyKEmQNzWRENAsL18ycKjAFN/9gCNvzLB/390MMmE7pnDi'. - 'Bvwt0K5Jv3O+0oB22nJ1Vvjb/UMhOpcKknqN1OiMB2DNHU2G5s'. - 'sVndpGJVcZXjX1IAlvw9PmhRQcOFPhsSDkiBrQR1G7brgs0a7D'. - 'ag3FK4rguqBXarI4Nt1SJv5gls7TEWtJDRBO2GwnIs8maevFnA'. - 'Gx6awLZvzeTBu4kFbLigijC47pscpx0xyDfkvtUEnlarCDtrUC'. - 't2HGIhvPHVdVwqjTIrxRU2a5uUrYoP0QZ2gMvACl7+3V/LuKDq'. - 'sJuDy597516+CEezIHXv7vcgXQu2l+Bvn8He9Y4AE4kgk5P9DE'. - 'R6aFdq5Et5Nit3yTf3m9sBcsAN3+D98c0Fit5JawE25r1zg1Fo'. - '5B8GFD7g+nVYnu8EUEop9XTa0N/9dUbqcphP/rDJzbUClVbpgR'. - 'y2fXM3fND95qj75J8AC6BWPINfVSBieK+x+6cS5UCzCLu3oFV9'. - 'GqCMx2NGOp2Znpv7aXZudsool3T5J/179sxVlHJ4kGPrP2COBX'. - '/7DmiApWCjxIMXpYNznYuXM+6TAKWUMppOZzLvv//ery5cuDCT'. - 'SqVS336bCwr1JfAPB9r+2KAFwJS+OcETzZHz/7v3etl6ipz77X'. - 'GAMh6PG+l0OjM3NzczOzs3k0pNnFlbW43+e/GKtMqrblSsF03V'. - 'WHcJA0PjIAzvg9JTze2H67g9DjAwOTmZ+uCDD96anZ2dnZiYmF'. - '5dW41++Lvfa1fnr7qllVK9103mXNTnJgPA+YugsvB3HTaEl+Qs'. - 'AZ/yeHPPDCiTyaRx5syZbGoilV1dW00szC9oV+avusuLy0Xd0X'. - 'MgFkDM+zkYBZEHV8f7wwKu84zmngQoNU0LaZoWUa4K31y5qX/8'. - '4cfyyvwVN5/L10NOKNeg8UmDxoKF5Vfj1xXAgD0JrgAcvBDfel'. - 'a4g4AykUgY6XR6emJiIru2ttZXq9S0K19eUcuLy8WQE8o5OAsN'. - 'Ggsmpl+NpoL1g9X4UBU+C9xDgEKIwNTUVOqdd955M9mbnJ3/cj'. - '6Vu5aTheXCQXNdVeMzAwJSCGEA2XKpnF1cXIzlFnOVhJPIKdR+'. - 'c88ctq4AlVKsrKzw0UcfKcC5uXqzXnNqSzb2pwLxOHP/l7Z/BN'. - 'eB01LKt4HTrusKvGr8jB+hGn8MQAkYQMrfw4Nq/MFPtf+rdvDb'. - 'k8QL+/5Z4Uepxm7bfwHuTAVUWpWaqAAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFRAiTZAL3gAACHlJREFUeJy9mGtv29YZgJ9zKF'. + 'F3y/Q9jh05tuQkarKgbYasde0UBdZgwNou/Vqga/sD9mP2B4a1'. + 'BbZ9atFPxb5sqOtmXbI19bqsluPYiR3HN90vFEWRZx/IJI5zqa'. + 'x0OwBBSgR5Hj7v+55zSEFXTUgIJyA9C6/9RsjMjAyFIxxJCDc7'. + 'iBqKgyZACGg3G2x9+xXf/fG33P3mC9qNKsp1O+1JdkEnQTdgIO'. + 'ttCSMUi8gj072MnugllAyB9G8rBGi6RsToJTF6iuRoFi1kHKZf'. + '7fB8Iggj0/Dy23D2dakNTR3JDsXPvzstxmZGRMER1EwHhQAEgE'. + 'CLhIkPD6InY9S3djGLJVBtQP1Qb4HDAyoJYQOOZkPx49nhTH9i'. + '7MUBGT7egxkJgd70wZS/CUkoZtA/fRoE1DZ2ACiv52ibReCp4e'. + '7CIEHomxDiuVdGTqUnf/ZeOjR8fpiVXZul5ZrY3bWwbdcLr/dA'. + 'AAIpAwQjUWIjQ+g9HZvswiCgBVF9/SI6OSLGzo0i+oLi6+Utbq'. + '+bKEftgwOE/0Ohocf66M+cBjo22U2RQLIHMhmYnvaOpR9S8bSU'. + 'UqCURGpRkuMZMm9cIvPGJZLj0yBjT2LprkiSkykx9cuXIhOnUs'. + 'm+QNC2XdG02ggBTcvFabsPWwTPpBAChSCgh4kYBpoeplWp47Qs'. + '7EYDt21xINzd5GCAxLExRl89Z+nHjpbKMmjbmkgfDzI0JEW53K'. + 'Jaa6NcAOEX8v52uJzsBlAS6u0hcnTIccPRqhWPCUcLD+s1EaUp'. + 'HCEhEMCyHNpt9SjgIU12A6iw6xb123vYhaaKjB9tlgMD5X+uBp'. + 'zdkpg6azA8EaNQtKlVba+Xez4eCntnJrsDdFsW5nYFpxlFN846'. + 'DXe8utkM4mhi+EgQmjYbS2WqexZKk6BpjwJ2YlK5VjeA3pNDiH'. + 'YjRWPzPE7tmBo8EWwGhkXx+z3uXL7D3rU97LIF8RBEAl6lK/Uo'. + '6JNM1rZ2aTcr3eUgIQOGTgbdwXMGyRejenLYTvQGbAdRuetSud'. + 'OivVuFZgtCEgICghICnZoMhmlVTPR49LCAEkQUhk/B7KXe0MWf'. + 'nxj8xVR/cDheK14WZmtVMJSBnlGoN6FmQq0FLfdwJgORKPHRo/'. + 'Snzx4G0F/FjJ4KiOdmjPCrrx8bffnMybMv9MQGNG3rzlVqtR1B'. + 'sh/CYXCD4Aag1oCW7ZnUOjSp6WFi/QNEB8Y7BfTNjZyCmUvJ0I'. + 'XXT47MTp98Ybon9VZCk8cVazfqlNargsY34G7ByAlIjkHd9CCr'. + 'LbBdiHViUgiECuDKYCdz8b2cywREdiYZOj8zNnLuzOTzx6ODp+'. + 'OaGaqwVzBFqz0Idhz2loE7YEwBLaAJLQcKbW8qjAcBF5Jh0AMP'. + 'IOHe6kxgtb3UMO2OxkF//ffK28nQqxfvm3szrtnDVa799Qb/+v'. + 'NtsbNSpm3tAv8B+w7Ub0FhAyoBcMPec9oK6raXk48ziQBXQcmC'. + 'pT3YqHa0mpEBkTR6wz/Jjo2cy04+fzwxdDquNfQKO7sFUbpu0c'. + 'wp3JoAYsA42Bbkl4GCryUNDEM7Avm6Z/CgSYBWG8pNuFuDu1Wo'. + 'tjoxKIJGeHIiM/jmK9NnX5ycuJQMtUcqXPvLDTa+qIie4hAJ1U'. + 'vdrmO2HaDfB931twJgAn1A4lGT96obPHPLBbhVgUoTHHWo9aAA'. + 'JVAKpyKEmQNzWRENAsL18ycKjAFN/9gCNvzLB/390MMmE7pnDi'. + 'Bvwt0K5Jv3O+0oB22nJ1Vvjb/UMhOpcKknqN1OiMB2DNHU2G5s'. + 'sVndpGJVcZXjX1IAlvw9PmhRQcOFPhsSDkiBrQR1G7brgs0a7D'. + 'ag3FK4rguqBXarI4Nt1SJv5gls7TEWtJDRBO2GwnIs8maevFnA'. + 'Gx6awLZvzeTBu4kFbLigijC47pscpx0xyDfkvtUEnlarCDtrUC'. + 't2HGIhvPHVdVwqjTIrxRU2a5uUrYoP0QZ2gMvACl7+3V/LuKDq'. + 'sJuDy597516+CEezIHXv7vcgXQu2l+Bvn8He9Y4AE4kgk5P9DE'. + 'R6aFdq5Et5Nit3yTf3m9sBcsAN3+D98c0Fit5JawE25r1zg1Fo'. + '5B8GFD7g+nVYnu8EUEop9XTa0N/9dUbqcphP/rDJzbUClVbpgR'. + 'y2fXM3fND95qj75J8AC6BWPINfVSBieK+x+6cS5UCzCLu3oFV9'. + 'GqCMx2NGOp2Znpv7aXZudsool3T5J/179sxVlHJ4kGPrP2COBX'. + '/7DmiApWCjxIMXpYNznYuXM+6TAKWUMppOZzLvv//ery5cuDCT'. + 'SqVS336bCwr1JfAPB9r+2KAFwJS+OcETzZHz/7v3etl6ipz77X'. + 'GAMh6PG+l0OjM3NzczOzs3k0pNnFlbW43+e/GKtMqrblSsF03V'. + 'WHcJA0PjIAzvg9JTze2H67g9DjAwOTmZ+uCDD96anZ2dnZiYmF'. + '5dW41++Lvfa1fnr7qllVK9103mXNTnJgPA+YugsvB3HTaEl+Qs'. + 'AZ/yeHPPDCiTyaRx5syZbGoilV1dW00szC9oV+avusuLy0Xd0X'. + 'MgFkDM+zkYBZEHV8f7wwKu84zmngQoNU0LaZoWUa4K31y5qX/8'. + '4cfyyvwVN5/L10NOKNeg8UmDxoKF5Vfj1xXAgD0JrgAcvBDfel'. + 'a4g4AykUgY6XR6emJiIru2ttZXq9S0K19eUcuLy8WQE8o5OAsN'. + 'Ggsmpl+NpoL1g9X4UBU+C9xDgEKIwNTUVOqdd955M9mbnJ3/cj'. + '6Vu5aTheXCQXNdVeMzAwJSCGEA2XKpnF1cXIzlFnOVhJPIKdR+'. + 'c88ctq4AlVKsrKzw0UcfKcC5uXqzXnNqSzb2pwLxOHP/l7Z/BN'. + 'eB01LKt4HTrusKvGr8jB+hGn8MQAkYQMrfw4Nq/MFPtf+rdvDb'. + 'k8QL+/5Z4Uepxm7bfwHuTAVUWpWaqAAAAABJRU5ErkJggg==' ; //========================================================== // File: ppl_green.png //========================================================== $this->imgdata_large[4][0]= 2854 ; $this->imgdata_large[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFQ4hANhluwAACrNJREFUeJytmF1zE1eagJ+3u9'. - 'XdkvUty2AbmLEtEzDBgZ0UpDBOalNTUzU3czl7tct/2n+wt3M/'. - 'NVM12SSTQQSyW2TA+QAJQogtYYFtyfrqL3WfvWj5g8AEjzfvhS'. - 'SXjk8//Zz3Pf3qCMcJAWxMKlT4kH+jwu/FknnJSUItKFHzCrKA'. - 'BggBQx5ziz/wn/yBz3hED4/oaJfSjgVoYjJJgTLTZCjohp7IGT'. - 'k5aZ4kb+bRTR30Q7djj8f/kpPMUSCFedRL6W8e8qMQNE6S4xpv'. - 'c5HrTPFubiJ3ZnlyOXV59rJYU5Z00h1c3d0brxAiUkScRijisk'. - '6XLTyiN3s8HuAJpniXa/q8/pt8Or+0kF8oXJm5YiydWcIpOrJu'. - 'rjOQwd54AQwsMpTJYhPSoYuLQ58An/DnBQSdImXO8avsTPbqpc'. - 'lLp67OXDVzMznZLGxSs2qyIRu4at8gKHQEC50kE1icxqCAdxST'. - 'xjEA44tqaJlERl8uLWvvnX5PHuQfcCdxh5qq0aX76vj4WgWyXO'. - 'QiNgBP8IAaddr08X8+wHFmJSQhBbPAZGoSZSt5wQs6qoNC7UEd'. - '4AEoLIQSCaCCy78Dv8Tiv1hjjW1CRj8XIAgEKqDtt9keboMJZa'. - 'vMjuzQVd3Xr9prTJo+GF/jKZea95R25Lxs8jg5qFGiwDnOS0mW'. - 'NE0rjNRIt3WbklUCA9mV3Zdz8OBT/JfCQLB0SKYVVjGFYSfx/E'. - '26ow4e6uDujlPFQpE0FU6P8qNTHdXJdEdda0qf0itWBVM3pa/3'. - 'ccUlIECJet0cAJoeYk5EZCeS5IwEoerSxccJBwRqFFf38QCTaO'. - 'TRVFKJm3NTbtLNSyh2IkhIXsvLCesEGNCWdmwyruSD/z9kUlRc'. - '3bqNlSxhJNJ43p5JITrOEis8Qtr0cXEpU/JT/pmO18n2vb42pU'. - '3JnDnHMBqyPlpnoAaxhr2llv1ZUBqEGlqYwDQMsskMOcMgVL3Y'. - 'ZOQTHAcQQiIGjHCwCaiovjrv4hbcpKuJJjIcDHm685RGr4GLCx'. - 'YHkAcrLoAoDSLBiAQrMkjqybHJCbxgh+7xAC1MpsgzwRwD3qHL'. - 'WyTIBdlAa6u2rHfXaew06PV78ZZjAwleNnkolECoH5i090wOcY'. - '+TgwYzFHiPi1zkOkXexeAMASnVU+LiyiA1wFUuaqggACLizeWw'. - 'ycMzyssmVYKkbpGyC5T+OUALk2mKLHKWf+ED/az+YW42d66YL+'. - 'aNrmEEzQCFEnKw368EgEvcN1m80eTIQIt0TFOjMJHkzNEBBYPp'. - 'sblf8QHzrORO5JaWZ5ZLl6cuJyyxpNPv4PZdoT+GyIxBfI5uUg'. - 'eJMCwP2/bIHO1JEudcgUUWOceKNq99mCvnzs5PzRcuTV4y5mRO'. - 'SMIjo47z5S7a94oQCNKgJsZwO7D/IDNg3/LLhRNXt4JohBb4aG'. - '82GLdXcf93mQ+Y43r2RHZp+cRy6cqJK4l8MS+tdItaqiYtc0Mm'. - 'QpfJARh98HYh9IiXVcaAo58wGb+LBAjbSPgCOcoSa0wzxXtc08'. - '/pv8mfyL+9MLVQvDJ1JVHJV6SZbFI1qtTsB+KlehRtRTGE8Afo'. - 'P4DRcAxiEudhAHjjzz+ubgX4oHowakHQOlqzICQwyVPITGVOXi'. - 'xfLF6aumzmczl5lHzMff2+fCdPaGttEkXoLQAO9B7C6EugPYby'. - 'gVPjGXc5eIbNAJPjGwiAbaAJUQv8wVG7GROkJFpyOqn/ovgLba'. - '44L0+sDaraXb6jzq7aBQWjBOyUoHcaopOgmaA3IRyNDZnA1HjO'. - 'HSBkr7eEFDAEngHrQCf+/s2A8cSiSkqcKUeeTjwFy2Jd78t3+L'. - 'TR4itIiBLwLQhzkJyB5Cx4HXDaENVQCBAQcRqFIHTRaBIvuYXg'. - 'AdsouuNxEL0ZUBHnSQp66R73zYfUtQ6OytKT8RckQAJQoLtgO5'. - 'BJgj0D/WfgdyHaAHx8THoUcbGx8ciwhUl3bDEiToURPooeI7pH'. - 'MziK9Yd9nU5a6GgKjOH41vsgI4hAcyC5AZkapF+AoYNrjjsuhx'. - 'FbtPmeB5ykyQQzTPAWAQWC8S9oAI0QRRuPb9jkmyMZNAOTklvC'. - 'GGYZaFkGmkVAh8h4DtKFMIBunG+pB5B5AIkGBDsQ+qBiL20caj'. - 'zhJknq5KlgMkLjJHJos4kYEbFJi5vc5eYbATVN02bNWe19+32t'. - 'aJWlFm3wbf8Rz5NbDFJdlOFBF/g7cBf0JkrbBb+F6j1DOduEkU'. - '8bWCOiSofPWadBnSZDWmgUkEMGhZCINut8S/0NBtPptFlZrBSu'. - 'vnt1+ndnflfIp9OJ/279Ubbbd+lP7KBKPoEBsgnqLph/BRzwdS'. - 'LnBUFvHcfdpRsGPAGqwMco6jynz+e0SPKYCHMfLX5VKHwcenR+'. - 'Igd1XTcqlUr+xn/cePv91fevzy8sLO2OtrOpWkqL7gXKSAVRdh'. - 'ZFEmEXoYkwBNqovoc/3GHH3aUR+jwC1oD/AWrANi4hGwyBzqEG'. - 'Vvb77Dgi0eT1VZzJZMxKpVJYXV1dXF1dXVm6sPSvruue3Xzcyj'. - '6/syvDzwj0lNazK6Fj5LFCRZouZpBABj6jXouu3+Np6HNvDHaf'. - 'g91t74msbMuOJicnSSaTKKUQEUQEpRSO69But1/dB0VEm5uby9'. - 'y4cWNpdXX1+sLCworrume//PuXpeqnVeOban0U1PW2kcx+O9L7'. - 'Te9sUB4lWFR9SqNtNGcHx+/RDD2+Am4D94CnQA8OjjlEhMnyJC'. - 'srK8zOzu7BiYioMAzZ2Njg9u3brwIqpSSXy2WXl5eXLly4sOo4'. - 'zoV6vV6oflrVP/7Tx8Hmw1Zb6ydqmpWp7ha8h4O3gjOhzVANmF'. - 'XPMNQWvdDnCXCXuHR+APqH4fbCtm2mp6eZn59H13WJuYXRaKSU'. - 'UiSTyVcBdV3XDcOwRaTU7/en19bWCn/79G+JL/76RbhZ22y7u+'. - '6ahl71nPDz/nO17m7wAxlabFOihy4+DvAcqAMbPzZ3OFzX5dmz'. - 'Z2iahoiosUUVhiGNRgPHcV4GzGQy5uLiYuH8+fMzo9FoslarJW'. - '9+elP75E+fBJu1zY7qqpqBUW3T/niohnVvy+1zm5aVtp+WE2XT'. - 'nrHFzbjh1tYLz3XdPjD4R3BKKba2tqhWq4dzUO3noBPn4H5PKy'. - 'LaO++8U7hx48byhQsXVne7u6tf3/v64t3P7mbq9+odt+OuaWi3'. - 'PLxbW2ytubjbQCgiMnt6VlaurWgz0zM0m02q1WrUaDSUUuqI56'. - 'ivDxE5MCgiYllWtlwuL5mmufLV/a/O/uXPf9Ff1F+80Lv6Yx29'. - '2qHzyZBh3cdvc7gaTZuZkzPh/Py8ACqVSv1/uPZDKXUAGEWRtF'. - 'qtxEcffZTL5XLF+2v39fqjeivshA/TpP83JLwzYFBzcA4370Cc'. - 'S81nTRBUs9lkOByi1GuOPI4Rh3+26JZlnSkWi781DOPXvV4v3+'. - '/2G0R8kSBxB/jew+tERK+c49m2TblcxrZtXNfl+fPneJ6HZVmU'. - 'y2VJJpNyaJ9TSinlOA5bW1u4rntkQA0oAG8D54gb9W3ianxM3A'. - 'e/cn73U3Hq1Cm5du2aPjs7a+ztcSIShmE4ajQa6tatWzQajZ+0'. - 'fbiKI+It4SvijVUj7kL2qvGfgkskEqTTaZmcnDROnTplJhIJTU'. - 'QiwPd9P/Q8T6XTaQzDIAiCfzjP/wFVfszuFqdHXgAAAABJRU5E'. - 'rkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFQ4hANhluwAACrNJREFUeJytmF1zE1eagJ+3u9'. + 'XdkvUty2AbmLEtEzDBgZ0UpDBOalNTUzU3czl7tct/2n+wt3M/'. + 'NVM12SSTQQSyW2TA+QAJQogtYYFtyfrqL3WfvWj5g8AEjzfvhS'. + 'SXjk8//Zz3Pf3qCMcJAWxMKlT4kH+jwu/FknnJSUItKFHzCrKA'. + 'BggBQx5ziz/wn/yBz3hED4/oaJfSjgVoYjJJgTLTZCjohp7IGT'. + 'k5aZ4kb+bRTR30Q7djj8f/kpPMUSCFedRL6W8e8qMQNE6S4xpv'. + 'c5HrTPFubiJ3ZnlyOXV59rJYU5Z00h1c3d0brxAiUkScRijisk'. + '6XLTyiN3s8HuAJpniXa/q8/pt8Or+0kF8oXJm5YiydWcIpOrJu'. + 'rjOQwd54AQwsMpTJYhPSoYuLQ58An/DnBQSdImXO8avsTPbqpc'. + 'lLp67OXDVzMznZLGxSs2qyIRu4at8gKHQEC50kE1icxqCAdxST'. + 'xjEA44tqaJlERl8uLWvvnX5PHuQfcCdxh5qq0aX76vj4WgWyXO'. + 'QiNgBP8IAaddr08X8+wHFmJSQhBbPAZGoSZSt5wQs6qoNC7UEd'. + '4AEoLIQSCaCCy78Dv8Tiv1hjjW1CRj8XIAgEKqDtt9keboMJZa'. + 'vMjuzQVd3Xr9prTJo+GF/jKZea95R25Lxs8jg5qFGiwDnOS0mW'. + 'NE0rjNRIt3WbklUCA9mV3Zdz8OBT/JfCQLB0SKYVVjGFYSfx/E'. + '26ow4e6uDujlPFQpE0FU6P8qNTHdXJdEdda0qf0itWBVM3pa/3'. + 'ccUlIECJet0cAJoeYk5EZCeS5IwEoerSxccJBwRqFFf38QCTaO'. + 'TRVFKJm3NTbtLNSyh2IkhIXsvLCesEGNCWdmwyruSD/z9kUlRc'. + '3bqNlSxhJNJ43p5JITrOEis8Qtr0cXEpU/JT/pmO18n2vb42pU'. + '3JnDnHMBqyPlpnoAaxhr2llv1ZUBqEGlqYwDQMsskMOcMgVL3Y'. + 'ZOQTHAcQQiIGjHCwCaiovjrv4hbcpKuJJjIcDHm685RGr4GLCx'. + 'YHkAcrLoAoDSLBiAQrMkjqybHJCbxgh+7xAC1MpsgzwRwD3qHL'. + 'WyTIBdlAa6u2rHfXaew06PV78ZZjAwleNnkolECoH5i090wOcY'. + '+TgwYzFHiPi1zkOkXexeAMASnVU+LiyiA1wFUuaqggACLizeWw'. + 'ycMzyssmVYKkbpGyC5T+OUALk2mKLHKWf+ED/az+YW42d66YL+'. + 'aNrmEEzQCFEnKw368EgEvcN1m80eTIQIt0TFOjMJHkzNEBBYPp'. + 'sblf8QHzrORO5JaWZ5ZLl6cuJyyxpNPv4PZdoT+GyIxBfI5uUg'. + 'eJMCwP2/bIHO1JEudcgUUWOceKNq99mCvnzs5PzRcuTV4y5mRO'. + 'SMIjo47z5S7a94oQCNKgJsZwO7D/IDNg3/LLhRNXt4JohBb4aG'. + '82GLdXcf93mQ+Y43r2RHZp+cRy6cqJK4l8MS+tdItaqiYtc0Mm'. + 'QpfJARh98HYh9IiXVcaAo58wGb+LBAjbSPgCOcoSa0wzxXtc08'. + '/pv8mfyL+9MLVQvDJ1JVHJV6SZbFI1qtTsB+KlehRtRTGE8Afo'. + 'P4DRcAxiEudhAHjjzz+ubgX4oHowakHQOlqzICQwyVPITGVOXi'. + 'xfLF6aumzmczl5lHzMff2+fCdPaGttEkXoLQAO9B7C6EugPYby'. + 'gVPjGXc5eIbNAJPjGwiAbaAJUQv8wVG7GROkJFpyOqn/ovgLba'. + '44L0+sDaraXb6jzq7aBQWjBOyUoHcaopOgmaA3IRyNDZnA1HjO'. + 'HSBkr7eEFDAEngHrQCf+/s2A8cSiSkqcKUeeTjwFy2Jd78t3+L'. + 'TR4itIiBLwLQhzkJyB5Cx4HXDaENVQCBAQcRqFIHTRaBIvuYXg'. + 'AdsouuNxEL0ZUBHnSQp66R73zYfUtQ6OytKT8RckQAJQoLtgO5'. + 'BJgj0D/WfgdyHaAHx8THoUcbGx8ciwhUl3bDEiToURPooeI7pH'. + 'MziK9Yd9nU5a6GgKjOH41vsgI4hAcyC5AZkapF+AoYNrjjsuhx'. + 'FbtPmeB5ykyQQzTPAWAQWC8S9oAI0QRRuPb9jkmyMZNAOTklvC'. + 'GGYZaFkGmkVAh8h4DtKFMIBunG+pB5B5AIkGBDsQ+qBiL20caj'. + 'zhJknq5KlgMkLjJHJos4kYEbFJi5vc5eYbATVN02bNWe19+32t'. + 'aJWlFm3wbf8Rz5NbDFJdlOFBF/g7cBf0JkrbBb+F6j1DOduEkU'. + '8bWCOiSofPWadBnSZDWmgUkEMGhZCINut8S/0NBtPptFlZrBSu'. + 'vnt1+ndnflfIp9OJ/279Ubbbd+lP7KBKPoEBsgnqLph/BRzwdS'. + 'LnBUFvHcfdpRsGPAGqwMco6jynz+e0SPKYCHMfLX5VKHwcenR+'. + 'Igd1XTcqlUr+xn/cePv91fevzy8sLO2OtrOpWkqL7gXKSAVRdh'. + 'ZFEmEXoYkwBNqovoc/3GHH3aUR+jwC1oD/AWrANi4hGwyBzqEG'. + 'Vvb77Dgi0eT1VZzJZMxKpVJYXV1dXF1dXVm6sPSvruue3Xzcyj'. + '6/syvDzwj0lNazK6Fj5LFCRZouZpBABj6jXouu3+Np6HNvDHaf'. + 'g91t74msbMuOJicnSSaTKKUQEUQEpRSO69But1/dB0VEm5uby9'. + 'y4cWNpdXX1+sLCworrume//PuXpeqnVeOban0U1PW2kcx+O9L7'. + 'Te9sUB4lWFR9SqNtNGcHx+/RDD2+Am4D94CnQA8OjjlEhMnyJC'. + 'srK8zOzu7BiYioMAzZ2Njg9u3brwIqpSSXy2WXl5eXLly4sOo4'. + 'zoV6vV6oflrVP/7Tx8Hmw1Zb6ydqmpWp7ha8h4O3gjOhzVANmF'. + 'XPMNQWvdDnCXCXuHR+APqH4fbCtm2mp6eZn59H13WJuYXRaKSU'. + 'UiSTyVcBdV3XDcOwRaTU7/en19bWCn/79G+JL/76RbhZ22y7u+'. + '6ahl71nPDz/nO17m7wAxlabFOihy4+DvAcqAMbPzZ3OFzX5dmz'. + 'Z2iahoiosUUVhiGNRgPHcV4GzGQy5uLiYuH8+fMzo9FoslarJW'. + '9+elP75E+fBJu1zY7qqpqBUW3T/niohnVvy+1zm5aVtp+WE2XT'. + 'nrHFzbjh1tYLz3XdPjD4R3BKKba2tqhWq4dzUO3noBPn4H5PKy'. + 'LaO++8U7hx48byhQsXVne7u6tf3/v64t3P7mbq9+odt+OuaWi3'. + 'PLxbW2ytubjbQCgiMnt6VlaurWgz0zM0m02q1WrUaDSUUuqI56'. + 'ivDxE5MCgiYllWtlwuL5mmufLV/a/O/uXPf9Ff1F+80Lv6Yx29'. + '2qHzyZBh3cdvc7gaTZuZkzPh/Py8ACqVSv1/uPZDKXUAGEWRtF'. + 'qtxEcffZTL5XLF+2v39fqjeivshA/TpP83JLwzYFBzcA4370Cc'. + 'S81nTRBUs9lkOByi1GuOPI4Rh3+26JZlnSkWi781DOPXvV4v3+'. + '/2G0R8kSBxB/jew+tERK+c49m2TblcxrZtXNfl+fPneJ6HZVmU'. + 'y2VJJpNyaJ9TSinlOA5bW1u4rntkQA0oAG8D54gb9W3ianxM3A'. + 'e/cn73U3Hq1Cm5du2aPjs7a+ztcSIShmE4ajQa6tatWzQajZ+0'. + 'fbiKI+It4SvijVUj7kL2qvGfgkskEqTTaZmcnDROnTplJhIJTU'. + 'QiwPd9P/Q8T6XTaQzDIAiCfzjP/wFVfszuFqdHXgAAAABJRU5E'. + 'rkJggg==' ; //========================================================== @@ -419,52 +419,52 @@ class ImgData_PushPins extends ImgData //========================================================== $this->imgdata_small[0][0]= 384 ; $this->imgdata_small[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhouFobZrQAAAQ1JREFUeJyV1dFtwyAQBuD/og'. - 'xQdYxa8gRY6hJ0jK6QdohMkTEuE5wUj5ERen05IoLvID7Jkn2G'. - 'j8MgTMyMXqRlUQBYq9ydmaL2h1cwqD7l30t+L1iwlbYFRegY7I'. - 'SHjkEifGg4ww3aBa/l4+9AhxWWr/dLhEunXUGHq6yGniw3QkOw'. - '3jJ7UBd82n/VVAlAtvsfp98lAj2sAJOhU4AeQ7DC1ubVBODWDJ'. - 'TtCsEWa6u5M1NeFs1NzgdtuhHGtj+9Q2IDppQUAL6Cyrlz0gDN'. - 'ohSMiJCt861672EiAhEhESG3woJ9V9OKTkwRKbdqz4cHmFLSFg'. - 's69+LvAZKdeZ/n89uLnd2g0S+gjd5g8zzjH5Y/eLLi+NPEAAAA'. - 'AElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhouFobZrQAAAQ1JREFUeJyV1dFtwyAQBuD/og'. + 'xQdYxa8gRY6hJ0jK6QdohMkTEuE5wUj5ERen05IoLvID7Jkn2G'. + 'j8MgTMyMXqRlUQBYq9ydmaL2h1cwqD7l30t+L1iwlbYFRegY7I'. + 'SHjkEifGg4ww3aBa/l4+9AhxWWr/dLhEunXUGHq6yGniw3QkOw'. + '3jJ7UBd82n/VVAlAtvsfp98lAj2sAJOhU4AeQ7DC1ubVBODWDJ'. + 'TtCsEWa6u5M1NeFs1NzgdtuhHGtj+9Q2IDppQUAL6Cyrlz0gDN'. + 'ohSMiJCt861672EiAhEhESG3woJ9V9OKTkwRKbdqz4cHmFLSFg'. + 's69+LvAZKdeZ/n89uLnd2g0S+gjd5g8zzjH5Y/eLLi+NPEAAAA'. + 'AElFTkSuQmCC' ; //========================================================== // File: pp_orange.png //========================================================== $this->imgdata_small[1][0]= 403 ; $this->imgdata_small[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhwAnApz5AAAASBJREFUeJyN1dFthDAMBuDf7S'. - '3BCm2VCRKpS4QxbhikW6IewzcBqm6Fm6JyH7iEEByCn5AJH38g'. - 'BBIRHNUzBAWAGNfe/SrUGv92CtNt309BrfFdMGPjvt9CD8Fyml'. - 'ZZaDchRgA/59FDMD18pvNoNyHxMnUmgLmPHoJ+CqqfMaNAH22C'. - 'fgqKRwR+GRpxGjXBEiuXDBWQhTK3plxijyWWvtKVS5KNG1xM8I'. - 'OBr7geV1WupDqpmTAPKjCqLhxk/z0PImQmjKrAuI6vMXlhFroD'. - 'vfdqITXWqg2YMSJEAFcReoag6UXU2DzPG8w5t09YYsAyLWvHrL'. - 'HUy6D3XmvMAAhAay8kAJpBosX4vt0G4+4Jam6s6Rz1fgFG0ncA'. - 'f3XfOQcA+Acv5IUSdQw9hgAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhwAnApz5AAAASBJREFUeJyN1dFthDAMBuDf7S'. + '3BCm2VCRKpS4QxbhikW6IewzcBqm6Fm6JyH7iEEByCn5AJH38g'. + 'BBIRHNUzBAWAGNfe/SrUGv92CtNt309BrfFdMGPjvt9CD8Fyml'. + 'ZZaDchRgA/59FDMD18pvNoNyHxMnUmgLmPHoJ+CqqfMaNAH22C'. + 'fgqKRwR+GRpxGjXBEiuXDBWQhTK3plxijyWWvtKVS5KNG1xM8I'. + 'OBr7geV1WupDqpmTAPKjCqLhxk/z0PImQmjKrAuI6vMXlhFroD'. + 'vfdqITXWqg2YMSJEAFcReoag6UXU2DzPG8w5t09YYsAyLWvHrL'. + 'HUy6D3XmvMAAhAay8kAJpBosX4vt0G4+4Jam6s6Rz1fgFG0ncA'. + 'f3XfOQcA+Acv5IUSdQw9hgAAAABJRU5ErkJggg==' ; //========================================================== // File: pp_pink.png //========================================================== $this->imgdata_small[2][0]= 419 ; $this->imgdata_small[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhsQzvz1RwAAATBJREFUeJyd1MFthDAQheF/oi'. - 'gF+JYWQKICkCJRA1vGtrDbxFbhGvY0HVjCLeS2BeTiHFgTB2wg'. - 'eRISstCnmcG2qCpbuXf3ADBQzWsPfZfS9y9HsEu4/Fo33Wf4Fx'. - 'gxL3a1XkI3wbTNXHLoboVeLFUYDqObYBy+Fw/Uh9DdCmtOwIjF'. - 'YvG76CZoOhNGRmpO8zz30CJoOhMAqlDxFzQLppgXj2XaNlP7FF'. - 'GLL7ccMYCBgZERgCvXLBrfi2DEclmiKZwFY4tp6sW26bVfnede'. - 'e5Hc5dC2bUgrXGKqWrwcXnNYDjmCrcCIiQgDcFYV05kQ8SXmnB'. - 'NgPiVN06wrTDGAhz5EWY/FOccTk+cTnHM/YNu2YYllgFxCWuUM'. - 'ikzGx+2Gc+4N+CoJW8n+5a2UKm2aBoBvGA6L7wfl8aoAAAAASU'. - 'VORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhsQzvz1RwAAATBJREFUeJyd1MFthDAQheF/oi'. + 'gF+JYWQKICkCJRA1vGtrDbxFbhGvY0HVjCLeS2BeTiHFgTB2wg'. + 'eRISstCnmcG2qCpbuXf3ADBQzWsPfZfS9y9HsEu4/Fo33Wf4Fx'. + 'gxL3a1XkI3wbTNXHLoboVeLFUYDqObYBy+Fw/Uh9DdCmtOwIjF'. + 'YvG76CZoOhNGRmpO8zz30CJoOhMAqlDxFzQLppgXj2XaNlP7FF'. + 'GLL7ccMYCBgZERgCvXLBrfi2DEclmiKZwFY4tp6sW26bVfnede'. + 'e5Hc5dC2bUgrXGKqWrwcXnNYDjmCrcCIiQgDcFYV05kQ8SXmnB'. + 'NgPiVN06wrTDGAhz5EWY/FOccTk+cTnHM/YNu2YYllgFxCWuUM'. + 'ikzGx+2Gc+4N+CoJW8n+5a2UKm2aBoBvGA6L7wfl8aoAAAAASU'. + 'VORK5CYII=' ; //========================================================== @@ -472,47 +472,47 @@ class ImgData_PushPins extends ImgData //========================================================== $this->imgdata_small[3][0]= 883 ; $this->imgdata_small[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAACi1'. - 'BMVEX///8AAAAAADMAAGYAAJkAAMwAAP8zAAAzADMzAGYzAJkz'. - 'AMwzAP9mAABmADNmAGZmAJlmAMxmAP+ZAACZADOZAGaZAJmZAM'. - 'yZAP/MAADMADPMAGbMAJnMAMzMAP//AAD/ADP/AGb/AJn/AMz/'. - 'AP8AMwAAMzMAM2YAM5kAM8wAM/8zMwAzMzMzM2YzM5kzM8wzM/'. - '9mMwBmMzNmM2ZmM5lmM8xmM/+ZMwCZMzOZM2aZM5mZM8yZM//M'. - 'MwDMMzPMM2bMM5nMM8zMM///MwD/MzP/M2b/M5n/M8z/M/8AZg'. - 'AAZjMAZmYAZpkAZswAZv8zZgAzZjMzZmYzZpkzZswzZv9mZgBm'. - 'ZjNmZmZmZplmZsxmZv+ZZgCZZjOZZmaZZpmZZsyZZv/MZgDMZj'. - 'PMZmbMZpnMZszMZv//ZgD/ZjP/Zmb/Zpn/Zsz/Zv8AmQAAmTMA'. - 'mWYAmZkAmcwAmf8zmQAzmTMzmWYzmZkzmcwzmf9mmQBmmTNmmW'. - 'ZmmZlmmcxmmf+ZmQCZmTOZmWaZmZmZmcyZmf/MmQDMmTPMmWbM'. - 'mZnMmczMmf//mQD/mTP/mWb/mZn/mcz/mf8AzAAAzDMAzGYAzJ'. - 'kAzMwAzP8zzAAzzDMzzGYzzJkzzMwzzP9mzABmzDNmzGZmzJlm'. - 'zMxmzP+ZzACZzDOZzGaZzJmZzMyZzP/MzADMzDPMzGbMzJnMzM'. - 'zMzP//zAD/zDP/zGb/zJn/zMz/zP8A/wAA/zMA/2YA/5kA/8wA'. - '//8z/wAz/zMz/2Yz/5kz/8wz//9m/wBm/zNm/2Zm/5lm/8xm//'. - '+Z/wCZ/zOZ/2aZ/5mZ/8yZ///M/wDM/zPM/2bM/5nM/8zM////'. - '/wD//zP//2b//5n//8z///9jJVUgAAAAAXRSTlMAQObYZgAAAA'. - 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. - 'RQfTAwkWGTNerea3AAAAYUlEQVR4nHXNwQ3AIAxDUUfyoROxRZ'. - 'icARin0EBTIP3Hp1gBRqSqYo0seqjZpnngojlWBir5+b8o06lM'. - 'ha5uFKEpDZulV8l52axhVzqaCdxQp32qVSSwC1wN3fYiw7b76w'. - 'bN4SMue4/KbwAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAMAAAC6V+0/AAACi1'. + 'BMVEX///8AAAAAADMAAGYAAJkAAMwAAP8zAAAzADMzAGYzAJkz'. + 'AMwzAP9mAABmADNmAGZmAJlmAMxmAP+ZAACZADOZAGaZAJmZAM'. + 'yZAP/MAADMADPMAGbMAJnMAMzMAP//AAD/ADP/AGb/AJn/AMz/'. + 'AP8AMwAAMzMAM2YAM5kAM8wAM/8zMwAzMzMzM2YzM5kzM8wzM/'. + '9mMwBmMzNmM2ZmM5lmM8xmM/+ZMwCZMzOZM2aZM5mZM8yZM//M'. + 'MwDMMzPMM2bMM5nMM8zMM///MwD/MzP/M2b/M5n/M8z/M/8AZg'. + 'AAZjMAZmYAZpkAZswAZv8zZgAzZjMzZmYzZpkzZswzZv9mZgBm'. + 'ZjNmZmZmZplmZsxmZv+ZZgCZZjOZZmaZZpmZZsyZZv/MZgDMZj'. + 'PMZmbMZpnMZszMZv//ZgD/ZjP/Zmb/Zpn/Zsz/Zv8AmQAAmTMA'. + 'mWYAmZkAmcwAmf8zmQAzmTMzmWYzmZkzmcwzmf9mmQBmmTNmmW'. + 'ZmmZlmmcxmmf+ZmQCZmTOZmWaZmZmZmcyZmf/MmQDMmTPMmWbM'. + 'mZnMmczMmf//mQD/mTP/mWb/mZn/mcz/mf8AzAAAzDMAzGYAzJ'. + 'kAzMwAzP8zzAAzzDMzzGYzzJkzzMwzzP9mzABmzDNmzGZmzJlm'. + 'zMxmzP+ZzACZzDOZzGaZzJmZzMyZzP/MzADMzDPMzGbMzJnMzM'. + 'zMzP//zAD/zDP/zGb/zJn/zMz/zP8A/wAA/zMA/2YA/5kA/8wA'. + '//8z/wAz/zMz/2Yz/5kz/8wz//9m/wBm/zNm/2Zm/5lm/8xm//'. + '+Z/wCZ/zOZ/2aZ/5mZ/8yZ///M/wDM/zPM/2bM/5nM/8zM////'. + '/wD//zP//2b//5n//8z///9jJVUgAAAAAXRSTlMAQObYZgAAAA'. + 'FiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElN'. + 'RQfTAwkWGTNerea3AAAAYUlEQVR4nHXNwQ3AIAxDUUfyoROxRZ'. + 'icARin0EBTIP3Hp1gBRqSqYo0seqjZpnngojlWBir5+b8o06lM'. + 'ha5uFKEpDZulV8l52axhVzqaCdxQp32qVSSwC1wN3fYiw7b76w'. + 'bN4SMue4/KbwAAAABJRU5ErkJggg==' ; //========================================================== // File: pp_green.png //========================================================== $this->imgdata_small[4][0]= 447 ; $this->imgdata_small[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wMJFhkLdq9eKQAAAUxJREFUeJyN1LFVwzAQxvH/8f'. - 'IeDS0FLKABlN6eIwPYAzCHB0gWYI2jj+i1ABUTQN4TRSQ7iiWZ'. - 'qxLn9Mt9ydmiqrSq930AYFiu6YdKrf/hP1gYQn6960PxwBaYMG'. - 'E9UA3dBFtVQjdBOQmBakLennK0CapRwbZRZ3N0O/IeEsqp3HKL'. - 'Smtt5pUZgTPg4gdDud+6xoS97wM2rsxxmRSoTgoVcMZsXJkBho'. - 'SmKqCuOuEtls6nmGMFPTUmxBKx/MeyNfQGLoOOiC2ddsxb1Kzv'. - 'ZzUqu5IXbGDvBJf+hDisi77qFSuhq7Xpuu66TyJLRGbsXVUPxV'. - 'SxsgkzDMt0mKT3/RcjL8C5hHnvJToXY0xYRZ4xnVKsV/S+a8YA'. - 'AvCb3s9g13UhYj+TTo93B3fApRV1FVlEAD6H42DjN9/WvzDYuJ'. - 'dL5b1/ji+/IX8EGWP4AwRii8PdFHTqAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wMJFhkLdq9eKQAAAUxJREFUeJyN1LFVwzAQxvH/8f'. + 'IeDS0FLKABlN6eIwPYAzCHB0gWYI2jj+i1ABUTQN4TRSQ7iiWZ'. + 'qxLn9Mt9ydmiqrSq930AYFiu6YdKrf/hP1gYQn6960PxwBaYMG'. + 'E9UA3dBFtVQjdBOQmBakLennK0CapRwbZRZ3N0O/IeEsqp3HKL'. + 'Smtt5pUZgTPg4gdDud+6xoS97wM2rsxxmRSoTgoVcMZsXJkBho'. + 'SmKqCuOuEtls6nmGMFPTUmxBKx/MeyNfQGLoOOiC2ddsxb1Kzv'. + 'ZzUqu5IXbGDvBJf+hDisi77qFSuhq7Xpuu66TyJLRGbsXVUPxV'. + 'SxsgkzDMt0mKT3/RcjL8C5hHnvJToXY0xYRZ4xnVKsV/S+a8YA'. + 'AvCb3s9g13UhYj+TTo93B3fApRV1FVlEAD6H42DjN9/WvzDYuJ'. + 'dL5b1/ji+/IX8EGWP4AwRii8PdFHTqAAAAAElFTkSuQmCC' ; } } diff --git a/onyx2/include/jpgraph/imgdata_squares.inc.php b/onyx2/include/jpgraph/imgdata_squares.inc.php index 4a5362d..ccd3974 100644 --- a/onyx2/include/jpgraph/imgdata_squares.inc.php +++ b/onyx2/include/jpgraph/imgdata_squares.inc.php @@ -1,22 +1,22 @@ 'imgdata'); - + protected $colors = array('bluegreen','blue','green', - 'lightblue','orange','purple','red','yellow'); + 'lightblue','orange','purple','red','yellow'); protected $index = array('bluegreen' =>2,'blue'=>5,'green'=>6, - 'lightblue'=>0,'orange'=>7,'purple'=>4,'red'=>3,'yellow'=>1); + 'lightblue'=>0,'orange'=>7,'purple'=>4,'red'=>3,'yellow'=>1); protected $maxidx = 7 ; protected $imgdata ; @@ -27,124 +27,124 @@ class ImgData_Squares extends ImgData //========================================================== $this->imgdata[0][0]= 362 ; $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABm'. - 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. - 'B3RJTUUH0wMLFgojiPx/ygAAAPdJREFUeNpj/P377+kzHx89/c'. - 'VAHNBQ5VBX52HavPWWjg6nnDQbkXoUFTnnL7zD9PPXrz17HxCj'. - 'E6Jn6fL7H7/+ZWJgYCBGJ7IeBgYGJogofp1oehDa8OjE1IOiDa'. - 'tOrHoYGBhY0NwD0enirMDAwMDFxYRVD7ptyDrNTAU0NXix6sGu'. - 'jYGBgZOT9e/f/0xMjFyczFgVsGAKCfBza2kKzpl3hIuT1c9Xb/'. - 'PW58/foKchJqx6tmy98vbjj8cvPm/afMnXW1JShA2fNmQ9EBFc'. - 'Opnw6MGjkwm/Hlw6mQjqwaqTiRg9mDoZv//4M2/+UYJ64EBWgj'. - 'cm2hwA8l24oNDl+DMAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABm'. + 'JLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsRAAALEQF/ZF+RAAAA'. + 'B3RJTUUH0wMLFgojiPx/ygAAAPdJREFUeNpj/P377+kzHx89/c'. + 'VAHNBQ5VBX52HavPWWjg6nnDQbkXoUFTnnL7zD9PPXrz17HxCj'. + 'E6Jn6fL7H7/+ZWJgYCBGJ7IeBgYGJogofp1oehDa8OjE1IOiDa'. + 'tOrHoYGBhY0NwD0enirMDAwMDFxYRVD7ptyDrNTAU0NXix6sGu'. + 'jYGBgZOT9e/f/0xMjFyczFgVsGAKCfBza2kKzpl3hIuT1c9Xb/'. + 'PW58/foKchJqx6tmy98vbjj8cvPm/afMnXW1JShA2fNmQ9EBFc'. + 'Opnw6MGjkwm/Hlw6mQjqwaqTiRg9mDoZv//4M2/+UYJ64EBWgj'. + 'cm2hwA8l24oNDl+DMAAAAASUVORK5CYII=' ; //========================================================== //sq_yellow.png //========================================================== $this->imgdata[1][0]= 338 ; $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAWl'. - 'BMVEX////+/+H+/9/9/9v8/8P8/8H8/7v8/7n6/4P5/335/3n5'. - '/3X4/1f4/1P3/031/w30/wn0/wPt+ADp9ADm8ADk7gDc5gDa5A'. - 'DL1ADFzgCwuACqsgClrABzeAC9M0MzAAAAAWJLR0QAiAUdSAAA'. - 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEDlOgDj'. - 'EAAAB+SURBVHjaVcpbCsQgDEDRGERGKopjDa2a/W9zfLWj9/Nw'. - 'Ac21ZRBOtZlRN9ApzSYFaDUj79KIorRDbJNO9bN/GUSh2ZRJFJ'. - 'S18iorURBiyksO8buT0zkfYaUqzI91ckfhWhoGXTLzsDjI68Sz'. - 'pGMjrzPzauA/iXk1AtykmvgBC8UcWUdc9HkAAAAASUVORK5CYI'. - 'I=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAWl'. + 'BMVEX////+/+H+/9/9/9v8/8P8/8H8/7v8/7n6/4P5/335/3n5'. + '/3X4/1f4/1P3/031/w30/wn0/wPt+ADp9ADm8ADk7gDc5gDa5A'. + 'DL1ADFzgCwuACqsgClrABzeAC9M0MzAAAAAWJLR0QAiAUdSAAA'. + 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEDlOgDj'. + 'EAAAB+SURBVHjaVcpbCsQgDEDRGERGKopjDa2a/W9zfLWj9/Nw'. + 'Ac21ZRBOtZlRN9ApzSYFaDUj79KIorRDbJNO9bN/GUSh2ZRJFJ'. + 'S18iorURBiyksO8buT0zkfYaUqzI91ckfhWhoGXTLzsDjI68Sz'. + 'pGMjrzPzauA/iXk1AtykmvgBC8UcWUdc9HkAAAAASUVORK5CYI'. + 'I=' ; //========================================================== //sq_blgr.png //========================================================== $this->imgdata[2][0]= 347 ; $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAZl'. - 'BMVEX////0+vv0+vrz+fry+frv+Png7e/d7e/a6+zY6+250tSz'. - '0tSyztCtztGM0NWIz9SDzdNfsLVcrrRZrbJOp61MpqtIr7dHn6'. - 'RErrZArLQ6q7M2g4kygYcsp68npa4ctr8QZ20JnqepKsl4AAAA'. - 'AWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU'. - '1FB9MDCxYEByp8tpUAAAB7SURBVHjaVcjRFoIgDADQWZpWJpjY'. - 'MsnG//9kzIFn3McLzfArDA3MndFjrhvgfDHFBEB9pt0CVzwrY3'. - 'n2yicjhY4vTSp0nbXtN+hCV53SHDWe61dZY+/9463r2XuifHAM'. - '0SoH+6xEcovUlCfefeFSIwfTTQ3fB+pi4lV/bTIgvmaA7a0AAA'. - 'AASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAZl'. + 'BMVEX////0+vv0+vrz+fry+frv+Png7e/d7e/a6+zY6+250tSz'. + '0tSyztCtztGM0NWIz9SDzdNfsLVcrrRZrbJOp61MpqtIr7dHn6'. + 'RErrZArLQ6q7M2g4kygYcsp68npa4ctr8QZ20JnqepKsl4AAAA'. + 'AWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU'. + '1FB9MDCxYEByp8tpUAAAB7SURBVHjaVcjRFoIgDADQWZpWJpjY'. + 'MsnG//9kzIFn3McLzfArDA3MndFjrhvgfDHFBEB9pt0CVzwrY3'. + 'n2yicjhY4vTSp0nbXtN+hCV53SHDWe61dZY+/9463r2XuifHAM'. + '0SoH+6xEcovUlCfefeFSIwfTTQ3fB+pi4lV/bTIgvmaA7a0AAA'. + 'AASUVORK5CYII=' ; //========================================================== //sq_red.png //========================================================== $this->imgdata[3][0]= 324 ; $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. - 'BMVEX////++Pn99/j99ff99fb98/X98/T98PL55uj43+P24+bw'. - 'kKPvjaHviJ3teJHpxMnoL2Pjs73WW3rWNljVWXnUVnbUK1DTJk'. - '3SUHPOBz/KQmmxPVmuOFasNFOeIkWVka/fAAAAAWJLR0QAiAUd'. - 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEHd'. - 'ceT+8AAABtSURBVHjaVchbAkMwEAXQq6i3VrQiQfa/zDYTw8z5'. - 'PCjGt9JVWFt1XWPh1fWNdfDy+tq6WPfRUPENNKnSnXNWPB4uv2'. - 'b54nSZ8jHrMtOxvWZZZtpD4KP6xLkO9/AhzhaCOMhJh68cOjzV'. - '/K/4Ac2cG+nBcaRuAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. + 'BMVEX////++Pn99/j99ff99fb98/X98/T98PL55uj43+P24+bw'. + 'kKPvjaHviJ3teJHpxMnoL2Pjs73WW3rWNljVWXnUVnbUK1DTJk'. + '3SUHPOBz/KQmmxPVmuOFasNFOeIkWVka/fAAAAAWJLR0QAiAUd'. + 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEHd'. + 'ceT+8AAABtSURBVHjaVchbAkMwEAXQq6i3VrQiQfa/zDYTw8z5'. + 'PCjGt9JVWFt1XWPh1fWNdfDy+tq6WPfRUPENNKnSnXNWPB4uv2'. + 'b54nSZ8jHrMtOxvWZZZtpD4KP6xLkO9/AhzhaCOMhJh68cOjzV'. + '/K/4Ac2cG+nBcaRuAAAAAElFTkSuQmCC' ; //========================================================== //sq_pink.png //========================================================== $this->imgdata[4][0]= 445 ; $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAApV'. - 'BMVEX////6+Pz69/v49Pr38/r17/jr4+/l3Onj2efh1ua/L+i+'. - 'q8m+Lue9Lua8qsS8LuW8LeS7pca5LOG4LN+2Y9O2YNW1ZdO1Kt'. - 'y0atC0aNGzb82zbc6zKtuzKdqycsuwa8qtJtOISZ2GRpuFN6GE'. - 'NqCDQpmCMZ+BPpd/LJ1/K519S5B9Jpx9Jpt9JZt6RY11BJZ1BJ'. - 'V0BJV0BJRzBJNvNoRtIoJUEmdZ/XbrAAAAAWJLR0QAiAUdSAAA'. - 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYDF3iKMD'. - 'YAAACeSURBVHjaVczbEoIgGARgCiMtrexoWpaa2FHUgvd/tH4Y'. - 'BnEvv9ldhNPradPnnGBUTtPDzMRPSIF46SaBoR25dYjz3I20Lb'. - 'ek6BgQz73Il7KKpSgCO0pTHU0886J1sCe0ZYbALjGhjFnEM2es'. - 'VhZVI4d+B1QtfnV47ywCEaKeP/p7JdLejSYt0j6NIiOq1wJZIs'. - 'QTDA0ELHwhPBCwyR/Cni9cOmzJtwAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAApV'. + 'BMVEX////6+Pz69/v49Pr38/r17/jr4+/l3Onj2efh1ua/L+i+'. + 'q8m+Lue9Lua8qsS8LuW8LeS7pca5LOG4LN+2Y9O2YNW1ZdO1Kt'. + 'y0atC0aNGzb82zbc6zKtuzKdqycsuwa8qtJtOISZ2GRpuFN6GE'. + 'NqCDQpmCMZ+BPpd/LJ1/K519S5B9Jpx9Jpt9JZt6RY11BJZ1BJ'. + 'V0BJV0BJRzBJNvNoRtIoJUEmdZ/XbrAAAAAWJLR0QAiAUdSAAA'. + 'AAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYDF3iKMD'. + 'YAAACeSURBVHjaVczbEoIgGARgCiMtrexoWpaa2FHUgvd/tH4Y'. + 'BnEvv9ldhNPradPnnGBUTtPDzMRPSIF46SaBoR25dYjz3I20Lb'. + 'ek6BgQz73Il7KKpSgCO0pTHU0886J1sCe0ZYbALjGhjFnEM2es'. + 'VhZVI4d+B1QtfnV47ywCEaKeP/p7JdLejSYt0j6NIiOq1wJZIs'. + 'QTDA0ELHwhPBCwyR/Cni9cOmzJtwAAAABJRU5ErkJggg==' ; //========================================================== //sq_blue.png //========================================================== $this->imgdata[5][0]= 283 ; $this->imgdata[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAQl'. - 'BMVEX////4+fz39/z19vvy8vru7/ni4+7g4fHW1ue8vteXmt6B'. - 'hdhiZ7FQVaZETcxCSJo1Oq4zNoMjKakhJHcKFaMEC2jRVYdWAA'. - 'AAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0'. - 'SU1FB9MDCxYDN0PkEP4AAABfSURBVHjaVchHAoAgDATAVcCCIF'. - 'j4/1elJEjmOFDHKVgDv4iz640gLs+LMF6ZUv/VqcXXplU7Gqpy'. - 'PFzBT5qml9NzlOX259riWHlS4kOffviHD8PQYZx2EFMPRkw+9Q'. - 'FSnRPeWEDzKAAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAQl'. + 'BMVEX////4+fz39/z19vvy8vru7/ni4+7g4fHW1ue8vteXmt6B'. + 'hdhiZ7FQVaZETcxCSJo1Oq4zNoMjKakhJHcKFaMEC2jRVYdWAA'. + 'AAAWJLR0QAiAUdSAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0'. + 'SU1FB9MDCxYDN0PkEP4AAABfSURBVHjaVchHAoAgDATAVcCCIF'. + 'j4/1elJEjmOFDHKVgDv4iz640gLs+LMF6ZUv/VqcXXplU7Gqpy'. + 'PFzBT5qml9NzlOX259riWHlS4kOffviHD8PQYZx2EFMPRkw+9Q'. + 'FSnRPeWEDzKAAAAABJRU5ErkJggg==' ; //========================================================== //sq_green.png //========================================================== $this->imgdata[6][0]= 325 ; $this->imgdata[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. - 'BMVEX////2+vX1+vX1+fT0+fPz+PPx9/Dv9u7u9e3h7uHe697a'. - '6dnO2s3I1sa10LOvza2ay5aEwYBWlE9TqE5Tkk1RkEpMrUJMg0'. - 'hKiUNGpEFBojw8oTcsbScaYBMWlwmMT0NtAAAAAWJLR0QAiAUd'. - 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEFd'. - 'nFx90AAABuSURBVHjaVc9HAoAgDADB2HuJWLDx/2cKBITscW4L'. - '5byzMIWtZobNDZIZtrcCGZsRQ8GwvRSRNxIiMuysODKG3alikl'. - 'ueOPlpKTLBaRmOZxQxaXlfb5ZWI9om4WntrXiDSJzp7SBkwMQa'. - 'FEy0VR/NAB2kNuj7rgAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAXV'. + 'BMVEX////2+vX1+vX1+fT0+fPz+PPx9/Dv9u7u9e3h7uHe697a'. + '6dnO2s3I1sa10LOvza2ay5aEwYBWlE9TqE5Tkk1RkEpMrUJMg0'. + 'hKiUNGpEFBojw8oTcsbScaYBMWlwmMT0NtAAAAAWJLR0QAiAUd'. + 'SAAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEFd'. + 'nFx90AAABuSURBVHjaVc9HAoAgDADB2HuJWLDx/2cKBITscW4L'. + '5byzMIWtZobNDZIZtrcCGZsRQ8GwvRSRNxIiMuysODKG3alikl'. + 'ueOPlpKTLBaRmOZxQxaXlfb5ZWI9om4WntrXiDSJzp7SBkwMQa'. + 'FEy0VR/NAB2kNuj7rgAAAABJRU5ErkJggg==' ; //========================================================== //sq_orange.png //========================================================== $this->imgdata[7][0]= 321 ; $this->imgdata[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAUV'. - 'BMVEX/////8+n/8uf/8OP/59H/5Mv/zqH/zJ3/ypv/yJf/vYH/'. - 'u33/uXn/n0n/nUX/m0H/lzn/ljf/lDP/kS3/kCv/iR//hxv/fg'. - 'n/fAX/eQDYZgDW6ia5AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAL'. - 'EgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEJIgbx+cAAAB2SURBVH'. - 'jaVczRCoQwDETRbLAWLZSGUA35/w/dVI0283i4DODew3YESmWW'. - 'kg5gWkoQAe6TleUQI/66Sy7i56+kLk7cht2N0+hcnJgQu0SqiC'. - '1SzSIbzWSi6gavqJ63wSduRi2f+kwyD5rEukwCdZ1kGAMGMfv9'. - 'AbWuGMOr5COSAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAMAAABhEH5lAAAAUV'. + 'BMVEX/////8+n/8uf/8OP/59H/5Mv/zqH/zJ3/ypv/yJf/vYH/'. + 'u33/uXn/n0n/nUX/m0H/lzn/ljf/lDP/kS3/kCv/iR//hxv/fg'. + 'n/fAX/eQDYZgDW6ia5AAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAL'. + 'EgAACxIB0t1+/AAAAAd0SU1FB9MDCxYEJIgbx+cAAAB2SURBVH'. + 'jaVczRCoQwDETRbLAWLZSGUA35/w/dVI0283i4DODew3YESmWW'. + 'kg5gWkoQAe6TleUQI/66Sy7i56+kLk7cht2N0+hcnJgQu0SqiC'. + '1SzSIbzWSi6gavqJ63wSduRi2f+kwyD5rEukwCdZ1kGAMGMfv9'. + 'AbWuGMOr5COSAAAAAElFTkSuQmCC' ; } } diff --git a/onyx2/include/jpgraph/imgdata_stars.inc.php b/onyx2/include/jpgraph/imgdata_stars.inc.php index 259af3f..9a963c0 100644 --- a/onyx2/include/jpgraph/imgdata_stars.inc.php +++ b/onyx2/include/jpgraph/imgdata_stars.inc.php @@ -1,11 +1,11 @@ 3,'lightblue'=>4,'purple'=>1, - 'blue'=>5,'green'=>0,'pink'=>7,'red'=>2,'yellow'=>6); + 'blue'=>5,'green'=>0,'pink'=>7,'red'=>2,'yellow'=>6); protected $maxidx = 7 ; protected $imgdata ; - public function __construct() + public function ImgData_Stars() { //========================================================== // File: bstar_green_001.png //========================================================== $this->imgdata[0][0]= 329 ; $this->imgdata[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAAUV'. - 'BMVEX///////+/v7+83rqcyY2Q/4R7/15y/1tp/05p/0lg/zdX'. - '/zdX/zVV/zdO/zFJ9TFJvDFD4yg+8Bw+3iU68hwurhYotxYosx'. - 'YokBoTfwANgQFUp7DWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. - 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJj'. - 'CRyxgTAAAAcUlEQVR4nH3MSw6AIAwEUBL/IKBWwXL/g0pLojUS'. - 'ZzGLl8ko9Zumhr5iy66/GH0dp49llNPB5sTotDY5PVuLG6tnM9'. - 'CVKSIe1joSgPsAKSuANNaENFQvTAGzmheSkUpMBWeJZwqBT8wo'. - 'hmysD4bnnPsC/x8ItUdGPfAAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAAUV'. + 'BMVEX///////+/v7+83rqcyY2Q/4R7/15y/1tp/05p/0lg/zdX'. + '/zdX/zVV/zdO/zFJ9TFJvDFD4yg+8Bw+3iU68hwurhYotxYosx'. + 'YokBoTfwANgQFUp7DWAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgF'. + 'HUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJj'. + 'CRyxgTAAAAcUlEQVR4nH3MSw6AIAwEUBL/IKBWwXL/g0pLojUS'. + 'ZzGLl8ko9Zumhr5iy66/GH0dp49llNPB5sTotDY5PVuLG6tnM9'. + 'CVKSIe1joSgPsAKSuANNaENFQvTAGzmheSkUpMBWeJZwqBT8wo'. + 'hmysD4bnnPsC/x8ItUdGPfAAAAAASUVORK5CYII=' ; //========================================================== // File: bstar_blred.png //========================================================== $this->imgdata[1][0]= 325 ; $this->imgdata[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79uRJ6jWPOSUtKrb+ejWO+gWPaGTruJTr6rZvF2'. - 'RqC2ocqdVuCeV+egV/GsnLuIXL66rMSpcOyATbipY/OdWOp+VK'. - 'aTU9WhV+yJKBoLAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJwynv1'. - 'XVAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79uRJ6jWPOSUtKrb+ejWO+gWPaGTruJTr6rZvF2'. + 'RqC2ocqdVuCeV+egV/GsnLuIXL66rMSpcOyATbipY/OdWOp+VK'. + 'aTU9WhV+yJKBoLAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJwynv1'. + 'XVAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; //========================================================== // File: bstar_red_001.png //========================================================== $this->imgdata[2][0]= 325 ; $this->imgdata[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v7+eRFHzWG3SUmHnb37vWGr2WHG7Tlm+TljxZneg'. - 'Rk3KoaXgVmXnV2nxV227nJ++XGzErK3scIS4TVzzY3fqWG2mVF'. - 'zVU2PsV2rJFw9VAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJzCI0C'. - 'lSAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+eRFHzWG3SUmHnb37vWGr2WHG7Tlm+TljxZneg'. + 'Rk3KoaXgVmXnV2nxV227nJ++XGzErK3scIS4TVzzY3fqWG2mVF'. + 'zVU2PsV2rJFw9VAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJzCI0C'. + 'lSAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; //========================================================== // File: bstar_blgr_001.png //========================================================== $this->imgdata[3][0]= 325 ; $this->imgdata[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79Ehp5Yx/NSq9Jvw+dYwu9YzfZOmbtOmb5myPFG'. - 'gqChvcpWteBXvedXxvGcsbtcpb6su8RwzOxNmrhjyvNYwupUjK'. - 'ZTr9VXwOyJhmWNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJTC65k'. - 'vQAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79Ehp5Yx/NSq9Jvw+dYwu9YzfZOmbtOmb5myPFG'. + 'gqChvcpWteBXvedXxvGcsbtcpb6su8RwzOxNmrhjyvNYwupUjK'. + 'ZTr9VXwOyJhmWNAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJTC65k'. + 'vQAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; //========================================================== // File: bstar_blgr_002.png //========================================================== $this->imgdata[4][0]= 325 ; $this->imgdata[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79EnpxY8/FS0dJv5+dY7+9Y9vBOubtOur5m8fFG'. - 'nKChycpW3uBX5+ZX8e2curtcvrqswsRw7OdNuLZj8/BY6udUpK'. - 'ZT1dRX7OtNkrW5AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJgXHeN'. - 'wwAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79EnpxY8/FS0dJv5+dY7+9Y9vBOubtOur5m8fFG'. + 'nKChycpW3uBX5+ZX8e2curtcvrqswsRw7OdNuLZj8/BY6udUpK'. + 'ZT1dRX7OtNkrW5AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJgXHeN'. + 'wwAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; //========================================================== // File: bstar_blue_001.png //========================================================== $this->imgdata[5][0]= 325 ; $this->imgdata[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v79EY55Yi/NSetJvledYiO9YkPZOb7tObr5mkvFG'. - 'X6ChrcpWgOBXhedXi/Gcpbtcf76sssRwnOxNcbhjk/NYiepUbK'. - 'ZTfdVXh+ynNEzzAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJhStyP'. - 'zCAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v79EY55Yi/NSetJvledYiO9YkPZOb7tObr5mkvFG'. + 'X6ChrcpWgOBXhedXi/Gcpbtcf76sssRwnOxNcbhjk/NYiepUbK'. + 'ZTfdVXh+ynNEzzAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJhStyP'. + 'zCAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; //========================================================== // File: bstar_oy_007.png //========================================================== $this->imgdata[6][0]= 325 ; $this->imgdata[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v7+ejUTz11jSvVLn02/v1lj21li7q06+r07x2mag'. - 'lUbKxKHgy1bnz1fx1Ve7t5y+qlzEwqzs03C4pE3z2WPqz1imml'. - 'TVv1Ps01dGRjeyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJjsGGc'. - 'GbAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+ejUTz11jSvVLn02/v1lj21li7q06+r07x2mag'. + 'lUbKxKHgy1bnz1fx1Ve7t5y+qlzEwqzs03C4pE3z2WPqz1imml'. + 'TVv1Ps01dGRjeyAAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJjsGGc'. + 'GbAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; //========================================================== // File: bstar_lred.png //========================================================== $this->imgdata[7][0]= 325 ; $this->imgdata[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. - 'BMVEX///+/v7+eRJPzWN3SUr7nb9TvWNj2WOS7Tqi+TqnxZtyg'. - 'Ro/KocPgVsjnV9LxV927nLa+XLTErL7scN24TarzY9/qWNemVJ'. - 'jVU8LsV9VCwcc9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. - 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJxi9ZY'. - 'GoAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. - 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. - 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. - 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAMAAABsDg4iAAAATl'. + 'BMVEX///+/v7+eRJPzWN3SUr7nb9TvWNj2WOS7Tqi+TqnxZtyg'. + 'Ro/KocPgVsjnV9LxV927nLa+XLTErL7scN24TarzY9/qWNemVJ'. + 'jVU8LsV9VCwcc9AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgA'. + 'AAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTAxYTJxi9ZY'. + 'GoAAAAcElEQVR4nH3MyQ6AIAwEUFIqiwju2///qLQmWiJxDnN4'. + 'mYxSv5lqGCs2nvaLLtZx/VhGOW1MjnPJWp0zsw2wsUY2jd09BY'. + 'DFmESC+BwA5UCUxhqAhqrA4CGrLpCMVGK4sZe4B+/5RLdiyMb6'. + 'on/PuS9CdQNC7yBXEQAAAABJRU5ErkJggg==' ; } } diff --git a/onyx2/include/jpgraph/jpg-config.inc.php b/onyx2/include/jpgraph/jpg-config.inc.php index c9ee486..e8929ad 100644 --- a/onyx2/include/jpgraph/jpg-config.inc.php +++ b/onyx2/include/jpgraph/jpg-config.inc.php @@ -1,14 +1,15 @@ Get(11, $file, $lineno); die($msg); } else { - define('CACHE_DIR', $_SERVER['TEMP'] . '/'); + DEFINE('CACHE_DIR', $_SERVER['TEMP'] . '/'); } } else { - define('CACHE_DIR', '/tmp/jpgraph_cache/'); + DEFINE('CACHE_DIR', '/tmp/jpgraph_cache/'); } } } elseif (!defined('CACHE_DIR')) { - define('CACHE_DIR', ''); + DEFINE('CACHE_DIR', ''); } -// -// Setup path for western/latin TTF fonts -// if (!defined('TTF_DIR')) { if (strstr(PHP_OS, 'WIN')) { $sroot = getenv('SystemRoot'); @@ -195,55 +52,160 @@ if (!defined('TTF_DIR')) { $msg = $t->Get(12, $file, $lineno); die($msg); } else { - define('TTF_DIR', $sroot.'/fonts/'); + DEFINE('TTF_DIR', $sroot.'/fonts/'); } } else { - define('TTF_DIR', '/usr/share/fonts/truetype/'); + DEFINE('TTF_DIR', '/usr/X11R6/lib/X11/fonts/truetype/'); } } -// -// Setup path for MultiByte TTF fonts (japanese, chinese etc.) -// if (!defined('MBTTF_DIR')) { - if (strstr(PHP_OS, 'WIN')) { - $sroot = getenv('SystemRoot'); - if (empty($sroot)) { - $t = new ErrMsgText(); - $msg = $t->Get(12, $file, $lineno); - die($msg); - } else { - define('MBTTF_DIR', $sroot.'/fonts/'); - } - } else { - define('MBTTF_DIR', '/usr/share/fonts/truetype/'); - } + DEFINE('MBTTF_DIR', '/usr/share/fonts/ja/TrueType/'); } -// -// Check minimum PHP version -// +//------------------------------------------------------------------ +// Constants which are used as parameters for the method calls +//------------------------------------------------------------------ + + +// Tick density +DEFINE("TICKD_DENSE", 1); +DEFINE("TICKD_NORMAL", 2); +DEFINE("TICKD_SPARSE", 3); +DEFINE("TICKD_VERYSPARSE", 4); + +// Side for ticks and labels. +DEFINE("SIDE_LEFT", -1); +DEFINE("SIDE_RIGHT", 1); +DEFINE("SIDE_DOWN", -1); +DEFINE("SIDE_BOTTOM", -1); +DEFINE("SIDE_UP", 1); +DEFINE("SIDE_TOP", 1); + +// Legend type stacked vertical or horizontal +DEFINE("LEGEND_VERT", 0); +DEFINE("LEGEND_HOR", 1); + +// Mark types for plot marks +DEFINE("MARK_SQUARE", 1); +DEFINE("MARK_UTRIANGLE", 2); +DEFINE("MARK_DTRIANGLE", 3); +DEFINE("MARK_DIAMOND", 4); +DEFINE("MARK_CIRCLE", 5); +DEFINE("MARK_FILLEDCIRCLE", 6); +DEFINE("MARK_CROSS", 7); +DEFINE("MARK_STAR", 8); +DEFINE("MARK_X", 9); +DEFINE("MARK_LEFTTRIANGLE", 10); +DEFINE("MARK_RIGHTTRIANGLE", 11); +DEFINE("MARK_FLASH", 12); +DEFINE("MARK_IMG", 13); +DEFINE("MARK_FLAG1", 14); +DEFINE("MARK_FLAG2", 15); +DEFINE("MARK_FLAG3", 16); +DEFINE("MARK_FLAG4", 17); + +// Builtin images +DEFINE("MARK_IMG_PUSHPIN", 50); +DEFINE("MARK_IMG_SPUSHPIN", 50); +DEFINE("MARK_IMG_LPUSHPIN", 51); +DEFINE("MARK_IMG_DIAMOND", 52); +DEFINE("MARK_IMG_SQUARE", 53); +DEFINE("MARK_IMG_STAR", 54); +DEFINE("MARK_IMG_BALL", 55); +DEFINE("MARK_IMG_SBALL", 55); +DEFINE("MARK_IMG_MBALL", 56); +DEFINE("MARK_IMG_LBALL", 57); +DEFINE("MARK_IMG_BEVEL", 58); + +// Inline defines +DEFINE("INLINE_YES", 1); +DEFINE("INLINE_NO", 0); + +// Format for background images +DEFINE("BGIMG_FILLPLOT", 1); +DEFINE("BGIMG_FILLFRAME", 2); +DEFINE("BGIMG_COPY", 3); +DEFINE("BGIMG_CENTER", 4); + +// Depth of objects +DEFINE("DEPTH_BACK", 0); +DEFINE("DEPTH_FRONT", 1); + +// Direction +DEFINE("VERTICAL", 1); +DEFINE("HORIZONTAL", 0); + + +// Axis styles for scientific style axis +DEFINE('AXSTYLE_SIMPLE', 1); +DEFINE('AXSTYLE_BOXIN', 2); +DEFINE('AXSTYLE_BOXOUT', 3); +DEFINE('AXSTYLE_YBOXIN', 4); +DEFINE('AXSTYLE_YBOXOUT', 5); + +// Style for title backgrounds +DEFINE('TITLEBKG_STYLE1', 1); +DEFINE('TITLEBKG_STYLE2', 2); +DEFINE('TITLEBKG_STYLE3', 3); +DEFINE('TITLEBKG_FRAME_NONE', 0); +DEFINE('TITLEBKG_FRAME_FULL', 1); +DEFINE('TITLEBKG_FRAME_BOTTOM', 2); +DEFINE('TITLEBKG_FRAME_BEVEL', 3); +DEFINE('TITLEBKG_FILLSTYLE_HSTRIPED', 1); +DEFINE('TITLEBKG_FILLSTYLE_VSTRIPED', 2); +DEFINE('TITLEBKG_FILLSTYLE_SOLID', 3); + +// Style for background gradient fills +DEFINE('BGRAD_FRAME', 1); +DEFINE('BGRAD_MARGIN', 2); +DEFINE('BGRAD_PLOT', 3); + +// Width of tab titles +DEFINE('TABTITLE_WIDTHFIT', 0); +DEFINE('TABTITLE_WIDTHFULL', -1); + +// Defines for 3D skew directions +DEFINE('SKEW3D_UP', 0); +DEFINE('SKEW3D_DOWN', 1); +DEFINE('SKEW3D_LEFT', 2); +DEFINE('SKEW3D_RIGHT', 3); + +// Line styles +DEFINE('LINESTYLE_SOLID', 1); +DEFINE('LINESTYLE_DOTTED', 2); +DEFINE('LINESTYLE_DASHED', 3); +DEFINE('LINESTYLE_LONGDASH', 4); + +// For internal use only +DEFINE("_JPG_DEBUG", false); +DEFINE("_FORCE_IMGTOFILE", false); +DEFINE("_FORCE_IMGDIR", '/tmp/jpgimg/'); + +require_once('gd_image.inc.php'); + function CheckPHPVersion($aMinVersion) { - list($majorC, $minorC, $editC) = preg_split('/[\/.-]/', PHP_VERSION); - list($majorR, $minorR, $editR) = preg_split('/[\/.-]/', $aMinVersion); - + list($majorC, $minorC, $editC) = split('[/.-]', PHP_VERSION); + list($majorR, $minorR, $editR) = split('[/.-]', $aMinVersion); + + if ($majorC != $majorR) { + return false; + } if ($majorC < $majorR) { return false; } - - if ($majorC == $majorR) { - if ($minorC < $minorR) { - return false; - } - - if ($minorC == $minorR) { - if ($editC < $editR) { - return false; - } - } + // same major - check ninor + if ($minorC > $minorR) { + return true; + } + if ($minorC < $minorR) { + return false; + } + // and same minor + if ($editC >= $editR) { + return true; } - return true; } @@ -255,6 +217,7 @@ if (!CheckPHPVersion(MIN_PHPVERSION)) { die(); } + // // Make GD sanity check // @@ -279,26 +242,25 @@ if (INSTALL_PHP_ERR_HANDLER) { } // -// Check if there were any warnings, perhaps some wrong includes by the user. In this -// case we raise it immediately since otherwise the image will not show and makes -// debugging difficult. This is controlled by the user setting CATCH_PHPERRMSG +//Check if there were any warnings, perhaps some wrong includes by the +//user // -if (isset($GLOBALS['php_errormsg']) && CATCH_PHPERRMSG && !preg_match('/|Deprecated|/i', $GLOBALS['php_errormsg'])) { +if (isset($GLOBALS['php_errormsg']) && CATCH_PHPERRMSG && + !preg_match('/|Deprecated|/i', $GLOBALS['php_errormsg'])) { JpGraphError::RaiseL(25004, $GLOBALS['php_errormsg']); } + // Useful mathematical function function sign($a) { return $a >= 0 ? 1 : -1; } -// // Utility function to generate an image name based on the filename we // are running from and assuming we use auto detection of graphic format // (top level), i.e it is safe to call this function // from a script that uses JpGraph -// function GenImgName() { // Determine what format we should use when we save the images @@ -318,8 +280,8 @@ function GenImgName() if (!isset($_SERVER['PHP_SELF'])) { JpGraphError::RaiseL(25005); - //(" Can't access PHP_SELF, PHP global variable. You can't run PHP from command line if you want to use the 'auto' naming of cache or image files."); } + //(" Can't access PHP_SELF, PHP global variable. You can't run PHP from command line if you want to use the 'auto' naming of cache or image files."); $fname = basename($_SERVER['PHP_SELF']); if (!empty($_SERVER['QUERY_STRING'])) { $q = @$_SERVER['QUERY_STRING']; @@ -330,6 +292,7 @@ function GenImgName() return $fname; } + //=================================================== // CLASS JpgTimer // Description: General timing utility class to handle @@ -340,12 +303,16 @@ class JpgTimer { private $start; private $idx; - - public function __construct() + //--------------- + // CONSTRUCTOR + public function JpgTimer() { $this->idx=0; } + //--------------- + // PUBLIC METHODS + // Push a new timer start on stack public function Push() { @@ -365,6 +332,7 @@ class JpgTimer } } // Class +$gJpgBrandTiming = BRAND_TIMING; //=================================================== // CLASS DateLocale // Description: Hold localized text used in dates @@ -377,15 +345,21 @@ class DateLocale private $iShortMonth = null; private $iMonthName = null; - public function __construct() + //--------------- + // CONSTRUCTOR + public function DateLocale() { settype($this->iDayAbb, 'array'); settype($this->iShortDay, 'array'); settype($this->iShortMonth, 'array'); settype($this->iMonthName, 'array'); + + $this->Set('C'); } + //--------------- + // PUBLIC METHODS public function Set($aLocale) { if (in_array($aLocale, array_keys($this->iDayAbb))) { @@ -412,7 +386,7 @@ class DateLocale //("You are trying to use the locale ($aLocale) which your PHP installation does not support. Hint: Use '' to indicate the default locale for this geographic region."); return false; } - + $this->iLocale = $aLocale; for ($i = 0, $ofs = 0 - strftime('%w'); $i < 7; $i++, $ofs++) { $day = strftime('%a', strtotime("$ofs day")); @@ -426,7 +400,7 @@ class DateLocale $this->iShortMonth[$aLocale][] = ucfirst($short); $this->iMonthName [$aLocale][] = ucfirst($full); } - + setlocale(LC_TIME, $pLocale); return true; @@ -437,7 +411,7 @@ class DateLocale { return $this->iDayAbb[$this->iLocale]; } - + public function GetShortDay() { return $this->iShortDay[$this->iLocale]; @@ -447,7 +421,7 @@ class DateLocale { return $this->iShortMonth[$this->iLocale]; } - + public function GetShortMonthName($aNbr) { return $this->iShortMonth[$this->iLocale][$aNbr]; @@ -464,7 +438,6 @@ class DateLocale } } -// Global object handlers $gDateLocale = new DateLocale(); $gJpgDateLocale = new DateLocale(); @@ -480,10 +453,8 @@ class Footer public $left; public $center; public $right; - private $iTimer=null; - private $itimerpoststring=''; - public function __construct() + public function Footer() { $this->left = new Text(); $this->left->ParagraphAlign('left'); @@ -493,12 +464,6 @@ class Footer $this->right->ParagraphAlign('right'); } - public function SetTimer($aTimer, $aTimerPostString='') - { - $this->iTimer = $aTimer; - $this->itimerpoststring = $aTimerPostString; - } - public function SetMargin($aLeft=3, $aRight=3, $aBottom=3) { $this->iLeftMargin = $aLeft; @@ -519,9 +484,6 @@ class Footer $x = $aImg->width - $this->iRightMargin; $this->right->Align('right', 'bottom'); - if ($this->iTimer != null) { - $this->right->Set($this->right->t . sprintf('%.3f', $this->iTimer->Pop()/1000.0) . $this->itimerpoststring); - } $this->right->Stroke($aImg, $x, $y); } } @@ -533,64 +495,62 @@ class Footer //=================================================== class Graph { - public $cache=null; // Cache object (singleton) - public $img=null; // Img object (singleton) - public $plots=array(); // Array of all plot object in the graph (for Y 1 axis) - public $y2plots=array(); // Array of all plot object in the graph (for Y 2 axis) + public $cache=null; // Cache object (singleton) + public $img=null; // Img object (singleton) + public $plots=array(); // Array of all plot object in the graph (for Y 1 axis) + public $y2plots=array();// Array of all plot object in the graph (for Y 2 axis) public $ynplots=array(); - public $xscale=null; // X Scale object (could be instance of LinearScale or LogScale + public $xscale=null; // X Scale object (could be instance of LinearScale or LogScale public $yscale=null; public $y2scale=null; public $ynscale=array(); - public $iIcons = array(); // Array of Icons to add to - public $cache_name; // File name to be used for the current graph in the cache directory - public $xgrid=null; // X Grid object (linear or logarithmic) + public $iIcons = array(); // Array of Icons to add to + public $cache_name; // File name to be used for the current graph in the cache directory + public $xgrid=null; // X Grid object (linear or logarithmic) public $ygrid=null; public $y2grid=null; //dito for Y - public $doframe; - public $frame_color; - public $frame_weight; // Frame around graph + public $doframe=true; + public $frame_color=array(0,0,0); + public $frame_weight=1; // Frame around graph public $boxed=false; - public $box_color='black'; - public $box_weight=1; // Box around plot area + public $box_color=array(0,0,0); + public $box_weight=1; // Box around plot area public $doshadow=false; public $shadow_width=4; - public $shadow_color='gray@0.5'; // Shadow for graph - public $xaxis=null; // X-axis (instane of Axis class) + public $shadow_color=array(102,102,102); // Shadow for graph + public $xaxis=null; // X-axis (instane of Axis class) public $yaxis=null; public $y2axis=null; - public $ynaxis=array(); // Y axis (instance of Axis class) - public $margin_color; // Margin color of graph - public $plotarea_color=array(255,255,255); // Plot area color + public $ynaxis=array(); // Y axis (instance of Axis class) + public $margin_color=array(200,200,200); // Margin color of graph + public $plotarea_color=array(255,255,255); // Plot area color public $title; public $subtitle; - public $subsubtitle; // Title and subtitle(s) text object - public $axtype="linlin"; // Type of axis + public $subsubtitle; // Title and subtitle(s) text object + public $axtype="linlin"; // Type of axis public $xtick_factor; - public $ytick_factor; // Factor to determine the maximum number of ticks depending on the plot width + public $ytick_factor; // Factor to determine the maximum number of ticks depending on the plot width public $texts=null; - public $y2texts=null; // Text object to ge shown in the graph + public $y2texts=null; // Text object to ge shown in the graph public $lines=null; public $y2lines=null; public $bands=null; public $y2bands=null; public $text_scale_off=0; - public $text_scale_abscenteroff=-1; // Text scale in fractions and for centering bars - public $background_image=''; + public $text_scale_abscenteroff=-1; // Text scale in fractions and for centering bars + public $background_image=""; public $background_image_type=-1; public $background_image_format="png"; public $background_image_bright=0; public $background_image_contr=0; public $background_image_sat=0; - public $background_image_xpos=0; - public $background_image_ypos=0; public $image_bright=0; public $image_contr=0; public $image_sat=0; public $inline; public $showcsim=0; - public $csimcolor="red";//debug stuff, draw the csim boundaris on the image if <>0 - public $grid_depth=DEPTH_BACK; // Draw grid under all plots as default + public $csimcolor="red"; //debug stuff, draw the csim boundaris on the image if <>0 + public $grid_depth=DEPTH_BACK; // Draw grid under all plots as default public $iAxisStyle = AXSTYLE_SIMPLE; public $iCSIMdisplay=false; public $iHasStroked = false; @@ -605,27 +565,22 @@ class Graph public $bkg_gradstyle=BGRAD_MARGIN; public $bkg_gradfrom='navy'; public $bkg_gradto='silver'; - public $plot_gradtype=-1; - public $plot_gradstyle=BGRAD_MARGIN; - public $plot_gradfrom='silver'; - public $plot_gradto='navy'; - public $titlebackground = false; public $titlebackground_color = 'lightblue'; public $titlebackground_style = 1; - public $titlebackground_framecolor; - public $titlebackground_framestyle; - public $titlebackground_frameweight; - public $titlebackground_bevelheight; + public $titlebackground_framecolor = 'blue'; + public $titlebackground_framestyle = 2; + public $titlebackground_frameweight = 1; + public $titlebackground_bevelheight = 3 ; public $titlebkg_fillstyle=TITLEBKG_FILLSTYLE_SOLID; public $titlebkg_scolor1='black'; public $titlebkg_scolor2='white'; - public $framebevel; - public $framebeveldepth; - public $framebevelborder; - public $framebevelbordercolor; - public $framebevelcolor1; - public $framebevelcolor2; + public $framebevel = false; + public $framebeveldepth = 2 ; + public $framebevelborder = false; + public $framebevelbordercolor='black'; + public $framebevelcolor1='white@0.4'; + public $framebevelcolor2='black@0.4'; public $background_image_mix=100; public $background_cflag = ''; public $background_cflag_type = BGIMG_FILLPLOT; @@ -640,7 +595,6 @@ class Graph public $iImgTransBorder=false; public $iImgTransHorizonPos=0.5; public $legend; - public $graph_theme; protected $iYAxisDeltaPos=50; protected $iIconDepth=DEPTH_BACK; protected $iAxisLblBgType = 0; @@ -650,116 +604,81 @@ class Graph protected $iYAxisLblBgColor = 'black'; protected $iTables=null; - protected $isRunningClear = false; - protected $inputValues; - protected $isAfterSetScale = false; + //--------------- + // CONSTRUCTOR - // aWIdth Width in pixels of image - // aHeight Height in pixels of image - // aCachedName Name for image file in cache directory - // aTimeOut Timeout in minutes for image in cache - // aInline If true the image is streamed back in the call to Stroke() - // If false the image is just created in the cache - public function __construct($aWidth=300, $aHeight=200, $aCachedName='', $aTimeout=0, $aInline=true) + // aWIdth Width in pixels of image + // aHeight Height in pixels of image + // aCachedName Name for image file in cache directory + // aTimeOut Timeout in minutes for image in cache + // aInline If true the image is streamed back in the call to Stroke() + // If false the image is just created in the cache + public function Graph($aWidth=300, $aHeight=200, $aCachedName="", $aTimeOut=0, $aInline=true) { + global $gJpgBrandTiming; + // If timing is used create a new timing object + if ($gJpgBrandTiming) { + global $tim; + $tim = new JpgTimer(); + $tim->Push(); + } + if (!is_numeric($aWidth) || !is_numeric($aHeight)) { JpGraphError::RaiseL(25008);//('Image width/height argument in Graph::Graph() must be numeric'); } - // Initialize frame and margin - $this->InitializeFrameAndMargin(); - // Automatically generate the image file name based on the name of the script that // generates the graph - if ($aCachedName == 'auto') { + if ($aCachedName=="auto") { $aCachedName=GenImgName(); } - + // Should the image be streamed back to the browser or only to the cache? $this->inline=$aInline; + + $this->img = new RotImage($aWidth, $aHeight); - $this->img = new RotImage($aWidth, $aHeight); - $this->cache = new ImgStreamCache(); - - // Window doesn't like '?' in the file name so replace it with an '_' - $aCachedName = str_replace("?", "_", $aCachedName); - $this->SetupCache($aCachedName, $aTimeout); + $this->cache = new ImgStreamCache($this->img); + $this->cache->SetTimeOut($aTimeOut); $this->title = new Text(); $this->title->ParagraphAlign('center'); - $this->title->SetFont(FF_DEFAULT, FS_NORMAL); //FF_FONT2, FS_BOLD - $this->title->SetMargin(5); + $this->title->SetFont(FF_FONT2, FS_BOLD); + $this->title->SetMargin(3); $this->title->SetAlign('center'); $this->subtitle = new Text(); $this->subtitle->ParagraphAlign('center'); - $this->subtitle->SetMargin(3); + $this->subtitle->SetMargin(2); $this->subtitle->SetAlign('center'); $this->subsubtitle = new Text(); $this->subsubtitle->ParagraphAlign('center'); - $this->subsubtitle->SetMargin(3); + $this->subsubtitle->SetMargin(2); $this->subsubtitle->SetAlign('center'); $this->legend = new Legend(); $this->footer = new Footer(); + // Window doesn't like '?' in the file name so replace it with an '_' + $aCachedName = str_replace("?", "_", $aCachedName); + // If the cached version exist just read it directly from the // cache, stream it back to browser and exit - if ($aCachedName!='' && READ_CACHE && $aInline) { - if ($this->cache->GetAndStream($this->img, $aCachedName)) { + if ($aCachedName!="" && READ_CACHE && $aInline) { + if ($this->cache->GetAndStream($aCachedName)) { exit(); } } - + + $this->cache_name = $aCachedName; $this->SetTickDensity(); // Normal density $this->tabtitle = new GraphTabTitle(); - - if (!$this->isRunningClear) { - $this->inputValues = array(); - $this->inputValues['aWidth'] = $aWidth; - $this->inputValues['aHeight'] = $aHeight; - $this->inputValues['aCachedName'] = $aCachedName; - $this->inputValues['aTimeout'] = $aTimeout; - $this->inputValues['aInline'] = $aInline; - - $theme_class = DEFAULT_THEME_CLASS; - if (class_exists($theme_class)) { - $this->graph_theme = new $theme_class(); - } - } } - - public function InitializeFrameAndMargin() - { - $this->doframe=true; - $this->frame_color='black'; - $this->frame_weight=1; - - $this->titlebackground_framecolor = 'blue'; - $this->titlebackground_framestyle = 2; - $this->titlebackground_frameweight = 1; - $this->titlebackground_bevelheight = 3; - $this->titlebkg_fillstyle=TITLEBKG_FILLSTYLE_SOLID; - $this->titlebkg_scolor1='black'; - $this->titlebkg_scolor2='white'; - $this->framebevel = false; - $this->framebeveldepth = 2; - $this->framebevelborder = false; - $this->framebevelbordercolor='black'; - $this->framebevelcolor1='white@0.4'; - $this->framebevelcolor2='black@0.4'; - - $this->margin_color = array(250,250,250); - } - - public function SetupCache($aFilename, $aTimeout=60) - { - $this->cache_name = $aFilename; - $this->cache->SetTimeOut($aTimeout); - } - + //--------------- + // PUBLIC METHODS + // Enable final image perspective transformation public function Set3DPerspective($aDir=1, $aHorizon=100, $aSkewDist=120, $aQuality=false, $aFillColor='#FFFFFF', $aBorder=false, $aMinSize=true, $aHorizonPos=0.5) { @@ -774,26 +693,6 @@ class Graph $this->iImgTransHorizonPos=$aHorizonPos; } - public function SetUserFont($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->img->ttf->SetUserFont($aNormal, $aBold, $aItalic, $aBoldIt); - } - - public function SetUserFont1($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->img->ttf->SetUserFont1($aNormal, $aBold, $aItalic, $aBoldIt); - } - - public function SetUserFont2($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->img->ttf->SetUserFont2($aNormal, $aBold, $aItalic, $aBoldIt); - } - - public function SetUserFont3($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->img->ttf->SetUserFont3($aNormal, $aBold, $aItalic, $aBoldIt); - } - // Set Image format and optional quality public function SetImgFormat($aFormat, $aQuality=75) { @@ -810,7 +709,7 @@ class Graph { $this->iIconDepth=$aDepth; } - + // Specify graph angle 0-360 degrees. public function SetAngle($aAngle) { @@ -837,6 +736,11 @@ class Graph // when we have done a 90 degree rotation public function Set90AndMargin($lm=0, $rm=0, $tm=0, $bm=0) { + $lm = $lm ==0 ? floor(0.2 * $this->img->width) : $lm ; + $rm = $rm ==0 ? floor(0.1 * $this->img->width) : $rm ; + $tm = $tm ==0 ? floor(0.2 * $this->img->height) : $tm ; + $bm = $bm ==0 ? floor(0.1 * $this->img->height) : $bm ; + $adj = ($this->img->height - $this->img->width)/2; $this->img->SetMargin($tm-$adj, $bm-$adj, $rm+$adj, $lm+$adj); $this->img->SetCenter(floor($this->img->width/2), floor($this->img->height/2)); @@ -847,7 +751,7 @@ class Graph $this->xaxis->SetLabelAlign('right', 'center'); $this->yaxis->SetLabelAlign('center', 'bottom'); } - + public function SetClipping($aFlg=true) { $this->iDoClipping = $aFlg ; @@ -857,8 +761,8 @@ class Graph public function Add($aPlot) { if ($aPlot == null) { - JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph."); - } + JpGraphError::RaiseL(25010); + }//("Graph::Add() You tried to add a null plot to the graph."); if (is_array($aPlot) && count($aPlot) > 0) { $cl = $aPlot[0]; } else { @@ -867,7 +771,7 @@ class Graph if ($cl instanceof Text) { $this->AddText($aPlot); - } elseif (class_exists('PlotLine', false) && ($cl instanceof PlotLine)) { + } elseif ($cl instanceof PlotLine) { $this->AddLine($aPlot); } elseif (class_exists('PlotBand', false) && ($cl instanceof PlotBand)) { $this->AddBand($aPlot); @@ -876,15 +780,7 @@ class Graph } elseif (class_exists('GTextTable', false) && ($cl instanceof GTextTable)) { $this->AddTable($aPlot); } else { - if (is_array($aPlot)) { - $this->plots = array_merge($this->plots, $aPlot); - } else { - $this->plots[] = $aPlot; - } - } - - if ($this->graph_theme) { - $this->graph_theme->SetupPlot($aPlot); + $this->plots[] = $aPlot; } } @@ -914,8 +810,8 @@ class Graph public function AddY2($aPlot) { if ($aPlot == null) { - JpGraphError::RaiseL(25011);//("Graph::AddY2() You tried to add a null plot to the graph."); - } + JpGraphError::RaiseL(25011); + }//("Graph::AddY2() You tried to add a null plot to the graph."); if (is_array($aPlot) && count($aPlot) > 0) { $cl = $aPlot[0]; @@ -925,25 +821,21 @@ class Graph if ($cl instanceof Text) { $this->AddText($aPlot, true); - } elseif (class_exists('PlotLine', false) && ($cl instanceof PlotLine)) { + } elseif ($cl instanceof PlotLine) { $this->AddLine($aPlot, true); } elseif (class_exists('PlotBand', false) && ($cl instanceof PlotBand)) { $this->AddBand($aPlot, true); } else { $this->y2plots[] = $aPlot; } - - if ($this->graph_theme) { - $this->graph_theme->SetupPlot($aPlot); - } } - + // Add plot to the extra Y-axises public function AddY($aN, $aPlot) { if ($aPlot == null) { - JpGraphError::RaiseL(25012);//("Graph::AddYN() You tried to add a null plot to the graph."); - } + JpGraphError::RaiseL(25012); + }//("Graph::AddYN() You tried to add a null plot to the graph."); if (is_array($aPlot) && count($aPlot) > 0) { $cl = $aPlot[0]; @@ -951,25 +843,21 @@ class Graph $cl = $aPlot; } - if (($cl instanceof Text) || - (class_exists('PlotLine', false) && ($cl instanceof PlotLine)) || - (class_exists('PlotBand', false) && ($cl instanceof PlotBand))) { - JpGraph::RaiseL(25013);//('You can only add standard plots to multiple Y-axis'); - } else { + if (($cl instanceof Text) || ($cl instanceof PlotLine) || + (class_exists('PlotBand', false) && ($cl instanceof PlotBand))) { + JpGraph::RaiseL(25013); + }//('You can only add standard plots to multiple Y-axis'); + else { $this->ynplots[$aN][] = $aPlot; } - - if ($this->graph_theme) { - $this->graph_theme->SetupPlot($aPlot); - } } // Add text object to the graph public function AddText($aTxt, $aToY2=false) { if ($aTxt == null) { - JpGraphError::RaiseL(25014);//("Graph::AddText() You tried to add a null text to the graph."); - } + JpGraphError::RaiseL(25014); + }//("Graph::AddText() You tried to add a null text to the graph."); if ($aToY2) { if (is_array($aTxt)) { for ($i=0; $i < count($aTxt); ++$i) { @@ -988,33 +876,29 @@ class Graph } } } - + // Add a line object (class PlotLine) to the graph public function AddLine($aLine, $aToY2=false) { if ($aLine == null) { - JpGraphError::RaiseL(25015);//("Graph::AddLine() You tried to add a null line to the graph."); - } + JpGraphError::RaiseL(25015); + }//("Graph::AddLine() You tried to add a null line to the graph."); if ($aToY2) { if (is_array($aLine)) { for ($i=0; $i < count($aLine); ++$i) { - //$this->y2lines[]=$aLine[$i]; - $this->y2plots[]=$aLine[$i]; + $this->y2lines[]=$aLine[$i]; } } else { - //$this->y2lines[] = $aLine; - $this->y2plots[]=$aLine; + $this->y2lines[] = $aLine; } } else { if (is_array($aLine)) { for ($i=0; $ilines[]=$aLine[$i]; - $this->plots[]=$aLine[$i]; + $this->lines[]=$aLine[$i]; } } else { - //$this->lines[] = $aLine; - $this->plots[] = $aLine; + $this->lines[] = $aLine; } } } @@ -1023,8 +907,8 @@ class Graph public function AddBand($aBand, $aToY2=false) { if ($aBand == null) { - JpGraphError::RaiseL(25016);//(" Graph::AddBand() You tried to add a null band to the graph."); - } + JpGraphError::RaiseL(25016); + }//(" Graph::AddBand() You tried to add a null band to the graph."); if ($aToY2) { if (is_array($aBand)) { @@ -1045,13 +929,6 @@ class Graph } } - public function SetPlotGradient($aFrom='navy', $aTo='silver', $aGradType=2) - { - $this->plot_gradtype=$aGradType; - $this->plot_gradfrom = $aFrom; - $this->plot_gradto = $aTo; - } - public function SetBackgroundGradient($aFrom='navy', $aTo='silver', $aGradType=2, $aStyle=BGRAD_FRAME) { $this->bkg_gradtype=$aGradType; @@ -1059,7 +936,7 @@ class Graph $this->bkg_gradfrom = $aFrom; $this->bkg_gradto = $aTo; } - + // Set a country flag in the background public function SetBackgroundCFlag($aName, $aBgType=BGIMG_FILLPLOT, $aMix=100) { @@ -1078,11 +955,14 @@ class Graph // Specify a background image - public function SetBackgroundImage($aFileName, $aBgType=BGIMG_FILLPLOT, $aImgFormat='auto') + public function SetBackgroundImage($aFileName, $aBgType=BGIMG_FILLPLOT, $aImgFormat="auto") { + if (!USE_TRUECOLOR) { + JpGraphError::RaiseL(25017);//("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x you must enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts."); + } // Get extension to determine image type - if ($aImgFormat == 'auto') { + if ($aImgFormat == "auto") { $e = explode('.', $aFileName); if (!$e) { JpGraphError::RaiseL(25018, $aFileName);//('Incorrect file name for Graph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type'); @@ -1106,20 +986,13 @@ class Graph { $this->background_image_mix = $aMix ; } - - // Adjust background image position - public function SetBackgroundImagePos($aXpos, $aYpos) - { - $this->background_image_xpos = $aXpos ; - $this->background_image_ypos = $aYpos ; - } - + // Specify axis style (boxed or single) public function SetAxisStyle($aStyle) { $this->iAxisStyle = $aStyle ; } - + // Set a frame around the plot area public function SetBox($aDrawPlotFrame=true, $aPlotFrameColor=array(0,0,0), $aPlotFrameWeight=1) { @@ -1127,19 +1000,19 @@ class Graph $this->box_weight = $aPlotFrameWeight; $this->box_color = $aPlotFrameColor; } - + // Specify color for the plotarea (not the margins) public function SetColor($aColor) { $this->plotarea_color=$aColor; } - + // Specify color for the margins (all areas outside the plotarea) public function SetMarginColor($aColor) { $this->margin_color=$aColor; } - + // Set a frame around the entire image public function SetFrame($aDrawImgFrame=true, $aImgFrameColor=array(0,0,0), $aImgFrameWeight=1) { @@ -1161,7 +1034,7 @@ class Graph } // Set the shadow around the whole image - public function SetShadow($aShowShadow=true, $aShadowWidth=5, $aShadowColor='darkgray') + public function SetShadow($aShowShadow=true, $aShadowWidth=5, $aShadowColor=array(102,102,102)) { $this->doshadow = $aShowShadow; $this->shadow_color = $aShadowColor; @@ -1177,84 +1050,65 @@ class Graph $this->axtype = $aAxisType; if ($aYMax < $aYMin || $aXMax < $aXMin) { - JpGraphError::RaiseL(25020);//('Graph::SetScale(): Specified Max value must be larger than the specified Min value.'); - } + JpGraphError::RaiseL(25020); + }//('Graph::SetScale(): Specified Max value must be larger than the specified Min value.'); $yt=substr($aAxisType, -3, 3); - if ($yt == 'lin') { + if ($yt=="lin") { $this->yscale = new LinearScale($aYMin, $aYMax); - } elseif ($yt == 'int') { + } elseif ($yt == "int") { $this->yscale = new LinearScale($aYMin, $aYMax); $this->yscale->SetIntScale(); - } elseif ($yt == 'log') { + } elseif ($yt=="log") { $this->yscale = new LogScale($aYMin, $aYMax); } else { - JpGraphError::RaiseL(25021, $aAxisType);//("Unknown scale specification for Y-scale. ($aAxisType)"); - } - + JpGraphError::RaiseL(25021, $aAxisType); + }//("Unknown scale specification for Y-scale. ($aAxisType)"); + $xt=substr($aAxisType, 0, 3); - if ($xt == 'lin' || $xt == 'tex') { - $this->xscale = new LinearScale($aXMin, $aXMax, 'x'); - $this->xscale->textscale = ($xt == 'tex'); - } elseif ($xt == 'int') { - $this->xscale = new LinearScale($aXMin, $aXMax, 'x'); + if ($xt == "lin" || $xt == "tex") { + $this->xscale = new LinearScale($aXMin, $aXMax, "x"); + $this->xscale->textscale = ($xt == "tex"); + } elseif ($xt == "int") { + $this->xscale = new LinearScale($aXMin, $aXMax, "x"); $this->xscale->SetIntScale(); - } elseif ($xt == 'dat') { - $this->xscale = new DateScale($aXMin, $aXMax, 'x'); - } elseif ($xt == 'log') { - $this->xscale = new LogScale($aXMin, $aXMax, 'x'); + } elseif ($xt == "dat") { + $this->xscale = new DateScale($aXMin, $aXMax, "x"); + } elseif ($xt == "log") { + $this->xscale = new LogScale($aXMin, $aXMax, "x"); } else { - JpGraphError::RaiseL(25022, $aAxisType);//(" Unknown scale specification for X-scale. ($aAxisType)"); - } + JpGraphError::RaiseL(25022, $aAxisType); + }//(" Unknown scale specification for X-scale. ($aAxisType)"); $this->xaxis = new Axis($this->img, $this->xscale); $this->yaxis = new Axis($this->img, $this->yscale); $this->xgrid = new Grid($this->xaxis); $this->ygrid = new Grid($this->yaxis); $this->ygrid->Show(); - - - if (!$this->isRunningClear) { - $this->inputValues['aAxisType'] = $aAxisType; - $this->inputValues['aYMin'] = $aYMin; - $this->inputValues['aYMax'] = $aYMax; - $this->inputValues['aXMin'] = $aXMin; - $this->inputValues['aXMax'] = $aXMax; - - if ($this->graph_theme) { - $this->graph_theme->ApplyGraph($this); - } - } - - $this->isAfterSetScale = true; } - + // Specify secondary Y scale - public function SetY2Scale($aAxisType='lin', $aY2Min=1, $aY2Max=1) + public function SetY2Scale($aAxisType="lin", $aY2Min=1, $aY2Max=1) { - if ($aAxisType == 'lin') { + if ($aAxisType=="lin") { $this->y2scale = new LinearScale($aY2Min, $aY2Max); - } elseif ($aAxisType == 'int') { + } elseif ($aAxisType == "int") { $this->y2scale = new LinearScale($aY2Min, $aY2Max); $this->y2scale->SetIntScale(); - } elseif ($aAxisType == 'log') { + } elseif ($aAxisType=="log") { $this->y2scale = new LogScale($aY2Min, $aY2Max); } else { - JpGraphError::RaiseL(25023, $aAxisType);//("JpGraph: Unsupported Y2 axis type: $aAxisType\nMust be one of (lin,log,int)"); - } - + JpGraphError::RaiseL(25023, $aAxisType); + }//("JpGraph: Unsupported Y2 axis type: $aAxisType\nMust be one of (lin,log,int)"); + $this->y2axis = new Axis($this->img, $this->y2scale); $this->y2axis->scale->ticks->SetDirection(SIDE_LEFT); $this->y2axis->SetLabelSide(SIDE_RIGHT); $this->y2axis->SetPos('max'); $this->y2axis->SetTitleSide(SIDE_RIGHT); - + // Deafult position is the max x-value $this->y2grid = new Grid($this->y2axis); - - if ($this->graph_theme) { - $this->graph_theme->ApplyGraph($this); - } } // Set the delta position (in pixels) between the multiple Y-axis @@ -1266,24 +1120,20 @@ class Graph // Specify secondary Y scale public function SetYScale($aN, $aAxisType="lin", $aYMin=1, $aYMax=1) { - if ($aAxisType == 'lin') { + if ($aAxisType=="lin") { $this->ynscale[$aN] = new LinearScale($aYMin, $aYMax); - } elseif ($aAxisType == 'int') { + } elseif ($aAxisType == "int") { $this->ynscale[$aN] = new LinearScale($aYMin, $aYMax); $this->ynscale[$aN]->SetIntScale(); - } elseif ($aAxisType == 'log') { + } elseif ($aAxisType=="log") { $this->ynscale[$aN] = new LogScale($aYMin, $aYMax); } else { - JpGraphError::RaiseL(25024, $aAxisType);//("JpGraph: Unsupported Y axis type: $aAxisType\nMust be one of (lin,log,int)"); - } - + JpGraphError::RaiseL(25024, $aAxisType); + }//("JpGraph: Unsupported Y axis type: $aAxisType\nMust be one of (lin,log,int)"); + $this->ynaxis[$aN] = new Axis($this->img, $this->ynscale[$aN]); $this->ynaxis[$aN]->scale->ticks->SetDirection(SIDE_LEFT); $this->ynaxis[$aN]->SetLabelSide(SIDE_RIGHT); - - if ($this->graph_theme) { - $this->graph_theme->ApplyGraph($this); - } } // Specify density of ticks when autoscaling 'normal', 'dense', 'sparse', 'verysparse' @@ -1294,39 +1144,39 @@ class Graph $this->xtick_factor=30; $this->ytick_factor=25; switch ($aYDensity) { - case TICKD_DENSE: - $this->ytick_factor=12; - break; - case TICKD_NORMAL: - $this->ytick_factor=25; - break; - case TICKD_SPARSE: - $this->ytick_factor=40; - break; - case TICKD_VERYSPARSE: - $this->ytick_factor=100; - break; - default: - JpGraphError::RaiseL(25025, $densy);//("JpGraph: Unsupported Tick density: $densy"); - } - switch ($aXDensity) { - case TICKD_DENSE: - $this->xtick_factor=15; - break; - case TICKD_NORMAL: - $this->xtick_factor=30; - break; - case TICKD_SPARSE: - $this->xtick_factor=45; - break; - case TICKD_VERYSPARSE: - $this->xtick_factor=60; - break; - default: - JpGraphError::RaiseL(25025, $densx);//("JpGraph: Unsupported Tick density: $densx"); - } + case TICKD_DENSE: + $this->ytick_factor=12; + break; + case TICKD_NORMAL: + $this->ytick_factor=25; + break; + case TICKD_SPARSE: + $this->ytick_factor=40; + break; + case TICKD_VERYSPARSE: + $this->ytick_factor=100; + break; + default: + JpGraphError::RaiseL(25025, $densy);//("JpGraph: Unsupported Tick density: $densy"); } - + switch ($aXDensity) { + case TICKD_DENSE: + $this->xtick_factor=15; + break; + case TICKD_NORMAL: + $this->xtick_factor=30; + break; + case TICKD_SPARSE: + $this->xtick_factor=45; + break; + case TICKD_VERYSPARSE: + $this->xtick_factor=60; + break; + default: + JpGraphError::RaiseL(25025, $densx);//("JpGraph: Unsupported Tick density: $densx"); + } + } + // Get a string of all image map areas public function GetCSIMareas() @@ -1381,16 +1231,14 @@ class Graph } } - if ($this->iTables != null) { - $n = count($this->iTables); - for ($i = 0; $i < $n; ++$i) { - $csim .= $this->iTables[$i]->GetCSIMareas(); - } + $n = count($this->iTables); + for ($i=0; $i < $n; ++$i) { + $csim .= $this->iTables[$i]->GetCSIMareas(); } return $csim; } - + // Get a complete .. tag for the final image map public function GetHTMLImageMap($aMapName) { @@ -1428,7 +1276,7 @@ class Graph $timedout=false; // Does it exist at all ? - + if (file_exists($basecsim) && file_exists($baseimg)) { // Check that it hasn't timed out $diff=time()-filemtime($basecsim); @@ -1441,8 +1289,8 @@ class Graph fpassthru($fh); return true; } else { - JpGraphError::RaiseL(25027, $basecsim);//(" Can't open cached CSIM \"$basecsim\" for reading."); - } + JpGraphError::RaiseL(25027, $basecsim); + }//(" Can't open cached CSIM \"$basecsim\" for reading."); } } } @@ -1450,17 +1298,16 @@ class Graph } // Build the argument string to be used with the csim images - public static function GetURLArguments($aAddRecursiveBlocker=false) + public function GetURLArguments() { - if ($aAddRecursiveBlocker) { - // This is a JPGRAPH internal defined that prevents - // us from recursively coming here again - $urlarg = _CSIM_DISPLAY.'=1'; - } + + // This is a JPGRAPH internal defined that prevents + // us from recursively coming here again + $urlarg = _CSIM_DISPLAY.'=1'; // Now reconstruct any user URL argument reset($_GET); - foreach ($_GET as $key => $value) { + while (list($key, $value) = each($_GET)) { if (is_array($value)) { foreach ($value as $k => $v) { $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); @@ -1474,7 +1321,7 @@ class Graph // but there is little else we can do. One idea for the // future might be recreate the POST header in case. reset($_POST); - foreach ($_POST as $key => $value) { + while (list($key, $value) = each($_POST)) { if (is_array($value)) { foreach ($value as $k => $v) { $urlarg .= '&'.$key.'%5B'.$k.'%5D='.urlencode($v); @@ -1505,7 +1352,7 @@ class Graph $aScriptName=basename($_SERVER['PHP_SELF']); } - $urlarg = $this->GetURLArguments(true); + $urlarg = $this->GetURLArguments(); if (empty($_GET[_CSIM_DISPLAY])) { // First determine if we need to check for a cached version @@ -1527,7 +1374,7 @@ class Graph if (file_exists($dir) && !is_writeable($dir)) { JpgraphError::RaiseL(25028, $dir);//('Apache/PHP does not have permission to write to the CSIM cache directory ('.$dir.'). Check permissions.'); } - + // Make sure directory exists $this->cache->MakeDirs($dir); @@ -1540,42 +1387,27 @@ class Graph // to be converted to real arguments. $tmp = str_replace('?', '%3f', $baseimg); $htmlwrap = $this->GetHTMLImageMap($aCSIMName)."\n". - 'img->width.'" height="'.$this->img->height."\" alt=\"".$this->iCSIMImgAlt."\" />\n"; + '\"".$this-iCSIMImgAlt."\" />\n"; if ($fh = @fopen($basecsim, 'w')) { fwrite($fh, $htmlwrap); fclose($fh); echo $htmlwrap; } else { - JpGraphError::RaiseL(25029, $basecsim);//(" Can't write CSIM \"$basecsim\" for writing. Check free space and permissions."); - } + JpGraphError::RaiseL(25029, $basecsim); + }//(" Can't write CSIM \"$basecsim\" for writing. Check free space and permissions."); } else { if ($aScriptName=='') { JpGraphError::RaiseL(25030);//('Missing script name in call to StrokeCSIM(). You must specify the name of the actual image script as the first parameter to StrokeCSIM().'); } - echo $this->GetHTMLImageMap($aCSIMName) . $this->GetCSIMImgHTML($aCSIMName, $aScriptName, $aBorder); + echo $this->GetHTMLImageMap($aCSIMName); + echo "\"".$this-iCSIMImgAlt."\" />\n"; } } else { $this->Stroke(); } } - public function StrokeCSIMImage() - { - if (@$_GET[_CSIM_DISPLAY] == 1) { - $this->Stroke(); - } - } - - public function GetCSIMImgHTML($aCSIMName, $aScriptName='auto', $aBorder=0) - { - if ($aScriptName=='auto') { - $aScriptName=basename($_SERVER['PHP_SELF']); - } - $urlarg = $this->GetURLArguments(true); - return "\"".$this-iCSIMImgAlt."\" />\n"; - } - public function GetTextsYMinMax($aY2=false) { if ($aY2) { @@ -1583,11 +1415,12 @@ class Graph } else { $txts = $this->texts; } - $n = is_array($txts) ? count($txts) : 0; + $n = count($txts); $min=null; $max=null; for ($i=0; $i < $n; ++$i) { - if ($txts[$i]->iScalePosY !== null && $txts[$i]->iScalePosX !== null) { + if ($txts[$i]->iScalePosY !== null && + $txts[$i]->iScalePosX !== null) { if ($min === null) { $min = $max = $txts[$i]->iScalePosY ; } else { @@ -1610,11 +1443,12 @@ class Graph } else { $txts = $this->texts; } - $n = is_array($txts) ? count($txts) : 0; + $n = count($txts); $min=null; $max=null; for ($i=0; $i < $n; ++$i) { - if ($txts[$i]->iScalePosY !== null && $txts[$i]->iScalePosX !== null) { + if ($txts[$i]->iScalePosY !== null && + $txts[$i]->iScalePosX !== null) { if ($min === null) { $min = $max = $txts[$i]->iScalePosX ; } else { @@ -1634,35 +1468,19 @@ class Graph { list($min, $ymin) = $this->plots[0]->Min(); list($max, $ymax) = $this->plots[0]->Max(); - - $i=0; - // Some plots, e.g. PlotLine should not affect the scale - // and will return (null,null). We should ignore those - // values. - while (($min===null || $max === null) && ($i < count($this->plots)-1)) { - ++$i; - list($min, $ymin) = $this->plots[$i]->Min(); - list($max, $ymax) = $this->plots[$i]->Max(); - } - foreach ($this->plots as $p) { list($xmin, $ymin) = $p->Min(); list($xmax, $ymax) = $p->Max(); - - if ($xmin !== null && $xmax !== null) { - $min = Min($xmin, $min); - $max = Max($xmax, $max); - } + $min = Min($xmin, $min); + $max = Max($xmax, $max); } if ($this->y2axis != null) { foreach ($this->y2plots as $p) { list($xmin, $ymin) = $p->Min(); list($xmax, $ymax) = $p->Max(); - if ($xmin !== null && $xmax !== null) { - $min = Min($xmin, $min); - $max = Max($xmax, $max); - } + $min = Min($xmin, $min); + $max = Max($xmax, $max); } } @@ -1672,10 +1490,8 @@ class Graph foreach ($this->ynplots[$i] as $p) { list($xmin, $ymin) = $p->Min(); list($xmax, $ymax) = $p->Max(); - if ($xmin !== null && $xmax !== null) { - $min = Min($xmin, $min); - $max = Max($xmax, $max); - } + $min = Min($xmin, $min); + $max = Max($xmax, $max); } } } @@ -1685,29 +1501,27 @@ class Graph public function AdjustMarginsForTitles() { $totrequired = - ($this->title->t != '' - ? $this->title->GetTextHeight($this->img) + $this->title->margin + 5 * SUPERSAMPLING_SCALE - : 0) + - ($this->subtitle->t != '' - ? $this->subtitle->GetTextHeight($this->img) + $this->subtitle->margin + 5 * SUPERSAMPLING_SCALE - : 0) + - ($this->subsubtitle->t != '' - ? $this->subsubtitle->GetTextHeight($this->img) + $this->subsubtitle->margin + 5 * SUPERSAMPLING_SCALE - : 0) ; + ($this->title->t != '' ? + $this->title->GetTextHeight($this->img) + $this->title->margin + 5 : 0) + + ($this->subtitle->t != '' ? + $this->subtitle->GetTextHeight($this->img) + $this->subtitle->margin + 5 : 0) + + ($this->subsubtitle->t != '' ? + $this->subsubtitle->GetTextHeight($this->img) + $this->subsubtitle->margin + 5 : 0) ; + $btotrequired = 0; if ($this->xaxis != null && !$this->xaxis->hide && !$this->xaxis->hide_labels) { // Minimum bottom margin if ($this->xaxis->title->t != '') { if ($this->img->a == 90) { - $btotrequired = $this->yaxis->title->GetTextHeight($this->img) + 7 ; + $btotrequired = $this->yaxis->title->GetTextHeight($this->img) + 5 ; } else { - $btotrequired = $this->xaxis->title->GetTextHeight($this->img) + 7 ; + $btotrequired = $this->xaxis->title->GetTextHeight($this->img) + 5 ; } } else { $btotrequired = 0; } - + if ($this->img->a == 90) { $this->img->SetFont( $this->yaxis->font_family, @@ -1723,51 +1537,265 @@ class Graph ); $lh = $this->img->GetTextHeight('Mg', $this->xaxis->label_angle); } - - $btotrequired += $lh + 6; + + $btotrequired += $lh + 5; } if ($this->img->a == 90) { // DO Nothing. It gets too messy to do this properly for 90 deg... } else { - // need more top margin if ($this->img->top_margin < $totrequired) { $this->SetMargin( - $this->img->raw_left_margin, - $this->img->raw_right_margin, - $totrequired / SUPERSAMPLING_SCALE, - $this->img->raw_bottom_margin + $this->img->left_margin, + $this->img->right_margin, + $totrequired, + $this->img->bottom_margin ); } - - // need more bottom margin if ($this->img->bottom_margin < $btotrequired) { $this->SetMargin( - $this->img->raw_left_margin, - $this->img->raw_right_margin, - $this->img->raw_top_margin, - $btotrequired / SUPERSAMPLING_SCALE + $this->img->left_margin, + $this->img->right_margin, + $this->img->top_margin, + $btotrequired ); } } } - public function StrokeStore($aStrokeFileName) + // Stroke the graph + // $aStrokeFileName If != "" the image will be written to this file and NOT + // streamed back to the browser + public function Stroke($aStrokeFileName="") { - // Get the handler to prevent the library from sending the - // image to the browser - $ih = $this->Stroke(_IMG_HANDLER); - // Stroke it to a file - $this->img->Stream($aStrokeFileName); + // Fist make a sanity check that user has specified a scale + if (empty($this->yscale)) { + JpGraphError::RaiseL(25031);//('You must specify what scale to use with a call to Graph::SetScale().'); + } - // Send it back to browser - $this->img->Headers(); - $this->img->Stream(); - } + // Start by adjusting the margin so that potential titles will fit. + $this->AdjustMarginsForTitles(); - public function doAutoscaleXAxis() - { + // Setup scale constants + if ($this->yscale) { + $this->yscale->InitConstants($this->img); + } + if ($this->xscale) { + $this->xscale->InitConstants($this->img); + } + if ($this->y2scale) { + $this->y2scale->InitConstants($this->img); + } + + $n=count($this->ynscale); + for ($i=0; $i < $n; ++$i) { + if ($this->ynscale[$i]) { + $this->ynscale[$i]->InitConstants($this->img); + } + } + + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); + + // We need to know if we have stroked the plot in the + // GetCSIMareas. Otherwise the CSIM hasn't been generated + // and in the case of GetCSIM called before stroke to generate + // CSIM without storing an image to disk GetCSIM must call Stroke. + $this->iHasStroked = true; + + // Do any pre-stroke adjustment that is needed by the different plot types + // (i.e bar plots want's to add an offset to the x-labels etc) + for ($i=0; $i < count($this->plots) ; ++$i) { + $this->plots[$i]->PreStrokeAdjust($this); + $this->plots[$i]->DoLegend($this); + } + + // Any plots on the second Y scale? + if ($this->y2scale != null) { + for ($i=0; $iy2plots) ; ++$i) { + $this->y2plots[$i]->PreStrokeAdjust($this); + $this->y2plots[$i]->DoLegend($this); + } + } + + // Any plots on the extra Y axises? + $n = count($this->ynaxis); + for ($i=0; $i<$n ; ++$i) { + if ($this->ynplots == null || $this->ynplots[$i] == null) { + JpGraphError::RaiseL(25032, $i);//("No plots for Y-axis nbr:$i"); + } + $m = count($this->ynplots[$i]); + for ($j=0; $j < $m; ++$j) { + $this->ynplots[$i][$j]->PreStrokeAdjust($this); + $this->ynplots[$i][$j]->DoLegend($this); + } + } + + // Bail out if any of the Y-axis not been specified and + // has no plots. (This means it is impossible to do autoscaling and + // no other scale was given so we can't possible draw anything). If you use manual + // scaling you also have to supply the tick steps as well. + if ((!$this->yscale->IsSpecified() && count($this->plots)==0) || + ($this->y2scale!=null && !$this->y2scale->IsSpecified() && count($this->y2plots)==0)) { + //$e = "n=".count($this->y2plots)."\n"; + // $e = "Can't draw unspecified Y-scale.
\nYou have either:
\n"; + // $e .= "1. Specified an Y axis for autoscaling but have not supplied any plots
\n"; + // $e .= "2. Specified a scale manually but have forgot to specify the tick steps"; + JpGraphError::RaiseL(25026); + } + + // Bail out if no plots and no specified X-scale + if ((!$this->xscale->IsSpecified() && count($this->plots)==0 && count($this->y2plots)==0)) { + JpGraphError::RaiseL(25034); + }//("JpGraph: Can't draw unspecified X-scale.
No plots.
"); + + //Check if we should autoscale y-axis + if (!$this->yscale->IsSpecified() && count($this->plots)>0) { + list($min, $max) = $this->GetPlotsYMinMax($this->plots); + $lres = $this->GetLinesYMinMax($this->lines); + if (is_array($lres)) { + list($linmin, $linmax) = $lres ; + $min = min($min, $linmin); + $max = max($max, $linmax); + } + $tres = $this->GetTextsYMinMax(); + if (is_array($tres)) { + list($tmin, $tmax) = $tres ; + $min = min($min, $tmin); + $max = max($max, $tmax); + } + $this->yscale->AutoScale( + $this->img, + $min, + $max, + $this->img->plotheight/$this->ytick_factor + ); + } elseif ($this->yscale->IsSpecified() && + ($this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified())) { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->yscale->scale[0]; + $max = $this->yscale->scale[1]; + $this->yscale->AutoScale( + $this->img, + $min, + $max, + $this->img->plotheight/$this->ytick_factor, + $this->yscale->auto_ticks + ); + + // Now make sure we show enough precision to accurate display the + // labels. If this is not done then the user might end up with + // a scale that might actually start with, say 13.5, butdue to rounding + // the scale label will ony show 14. + if (abs(floor($min)-$min) > 0) { + + // If the user has set a format then we bail out + if ($this->yscale->ticks->label_formatstr == '' && $this->yscale->ticks->label_dateformatstr == '') { + $this->yscale->ticks->precision = abs(floor(log10(abs(floor($min)-$min))))+1; + } + } + } + + if ($this->y2scale != null) { + if (!$this->y2scale->IsSpecified() && count($this->y2plots)>0) { + list($min, $max) = $this->GetPlotsYMinMax($this->y2plots); + + $lres = $this->GetLinesYMinMax($this->y2lines); + if (is_array($lres)) { + list($linmin, $linmax) = $lres ; + $min = min($min, $linmin); + $max = max($max, $linmax); + } + $tres = $this->GetTextsYMinMax(true); + if (is_array($tres)) { + list($tmin, $tmax) = $tres ; + $min = min($min, $tmin); + $max = max($max, $tmax); + } + $this->y2scale->AutoScale($this->img, $min, $max, $this->img->plotheight/$this->ytick_factor); + } elseif ($this->y2scale->IsSpecified() && + ($this->y2scale->auto_ticks || !$this->y2scale->ticks->IsSpecified())) { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->y2scale->scale[0]; + $max = $this->y2scale->scale[1]; + $this->y2scale->AutoScale( + $this->img, + $min, + $max, + $this->img->plotheight/$this->ytick_factor, + $this->y2scale->auto_ticks + ); + + // Now make sure we show enough precision to accurate display the + // labels. If this is not done then the user might end up with + // a scale that might actually start with, say 13.5, butdue to rounding + // the scale label will ony show 14. + if (abs(floor($min)-$min) > 0) { + + // If the user has set a format then we bail out + if ($this->y2scale->ticks->label_formatstr == '' && $this->y2scale->ticks->label_dateformatstr == '') { + $this->y2scale->ticks->precision = abs(floor(log10(abs(floor($min)-$min))))+1; + } + } + } + } + + // + // Autoscale the extra Y-axises + // + $n = count($this->ynaxis); + for ($i=0; $i < $n; ++$i) { + if ($this->ynscale[$i] != null) { + if (!$this->ynscale[$i]->IsSpecified() && count($this->ynplots[$i])>0) { + list($min, $max) = $this->GetPlotsYMinMax($this->ynplots[$i]); + $this->ynscale[$i]->AutoScale($this->img, $min, $max, $this->img->plotheight/$this->ytick_factor); + } elseif ($this->ynscale[$i]->IsSpecified() && + ($this->ynscale[$i]->auto_ticks || !$this->ynscale[$i]->ticks->IsSpecified())) { + // The tick calculation will use the user suplied min/max values to determine + // the ticks. If auto_ticks is false the exact user specifed min and max + // values will be used for the scale. + // If auto_ticks is true then the scale might be slightly adjusted + // so that the min and max values falls on an even major step. + $min = $this->ynscale[$i]->scale[0]; + $max = $this->ynscale[$i]->scale[1]; + $this->ynscale[$i]->AutoScale( + $this->img, + $min, + $max, + $this->img->plotheight/$this->ytick_factor, + $this->ynscale[$i]->auto_ticks + ); + + // Now make sure we show enough precision to accurate display the + // labels. If this is not done then the user might end up with + // a scale that might actually start with, say 13.5, butdue to rounding + // the scale label will ony show 14. + if (abs(floor($min)-$min) > 0) { + + // If the user has set a format then we bail out + if ($this->ynscale[$i]->ticks->label_formatstr == '' && $this->ynscale[$i]->ticks->label_dateformatstr == '') { + $this->ynscale[$i]->ticks->precision = abs(floor(log10(abs(floor($min)-$min))))+1; + } + } + } + } + } + //Check if we should autoscale x-axis if (!$this->xscale->IsSpecified()) { if (substr($this->axtype, 0, 4) == "text") { @@ -1783,7 +1811,8 @@ class Graph // to the right in oder to align with the center of the bars. if (class_exists('BarPlot', false)) { $cl = strtolower(get_class($p)); - if ((class_exists('BarPlot', false) && ($p instanceof BarPlot)) || empty($p->barcenter)) { + if ((class_exists('BarPlot', false) && ($p instanceof BarPlot)) || + empty($p->barcenter)) { $max=max($max, $p->numpoints-1); } else { $max=max($max, $p->numpoints); @@ -1810,7 +1839,7 @@ class Graph } } } - + $this->xscale->Update($this->img, $min, $max); $this->xscale->ticks->Set($this->xaxis->tick_step, 1); $this->xscale->ticks->SupressMinorTickMarks(); @@ -1847,13 +1876,30 @@ class Graph $this->xscale->AutoScale($this->img, $min, $max, round($this->img->plotwidth/$this->xtick_factor)); } - + //Adjust position of y-axis and y2-axis to minimum/maximum of x-scale if (!is_numeric($this->yaxis->pos) && !is_string($this->yaxis->pos)) { $this->yaxis->SetPos($this->xscale->GetMinVal()); } + if ($this->y2axis != null) { + if (!is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos)) { + $this->y2axis->SetPos($this->xscale->GetMaxVal()); + } + $this->y2axis->SetTitleSide(SIDE_RIGHT); + } + $n = count($this->ynaxis); + $nY2adj = $this->y2axis != null ? $this->iYAxisDeltaPos : 0; + for ($i=0; $i < $n; ++$i) { + if ($this->ynaxis[$i] != null) { + if (!is_numeric($this->ynaxis[$i]->pos) && !is_string($this->ynaxis[$i]->pos)) { + $this->ynaxis[$i]->SetPos($this->xscale->GetMaxVal()); + $this->ynaxis[$i]->SetPosAbsDelta($i*$this->iYAxisDeltaPos + $nY2adj); + } + $this->ynaxis[$i]->SetTitleSide(SIDE_RIGHT); + } + } } elseif ($this->xscale->IsSpecified() && - ($this->xscale->auto_ticks || !$this->xscale->ticks->IsSpecified())) { + ($this->xscale->auto_ticks || !$this->xscale->ticks->IsSpecified())) { // The tick calculation will use the user suplied min/max values to determine // the ticks. If auto_ticks is false the exact user specifed min and max // values will be used for the scale. @@ -1861,341 +1907,35 @@ class Graph // so that the min and max values falls on an even major step. $min = $this->xscale->scale[0]; $max = $this->xscale->scale[1]; - $this->xscale->AutoScale($this->img, $min, $max, round($this->img->plotwidth/$this->xtick_factor), false); + $this->xscale->AutoScale( + $this->img, + $min, + $max, + round($this->img->plotwidth/$this->xtick_factor), + false + ); // Now make sure we show enough precision to accurate display the // labels. If this is not done then the user might end up with // a scale that might actually start with, say 13.5, butdue to rounding // the scale label will ony show 14. if (abs(floor($min)-$min) > 0) { - - // If the user has set a format then we bail out + + // If the user has set a format then we bail out if ($this->xscale->ticks->label_formatstr == '' && $this->xscale->ticks->label_dateformatstr == '') { $this->xscale->ticks->precision = abs(floor(log10(abs(floor($min)-$min))))+1; } } - } - // Position the optional Y2 and Yn axis to the rightmost position of the x-axis - if ($this->y2axis != null) { - if (!is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos)) { - $this->y2axis->SetPos($this->xscale->GetMaxVal()); - } - $this->y2axis->SetTitleSide(SIDE_RIGHT); - } - $n = count($this->ynaxis); - $nY2adj = $this->y2axis != null ? $this->iYAxisDeltaPos : 0; - for ($i=0; $i < $n; ++$i) { - if ($this->ynaxis[$i] != null) { - if (!is_numeric($this->ynaxis[$i]->pos) && !is_string($this->ynaxis[$i]->pos)) { - $this->ynaxis[$i]->SetPos($this->xscale->GetMaxVal()); - $this->ynaxis[$i]->SetPosAbsDelta($i*$this->iYAxisDeltaPos + $nY2adj); + if ($this->y2axis != null) { + if (!is_numeric($this->y2axis->pos) && !is_string($this->y2axis->pos)) { + $this->y2axis->SetPos($this->xscale->GetMaxVal()); } - $this->ynaxis[$i]->SetTitleSide(SIDE_RIGHT); + $this->y2axis->SetTitleSide(SIDE_RIGHT); } } - } - - - public function doAutoScaleYnAxis() - { - if ($this->y2scale != null) { - if (!$this->y2scale->IsSpecified() && count($this->y2plots)>0) { - list($min, $max) = $this->GetPlotsYMinMax($this->y2plots); - - $lres = $this->GetLinesYMinMax($this->y2lines); - if (is_array($lres)) { - list($linmin, $linmax) = $lres ; - $min = min($min, $linmin); - $max = max($max, $linmax); - } - $tres = $this->GetTextsYMinMax(true); - if (is_array($tres)) { - list($tmin, $tmax) = $tres ; - $min = min($min, $tmin); - $max = max($max, $tmax); - } - $this->y2scale->AutoScale($this->img, $min, $max, $this->img->plotheight/$this->ytick_factor); - } elseif ($this->y2scale->IsSpecified() && ($this->y2scale->auto_ticks || !$this->y2scale->ticks->IsSpecified())) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->y2scale->scale[0]; - $max = $this->y2scale->scale[1]; - $this->y2scale->AutoScale( - $this->img, - $min, - $max, - $this->img->plotheight/$this->ytick_factor, - $this->y2scale->auto_ticks - ); - - // Now make sure we show enough precision to accurate display the - // labels. If this is not done then the user might end up with - // a scale that might actually start with, say 13.5, butdue to rounding - // the scale label will ony show 14. - if (abs(floor($min)-$min) > 0) { - // If the user has set a format then we bail out - if ($this->y2scale->ticks->label_formatstr == '' && $this->y2scale->ticks->label_dateformatstr == '') { - $this->y2scale->ticks->precision = abs(floor(log10(abs(floor($min)-$min))))+1; - } - } - } - } - - - // - // Autoscale the extra Y-axises - // - $n = count($this->ynaxis); - for ($i=0; $i < $n; ++$i) { - if ($this->ynscale[$i] != null) { - if (!$this->ynscale[$i]->IsSpecified() && count($this->ynplots[$i])>0) { - list($min, $max) = $this->GetPlotsYMinMax($this->ynplots[$i]); - $this->ynscale[$i]->AutoScale($this->img, $min, $max, $this->img->plotheight/$this->ytick_factor); - } elseif ($this->ynscale[$i]->IsSpecified() && ($this->ynscale[$i]->auto_ticks || !$this->ynscale[$i]->ticks->IsSpecified())) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->ynscale[$i]->scale[0]; - $max = $this->ynscale[$i]->scale[1]; - $this->ynscale[$i]->AutoScale( - $this->img, - $min, - $max, - $this->img->plotheight/$this->ytick_factor, - $this->ynscale[$i]->auto_ticks - ); - - // Now make sure we show enough precision to accurate display the - // labels. If this is not done then the user might end up with - // a scale that might actually start with, say 13.5, butdue to rounding - // the scale label will ony show 14. - if (abs(floor($min)-$min) > 0) { - // If the user has set a format then we bail out - if ($this->ynscale[$i]->ticks->label_formatstr == '' && $this->ynscale[$i]->ticks->label_dateformatstr == '') { - $this->ynscale[$i]->ticks->precision = abs(floor(log10(abs(floor($min)-$min))))+1; - } - } - } - } - } - } - - public function doAutoScaleYAxis() - { - - //Check if we should autoscale y-axis - if (!$this->yscale->IsSpecified() && count($this->plots)>0) { - list($min, $max) = $this->GetPlotsYMinMax($this->plots); - $lres = $this->GetLinesYMinMax($this->lines); - if (is_array($lres)) { - list($linmin, $linmax) = $lres ; - $min = min($min, $linmin); - $max = max($max, $linmax); - } - $tres = $this->GetTextsYMinMax(); - if (is_array($tres)) { - list($tmin, $tmax) = $tres ; - $min = min($min, $tmin); - $max = max($max, $tmax); - } - $this->yscale->AutoScale( - $this->img, - $min, - $max, - $this->img->plotheight/$this->ytick_factor - ); - } elseif ($this->yscale->IsSpecified() && ($this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified())) { - // The tick calculation will use the user suplied min/max values to determine - // the ticks. If auto_ticks is false the exact user specifed min and max - // values will be used for the scale. - // If auto_ticks is true then the scale might be slightly adjusted - // so that the min and max values falls on an even major step. - $min = $this->yscale->scale[0]; - $max = $this->yscale->scale[1]; - $this->yscale->AutoScale( - $this->img, - $min, - $max, - $this->img->plotheight/$this->ytick_factor, - $this->yscale->auto_ticks - ); - - // Now make sure we show enough precision to accurate display the - // labels. If this is not done then the user might end up with - // a scale that might actually start with, say 13.5, butdue to rounding - // the scale label will ony show 14. - if (abs(floor($min)-$min) > 0) { - - // If the user has set a format then we bail out - if ($this->yscale->ticks->label_formatstr == '' && $this->yscale->ticks->label_dateformatstr == '') { - $this->yscale->ticks->precision = abs(floor(log10(abs(floor($min)-$min))))+1; - } - } - } - } - - public function InitScaleConstants() - { - // Setup scale constants - if ($this->yscale) { - $this->yscale->InitConstants($this->img); - } - if ($this->xscale) { - $this->xscale->InitConstants($this->img); - } - if ($this->y2scale) { - $this->y2scale->InitConstants($this->img); - } - - $n=count($this->ynscale); - for ($i=0; $i < $n; ++$i) { - if ($this->ynscale[$i]) { - $this->ynscale[$i]->InitConstants($this->img); - } - } - } - - public function doPrestrokeAdjustments() - { - - // Do any pre-stroke adjustment that is needed by the different plot types - // (i.e bar plots want's to add an offset to the x-labels etc) - for ($i=0; $i < count($this->plots) ; ++$i) { - $this->plots[$i]->PreStrokeAdjust($this); - $this->plots[$i]->DoLegend($this); - } - - // Any plots on the second Y scale? - if ($this->y2scale != null) { - for ($i=0; $iy2plots) ; ++$i) { - $this->y2plots[$i]->PreStrokeAdjust($this); - $this->y2plots[$i]->DoLegend($this); - } - } - - // Any plots on the extra Y axises? - $n = count($this->ynaxis); - for ($i=0; $i<$n ; ++$i) { - if ($this->ynplots == null || $this->ynplots[$i] == null) { - JpGraphError::RaiseL(25032, $i);//("No plots for Y-axis nbr:$i"); - } - $m = count($this->ynplots[$i]); - for ($j=0; $j < $m; ++$j) { - $this->ynplots[$i][$j]->PreStrokeAdjust($this); - $this->ynplots[$i][$j]->DoLegend($this); - } - } - } - - public function StrokeBands($aDepth, $aCSIM) - { - // Stroke bands - if ($this->bands != null && !$aCSIM) { - for ($i=0; $i < count($this->bands); ++$i) { - // Stroke all bands that asks to be in the background - if ($this->bands[$i]->depth == $aDepth) { - $this->bands[$i]->Stroke($this->img, $this->xscale, $this->yscale); - } - } - } - - if ($this->y2bands != null && $this->y2scale != null && !$aCSIM) { - for ($i=0; $i < count($this->y2bands); ++$i) { - // Stroke all bands that asks to be in the foreground - if ($this->y2bands[$i]->depth == $aDepth) { - $this->y2bands[$i]->Stroke($this->img, $this->xscale, $this->y2scale); - } - } - } - } - - - // Stroke the graph - // $aStrokeFileName If != "" the image will be written to this file and NOT - // streamed back to the browser - public function Stroke($aStrokeFileName='') - { - // Fist make a sanity check that user has specified a scale - if (empty($this->yscale)) { - JpGraphError::RaiseL(25031);//('You must specify what scale to use with a call to Graph::SetScale().'); - } - - // Start by adjusting the margin so that potential titles will fit. - $this->AdjustMarginsForTitles(); - - // Give the plot a chance to do any scale adjuments the individual plots - // wants to do. Right now this is only used by the contour plot to set scale - // limits - for ($i=0; $i < count($this->plots) ; ++$i) { - $this->plots[$i]->PreScaleSetup($this); - } - - // Init scale constants that are used to calculate the transformation from - // world to pixel coordinates - $this->InitScaleConstants(); - - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // a best we can. Therefor you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - - // If we are called the second time (perhaps the user has called GetHTMLImageMap() - // himself then the legends have alsready been populated once in order to get the - // CSIM coordinats. Since we do not want the legends to be populated a second time - // we clear the legends - $this->legend->Clear(); - - // We need to know if we have stroked the plot in the - // GetCSIMareas. Otherwise the CSIM hasn't been generated - // and in the case of GetCSIM called before stroke to generate - // CSIM without storing an image to disk GetCSIM must call Stroke. - $this->iHasStroked = true; - - // Setup pre-stroked adjustments and Legends - $this->doPrestrokeAdjustments(); - - if ($this->graph_theme) { - $this->graph_theme->PreStrokeApply($this); - } - - // Bail out if any of the Y-axis not been specified and - // has no plots. (This means it is impossible to do autoscaling and - // no other scale was given so we can't possible draw anything). If you use manual - // scaling you also have to supply the tick steps as well. - if ((!$this->yscale->IsSpecified() && count($this->plots)==0) || - ($this->y2scale!=null && !$this->y2scale->IsSpecified() && count($this->y2plots)==0)) { - //$e = "n=".count($this->y2plots)."\n"; - // $e = "Can't draw unspecified Y-scale.
\nYou have either:
\n"; - // $e .= "1. Specified an Y axis for autoscaling but have not supplied any plots
\n"; - // $e .= "2. Specified a scale manually but have forgot to specify the tick steps"; - JpGraphError::RaiseL(25026); - } - - // Bail out if no plots and no specified X-scale - if ((!$this->xscale->IsSpecified() && count($this->plots)==0 && count($this->y2plots)==0)) { - JpGraphError::RaiseL(25034);//("JpGraph: Can't draw unspecified X-scale.
No plots.
"); - } - - // Autoscale the normal Y-axis - $this->doAutoScaleYAxis(); - - // Autoscale all additiopnal y-axis - $this->doAutoScaleYnAxis(); - - // Autoscale the regular x-axis and position the y-axis properly - $this->doAutoScaleXAxis(); - + // If we have a negative values and x-axis position is at 0 // we need to supress the first and possible the last tick since // they will be drawn on top of the y-axis (and possible y2 axis) @@ -2206,11 +1946,13 @@ class Graph // For X-text scale we ignore all this since the tick are usually // much further in and not close to the Y-axis. Hence the test // for 'text' - if (($this->yaxis->pos==$this->xscale->GetMinVal() || (is_string($this->yaxis->pos) && $this->yaxis->pos=='min')) && - !is_numeric($this->xaxis->pos) && $this->yscale->GetMinVal() < 0 && - substr($this->axtype, 0, 4) != 'text' && $this->xaxis->pos != 'min') { - //$this->yscale->ticks->SupressZeroLabel(false); + if (($this->yaxis->pos==$this->xscale->GetMinVal() || + (is_string($this->yaxis->pos) && $this->yaxis->pos=='min')) && + !is_numeric($this->xaxis->pos) && $this->yscale->GetMinVal() < 0 && + substr($this->axtype, 0, 4) != 'text' && $this->xaxis->pos!="min") { + + //$this->yscale->ticks->SupressZeroLabel(false); $this->xscale->ticks->SupressFirst(); if ($this->y2axis != null) { $this->xscale->ticks->SupressLast(); @@ -2218,6 +1960,7 @@ class Graph } elseif (!is_numeric($this->yaxis->pos) && $this->yaxis->pos=='max') { $this->xscale->ticks->SupressLast(); } + if (!$_csim) { $this->StrokePlotArea(); @@ -2227,14 +1970,31 @@ class Graph } $this->StrokeAxis(false); - // Stroke colored bands - $this->StrokeBands(DEPTH_BACK, $_csim); + // Stroke bands + if ($this->bands != null && !$_csim) { + for ($i=0; $i < count($this->bands); ++$i) { + // Stroke all bands that asks to be in the background + if ($this->bands[$i]->depth == DEPTH_BACK) { + $this->bands[$i]->Stroke($this->img, $this->xscale, $this->yscale); + } + } + } + + if ($this->y2bands != null && $this->y2scale != null && !$_csim) { + for ($i=0; $i < count($this->y2bands); ++$i) { + // Stroke all bands that asks to be in the foreground + if ($this->y2bands[$i]->depth == DEPTH_BACK) { + $this->y2bands[$i]->Stroke($this->img, $this->xscale, $this->y2scale); + } + } + } + if ($this->grid_depth == DEPTH_BACK && !$_csim) { $this->ygrid->Stroke(); $this->xgrid->Stroke(); } - + // Stroke Y2-axis if ($this->y2axis != null && !$_csim) { $this->y2axis->Stroke($this->xscale); @@ -2248,7 +2008,7 @@ class Graph } $oldoff=$this->xscale->off; - if (substr($this->axtype, 0, 4) == 'text') { + if (substr($this->axtype, 0, 4)=="text") { if ($this->text_scale_abscenteroff > -1) { // For a text scale the scale factor is the number of pixel per step. // Hence we can use the scale factor as a substitute for number of pixels @@ -2256,7 +2016,8 @@ class Graph // an object of width "abscenteroff" becomes centered. $this->xscale->off += round($this->xscale->scale_factor/2)-round($this->text_scale_abscenteroff/2); } else { - $this->xscale->off += ceil($this->xscale->scale_factor*$this->text_scale_off*$this->xscale->ticks->minor_step); + $this->xscale->off += + ceil($this->xscale->scale_factor*$this->text_scale_off*$this->xscale->ticks->minor_step); } } @@ -2299,7 +2060,7 @@ class Graph if ($this->iIconDepth == DEPTH_FRONT) { $this->StrokeIcons(); } - + if ($this->iDoClipping) { // Clipping only supports graphs at 0 and 90 degrees if ($this->img->a == 0) { @@ -2333,14 +2094,46 @@ class Graph } $this->xscale->off=$oldoff; - + if ($this->grid_depth == DEPTH_FRONT && !$_csim) { $this->ygrid->Stroke(); $this->xgrid->Stroke(); } - // Stroke colored bands - $this->StrokeBands(DEPTH_FRONT, $_csim); + // Stroke bands + if ($this->bands!= null) { + for ($i=0; $i < count($this->bands); ++$i) { + // Stroke all bands that asks to be in the foreground + if ($this->bands[$i]->depth == DEPTH_FRONT) { + $this->bands[$i]->Stroke($this->img, $this->xscale, $this->yscale); + } + } + } + + if ($this->y2bands!= null && $this->y2scale != null) { + for ($i=0; $i < count($this->y2bands); ++$i) { + // Stroke all bands that asks to be in the foreground + if ($this->y2bands[$i]->depth == DEPTH_FRONT) { + $this->y2bands[$i]->Stroke($this->img, $this->xscale, $this->y2scale); + } + } + } + + + // Stroke any lines added + if ($this->lines != null) { + for ($i=0; $i < count($this->lines); ++$i) { + $this->lines[$i]->Stroke($this->img, $this->xscale, $this->yscale); + $this->lines[$i]->DoLegend($this); + } + } + + if ($this->y2lines != null && $this->y2scale != null) { + for ($i=0; $i < count($this->y2lines); ++$i) { + $this->y2lines[$i]->Stroke($this->img, $this->xscale, $this->y2scale); + $this->y2lines[$i]->DoLegend($this); + } + } // Finally draw the axis again since some plots may have nagged // the axis in the edges. @@ -2351,11 +2144,11 @@ class Graph if ($this->y2scale != null && !$_csim) { $this->y2axis->Stroke($this->xscale, false); } - + if (!$_csim) { $this->StrokePlotBox(); } - + // The titles and legends never gets rotated so make sure // that the angle is 0 before stroking them $aa = $this->img->SetAngle(0); @@ -2368,19 +2161,19 @@ class Graph if (!$_csim) { $this->img->SetAngle($aa); - + // Draw an outline around the image map if (_JPG_DEBUG) { $this->DisplayClientSideaImageMapAreas(); } - + // Should we do any final image transformation if ($this->iImgTrans) { if (!class_exists('ImgTrans', false)) { require_once('jpgraph_imgtrans.php'); //JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.'); } - + $tform = new ImgTrans($this->img->img); $this->img->img = $tform->Skew3D( $this->iImgTransHorizon, @@ -2414,6 +2207,9 @@ class Graph $this->iYAxisLblBgColor = $aYColor; } + //--------------- + // PRIVATE METHODS + public function StrokeAxisLabelBackground() { // Types @@ -2424,12 +2220,11 @@ class Graph // 4 = As 2 but extends to height of graph // 5 = Combination of 3 & 4 // 6 = Combination of 1 & 2 - + $t = $this->iAxisLblBgType ; if ($t < 1) { return; } - // Stroke optional X-axis label background color if ($t == 1 || $t == 3 || $t == 5 || $t == 6) { $this->img->PushColor($this->iXAxisLblBgFillColor); @@ -2450,8 +2245,6 @@ class Graph // Check if we should add the vertical lines at left and right edge if ($this->iXAxisLblBgColor !== '') { - // Hardcode to one pixel wide - $this->img->SetLineWeight(1); $this->img->PushColor($this->iXAxisLblBgColor); if ($t == 1 || $t == 6) { $this->img->Line($xl, $yu, $xl, $yl); @@ -2504,35 +2297,35 @@ class Graph // Stroke axis if ($this->iAxisStyle != AXSTYLE_SIMPLE) { switch ($this->iAxisStyle) { - case AXSTYLE_BOXIN: - $toppos = SIDE_DOWN; - $bottompos = SIDE_UP; - $leftpos = SIDE_RIGHT; - $rightpos = SIDE_LEFT; - break; - case AXSTYLE_BOXOUT: - $toppos = SIDE_UP; - $bottompos = SIDE_DOWN; - $leftpos = SIDE_LEFT; - $rightpos = SIDE_RIGHT; - break; - case AXSTYLE_YBOXIN: - $toppos = false; - $bottompos = SIDE_UP; - $leftpos = SIDE_RIGHT; - $rightpos = SIDE_LEFT; - break; - case AXSTYLE_YBOXOUT: - $toppos = false; - $bottompos = SIDE_DOWN; - $leftpos = SIDE_LEFT; - $rightpos = SIDE_RIGHT; - break; - default: - JpGRaphError::RaiseL(25036, $this->iAxisStyle); //('Unknown AxisStyle() : '.$this->iAxisStyle); - break; - } - + case AXSTYLE_BOXIN: + $toppos = SIDE_DOWN; + $bottompos = SIDE_UP; + $leftpos = SIDE_RIGHT; + $rightpos = SIDE_LEFT; + break; + case AXSTYLE_BOXOUT: + $toppos = SIDE_UP; + $bottompos = SIDE_DOWN; + $leftpos = SIDE_LEFT; + $rightpos = SIDE_RIGHT; + break; + case AXSTYLE_YBOXIN: + $toppos = false; + $bottompos = SIDE_UP; + $leftpos = SIDE_RIGHT; + $rightpos = SIDE_LEFT; + break; + case AXSTYLE_YBOXOUT: + $toppos = false; + $bottompos = SIDE_DOWN; + $leftpos = SIDE_LEFT; + $rightpos = SIDE_RIGHT; + break; + default: + JpGRaphError::RaiseL(25036, $this->iAxisStyle); //('Unknown AxisStyle() : '.$this->iAxisStyle); + break; + } + // By default we hide the first label so it doesn't cross the // Y-axis in case the positon hasn't been set by the user. // However, if we use a box we always want the first value @@ -2594,10 +2387,10 @@ class Graph if ($ext == "jpeg") { $ext = "jpg"; } - + if (trim($ext) == '') { - $ext = 'png'; // Assume PNG if no extension specified - } + $ext = 'png'; + } // Assume PNG if no extension specified if ($aImgFormat == '') { $imgtag = $ext; @@ -2607,10 +2400,10 @@ class Graph $supported = imagetypes(); if (($ext == 'jpg' && !($supported & IMG_JPG)) || - ($ext == 'gif' && !($supported & IMG_GIF)) || - ($ext == 'png' && !($supported & IMG_PNG)) || - ($ext == 'bmp' && !($supported & IMG_WBMP)) || - ($ext == 'xpm' && !($supported & IMG_XPM))) { + ($ext == 'gif' && !($supported & IMG_GIF)) || + ($ext == 'png' && !($supported & IMG_PNG)) || + ($ext == 'bmp' && !($supported & IMG_WBMP)) || + ($ext == 'xpm' && !($supported & IMG_XPM))) { JpGraphError::RaiseL(25037, $aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. '); } @@ -2635,26 +2428,11 @@ class Graph return $img; } - public function StrokePlotGrad() - { - if ($this->plot_gradtype < 0) { - return; - } - - $grad = new Gradient($this->img); - $xl = $this->img->left_margin; - $yt = $this->img->top_margin; - $xr = $xl + $this->img->plotwidth+1 ; - $yb = $yt + $this->img->plotheight ; - $grad->FilledRectangle($xl, $yt, $xr, $yb, $this->plot_gradfrom, $this->plot_gradto, $this->plot_gradtype); - } - public function StrokeBackgroundGrad() { if ($this->bkg_gradtype < 0) { return; } - $grad = new Gradient($this->img); if ($this->bkg_gradstyle == BGRAD_PLOT) { $xl = $this->img->left_margin; @@ -2666,7 +2444,7 @@ class Graph $xl = 0; $yt = 0; $xr = $xl + $this->img->width - 1; - $yb = $yt + $this->img->height - 1 ; + $yb = $yt + $this->img->height ; if ($this->doshadow) { $xr -= $this->shadow_width; $yb -= $this->shadow_width; @@ -2685,12 +2463,12 @@ class Graph public function StrokeFrameBackground() { - if ($this->background_image != '' && $this->background_cflag != '') { + if ($this->background_image != "" && $this->background_cflag != "") { JpGraphError::RaiseL(25040);//('It is not possible to specify both a background image and a background country flag.'); } - if ($this->background_image != '') { + if ($this->background_image != "") { $bkgimg = $this->LoadBkgImage($this->background_image_format, $this->background_image); - } elseif ($this->background_cflag != '') { + } elseif ($this->background_cflag != "") { if (! class_exists('FlagImages', false)) { JpGraphError::RaiseL(25041);//('In order to use Country flags as backgrounds you must include the "jpgraph_flags.php" file.'); } @@ -2709,121 +2487,106 @@ class Graph // No matter what the angle is we always stroke the image and frame // assuming it is 0 degree $aa = $this->img->SetAngle(0); - + switch ($this->background_image_type) { - case BGIMG_FILLPLOT: // Resize to just fill the plotarea - $this->FillMarginArea(); - $this->StrokeFrame(); - // Special case to hande 90 degree rotated graph corectly - if ($aa == 90) { - $this->img->SetAngle(90); - $this->FillPlotArea(); - $aa = $this->img->SetAngle(0); - $adj = ($this->img->height - $this->img->width)/2; - $this->img->CopyMerge( - $bkgimg, - $this->img->bottom_margin-$adj, - $this->img->left_margin+$adj, - 0, - 0, - $this->img->plotheight+1, - $this->img->plotwidth, - $bw, - $bh, - $this->background_image_mix - ); - } else { - $this->FillPlotArea(); - $this->img->CopyMerge( - $bkgimg, - $this->img->left_margin, - $this->img->top_margin+1, - 0, - 0, - $this->img->plotwidth+1, - $this->img->plotheight, - $bw, - $bh, - $this->background_image_mix - ); - } - break; - case BGIMG_FILLFRAME: // Fill the whole area from upper left corner, resize to just fit - $hadj=0; $vadj=0; - if ($this->doshadow) { - $hadj = $this->shadow_width; - $vadj = $this->shadow_width; - } - $this->FillMarginArea(); - $this->FillPlotArea(); - $this->img->CopyMerge( - $bkgimg, - 0, - 0, - 0, - 0, - $this->img->width-$hadj, - $this->img->height-$vadj, - $bw, - $bh, - $this->background_image_mix - ); - $this->StrokeFrame(); - break; - case BGIMG_COPY: // Just copy the image from left corner, no resizing - $this->FillMarginArea(); - $this->FillPlotArea(); - $this->img->CopyMerge( - $bkgimg, - 0, - 0, - 0, - 0, - $bw, - $bh, - $bw, - $bh, - $this->background_image_mix - ); - $this->StrokeFrame(); - break; - case BGIMG_CENTER: // Center original image in the plot area - $this->FillMarginArea(); - $this->FillPlotArea(); - $centerx = round($this->img->plotwidth/2+$this->img->left_margin-$bw/2); - $centery = round($this->img->plotheight/2+$this->img->top_margin-$bh/2); - $this->img->CopyMerge( - $bkgimg, - $centerx, - $centery, - 0, - 0, - $bw, - $bh, - $bw, - $bh, - $this->background_image_mix - ); - $this->StrokeFrame(); - break; - case BGIMG_FREE: // Just copy the image to the specified location - $this->img->CopyMerge( - $bkgimg, - $this->background_image_xpos, - $this->background_image_ypos, - 0, - 0, - $bw, - $bh, - $bw, - $bh, - $this->background_image_mix - ); - $this->StrokeFrame(); // New - break; - default: - JpGraphError::RaiseL(25042);//(" Unknown background image layout"); + case BGIMG_FILLPLOT: // Resize to just fill the plotarea + $this->FillMarginArea(); + $this->StrokeFrame(); + // Special case to hande 90 degree rotated graph corectly + if ($aa == 90) { + $this->img->SetAngle(90); + $this->FillPlotArea(); + $aa = $this->img->SetAngle(0); + $adj = ($this->img->height - $this->img->width)/2; + $this->img->CopyMerge( + $bkgimg, + $this->img->bottom_margin-$adj, + $this->img->left_margin+$adj, + 0, + 0, + $this->img->plotheight+1, + $this->img->plotwidth, + $bw, + $bh, + $this->background_image_mix + ); + } else { + $this->FillPlotArea(); + $this->img->CopyMerge( + $bkgimg, + $this->img->left_margin, + $this->img->top_margin, + 0, + 0, + $this->img->plotwidth+1, + $this->img->plotheight, + $bw, + $bh, + $this->background_image_mix + ); } + break; + case BGIMG_FILLFRAME: // Fill the whole area from upper left corner, resize to just fit + $hadj=0; $vadj=0; + if ($this->doshadow) { + $hadj = $this->shadow_width; + $vadj = $this->shadow_width; + } + $this->FillMarginArea(); + $this->FillPlotArea(); + $this->img->CopyMerge( + $bkgimg, + 0, + 0, + 0, + 0, + $this->img->width-$hadj, + $this->img->height-$vadj, + $bw, + $bh, + $this->background_image_mix + ); + $this->StrokeFrame(); + break; + case BGIMG_COPY: // Just copy the image from left corner, no resizing + $this->FillMarginArea(); + $this->FillPlotArea(); + $this->img->CopyMerge( + $bkgimg, + 0, + 0, + 0, + 0, + $bw, + $bh, + $bw, + $bh, + $this->background_image_mix + ); + $this->StrokeFrame(); + break; + case BGIMG_CENTER: // Center original image in the plot area + $this->FillMarginArea(); + $this->FillPlotArea(); + $centerx = round($this->img->plotwidth/2+$this->img->left_margin-$bw/2); + $centery = round($this->img->plotheight/2+$this->img->top_margin-$bh/2); + $this->img->CopyMerge( + $bkgimg, + $centerx, + $centery, + 0, + 0, + $bw, + $bh, + $bw, + $bh, + $this->background_image_mix + ); + $this->StrokeFrame(); + break; + default: + JpGraphError::RaiseL(25042);//(" Unknown background image layout"); + } $this->img->SetAngle($aa); } @@ -2835,12 +2598,13 @@ class Graph return; } - if ($this->background_image_type <= 1 && ($this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_PLOT))) { + if ($this->background_image_type <= 1 && + ($this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_PLOT))) { $c = $this->margin_color; } else { $c = false; } - + if ($this->doshadow) { $this->img->SetColor($this->frame_color); $this->img->ShadowRectangle( @@ -2891,7 +2655,7 @@ class Graph } $this->img->SetColor($this->margin_color); - $this->img->FilledRectangle(0, 0, $this->img->width-1-$hadj, $this->img->height-1-$vadj); + // $this->img->FilledRectangle(0,0,$this->img->width-1-$hadj,$this->img->height-1-$vadj); $this->img->FilledRectangle(0, 0, $this->img->width-1-$hadj, $this->img->top_margin); $this->img->FilledRectangle(0, $this->img->top_margin, $this->img->left_margin, $this->img->height-1-$hadj); @@ -2920,32 +2684,32 @@ class Graph ); $this->img->PopColor(); } - + // Stroke the plot area with either a solid color or a background image public function StrokePlotArea() { // Note: To be consistent we really should take a possible shadow - // into account. However, that causes some problem for the LinearScale class - // since in the current design it does not have any links to class Graph which - // means it has no way of compensating for the adjusted plotarea in case of a - // shadow. So, until I redesign LinearScale we can't compensate for this. - // So just set the two adjustment parameters to zero for now. - $boxadj = 0; //$this->doframe ? $this->frame_weight : 0 ; - $adj = 0; //$this->doshadow ? $this->shadow_width : 0 ; + // into account. However, that causes some problem for the LinearScale class + // since in the current design it does not have any links to class Graph which + // means it has no way of compensating for the adjusted plotarea in case of a + // shadow. So, until I redesign LinearScale we can't compensate for this. + // So just set the two adjustment parameters to zero for now. + $boxadj = 0; //$this->doframe ? $this->frame_weight : 0 ; + $adj = 0; //$this->doshadow ? $this->shadow_width : 0 ; - if ($this->background_image != '' || $this->background_cflag != '') { - $this->StrokeFrameBackground(); - } else { - $aa = $this->img->SetAngle(0); - $this->StrokeFrame(); - $aa = $this->img->SetAngle($aa); - $this->StrokeBackgroundGrad(); - if ($this->bkg_gradtype < 0 || ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_MARGIN)) { - $this->FillPlotArea(); - } - $this->StrokePlotGrad(); + if ($this->background_image != "" || $this->background_cflag != "") { + $this->StrokeFrameBackground(); + } else { + $aa = $this->img->SetAngle(0); + $this->StrokeFrame(); + $aa = $this->img->SetAngle($aa); + $this->StrokeBackgroundGrad(); + if ($this->bkg_gradtype < 0 || + ($this->bkg_gradtype > 0 && $this->bkg_gradstyle==BGRAD_MARGIN)) { + $this->FillPlotArea(); } } + } public function StrokeIcons() { @@ -2954,7 +2718,7 @@ class Graph $this->iIcons[$i]->StrokeWithScale($this->img, $this->xscale, $this->yscale); } } - + public function StrokePlotBox() { // Should we draw a box around the plot area? @@ -2997,17 +2761,18 @@ class Graph $margin=3; if ($this->titlebackground) { - // Find out height + + // Find out height $this->title->margin += 2 ; $h = $this->title->GetTextHeight($this->img)+$this->title->margin+$margin; - if ($this->subtitle->t != '' && !$this->subtitle->hide) { + if ($this->subtitle->t != "" && !$this->subtitle->hide) { $h += $this->subtitle->GetTextHeight($this->img)+$margin+ - $this->subtitle->margin; + $this->subtitle->margin; $h += 2; } - if ($this->subsubtitle->t != '' && !$this->subsubtitle->hide) { + if ($this->subsubtitle->t != "" && !$this->subsubtitle->hide) { $h += $this->subsubtitle->GetTextHeight($this->img)+$margin+ - $this->subsubtitle->margin; + $this->subsubtitle->margin; $h += 2; } $this->img->PushColor($this->titlebackground_color); @@ -3021,7 +2786,7 @@ class Graph $h += 2; } else { $x1 = $y1 = $this->frame_weight; - $x2 = $this->img->width - $this->frame_weight-1; + $x2 = $this->img->width - 2*$x1; } } elseif ($this->titlebackground_style === TITLEBKG_STYLE2) { // Cover the frame as well @@ -3047,27 +2812,27 @@ class Graph if ($this->doshadow) { $x2 -= $this->shadow_width ; } - + $indent=0; if ($this->titlebackground_framestyle == TITLEBKG_FRAME_BEVEL) { - $indent = $this->titlebackground_bevelheight; + $ind = $this->titlebackground_bevelheight; } if ($this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_HSTRIPED) { $this->img->FilledRectangle2( - $x1+$indent, - $y1+$indent, - $x2-$indent, - $h-$indent, + $x1+$ind, + $y1+$ind, + $x2-$ind, + $h-$ind, $this->titlebkg_scolor1, $this->titlebkg_scolor2 ); } elseif ($this->titlebkg_fillstyle==TITLEBKG_FILLSTYLE_VSTRIPED) { $this->img->FilledRectangle2( - $x1+$indent, - $y1+$indent, - $x2-$indent, - $h-$indent, + $x1+$ind, + $y1+$ind, + $x2-$ind, + $h-$ind, $this->titlebkg_scolor1, $this->titlebkg_scolor2, 2 @@ -3093,7 +2858,8 @@ class Graph // This is clumsy. But we neeed to stroke the whole graph frame if it is // set to bevel to get the bevel shading on top of the text background - if ($this->framebevel && $this->doframe && $this->titlebackground_style === 3) { + if ($this->framebevel && $this->doframe && + $this->titlebackground_style === 3) { $this->img->Bevel( 1, 1, @@ -3124,7 +2890,7 @@ class Graph $this->title->SetPos($this->img->width-$this->title->margin-$indent, $y, 'right'); } $this->title->Stroke($this->img); - + // ... and subtitle $y += $this->title->GetTextHeight($this->img) + $margin + $this->subtitle->margin; if ($this->subtitle->halign == 'center') { @@ -3197,14 +2963,14 @@ class Graph $this->img->SetColor($this->csimcolor); $n = count($coords[0]); for ($i=0; $i < $n; $i++) { - if ($coords[1][$i] == 'poly') { + if ($coords[1][$i]=="poly") { preg_match_all('/\s*([0-9]+)\s*,\s*([0-9]+)\s*,*/', $coords[2][$i], $pts); $this->img->SetStartPoint($pts[1][count($pts[0])-1], $pts[2][count($pts[0])-1]); $m = count($pts[0]); for ($j=0; $j < $m; $j++) { $this->img->LineTo($pts[1][$j], $pts[2][$j]); } - } elseif ($coords[1][$i] == 'rect') { + } elseif ($coords[1][$i]=="rect") { $pts = preg_split('/,/', $coords[2][$i]); $this->img->SetStartPoint($pts[0], $pts[1]); $this->img->LineTo($pts[2], $pts[1]); @@ -3232,7 +2998,7 @@ class Graph // Get Y min and max values for added lines public function GetLinesYMinMax($aLines) { - $n = is_array($aLines) ? count($aLines) : 0; + $n = count($aLines); if ($n == 0) { return false; } @@ -3257,7 +3023,7 @@ class Graph // Get X min and max values for added lines public function GetLinesXMinMax($aLines) { - $n = is_array($aLines) ? count($aLines) : 0; + $n = count($aLines); if ($n == 0) { return false ; } @@ -3292,7 +3058,7 @@ class Graph do { list($xmin, $min) = $aPlots[$i]->Min(); } while (++$i < $n && !is_numeric($min)); - + if (!is_numeric($min) || !is_numeric($max)) { JpGraphError::RaiseL(25044);//('Cannot use autoscaling since it is impossible to determine a valid min/max value of the Y-axis (only null values).'); } @@ -3320,82 +3086,6 @@ class Graph } return array($min,$max); } - - public function hasLinePlotAndBarPlot() - { - $has_line = false; - $has_bar = false; - - foreach ($this->plots as $plot) { - if ($plot instanceof LinePlot) { - $has_line = true; - } - if ($plot instanceof BarPlot) { - $has_bar = true; - } - } - - if ($has_line && $has_bar) { - return true; - } - - return false; - } - - public function SetTheme($graph_theme) - { - if (!($this instanceof PieGraph)) { - if (!$this->isAfterSetScale) { - JpGraphError::RaiseL(25133);//('Use Graph::SetTheme() after Graph::SetScale().'); - } - } - - if ($this->graph_theme) { - $this->ClearTheme(); - } - $this->graph_theme = $graph_theme; - $this->graph_theme->ApplyGraph($this); - } - - public function ClearTheme() - { - $this->graph_theme = null; - - $this->isRunningClear = true; - - $this->__construct( - $this->inputValues['aWidth'], - $this->inputValues['aHeight'], - $this->inputValues['aCachedName'], - $this->inputValues['aTimeout'], - $this->inputValues['aInline'] - ); - - if (!($this instanceof PieGraph)) { - if ($this->isAfterSetScale) { - $this->SetScale( - $this->inputValues['aAxisType'], - $this->inputValues['aYMin'], - $this->inputValues['aYMax'], - $this->inputValues['aXMin'], - $this->inputValues['aXMax'] - ); - } - } - - $this->isRunningClear = false; - } - - public function SetSupersampling($do = false, $scale = 2) - { - if ($do) { - define('SUPERSAMPLING_SCALE', $scale); - // $this->img->scale = $scale; - } else { - define('SUPERSAMPLING_SCALE', 1); - //$this->img->scale = 0; - } - } } // Class //=================================================== @@ -3405,37 +3095,32 @@ class Graph class LineProperty { public $iWeight=1; - public $iColor='black'; - public $iStyle='solid'; - public $iShow=false; - - public function __construct($aWeight=1, $aColor='black', $aStyle='solid') - { - $this->iWeight = $aWeight; - $this->iColor = $aColor; - $this->iStyle = $aStyle; - } - + public $iColor="black"; + public $iStyle="solid"; + public $iShow=true; + + //--------------- + // PUBLIC METHODS public function SetColor($aColor) { $this->iColor = $aColor; } - + public function SetWeight($aWeight) { $this->iWeight = $aWeight; } - + public function SetStyle($aStyle) { $this->iStyle = $aStyle; } - + public function Show($aShow=true) { $this->iShow=$aShow; } - + public function Stroke($aImg, $aX1, $aY1, $aX2, $aY2) { if ($this->iShow) { @@ -3452,10 +3137,330 @@ class LineProperty } } + //=================================================== -// CLASS GraphTabTitle -// Description: Draw "tab" titles on top of graphs +// CLASS Text +// Description: Arbitrary text object that can be added to the graph //=================================================== +class Text +{ + public $t; + public $margin=0; + public $x=0; + public $y=0; + public $halign="left"; + public $valign="top"; + public $color=array(0,0,0); + public $hide=false; + public $dir=0; + public $iScalePosY=null; + public $iScalePosX=null; + public $iWordwrap=0; + public $font_family=FF_FONT1; + public $font_style=FS_NORMAL; + public $font_size=12; + protected $boxed=false; // Should the text be boxed + protected $paragraph_align="left"; + protected $icornerradius=0; + protected $ishadowwidth=3; + protected $fcolor='white'; + protected $bcolor='black'; + protected $shadow=false; + protected $iCSIMarea=''; + protected $iCSIMalt=''; + protected $iCSIMtarget=''; + protected $iCSIMWinTarget=''; + + //--------------- + // CONSTRUCTOR + + // Create new text at absolute pixel coordinates + public function Text($aTxt="", $aXAbsPos=0, $aYAbsPos=0) + { + if (! is_string($aTxt)) { + JpGraphError::RaiseL(25050);//('First argument to Text::Text() must be s atring.'); + } + $this->t = $aTxt; + $this->x = round($aXAbsPos); + $this->y = round($aYAbsPos); + $this->margin = 0; + } + //--------------- + // PUBLIC METHODS + // Set the string in the text object + public function Set($aTxt) + { + $this->t = $aTxt; + } + + // Alias for Pos() + public function SetPos($aXAbsPos=0, $aYAbsPos=0, $aHAlign="left", $aVAlign="top") + { + //$this->Pos($aXAbsPos,$aYAbsPos,$aHAlign,$aVAlign); + $this->x = $aXAbsPos; + $this->y = $aYAbsPos; + $this->halign = $aHAlign; + $this->valign = $aVAlign; + } + + public function SetScalePos($aX, $aY) + { + $this->iScalePosX = $aX; + $this->iScalePosY = $aY; + } + + // Specify alignment for the text + public function Align($aHAlign, $aVAlign="top", $aParagraphAlign="") + { + $this->halign = $aHAlign; + $this->valign = $aVAlign; + if ($aParagraphAlign != "") { + $this->paragraph_align = $aParagraphAlign; + } + } + + // Alias + public function SetAlign($aHAlign, $aVAlign="top", $aParagraphAlign="") + { + $this->Align($aHAlign, $aVAlign, $aParagraphAlign); + } + + // Specifies the alignment for a multi line text + public function ParagraphAlign($aAlign) + { + $this->paragraph_align = $aAlign; + } + + // Specifies the alignment for a multi line text + public function SetParagraphAlign($aAlign) + { + $this->paragraph_align = $aAlign; + } + + public function SetShadow($aShadowColor='gray', $aShadowWidth=3) + { + $this->ishadowwidth=$aShadowWidth; + $this->shadow=$aShadowColor; + $this->boxed=true; + } + + public function SetWordWrap($aCol) + { + $this->iWordwrap = $aCol ; + } + + // Specify that the text should be boxed. fcolor=frame color, bcolor=border color, + // $shadow=drop shadow should be added around the text. + public function SetBox($aFrameColor=array(255,255,255), $aBorderColor=array(0,0,0), $aShadowColor=false, $aCornerRadius=4, $aShadowWidth=3) + { + if ($aFrameColor==false) { + $this->boxed=false; + } else { + $this->boxed=true; + } + $this->fcolor=$aFrameColor; + $this->bcolor=$aBorderColor; + // For backwards compatibility when shadow was just true or false + if ($aShadowColor === true) { + $aShadowColor = 'gray'; + } + $this->shadow=$aShadowColor; + $this->icornerradius=$aCornerRadius; + $this->ishadowwidth=$aShadowWidth; + } + + // Hide the text + public function Hide($aHide=true) + { + $this->hide=$aHide; + } + + // This looks ugly since it's not a very orthogonal design + // but I added this "inverse" of Hide() to harmonize + // with some classes which I designed more recently (especially) + // jpgraph_gantt + public function Show($aShow=true) + { + $this->hide=!$aShow; + } + + // Specify font + public function SetFont($aFamily, $aStyle=FS_NORMAL, $aSize=10) + { + $this->font_family=$aFamily; + $this->font_style=$aStyle; + $this->font_size=$aSize; + } + + // Center the text between $left and $right coordinates + public function Center($aLeft, $aRight, $aYAbsPos=false) + { + $this->x = $aLeft + ($aRight-$aLeft)/2; + $this->halign = "center"; + if (is_numeric($aYAbsPos)) { + $this->y = $aYAbsPos; + } + } + + // Set text color + public function SetColor($aColor) + { + $this->color = $aColor; + } + + public function SetAngle($aAngle) + { + $this->SetOrientation($aAngle); + } + + // Orientation of text. Note only TTF fonts can have an arbitrary angle + public function SetOrientation($aDirection=0) + { + if (is_numeric($aDirection)) { + $this->dir=$aDirection; + } elseif ($aDirection=="h") { + $this->dir = 0; + } elseif ($aDirection=="v") { + $this->dir = 90; + } else { + JpGraphError::RaiseL(25051); + }//(" Invalid direction specified for text."); + } + + // Total width of text + public function GetWidth($aImg) + { + $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); + $w = $aImg->GetTextWidth($this->t, $this->dir); + return $w; + } + + // Hight of font + public function GetFontHeight($aImg) + { + $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); + $h = $aImg->GetFontHeight(); + return $h; + } + + public function GetTextHeight($aImg) + { + $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); + $h = $aImg->GetTextHeight($this->t, $this->dir); + return $h; + } + + public function GetHeight($aImg) + { + // Synonym for GetTextHeight() + $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); + $h = $aImg->GetTextHeight($this->t, $this->dir); + return $h; + } + + // Set the margin which will be interpretated differently depending + // on the context. + public function SetMargin($aMarg) + { + $this->margin = $aMarg; + } + + public function StrokeWithScale($aImg, $axscale, $ayscale) + { + if ($this->iScalePosX === null || + $this->iScalePosY === null) { + $this->Stroke($aImg); + } else { + $this->Stroke( + $aImg, + round($axscale->Translate($this->iScalePosX)), + round($ayscale->Translate($this->iScalePosY)) + ); + } + } + + public function SetCSIMTarget($aURITarget, $aAlt='', $aWinTarget='') + { + $this->iCSIMtarget = $aURITarget; + $this->iCSIMalt = $aAlt; + $this->iCSIMWinTarget = $aWinTarget; + } + + public function GetCSIMareas() + { + if ($this->iCSIMtarget !== '') { + return $this->iCSIMarea; + } else { + return ''; + } + } + + // Display text in image + public function Stroke($aImg, $x=null, $y=null) + { + if (!empty($x)) { + $this->x = round($x); + } + if (!empty($y)) { + $this->y = round($y); + } + + // Insert newlines + if ($this->iWordwrap > 0) { + $this->t = wordwrap($this->t, $this->iWordwrap, "\n"); + } + + // If position been given as a fraction of the image size + // calculate the absolute position + if ($this->x < 1 && $this->x > 0) { + $this->x *= $aImg->width; + } + if ($this->y < 1 && $this->y > 0) { + $this->y *= $aImg->height; + } + + $aImg->PushColor($this->color); + $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); + $aImg->SetTextAlign($this->halign, $this->valign); + if ($this->boxed) { + if ($this->fcolor=="nofill") { + $this->fcolor=false; + } + $aImg->SetLineWeight(1); + $bbox = $aImg->StrokeBoxedText( + $this->x, + $this->y, + $this->t, + $this->dir, + $this->fcolor, + $this->bcolor, + $this->shadow, + $this->paragraph_align, + 5, + 5, + $this->icornerradius, + $this->ishadowwidth + ); + } else { + $bbox = $aImg->StrokeText($this->x, $this->y, $this->t, $this->dir, $this->paragraph_align); + } + + // Create CSIM targets + $coords = $bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3].','.$bbox[4].','.$bbox[5].','.$bbox[6].','.$bbox[7]; + $this->iCSIMarea = "iCSIMtarget)."\" "; + if (trim($this->iCSIMalt) != '') { + $this->iCSIMarea .= " alt=\"".$this->iCSIMalt."\" "; + $this->iCSIMarea .= " title=\"".$this->iCSIMalt."\" "; + } + if (trim($this->iCSIMWinTarget) != '') { + $this->iCSIMarea .= " target=\"".$this->iCSIMWinTarget."\" "; + } + $this->iCSIMarea .= " />\n"; + + $aImg->PopColor($this->color); + } +} // Class + class GraphTabTitle extends Text { private $corner = 6 ; @@ -3465,7 +3470,7 @@ class GraphTabTitle extends Text private $bordercolor='black'; private $align = 'left'; private $width=TABTITLE_WIDTHFIT; - public function __construct() + public function GraphTabTitle() { $this->t = ''; $this->font_style = FS_BOLD; @@ -3489,7 +3494,7 @@ class GraphTabTitle extends Text { $this->align = $aAlign; } - + public function SetWidth($aWidth) { $this->width = $aWidth ; @@ -3521,27 +3526,27 @@ class GraphTabTitle extends Text if ($this->width === TABTITLE_WIDTHFIT) { if ($this->align == 'left') { $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner,$y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); + $x, $y-$h+$this->corner, + $x + $this->corner,$y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); } elseif ($this->align == 'center') { $x += round($aImg->plotwidth/2) - round($w/2); $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner, $y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); + $x, $y-$h+$this->corner, + $x + $this->corner, $y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); } else { $x += $aImg->plotwidth -$w; $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner,$y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); + $x, $y-$h+$this->corner, + $x + $this->corner,$y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); } } else { if ($this->width === TABTITLE_WIDTHFULL) { @@ -3551,12 +3556,12 @@ class GraphTabTitle extends Text } // Make the tab fit the width of the plot area - $p = array($x, $y, - $x, $y-$h+$this->corner, - $x + $this->corner,$y-$h, - $x + $w - $this->corner, $y-$h, - $x + $w, $y-$h+$this->corner, - $x + $w, $y); + $p = array($x, $y, + $x, $y-$h+$this->corner, + $x + $this->corner,$y-$h, + $x + $w - $this->corner, $y-$h, + $x + $w, $y-$h+$this->corner, + $x + $w, $y); } if ($this->halign == 'left') { $aImg->SetTextAlign('left', 'bottom'); @@ -3577,7 +3582,7 @@ class GraphTabTitle extends Text $aImg->SetColor($this->bordercolor); $aImg->Polygon($p, true); - + $aImg->SetColor($this->color); $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); $aImg->StrokeText($x, $y, $this->t, 0, 'center'); @@ -3590,9 +3595,9 @@ class GraphTabTitle extends Text //=================================================== class SuperScriptText extends Text { - private $iSuper=''; - private $sfont_family=''; - private $sfont_style=''; + private $iSuper=""; + private $sfont_family=""; + private $sfont_style=""; private $sfont_size=8; private $iSuperMargin=2; private $iVertOverlap=4; @@ -3600,9 +3605,9 @@ class SuperScriptText extends Text private $iSDir=0; private $iSimple=false; - public function __construct($aTxt='', $aSuper='', $aXAbsPos=0, $aYAbsPos=0) + public function SuperScriptText($aTxt="", $aSuper="", $aXAbsPos=0, $aYAbsPos=0) { - parent::__construct($aTxt, $aXAbsPos, $aYAbsPos); + parent::Text($aTxt, $aXAbsPos, $aYAbsPos); $this->iSuper = $aSuper; } @@ -3614,14 +3619,14 @@ class SuperScriptText extends Text $neg = -1.0; $aVal = -$aVal; } - + $l = floor(log10($aVal)); $a = sprintf("%0.".$aPrecision."f", round($aVal / pow(10, $l), $aPrecision)); $a *= $neg; if ($this->iSimple && ($a == 1 || $a==-1)) { $a = ''; } - + if ($a != '') { $this->t = $a.' * 10'; } else { @@ -3634,7 +3639,7 @@ class SuperScriptText extends Text $this->iSuper = $l; } - public function Set($aTxt, $aSuper='') + public function Set($aTxt, $aSuper="") { $this->t = $aTxt; $this->iSuper = $aSuper; @@ -3657,7 +3662,7 @@ class SuperScriptText extends Text $w += $this->iSuperMargin; return $w; } - + // Hight of font (approximate the height of the text) public function GetFontHeight($aImg) { @@ -3680,49 +3685,49 @@ class SuperScriptText extends Text public function Stroke($aImg, $ax=-1, $ay=-1) { - + // To position the super script correctly we need different // cases to handle the alignmewnt specified since that will // determine how we can interpret the x,y coordinates - + $w = parent::GetWidth($aImg); $h = parent::GetTextHeight($aImg); switch ($this->valign) { - case 'top': - $sy = $this->y; - break; - case 'center': - $sy = $this->y - $h/2; - break; - case 'bottom': - $sy = $this->y - $h; - break; - default: - JpGraphError::RaiseL(25052);//('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text'); - break; - } + case 'top': + $sy = $this->y; + break; + case 'center': + $sy = $this->y - $h/2; + break; + case 'bottom': + $sy = $this->y - $h; + break; + default: + JpGraphError::RaiseL(25052);//('PANIC: Internal error in SuperScript::Stroke(). Unknown vertical alignment for text'); + break; + } switch ($this->halign) { - case 'left': - $sx = $this->x + $w; - break; - case 'center': - $sx = $this->x + $w/2; - break; - case 'right': - $sx = $this->x; - break; - default: - JpGraphError::RaiseL(25053);//('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text'); - break; - } + case 'left': + $sx = $this->x + $w; + break; + case 'center': + $sx = $this->x + $w/2; + break; + case 'right': + $sx = $this->x; + break; + default: + JpGraphError::RaiseL(25053);//('PANIC: Internal error in SuperScript::Stroke(). Unknown horizontal alignment for text'); + break; + } $sx += $this->iSuperMargin; $sy += $this->iVertOverlap; // Should we automatically determine the font or // has the user specified it explicetly? - if ($this->sfont_family == '') { + if ($this->sfont_family == "") { if ($this->font_family <= FF_FONT2) { if ($this->font_family == FF_FONT0) { $sff = FF_FONT0; @@ -3757,6 +3762,7 @@ class SuperScriptText extends Text parent::Stroke($aImg, $ax, $ay); + // For the builtin fonts we need to reduce the margins // since the bounding bx reported for the builtin fonts // are much larger than for the TTF fonts. @@ -3782,91 +3788,88 @@ class Grid { protected $img; protected $scale; - protected $majorcolor='#CCCCCC'; - protected $minorcolor='#DDDDDD'; - protected $majortype='solid'; - protected $minortype='solid'; + protected $grid_color='#DDDDDD'; + protected $grid_mincolor='#DDDDDD'; + protected $type="solid"; protected $show=false; protected $showMinor=false; - protected $majorweight=1; - protected $minorweight=1; + protected $weight=1; protected $fill=false; protected $fillcolor=array('#EFEFEF','#BBCCFF'); - - public function __construct($aAxis) + //--------------- + // CONSTRUCTOR + public function Grid($aAxis) { $this->scale = $aAxis->scale; $this->img = $aAxis->img; } - + //--------------- + // PUBLIC METHODS public function SetColor($aMajColor, $aMinColor=false) { - $this->majorcolor=$aMajColor; + $this->grid_color=$aMajColor; if ($aMinColor === false) { $aMinColor = $aMajColor ; } - $this->minorcolor = $aMinColor; + $this->grid_mincolor = $aMinColor; } - - public function SetWeight($aMajorWeight, $aMinorWeight=1) + + public function SetWeight($aWeight) { - $this->majorweight=$aMajorWeight; - $this->minorweight=$aMinorWeight; + $this->weight=$aWeight; } - + // Specify if grid should be dashed, dotted or solid - public function SetLineStyle($aMajorType, $aMinorType='solid') + public function SetLineStyle($aType) { - $this->majortype = $aMajorType; - $this->minortype = $aMinorType; + $this->type = $aType; } - - public function SetStyle($aMajorType, $aMinorType='solid') - { - $this->SetLineStyle($aMajorType, $aMinorType); - } - + // Decide if both major and minor grid should be displayed public function Show($aShowMajor=true, $aShowMinor=false) { $this->show=$aShowMajor; $this->showMinor=$aShowMinor; } - + public function SetFill($aFlg=true, $aColor1='lightgray', $aColor2='lightblue') { $this->fill = $aFlg; $this->fillcolor = array( $aColor1, $aColor2 ); } - + // Display the grid public function Stroke() { if ($this->showMinor && !$this->scale->textscale) { - $this->DoStroke($this->scale->ticks->ticks_pos, $this->minortype, $this->minorcolor, $this->minorweight); - $this->DoStroke($this->scale->ticks->maj_ticks_pos, $this->majortype, $this->majorcolor, $this->majorweight); + $tmp = $this->grid_color; + $this->grid_color = $this->grid_mincolor; + $this->DoStroke($this->scale->ticks->ticks_pos); + + $this->grid_color = $tmp; + $this->DoStroke($this->scale->ticks->maj_ticks_pos); } else { - $this->DoStroke($this->scale->ticks->maj_ticks_pos, $this->majortype, $this->majorcolor, $this->majorweight); + $this->DoStroke($this->scale->ticks->maj_ticks_pos); } } - + //-------------- // Private methods // Draw the grid - public function DoStroke($aTicksPos, $aType, $aColor, $aWeight) + public function DoStroke($aTicksPos) { if (!$this->show) { return; } $nbrgrids = count($aTicksPos); - if ($this->scale->type == 'y') { + if ($this->scale->type=="y") { $xl=$this->img->left_margin; $xr=$this->img->width-$this->img->right_margin; - + if ($this->fill) { // Draw filled areas - $y2 = !empty($aTicksPos) ? $aTicksPos[0] : null; + $y2 = $aTicksPos[0]; $i=1; while ($i < $nbrgrids) { $y1 = $y2; @@ -3876,24 +3879,24 @@ class Grid } } - $this->img->SetColor($aColor); - $this->img->SetLineWeight($aWeight); + $this->img->SetColor($this->grid_color); + $this->img->SetLineWeight($this->weight); // Draw grid lines - switch ($aType) { - case 'solid': $style = LINESTYLE_SOLID; break; - case 'dotted': $style = LINESTYLE_DOTTED; break; - case 'dashed': $style = LINESTYLE_DASHED; break; - case 'longdashed': $style = LINESTYLE_LONGDASH; break; - default: - $style = LINESTYLE_SOLID; break; - } + switch ($this->type) { + case "solid": $style = LINESTYLE_SOLID; break; + case "dotted": $style = LINESTYLE_DOTTED; break; + case "dashed": $style = LINESTYLE_DASHED; break; + case "longdashed": $style = LINESTYLE_LONGDASH; break; + default: + $style = LINESTYLE_SOLID; break; + } for ($i=0; $i < $nbrgrids; ++$i) { $y=$aTicksPos[$i]; - $this->img->StyleLine($xl, $y, $xr, $y, $style, true); + $this->img->StyleLine($xl, $y, $xr, $y, $style); } - } elseif ($this->scale->type == 'x') { + } elseif ($this->scale->type=="x") { $yu=$this->img->top_margin; $yl=$this->img->height-$this->img->bottom_margin; $limit=$this->img->width-$this->img->right_margin; @@ -3910,23 +3913,24 @@ class Grid } } - $this->img->SetColor($aColor); - $this->img->SetLineWeight($aWeight); + $this->img->SetColor($this->grid_color); + $this->img->SetLineWeight($this->weight); // We must also test for limit since we might have // an offset and the number of ticks is calculated with // assumption offset==0 so we might end up drawing one // to many gridlines $i=0; + $x=$aTicksPos[$i]; while ($itype == "solid") { $this->img->Line($x, $yl, $x, $yu); - } elseif ($aType == 'dotted') { - $this->img->DashedLineForGrid($x, $yl, $x, $yu, 1, 6); - } elseif ($aType == 'dashed') { - $this->img->DashedLineForGrid($x, $yl, $x, $yu, 2, 4); - } elseif ($aType == 'longdashed') { - $this->img->DashedLineForGrid($x, $yl, $x, $yu, 8, 6); + } elseif ($this->type == "dotted") { + $this->img->DashedLine($x, $yl, $x, $yu, 1, 6); + } elseif ($this->type == "dashed") { + $this->img->DashedLine($x, $yl, $x, $yu, 2, 4); + } elseif ($this->type == "longdashed") { + $this->img->DashedLine($x, $yl, $x, $yu, 8, 6); } ++$i; } @@ -3952,9 +3956,9 @@ class AxisPrototype public $hide=false; public $hide_labels=false; public $title=null; - public $font_family=FF_DEFAULT; + public $font_family=FF_FONT1; public $font_style=FS_NORMAL; - public $font_size=8; + public $font_size=12; public $label_angle=0; public $tick_step=1; public $pos = false; @@ -3972,36 +3976,40 @@ class AxisPrototype protected $title_adjust; protected $title_margin; protected $title_side=SIDE_LEFT; - protected $tick_label_margin=5; + protected $tick_label_margin=7; protected $label_halign = ''; protected $label_valign = ''; protected $label_para_align='left'; protected $hide_line=false; protected $iDeltaAbsPos=0; - public function __construct($img, $aScale, $color = array(0,0,0)) + //--------------- + // CONSTRUCTOR + public function Axis($img, $aScale, $color=array(0,0,0)) { $this->img = $img; $this->scale = $aScale; $this->color = $color; - $this->title=new Text(''); - - if ($aScale->type == 'y') { + $this->title=new Text(""); + + if ($aScale->type=="y") { $this->title_margin = 25; - $this->title_adjust = 'middle'; + $this->title_adjust="middle"; $this->title->SetOrientation(90); $this->tick_label_margin=7; $this->labelPos=SIDE_LEFT; } else { $this->title_margin = 5; - $this->title_adjust = 'high'; + $this->title_adjust="high"; $this->title->SetOrientation(0); - $this->tick_label_margin=5; + $this->tick_label_margin=7; $this->labelPos=SIDE_DOWN; $this->title_side=SIDE_DOWN; } } - + //--------------- + // PUBLIC METHODS + public function SetLabelFormat($aFormStr) { $this->scale->ticks->SetLabelFormat($aFormStr); @@ -4011,13 +4019,13 @@ class AxisPrototype { $this->scale->ticks->SetLabelFormat($aFormStr, $aDate); } - + public function SetLabelFormatCallback($aFuncName) { $this->scale->ticks->SetFormatCallback($aFuncName); } - public function SetLabelAlign($aHAlign, $aVAlign='top', $aParagraphAlign='left') + public function SetLabelAlign($aHAlign, $aVAlign="top", $aParagraphAlign='left') { $this->label_halign = $aHAlign; $this->label_valign = $aVAlign; @@ -4059,7 +4067,7 @@ class AxisPrototype { $this->scale->ticks->SupressZeroLabel(); } - + public function HideFirstLastLabel() { // The two first calls to ticks method will supress @@ -4069,10 +4077,10 @@ class AxisPrototype // specified scale labels. $this->scale->ticks->SupressLast(); $this->scale->ticks->SupressFirst(); - $this->show_first_label = false; + $this->show_first_label = false; $this->show_last_label = false; } - + // Hide the axis public function Hide($aHide=true) { @@ -4089,6 +4097,7 @@ class AxisPrototype { $this->hide_labels = $aHide; } + // Weight of axis public function SetWeight($aWeight) @@ -4106,47 +4115,69 @@ class AxisPrototype $this->label_color = $aLabelColor; } } - + // Title on axis - public function SetTitle($aTitle, $aAdjustAlign='high') + public function SetTitle($aTitle, $aAdjustAlign="high") { $this->title->Set($aTitle); $this->title_adjust=$aAdjustAlign; } - + // Specify distance from the axis public function SetTitleMargin($aMargin) { $this->title_margin=$aMargin; } - + // Which side of the axis should the axis title be? public function SetTitleSide($aSideOfAxis) { $this->title_side = $aSideOfAxis; } + // Utility function to set the direction for tick marks + public function SetTickDirection($aDir) + { + // Will be deprecated from 1.7 + if (ERR_DEPRECATED) { + JpGraphError::RaiseL(25055); + }//('Axis::SetTickDirection() is deprecated. Use Axis::SetTickSide() instead'); + $this->scale->ticks->SetSide($aDir); + } + public function SetTickSide($aDir) { $this->scale->ticks->SetSide($aDir); } - - public function SetTickSize($aMajSize, $aMinSize=3) - { - $this->scale->ticks->SetSize($aMajSize, $aMinSize=3); - } - + // Specify text labels for the ticks. One label for each data point public function SetTickLabels($aLabelArray, $aLabelColorArray=null) { $this->ticks_label = $aLabelArray; $this->ticks_label_colors = $aLabelColorArray; } + + // How far from the axis should the labels be drawn + public function SetTickLabelMargin($aMargin) + { + if (ERR_DEPRECATED) { + JpGraphError::RaiseL(25056); + }//('SetTickLabelMargin() is deprecated. Use Axis::SetLabelMargin() instead.'); + $this->tick_label_margin=$aMargin; + } public function SetLabelMargin($aMargin) { $this->tick_label_margin=$aMargin; } + + // Specify that every $step of the ticks should be displayed starting + // at $start + // DEPRECATED FUNCTION: USE SetTextTickInterval() INSTEAD + public function SetTextTicks($step, $start=0) + { + JpGraphError::RaiseL(25057);//(" SetTextTicks() is deprecated. Use SetTextTickInterval() instead."); + } // Specify that every $step of the ticks should be displayed starting // at $start @@ -4155,17 +4186,27 @@ class AxisPrototype $this->scale->ticks->SetTextLabelStart($aStart); $this->tick_step=$aStep; } - + // Specify that every $step tick mark should have a label // should be displayed starting public function SetTextLabelInterval($aStep) { if ($aStep < 1) { - JpGraphError::RaiseL(25058);//(" Text label interval must be specified >= 1."); - } + JpGraphError::RaiseL(25058); + }//(" Text label interval must be specified >= 1."); $this->label_step=$aStep; } - + + // Which side of the axis should the labels be on? + public function SetLabelPos($aSidePos) + { + // This will be deprecated from 1.7 + if (ERR_DEPRECATED) { + JpGraphError::RaiseL(25059); + }//('SetLabelPos() is deprecated. Use Axis::SetLabelSide() instead.'); + $this->labelPos=$aSidePos; + } + public function SetLabelSide($aSidePos) { $this->labelPos=$aSidePos; @@ -4191,7 +4232,7 @@ class AxisPrototype { $this->iDeltaAbsPos=$aDelta; } - + // Specify the angle for the tick labels public function SetLabelAngle($aAngle) { @@ -4210,11 +4251,11 @@ class AxisPrototype //=================================================== class Axis extends AxisPrototype { - public function __construct($img, $aScale, $color='black') + public function Axis($img, $aScale, $color=array(0,0,0)) { - parent::__construct($img, $aScale, $color); + parent::Axis($img, $aScale, $color); } - + // Stroke the axis. public function Stroke($aOtherAxisScale, $aStrokeLabels=true) { @@ -4223,8 +4264,8 @@ class Axis extends AxisPrototype } if (is_numeric($this->pos)) { $pos=$aOtherAxisScale->Translate($this->pos); - } else { // Default to minimum of other scale if pos not set - if (($aOtherAxisScale->GetMinVal() >= 0 && $this->pos==false) || $this->pos == 'min') { + } else { // Default to minimum of other scale if pos not set + if (($aOtherAxisScale->GetMinVal() >= 0 && $this->pos==false) || $this->pos=="min") { $pos = $aOtherAxisScale->scale_abs[0]; } elseif ($this->pos == "max") { $pos = $aOtherAxisScale->scale_abs[1]; @@ -4233,20 +4274,17 @@ class Axis extends AxisPrototype $pos=$aOtherAxisScale->Translate(0); } } - $pos += $this->iDeltaAbsPos; $this->img->SetLineWeight($this->weight); $this->img->SetColor($this->color); $this->img->SetFont($this->font_family, $this->font_style, $this->font_size); - if ($this->scale->type == "x") { if (!$this->hide_line) { - // Stroke X-axis $this->img->FilledRectangle( $this->img->left_margin, $pos, - $this->img->width - $this->img->right_margin, - $pos + $this->weight-1 + $this->img->width-$this->img->right_margin, + $pos+$this->weight-1 ); } if ($this->title_side == SIDE_DOWN) { @@ -4270,24 +4308,22 @@ class Axis extends AxisPrototype // Add line weight to the height of the axis since // the x-axis could have a width>1 and we want the axis to fit nicely together. if (!$this->hide_line) { - // Stroke Y-axis $this->img->FilledRectangle( - $pos - $this->weight + 1, + $pos-$this->weight+1, $this->img->top_margin, $pos, - $this->img->height - $this->img->bottom_margin + $this->weight - 1 + $this->img->height-$this->img->bottom_margin+$this->weight-1 ); } - $x=$pos ; if ($this->title_side == SIDE_LEFT) { $x -= $this->title_margin; $x -= $this->title->margin; - $halign = 'right'; + $halign="right"; } else { $x += $this->title_margin; $x += $this->title->margin; - $halign = 'left'; + $halign="left"; } // If the user has manually specified an hor. align // then we override the automatic settings with this @@ -4297,15 +4333,15 @@ class Axis extends AxisPrototype if ($this->title->halign != 'left') { $halign = $this->title->halign; } - if ($this->title_adjust == 'high') { - $this->title->SetPos($x, $this->img->top_margin, $halign, 'top'); - } elseif ($this->title_adjust=='middle' || $this->title_adjust=='center') { + if ($this->title_adjust=="high") { + $this->title->SetPos($x, $this->img->top_margin, $halign, "top"); + } elseif ($this->title_adjust=="middle" || $this->title_adjust=="center") { $this->title->SetPos($x, ($this->img->height-$this->img->top_margin-$this->img->bottom_margin)/2+$this->img->top_margin, $halign, "center"); - } elseif ($this->title_adjust=='low') { - $this->title->SetPos($x, $this->img->height-$this->img->bottom_margin, $halign, 'bottom'); + } elseif ($this->title_adjust=="low") { + $this->title->SetPos($x, $this->img->height-$this->img->bottom_margin, $halign, "bottom"); } else { - JpGraphError::RaiseL(25061, $this->title_adjust);//('Unknown alignment specified for Y-axis title. ('.$this->title_adjust.')'); - } + JpGraphError::RaiseL(25061, $this->title_adjust); + }//('Unknown alignment specified for Y-axis title. ('.$this->title_adjust.')'); } $this->scale->ticks->Stroke($this->img, $this->scale, $pos); if ($aStrokeLabels) { @@ -4321,12 +4357,7 @@ class Axis extends AxisPrototype // Draw all the tick labels on major tick marks public function StrokeLabels($aPos, $aMinor=false, $aAbsLabel=false) { - if (is_array($this->label_color) && count($this->label_color) > 3) { - $this->ticks_label_colors = $this->label_color; - $this->img->SetColor($this->label_color[0]); - } else { - $this->img->SetColor($this->label_color); - } + $this->img->SetColor($this->label_color); $this->img->SetFont($this->font_family, $this->font_style, $this->font_size); $yoff=$this->img->GetFontHeight()/2; @@ -4346,28 +4377,28 @@ class Axis extends AxisPrototype if (isset($this->ticks_label_colors)) { $ncolor=count($this->ticks_label_colors); } - while ($i < $nbr) { + while ($i<$nbr) { // $tpos holds the absolute text position for the label $tpos=$this->scale->ticks->maj_ticklabels_pos[$i]; // Note. the $limit is only used for the x axis since we // might otherwise overshoot if the scale has been centered // This is due to us "loosing" the last tick mark if we center. - if ($this->scale->type == 'x' && $tpos > $this->img->width-$this->img->right_margin+1) { + if ($this->scale->type=="x" && $tpos > $this->img->width-$this->img->right_margin+1) { return; } // we only draw every $label_step label if (($i % $this->label_step)==0) { - // Set specific label color if specified + // Set specific label color if specified if ($ncolor > 0) { $this->img->SetColor($this->ticks_label_colors[$i % $ncolor]); } - + // If the label has been specified use that and in other case // just label the mark with the actual scale value $m=$this->scale->ticks->GetMajor(); - + // ticks_label has an entry for each data point and is the array // that holds the labels set by the user. If the user hasn't // specified any values we use whats in the automatically asigned @@ -4380,15 +4411,11 @@ class Axis extends AxisPrototype } else { $label=$this->scale->ticks->maj_ticks_label[$i]; } - - // We number the scale from 1 and not from 0 so increase by one - if ($this->scale->textscale && - $this->scale->ticks->label_formfunc == '' && - ! $this->scale->ticks->HaveManualLabels()) { + if ($this->scale->textscale && $this->scale->ticks->label_formfunc == '') { ++$label; } } - + if ($this->scale->type == "x") { if ($this->labelPos == SIDE_DOWN) { if ($this->label_angle==0 || $this->label_angle==90) { @@ -4406,7 +4433,7 @@ class Axis extends AxisPrototype } $this->img->StrokeText( $tpos, - $aPos+$this->tick_label_margin, + $aPos+$this->tick_label_margin+1, $label, $this->label_angle, $this->label_para_align @@ -4435,23 +4462,23 @@ class Axis extends AxisPrototype } } else { // scale->type == "y" - //if( $this->label_angle!=0 ) - //JpGraphError::Raise(" Labels at an angle are not supported on Y-axis"); - if ($this->labelPos == SIDE_LEFT) { // To the left of y-axis - if ($this->label_halign=='' && $this->label_valign=='') { - $this->img->SetTextAlign("right", "center"); - } else { - $this->img->SetTextAlign($this->label_halign, $this->label_valign); - } - $this->img->StrokeText($aPos-$this->tick_label_margin, $tpos, $label, $this->label_angle, $this->label_para_align); - } else { // To the right of the y-axis - if ($this->label_halign=='' && $this->label_valign=='') { - $this->img->SetTextAlign("left", "center"); - } else { - $this->img->SetTextAlign($this->label_halign, $this->label_valign); - } - $this->img->StrokeText($aPos+$this->tick_label_margin, $tpos, $label, $this->label_angle, $this->label_para_align); - } + //if( $this->label_angle!=0 ) + //JpGraphError::Raise(" Labels at an angle are not supported on Y-axis"); + if ($this->labelPos == SIDE_LEFT) { // To the left of y-axis + if ($this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign("right", "center"); + } else { + $this->img->SetTextAlign($this->label_halign, $this->label_valign); + } + $this->img->StrokeText($aPos-$this->tick_label_margin, $tpos, $label, $this->label_angle, $this->label_para_align); + } else { // To the right of the y-axis + if ($this->label_halign=='' && $this->label_valign=='') { + $this->img->SetTextAlign("left", "center"); + } else { + $this->img->SetTextAlign($this->label_halign, $this->label_valign); + } + $this->img->StrokeText($aPos+$this->tick_label_margin, $tpos, $label, $this->label_angle, $this->label_para_align); + } } } ++$i; @@ -4486,58 +4513,62 @@ class Ticks protected $is_set=false; protected $supress_zerolabel=false; protected $supress_first=false; - protected $mincolor=''; - protected $majcolor=''; + protected $mincolor=""; + protected $majcolor=""; protected $weight=1; protected $label_usedateformat=false; - public function __construct($aScale) + //--------------- + // CONSTRUCTOR + public function Ticks($aScale) { $this->scale=$aScale; $this->precision = -1; } + //--------------- + // PUBLIC METHODS // Set format string for automatic labels public function SetLabelFormat($aFormatString, $aDate=false) { $this->label_formatstr=$aFormatString; $this->label_usedateformat=$aDate; } - + public function SetLabelDateFormat($aFormatString) { $this->label_dateformatstr=$aFormatString; } - + public function SetFormatCallback($aCallbackFuncName) { $this->label_formfunc = $aCallbackFuncName; } - + // Don't display the first zero label public function SupressZeroLabel($aFlag=true) { $this->supress_zerolabel=$aFlag; } - + // Don't display minor tick marks public function SupressMinorTickMarks($aHide=true) { $this->supress_minor_tickmarks=$aHide; } - + // Don't display major tick marks public function SupressTickMarks($aHide=true) { $this->supress_tickmarks=$aHide; } - + // Hide the first tick mark public function SupressFirst($aHide=true) { $this->supress_first=$aHide; } - + // Hide the last tick mark public function SupressLast($aHide=true) { @@ -4549,13 +4580,13 @@ class Ticks { return $this->minor_abs_size; } - + // Size (in pixels) of major tick marks public function GetMajTickAbsSize() { return $this->major_abs_size; } - + public function SetSize($aMajSize, $aMinSize=3) { $this->major_abs_size = $aMajSize; @@ -4567,36 +4598,46 @@ class Ticks { return $this->is_set; } + + // Specify number of decimals in automatic labels + // Deprecated from 1.4. Use SetFormatString() instead + public function SetPrecision($aPrecision) + { + if (ERR_DEPRECATED) { + JpGraphError::RaiseL(25063); + }//('Ticks::SetPrecision() is deprecated. Use Ticks::SetLabelFormat() (or Ticks::SetFormatCallback()) instead'); + $this->precision=$aPrecision; + } public function SetSide($aSide) { $this->direction=$aSide; } - + // Which side of the axis should the ticks be on public function SetDirection($aSide=SIDE_RIGHT) { $this->direction=$aSide; } - + // Set colors for major and minor tick marks - public function SetMarkColor($aMajorColor, $aMinorColor='') + public function SetMarkColor($aMajorColor, $aMinorColor="") { $this->SetColor($aMajorColor, $aMinorColor); } - - public function SetColor($aMajorColor, $aMinorColor='') + + public function SetColor($aMajorColor, $aMinorColor="") { $this->majcolor=$aMajorColor; - + // If not specified use same as major - if ($aMinorColor == '') { + if ($aMinorColor=="") { $this->mincolor=$aMajorColor; } else { $this->mincolor=$aMinorColor; } } - + public function SetWeight($aWeight) { $this->weight=$aWeight; @@ -4621,35 +4662,41 @@ class LinearTicks extends Ticks private $iManualTickLabels = null; private $iAdjustForDST = false; // If a date falls within the DST period add one hour to the diaplyed time - public function __construct() + //--------------- + // CONSTRUCTOR + public function LinearTicks() { $this->precision = -1; } + //--------------- + // PUBLIC METHODS + + // Return major step size in world coordinates public function GetMajor() { return $this->major_step; } - + // Return minor step size in world coordinates public function GetMinor() { return $this->minor_step; } - + // Set Minor and Major ticks (in world coordinates) public function Set($aMajStep, $aMinStep=false) { if ($aMinStep==false) { $aMinStep=$aMajStep; } - + if ($aMajStep <= 0 || $aMinStep <= 0) { JpGraphError::RaiseL(25064); //(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem."); } - + $this->major_step=$aMajStep; $this->minor_step=$aMinStep; $this->is_set = true; @@ -4669,23 +4716,19 @@ class LinearTicks extends Ticks $n=count($aMajPos); if (is_array($aLabels) && (count($aLabels) != $n)) { JpGraphError::RaiseL(25066);//('When manually specifying tick positions and labels the number of labels must be the same as the number of specified ticks.'); + return; } $this->iManualTickPos = $aMajPos; $this->iManualMinTickPos = $aMinPos; $this->iManualTickLabels = $aLabels; } - public function HaveManualLabels() - { - return is_array($this->iManualTickLabels) ? count($this->iManualTickLabels) > 0 : false; - } - // Specify all the tick positions manually and possible also the exact labels public function _doManualTickPos($aScale) { $n=count($this->iManualTickPos); - $m= is_array($this->iManualMinTickPos) ? count($this->iManualMinTickPos) : 0; - $doLbl= is_array($this->iManualTickLabels) ? count($this->iManualTickLabels) > 0 : false; + $m=count($this->iManualMinTickPos); + $doLbl=count($this->iManualTickLabels) > 0; $this->maj_ticks_pos = array(); $this->maj_ticklabels_pos = array(); @@ -4698,10 +4741,12 @@ class LinearTicks extends Ticks $j=0; for ($i=0; $i < $n ; ++$i) { // First make sure that the first tick is not lower than the lower scale value - if (!isset($this->iManualTickPos[$i]) || $this->iManualTickPos[$i] < $minScale || $this->iManualTickPos[$i] > $maxScale) { + if (!isset($this->iManualTickPos[$i]) || + $this->iManualTickPos[$i] < $minScale || $this->iManualTickPos[$i] > $maxScale) { continue; } + $this->maj_ticks_pos[$j] = $aScale->Translate($this->iManualTickPos[$i]); $this->maj_ticklabels_pos[$j] = $this->maj_ticks_pos[$j]; @@ -4709,6 +4754,7 @@ class LinearTicks extends Ticks if ($m <= 0) { $this->ticks_pos[$j] = $this->maj_ticks_pos[$j]; } + if ($doLbl) { $this->maj_ticks_label[$j] = $this->iManualTickLabels[$i]; } else { @@ -4725,7 +4771,8 @@ class LinearTicks extends Ticks // Setup the minor tick marks $j=0; for ($i=0; $i < $m; ++$i) { - if (empty($this->iManualMinTickPos[$i]) || $this->iManualMinTickPos[$i] < $minScale || $this->iManualMinTickPos[$i] > $maxScale) { + if (empty($this->iManualMinTickPos[$i]) || + $this->iManualMinTickPos[$i] < $minScale || $this->iManualMinTickPos[$i] > $maxScale) { continue; } $this->ticks_pos[$j] = $aScale->Translate($this->iManualMinTickPos[$i]); @@ -4794,11 +4841,7 @@ class LinearTicks extends Ticks $label+=$this->minor_step; } } elseif ($aScale->type == "y") { - //@todo s=2:20,12 s=1:50,6 $this->major_step:$nbr - // abs_point,limit s=1:270,80 s=2:540,160 - // $this->major_step = 50; $nbrmajticks=round(($aScale->GetMaxVal()-$aScale->GetMinVal())/$this->major_step)+1; -// $step = 5; while (round($abs_pos) >= $limit) { $this->ticks_pos[$i] = round($abs_pos); $this->ticks_label[$i]=$label; @@ -4825,10 +4868,10 @@ class LinearTicks extends Ticks public function _doLabelFormat($aVal, $aIdx, $aNbrTicks) { - // If precision hasn't been specified set it to a sensible value + // If precision hasn't been specified set it to a sensible value if ($this->precision==-1) { $t = log10($this->minor_step); - if ($t > 0 || $t === 0.0) { + if ($t > 0) { $precision = 0; } else { $precision = -floor($t); @@ -4839,18 +4882,13 @@ class LinearTicks extends Ticks if ($this->label_formfunc != '') { $f=$this->label_formfunc; - if ($this->label_formatstr == '') { - $l = call_user_func($f, $aVal); - } else { - $l = sprintf($this->label_formatstr, call_user_func($f, $aVal)); - } + $l = call_user_func($f, $aVal); } elseif ($this->label_formatstr != '' || $this->label_dateformatstr != '') { if ($this->label_usedateformat) { // Adjust the value to take daylight savings into account - if (date("I", $aVal)==1 && $this->iAdjustForDST) { - // DST - $aVal+=3600; - } + if (date("I", $aVal)==1 && $this->iAdjustForDST) { // DST + $aVal+=3600; + } $l = date($this->label_formatstr, $aVal); if ($this->label_formatstr == 'W') { @@ -4861,10 +4899,9 @@ class LinearTicks extends Ticks } else { if ($this->label_dateformatstr !== '') { // Adjust the value to take daylight savings into account - if (date("I", $aVal)==1 && $this->iAdjustForDST) { - // DST - $aVal+=3600; - } + if (date("I", $aVal)==1 && $this->iAdjustForDST) { // DST + $aVal+=3600; + } $l = date($this->label_dateformatstr, $aVal); if ($this->label_formatstr == 'W') { @@ -4879,8 +4916,9 @@ class LinearTicks extends Ticks } else { $l = sprintf('%01.'.$precision.'f', round($aVal, $precision)); } - - if (($this->supress_zerolabel && $l==0) || ($this->supress_first && $aIdx==0) || ($this->supress_last && $aIdx==$aNbrTicks-1)) { + + if (($this->supress_zerolabel && $l==0) || ($this->supress_first && $aIdx==0) || + ($this->supress_last && $aIdx==$aNbrTicks-1)) { $l=''; } return $l; @@ -4896,7 +4934,7 @@ class LinearTicks extends Ticks // with the result from round() can give wrong result, such that // (40 < 40) == TRUE !!! $limit = (int)$aScale->scale_abs[1]; - + // A text scale doesn't have any minor ticks if (!$aScale->textscale) { // Stroke minor ticks @@ -4905,7 +4943,7 @@ class LinearTicks extends Ticks $n = count($this->ticks_pos); for ($i=0; $i < $n; ++$i) { if (!$this->supress_tickmarks && !$this->supress_minor_tickmarks) { - if ($this->mincolor != '') { + if ($this->mincolor!="") { $aImg->PushColor($this->mincolor); } if ($hor) { @@ -4915,7 +4953,7 @@ class LinearTicks extends Ticks //if( $this->ticks_pos[$i] >= $limit ) $aImg->Line($aPos, $this->ticks_pos[$i], $xr, $this->ticks_pos[$i]); } - if ($this->mincolor != '') { + if ($this->mincolor!="") { $aImg->PopColor(); } } @@ -4929,7 +4967,7 @@ class LinearTicks extends Ticks $n = count($this->maj_ticks_pos); for ($i=0; $i < $n ; ++$i) { if (!($this->xtick_offset > 0 && $i==$nbrmajticks-1) && !$this->supress_tickmarks) { - if ($this->majcolor != '') { + if ($this->majcolor!="") { $aImg->PushColor($this->majcolor); } if ($hor) { @@ -4939,7 +4977,7 @@ class LinearTicks extends Ticks //if( $this->maj_ticks_pos[$i] >= $limit ) $aImg->Line($aPos, $this->maj_ticks_pos[$i], $xr, $this->maj_ticks_pos[$i]); } - if ($this->majcolor != '') { + if ($this->majcolor!="") { $aImg->PopColor(); } } @@ -4968,15 +5006,14 @@ class LinearTicks extends Ticks public function SetXLabelOffset($aLabelOff, $aTickOff=-1) { $this->xlabel_offset=$aLabelOff; - if ($aTickOff==-1) { - // Same as label offset + if ($aTickOff==-1) { // Same as label offset $this->xtick_offset=$aLabelOff; } else { $this->xtick_offset=$aTickOff; } if ($aLabelOff>0) { - $this->SupressLast(); // The last tick wont fit - } + $this->SupressLast(); + } // The last tick wont fit } // Which tick label should we start with? @@ -5008,35 +5045,37 @@ class LinearScale public $name = 'lin'; public $auto_ticks=false; // When using manual scale should the ticks be automatically set? public $world_abs_size; // Plot area size in pixels (Needed public in jpgraph_radar.php) + public $world_size; // Plot area size in world coordinates public $intscale=false; // Restrict autoscale to integers protected $autoscale_min=false; // Forced minimum value, auto determine max protected $autoscale_max=false; // Forced maximum value, auto determine min private $gracetop=0; private $gracebottom=0; - - private $_world_size; // Plot area size in world coordinates - - public function __construct($aMin=0, $aMax=0, $aType='y') + //--------------- + // CONSTRUCTOR + public function LinearScale($aMin=0, $aMax=0, $aType="y") { - assert($aType=='x' || $aType=='y'); + assert($aType=="x" || $aType=="y"); assert($aMin<=$aMax); - + $this->type=$aType; $this->scale=array($aMin,$aMax); $this->world_size=$aMax-$aMin; $this->ticks = new LinearTicks(); } + //--------------- + // PUBLIC METHODS // Check if scale is set or if we should autoscale // We should do this is either scale or ticks has not been set public function IsSpecified() { - if ($this->GetMinVal()==$this->GetMaxVal()) { // Scale not set + if ($this->GetMinVal()==$this->GetMaxVal()) { // Scale not set return false; } return true; } - + // Set the minimum data value when the autoscaling is used. // Usefull if you want a fix minimum (like 0) but have an // automatic maximum @@ -5064,24 +5103,24 @@ class LinearScale public function SetGrace($aGraceTop, $aGraceBottom=0) { if ($aGraceTop<0 || $aGraceBottom < 0) { - JpGraphError::RaiseL(25069);//(" Grace must be larger then 0"); - } + JpGraphError::RaiseL(25069); + }//(" Grace must be larger then 0"); $this->gracetop=$aGraceTop; $this->gracebottom=$aGraceBottom; } - + // Get the minimum value in the scale public function GetMinVal() { return $this->scale[0]; } - + // get maximum value for scale public function GetMaxVal() { return $this->scale[1]; } - + // Specify a new min/max value for sclae public function Update($aImg, $aMin, $aMax) { @@ -5089,40 +5128,40 @@ class LinearScale $this->world_size=$aMax-$aMin; $this->InitConstants($aImg); } - + // Translate between world and screen public function Translate($aCoord) { if (!is_numeric($aCoord)) { if ($aCoord != '' && $aCoord != '-' && $aCoord != 'x') { - JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.'); - } + JpGraphError::RaiseL(25070); + }//('Your data contains non-numeric values.'); return 0; } else { - return round($this->off+($aCoord - $this->scale[0]) * $this->scale_factor); + return $this->off+($aCoord - $this->scale[0]) * $this->scale_factor; } } - + // Relative translate (don't include offset) usefull when we just want // to know the relative position (in pixels) on the axis public function RelTranslate($aCoord) { if (!is_numeric($aCoord)) { if ($aCoord != '' && $aCoord != '-' && $aCoord != 'x') { - JpGraphError::RaiseL(25070);//('Your data contains non-numeric values.'); - } + JpGraphError::RaiseL(25070); + }//('Your data contains non-numeric values.'); return 0; } else { return ($aCoord - $this->scale[0]) * $this->scale_factor; } } - + // Restrict autoscaling to only use integers public function SetIntScale($aIntScale=true) { $this->intscale=$aIntScale; } - + // Calculate an integer autoscale public function IntAutoScale($img, $min, $max, $maxsteps, $majend=true) { @@ -5134,7 +5173,7 @@ class LinearScale ++$max; } $maxsteps = floor($maxsteps); - + $gracetop=round(($this->gracetop/100.0)*abs($max-$min)); $gracebottom=round(($this->gracebottom/100.0)*abs($max-$min)); if (is_numeric($this->autoscale_min)) { @@ -5155,45 +5194,51 @@ class LinearScale ++$max; --$min; } - + $min -= $gracebottom; $max += $gracetop; // First get tickmarks as multiples of 1, 10, ... if ($majend) { - list($num1steps, $adj1min, $adj1max, $maj1step) = $this->IntCalcTicks($maxsteps, $min, $max, 1); + list($num1steps, $adj1min, $adj1max, $maj1step) = + $this->IntCalcTicks($maxsteps, $min, $max, 1); } else { $adj1min = $min; $adj1max = $max; - list($num1steps, $maj1step) = $this->IntCalcTicksFreeze($maxsteps, $min, $max, 1); + list($num1steps, $maj1step) = + $this->IntCalcTicksFreeze($maxsteps, $min, $max, 1); } if (abs($min-$max) > 2) { // Then get tick marks as 2:s 2, 20, ... if ($majend) { - list($num2steps, $adj2min, $adj2max, $maj2step) = $this->IntCalcTicks($maxsteps, $min, $max, 5); + list($num2steps, $adj2min, $adj2max, $maj2step) = + $this->IntCalcTicks($maxsteps, $min, $max, 5); } else { $adj2min = $min; $adj2max = $max; - list($num2steps, $maj2step) = $this->IntCalcTicksFreeze($maxsteps, $min, $max, 5); + list($num2steps, $maj2step) = + $this->IntCalcTicksFreeze($maxsteps, $min, $max, 5); } } else { - $num2steps = 10000; // Dummy high value so we don't choose this + $num2steps = 10000; // Dummy high value so we don't choose this } - + if (abs($min-$max) > 5) { // Then get tickmarks as 5:s 5, 50, 500, ... if ($majend) { - list($num5steps, $adj5min, $adj5max, $maj5step) = $this->IntCalcTicks($maxsteps, $min, $max, 2); + list($num5steps, $adj5min, $adj5max, $maj5step) = + $this->IntCalcTicks($maxsteps, $min, $max, 2); } else { $adj5min = $min; $adj5max = $max; - list($num5steps, $maj5step) = $this->IntCalcTicksFreeze($maxsteps, $min, $max, 2); + list($num5steps, $maj5step) = + $this->IntCalcTicksFreeze($maxsteps, $min, $max, 2); } } else { - $num5steps = 10000; // Dummy high value so we don't choose this + $num5steps = 10000; // Dummy high value so we don't choose this } - + // Check to see whichof 1:s, 2:s or 5:s fit better with // the requested number of major ticks $match1=abs($num1steps-$maxsteps); @@ -5201,9 +5246,9 @@ class LinearScale if (!empty($maj5step) && $maj5step > 1) { $match5=abs($num5steps-$maxsteps); } else { - $match5=10000; // Dummy high value - } - + $match5=10000; + } // Dummy high value + // Compare these three values and see which is the closest match // We use a 0.6 weight to gravitate towards multiple of 5:s if ($match1 < $match2) { @@ -5221,49 +5266,45 @@ class LinearScale } // Minsteps are always the same as maxsteps for integer scale switch ($r) { - case 1: - $this->ticks->Set($maj1step, $maj1step); - $this->Update($img, $adj1min, $adj1max); - break; - case 2: - $this->ticks->Set($maj2step, $maj2step); - $this->Update($img, $adj2min, $adj2max); - break; - case 3: - $this->ticks->Set($maj5step, $maj5step); - $this->Update($img, $adj5min, $adj5max); - break; - default: - JpGraphError::RaiseL(25073, $r);//('Internal error. Integer scale algorithm comparison out of bound (r=$r)'); - } + case 1: + $this->ticks->Set($maj1step, $maj1step); + $this->Update($img, $adj1min, $adj1max); + break; + case 2: + $this->ticks->Set($maj2step, $maj2step); + $this->Update($img, $adj2min, $adj2max); + break; + case 3: + $this->ticks->Set($maj5step, $maj5step); + $this->Update($img, $adj5min, $adj5max); + break; + default: + JpGraphError::RaiseL(25073, $r);//('Internal error. Integer scale algorithm comparison out of bound (r=$r)'); } - - + } + + // Calculate autoscale. Used if user hasn't given a scale and ticks // $maxsteps is the maximum number of major tickmarks allowed. public function AutoScale($img, $min, $max, $maxsteps, $majend=true) { - if (!is_numeric($min) || !is_numeric($max)) { - JpGraphError::Raise(25044); - } - if ($this->intscale) { $this->IntAutoScale($img, $min, $max, $maxsteps, $majend); return; } if (abs($min-$max) < 0.00001) { // We need some difference to be able to autoscale - // make it 5% above and 5% below value - if ($min==0 && $max==0) { // Special case - $min=-1; - $max=1; - } else { - $delta = (abs($max)+abs($min))*0.005; - $min -= $delta; - $max += $delta; - } + // make it 5% above and 5% below value + if ($min==0 && $max==0) { // Special case + $min=-1; + $max=1; + } else { + $delta = (abs($max)+abs($min))*0.005; + $min -= $delta; + $max += $delta; } - + } + $gracetop=($this->gracetop/100.0)*abs($max-$min); $gracebottom=($this->gracebottom/100.0)*abs($max-$min); if (is_numeric($this->autoscale_min)) { @@ -5271,7 +5312,7 @@ class LinearScale if ($min >= $max) { JpGraphError::RaiseL(25071);//('You have specified a min value with SetAutoMin() which is larger than the maximum value used for the scale. This is not possible.'); } - if (abs($min-$max) < 0.001) { + if (abs($min-$max) < 0.00001) { $max *= 1.2; } } @@ -5281,7 +5322,7 @@ class LinearScale if ($min >= $max) { JpGraphError::RaiseL(25072);//('You have specified a max value with SetAutoMax() which is smaller than the miminum value used for the scale. This is not possible.'); } - if (abs($min-$max) < 0.001) { + if (abs($min-$max) < 0.00001) { $min *= 0.8; } } @@ -5289,31 +5330,38 @@ class LinearScale $min -= $gracebottom; $max += $gracetop; + // First get tickmarks as multiples of 0.1, 1, 10, ... if ($majend) { - list($num1steps, $adj1min, $adj1max, $min1step, $maj1step) = $this->CalcTicks($maxsteps, $min, $max, 1, 2); + list($num1steps, $adj1min, $adj1max, $min1step, $maj1step) = + $this->CalcTicks($maxsteps, $min, $max, 1, 2); } else { $adj1min=$min; $adj1max=$max; - list($num1steps, $min1step, $maj1step) = $this->CalcTicksFreeze($maxsteps, $min, $max, 1, 2, false); + list($num1steps, $min1step, $maj1step) = + $this->CalcTicksFreeze($maxsteps, $min, $max, 1, 2, false); } - + // Then get tick marks as 2:s 0.2, 2, 20, ... if ($majend) { - list($num2steps, $adj2min, $adj2max, $min2step, $maj2step) = $this->CalcTicks($maxsteps, $min, $max, 5, 2); + list($num2steps, $adj2min, $adj2max, $min2step, $maj2step) = + $this->CalcTicks($maxsteps, $min, $max, 5, 2); } else { $adj2min=$min; $adj2max=$max; - list($num2steps, $min2step, $maj2step) = $this->CalcTicksFreeze($maxsteps, $min, $max, 5, 2, false); + list($num2steps, $min2step, $maj2step) = + $this->CalcTicksFreeze($maxsteps, $min, $max, 5, 2, false); } - + // Then get tickmarks as 5:s 0.05, 0.5, 5, 50, ... if ($majend) { - list($num5steps, $adj5min, $adj5max, $min5step, $maj5step) = $this->CalcTicks($maxsteps, $min, $max, 2, 5); + list($num5steps, $adj5min, $adj5max, $min5step, $maj5step) = + $this->CalcTicks($maxsteps, $min, $max, 2, 5); } else { $adj5min=$min; $adj5max=$max; - list($num5steps, $min5step, $maj5step) = $this->CalcTicksFreeze($maxsteps, $min, $max, 2, 5, false); + list($num5steps, $min5step, $maj5step) = + $this->CalcTicksFreeze($maxsteps, $min, $max, 2, 5, false); } // Check to see whichof 1:s, 2:s or 5:s fit better with @@ -5321,24 +5369,23 @@ class LinearScale $match1=abs($num1steps-$maxsteps); $match2=abs($num2steps-$maxsteps); $match5=abs($num5steps-$maxsteps); - // Compare these three values and see which is the closest match // We use a 0.8 weight to gravitate towards multiple of 5:s $r=$this->MatchMin3($match1, $match2, $match5, 0.8); switch ($r) { - case 1: - $this->Update($img, $adj1min, $adj1max); - $this->ticks->Set($maj1step, $min1step); - break; - case 2: - $this->Update($img, $adj2min, $adj2max); - $this->ticks->Set($maj2step, $min2step); - break; - case 3: - $this->Update($img, $adj5min, $adj5max); - $this->ticks->Set($maj5step, $min5step); - break; - } + case 1: + $this->Update($img, $adj1min, $adj1max); + $this->ticks->Set($maj1step, $min1step); + break; + case 2: + $this->Update($img, $adj2min, $adj2max); + $this->ticks->Set($maj2step, $min2step); + break; + case 3: + $this->Update($img, $adj5min, $adj5max); + $this->ticks->Set($maj5step, $min5step); + break; + } } //--------------- @@ -5350,57 +5397,57 @@ class LinearScale // that image. Should really be installed as an observer of that image. public function InitConstants($img) { - if ($this->type=='x') { + if ($this->type=="x") { $this->world_abs_size=$img->width - $img->left_margin - $img->right_margin; $this->off=$img->left_margin; $this->scale_factor = 0; if ($this->world_size > 0) { - $this->scale_factor=$this->world_abs_size/($this->world_size*0.999999); + $this->scale_factor=$this->world_abs_size/($this->world_size*1.0); } } else { // y scale $this->world_abs_size=$img->height - $img->top_margin - $img->bottom_margin; $this->off=$img->top_margin+$this->world_abs_size; $this->scale_factor = 0; if ($this->world_size > 0) { - $this->scale_factor=-$this->world_abs_size/($this->world_size*0.999999); + $this->scale_factor=-$this->world_abs_size/($this->world_size*1.0); } } $size = $this->world_size * $this->scale_factor; $this->scale_abs=array($this->off,$this->off + $size); } - + // Initialize the conversion constants for this scale // This tries to pre-calculate as much as possible to speed up the // actual conversion (with Translate()) later on - // $start =scale start in absolute pixels (for x-scale this is an y-position - // and for an y-scale this is an x-position - // $len =absolute length in pixels of scale + // $start =scale start in absolute pixels (for x-scale this is an y-position + // and for an y-scale this is an x-position + // $len =absolute length in pixels of scale public function SetConstants($aStart, $aLen) { $this->world_abs_size=$aLen; $this->off=$aStart; - + if ($this->world_size<=0) { // This should never ever happen !! JpGraphError::RaiseL(25074); - //("You have unfortunately stumbled upon a bug in JpGraph. It seems like the scale range is ".$this->world_size." [for ".$this->type." scale]
Please report Bug #01 to info@jpgraph.net and include the script that gave this error. This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the autoscaling to fail."); + //("You have unfortunately stumbled upon a bug in JpGraph. It seems like the scale range is ".$this->world_size." [for ".$this->type." scale]
Please report Bug #01 to jpgraph@aditus.nu and include the script that gave this error. This problem could potentially be caused by trying to use \"illegal\" values in the input data arrays (like trying to send in strings or only NULL values) which causes the autoscaling to fail."); } - + // scale_factor = number of pixels per world unit $this->scale_factor=$this->world_abs_size/($this->world_size*1.0); - + // scale_abs = start and end points of scale in absolute pixels $this->scale_abs=array($this->off,$this->off+$this->world_size*$this->scale_factor); } - - + + // Calculate number of ticks steps with a specific division // $a is the divisor of 10**x to generate the first maj tick intervall // $a=1, $b=2 give major ticks with multiple of 10, ...,0.1,1,10,... // $a=5, $b=2 give major ticks with multiple of 2:s ...,0.2,2,20,... // $a=2, $b=5 give major ticks with multiple of 5:s ...,0.5,5,50,... // We return a vector of - // [$numsteps,$adjmin,$adjmax,$minstep,$majstep] + // [$numsteps,$adjmin,$adjmax,$minstep,$majstep] // If $majend==true then the first and last marks on the axis will be major // labeled tick marks otherwise it will be adjusted to the closest min tick mark public function CalcTicks($maxsteps, $min, $max, $a, $b, $majend=true) @@ -5416,16 +5463,16 @@ class LinearScale if ($min>0 && $min < pow(10, $ld)) { $min=0; } - + //$majstep=pow(10,$ld-1)/$a; $majstep=pow(10, $ld)/$a; $minstep=$majstep/$b; - + $adjmax=ceil($max/$minstep)*$minstep; $adjmin=floor($min/$minstep)*$minstep; $adjdiff = $adjmax-$adjmin; $numsteps=$adjdiff/$majstep; - + while ($numsteps>$maxsteps) { $majstep=pow(10, $ld)/$a; $numsteps=$adjdiff/$majstep; @@ -5460,7 +5507,7 @@ class LinearScale $majstep=pow(10, $ld)/$a; $minstep=$majstep/$b; $numsteps=floor($diff/$majstep); - + while ($numsteps > $maxsteps) { $majstep=pow(10, $ld)/$a; $numsteps=floor($diff/$majstep); @@ -5470,23 +5517,26 @@ class LinearScale return array($numsteps,$minstep,$majstep); } - + public function IntCalcTicks($maxsteps, $min, $max, $a, $majend=true) { $diff=$max-$min; if ($diff==0) { - JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.'); - } else { + JpGraphError::RaiseL(25075); + }//('Can\'t automatically determine ticks since min==max.'); + else { $ld=floor(log10($diff)); } - + // Gravitate min towards zero if we are close if ($min>0 && $min < pow(10, $ld)) { $min=0; } + if ($ld == 0) { $ld=1; } + if ($a == 1) { $majstep = 1; } else { @@ -5502,7 +5552,7 @@ class LinearScale $numsteps=$adjdiff/$majstep; ++$ld; } - + $adjmin=floor($min/$majstep)*$majstep; $adjdiff = $adjmax-$adjmin; if ($majend) { @@ -5512,7 +5562,7 @@ class LinearScale } else { $adjmax=ceil($max/$majstep)*$majstep; } - + return array($numsteps,$adjmin,$adjmax,$majstep); } @@ -5522,13 +5572,16 @@ class LinearScale // Same as IntCalcTick but don't change min/max values $diff=$max-$min; if ($diff==0) { - JpGraphError::RaiseL(25075);//('Can\'t automatically determine ticks since min==max.'); - } else { + JpGraphError::RaiseL(25075); + }//('Can\'t automatically determine ticks since min==max.'); + else { $ld=floor(log10($diff)); } + if ($ld == 0) { $ld=1; } + if ($a == 1) { $majstep = 1; } else { @@ -5541,42 +5594,1023 @@ class LinearScale $numsteps=floor($diff/$majstep); ++$ld; } - + return array($numsteps,$majstep); } + + // Determine the minimum of three values witha weight for last value public function MatchMin3($a, $b, $c, $weight) { if ($a < $b) { if ($a < ($c*$weight)) { - return 1; // $a smallest - } else { - return 3; // $c smallest - } + return 1; + } // $a smallest + else { + return 3; + } // $c smallest } elseif ($b < ($c*$weight)) { - return 2; // $b smallest - } - return 3; // $c smallest - } - - public function __get($name) - { - $variable_name = '_' . $name; - - if (isset($this->$variable_name)) { - return $this->$variable_name * SUPERSAMPLING_SCALE; - } else { - JpGraphError::RaiseL('25132', $name); - } - } - - public function __set($name, $value) - { - $this->{'_'.$name} = $value; + return 2; + } // $b smallest + return 3; // $c smallest } } // Class +//=================================================== +// CLASS RGB +// Description: Color definitions as RGB triples +//=================================================== +class RGB +{ + public $rgb_table; + public $img; + + public function RGB($aImg=null) + { + $this->img = $aImg; + + // Conversion array between color names and RGB + $this->rgb_table = array( + "aqua"=> array(0,255,255), + "lime"=> array(0,255,0), + "teal"=> array(0,128,128), + "whitesmoke"=>array(245,245,245), + "gainsboro"=>array(220,220,220), + "oldlace"=>array(253,245,230), + "linen"=>array(250,240,230), + "antiquewhite"=>array(250,235,215), + "papayawhip"=>array(255,239,213), + "blanchedalmond"=>array(255,235,205), + "bisque"=>array(255,228,196), + "peachpuff"=>array(255,218,185), + "navajowhite"=>array(255,222,173), + "moccasin"=>array(255,228,181), + "cornsilk"=>array(255,248,220), + "ivory"=>array(255,255,240), + "lemonchiffon"=>array(255,250,205), + "seashell"=>array(255,245,238), + "mintcream"=>array(245,255,250), + "azure"=>array(240,255,255), + "aliceblue"=>array(240,248,255), + "lavender"=>array(230,230,250), + "lavenderblush"=>array(255,240,245), + "mistyrose"=>array(255,228,225), + "white"=>array(255,255,255), + "black"=>array(0,0,0), + "darkslategray"=>array(47,79,79), + "dimgray"=>array(105,105,105), + "slategray"=>array(112,128,144), + "lightslategray"=>array(119,136,153), + "gray"=>array(190,190,190), + "lightgray"=>array(211,211,211), + "midnightblue"=>array(25,25,112), + "navy"=>array(0,0,128), + "cornflowerblue"=>array(100,149,237), + "darkslateblue"=>array(72,61,139), + "slateblue"=>array(106,90,205), + "mediumslateblue"=>array(123,104,238), + "lightslateblue"=>array(132,112,255), + "mediumblue"=>array(0,0,205), + "royalblue"=>array(65,105,225), + "blue"=>array(0,0,255), + "dodgerblue"=>array(30,144,255), + "deepskyblue"=>array(0,191,255), + "skyblue"=>array(135,206,235), + "lightskyblue"=>array(135,206,250), + "steelblue"=>array(70,130,180), + "lightred"=>array(211,167,168), + "lightsteelblue"=>array(176,196,222), + "lightblue"=>array(173,216,230), + "powderblue"=>array(176,224,230), + "paleturquoise"=>array(175,238,238), + "darkturquoise"=>array(0,206,209), + "mediumturquoise"=>array(72,209,204), + "turquoise"=>array(64,224,208), + "cyan"=>array(0,255,255), + "lightcyan"=>array(224,255,255), + "cadetblue"=>array(95,158,160), + "mediumaquamarine"=>array(102,205,170), + "aquamarine"=>array(127,255,212), + "darkgreen"=>array(0,100,0), + "darkolivegreen"=>array(85,107,47), + "darkseagreen"=>array(143,188,143), + "seagreen"=>array(46,139,87), + "mediumseagreen"=>array(60,179,113), + "lightseagreen"=>array(32,178,170), + "palegreen"=>array(152,251,152), + "springgreen"=>array(0,255,127), + "lawngreen"=>array(124,252,0), + "green"=>array(0,255,0), + "chartreuse"=>array(127,255,0), + "mediumspringgreen"=>array(0,250,154), + "greenyellow"=>array(173,255,47), + "limegreen"=>array(50,205,50), + "yellowgreen"=>array(154,205,50), + "forestgreen"=>array(34,139,34), + "olivedrab"=>array(107,142,35), + "darkkhaki"=>array(189,183,107), + "khaki"=>array(240,230,140), + "palegoldenrod"=>array(238,232,170), + "lightgoldenrodyellow"=>array(250,250,210), + "lightyellow"=>array(255,255,200), + "yellow"=>array(255,255,0), + "gold"=>array(255,215,0), + "lightgoldenrod"=>array(238,221,130), + "goldenrod"=>array(218,165,32), + "darkgoldenrod"=>array(184,134,11), + "rosybrown"=>array(188,143,143), + "indianred"=>array(205,92,92), + "saddlebrown"=>array(139,69,19), + "sienna"=>array(160,82,45), + "peru"=>array(205,133,63), + "burlywood"=>array(222,184,135), + "beige"=>array(245,245,220), + "wheat"=>array(245,222,179), + "sandybrown"=>array(244,164,96), + "tan"=>array(210,180,140), + "chocolate"=>array(210,105,30), + "firebrick"=>array(178,34,34), + "brown"=>array(165,42,42), + "darksalmon"=>array(233,150,122), + "salmon"=>array(250,128,114), + "lightsalmon"=>array(255,160,122), + "orange"=>array(255,165,0), + "darkorange"=>array(255,140,0), + "coral"=>array(255,127,80), + "lightcoral"=>array(240,128,128), + "tomato"=>array(255,99,71), + "orangered"=>array(255,69,0), + "red"=>array(255,0,0), + "hotpink"=>array(255,105,180), + "deeppink"=>array(255,20,147), + "pink"=>array(255,192,203), + "lightpink"=>array(255,182,193), + "palevioletred"=>array(219,112,147), + "maroon"=>array(176,48,96), + "mediumvioletred"=>array(199,21,133), + "violetred"=>array(208,32,144), + "magenta"=>array(255,0,255), + "violet"=>array(238,130,238), + "plum"=>array(221,160,221), + "orchid"=>array(218,112,214), + "mediumorchid"=>array(186,85,211), + "darkorchid"=>array(153,50,204), + "darkviolet"=>array(148,0,211), + "blueviolet"=>array(138,43,226), + "purple"=>array(160,32,240), + "mediumpurple"=>array(147,112,219), + "thistle"=>array(216,191,216), + "snow1"=>array(255,250,250), + "snow2"=>array(238,233,233), + "snow3"=>array(205,201,201), + "snow4"=>array(139,137,137), + "seashell1"=>array(255,245,238), + "seashell2"=>array(238,229,222), + "seashell3"=>array(205,197,191), + "seashell4"=>array(139,134,130), + "AntiqueWhite1"=>array(255,239,219), + "AntiqueWhite2"=>array(238,223,204), + "AntiqueWhite3"=>array(205,192,176), + "AntiqueWhite4"=>array(139,131,120), + "bisque1"=>array(255,228,196), + "bisque2"=>array(238,213,183), + "bisque3"=>array(205,183,158), + "bisque4"=>array(139,125,107), + "peachPuff1"=>array(255,218,185), + "peachpuff2"=>array(238,203,173), + "peachpuff3"=>array(205,175,149), + "peachpuff4"=>array(139,119,101), + "navajowhite1"=>array(255,222,173), + "navajowhite2"=>array(238,207,161), + "navajowhite3"=>array(205,179,139), + "navajowhite4"=>array(139,121,94), + "lemonchiffon1"=>array(255,250,205), + "lemonchiffon2"=>array(238,233,191), + "lemonchiffon3"=>array(205,201,165), + "lemonchiffon4"=>array(139,137,112), + "ivory1"=>array(255,255,240), + "ivory2"=>array(238,238,224), + "ivory3"=>array(205,205,193), + "ivory4"=>array(139,139,131), + "honeydew"=>array(193,205,193), + "lavenderblush1"=>array(255,240,245), + "lavenderblush2"=>array(238,224,229), + "lavenderblush3"=>array(205,193,197), + "lavenderblush4"=>array(139,131,134), + "mistyrose1"=>array(255,228,225), + "mistyrose2"=>array(238,213,210), + "mistyrose3"=>array(205,183,181), + "mistyrose4"=>array(139,125,123), + "azure1"=>array(240,255,255), + "azure2"=>array(224,238,238), + "azure3"=>array(193,205,205), + "azure4"=>array(131,139,139), + "slateblue1"=>array(131,111,255), + "slateblue2"=>array(122,103,238), + "slateblue3"=>array(105,89,205), + "slateblue4"=>array(71,60,139), + "royalblue1"=>array(72,118,255), + "royalblue2"=>array(67,110,238), + "royalblue3"=>array(58,95,205), + "royalblue4"=>array(39,64,139), + "dodgerblue1"=>array(30,144,255), + "dodgerblue2"=>array(28,134,238), + "dodgerblue3"=>array(24,116,205), + "dodgerblue4"=>array(16,78,139), + "steelblue1"=>array(99,184,255), + "steelblue2"=>array(92,172,238), + "steelblue3"=>array(79,148,205), + "steelblue4"=>array(54,100,139), + "deepskyblue1"=>array(0,191,255), + "deepskyblue2"=>array(0,178,238), + "deepskyblue3"=>array(0,154,205), + "deepskyblue4"=>array(0,104,139), + "skyblue1"=>array(135,206,255), + "skyblue2"=>array(126,192,238), + "skyblue3"=>array(108,166,205), + "skyblue4"=>array(74,112,139), + "lightskyblue1"=>array(176,226,255), + "lightskyblue2"=>array(164,211,238), + "lightskyblue3"=>array(141,182,205), + "lightskyblue4"=>array(96,123,139), + "slategray1"=>array(198,226,255), + "slategray2"=>array(185,211,238), + "slategray3"=>array(159,182,205), + "slategray4"=>array(108,123,139), + "lightsteelblue1"=>array(202,225,255), + "lightsteelblue2"=>array(188,210,238), + "lightsteelblue3"=>array(162,181,205), + "lightsteelblue4"=>array(110,123,139), + "lightblue1"=>array(191,239,255), + "lightblue2"=>array(178,223,238), + "lightblue3"=>array(154,192,205), + "lightblue4"=>array(104,131,139), + "lightcyan1"=>array(224,255,255), + "lightcyan2"=>array(209,238,238), + "lightcyan3"=>array(180,205,205), + "lightcyan4"=>array(122,139,139), + "paleturquoise1"=>array(187,255,255), + "paleturquoise2"=>array(174,238,238), + "paleturquoise3"=>array(150,205,205), + "paleturquoise4"=>array(102,139,139), + "cadetblue1"=>array(152,245,255), + "cadetblue2"=>array(142,229,238), + "cadetblue3"=>array(122,197,205), + "cadetblue4"=>array(83,134,139), + "turquoise1"=>array(0,245,255), + "turquoise2"=>array(0,229,238), + "turquoise3"=>array(0,197,205), + "turquoise4"=>array(0,134,139), + "cyan1"=>array(0,255,255), + "cyan2"=>array(0,238,238), + "cyan3"=>array(0,205,205), + "cyan4"=>array(0,139,139), + "darkslategray1"=>array(151,255,255), + "darkslategray2"=>array(141,238,238), + "darkslategray3"=>array(121,205,205), + "darkslategray4"=>array(82,139,139), + "aquamarine1"=>array(127,255,212), + "aquamarine2"=>array(118,238,198), + "aquamarine3"=>array(102,205,170), + "aquamarine4"=>array(69,139,116), + "darkseagreen1"=>array(193,255,193), + "darkseagreen2"=>array(180,238,180), + "darkseagreen3"=>array(155,205,155), + "darkseagreen4"=>array(105,139,105), + "seagreen1"=>array(84,255,159), + "seagreen2"=>array(78,238,148), + "seagreen3"=>array(67,205,128), + "seagreen4"=>array(46,139,87), + "palegreen1"=>array(154,255,154), + "palegreen2"=>array(144,238,144), + "palegreen3"=>array(124,205,124), + "palegreen4"=>array(84,139,84), + "springgreen1"=>array(0,255,127), + "springgreen2"=>array(0,238,118), + "springgreen3"=>array(0,205,102), + "springgreen4"=>array(0,139,69), + "chartreuse1"=>array(127,255,0), + "chartreuse2"=>array(118,238,0), + "chartreuse3"=>array(102,205,0), + "chartreuse4"=>array(69,139,0), + "olivedrab1"=>array(192,255,62), + "olivedrab2"=>array(179,238,58), + "olivedrab3"=>array(154,205,50), + "olivedrab4"=>array(105,139,34), + "darkolivegreen1"=>array(202,255,112), + "darkolivegreen2"=>array(188,238,104), + "darkolivegreen3"=>array(162,205,90), + "darkolivegreen4"=>array(110,139,61), + "khaki1"=>array(255,246,143), + "khaki2"=>array(238,230,133), + "khaki3"=>array(205,198,115), + "khaki4"=>array(139,134,78), + "lightgoldenrod1"=>array(255,236,139), + "lightgoldenrod2"=>array(238,220,130), + "lightgoldenrod3"=>array(205,190,112), + "lightgoldenrod4"=>array(139,129,76), + "yellow1"=>array(255,255,0), + "yellow2"=>array(238,238,0), + "yellow3"=>array(205,205,0), + "yellow4"=>array(139,139,0), + "gold1"=>array(255,215,0), + "gold2"=>array(238,201,0), + "gold3"=>array(205,173,0), + "gold4"=>array(139,117,0), + "goldenrod1"=>array(255,193,37), + "goldenrod2"=>array(238,180,34), + "goldenrod3"=>array(205,155,29), + "goldenrod4"=>array(139,105,20), + "darkgoldenrod1"=>array(255,185,15), + "darkgoldenrod2"=>array(238,173,14), + "darkgoldenrod3"=>array(205,149,12), + "darkgoldenrod4"=>array(139,101,8), + "rosybrown1"=>array(255,193,193), + "rosybrown2"=>array(238,180,180), + "rosybrown3"=>array(205,155,155), + "rosybrown4"=>array(139,105,105), + "indianred1"=>array(255,106,106), + "indianred2"=>array(238,99,99), + "indianred3"=>array(205,85,85), + "indianred4"=>array(139,58,58), + "sienna1"=>array(255,130,71), + "sienna2"=>array(238,121,66), + "sienna3"=>array(205,104,57), + "sienna4"=>array(139,71,38), + "burlywood1"=>array(255,211,155), + "burlywood2"=>array(238,197,145), + "burlywood3"=>array(205,170,125), + "burlywood4"=>array(139,115,85), + "wheat1"=>array(255,231,186), + "wheat2"=>array(238,216,174), + "wheat3"=>array(205,186,150), + "wheat4"=>array(139,126,102), + "tan1"=>array(255,165,79), + "tan2"=>array(238,154,73), + "tan3"=>array(205,133,63), + "tan4"=>array(139,90,43), + "chocolate1"=>array(255,127,36), + "chocolate2"=>array(238,118,33), + "chocolate3"=>array(205,102,29), + "chocolate4"=>array(139,69,19), + "firebrick1"=>array(255,48,48), + "firebrick2"=>array(238,44,44), + "firebrick3"=>array(205,38,38), + "firebrick4"=>array(139,26,26), + "brown1"=>array(255,64,64), + "brown2"=>array(238,59,59), + "brown3"=>array(205,51,51), + "brown4"=>array(139,35,35), + "salmon1"=>array(255,140,105), + "salmon2"=>array(238,130,98), + "salmon3"=>array(205,112,84), + "salmon4"=>array(139,76,57), + "lightsalmon1"=>array(255,160,122), + "lightsalmon2"=>array(238,149,114), + "lightsalmon3"=>array(205,129,98), + "lightsalmon4"=>array(139,87,66), + "orange1"=>array(255,165,0), + "orange2"=>array(238,154,0), + "orange3"=>array(205,133,0), + "orange4"=>array(139,90,0), + "darkorange1"=>array(255,127,0), + "darkorange2"=>array(238,118,0), + "darkorange3"=>array(205,102,0), + "darkorange4"=>array(139,69,0), + "coral1"=>array(255,114,86), + "coral2"=>array(238,106,80), + "coral3"=>array(205,91,69), + "coral4"=>array(139,62,47), + "tomato1"=>array(255,99,71), + "tomato2"=>array(238,92,66), + "tomato3"=>array(205,79,57), + "tomato4"=>array(139,54,38), + "orangered1"=>array(255,69,0), + "orangered2"=>array(238,64,0), + "orangered3"=>array(205,55,0), + "orangered4"=>array(139,37,0), + "deeppink1"=>array(255,20,147), + "deeppink2"=>array(238,18,137), + "deeppink3"=>array(205,16,118), + "deeppink4"=>array(139,10,80), + "hotpink1"=>array(255,110,180), + "hotpink2"=>array(238,106,167), + "hotpink3"=>array(205,96,144), + "hotpink4"=>array(139,58,98), + "pink1"=>array(255,181,197), + "pink2"=>array(238,169,184), + "pink3"=>array(205,145,158), + "pink4"=>array(139,99,108), + "lightpink1"=>array(255,174,185), + "lightpink2"=>array(238,162,173), + "lightpink3"=>array(205,140,149), + "lightpink4"=>array(139,95,101), + "palevioletred1"=>array(255,130,171), + "palevioletred2"=>array(238,121,159), + "palevioletred3"=>array(205,104,137), + "palevioletred4"=>array(139,71,93), + "maroon1"=>array(255,52,179), + "maroon2"=>array(238,48,167), + "maroon3"=>array(205,41,144), + "maroon4"=>array(139,28,98), + "violetred1"=>array(255,62,150), + "violetred2"=>array(238,58,140), + "violetred3"=>array(205,50,120), + "violetred4"=>array(139,34,82), + "magenta1"=>array(255,0,255), + "magenta2"=>array(238,0,238), + "magenta3"=>array(205,0,205), + "magenta4"=>array(139,0,139), + "mediumred"=>array(140,34,34), + "orchid1"=>array(255,131,250), + "orchid2"=>array(238,122,233), + "orchid3"=>array(205,105,201), + "orchid4"=>array(139,71,137), + "plum1"=>array(255,187,255), + "plum2"=>array(238,174,238), + "plum3"=>array(205,150,205), + "plum4"=>array(139,102,139), + "mediumorchid1"=>array(224,102,255), + "mediumorchid2"=>array(209,95,238), + "mediumorchid3"=>array(180,82,205), + "mediumorchid4"=>array(122,55,139), + "darkorchid1"=>array(191,62,255), + "darkorchid2"=>array(178,58,238), + "darkorchid3"=>array(154,50,205), + "darkorchid4"=>array(104,34,139), + "purple1"=>array(155,48,255), + "purple2"=>array(145,44,238), + "purple3"=>array(125,38,205), + "purple4"=>array(85,26,139), + "mediumpurple1"=>array(171,130,255), + "mediumpurple2"=>array(159,121,238), + "mediumpurple3"=>array(137,104,205), + "mediumpurple4"=>array(93,71,139), + "thistle1"=>array(255,225,255), + "thistle2"=>array(238,210,238), + "thistle3"=>array(205,181,205), + "thistle4"=>array(139,123,139), + "gray1"=>array(10,10,10), + "gray2"=>array(40,40,30), + "gray3"=>array(70,70,70), + "gray4"=>array(100,100,100), + "gray5"=>array(130,130,130), + "gray6"=>array(160,160,160), + "gray7"=>array(190,190,190), + "gray8"=>array(210,210,210), + "gray9"=>array(240,240,240), + "darkgray"=>array(100,100,100), + "darkblue"=>array(0,0,139), + "darkcyan"=>array(0,139,139), + "darkmagenta"=>array(139,0,139), + "darkred"=>array(139,0,0), + "silver"=>array(192, 192, 192), + "eggplant"=>array(144,176,168), + "lightgreen"=>array(144,238,144)); + } + //---------------- + // PUBLIC METHODS + // Colors can be specified as either + // 1. #xxxxxx HTML style + // 2. "colorname" as a named color + // 3. array(r,g,b) RGB triple + // This function translates this to a native RGB format and returns an + // RGB triple. + public function Color($aColor) + { + if (is_string($aColor)) { + // Strip of any alpha factor + $pos = strpos($aColor, '@'); + if ($pos === false) { + $alpha = 0; + } else { + $pos2 = strpos($aColor, ':'); + if ($pos2===false) { + $pos2 = $pos-1; + } // Sentinel + if ($pos > $pos2) { + $alpha = str_replace(',', '.', substr($aColor, $pos+1)); + $aColor = substr($aColor, 0, $pos); + } else { + $alpha = substr($aColor, $pos+1, $pos2-$pos-1); + $aColor = substr($aColor, 0, $pos).substr($aColor, $pos2); + } + } + + // Extract potential adjustment figure at end of color + // specification + $pos = strpos($aColor, ":"); + if ($pos === false) { + $adj = 1.0; + } else { + $adj = 0.0 + str_replace(',', '.', substr($aColor, $pos+1)); + $aColor = substr($aColor, 0, $pos); + } + if ($adj < 0) { + JpGraphError::RaiseL(25077); + }//('Adjustment factor for color must be > 0'); + + if (substr($aColor, 0, 1) == "#") { + $r = hexdec(substr($aColor, 1, 2)); + $g = hexdec(substr($aColor, 3, 2)); + $b = hexdec(substr($aColor, 5, 2)); + } else { + if (!isset($this->rgb_table[$aColor])) { + JpGraphError::RaiseL(25078, $aColor); + }//(" Unknown color: $aColor"); + $tmp=$this->rgb_table[$aColor]; + $r = $tmp[0]; + $g = $tmp[1]; + $b = $tmp[2]; + } + // Scale adj so that an adj=2 always + // makes the color 100% white (i.e. 255,255,255. + // and adj=1 neutral and adj=0 black. + if ($adj > 1) { + $m = ($adj-1.0)*(255-min(255, min($r, min($g, $b)))); + return array(min(255, $r+$m), min(255, $g+$m), min(255, $b+$m),$alpha); + } elseif ($adj < 1) { + $m = ($adj-1.0)*max(255, max($r, max($g, $b))); + return array(max(0, $r+$m), max(0, $g+$m), max(0, $b+$m),$alpha); + } else { + return array($r,$g,$b,$alpha); + } + } elseif (is_array($aColor)) { + if (count($aColor)==3) { + $aColor[3]=0; + return $aColor; + } else { + return $aColor; + } + } else { + JpGraphError::RaiseL(25079, $aColor, count($aColor)); + }//(" Unknown color specification: $aColor , size=".count($aColor)); + } + + // Compare two colors + // return true if equal + public function Equal($aCol1, $aCol2) + { + $c1 = $this->Color($aCol1); + $c2 = $this->Color($aCol2); + if ($c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2]) { + return true; + } else { + return false; + } + } + + // Allocate a new color in the current image + // Return new color index, -1 if no more colors could be allocated + public function Allocate($aColor, $aAlpha=0.0) + { + list($r, $g, $b, $a) = $this->color($aColor); + // If alpha is specified in the color string then this + // takes precedence over the second argument + if ($a > 0) { + $aAlpha = $a; + } + if ($aAlpha < 0 || $aAlpha > 1) { + JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0'); + } + return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127)); + } +} // Class + + +//=================================================== +// CLASS Legend +// Description: Responsible for drawing the box containing +// all the legend text for the graph +//=================================================== +DEFINE('_DEFAULT_LPM_SIZE', 8); +class Legend +{ + public $txtcol=array(); + private $color=array(0,0,0); // Default fram color + private $fill_color=array(235,235,235); // Default fill color + private $shadow=true; // Shadow around legend "box" + private $shadow_color='darkgray@0.5'; + private $mark_abs_hsize=_DEFAULT_LPM_SIZE; + private $mark_abs_vsize=_DEFAULT_LPM_SIZE; + private $xmargin=10; + private $ymargin=3; + private $shadow_width=2; + private $xlmargin=2; + private $ylmargin=''; + private $xpos=0.05; + private $ypos=0.15; + private $xabspos=-1; + private $yabspos=-1; + private $halign="right"; + private $valign="top"; + private $font_family=FF_FONT1; + private $font_style=FS_NORMAL; + private $font_size=12; + private $font_color='black'; + private $hide=false; + private $layout_n=1; + private $weight=1; + private $frameweight=1; + private $csimareas=''; + private $reverse = false ; + //--------------- + // CONSTRUCTOR + public function Legend() + { + // Empty + } + //--------------- + // PUBLIC METHODS + public function Hide($aHide=true) + { + $this->hide=$aHide; + } + + public function SetHColMargin($aXMarg) + { + $this->xmargin = $aXMarg; + } + + public function SetVColMargin($aSpacing) + { + $this->ymargin = $aSpacing ; + } + + public function SetLeftMargin($aXMarg) + { + $this->xlmargin = $aXMarg; + } + + + // Synonym + public function SetLineSpacing($aSpacing) + { + $this->ymargin = $aSpacing ; + } + + public function SetShadow($aShow='gray', $aWidth=2) + { + if (is_string($aShow)) { + $this->shadow_color = $aShow; + $this->shadow=true; + } else { + $this->shadow=$aShow; + } + $this->shadow_width=$aWidth; + } + + public function SetMarkAbsSize($aSize) + { + $this->mark_abs_vsize = $aSize ; + $this->mark_abs_hsize = $aSize ; + } + + public function SetMarkAbsVSize($aSize) + { + $this->mark_abs_vsize = $aSize ; + } + + public function SetMarkAbsHSize($aSize) + { + $this->mark_abs_hsize = $aSize ; + } + + public function SetLineWeight($aWeight) + { + $this->weight = $aWeight; + } + + public function SetFrameWeight($aWeight) + { + $this->frameweight = $aWeight; + } + + public function SetLayout($aDirection=LEGEND_VERT) + { + $this->layout_n = $aDirection==LEGEND_VERT ? 1 : 99 ; + } + + public function SetColumns($aCols) + { + $this->layout_n = $aCols ; + } + + public function SetReverse($f=true) + { + $this->reverse = $f ; + } + + // Set color on frame around box + public function SetColor($aFontColor, $aColor='black') + { + $this->font_color=$aFontColor; + $this->color=$aColor; + } + + public function SetFont($aFamily, $aStyle=FS_NORMAL, $aSize=10) + { + $this->font_family = $aFamily; + $this->font_style = $aStyle; + $this->font_size = $aSize; + } + + public function SetPos($aX, $aY, $aHAlign="right", $aVAlign="top") + { + $this->Pos($aX, $aY, $aHAlign, $aVAlign); + } + + public function SetAbsPos($aX, $aY, $aHAlign="right", $aVAlign="top") + { + $this->xabspos=$aX; + $this->yabspos=$aY; + $this->halign=$aHAlign; + $this->valign=$aVAlign; + } + + + public function Pos($aX, $aY, $aHAlign="right", $aVAlign="top") + { + if (!($aX<1 && $aY<1)) { + JpGraphError::RaiseL(25120); + }//(" Position for legend must be given as percentage in range 0-1"); + $this->xpos=$aX; + $this->ypos=$aY; + $this->halign=$aHAlign; + $this->valign=$aVAlign; + } + + public function SetFillColor($aColor) + { + $this->fill_color=$aColor; + } + + public function Add($aTxt, $aColor, $aPlotmark='', $aLinestyle=0, $csimtarget='', $csimalt='', $csimwintarget='') + { + $this->txtcol[]=array($aTxt,$aColor,$aPlotmark,$aLinestyle,$csimtarget,$csimalt,$csimwintarget); + } + + public function GetCSIMAreas() + { + return $this->csimareas; + } + + public function Stroke(&$aImg) + { + // Constant + $fillBoxFrameWeight=1; + + if ($this->hide) { + return; + } + + $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); + + if ($this->reverse) { + $this->txtcol = array_reverse($this->txtcol); + } + + $n=count($this->txtcol); + if ($n == 0) { + return; + } + + // Find out the max width and height of each column to be able + // to size the legend box. + $numcolumns = ($n > $this->layout_n ? $this->layout_n : $n); + for ($i=0; $i < $numcolumns; ++$i) { + $colwidth[$i] = $aImg->GetTextWidth($this->txtcol[$i][0]) + + 2*$this->xmargin + 2*$this->mark_abs_hsize; + $colheight[$i] = 0; + } + + // Find our maximum height in each row + $rows = 0 ; + $rowheight[0] = 0; + for ($i=0; $i < $n; ++$i) { + $h = max($this->mark_abs_vsize, $aImg->GetTextHeight($this->txtcol[$i][0]))+$this->ymargin; + if ($i % $numcolumns == 0) { + $rows++; + $rowheight[$rows-1] = 0; + } + $rowheight[$rows-1] = max($rowheight[$rows-1], $h); + } + + $abs_height = 0; + for ($i=0; $i < $rows; ++$i) { + $abs_height += $rowheight[$i] ; + } + + // Make sure that the height is at least as high as mark size + ymargin + $abs_height = max($abs_height, $this->mark_abs_vsize); + + // We add 3 extra pixels height to compensate for the difficult in + // calculating font height + $abs_height += $this->ymargin+3; + + // Find out the maximum width in each column + for ($i=$numcolumns; $i < $n; ++$i) { + $colwidth[$i % $numcolumns] = max( + $aImg->GetTextWidth($this->txtcol[$i][0])+2*$this->xmargin+2*$this->mark_abs_hsize, + $colwidth[$i % $numcolumns] + ); + } + + // Get the total width + $mtw = 0; + for ($i=0; $i < $numcolumns; ++$i) { + $mtw += $colwidth[$i] ; + } + + // Find out maximum width we need for legend box + $abs_width = $mtw+$this->xlmargin; + + if ($this->xabspos === -1 && $this->yabspos === -1) { + $this->xabspos = $this->xpos*$aImg->width ; + $this->yabspos = $this->ypos*$aImg->height ; + } + + // Positioning of the legend box + if ($this->halign == 'left') { + $xp = $this->xabspos; + } elseif ($this->halign == 'center') { + $xp = $this->xabspos - $abs_width/2; + } else { + $xp = $aImg->width - $this->xabspos - $abs_width; + } + + $yp=$this->yabspos; + if ($this->valign == 'center') { + $yp-=$abs_height/2; + } elseif ($this->valign == 'bottom') { + $yp-=$abs_height; + } + + // Stroke legend box + $aImg->SetColor($this->color); + $aImg->SetLineWeight($this->frameweight); + $aImg->SetLineStyle('solid'); + + if ($this->shadow) { + $aImg->ShadowRectangle( + $xp, + $yp, + $xp+$abs_width+$this->shadow_width, + $yp+$abs_height+$this->shadow_width, + $this->fill_color, + $this->shadow_width, + $this->shadow_color + ); + } else { + $aImg->SetColor($this->fill_color); + $aImg->FilledRectangle($xp, $yp, $xp+$abs_width, $yp+$abs_height); + $aImg->SetColor($this->color); + $aImg->Rectangle($xp, $yp, $xp+$abs_width, $yp+$abs_height); + } + + // x1,y1 is the position for the legend mark + $x1=$xp+$this->mark_abs_hsize+$this->xlmargin; + $y1=$yp + $this->ymargin; + + $f2 = round($aImg->GetTextHeight('X')/2); + + $grad = new Gradient($aImg); + $patternFactory = null; + + // Now stroke each legend in turn + // Each plot has added the following information to the legend + // p[0] = Legend text + // p[1] = Color, + // p[2] = For markers a reference to the PlotMark object + // p[3] = For lines the line style, for gradient the negative gradient style + // p[4] = CSIM target + // p[5] = CSIM Alt text + $i = 1 ; + $row = 0; + foreach ($this->txtcol as $p) { + + // STROKE DEBUG BOX + if (_JPG_DEBUG) { + $aImg->SetLineWeight(1); + $aImg->SetColor('red'); + $aImg->SetLineStyle('solid'); + $aImg->Rectangle($xp, $y1, $xp+$abs_width, $y1+$rowheight[$row]); + } + + $aImg->SetLineWeight($this->weight); + $x1 = round($x1); + $y1=round($y1); + if (!empty($p[2]) && $p[2]->GetType() > -1) { + // Make a plot mark legend + $aImg->SetColor($p[1]); + if (is_string($p[3]) || $p[3]>0) { + $aImg->SetLineStyle($p[3]); + $aImg->StyleLine($x1-$this->mark_abs_hsize, $y1+$f2, $x1+$this->mark_abs_hsize, $y1+$f2); + } + // Stroke a mark with the standard size + // (As long as it is not an image mark ) + if ($p[2]->GetType() != MARK_IMG) { + + // Clear any user callbacks since we ont want them called for + // the legend marks + $p[2]->iFormatCallback = ''; + $p[2]->iFormatCallback2 = ''; + + // Since size for circles is specified as the radius + // this means that we must half the size to make the total + // width behave as the other marks + if ($p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE) { + $p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize)/2); + $p[2]->Stroke($aImg, $x1, $y1+$f2); + } else { + $p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize)); + $p[2]->Stroke($aImg, $x1, $y1+$f2); + } + } + } elseif (!empty($p[2]) && (is_string($p[3]) || $p[3]>0)) { + // Draw a styled line + $aImg->SetColor($p[1]); + $aImg->SetLineStyle($p[3]); + $aImg->StyleLine($x1-1, $y1+$f2, $x1+$this->mark_abs_hsize, $y1+$f2); + $aImg->StyleLine($x1-1, $y1+$f2+1, $x1+$this->mark_abs_hsize, $y1+$f2+1); + } else { + // Draw a colored box + $color = $p[1] ; + // We make boxes slightly larger to better show + $boxsize = min($this->mark_abs_vsize, $this->mark_abs_hsize) + 2 ; + $ym = round($y1 + $f2 - $boxsize/2); + // We either need to plot a gradient or a + // pattern. To differentiate we use a kludge. + // Patterns have a p[3] value of < -100 + if ($p[3] < -100) { + // p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity + if ($patternFactory == null) { + $patternFactory = new RectPatternFactory(); + } + $prect = $patternFactory->Create($p[1][0], $p[1][1], 1); + $prect->SetBackground($p[1][3]); + $prect->SetDensity($p[1][2]+1); + $prect->SetPos(new Rectangle($x1, $ym, $boxsize, $boxsize)); + $prect->Stroke($aImg); + $prect=null; + } else { + if (is_array($color) && count($color)==2) { + // The client want a gradient color + $grad->FilledRectangle( + $x1, + $ym, + $x1+$boxsize, + $ym+$boxsize, + $color[0], + $color[1], + -$p[3] + ); + } else { + $aImg->SetColor($p[1]); + $aImg->FilledRectangle($x1, $ym, $x1+$boxsize, $ym+$boxsize); + } + $aImg->SetColor($this->color); + $aImg->SetLineWeight($fillBoxFrameWeight); + $aImg->Rectangle($x1, $ym, $x1+$boxsize, $ym+$boxsize); + } + } + $aImg->SetColor($this->font_color); + $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); + $aImg->SetTextAlign("left", "top"); + $aImg->StrokeText(round($x1+$this->mark_abs_hsize+$this->xmargin), $y1, $p[0]); + + // Add CSIM for Legend if defined + if (!empty($p[4])) { + $xe = $x1 + $this->xmargin+$this->mark_abs_hsize+$aImg->GetTextWidth($p[0]); + $ye = $y1 + max($this->mark_abs_vsize, $aImg->GetTextHeight($p[0])); + $coords = "$x1,$y1,$xe,$y1,$xe,$ye,$x1,$ye"; + if (! empty($p[4])) { + $this->csimareas .= "csimareas .= " target=\"".$p[6]."\""; + } + + if (!empty($p[5])) { + $tmp=sprintf($p[5], $p[0]); + $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; + } + $this->csimareas .= " />\n"; + } + } + if ($i >= $this->layout_n) { + $x1 = $xp+$this->mark_abs_hsize+$this->xlmargin; + $y1 += $rowheight[$row++]; + $i = 1; + } else { + $x1 += $colwidth[($i-1) % $numcolumns] ; + ++$i; + } + } + } +} // Class + //=================================================== // CLASS DisplayValue @@ -5586,37 +6620,31 @@ class DisplayValue { public $margin=5; public $show=false; - public $valign=''; - public $halign='center'; - public $format='%.1f'; - public $negformat=''; - private $ff=FF_DEFAULT; + public $valign=""; + public $halign="center"; + public $format="%.1f"; + public $negformat=""; + private $ff=FF_FONT1; private $fs=FS_NORMAL; - private $fsize=8; + private $fsize=10; private $iFormCallback=''; private $angle=0; - private $color='navy'; - private $negcolor=''; + private $color="navy"; + private $negcolor=""; private $iHideZero=false; - public $txt=null; - - public function __construct() - { - $this->txt = new Text(); - } public function Show($aFlag=true) { $this->show=$aFlag; } - public function SetColor($aColor, $aNegcolor='') + public function SetColor($aColor, $aNegcolor="") { $this->color = $aColor; $this->negcolor = $aNegcolor; } - public function SetFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=8) + public function SetFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=10) { $this->ff=$aFontFamily; $this->fs=$aFontStyle; @@ -5644,7 +6672,7 @@ class DisplayValue $this->valign = $aVAlign; } - public function SetFormat($aFormat, $aNegFormat='') + public function SetFormat($aFormat, $aNegFormat="") { $this->format= $aFormat; $this->negformat= $aNegFormat; @@ -5663,14 +6691,14 @@ class DisplayValue public function Stroke($img, $aVal, $x, $y) { if ($this->show) { - if ($this->negformat=='') { + if ($this->negformat=="") { $this->negformat=$this->format; } - if ($this->negcolor=='') { + if ($this->negcolor=="") { $this->negcolor=$this->color; } - if ($aVal===null || (is_string($aVal) && ($aVal=='' || $aVal=='-' || $aVal=='x'))) { + if ($aVal===null || (is_string($aVal) && ($aVal=="" || $aVal=="-" || $aVal=="x"))) { return; } @@ -5697,10 +6725,9 @@ class DisplayValue $y = $y-sign($aVal)*$this->margin; - $this->txt->Set($sval); - $this->txt->SetPos($x, $y); - $this->txt->SetFont($this->ff, $this->fs, $this->fsize); - if ($this->valign == '') { + $txt = new Text($sval, $x, $y); + $txt->SetFont($this->ff, $this->fs, $this->fsize); + if ($this->valign == "") { if ($aVal >= 0) { $valign = "bottom"; } else { @@ -5709,15 +6736,15 @@ class DisplayValue } else { $valign = $this->valign; } - $this->txt->Align($this->halign, $valign); + $txt->Align($this->halign, $valign); - $this->txt->SetOrientation($this->angle); + $txt->SetOrientation($this->angle); if ($aVal > 0) { - $this->txt->SetColor($this->color); + $txt->SetColor($this->color); } else { - $this->txt->SetColor($this->negcolor); + $txt->SetColor($this->negcolor); } - $this->txt->Stroke($img); + $txt->Stroke($img); } } } @@ -5732,35 +6759,26 @@ class Plot public $value; public $legend=''; public $coords=array(); - public $color='black'; + public $color="black"; public $hidelegend=false; public $line_weight=1; public $csimtargets=array(); public $csimwintargets=array(); // Array of targets for CSIM - public $csimareas=''; // Resultant CSIM area tags - public $csimalts=null; // ALT:s for corresponding target + public $csimareas=""; // Resultant CSIM area tags + public $csimalts=null; // ALT:s for corresponding target public $legendcsimtarget=''; public $legendcsimwintarget=''; public $legendcsimalt=''; protected $weight=1; protected $center=false; - - protected $inputValues; - protected $isRunningClear = false; - - public function __construct($aDatay, $aDatax=false) + //--------------- + // CONSTRUCTOR + public function Plot($aDatay, $aDatax=false) { $this->numpoints = count($aDatay); if ($this->numpoints==0) { - JpGraphError::RaiseL(25121);//("Empty input data array specified for plot. Must have at least one data point."); - } - - if (!$this->isRunningClear) { - $this->inputValues = array(); - $this->inputValues['aDatay'] = $aDatay; - $this->inputValues['aDatax'] = $aDatax; - } - + JpGraphError::RaiseL(25121); + }//("Empty input data array specified for plot. Must have at least one data point."); $this->coords[0]=$aDatay; if (is_array($aDatax)) { $this->coords[1]=$aDatax; @@ -5774,6 +6792,9 @@ class Plot $this->value = new DisplayValue(); } + //--------------- + // PUBLIC METHODS + // Stroke the plot // "virtual" function which must be implemented by // the subclasses @@ -5798,7 +6819,7 @@ class Plot { $this->value->Stroke($img, $aVal, $x, $y); } - + // Set href targets for CSIM public function SetCSIMTargets($aTargets, $aAlts='', $aWinTargets='') { @@ -5806,39 +6827,32 @@ class Plot $this->csimwintargets=$aWinTargets; $this->csimalts=$aAlts; } - + // Get all created areas public function GetCSIMareas() { return $this->csimareas; } - + // "Virtual" function which gets called before any scale // or axis are stroked used to do any plot specific adjustment public function PreStrokeAdjust($aGraph) { if (substr($aGraph->axtype, 0, 4) == "text" && (isset($this->coords[1]))) { - JpGraphError::RaiseL(25123);//("JpGraph: You can't use a text X-scale with specified X-coords. Use a \"int\" or \"lin\" scale instead."); - } + JpGraphError::RaiseL(25123); + }//("JpGraph: You can't use a text X-scale with specified X-coords. Use a \"int\" or \"lin\" scale instead."); return true; } - - // Virtual function to the the concrete plot class to make any changes to the graph - // and scale before the stroke process begins - public function PreScaleSetup($aGraph) - { - // Empty - } - + // Get minimum values in plot public function Min() { if (isset($this->coords[1])) { $x=$this->coords[1]; } else { - $x=''; + $x=""; } - if ($x != '' && count($x) > 0) { + if ($x != "" && count($x) > 0) { $xm=min($x); } else { $xm=0; @@ -5846,6 +6860,12 @@ class Plot $y=$this->coords[0]; $cnt = count($y); if ($cnt > 0) { + /* + if( ! isset($y[0]) ) { + JpGraphError('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)'); + } + $ym = $y[0]; + */ $i=0; while ($i<$cnt && !is_numeric($ym=$y[$i])) { $i++; @@ -5857,27 +6877,35 @@ class Plot ++$i; } } else { - $ym=''; + $ym=""; } return array($xm,$ym); } - + // Get maximum value in plot public function Max() { if (isset($this->coords[1])) { $x=$this->coords[1]; } else { - $x=''; + $x=""; } - if ($x!='' && count($x) > 0) { + if ($x!="" && count($x) > 0) { $xm=max($x); } else { $xm = $this->numpoints-1; } $y=$this->coords[0]; if (count($y) > 0) { + /* + if( !isset($y[0]) ) { + JpGraphError::Raise('The input data array must have consecutive values from position 0 and forward. The given y-array starts with empty values (NULL)'); +// $y[0] = 0; +// Change in 1.5.1 Don't treat this as an error any more. Just silently convert to 0 +// Change in 1.17 Treat his as an error again !! This is the right way to do !! + } + */ $cnt = count($y); $i=0; while ($i<$cnt && !is_numeric($ym=$y[$i])) { @@ -5890,16 +6918,16 @@ class Plot ++$i; } } else { - $ym=''; + $ym=""; } return array($xm,$ym); } - + public function SetColor($aColor) { $this->color=$aColor; } - + public function SetLegend($aLegend, $aCSIM='', $aCSIMAlt='', $aCSIMWinTarget='') { $this->legend = $aLegend; @@ -5912,17 +6940,17 @@ class Plot { $this->weight=$aWeight; } - + public function SetLineWeight($aWeight=1) { $this->line_weight=$aWeight; } - + public function SetCenter($aCenter=true) { $this->center = $aCenter; } - + // This method gets called by Graph class to plot anything that should go // into the margin after the margin color has been set. public function StrokeMargin($aImg) @@ -5933,67 +6961,145 @@ class Plot // Framework function the chance for each plot class to set a legend public function Legend($aGraph) { - if ($this->legend != '') { - $aGraph->legend->Add($this->legend, $this->color, '', 0, $this->legendcsimtarget, $this->legendcsimalt, $this->legendcsimwintarget); + if ($this->legend != "") { + $aGraph->legend->Add( + $this->legend, + $this->color, + "", + 0, + $this->legendcsimtarget, + $this->legendcsimalt, + $this->legendcsimwintarget + ); } } - - public function Clear() - { - $this->isRunningClear = true; - Plot::__construct($this->inputValues['aDatay'], $this->inputValues['aDatax']); - $this->isRunningClear = false; - } } // Class -// Provide a deterministic list of new colors whenever the getColor() method -// is called. Used to automatically set colors of plots. -class ColorFactory +//=================================================== +// CLASS PlotLine +// Description: +// Data container class to hold properties for a static +// line that is drawn directly in the plot area. +// Usefull to add static borders inside a plot to show +// for example set-values +//=================================================== +class PlotLine { - private static $iIdx = 0; - private static $iColorList = array( - 'black', - 'blue', - 'orange', - 'darkgreen', - 'red', - 'AntiqueWhite3', - 'aquamarine3', - 'azure4', - 'brown', - 'cadetblue3', - 'chartreuse4', - 'chocolate', - 'darkblue', - 'darkgoldenrod3', - 'darkorchid3', - 'darksalmon', - 'darkseagreen4', - 'deepskyblue2', - 'dodgerblue4', - 'gold3', - 'hotpink', - 'lawngreen', - 'lightcoral', - 'lightpink3', - 'lightseagreen', - 'lightslateblue', - 'mediumpurple', - 'olivedrab', - 'orangered1', - 'peru', - 'slategray', - 'yellow4', - 'springgreen2'); - private static $iNum = 33; + public $scaleposition; + public $direction=-1; + protected $weight=1; + protected $color="black"; + private $legend=''; + private $hidelegend=false; + private $legendcsimtarget=''; + private $legendcsimalt=''; + private $legendcsimwintarget=''; + private $iLineStyle='solid'; - public static function getColor() + //--------------- + // CONSTRUCTOR + public function PlotLine($aDir=HORIZONTAL, $aPos=0, $aColor="black", $aWeight=1) { - if (ColorFactory::$iIdx >= ColorFactory::$iNum) { - ColorFactory::$iIdx = 0; + $this->direction = $aDir; + $this->color=$aColor; + $this->weight=$aWeight; + $this->scaleposition=$aPos; + } + + //--------------- + // PUBLIC METHODS + + public function SetLegend($aLegend, $aCSIM='', $aCSIMAlt='', $aCSIMWinTarget='') + { + $this->legend = $aLegend; + $this->legendcsimtarget = $aCSIM; + $this->legendcsimwintarget = $aCSIMWinTarget; + $this->legendcsimalt = $aCSIMAlt; + } + + public function HideLegend($f=true) + { + $this->hidelegend = $f; + } + + public function SetPosition($aScalePosition) + { + $this->scaleposition=$aScalePosition; + } + + public function SetDirection($aDir) + { + $this->direction = $aDir; + } + + public function SetColor($aColor) + { + $this->color=$aColor; + } + + public function SetWeight($aWeight) + { + $this->weight=$aWeight; + } + + public function SetLineStyle($aStyle) + { + $this->iLineStyle = $aStyle; + } + + //--------------- + // PRIVATE METHODS + + public function DoLegend(&$graph) + { + if (!$this->hidelegend) { + $this->Legend($graph); } - return ColorFactory::$iColorList[ColorFactory::$iIdx++]; + } + + // Framework function the chance for each plot class to set a legend + public function Legend(&$aGraph) + { + if ($this->legend != "") { + $dummyPlotMark = new PlotMark(); + $lineStyle = 1; + $aGraph->legend->Add( + $this->legend, + $this->color, + $dummyPlotMark, + $lineStyle, + $this->legendcsimtarget, + $this->legendcsimalt, + $this->legendcsimwintarget + ); + } + } + + public function PreStrokeAdjust($aGraph) + { + // Nothing to do + } + + public function Stroke($aImg, $aXScale, $aYScale) + { + $aImg->SetColor($this->color); + $aImg->SetLineWeight($this->weight); + $oldStyle = $aImg->SetLineStyle($this->iLineStyle); + if ($this->direction == VERTICAL) { + $ymin_abs=$aYScale->Translate($aYScale->GetMinVal()); + $ymax_abs=$aYScale->Translate($aYScale->GetMaxVal()); + $xpos_abs=$aXScale->Translate($this->scaleposition); + $aImg->StyleLine($xpos_abs, $ymin_abs, $xpos_abs, $ymax_abs); + } elseif ($this->direction == HORIZONTAL) { + $xmin_abs=$aXScale->Translate($aXScale->GetMinVal()); + $xmax_abs=$aXScale->Translate($aXScale->GetMaxVal()); + $ypos_abs=$aYScale->Translate($this->scaleposition); + $aImg->StyleLine($xmin_abs, $ypos_abs, $xmax_abs, $ypos_abs); + } else { + JpGraphError::RaiseL(25125);//(" Illegal direction for static line"); + } + $aImg->SetLineStyle($oldStyle); } } diff --git a/onyx2/include/jpgraph/jpgraph_antispam-digits.php b/onyx2/include/jpgraph/jpgraph_antispam-digits.php index 6f0ec34..c3e30ae 100644 --- a/onyx2/include/jpgraph/jpgraph_antispam-digits.php +++ b/onyx2/include/jpgraph/jpgraph_antispam-digits.php @@ -1,11 +1,11 @@ digits['6'][0]= 645 ; $this->digits['6'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'. - 'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'. - 'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'. - 'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'. - 'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'. - 'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'. - 'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAEBAAMBAAAAAAAAAAAAAAAABgMEBwX/xAAvEAABAwMC'. + 'BAQEBwAAAAAAAAABAgMEAAURBiESIjFRBxMUQRUWMmFTYnGRkrHC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFhEBAQEAAAAA'. + 'AAAAAAAAAAAAAAER/9oADAMBAAIRAxEAPwDslwiR3oDku8ONttsAvDiVyMcO/ET7ke5/aoOz6k1Vr5htNjW7a7M1yO3NTQU9JUDu'. + 'GgrlSn8xyf6p4gXaHJvNps9/mKZtSkGdMjRwpfqAFBLLACRlZUrJONsI2717No1lbZ10kx7XGnRpKWQ/6GVGMfzEJ5VFIVtsOH6e'. + 'wyKVhYsia0y22pLThSkJK1uniVgdThOM0ol+StIUhpopIyCFq3H8aUVCwnG3PGe4Rp6fLXJtMdyM0ojcIWvIz3HFnAPfrWTXb6GN'. + 'WaLXDwZjVz8pKEfhuIUFg/bAz9sVJ61nt61mxJFslLtq7e5yPqiBT4UDklKw4MDpt+u+9bFiu9riXNu83R+fcr6tohuQ5HQhmK37'. + 'paaC8DruScmg6X8KkjZEhbaB9KEyFYSOw26Uqd+e7Qerl5z74DY/1SomP//Z' ; //========================================================== // d2-small.jpg //========================================================== $this->digits['2'][0]= 606 ; $this->digits['2'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'. - 'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'. - 'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'. - 'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'. - 'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'. - '7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'. - 'DLZ6f//Z' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEQMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAFAAQHAv/EACsQAAEDBAEC'. + 'BAYDAAAAAAAAAAIBAwQABQYRIRIxQVFhcQcTFSJSU5GU0f/EABcBAAMBAAAAAAAAAAAAAAAAAAECAwT/xAAZEQACAwEAAAAAAAAA'. + 'AAAAAAAAARESUUH/2gAMAwEAAhEDEQA/AOqXm/Q8dxmOL4PPSnCSNFixx6nXnkXgRT3Te17JWbGsveueSyLZdbPItNxOKLzTLjou'. + 'gYCSoSoY8ISKSbFeUrzkdlnTL1YshskiErkQnFEZaF8kkdBBVdjyi6RNL5+9F486eS/ECVkcBtDt1vZcho5viS8ZCp9C9tAIAm/F'. + 'VoPRU+HRtJ5JVRP1kP0PfwP+1VKrHBMliXG4Nw8VgE4xGkuqk2S1wTUNEVdIvgpL9iL6KtNxY7WOwo9tt0RCitj0sR2uCbFPPzH1'. + '7+6rRuSRcljMBMsUy2tky045KOawZk5xtEFBJEROO3hx61kh2rPCIX3MhsyC4QmfTbC6lH8dq5212qwkiG5H6Y/9R2qm+ofxqqsL'. + 'DLZ6f//Z' ; //========================================================== // d9-small.jpg //========================================================== $this->digits['9'][0]= 680 ; $this->digits['9'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'. - 'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'. - 'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'. - 'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'. - 'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'. - 'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'. - 'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'. - '1V1//9k=' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwP/xAArEAABAwMD'. + 'AgYBBQAAAAAAAAABAgMEBQYRABIhE1EUIjEzQUIHMlJhcdH/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQD/xAAYEQEAAwEAAAAAAAAA'. + 'AAAAAAAAAREhQf/aAAwDAQACEQMRAD8AkK7brF6X7XpMeGoKhFMLEeT4ZUheEhanF4OcZ2pTgDykk92bZpdCsi7aezLjxkIPUZiV'. + 'RSCy8hah7EkZ27yM7V+iscal5bE22Lon1qNDmSKROd8Sl+Ix1lMOlIS4HGgQpbStoUCnlJz8HmsXtW3Lst2rmBAelLMRRekOwnYz'. + 'Edls9QKKnOVLyk7UgcbzzrdBthqEJJwZbAI4x1U/7o1TaFa9lG36aXaZTy54VrcXUgrzsGdx+T30aNydweqVw1GS87T6Lb86Q4ha'. + 'my/IAYjZBx+snKk99oOQMf1AViE65SY348hzFy6hPKnqtKz7DC1lbqyPrvJKUJ7H+M6Wrt3InP7o1brFNp4bCDGhxGAsqz69VSiQ'. + 'ORwBxrrQ7itm1ac7Hp0WoGTIc3PSn0pccdcP2WorycfA1RaRHjxosZqOyhtDTSAhCf2gDAGjVHTd9sKSCumynFEZK1tIJUe58/ro'. + '1V1//9k=' ; //========================================================== // d5-small.jpg //========================================================== $this->digits['5'][0]= 632 ; $this->digits['5'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'. - 'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'. - 'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'. - 'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'. - 'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'. - 'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'. - '8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgIFBwT/xAAoEAABAwME'. + 'AQQCAwAAAAAAAAABAgMEBQYRABIhIkEUMVFhBxNCgaH/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAv/EABcRAQEBAQAAAAAAAAAAAAAA'. + 'AAABEUH/2gAMAwEAAhEDEQA/ANGvW4YVOeiRX5b4mv5Sin05IdlupPKdo/j2SO3+6TbPNQvOsTVz33KRT4csR3YUF7Dsh5OSFvug'. + 'kqG4FPBxnjxpvvi4KZb1pTpU+QwxUi2Y7ZIAefUk5ATxnB9/gbtL/wCH1UpuhPUlZlMVaQ0mS8zJjqZOPfc2TwpIUonI9tw40R1r'. + 'WNGq/wBdJR1XT3lqHBUnGCfkfWjRWs1ve249erQqQYjOtN1FqPUpCXQ4WIzQSsJwT0UpRwQPG0nzqyuNHobjsl9kBuWqoOoXtT1/'. + 'WppZcA8lKRj64HxqU+3KpAr6plElRVKef3S4E0K9O8pLXVzKcqSsJAB9wSAca6bSoNXeuA1+5pEV+SGFNU1iKVFqI0Vdx2AJUeoz'. + '8DGlTDwG3CAf3q/pI0ah6MDhLz6U+EpXwPoaNMU//9k=' ; //========================================================== // d1-small.jpg //========================================================== $this->digits['1'][0]= 646 ; $this->digits['1'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'. - 'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'. - 'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'. - 'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'. - 'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'. - 'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'. - 'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEwMBIgACEQEDEQH/xAAZAAADAAMAAAAAAAAAAAAAAAAABQYCBAf/xAApEAACAQMD'. + 'AwQBBQAAAAAAAAABAgMEBREABiESMUEHEyJRkSNCYXGB/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAEC/8QAFxEBAQEBAAAAAAAAAAAA'. + 'AAAAAAEREv/aAAwDAQACEQMRAD8A6jdd4WLbstILnc4Uq0VoWpkJknb6IjXLHJUePOlez923fcW4r1SxWlqC2UbdKirQif3Xw3yA'. + 'OFAGT09/kO3OmV3a20MFRf6lIYPcpy7yRRAzgxjIy2M8YwcdiBzpX6d22VNvUlTXsFkuwkrKqNSfnK7F8OTzwrAY+l5zoxKskudN'. + 'EgQPUT9PBkWF3DH+1GPxo1mLnRoAqF2VRgGOFmX/AAgY/GjRUP6hVMFv2FuFqUvUGrpDFJMBnpdyF5bsAQew7Hxzp6LZNT0yQ1DI'. + 'wp0QCFBhD0jCsfLZHxbx5xxpTuvb1+v9PV7Ztk9roLPLCjmSSN3mX5ZwqjCgZX7PfWxDQb2in96pv9qq46aTE0bW4x9ceAWAYPwS'. + 'PsYzoixgmheBGjIVcYCnjp/jHjHbRpe1JLn9OnopE/a0ykvjwDx47aNMXqP/2Q==' ; //========================================================== // d8-small.jpg //========================================================== $this->digits['8'][0]= 694 ; $this->digits['8'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'. - 'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'. - 'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'. - 'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'. - '44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'. - 'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'. - 'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'. - 'EylmLHQltptPZKQOBo1FzH//2Q==' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AFQMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABgcEBf/EACsQAAEDAwMD'. + 'AwMFAAAAAAAAAAECAwQFBhEAEiEUMVEHE0EVYYEiIzJCsf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/EABcRAQEBAQAAAAAAAAAA'. + 'AAAAAAABERL/2gAMAwEAAhEDEQA/AKL6gVVUa0i1T5QjvTprUJMlxW4R9zgQXe/AH+kaWrntqlWjaq7gpcmotXAw82ht9yY4tch8'. + 'uAFC0k7VBXPGMY51ruiaue+bThIj+7NbWqS+7HDxajFf6AlB/k44o8ZOABk4xkL0X0tZiojKrlRuGRJjugqldSlKGf6t7BuUQe3J'. + '44xxxrA1a4KVJipLidri8uLHgqOcfjOPxo0o2hdDvS1CmV2Yl6fS5ioipIQR1CAlKkLKR2UUqAI8g6NRSwuuyHab6s1ufLI/Zai7'. + 'UBJOxhTS0+6B32pWSFH4CidOdWU0ukLiN1BLr0zG5Sdm3GRvcPhIT858DvjXNrVsSLnm/VIdTXS6tTnFsxZTSN3jchaTwps+O/z9'. + 'tcBVq3hIX0tYqlIiQHdy5CqRHKHXEjAOMgBKjnvyRk4xrQa7OiGt1K5biYZL8SoVEpjOqkFsONtJCNwASeCQrn7aNUKnQYtLp7EC'. + 'EylmLHQltptPZKQOBo1FzH//2Q==' ; //========================================================== // d4-small.jpg //========================================================== $this->digits['4'][0]= 643 ; $this->digits['4'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'. - 'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'. - 'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'. - 'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'. - 'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'. - '27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'. - 'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAYAAADAQEAAAAAAAAAAAAAAAAABAYHAv/EAC0QAAIBAwQA'. + 'BAMJAAAAAAAAAAECAwQFEQAGEiETFDFBUmGBByIjUVNxobHR/8QAFgEBAQEAAAAAAAAAAAAAAAAAAAIB/8QAGBEBAAMBAAAAAAAA'. + 'AAAAAAAAAAERIVH/2gAMAwEAAhEDEQA/ANjM00Nxmt1xiWW31CZp5uJwoAAaOQ/n7qfcZHqO5my3q5XX7R6ijiqnNut9u4NyJ4yv'. + 'JJyjYr8Xhrn5g599J7x3ulBNU7Zo7dXXXcLQ8kURYi4epYtkALjOePv1nUvbLvV7P3BZm3DR3eh88Kp7pVzBZI6iUhGWRRGWwE44'. + 'HX3V+uiL1uHgt+vL/H+aNJQ3CSeCOaFqSaJ1DJKs/TqRkMOvQjvRorHE4pRDLNWLGlRHGUeYIORXs9e5B7OP31E0fmdyb/t0DJ4Q'. + '27bfx3YZzPUIoAAz7IpOD6cuxq0uNumqLfVNDOqXBoZEjnZcqhIPXH4c46+WkdoWOltu3IDDLLLVVR83UVcuPEmmcZZ2/rHoAANG'. + 'GI7KIY1ijoLeEQBVCwIoAHpgY6Hy0aZe7mJ2jeHLKcEhusj6aNKgzr//2Q==' ; //========================================================== // d7-small.jpg //========================================================== $this->digits['7'][0]= 658 ; $this->digits['7'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'. - 'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'. - 'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'. - '19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'. - 'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'. - '8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'. - 'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABgEFBwT/xAAuEAABAwIE'. + 'BAQGAwAAAAAAAAABAgMEBREABiExEhMiQSMyUXEHFBclVJFhk9L/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/8QAGREBAQEAAwAA'. + 'AAAAAAAAAAAAAAEREiFR/9oADAMBAAIRAxEAPwDXq9mCjZeQ05VZ5ZST4bfEpa3VdglCbqUe+g9MZ5Uq7V8415WXoMSdQ6etgSps'. + '19wpkCMDZKUpv0FZvbi1NzpYasMDLDUbMVXrtQdbeeU23xLWkj5RlLYK0J7anW9gbAjCzkOtsVSUJUdtc6dVZK51UeaFm4LKbhpC'. + 'l7EhIFkDW974GbRI2XorUVls1OTdKAOqUpR0Hc3198GITQ6k+hLwrEpoODiDenRfW23bBicg78JXxPpD0mgVOW5PAivNNpahsPW5'. + '8xxQaSVkboQnhsnYm5OHqDGp1IpsalMKjMsMIC3+XZKbJFth62/QOEfMOZqZXp9JcKZTcGmTky3meSi7xQklI81vMR+sXIz/AEgp'. + 'Q0qPNu6ea8Q2jqtbp8+2w9h/OKORc/cpHjt1dDSHOtLZ4ekHW23bBjj+o9H/AB539aP94MG0+L//2Q==' ; //========================================================== // d3-small.jpg //========================================================== $this->digits['3'][0]= 662 ; $this->digits['3'][1]= - '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. - 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. - 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'. - 'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'. - 'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'. - 'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'. - 'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'. - 'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'. - 'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ; + '/9j/4AAQSkZJRgABAQEASgBKAAD//gAJSnBHcmFwaP/bAEMACAYGBwYFCAcHBwkJCAoMFA0MCwsMGRITDxQdGh8eHRocHCAkLicg'. + 'IiwjHBwoNyksMDE0NDQfJzk9ODI8LjM0Mv/bAEMBCQkJDAsMGA0NGDIhHCEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy'. + 'MjIyMjIyMjIyMjIyMjIyMjIyMv/AABEIAB4AEgMBIgACEQEDEQH/xAAZAAACAwEAAAAAAAAAAAAAAAAABAUGBwL/xAArEAABBAED'. + 'AwMDBQEAAAAAAAABAgMEBREABhIhMUEiMmETFZEHFkJDUdH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/xAAYEQEBAQEBAAAAAAAA'. + 'AAAAAAAAEQExQf/aAAwDAQACEQMRAD8A0vclruBdk3VVLLUNssGRJsZSCtqOjlgJAHvcOD6c4HnOdIbcttw1W5P29cFEhuawqTXS'. + 'VsJjnCMBxKkJJx7goAde+ceJfdNxU0UNlyymyXHi6kxWUNl1S3EnkAEIHX2nv86qtTuZr9Q9+1VhRsOoYpYcgSVyAE/TdewkJxnK'. + 'sBCjkdPGpnOtFMd3PqsXgfOAgD8Y0aX+11H9rDDjn8lr9yj5J+dGqsqxaw6Cc9cQZU4Sp7zTJsIrKlcUEKwhSin1JABI45GUjqOu'. + 'lbOvjbc3Ts9ynjGCy445UuFLYRzbWgrT6fhSCQSMDke+pew2zYVly/d7YchNqkMJZnQpgV9J8IzwWFJyUrAJHYgjvpLbu37G5nR7'. + 'vck5C3YRKYEOEVJZj8kjKypXqWvirjk9h+dB9i4faa89TDZUfKlIyT8k+To10a6KTkpcJ/0vL/7o0TS//9k=' ; } } class AntiSpam { - private $iNumber=''; + public $iNumber=''; - public function __construct($aNumber='') + public function AntiSpam($aNumber='') { $this->iNumber = $aNumber; } diff --git a/onyx2/include/jpgraph/jpgraph_antispam.php b/onyx2/include/jpgraph/jpgraph_antispam.php index bc4d7f4..b120abe 100644 --- a/onyx2/include/jpgraph/jpgraph_antispam.php +++ b/onyx2/include/jpgraph/jpgraph_antispam.php @@ -1,11 +1,11 @@ chars['j'][0]= 658 ; @@ -151,7 +151,7 @@ class HandDigits 't2fmEIckqIZaaKuSGG0lQ4gduRoFRHQ9AOgs2lOJbk9aSUlpjGvAWeSVH2VKq/2dFPw3IjyJe8s281ct3I9UoHJXGiQkD2STrSZ7'. 'Yf8AOl7JTdw5eOCz0jw3+LbYCfA9nz71msb8KMxoTGTw+5srjsipAdDqFBQBIuiOl6KrdYyJMyTCshlw2G3Fr/HiNqNNAqJJUoGl'. 'KND+h47km1bZwsvCbYYjycxIyK1qDv2yEi0hQviK8atKDcy9j//Z' ; - + //========================================================== // lp-small.jpg @@ -548,7 +548,7 @@ class AntiSpam private $iData=''; private $iDD=null; - public function __construct($aData='') + public function AntiSpam($aData='') { $this->iData = $aData; $this->iDD = new HandDigits(); diff --git a/onyx2/include/jpgraph/jpgraph_bar.php b/onyx2/include/jpgraph/jpgraph_bar.php index 28b3391..c7c37f7 100644 --- a/onyx2/include/jpgraph/jpgraph_bar.php +++ b/onyx2/include/jpgraph/jpgraph_bar.php @@ -1,13 +1,13 @@ Plot($datay, $datax); ++$this->numpoints; } //--------------- // PUBLIC METHODS - + // Set a drop shadow for the bar (or rather an "up-right" shadow) - public function SetShadow($aColor="black", $aHSize=3, $aVSize=3, $aShow=true) + public function SetShadow($color="black", $hsize=3, $vsize=3, $show=true) { - $this->bar_shadow=$aShow; - $this->bar_shadow_color=$aColor; - $this->bar_shadow_vsize=$aVSize; - $this->bar_shadow_hsize=$aHSize; - + $this->bar_shadow=$show; + $this->bar_shadow_color=$color; + $this->bar_shadow_vsize=$vsize; + $this->bar_shadow_hsize=$hsize; + // Adjust the value margin to compensate for shadow - $this->value->margin += $aVSize; + $this->value->margin += $vsize; } - - public function Set3D($aHSize=3, $aVSize=3, $aShow=true) - { - $this->bar_3d=$aShow; - $this->bar_3d_vsize=$aVSize; - $this->bar_3d_hsize=$aHSize; - - $this->value->margin += $aVSize; - } - + // DEPRECATED use SetYBase instead public function SetYMin($aYStartValue) { @@ -96,21 +84,7 @@ class BarPlot extends Plot { $this->ybase=$aYStartValue; } - - // The method will take the specified pattern anre - // return a pattern index that corresponds to the original - // patterm being rotated 90 degreees. This is needed when plottin - // Horizontal bars - public function RotatePattern($aPat, $aRotate=true) - { - $rotate = array(1 => 2, 2 => 1, 3 => 3, 4 => 5, 5 => 4, 6 => 6, 7 => 7, 8 => 8); - if ($aRotate) { - return $rotate[$aPat]; - } else { - return $aPat; - } - } - + public function Legend($graph) { if ($this->grad && $this->legend!="" && !$this->fill) { @@ -127,17 +101,14 @@ class BarPlot extends Plot ); } elseif ($this->legend!="" && ($this->iPattern > -1 || is_array($this->iPattern))) { if (is_array($this->iPattern)) { - $p1 = $this->RotatePattern($this->iPattern[0], $graph->img->a == 90); + $p1 = $this->iPattern[0]; $p2 = $this->iPatternColor[0]; $p3 = $this->iPatternDensity[0]; } else { - $p1 = $this->RotatePattern($this->iPattern, $graph->img->a == 90); + $p1 = $this->iPattern; $p2 = $this->iPatternColor; $p3 = $this->iPatternDensity; } - if ($p3 < 90) { - $p3 += 5; - } $color = array($p1,$p2,$p3,$this->fill_color); // A kludge: Too mark that we add a pattern we use a type value of < 100 $graph->legend->Add( @@ -185,7 +156,7 @@ class BarPlot extends Plot if (substr($graph->axtype, -3, 3)=="log" && $this->ybase==0) { $this->ybase = $graph->yaxis->scale->GetMinVal(); } - + // For a "text" X-axis scale we will adjust the // display of the bars a little bit. if (substr($graph->axtype, 0, 3)=="tex") { @@ -209,7 +180,7 @@ class BarPlot extends Plot if ($this->abswidth == -1) { // Not set // set width to a visuable sensible default - $this->abswidth = $graph->img->plotwidth/(2*$this->numpoints); + $this->abswidth = $graph->img->plotwidth/(2*count($this->coords[0])); } } } @@ -231,7 +202,7 @@ class BarPlot extends Plot } return $m; } - + // Specify width as fractions of the major stepo size public function SetWidth($aWidth) { @@ -242,37 +213,32 @@ class BarPlot extends Plot $this->width=$aWidth; } } - + // Specify width in absolute pixels. If specified this // overrides SetWidth() public function SetAbsWidth($aWidth) { $this->abswidth=$aWidth; } - + public function SetAlign($aAlign) { $this->align=$aAlign; } - + public function SetNoFill() { $this->grad = false; $this->fill_color=false; $this->fill=false; } - + public function SetFillColor($aColor) { - // Do an extra error check if the color is specified as an RGB array triple - // In that case convert it to a hex string since it will otherwise be - // interpretated as an array of colors for each individual bar. - - $aColor = RGB::tryHexConversion($aColor); $this->fill = true ; $this->fill_color=$aColor; } - + public function SetFillGradient($aFromColor, $aToColor=null, $aStyle=null) { $this->grad = true; @@ -280,7 +246,7 @@ class BarPlot extends Plot $this->grad_tocolor = $aToColor; $this->grad_style = $aStyle; } - + public function SetValuePos($aPos) { $this->valuepos = $aPos; @@ -295,7 +261,7 @@ class BarPlot extends Plot if (is_array($aColor)) { $this->iPatternColor = array(); if (count($aColor) != $n) { - JpGraphError::RaiseL(2001);//('NUmber of colors is not the same as the number of patterns in BarPlot::SetPattern()'); + JpGraphError::Raise('NUmber of colors is not the same as the number of patterns in BarPlot::SetPattern()'); } } else { $this->iPatternColor = $aColor; @@ -315,62 +281,49 @@ class BarPlot extends Plot public function _SetPatternHelper($aPattern, &$aPatternValue, &$aDensity) { switch ($aPattern) { - case PATTERN_DIAG1: - $aPatternValue= 1; - $aDensity = 92; - break; - case PATTERN_DIAG2: - $aPatternValue= 1; - $aDensity = 78; - break; - case PATTERN_DIAG3: - $aPatternValue= 2; - $aDensity = 92; - break; - case PATTERN_DIAG4: - $aPatternValue= 2; - $aDensity = 78; - break; - case PATTERN_CROSS1: - $aPatternValue= 8; - $aDensity = 90; - break; - case PATTERN_CROSS2: - $aPatternValue= 8; - $aDensity = 78; - break; - case PATTERN_CROSS3: - $aPatternValue= 8; - $aDensity = 65; - break; - case PATTERN_CROSS4: - $aPatternValue= 7; - $aDensity = 90; - break; - case PATTERN_STRIPE1: - $aPatternValue= 5; - $aDensity = 94; - break; - case PATTERN_STRIPE2: - $aPatternValue= 5; - $aDensity = 85; - break; - default: - JpGraphError::RaiseL(2002); - //('Unknown pattern specified in call to BarPlot::SetPattern()'); - } + case PATTERN_DIAG1: + $aPatternValue= 1; + $aDensity = 90; + break; + case PATTERN_DIAG2: + $aPatternValue= 1; + $aDensity = 75; + break; + case PATTERN_DIAG3: + $aPatternValue= 2; + $aDensity = 90; + break; + case PATTERN_DIAG4: + $aPatternValue= 2; + $aDensity = 75; + break; + case PATTERN_CROSS1: + $aPatternValue= 8; + $aDensity = 90; + break; + case PATTERN_CROSS2: + $aPatternValue= 8; + $aDensity = 78; + break; + case PATTERN_CROSS3: + $aPatternValue= 8; + $aDensity = 65; + break; + case PATTERN_CROSS4: + $aPatternValue= 7; + $aDensity = 90; + break; + case PATTERN_STRIPE1: + $aPatternValue= 5; + $aDensity = 90; + break; + case PATTERN_STRIPE2: + $aPatternValue= 5; + $aDensity = 75; + break; + default: + JpGraphError::Raise('Unknown pattern specified in call to BarPlot::SetPattern()'); } - - - /** - * @override - * Without overriding this method, $this->numpoints does not updated correctly. - */ - public function Clear() - { - $this->isRunningClear = true; - $this->__construct($this->inputValues['aDatay'], $this->inputValues['aDatax']); - $this->isRunningClear = false; } public function Stroke($img, $xscale, $yscale) @@ -378,16 +331,15 @@ class BarPlot extends Plot $numpoints = count($this->coords[0]); if (isset($this->coords[1])) { if (count($this->coords[1])!=$numpoints) { - JpGraphError::RaiseL(2003, count($this->coords[1]), $numpoints); - //"Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])."Number of Y-points:$numpoints"); + JpGraphError::Raise("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])."Number of Y-points:$numpoints"); } else { $exist_x = true; } } else { $exist_x = false; } - - + + $numbars=count($this->coords[0]); // Use GetMinVal() instead of scale[0] directly since in the case @@ -409,11 +361,11 @@ class BarPlot extends Plot if (is_array($this->iPattern)) { $np = count($this->iPattern); } - + $grad = null; for ($i=0; $i < $numbars; ++$i) { - // If value is NULL, or 0 then don't draw a bar at all + // If value is NULL, or 0 then don't draw a bar at all if ($this->coords[0][$i] === null || $this->coords[0][$i] === '') { continue; } @@ -423,25 +375,25 @@ class BarPlot extends Plot } else { $x=$i; } - + $x=$xscale->Translate($x); // Comment Note: This confuses the positioning when using acc together with // grouped bars. Workaround for fixing #191 /* - if( !$xscale->textscale ) { - if($this->align=="center") - $x -= $abswidth/2; - elseif($this->align=="right") - $x -= $abswidth; - } + if( !$xscale->textscale ) { + if($this->align=="center") + $x -= $abswidth/2; + elseif($this->align=="right") + $x -= $abswidth; + } */ // Stroke fill color and fill gradient $pts=array( - $x,$zp, - $x,$yscale->Translate($this->coords[0][$i]), - $x+$abswidth,$yscale->Translate($this->coords[0][$i]), - $x+$abswidth,$zp); + $x,$zp, + $x,$yscale->Translate($this->coords[0][$i]), + $x+$abswidth,$yscale->Translate($this->coords[0][$i]), + $x+$abswidth,$zp); if ($this->grad) { if ($grad === null) { $grad = new Gradient($img); @@ -459,10 +411,6 @@ class BarPlot extends Plot $fromcolor = $this->grad_fromcolor; $tocolor = $this->grad_tocolor; $style = $this->grad_style; - } else { - $fromcolor = $this->grad_fromcolor[$i % $ng][0]; - $tocolor = $this->grad_fromcolor[$i % $ng][1]; - $style = $this->grad_fromcolor[$i % $ng][2]; } } else { $fromcolor = $this->grad_fromcolor[$i % $ng][0]; @@ -498,15 +446,13 @@ class BarPlot extends Plot $img->FilledPolygon($pts); $img->PopColor(); } - - /////////////////////////kokorahen rectangle polygon////////////////////// - + + // Remember value of this bar $val=$this->coords[0][$i]; if (!empty($val) && !is_numeric($val)) { - JpGraphError::RaiseL(2004, $i, $val); - //'All values for a barplot must be numeric. You have specified value['.$i.'] == \''.$val.'\''); + JpGraphError::Raise('All values for a barplot must be numeric. You have specified value['.$i.'] == \''.$val.'\''); } // Determine the shadow @@ -544,7 +490,7 @@ class BarPlot extends Plot if (is_array($this->bar_shadow_color)) { $numcolors = count($this->bar_shadow_color); if ($numcolors == 0) { - JpGraphError::RaiseL(2005);//('You have specified an empty array for shadow colors in the bar plot.'); + JpGraphError::Raise('You have specified an empty array for shadow colors in the bar plot.'); } $img->PushColor($this->bar_shadow_color[$i % $numcolors]); } else { @@ -552,62 +498,8 @@ class BarPlot extends Plot } $img->FilledPolygon($sp); $img->PopColor(); - } elseif ($this->bar_3d && $val != 0) { - // Determine the 3D - - $ssh = $this->bar_3d_hsize; - $ssv = $this->bar_3d_vsize; - - // Create points to create a "upper-right" shadow - if ($val > 0) { - $sp1[0]=$pts[6]; - $sp1[1]=$pts[7]; - $sp1[2]=$pts[4]; - $sp1[3]=$pts[5]; - $sp1[4]=$pts[4]+$ssh; - $sp1[5]=$pts[5]-$ssv; - $sp1[6]=$pts[6]+$ssh; - $sp1[7]=$pts[7]-$ssv; - - $sp2[0]=$pts[4]; - $sp2[1]=$pts[5]; - $sp2[2]=$pts[2]; - $sp2[3]=$pts[3]; - $sp2[4]=$pts[2]+$ssh; - $sp2[5]=$pts[3]-$ssv; - $sp2[6]=$pts[4]+$ssh; - $sp2[7]=$pts[5]-$ssv; - } elseif ($val < 0) { - $sp1[0]=$pts[4]; - $sp1[1]=$pts[5]; - $sp1[2]=$pts[6]; - $sp1[3]=$pts[7]; - $sp1[4]=$pts[6]+$ssh; - $sp1[5]=$pts[7]-$ssv; - $sp1[6]=$pts[4]+$ssh; - $sp1[7]=$pts[5]-$ssv; - - $sp2[0]=$pts[6]; - $sp2[1]=$pts[7]; - $sp2[2]=$pts[0]; - $sp2[3]=$pts[1]; - $sp2[4]=$pts[0]+$ssh; - $sp2[5]=$pts[1]-$ssv; - $sp2[6]=$pts[6]+$ssh; - $sp2[7]=$pts[7]-$ssv; - } - - $base_color = $this->fill_color; - - $img->PushColor($base_color . ':0.7'); - $img->FilledPolygon($sp1); - $img->PopColor(); - - $img->PushColor($base_color . ':1.1'); - $img->FilledPolygon($sp2); - $img->PopColor(); } - + // Stroke the pattern if (is_array($this->iPattern)) { $f = new RectPatternFactory(); @@ -648,7 +540,6 @@ class BarPlot extends Plot $prect->Stroke($img); } } - // Stroke the outline of the bar if (is_array($this->color)) { $img->SetColor($this->color[$i % count($this->color)]); @@ -663,11 +554,9 @@ class BarPlot extends Plot $img->SetLineWeight($this->weight); $img->Polygon($pts); } - + // Determine how to best position the values of the individual bars $x=$pts[2]+($pts[4]-$pts[2])/2; - $this->value->SetMargin(5); - if ($this->valuepos=='top') { $y=$pts[3]; if ($img->a === 90) { @@ -676,14 +565,6 @@ class BarPlot extends Plot } else { $this->value->SetAlign('left', 'center'); } - } else { - if ($val < 0) { - $this->value->SetMargin(-5); - $y=$pts[1]; - $this->value->SetAlign('center', 'bottom'); - } else { - $this->value->SetAlign('center', 'bottom'); - } } $this->value->Stroke($img, $val, $x, $y); } elseif ($this->valuepos=='max') { @@ -695,13 +576,9 @@ class BarPlot extends Plot $this->value->SetAlign('right', 'center'); } } else { - if ($val < 0) { - $this->value->SetAlign('center', 'bottom'); - } else { - $this->value->SetAlign('center', 'top'); - } + $this->value->SetAlign('center', 'top'); } - $this->value->SetMargin(-5); + $this->value->SetMargin(-3); $this->value->Stroke($img, $val, $x, $y); } elseif ($this->valuepos=='center') { $y = ($pts[3] + $pts[1])/2; @@ -720,8 +597,7 @@ class BarPlot extends Plot $this->value->SetMargin(3); $this->value->Stroke($img, $val, $x, $y); } else { - JpGraphError::RaiseL(2006, $this->valuepos); - //'Unknown position for values on bars :'.$this->valuepos); + JpGraphError::Raise('Unknown position for values on bars :'.$this->valuepos); } // Create the client side image map $rpts = $img->ArrRotate($pts); @@ -755,21 +631,21 @@ class BarPlot extends Plot //=================================================== class GroupBarPlot extends BarPlot { - public $plots; + private $plots; private $nbrplots=0; //--------------- // CONSTRUCTOR - public function __construct($plots) + public function GroupBarPlot($plots) { $this->width=0.7; $this->plots = $plots; $this->nbrplots = count($plots); if ($this->nbrplots < 1) { - JpGraphError::RaiseL(2007);//('Cannot create GroupBarPlot from empty plot array.'); + JpGraphError::Raise('Cannot create GroupBarPlot from empty plot array.'); } for ($i=0; $i < $this->nbrplots; ++$i) { if (empty($this->plots[$i]) || !isset($this->plots[$i])) { - JpGraphError::RaiseL(2008, $i);//("Group bar plot element nbr $i is undefined or empty."); + JpGraphError::Raise("Group bar plot element nbr $i is undefined or empty."); } } $this->numpoints = $plots[0]->numpoints; @@ -784,25 +660,24 @@ class GroupBarPlot extends BarPlot for ($i=0; $i < $n; ++$i) { $c = get_class($this->plots[$i]); if (!($this->plots[$i] instanceof BarPlot)) { - JpGraphError::RaiseL(2009, $c); - //('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the Group Bar plot from an array of BarPlot or AccBarPlot objects. (Class = '.$c.')'); + JpGraphError::Raise('One of the objects submitted to GroupBar is not a BarPlot. Make sure that you create the Group Bar plot from an array of BarPlot or AccBarPlot objects. (Class = '.$c.')'); } $this->plots[$i]->DoLegend($graph); } } - + public function Min() { list($xmin, $ymin) = $this->plots[0]->Min(); $n = count($this->plots); for ($i=0; $i < $n; ++$i) { list($xm, $ym) = $this->plots[$i]->Min(); - $xmin = min($xmin, $xm); + $xmin = max($xmin, $xm); $ymin = min($ymin, $ym); } return array($xmin,$ymin); } - + public function Max() { list($xmax, $ymax) = $this->plots[0]->Max(); @@ -814,7 +689,7 @@ class GroupBarPlot extends BarPlot } return array($xmax,$ymax); } - + public function GetCSIMareas() { $n = count($this->plots); @@ -824,7 +699,7 @@ class GroupBarPlot extends BarPlot } return $csimareas; } - + // Stroke all the bars next to each other public function Stroke($img, $xscale, $yscale) { @@ -835,7 +710,7 @@ class GroupBarPlot extends BarPlot for ($i=0; $i < $n; ++$i) { $this->plots[$i]->ymin=$this->ybase; $this->plots[$i]->SetWidth($subwidth); - + // If the client have used SetTextTickInterval() then // major_step will be > 1 and the positioning will fail. // If we assume it is always one the positioning will work @@ -854,35 +729,22 @@ class GroupBarPlot extends BarPlot //=================================================== class AccBarPlot extends BarPlot { - public $plots=null; + private $plots=null; private $nbrplots=0; //--------------- // CONSTRUCTOR - public function __construct($plots) + public function AccBarPlot($plots) { $this->plots = $plots; $this->nbrplots = count($plots); if ($this->nbrplots < 1) { - JpGraphError::RaiseL(2010);//('Cannot create AccBarPlot from empty plot array.'); + JpGraphError::Raise('Cannot create AccBarPlot from empty plot array.'); } for ($i=0; $i < $this->nbrplots; ++$i) { if (empty($this->plots[$i]) || !isset($this->plots[$i])) { - JpGraphError::RaiseL(2011, $i);//("Acc bar plot element nbr $i is undefined or empty."); + JpGraphError::Raise("Acc bar plot element nbr $i is undefined or empty."); } } - - // We can only allow individual plost which do not have specified X-positions - for ($i=0; $i < $this->nbrplots; ++$i) { - if (!empty($this->plots[$i]->coords[1])) { - JpGraphError::RaiseL(2015); - //'Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-positions.'); - } - } - - // Use 0 weight by default which means that the individual bar - // weights will be used per part n the accumulated bar - $this->SetWeight(0); - $this->numpoints = $plots[0]->numpoints; $this->value = new DisplayValue(); } @@ -895,8 +757,7 @@ class AccBarPlot extends BarPlot for ($i=$n-1; $i >= 0; --$i) { $c = get_class($this->plots[$i]); if (!($this->plots[$i] instanceof BarPlot)) { - JpGraphError::RaiseL(2012, $c); - //('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects.(Class='.$c.')'); + JpGraphError::Raise('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects.(Class='.$c.')'); } $this->plots[$i]->DoLegend($graph); } @@ -985,7 +846,6 @@ class AccBarPlot extends BarPlot { $pattern=null; $img->SetLineWeight($this->weight); - $grad=null; for ($i=0; $i < $this->numpoints-1; $i++) { $accy = 0; $accy_neg = 0; @@ -1002,7 +862,7 @@ class AccBarPlot extends BarPlot $accyt=$yscale->Translate($accy_neg); $accy_neg+=$this->plots[$j]->coords[0][$i]; } - + $xt=$xscale->Translate($i); if ($this->abswidth > -1) { @@ -1010,13 +870,13 @@ class AccBarPlot extends BarPlot } else { $abswidth=round($this->width*$xscale->scale_factor, 0); } - + $pts=array($xt,$accyt,$xt,$yt,$xt+$abswidth,$yt,$xt+$abswidth,$accyt); if ($this->bar_shadow) { $ssh = $this->bar_shadow_hsize; $ssv = $this->bar_shadow_vsize; - + // We must also differ if we are a positive or negative bar. if ($j === 0) { // This gets extra complicated since we have to @@ -1049,7 +909,7 @@ class AccBarPlot extends BarPlot if (is_array($this->bar_shadow_color)) { $numcolors = count($this->bar_shadow_color); if ($numcolors == 0) { - JpGraphError::RaiseL(2013);//('You have specified an empty array for shadow colors in the bar plot.'); + JpGraphError::Raise('You have specified an empty array for shadow colors in the bar plot.'); } $img->PushColor($this->bar_shadow_color[$i % $numcolors]); } else { @@ -1084,53 +944,16 @@ class AccBarPlot extends BarPlot } if ($this->plots[$j]->grad) { - if ($grad === null) { - $grad = new Gradient($img); - } - if (is_array($this->plots[$j]->grad_fromcolor)) { - // The first argument (grad_fromcolor) can be either an array or a single color. If it is an array - // then we have two choices. It can either a) be a single color specified as an RGB triple or it can be - // an array to specify both (from, to style) for each individual bar. The way to know the difference is - // to investgate the first element. If this element is an integer [0,255] then we assume it is an RGB - // triple. - $ng = count($this->plots[$j]->grad_fromcolor); - if ($ng === 3) { - if (is_numeric($this->plots[$j]->grad_fromcolor[0]) && $this->plots[$j]->grad_fromcolor[0] > 0 && - $this->plots[$j]->grad_fromcolor[0] < 256) { - // RGB Triple - $fromcolor = $this->plots[$j]->grad_fromcolor; - $tocolor = $this->plots[$j]->grad_tocolor; - $style = $this->plots[$j]->grad_style; - } else { - $fromcolor = $this->plots[$j]->grad_fromcolor[$i % $ng][0]; - $tocolor = $this->plots[$j]->grad_fromcolor[$i % $ng][1]; - $style = $this->plots[$j]->grad_fromcolor[$i % $ng][2]; - } - } else { - $fromcolor = $this->plots[$j]->grad_fromcolor[$i % $ng][0]; - $tocolor = $this->plots[$j]->grad_fromcolor[$i % $ng][1]; - $style = $this->plots[$j]->grad_fromcolor[$i % $ng][2]; - } - $grad->FilledRectangle( - $pts[2], - $pts[3], - $pts[6], - $pts[7], - $fromcolor, - $tocolor, - $style - ); - } else { - $grad->FilledRectangle( - $pts[2], - $pts[3], - $pts[6], - $pts[7], - $this->plots[$j]->grad_fromcolor, - $this->plots[$j]->grad_tocolor, - $this->plots[$j]->grad_style - ); - } + $grad = new Gradient($img); + $grad->FilledRectangle( + $pts[2], + $pts[3], + $pts[6], + $pts[7], + $this->plots[$j]->grad_fromcolor, + $this->plots[$j]->grad_tocolor, + $this->plots[$j]->grad_style + ); } else { if (is_array($this->plots[$j]->fill_color)) { $numcolors = count($this->plots[$j]->fill_color); @@ -1148,16 +971,15 @@ class AccBarPlot extends BarPlot if ($fillcolor !== false) { $img->FilledPolygon($pts); } + $img->SetColor($this->plots[$j]->color); } - $img->SetColor($this->plots[$j]->color); - // Stroke the pattern if ($this->plots[$j]->iPattern > -1) { if ($pattern===null) { $pattern = new RectPatternFactory(); } - + $prect = $pattern->Create($this->plots[$j]->iPattern, $this->plots[$j]->iPatternColor, 1); $prect->SetDensity($this->plots[$j]->iPatternDensity); if ($this->plots[$j]->coords[0][$i] < 0) { @@ -1202,21 +1024,13 @@ class AccBarPlot extends BarPlot $pts[] = $pts[0]; $pts[] = $pts[1]; - $img->SetLineWeight($this->plots[$j]->weight); + $img->SetLineWeight($this->plots[$j]->line_weight); $img->Polygon($pts); $img->SetLineWeight(1); } - - // Daw potential bar around the entire accbar bar - if ($this->weight > 0) { - $y=$yscale->Translate(0); - $img->SetColor($this->color); - $img->SetLineWeight($this->weight); - $img->Rectangle($pts[0], $y, $pts[6], $pts[5]); - } - + // Draw labels for each acc.bar - + $x=$pts[2]+($pts[4]-$pts[2])/2; if ($this->bar_shadow) { $x += $ssh; @@ -1224,22 +1038,23 @@ class AccBarPlot extends BarPlot // First stroke the accumulated value for the entire bar // This value is always placed at the top/bottom of the bars - if ($accy + $accy_neg < 0) { + if ($accy_neg < 0) { $y=$yscale->Translate($accy_neg); + $this->value->Stroke($img, $accy_neg, $x, $y); } else { $y=$yscale->Translate($accy); + $this->value->Stroke($img, $accy, $x, $y); } - $this->value->Stroke($img, $accy + $accy_neg, $x, $y); $accy = 0; $accy_neg = 0; for ($j=0; $j < $this->nbrplots; ++$j) { - // We don't print 0 values in an accumulated bar plot + // We don't print 0 values in an accumulated bar plot if ($this->plots[$j]->coords[0][$i] == 0) { continue; } - + if ($this->plots[$j]->coords[0][$i] > 0) { $yt=$yscale->Translate($this->plots[$j]->coords[0][$i]+$accy); $accyt=$yscale->Translate($accy); @@ -1283,7 +1098,7 @@ class AccBarPlot extends BarPlot $this->plots[$j]->value->SetMargin(-1); } } - $this->plots[$j]->value->Stroke($img, $this->plots[$j]->coords[0][$i], round($x), round($y)); + $this->plots[$j]->value->Stroke($img, $this->plots[$j]->coords[0][$i], $x, $y); } } return true; diff --git a/onyx2/include/jpgraph/jpgraph_canvas.php b/onyx2/include/jpgraph/jpgraph_canvas.php index dcf7fb2..7370de7 100644 --- a/onyx2/include/jpgraph/jpgraph_canvas.php +++ b/onyx2/include/jpgraph/jpgraph_canvas.php @@ -1,13 +1,13 @@ Graph($aWidth, $aHeight, $aCachedName, $timeout, $inline); } //--------------- @@ -66,12 +66,12 @@ class CanvasGraph extends Graph if (!$_csim) { - // Should we do any final image transformation + // Should we do any final image transformation if ($this->iImgTrans) { - if (!class_exists('ImgTrans', false)) { + if (!class_exists('ImgTrans')) { require_once('jpgraph_imgtrans.php'); } - + $tform = new ImgTrans($this->img->img); $this->img->img = $tform->Skew3D( $this->iImgTransHorizon, @@ -83,7 +83,7 @@ class CanvasGraph extends Graph $this->iImgTransBorder ); } - + // If the filename is given as the special _IMG_HANDLER // then the image handler is returned and the image is NOT diff --git a/onyx2/include/jpgraph/jpgraph_canvtools.php b/onyx2/include/jpgraph/jpgraph_canvtools.php index ce83772..b4f6d7f 100644 --- a/onyx2/include/jpgraph/jpgraph_canvtools.php +++ b/onyx2/include/jpgraph/jpgraph_canvtools.php @@ -1,18 +1,18 @@ g = $graph; $this->w = $graph->img->width; @@ -41,7 +41,7 @@ class CanvasScale $this->iymin = $ymin; $this->iymax = $ymax; } - + public function Set($xmin=0, $xmax=10, $ymin=0, $ymax=10) { $this->ixmin = $xmin; @@ -50,11 +50,6 @@ class CanvasScale $this->iymax = $ymax; } - public function Get() - { - return array($this->ixmin,$this->ixmax,$this->iymin,$this->iymax); - } - public function Translate($x, $y) { $xp = round(($x-$this->ixmin)/($this->ixmax - $this->ixmin) * $this->w); @@ -85,7 +80,7 @@ class Shape private $img; private $scale; - public function __construct($aGraph, $scale) + public function Shape($aGraph, $scale) { $this->img = $aGraph->img; $this->img->SetColor('black'); @@ -104,11 +99,6 @@ class Shape $this->img->Line($x1, $y1, $x2, $y2); } - public function SetLineWeight($aWeight) - { - $this->img->SetLineWeight($aWeight); - } - public function Polygon($p, $aClosed=false) { $n=count($p); @@ -128,7 +118,7 @@ class Shape } $this->img->FilledPolygon($p); } - + // Draw a bezier curve with defining points in the $aPnts array // using $aSteps steps. @@ -178,7 +168,7 @@ class Shape list($x2, $y2) = $this->scale->Translate($x2, $y2); $this->img->FilledRectangle($x1, $y1, $x2, $y2); } - + public function Circle($x1, $y1, $r) { list($x1, $y1) = $this->scale->Translate($x1, $y1); @@ -262,149 +252,149 @@ class Shape list($xt, $yt) = $this->scale->Translate($xt, $yt); list($w, $h) = $this->scale->Translate($w, $h); list($iw, $ih) = $this->scale->Translate($iw, $ih); - + $xr = $xt + $w - 0; $yl = $yt + $h - 0; switch ($aCorner) { - case 0: // Upper left - - // Bottom line, left & right arc - $this->img->Line($xt+$r, $yl, $xr-$r, $yl); - $this->img->Arc($xt+$r, $yl-$r, $r*2, $r*2, 90, 180); - $this->img->Arc($xr-$r, $yl-$r, $r*2, $r*2, 0, 90); + case 0: // Upper left + + // Bottom line, left & right arc + $this->img->Line($xt+$r, $yl, $xr-$r, $yl); + $this->img->Arc($xt+$r, $yl-$r, $r*2, $r*2, 90, 180); + $this->img->Arc($xr-$r, $yl-$r, $r*2, $r*2, 0, 90); - // Right line, Top right arc - $this->img->Line($xr, $yt+$r, $xr, $yl-$r); - $this->img->Arc($xr-$r, $yt+$r, $r*2, $r*2, 270, 360); + // Right line, Top right arc + $this->img->Line($xr, $yt+$r, $xr, $yl-$r); + $this->img->Arc($xr-$r, $yt+$r, $r*2, $r*2, 270, 360); - // Top line, Top left arc - $this->img->Line($xt+$iw+$r, $yt, $xr-$r, $yt); - $this->img->Arc($xt+$iw+$r, $yt+$r, $r*2, $r*2, 180, 270); + // Top line, Top left arc + $this->img->Line($xt+$iw+$r, $yt, $xr-$r, $yt); + $this->img->Arc($xt+$iw+$r, $yt+$r, $r*2, $r*2, 180, 270); - // Left line - $this->img->Line($xt, $yt+$ih+$r, $xt, $yl-$r); + // Left line + $this->img->Line($xt, $yt+$ih+$r, $xt, $yl-$r); - // Indent horizontal, Lower left arc - $this->img->Line($xt+$r, $yt+$ih, $xt+$iw-$r, $yt+$ih); - $this->img->Arc($xt+$r, $yt+$ih+$r, $r*2, $r*2, 180, 270); + // Indent horizontal, Lower left arc + $this->img->Line($xt+$r, $yt+$ih, $xt+$iw-$r, $yt+$ih); + $this->img->Arc($xt+$r, $yt+$ih+$r, $r*2, $r*2, 180, 270); - // Indent vertical, Indent arc - $this->img->Line($xt+$iw, $yt+$r, $xt+$iw, $yt+$ih-$r); - $this->img->Arc($xt+$iw-$r, $yt+$ih-$r, $r*2, $r*2, 0, 90); + // Indent vertical, Indent arc + $this->img->Line($xt+$iw, $yt+$r, $xt+$iw, $yt+$ih-$r); + $this->img->Arc($xt+$iw-$r, $yt+$ih-$r, $r*2, $r*2, 0, 90); - if ($aFillColor != '') { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xr-$r, $yl-$r, $bc); - $this->img->PopColor(); - } - - break; - - case 1: // Upper right - - // Bottom line, left & right arc - $this->img->Line($xt+$r, $yl, $xr-$r, $yl); - $this->img->Arc($xt+$r, $yl-$r, $r*2, $r*2, 90, 180); - $this->img->Arc($xr-$r, $yl-$r, $r*2, $r*2, 0, 90); - - // Left line, Top left arc - $this->img->Line($xt, $yt+$r, $xt, $yl-$r); - $this->img->Arc($xt+$r, $yt+$r, $r*2, $r*2, 180, 270); - - // Top line, Top right arc - $this->img->Line($xt+$r, $yt, $xr-$iw-$r, $yt); - $this->img->Arc($xr-$iw-$r, $yt+$r, $r*2, $r*2, 270, 360); - - // Right line - $this->img->Line($xr, $yt+$ih+$r, $xr, $yl-$r); - - // Indent horizontal, Lower right arc - $this->img->Line($xr-$iw+$r, $yt+$ih, $xr-$r, $yt+$ih); - $this->img->Arc($xr-$r, $yt+$ih+$r, $r*2, $r*2, 270, 360); - - // Indent vertical, Indent arc - $this->img->Line($xr-$iw, $yt+$r, $xr-$iw, $yt+$ih-$r); - $this->img->Arc($xr-$iw+$r, $yt+$ih-$r, $r*2, $r*2, 90, 180); - - if ($aFillColor != '') { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xt+$r, $yl-$r, $bc); - $this->img->PopColor(); - } - - break; - - case 2: // Lower right - // Top line, Top left & Top right arc - $this->img->Line($xt+$r, $yt, $xr-$r, $yt); - $this->img->Arc($xt+$r, $yt+$r, $r*2, $r*2, 180, 270); - $this->img->Arc($xr-$r, $yt+$r, $r*2, $r*2, 270, 360); - - // Left line, Bottom left arc - $this->img->Line($xt, $yt+$r, $xt, $yl-$r); - $this->img->Arc($xt+$r, $yl-$r, $r*2, $r*2, 90, 180); - - // Bottom line, Bottom right arc - $this->img->Line($xt+$r, $yl, $xr-$iw-$r, $yl); - $this->img->Arc($xr-$iw-$r, $yl-$r, $r*2, $r*2, 0, 90); - - // Right line - $this->img->Line($xr, $yt+$r, $xr, $yl-$ih-$r); - - // Indent horizontal, Lower right arc - $this->img->Line($xr-$r, $yl-$ih, $xr-$iw+$r, $yl-$ih); - $this->img->Arc($xr-$r, $yl-$ih-$r, $r*2, $r*2, 0, 90); - - // Indent vertical, Indent arc - $this->img->Line($xr-$iw, $yl-$r, $xr-$iw, $yl-$ih+$r); - $this->img->Arc($xr-$iw+$r, $yl-$ih+$r, $r*2, $r*2, 180, 270); - - if ($aFillColor != '') { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xt+$r, $yt+$r, $bc); - $this->img->PopColor(); - } - - break; - - case 3: // Lower left - // Top line, Top left & Top right arc - $this->img->Line($xt+$r, $yt, $xr-$r, $yt); - $this->img->Arc($xt+$r, $yt+$r, $r*2, $r*2, 180, 270); - $this->img->Arc($xr-$r, $yt+$r, $r*2, $r*2, 270, 360); - - // Right line, Bottom right arc - $this->img->Line($xr, $yt+$r, $xr, $yl-$r); - $this->img->Arc($xr-$r, $yl-$r, $r*2, $r*2, 0, 90); - - // Bottom line, Bottom left arc - $this->img->Line($xt+$iw+$r, $yl, $xr-$r, $yl); - $this->img->Arc($xt+$iw+$r, $yl-$r, $r*2, $r*2, 90, 180); - - // Left line - $this->img->Line($xt, $yt+$r, $xt, $yl-$ih-$r); - - // Indent horizontal, Lower left arc - $this->img->Line($xt+$r, $yl-$ih, $xt+$iw-$r, $yl-$ih); - $this->img->Arc($xt+$r, $yl-$ih-$r, $r*2, $r*2, 90, 180); - - // Indent vertical, Indent arc - $this->img->Line($xt+$iw, $yl-$ih+$r, $xt+$iw, $yl-$r); - $this->img->Arc($xt+$iw-$r, $yl-$ih+$r, $r*2, $r*2, 270, 360); - - if ($aFillColor != '') { - $bc = $this->img->current_color_name; - $this->img->PushColor($aFillColor); - $this->img->FillToBorder($xr-$r, $yt+$r, $bc); - $this->img->PopColor(); - } - - break; + if ($aFillColor != '') { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xr-$r, $yl-$r, $bc); + $this->img->PopColor(); } + + break; + + case 1: // Upper right + + // Bottom line, left & right arc + $this->img->Line($xt+$r, $yl, $xr-$r, $yl); + $this->img->Arc($xt+$r, $yl-$r, $r*2, $r*2, 90, 180); + $this->img->Arc($xr-$r, $yl-$r, $r*2, $r*2, 0, 90); + + // Left line, Top left arc + $this->img->Line($xt, $yt+$r, $xt, $yl-$r); + $this->img->Arc($xt+$r, $yt+$r, $r*2, $r*2, 180, 270); + + // Top line, Top right arc + $this->img->Line($xt+$r, $yt, $xr-$iw-$r, $yt); + $this->img->Arc($xr-$iw-$r, $yt+$r, $r*2, $r*2, 270, 360); + + // Right line + $this->img->Line($xr, $yt+$ih+$r, $xr, $yl-$r); + + // Indent horizontal, Lower right arc + $this->img->Line($xr-$iw+$r, $yt+$ih, $xr-$r, $yt+$ih); + $this->img->Arc($xr-$r, $yt+$ih+$r, $r*2, $r*2, 270, 360); + + // Indent vertical, Indent arc + $this->img->Line($xr-$iw, $yt+$r, $xr-$iw, $yt+$ih-$r); + $this->img->Arc($xr-$iw+$r, $yt+$ih-$r, $r*2, $r*2, 90, 180); + + if ($aFillColor != '') { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xt+$r, $yl-$r, $bc); + $this->img->PopColor(); + } + + break; + + case 2: // Lower right + // Top line, Top left & Top right arc + $this->img->Line($xt+$r, $yt, $xr-$r, $yt); + $this->img->Arc($xt+$r, $yt+$r, $r*2, $r*2, 180, 270); + $this->img->Arc($xr-$r, $yt+$r, $r*2, $r*2, 270, 360); + + // Left line, Bottom left arc + $this->img->Line($xt, $yt+$r, $xt, $yl-$r); + $this->img->Arc($xt+$r, $yl-$r, $r*2, $r*2, 90, 180); + + // Bottom line, Bottom right arc + $this->img->Line($xt+$r, $yl, $xr-$iw-$r, $yl); + $this->img->Arc($xr-$iw-$r, $yl-$r, $r*2, $r*2, 0, 90); + + // Right line + $this->img->Line($xr, $yt+$r, $xr, $yl-$ih-$r); + + // Indent horizontal, Lower right arc + $this->img->Line($xr-$r, $yl-$ih, $xr-$iw+$r, $yl-$ih); + $this->img->Arc($xr-$r, $yl-$ih-$r, $r*2, $r*2, 0, 90); + + // Indent vertical, Indent arc + $this->img->Line($xr-$iw, $yl-$r, $xr-$iw, $yl-$ih+$r); + $this->img->Arc($xr-$iw+$r, $yl-$ih+$r, $r*2, $r*2, 180, 270); + + if ($aFillColor != '') { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xt+$r, $yt+$r, $bc); + $this->img->PopColor(); + } + + break; + + case 3: // Lower left + // Top line, Top left & Top right arc + $this->img->Line($xt+$r, $yt, $xr-$r, $yt); + $this->img->Arc($xt+$r, $yt+$r, $r*2, $r*2, 180, 270); + $this->img->Arc($xr-$r, $yt+$r, $r*2, $r*2, 270, 360); + + // Right line, Bottom right arc + $this->img->Line($xr, $yt+$r, $xr, $yl-$r); + $this->img->Arc($xr-$r, $yl-$r, $r*2, $r*2, 0, 90); + + // Bottom line, Bottom left arc + $this->img->Line($xt+$iw+$r, $yl, $xr-$r, $yl); + $this->img->Arc($xt+$iw+$r, $yl-$r, $r*2, $r*2, 90, 180); + + // Left line + $this->img->Line($xt, $yt+$r, $xt, $yl-$ih-$r); + + // Indent horizontal, Lower left arc + $this->img->Line($xt+$r, $yl-$ih, $xt+$iw-$r, $yl-$ih); + $this->img->Arc($xt+$r, $yl-$ih-$r, $r*2, $r*2, 90, 180); + + // Indent vertical, Indent arc + $this->img->Line($xt+$iw, $yl-$ih+$r, $xt+$iw, $yl-$r); + $this->img->Arc($xt+$iw-$r, $yl-$ih+$r, $r*2, $r*2, 270, 360); + + if ($aFillColor != '') { + $bc = $this->img->current_color_name; + $this->img->PushColor($aFillColor); + $this->img->FillToBorder($xr-$r, $yt+$r, $bc); + $this->img->PopColor(); + } + + break; + } } } @@ -430,7 +420,7 @@ class CanvasRectangleText private $iShadowWidth=3; private $iShadowColor=''; - public function __construct($aTxt='', $xl=0, $yt=0, $w=0, $h=0) + public function CanvasRectangleText($aTxt='', $xl=0, $yt=0, $w=0, $h=0) { $this->iTxt = new Text($aTxt); $this->ix = $xl; @@ -438,7 +428,7 @@ class CanvasRectangleText $this->iw = $w; $this->ih = $h; } - + public function SetShadow($aColor='gray', $aWidth=3) { $this->iShadowColor = $aColor; @@ -512,8 +502,8 @@ class CanvasRectangleText public function Stroke($aImg, $scale) { - - // If coordinates are specifed as negative this means we should + + // If coordinates are specifed as negative this means we should // treat them as abolsute (pixels) coordinates if ($this->ix > 0) { $this->ix = $scale->TranslateX($this->ix) ; @@ -526,7 +516,7 @@ class CanvasRectangleText } else { $this->iy = -$this->iy; } - + list($this->iw, $this->ih) = $scale->Translate($this->iw, $this->ih) ; if ($this->iw == 0) { @@ -571,7 +561,7 @@ class CanvasRectangleText ); $aImg->PopColor(); } - + $this->iTxt->Align('center', 'center'); $this->iTxt->ParagraphAlign($this->iParaAlign); $this->iTxt->SetColor($this->iFontColor); diff --git a/onyx2/include/jpgraph/jpgraph_contour.php b/onyx2/include/jpgraph/jpgraph_contour.php deleted file mode 100755 index 9879ca0..0000000 --- a/onyx2/include/jpgraph/jpgraph_contour.php +++ /dev/null @@ -1,613 +0,0 @@ -nbrRows = count($aMatrix); - $this->nbrCols = count($aMatrix[0]); - $this->dataPoints = $aMatrix; - - if (is_array($aIsobars)) { - // use the isobar values supplied - $this->nbrIsobars = count($aIsobars); - $this->isobarValues = $aIsobars; - } else { - // Determine the isobar values automatically - $this->nbrIsobars = $aIsobars; - list($min, $max) = $this->getMinMaxVal(); - $stepSize = ($max-$min) / $aIsobars ; - $isobar = $min+$stepSize/2; - for ($i = 0; $i < $aIsobars; $i++) { - $this->isobarValues[$i] = $isobar; - $isobar += $stepSize; - } - } - - if ($aColors !== null && count($aColors) > 0) { - if (!is_array($aColors)) { - JpGraphError::RaiseL(28001); - //'Third argument to Contour must be an array of colors.' - } - - if (count($aColors) != count($this->isobarValues)) { - JpGraphError::RaiseL(28002); - //'Number of colors must equal the number of isobar lines specified'; - } - - $this->isobarColors = $aColors; - } - } - - /** - * Flip the plot around the Y-coordinate. This has the same affect as flipping the input - * data matrice - * - * @param $aFlg If true the the vertice in input data matrice position (0,0) corresponds to the top left - * corner of teh plot otherwise it will correspond to the bottom left corner (a horizontal flip) - */ - public function SetInvert($aFlg=true) - { - $this->invert = $aFlg; - } - - /** - * Find the min and max values in the data matrice - * - * @return array(min_value,max_value) - */ - public function getMinMaxVal() - { - $min = $this->dataPoints[0][0]; - $max = $this->dataPoints[0][0]; - for ($i = 0; $i < $this->nbrRows; $i++) { - if (($mi=min($this->dataPoints[$i])) < $min) { - $min = $mi; - } - if (($ma=max($this->dataPoints[$i])) > $max) { - $max = $ma; - } - } - return array($min,$max); - } - - /** - * Reset the two matrices that keeps track on where the isobars crosses the - * horizontal and vertical edges - */ - public function resetEdgeMatrices() - { - for ($k = 0; $k < 2; $k++) { - for ($i = 0; $i <= $this->nbrRows; $i++) { - for ($j = 0; $j <= $this->nbrCols; $j++) { - $this->edges[$k][$i][$j] = false; - } - } - } - } - - /** - * Determine if the specified isobar crosses the horizontal edge specified by its row and column - * - * @param $aRow Row index of edge to be checked - * @param $aCol Col index of edge to be checked - * @param $aIsobar Isobar value - * @return true if the isobar is crossing this edge - */ - public function isobarHCrossing($aRow, $aCol, $aIsobar) - { - if ($aCol >= $this->nbrCols-1) { - JpGraphError::RaiseL(28003, $aCol); - //'ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)' - } - if ($aRow >= $this->nbrRows) { - JpGraphError::RaiseL(28004, $aRow); - //'ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)' - } - - $v1 = $this->dataPoints[$aRow][$aCol]; - $v2 = $this->dataPoints[$aRow][$aCol+1]; - - return ($aIsobar-$v1)*($aIsobar-$v2) < 0 ; - } - - /** - * Determine if the specified isobar crosses the vertical edge specified by its row and column - * - * @param $aRow Row index of edge to be checked - * @param $aCol Col index of edge to be checked - * @param $aIsobar Isobar value - * @return true if the isobar is crossing this edge - */ - public function isobarVCrossing($aRow, $aCol, $aIsobar) - { - if ($aRow >= $this->nbrRows-1) { - JpGraphError::RaiseL(28005, $aRow); - //'isobarVCrossing: Row index too large - } - if ($aCol >= $this->nbrCols) { - JpGraphError::RaiseL(28006, $aCol); - //'isobarVCrossing: Col index too large - } - - $v1 = $this->dataPoints[$aRow][$aCol]; - $v2 = $this->dataPoints[$aRow+1][$aCol]; - - return ($aIsobar-$v1)*($aIsobar-$v2) < 0 ; - } - - /** - * Determine all edges, horizontal and vertical that the specified isobar crosses. The crossings - * are recorded in the two edge matrices. - * - * @param $aIsobar The value of the isobar to be checked - */ - public function determineIsobarEdgeCrossings($aIsobar) - { - $ib = $this->isobarValues[$aIsobar]; - - for ($i = 0; $i < $this->nbrRows-1; $i++) { - for ($j = 0; $j < $this->nbrCols-1; $j++) { - $this->edges[HORIZ_EDGE][$i][$j] = $this->isobarHCrossing($i, $j, $ib); - $this->edges[VERT_EDGE][$i][$j] = $this->isobarVCrossing($i, $j, $ib); - } - } - - // We now have the bottom and rightmost edges unsearched - for ($i = 0; $i < $this->nbrRows-1; $i++) { - $this->edges[VERT_EDGE][$i][$j] = $this->isobarVCrossing($i, $this->nbrCols-1, $ib); - } - for ($j = 0; $j < $this->nbrCols-1; $j++) { - $this->edges[HORIZ_EDGE][$i][$j] = $this->isobarHCrossing($this->nbrRows-1, $j, $ib); - } - } - - /** - * Return the normalized coordinates for the crossing of the specified edge with the specified - * isobar- The crossing is simpy detrmined with a linear interpolation between the two vertices - * on each side of the edge and the value of the isobar - * - * @param $aRow Row of edge - * @param $aCol Column of edge - * @param $aEdgeDir Determine if this is a horizontal or vertical edge - * @param $ib The isobar value - * @return unknown_type - */ - public function getCrossingCoord($aRow, $aCol, $aEdgeDir, $aIsobarVal) - { - - // In order to avoid numerical problem when two vertices are very close - // we have to check and avoid dividing by close to zero denumerator. - if ($aEdgeDir == HORIZ_EDGE) { - $d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow][$aCol+1]); - if ($d > 0.001) { - $xcoord = $aCol + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d; - } else { - $xcoord = $aCol; - } - $ycoord = $aRow; - } else { - $d = abs($this->dataPoints[$aRow][$aCol] - $this->dataPoints[$aRow+1][$aCol]); - if ($d > 0.001) { - $ycoord = $aRow + abs($aIsobarVal - $this->dataPoints[$aRow][$aCol]) / $d; - } else { - $ycoord = $aRow; - } - $xcoord = $aCol; - } - if ($this->invert) { - $ycoord = $this->nbrRows-1 - $ycoord; - } - return array($xcoord,$ycoord); - } - - /** - * In order to avoid all kinds of unpleasent extra checks and complex boundary - * controls for the degenerated case where the contour levels exactly crosses - * one of the vertices we add a very small delta (0.1%) to the data point value. - * This has no visible affect but it makes the code sooooo much cleaner. - * - */ - public function adjustDataPointValues() - { - $ni = count($this->isobarValues); - for ($k = 0; $k < $ni; $k++) { - $ib = $this->isobarValues[$k]; - for ($row = 0 ; $row < $this->nbrRows-1; ++$row) { - for ($col = 0 ; $col < $this->nbrCols-1; ++$col) { - if (abs($this->dataPoints[$row][$col] - $ib) < 0.0001) { - $this->dataPoints[$row][$col] += $this->dataPoints[$row][$col]*0.001; - } - } - } - } - } - - /** - * @param $aFlg - * @param $aBW - * @return unknown_type - */ - public function UseHighContrastColor($aFlg=true, $aBW=false) - { - $this->highcontrast = $aFlg; - $this->highcontrastbw = $aBW; - } - - /** - * Calculate suitable colors for each defined isobar - * - */ - public function CalculateColors() - { - if ($this->highcontrast) { - if ($this->highcontrastbw) { - for ($ib = 0; $ib < $this->nbrIsobars; $ib++) { - $this->isobarColors[$ib] = 'black'; - } - } else { - // Use only blue/red scale - $step = round(255/($this->nbrIsobars-1)); - for ($ib = 0; $ib < $this->nbrIsobars; $ib++) { - $this->isobarColors[$ib] = array($ib*$step, 50, 255-$ib*$step); - } - } - } else { - $n = $this->nbrIsobars; - $v = 0; - $step = 1 / ($this->nbrIsobars-1); - for ($ib = 0; $ib < $this->nbrIsobars; $ib++) { - $this->isobarColors[$ib] = RGB::GetSpectrum($v); - $v += $step; - } - } - } - - /** - * This is where the main work is done. For each isobar the crossing of the edges are determined - * and then each cell is analyzed to find the 0, 2 or 4 crossings. Then the normalized coordinate - * for the crossings are determined and pushed on to the isobar stack. When the method is finished - * the $isobarCoord will hold one arrayfor each isobar where all the line segments that makes - * up the contour plot are stored. - * - * @return array( $isobarCoord, $isobarValues, $isobarColors ) - */ - public function getIsobars() - { - $this->adjustDataPointValues(); - - for ($isobar = 0; $isobar < $this->nbrIsobars; $isobar++) { - $ib = $this->isobarValues[$isobar]; - $this->resetEdgeMatrices(); - $this->determineIsobarEdgeCrossings($isobar); - $this->isobarCoord[$isobar] = array(); - - $ncoord = 0; - - for ($row = 0 ; $row < $this->nbrRows-1; ++$row) { - for ($col = 0 ; $col < $this->nbrCols-1; ++$col) { - - // Find out how many crossings around the edges - $n = 0; - if ($this->edges[HORIZ_EDGE][$row][$col]) { - $neigh[$n++] = array($row, $col, HORIZ_EDGE); - } - if ($this->edges[HORIZ_EDGE][$row+1][$col]) { - $neigh[$n++] = array($row+1,$col, HORIZ_EDGE); - } - if ($this->edges[VERT_EDGE][$row][$col]) { - $neigh[$n++] = array($row, $col, VERT_EDGE); - } - if ($this->edges[VERT_EDGE][$row][$col+1]) { - $neigh[$n++] = array($row, $col+1,VERT_EDGE); - } - - if ($n == 2) { - $n1=0; - $n2=1; - $this->isobarCoord[$isobar][$ncoord++] = array( - $this->getCrossingCoord($neigh[$n1][0], $neigh[$n1][1], $neigh[$n1][2], $ib), - $this->getCrossingCoord($neigh[$n2][0], $neigh[$n2][1], $neigh[$n2][2], $ib) ); - } elseif ($n == 4) { - // We must determine how to connect the edges either northwest->southeast or - // northeast->southwest. We do that by calculating the imaginary middle value of - // the cell by averaging the for corners. This will compared with the value of the - // top left corner will help determine the orientation of the ridge/creek - $midval = ($this->dataPoints[$row][$col]+$this->dataPoints[$row][$col+1]+$this->dataPoints[$row+1][$col]+$this->dataPoints[$row+1][$col+1])/4; - $v = $this->dataPoints[$row][$col]; - if ($midval == $ib) { - // Orientation "+" - $n1=0; - $n2=1; - $n3=2; - $n4=3; - } elseif (($midval > $ib && $v > $ib) || ($midval < $ib && $v < $ib)) { - // Orientation of ridge/valley = "\" - $n1=0; - $n2=3; - $n3=2; - $n4=1; - } elseif (($midval > $ib && $v < $ib) || ($midval < $ib && $v > $ib)) { - // Orientation of ridge/valley = "/" - $n1=0; - $n2=2; - $n3=3; - $n4=1; - } - - $this->isobarCoord[$isobar][$ncoord++] = array( - $this->getCrossingCoord($neigh[$n1][0], $neigh[$n1][1], $neigh[$n1][2], $ib), - $this->getCrossingCoord($neigh[$n2][0], $neigh[$n2][1], $neigh[$n2][2], $ib) ); - - $this->isobarCoord[$isobar][$ncoord++] = array( - $this->getCrossingCoord($neigh[$n3][0], $neigh[$n3][1], $neigh[$n3][2], $ib), - $this->getCrossingCoord($neigh[$n4][0], $neigh[$n4][1], $neigh[$n4][2], $ib) ); - } - } - } - } - - if (count($this->isobarColors) == 0) { - // No manually specified colors. Calculate them automatically. - $this->CalculateColors(); - } - return array( $this->isobarCoord, $this->isobarValues, $this->isobarColors ); - } -} - - -/** - * This class represent a plotting of a contour outline of data given as a X-Y matrice - * - */ -class ContourPlot extends Plot -{ - private $contour; - private $contourCoord; - private $contourVal; - private $contourColor; - private $nbrCountours = 0 ; - private $dataMatrix = array(); - private $invertLegend = false; - private $interpFactor = 1; - private $flipData = false; - private $isobar = 10; - private $showLegend = false; - private $highcontrast = false; - private $highcontrastbw = false; - private $manualIsobarColors = array(); - - /** - * Construct a contour plotting algorithm. The end result of the algorithm is a sequence of - * line segments for each isobar given as two vertices. - * - * @param $aDataMatrix The Z-data to be used - * @param $aIsobar A mixed variable, if it is an integer then this specified the number of isobars to use. - * The values of the isobars are automatically detrmined to be equ-spaced between the min/max value of the - * data. If it is an array then it explicetely gives the isobar values - * @param $aInvert By default the matrice with row index 0 corresponds to Y-value 0, i.e. in the bottom of - * the plot. If this argument is true then the row with the highest index in the matrice corresponds to - * Y-value 0. In affect flipping the matrice around an imaginary horizontal axis. - * @param $aHighContrast Use high contrast colors (blue/red:ish) - * @param $aHighContrastBW Use only black colors for contours - * @return an instance of the contour plot algorithm - */ - public function __construct($aDataMatrix, $aIsobar=10, $aFactor=1, $aInvert=false, $aIsobarColors=array()) - { - $this->dataMatrix = $aDataMatrix; - $this->flipData = $aInvert; - $this->isobar = $aIsobar; - $this->interpFactor = $aFactor; - - if ($this->interpFactor > 1) { - if ($this->interpFactor > 5) { - JpGraphError::RaiseL(28007);// ContourPlot interpolation factor is too large (>5) - } - - $ip = new MeshInterpolate(); - $this->dataMatrix = $ip->Linear($this->dataMatrix, $this->interpFactor); - } - - $this->contour = new Contour($this->dataMatrix, $this->isobar, $aIsobarColors); - - if (is_array($aIsobar)) { - $this->nbrContours = count($aIsobar); - } else { - $this->nbrContours = $aIsobar; - } - } - - - /** - * Flipe the data around the center - * - * @param $aFlg - * - */ - public function SetInvert($aFlg=true) - { - $this->flipData = $aFlg; - } - - /** - * Set the colors for the isobar lines - * - * @param $aColorArray - * - */ - public function SetIsobarColors($aColorArray) - { - $this->manualIsobarColors = $aColorArray; - } - - /** - * Show the legend - * - * @param $aFlg true if the legend should be shown - * - */ - public function ShowLegend($aFlg=true) - { - $this->showLegend = $aFlg; - } - - - /** - * @param $aFlg true if the legend should start with the lowest isobar on top - * @return unknown_type - */ - public function Invertlegend($aFlg=true) - { - $this->invertLegend = $aFlg; - } - - /* Internal method. Give the min value to be used for the scaling - * - */ - public function Min() - { - return array(0,0); - } - - /* Internal method. Give the max value to be used for the scaling - * - */ - public function Max() - { - return array(count($this->dataMatrix[0])-1,count($this->dataMatrix)-1); - } - - /** - * Internal ramewrok method to setup the legend to be used for this plot. - * @param $aGraph The parent graph class - */ - public function Legend($aGraph) - { - if (! $this->showLegend) { - return; - } - - if ($this->invertLegend) { - for ($i = 0; $i < $this->nbrContours; $i++) { - $aGraph->legend->Add(sprintf('%.1f', $this->contourVal[$i]), $this->contourColor[$i]); - } - } else { - for ($i = $this->nbrContours-1; $i >= 0 ; $i--) { - $aGraph->legend->Add(sprintf('%.1f', $this->contourVal[$i]), $this->contourColor[$i]); - } - } - } - - - /** - * Framework function which gets called before the Stroke() method is called - * - * @see Plot#PreScaleSetup($aGraph) - * - */ - public function PreScaleSetup($aGraph) - { - $xn = count($this->dataMatrix[0])-1; - $yn = count($this->dataMatrix)-1; - - $aGraph->xaxis->scale->Update($aGraph->img, 0, $xn); - $aGraph->yaxis->scale->Update($aGraph->img, 0, $yn); - - $this->contour->SetInvert($this->flipData); - list($this->contourCoord, $this->contourVal, $this->contourColor) = $this->contour->getIsobars(); - } - - /** - * Use high contrast color schema - * - * @param $aFlg True, to use high contrast color - * @param $aBW True, Use only black and white color schema - */ - public function UseHighContrastColor($aFlg=true, $aBW=false) - { - $this->highcontrast = $aFlg; - $this->highcontrastbw = $aBW; - $this->contour->UseHighContrastColor($this->highcontrast, $this->highcontrastbw); - } - - /** - * Internal method. Stroke the contour plot to the graph - * - * @param $img Image handler - * @param $xscale Instance of the xscale to use - * @param $yscale Instance of the yscale to use - */ - public function Stroke($img, $xscale, $yscale) - { - if (count($this->manualIsobarColors) > 0) { - $this->contourColor = $this->manualIsobarColors; - if (count($this->manualIsobarColors) != $this->nbrContours) { - JpGraphError::RaiseL(28002); - } - } - - $img->SetLineWeight($this->line_weight); - - for ($c = 0; $c < $this->nbrContours; $c++) { - $img->SetColor($this->contourColor[$c]); - - $n = count($this->contourCoord[$c]); - $i = 0; - while ($i < $n) { - list($x1, $y1) = $this->contourCoord[$c][$i][0]; - $x1t = $xscale->Translate($x1); - $y1t = $yscale->Translate($y1); - - list($x2, $y2) = $this->contourCoord[$c][$i++][1]; - $x2t = $xscale->Translate($x2); - $y2t = $yscale->Translate($y2); - - $img->Line($x1t, $y1t, $x2t, $y2t); - } - } - } -} - -// EOF diff --git a/onyx2/include/jpgraph/jpgraph_date.php b/onyx2/include/jpgraph/jpgraph_date.php index 4392a54..9d0d32d 100644 --- a/onyx2/include/jpgraph/jpgraph_date.php +++ b/onyx2/include/jpgraph/jpgraph_date.php @@ -1,49 +1,49 @@ type=$aType; $this->scale=array($aMin,$aMax); $this->world_size=$aMax-$aMin; @@ -113,14 +113,14 @@ class DateScale extends LinearScale } } else { // Adjust to an even week boundary. - $w = (int)date('w', $aTime); // Day of week 0=Sun, 6=Sat - if (true) { // Adjust to start on Mon - if ($w==0) { - $w=6; - } else { - --$w; - } - } + $w = (int)date('w', $aTime); // Day of week 0=Sun, 6=Sat + if (true) { // Adjust to start on Mon + if ($w==0) { + $w=6; + } else { + --$w; + } + } if ($aRound == 0) { $d -= $w; } else { @@ -256,73 +256,73 @@ class DateScale extends LinearScale { // Format of array // array ( Decision point, array( array( Major-scale-step-array ), - // array( Minor-scale-step-array ), - // array( 0=date-adjust, 1=time-adjust, adjustment-alignment) ) + // array( Minor-scale-step-array ), + // array( 0=date-adjust, 1=time-adjust, adjustment-alignment) ) // $scalePoints = array( /* Intervall larger than 10 years */ SECPERYEAR*10,array(array(SECPERYEAR*5,SECPERYEAR*2), - array(SECPERYEAR), - array(0,YEARADJ_1, 0,YEARADJ_1) ), + array(SECPERYEAR), + array(0,YEARADJ_1, 0,YEARADJ_1) ), /* Intervall larger than 2 years */ SECPERYEAR*2,array(array(SECPERYEAR),array(SECPERYEAR), - array(0,YEARADJ_1) ), + array(0,YEARADJ_1) ), /* Intervall larger than 90 days (approx 3 month) */ SECPERDAY*90,array(array(SECPERDAY*30,SECPERDAY*14,SECPERDAY*7,SECPERDAY), - array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY), - array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)), + array(SECPERDAY*5,SECPERDAY*7,SECPERDAY,SECPERDAY), + array(0,MONTHADJ_1, 0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1)), /* Intervall larger than 30 days (approx 1 month) */ SECPERDAY*30,array(array(SECPERDAY*14,SECPERDAY*7,SECPERDAY*2, SECPERDAY), - array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY), - array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)), + array(SECPERDAY,SECPERDAY,SECPERDAY,SECPERDAY), + array(0,DAYADJ_WEEK, 0,DAYADJ_1, 0,DAYADJ_1, 0,DAYADJ_1)), /* Intervall larger than 7 days */ SECPERDAY*7,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2), - array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR), - array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)), + array(SECPERHOUR*6,SECPERHOUR*3,SECPERHOUR,SECPERHOUR), + array(0,DAYADJ_1, 1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1)), /* Intervall larger than 1 day */ SECPERDAY,array(array(SECPERDAY,SECPERHOUR*12,SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR), - array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR), - array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)), + array(SECPERHOUR*6,SECPERHOUR*2,SECPERHOUR,SECPERHOUR,SECPERHOUR), + array(1,HOURADJ_12, 1,HOURADJ_6, 1,HOURADJ_1, 1,HOURADJ_1)), /* Intervall larger than 12 hours */ SECPERHOUR*12,array(array(SECPERHOUR*2,SECPERHOUR,SECPERMIN*30,900,600), - array(1800,1800,900,300,300), - array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), + array(1800,1800,900,300,300), + array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), /* Intervall larger than 2 hours */ SECPERHOUR*2,array(array(SECPERHOUR,SECPERMIN*30,900,600,300), - array(1800,900,300,120,60), - array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), + array(1800,900,300,120,60), + array(1,HOURADJ_1, 1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), /* Intervall larger than 1 hours */ SECPERHOUR,array(array(SECPERMIN*30,900,600,300),array(900,300,120,60), - array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), + array(1,MINADJ_30, 1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5) ), /* Intervall larger than 30 min */ SECPERMIN*30,array(array(SECPERMIN*15,SECPERMIN*10,SECPERMIN*5,SECPERMIN), - array(300,300,60,10), - array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)), + array(300,300,60,10), + array(1,MINADJ_15, 1,MINADJ_10, 1,MINADJ_5, 1,MINADJ_1)), /* Intervall larger than 1 min */ SECPERMIN,array(array(SECPERMIN,15,10,5), - array(15,5,2,1), - array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)), + array(15,5,2,1), + array(1,MINADJ_1, 1,SECADJ_15, 1,SECADJ_10, 1,SECADJ_5)), /* Intervall larger than 10 sec */ 10,array(array(5,2), - array(1,1), - array(1,SECADJ_5, 1,SECADJ_1)), + array(1,1), + array(1,SECADJ_5, 1,SECADJ_1)), /* Intervall larger than 1 sec */ 1,array(array(1), - array(1), - array(1,SECADJ_1)), + array(1), + array(1,SECADJ_1)), ); $ns = count($scalePoints); @@ -433,16 +433,10 @@ class DateScale extends LinearScale // identical to LinearScale::AutoScale if ($aStartTime == $aEndTime) { // Special case when we only have one data point. - // Create a small artificial interval to do the autoscaling + // Create a small artifical intervall to do the autoscaling $aStartTime -= 10; $aEndTime += 10; } - if (abs($aEndTime - $aStartTime) <= 1) { - // Special case when we only have one second. - // Create a small artificial interval to do the autoscaling - $aStartTime -= 1; - $aEndTime += 1; - } $done=false; $i=0; while (! $done && $i < 5) { @@ -453,19 +447,19 @@ class DateScale extends LinearScale } $i++; } - + /* - if( 0 ) { // DEBUG - echo " Start =".date("Y-m-d H:i:s",$aStartTime)."
"; - echo " End =".date("Y-m-d H:i:s",$aEndTime)."
"; - echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."
"; - echo "Adj End =".date("Y-m-d H:i:s",$adjend)."

"; - echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day
"; - echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day
"; - echo "Format=$format

"; - } - */ - + if( 0 ) { // DEBUG + echo " Start =".date("Y-m-d H:i:s",$aStartTime)."
"; + echo " End =".date("Y-m-d H:i:s",$aEndTime)."
"; + echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."
"; + echo "Adj End =".date("Y-m-d H:i:s",$adjend)."

"; + echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day
"; + echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day
"; + echo "Format=$format

"; + } + */ + if ($this->iStartTimeAlign !== false && $this->iStartAlign !== false) { JpGraphError::RaiseL(3001); //('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both'); @@ -491,7 +485,7 @@ class DateScale extends LinearScale } - + if ($this->iStartAlign !== false) { if ($this->iStartAlign >= 30) { $adjstart = $this->AdjStartDate($aStartTime, $this->iStartAlign-30); diff --git a/onyx2/include/jpgraph/jpgraph_errhandler.inc.php b/onyx2/include/jpgraph/jpgraph_errhandler.inc.php index fbd867c..325b357 100644 --- a/onyx2/include/jpgraph/jpgraph_errhandler.inc.php +++ b/onyx2/include/jpgraph/jpgraph_errhandler.inc.php @@ -1,22 +1,15 @@ Raise($aMsg, $aHalt); } public static function SetErrLocale($aLoc) { @@ -117,91 +112,12 @@ class JpGraphError } public static function RaiseL($errnbr, $a1=null, $a2=null, $a3=null, $a4=null, $a5=null) { - throw new JpGraphExceptionL($errnbr, $a1, $a2, $a3, $a4, $a5); - } - public static function SetImageFlag($aFlg=true) - { - self::$__iImgFlg = $aFlg; - } - public static function GetImageFlag() - { - return self::$__iImgFlg; - } - public static function SetLogFile($aFile) - { - self::$__iLogFile = $aFile; - } - public static function GetLogFile() - { - return self::$__iLogFile; - } - public static function SetTitle($aTitle) - { - self::$__iTitle = $aTitle; - } - public static function GetTitle() - { - return self::$__iTitle; + $t = new ErrMsgText(); + $msg = $t->Get($errnbr, $a1, $a2, $a3, $a4, $a5); + self::$__jpg_err->Raise($msg); } } -class JpGraphException extends Exception -{ - // Redefine the exception so message isn't optional - public function __construct($message, $code = 0) - { - // make sure everything is assigned properly - parent::__construct($message, $code); - } - // custom string representation of object - public function _toString() - { - return __CLASS__ . ": [{$this->code}]: {$this->message} at " . basename($this->getFile()) . ":" . $this->getLine() . "\n" . $this->getTraceAsString() . "\n"; - } - // custom representation of error as an image - public function Stroke() - { - if (JpGraphError::GetImageFlag()) { - $errobj = new JpGraphErrObjectImg(); - $errobj->SetTitle(JpGraphError::GetTitle()); - } else { - $errobj = new JpGraphErrObject(); - $errobj->SetTitle(JpGraphError::GetTitle()); - $errobj->SetStrokeDest(JpGraphError::GetLogFile()); - } - $errobj->Raise($this->getMessage()); - } - public static function defaultHandler(Throwable $exception) - { - global $__jpg_OldHandler; - if ($exception instanceof JpGraphException) { - $exception->Stroke(); - } else { - // Restore old handler - if ($__jpg_OldHandler !== null) { - set_exception_handler($__jpg_OldHandler); - } - throw $exception; - } - } -} - -class JpGraphExceptionL extends JpGraphException -{ - // Redefine the exception so message isn't optional - public function __construct($errcode, $a1=null, $a2=null, $a3=null, $a4=null, $a5=null) - { - // make sure everything is assigned properly - $errtxt = new ErrMsgText(); - JpGraphError::SetTitle('JpGraph Error: '.$errcode); - parent::__construct($errtxt->Get($errcode, $a1, $a2, $a3, $a4, $a5), 0); - } -} - -// Setup the default handler -global $__jpg_OldHandler; -$__jpg_OldHandler = set_exception_handler(array('JpGraphException','defaultHandler')); - // // First of all set up a default error handler // @@ -211,11 +127,11 @@ $__jpg_OldHandler = set_exception_handler(array('JpGraphException','defaultHandl //============================================================= class JpGraphErrObject { - protected $iTitle = "JpGraph error: "; + protected $iTitle = "JpGraph Error"; protected $iDest = false; - public function __construct() + public function JpGraphErrObject() { // Empty. Reserved for future use } @@ -231,31 +147,20 @@ class JpGraphErrObject } // If aHalt is true then execution can't continue. Typical used for fatal errors - public function Raise($aMsg, $aHalt=false) + public function Raise($aMsg, $aHalt=true) { - if ($this->iDest != '') { - if ($this->iDest == 'syslog') { - error_log($this->iTitle.$aMsg); - } else { - $str = '['.date('r').'] '.$this->iTitle.$aMsg."\n"; - $f = @fopen($this->iDest, 'a'); - if ($f) { - @fwrite($f, $str); - @fclose($f); - } + $aMsg = $this->iTitle.' '.$aMsg; + if ($this->iDest) { + $f = @fopen($this->iDest, 'a'); + if ($f) { + @fwrite($f, $aMsg); + @fclose($f); } } else { - $aMsg = $this->iTitle.$aMsg; - // Check SAPI and if we are called from the command line - // send the error to STDERR instead - if (PHP_SAPI == 'cli') { - fwrite(STDERR, $aMsg); - } else { - echo $aMsg; - } + echo $aMsg; } if ($aHalt) { - exit(1); + die(); } } } @@ -265,32 +170,25 @@ class JpGraphErrObject //============================================================== class JpGraphErrObjectImg extends JpGraphErrObject { - public function __construct() - { - parent::__construct(); - // Empty. Reserved for future use - } - public function Raise($aMsg, $aHalt=true) { $img_iconerror = - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'. - 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. - 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'. - 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. - 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'. - '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'. - 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'. - 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'. - 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'. - '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'. - 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'. - 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'. - 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'. - 'qL72fwAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'. + 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. + 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'. + 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'. + 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'. + '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'. + 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'. + 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'. + 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'. + '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'. + 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'. + 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'. + 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'. + 'qL72fwAAAABJRU5ErkJggg==' ; - if (function_exists("imagetypes")) { $supported = imagetypes(); } else { @@ -300,7 +198,7 @@ class JpGraphErrObjectImg extends JpGraphErrObject if (!function_exists('imagecreatefromstring')) { $supported = 0; } - + if (ob_get_length() || headers_sent() || !($supported & IMG_PNG)) { // Special case for headers already sent or that the installation doesn't support // the PNG format (which the error icon is encoded in). @@ -326,7 +224,7 @@ class JpGraphErrObjectImg extends JpGraphErrObject $img->FilledRectangle(5, 5, $w-1, $h-1, 10); $img->SetColor("gray:0.7"); $img->FilledRectangle(5, 5, $w-3, $h-3, 10); - + // Window background $img->SetColor("lightblue"); $img->FilledRectangle(1, 1, $w-5, $h-5); @@ -336,7 +234,7 @@ class JpGraphErrObjectImg extends JpGraphErrObject $img->SetColor("black"); $img->Rectangle(1, 1, $w-5, $h-5); $img->Rectangle(0, 0, $w-4, $h-4); - + // Window top row $img->SetColor("darkred"); for ($y=3; $y < 18; $y += 2) { @@ -359,18 +257,17 @@ class JpGraphErrObjectImg extends JpGraphErrObject // Window title $m = floor($w/2-5); - $l = 110; + $l = 100; $img->SetColor("lightgray:1.3"); $img->FilledRectangle($m-$l, 2, $m+$l, 16); // Stroke text $img->SetColor("darkred"); $img->SetFont(FF_FONT2, FS_BOLD); - $img->StrokeText($m-90, 15, $this->iTitle); + $img->StrokeText($m-50, 15, $this->iTitle); $img->SetColor("black"); $img->SetFont(FF_FONT1, FS_NORMAL); $txt = new Text($aMsg, 52, 25); - $txt->SetFont(FF_FONT1); $txt->Align("left", "top"); $txt->Stroke($img); if ($this->iDest) { @@ -386,7 +283,9 @@ class JpGraphErrObjectImg extends JpGraphErrObject } - -if (! USE_IMAGE_ERROR_HANDLER) { - JpGraphError::SetImageFlag(false); +// Install the default error handler +if (USE_IMAGE_ERROR_HANDLER) { + JpGraphError::Install("JpGraphErrObjectImg"); +} else { + JpGraphError::Install("JpGraphErrObject"); } diff --git a/onyx2/include/jpgraph/jpgraph_error.php b/onyx2/include/jpgraph/jpgraph_error.php index daac8ef..de9fcaa 100644 --- a/onyx2/include/jpgraph/jpgraph_error.php +++ b/onyx2/include/jpgraph/jpgraph_error.php @@ -1,14 +1,14 @@ Plot($datay, $datax); $this->numpoints /= 2; } //--------------- // PUBLIC METHODS - + // Gets called before any axis are stroked public function PreStrokeAdjust($graph) { @@ -43,7 +42,7 @@ class ErrorPlot extends Plot $graph->SetTextScaleOff($b); //$graph->xaxis->scale->ticks->SupressMinorTickMarks(); } - + // Method description public function Stroke($img, $xscale, $yscale) { @@ -71,7 +70,7 @@ class ErrorPlot extends Plot } if (!is_numeric($x) || - !is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1])) { + !is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1])) { continue; } @@ -98,9 +97,9 @@ class ErrorLinePlot extends ErrorPlot public $line=null; //--------------- // CONSTRUCTOR - public function __construct($datay, $datax=false) + public function ErrorLinePlot($datay, $datax=false) { - parent::__construct($datay, $datax); + $this->ErrorPlot($datay, $datax); // Calculate line coordinates as the average of the error limits $n = count($datay); for ($i=0; $i < $n; $i+=2) { @@ -118,7 +117,7 @@ class ErrorLinePlot extends ErrorPlot } $this->line->Legend($graph); } - + public function Stroke($img, $xscale, $yscale) { parent::Stroke($img, $xscale, $yscale); @@ -137,7 +136,7 @@ class LineErrorPlot extends ErrorPlot //--------------- // CONSTRUCTOR // Data is (val, errdeltamin, errdeltamax) - public function __construct($datay, $datax=false) + public function LineErrorPlot($datay, $datax=false) { $ly=array(); $ey=array(); @@ -151,7 +150,7 @@ class LineErrorPlot extends ErrorPlot $ey[]=$datay[$i]+$datay[$i+1]; $ey[]=$datay[$i]+$datay[$i+2]; } - parent::__construct($ey, $datax); + $this->ErrorPlot($ey, $datax); $this->line=new LinePlot($ly, $datax); } @@ -164,7 +163,7 @@ class LineErrorPlot extends ErrorPlot } $this->line->Legend($graph); } - + public function Stroke($img, $xscale, $yscale) { parent::Stroke($img, $xscale, $yscale); diff --git a/onyx2/include/jpgraph/jpgraph_flags.php b/onyx2/include/jpgraph/jpgraph_flags.php index 7f0e85d..383e55a 100644 --- a/onyx2/include/jpgraph/jpgraph_flags.php +++ b/onyx2/include/jpgraph/jpgraph_flags.php @@ -1,11 +1,11 @@ iFlagSetMap[$aSize].'.dat'; - $fp = fopen($file, 'rb'); - $rawdata = fread($fp, filesize($file)); - $this->iFlagData = unserialize($rawdata); - break; - default: - JpGraphError::RaiseL(5001, $aSize); - //('Unknown flag size. ('.$aSize.')'); - } + case FLAGSIZE1: + case FLAGSIZE2: + case FLAGSIZE3: + case FLAGSIZE4: + $file = dirname(__FILE__).'/'.$this->iFlagSetMap[$aSize].'.dat'; + $fp = fopen($file, 'rb'); + $rawdata = fread($fp, filesize($file)); + $this->iFlagData = unserialize($rawdata); + break; + default: + JpGraphError::RaiseL(5001, $aSize); +//('Unknown flag size. ('.$aSize.')'); + } $this->iFlagCount = count($this->iCountryNameMap); } @@ -304,7 +304,7 @@ class FlagImages return Image::CreateFromString($d); } else { JpGraphError::RaiseL(5002, $aIdx); - //("Flag index \"�$aIdx\" does not exist."); + //("Flag index \"$aIdx\" does not exist."); } } @@ -313,9 +313,10 @@ class FlagImages $aOrd--; $n = count($this->iOrdIdx); if ($n == 0) { + reset($this->iCountryNameMap); $this->iOrdIdx=array(); $i=0; - foreach ($this->iCountryNameMap as $key => $val) { + while (list($key, $val) = each($this->iCountryNameMap)) { $this->iOrdIdx[$i++] = array($val,$key); } $tmp=$this->iOrdIdx[$aOrd]; @@ -341,16 +342,18 @@ class FlagImages $found=false; $aName = strtolower($aName); $nlen = strlen($aName); + reset($this->iCountryNameMap); // Start by trying to match exact index name - foreach ($this->iCountryNameMap as $key => $val) { + while (list($key, $val) = each($this->iCountryNameMap)) { if ($nlen == strlen($val) && $val == $aName) { $found=true; break; } } if (!$found) { + reset($this->iCountryNameMap); // If the exact index doesn't work try a (partial) full name - foreach ($this->iCountryNameMap as $key => $val) { + while (list($key, $val) = each($this->iCountryNameMap)) { if (strpos(strtolower($key), $aName) !== false) { $found=true; break; diff --git a/onyx2/include/jpgraph/jpgraph_gantt.php b/onyx2/include/jpgraph/jpgraph_gantt.php index a6b098a..00708cc 100644 --- a/onyx2/include/jpgraph/jpgraph_gantt.php +++ b/onyx2/include/jpgraph/jpgraph_gantt.php @@ -1,127 +1,127 @@ vgrid = new LineProperty(); } @@ -180,8 +180,8 @@ class GanttActivityInfo public function SetFont($aFFamily, $aFStyle=FS_NORMAL, $aFSize=10) { $this->iFFamily = $aFFamily; - $this->iFStyle = $aFStyle; - $this->iFSize = $aFSize; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; } public function SetStyle($aStyle) @@ -253,7 +253,7 @@ class GanttActivityInfo $txt=''; return $w; } - + public function GetColStart($aImg, &$aStart, $aAddLeftMargin=false) { $n = count($this->iTitles) ; @@ -263,7 +263,7 @@ class GanttActivityInfo $aStart[$i] = $aStart[$i-1]+$this->iLeftColMargin+$this->iWidth[$i-1]; } } - + // Adjust headers left, right or centered public function SetHeaderAlign($aAlign) { @@ -285,7 +285,7 @@ class GanttActivityInfo if ($n == 0) { return; } - + $x = $aXLeft; $h = $this->iHeight; $yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ; @@ -303,9 +303,14 @@ class GanttActivityInfo if ($this->iStyle == 1) { // Make a 3D effect $aImg->SetColor('white'); - $aImg->Line($aXLeft, $yTop+1, $aXRight, $yTop+1); + $aImg->Line( + $aXLeft, + $yTop+1, + $aXRight, + $yTop+1 + ); } - + for ($i=0; $i < $n; ++$i) { if ($this->iStyle == 1) { // Make a 3D effect @@ -314,7 +319,7 @@ class GanttActivityInfo } $x += $this->iLeftColMargin; $txt->Set($this->iTitles[$i]); - + // Adjust the text anchor position according to the choosen alignment $xp = $x; if ($this->iHeaderAlign == 'center') { @@ -322,7 +327,7 @@ class GanttActivityInfo } elseif ($this->iHeaderAlign == 'right') { $xp = $x +$this->iWidth[$i]-$this->iRightColMargin; } - + $txt->Stroke($aImg, $xp, $yTop+$this->iTopHeaderMargin); $x += $this->iWidth[$i]; if ($i < $n-1) { @@ -357,12 +362,12 @@ class GanttActivityInfo //=================================================== class GanttGraph extends Graph { - public $scale; // Public accessible + public $scale; // Public accessible public $hgrid=null; - private $iObj=array(); // Gantt objects - private $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels - private $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label - private $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN + private $iObj=array(); // Gantt objects + private $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels + private $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label + private $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN private $iSimpleFont = FF_FONT1; private $iSimpleFontSize=11; private $iSimpleStyle=GANTT_RDIAG; @@ -371,14 +376,13 @@ class GanttGraph extends Graph private $iSimpleProgressBkgColor='gray'; private $iSimpleProgressColor='darkgreen'; private $iSimpleProgressStyle=GANTT_SOLID; - private $iZoomFactor = 1.0; //--------------- // CONSTRUCTOR // Create a new gantt graph - public function __construct($aWidth=0, $aHeight=0, $aCachedName="", $aTimeOut=0, $aInline=true) + public function GanttGraph($aWidth=0, $aHeight=0, $aCachedName="", $aTimeOut=0, $aInline=true) { - // Backward compatibility + // Backward compatibility if ($aWidth == -1) { $aWidth=0; } @@ -390,18 +394,18 @@ class GanttGraph extends Graph JpgraphError::RaiseL(6002); //("You can't specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension."); } - parent::__construct($aWidth, $aHeight, $aCachedName, $aTimeOut, $aInline); + Graph::Graph($aWidth, $aHeight, $aCachedName, $aTimeOut, $aInline); $this->scale = new GanttScale($this->img); // Default margins $this->img->SetMargin(15, 17, 25, 15); $this->hgrid = new HorizontalGridLine(); - + $this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY); $this->SetBox(); } - + //--------------- // PUBLIC METHODS @@ -426,80 +430,80 @@ class GanttGraph extends Graph $num = count($data); for ($i=0; $i < $num; ++$i) { switch ($data[$i][1]) { - case ACTYPE_GROUP: - // Create a slightly smaller height bar since the - // "wings" at the end will make it look taller - $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 8); - $a->title->SetFont($this->iSimpleFont, FS_BOLD, $this->iSimpleFontSize); - $a->rightMark->Show(); - $a->rightMark->SetType(MARK_RIGHTTRIANGLE); - $a->rightMark->SetWidth(8); - $a->rightMark->SetColor('black'); - $a->rightMark->SetFillColor('black'); - - $a->leftMark->Show(); - $a->leftMark->SetType(MARK_LEFTTRIANGLE); - $a->leftMark->SetWidth(8); - $a->leftMark->SetColor('black'); - $a->leftMark->SetFillColor('black'); - - $a->SetPattern(BAND_SOLID, 'black'); - $csimpos = 6; - break; - - case ACTYPE_NORMAL: - $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 10); - $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize); - $a->SetPattern($this->iSimpleStyle, $this->iSimpleColor); - $a->SetFillColor($this->iSimpleBkgColor); - // Check if this activity should have a constrain line - $n = count($constrains); - for ($j=0; $j < $n; ++$j) { - if (empty($constrains[$j]) || (count($constrains[$j]) != 3)) { - JpGraphError::RaiseL(6003, $j); - //("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)"); - } - if ($constrains[$j][0]==$data[$i][0]) { - $a->SetConstrain($constrains[$j][1], $constrains[$j][2], 'black', ARROW_S2, ARROWT_SOLID); - } - } - - // Check if this activity have a progress bar - $n = count($progress); - for ($j=0; $j < $n; ++$j) { - if (empty($progress[$j]) || (count($progress[$j]) != 2)) { - JpGraphError::RaiseL(6004, $j); - //("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)"); - } - if ($progress[$j][0]==$data[$i][0]) { - $a->progress->Set($progress[$j][1]); - $a->progress->SetPattern( - $this->iSimpleProgressStyle, - $this->iSimpleProgressColor - ); - $a->progress->SetFillColor($this->iSimpleProgressBkgColor); - //$a->progress->SetPattern($progress[$j][2],$progress[$j][3]); - break; - } - } - $csimpos = 6; - break; - - case ACTYPE_MILESTONE: - $a = new MileStone($data[$i][0], $data[$i][2], $data[$i][3]); - $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize); - $a->caption->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize); - $csimpos = 5; - break; - default: - die('Unknown activity type'); - break; + case ACTYPE_GROUP: + // Create a slightly smaller height bar since the + // "wings" at the end will make it look taller + $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 8); + $a->title->SetFont($this->iSimpleFont, FS_BOLD, $this->iSimpleFontSize); + $a->rightMark->Show(); + $a->rightMark->SetType(MARK_RIGHTTRIANGLE); + $a->rightMark->SetWidth(8); + $a->rightMark->SetColor('black'); + $a->rightMark->SetFillColor('black'); + + $a->leftMark->Show(); + $a->leftMark->SetType(MARK_LEFTTRIANGLE); + $a->leftMark->SetWidth(8); + $a->leftMark->SetColor('black'); + $a->leftMark->SetFillColor('black'); + + $a->SetPattern(BAND_SOLID, 'black'); + $csimpos = 6; + break; + + case ACTYPE_NORMAL: + $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 10); + $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize); + $a->SetPattern($this->iSimpleStyle, $this->iSimpleColor); + $a->SetFillColor($this->iSimpleBkgColor); + // Check if this activity should have a constrain line + $n = count($constrains); + for ($j=0; $j < $n; ++$j) { + if (empty($constrains[$j]) || (count($constrains[$j]) != 3)) { + JpGraphError::RaiseL(6003, $j); + //("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)"); + } + if ($constrains[$j][0]==$data[$i][0]) { + $a->SetConstrain($constrains[$j][1], $constrains[$j][2], 'black', ARROW_S2, ARROWT_SOLID); + } } + // Check if this activity have a progress bar + $n = count($progress); + for ($j=0; $j < $n; ++$j) { + if (empty($progress[$j]) || (count($progress[$j]) != 2)) { + JpGraphError::RaiseL(6004, $j); + //("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)"); + } + if ($progress[$j][0]==$data[$i][0]) { + $a->progress->Set($progress[$j][1]); + $a->progress->SetPattern( + $this->iSimpleProgressStyle, + $this->iSimpleProgressColor + ); + $a->progress->SetFillColor($this->iSimpleProgressBkgColor); + //$a->progress->SetPattern($progress[$j][2],$progress[$j][3]); + break; + } + } + $csimpos = 6; + break; + + case ACTYPE_MILESTONE: + $a = new MileStone($data[$i][0], $data[$i][2], $data[$i][3]); + $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize); + $a->caption->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize); + $csimpos = 5; + break; + default: + die('Unknown activity type'); + break; + } + // Setup caption $a->caption->Set($data[$i][$csimpos-1]); - // Check if this activity should have a CSIM target�? + // Check if this activity should have a CSIM target? if (!empty($data[$i][$csimpos])) { $a->SetCSIMTarget($data[$i][$csimpos]); $a->SetCSIMAlt($data[$i][$csimpos+1]); @@ -513,19 +517,13 @@ class GanttGraph extends Graph } } - // Set user specified scale zoom factor when auto sizing is used - public function SetZoomFactor($aZoom) - { - $this->iZoomFactor = $aZoom; - } - - + // Set what headers should be shown public function ShowHeaders($aFlg) { $this->scale->ShowHeaders($aFlg); } - + // Specify the fraction of the font height that should be added // as vertical margin public function SetLabelVMarginFactor($aVal) @@ -538,8 +536,8 @@ class GanttGraph extends Graph { $this->iLabelVMarginFactor = $aVal; } - - + + // Add a new Gantt object public function Add($aObject) { @@ -547,8 +545,6 @@ class GanttGraph extends Graph $cl = $aObject[0]; if (class_exists('IconPlot', false) && ($cl instanceof IconPlot)) { $this->AddIcon($aObject); - } elseif (class_exists('Text', false) && ($cl instanceof Text)) { - $this->AddText($aObject); } else { $n = count($aObject); for ($i=0; $i < $n; ++$i) { @@ -558,32 +554,12 @@ class GanttGraph extends Graph } else { if (class_exists('IconPlot', false) && ($aObject instanceof IconPlot)) { $this->AddIcon($aObject); - } elseif (class_exists('Text', false) && ($aObject instanceof Text)) { - $this->AddText($aObject); } else { $this->iObj[] = $aObject; } } } - public function StrokeTexts() - { - // Stroke any user added text objects - if ($this->texts != null) { - $n = count($this->texts); - for ($i=0; $i < $n; ++$i) { - if ($this->texts[$i]->iScalePosX !== null && $this->texts[$i]->iScalePosY !== null) { - $x = $this->scale->TranslateDate($this->texts[$i]->iScalePosX); - $y = $this->scale->TranslateVertPos($this->texts[$i]->iScalePosY); - $y -= $this->scale->GetVertSpacing()/2; - } else { - $x = $y = null; - } - $this->texts[$i]->Stroke($this->img, $x, $y); - } - } - } - // Override inherit method from Graph and give a warning message public function SetScale($aAxisType, $aYMin=1, $aYMax=1, $aXMin=1, $aXMax=1) { @@ -605,7 +581,7 @@ class GanttGraph extends Graph } $this->scale->SetRange($aStart, $aEnd); } - + // Get the maximum width of the activity titles columns for the bars // The name is lightly misleading since we from now on can have // multiple columns in the label section. When this was first written @@ -629,17 +605,15 @@ class GanttGraph extends Graph } return $m; } - + // Get the maximum height of the titles for the bars public function GetMaxLabelHeight() { $m=10; if ($this->iObj != null) { $n = count($this->iObj); - // We can not include the title of GnttVLine since that title is stroked at the bottom - // of the Gantt bar and not in the activity title columns for ($i=0; $i < $n; ++$i) { - if (!empty($this->iObj[$i]->title) && !($this->iObj[$i] instanceof GanttVLine)) { + if (!empty($this->iObj[$i]->title)) { $m=max($m, $this->iObj[$i]->title->GetHeight($this->img)); } } @@ -659,7 +633,7 @@ class GanttGraph extends Graph } return $m; } - + // Get the maximum used line number (vertical position) for bars public function GetBarMaxLineNumber() { @@ -673,7 +647,7 @@ class GanttGraph extends Graph } return $m; } - + // Get the minumum and maximum used dates for all bars public function GetBarMinMax() { @@ -717,33 +691,21 @@ class GanttGraph extends Graph // The predefined left, right, top, bottom margins. // Note that the top margin might incease depending on // the title. - $hadj = $vadj = 0; - if ($this->doshadow) { - $hadj = $this->shadow_width; - $vadj = $this->shadow_width+5; - } - $lm = $this->img->left_margin; - $rm = $this->img->right_margin +$hadj; + $rm = $this->img->right_margin; $rm += 2 ; $tm = $this->img->top_margin; - $bm = $this->img->bottom_margin + $vadj; - $bm += 2; - - // If there are any added GanttVLine we must make sure that the - // bottom margin is wide enough to hold a title. - $n = count($this->iObj); - for ($i=0; $i < $n; ++$i) { - if ($this->iObj[$i] instanceof GanttVLine) { - $bm = max($bm, $this->iObj[$i]->title->GetHeight($this->img)+10); - } + $bm = $this->img->bottom_margin; + $bm += 1; + if (BRAND_TIMING) { + $bm += 10; } - + // First find out the height $n=$this->GetBarMaxLineNumber()+1; $m=max($this->GetMaxLabelHeight(), $this->GetMaxBarAbsHeight()); $height=$n*((1+$this->iLabelVMarginFactor)*$m); - + // Add the height of the scale titles $h=$this->scale->GetHeaderHeight(); $height += $h; @@ -781,47 +743,50 @@ class GanttGraph extends Graph // If the days are displayed we also need to figure out // how much space each day's title will require. switch ($this->scale->day->iStyle) { - case DAYSTYLE_LONG: - $txt = "Monday"; - break; - case DAYSTYLE_LONGDAYDATE1: - $txt = "Monday 23 Jun"; - break; - case DAYSTYLE_LONGDAYDATE2: - $txt = "Monday 23 Jun 2003"; - break; - case DAYSTYLE_SHORT: - $txt = "Mon"; - break; - case DAYSTYLE_SHORTDAYDATE1: + case DAYSTYLE_LONG: + $txt = "Monday"; + break; + case DAYSTYLE_LONGDAYDATE1: + $txt = "Monday 23 Jun"; + break; + case DAYSTYLE_LONGDAYDATE2: + $txt = "Monday 23 Jun 2003"; + break; + case DAYSTYLE_SHORT: + $txt = "Mon"; + break; + case DAYSTYLE_SHORTDAYDATE1: $txt = "Mon 23/6"; - break; - case DAYSTYLE_SHORTDAYDATE2: - $txt = "Mon 23 Jun"; - break; - case DAYSTYLE_SHORTDAYDATE3: - $txt = "Mon 23"; - break; - case DAYSTYLE_SHORTDATE1: + break; + case DAYSTYLE_SHORTDAYDATE2: + $txt = "Mon 23 Jun"; + break; + case DAYSTYLE_SHORTDAYDATE3: + $txt = "Mon 23"; + break; + case DAYSTYLE_SHORTDATE1: $txt = "23/6"; - break; - case DAYSTYLE_SHORTDATE2: - $txt = "23 Jun"; - break; - case DAYSTYLE_SHORTDATE3: - $txt = "Mon 23"; - break; - case DAYSTYLE_SHORTDATE4: - $txt = "88"; - break; - case DAYSTYLE_CUSTOM: - $txt = date($this->scale->day->iLabelFormStr, strtotime('2003-12-20 18:00')); - break; - case DAYSTYLE_ONELETTER: - default: - $txt = "M"; - break; - } + break; + case DAYSTYLE_SHORTDATE2: + $txt = "23 Jun"; + break; + case DAYSTYLE_SHORTDATE3: + $txt = "Mon 23"; + break; + case DAYSTYLE_SHORTDATE4: + $txt = "88"; + break; + case DAYSTYLE_CUSTOM: + $txt = date( + $this->scale->day->iLabelFormStr, + strtotime('2003-12-20 18:00') + ); + break; + case DAYSTYLE_ONELETTER: + default: + $txt = "M"; + break; + } $fw = $this->scale->day->GetStrWidth($this->img, $txt)+6; } @@ -832,24 +797,24 @@ class GanttGraph extends Graph // of space. We therefore create a typical string for the choosen format // and determine the length of that string. switch ($this->scale->hour->iStyle) { - case HOURSTYLE_HMAMPM: - $txt = '12:00pm'; - break; - case HOURSTYLE_H24: - // 13 - $txt = '24'; - break; - case HOURSTYLE_HAMPM: - $txt = '12pm'; - break; - case HOURSTYLE_CUSTOM: - $txt = date($this->scale->hour->iLabelFormStr, strtotime('2003-12-20 18:00')); - break; - case HOURSTYLE_HM24: - default: - $txt = '24:00'; - break; - } + case HOURSTYLE_HMAMPM: + $txt = '12:00pm'; + break; + case HOURSTYLE_H24: + // 13 + $txt = '24'; + break; + case HOURSTYLE_HAMPM: + $txt = '12pm'; + break; + case HOURSTYLE_CUSTOM: + $txt = date($this->scale->hour->iLabelFormStr, strtotime('2003-12-20 18:00')); + break; + case HOURSTYLE_HM24: + default: + $txt = '24:00'; + break; + } $hfw = $this->scale->hour->GetStrWidth($this->img, $txt)+6; $mw = $hfw; @@ -858,15 +823,15 @@ class GanttGraph extends Graph // of space. We therefore create a typical string for the choosen format // and determine the length of that string. switch ($this->scale->minute->iStyle) { - case HOURSTYLE_CUSTOM: - $txt2 = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55')); - break; - case MINUTESTYLE_MM: - default: - $txt2 = '15'; - break; - } - + case HOURSTYLE_CUSTOM: + $txt2 = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55')); + break; + case MINUTESTYLE_MM: + default: + $txt2 = '15'; + break; + } + $mfw = $this->scale->minute->GetStrWidth($this->img, $txt2)+6; $n2 = ceil(60 / $this->scale->minute->GetIntervall()); $mw = $n2 * $mfw; @@ -887,15 +852,15 @@ class GanttGraph extends Graph // of space. We therefore create a typical string for the choosen format // and determine the length of that string. switch ($this->scale->minute->iStyle) { - case HOURSTYLE_CUSTOM: - $txt = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55')); - break; - case MINUTESTYLE_MM: - default: - $txt = '15'; - break; - } - + case HOURSTYLE_CUSTOM: + $txt = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55')); + break; + case MINUTESTYLE_MM: + default: + $txt = '15'; + break; + } + $mfw = $this->scale->minute->GetStrWidth($this->img, $txt)+6; $n = ceil(60 / $this->scale->TimeToMinutes($this->scale->minute->GetIntervall())); $mw = $n * $mfw; @@ -915,7 +880,7 @@ class GanttGraph extends Graph } else { $fsw += 4; } - + $ww = $fsw*$this->scale->week->GetFontWidth($this->img); if (7*$fw < $ww) { $fw = ceil($ww/7); @@ -923,8 +888,8 @@ class GanttGraph extends Graph } if (!$this->scale->IsDisplayDay() && !$this->scale->IsDisplayHour() && - !(($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || - $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek())) { + !(($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || + $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek())) { // If we don't display the individual days we can shrink the // scale a little bit. This is a little bit pragmatic at the // moment and should be re-written to take into account @@ -954,8 +919,6 @@ class GanttGraph extends Graph // Add the width of the vertivcal divider line $titlewidth += $this->scale->divider->iWeight*2; - // Adjust the width by the user specified zoom factor - $fw *= $this->iZoomFactor; // Now get the total width taking // titlewidth, left and rigt margin, dayfont size @@ -989,7 +952,7 @@ class GanttGraph extends Graph } $w = array(); $m = $this->scale->actinfo->iLeftColMargin + $this->scale->actinfo->iRightColMargin; - + for ($i=0; $i < $n; ++$i) { $tmp = $this->iObj[$i]->title->GetColWidth($this->img, $m); $nn = count($tmp); @@ -1008,7 +971,7 @@ class GanttGraph extends Graph public function Stroke($aStrokeFileName="") { - // If the filename is the predefined value = '_csim_special_' + // If the filename is the predefined value = '_csim_special_' // we assume that the call to stroke only needs to do enough // to correctly generate the CSIM maps. // We use this variable to skip things we don't strictly need @@ -1040,7 +1003,7 @@ class GanttGraph extends Graph if ($this->scale->iVertLines == -1) { $this->scale->iVertLines = $this->GetBarMaxLineNumber()+1; } - + $maxwidth=max( $this->scale->actinfo->GetWidth($this->img), max( @@ -1087,15 +1050,12 @@ class GanttGraph extends Graph $this->StrokeIcons(); } - // Stroke all added user texts - $this->StrokeTexts(); - // Should we do any final image transformation if ($this->iImgTrans) { if (!class_exists('ImgTrans', false)) { require_once('jpgraph_imgtrans.php'); } - + $tform = new ImgTrans($this->img->img); $this->img->img = $tform->Skew3D( $this->iImgTransHorizon, @@ -1107,8 +1067,8 @@ class GanttGraph extends Graph $this->iImgTransBorder ); } - - + + // If the filename is given as the special "__handle" // then the image handler is returned and the image is NOT // streamed back @@ -1133,7 +1093,7 @@ class GanttGraph extends Graph // Stroke all constrains for ($i=0; $i < $n; ++$i) { - // Some gantt objects may not have constraints associated with them + // Some gantt objects may not have constraints associated with them // for example we can add IconPlots which doesn't have this property. if (empty($this->iObj[$i]->constraints)) { continue; @@ -1160,50 +1120,50 @@ class GanttGraph extends Graph $c2 = $this->iObj[$targetobj]->iConstrainPos; if (count($c1) == 4 && count($c2) == 4) { switch ($this->iObj[$i]->constraints[$k]->iConstrainType) { - case CONSTRAIN_ENDSTART: - if ($c1[1] < $c2[1]) { - $link = new GanttLink($c1[2], $c1[3], $c2[0], $c2[1]); - } else { - $link = new GanttLink($c1[2], $c1[1], $c2[0], $c2[3]); - } - $link->SetPath(3); - break; - case CONSTRAIN_STARTEND: - if ($c1[1] < $c2[1]) { - $link = new GanttLink($c1[0], $c1[3], $c2[2], $c2[1]); - } else { - $link = new GanttLink($c1[0], $c1[1], $c2[2], $c2[3]); - } - $link->SetPath(0); - break; - case CONSTRAIN_ENDEND: - if ($c1[1] < $c2[1]) { - $link = new GanttLink($c1[2], $c1[3], $c2[2], $c2[1]); - } else { - $link = new GanttLink($c1[2], $c1[1], $c2[2], $c2[3]); - } - $link->SetPath(1); - break; - case CONSTRAIN_STARTSTART: - if ($c1[1] < $c2[1]) { - $link = new GanttLink($c1[0], $c1[3], $c2[0], $c2[1]); - } else { - $link = new GanttLink($c1[0], $c1[1], $c2[0], $c2[3]); - } - $link->SetPath(3); - break; - default: - JpGraphError::RaiseL(6009, $this->iObj[$i]->iVPos, $vpos); - //('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos); - break; - } + case CONSTRAIN_ENDSTART: + if ($c1[1] < $c2[1]) { + $link = new GanttLink($c1[2], $c1[3], $c2[0], $c2[1]); + } else { + $link = new GanttLink($c1[2], $c1[1], $c2[0], $c2[3]); + } + $link->SetPath(3); + break; + case CONSTRAIN_STARTEND: + if ($c1[1] < $c2[1]) { + $link = new GanttLink($c1[0], $c1[3], $c2[2], $c2[1]); + } else { + $link = new GanttLink($c1[0], $c1[1], $c2[2], $c2[3]); + } + $link->SetPath(0); + break; + case CONSTRAIN_ENDEND: + if ($c1[1] < $c2[1]) { + $link = new GanttLink($c1[2], $c1[3], $c2[2], $c2[1]); + } else { + $link = new GanttLink($c1[2], $c1[1], $c2[2], $c2[3]); + } + $link->SetPath(1); + break; + case CONSTRAIN_STARTSTART: + if ($c1[1] < $c2[1]) { + $link = new GanttLink($c1[0], $c1[3], $c2[0], $c2[1]); + } else { + $link = new GanttLink($c1[0], $c1[1], $c2[0], $c2[3]); + } + $link->SetPath(3); + break; + default: + JpGraphError::RaiseL(6009, $this->iObj[$i]->iVPos, $vpos); +//('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos); + break; + } $link->SetColor($this->iObj[$i]->constraints[$k]->iConstrainColor); $link->SetArrow( $this->iObj[$i]->constraints[$k]->iConstrainArrowSize, $this->iObj[$i]->constraints[$k]->iConstrainArrowType ); - + $link->Stroke($this->img); } } @@ -1216,7 +1176,7 @@ class GanttGraph extends Graph if (!$this->iHasStroked) { $this->Stroke(_CSIM_SPECIALFILE); } - + $csim = $this->title->GetCSIMAreas(); $csim .= $this->subtitle->GetCSIMAreas(); $csim .= $this->subsubtitle->GetCSIMAreas(); @@ -1233,19 +1193,19 @@ class GanttGraph extends Graph // CLASS PredefIcons // Description: Predefined icons for use with Gantt charts //=================================================== -define('GICON_WARNINGRED', 0); -define('GICON_TEXT', 1); -define('GICON_ENDCONS', 2); -define('GICON_MAIL', 3); -define('GICON_STARTCONS', 4); -define('GICON_CALC', 5); -define('GICON_MAGNIFIER', 6); -define('GICON_LOCK', 7); -define('GICON_STOP', 8); -define('GICON_WARNINGYELLOW', 9); -define('GICON_FOLDEROPEN', 10); -define('GICON_FOLDER', 11); -define('GICON_TEXTIMPORTANT', 12); +DEFINE('GICON_WARNINGRED', 0); +DEFINE('GICON_TEXT', 1); +DEFINE('GICON_ENDCONS', 2); +DEFINE('GICON_MAIL', 3); +DEFINE('GICON_STARTCONS', 4); +DEFINE('GICON_CALC', 5); +DEFINE('GICON_MAGNIFIER', 6); +DEFINE('GICON_LOCK', 7); +DEFINE('GICON_STOP', 8); +DEFINE('GICON_WARNINGYELLOW', 9); +DEFINE('GICON_FOLDEROPEN', 10); +DEFINE('GICON_FOLDER', 11); +DEFINE('GICON_TEXTIMPORTANT', 12); class PredefIcons { @@ -1266,283 +1226,283 @@ class PredefIcons return Image::CreateFromString(base64_decode($this->iBuiltinIcon[$aIdx][1])); } - public function __construct() + public function PredefIcons() { //========================================================== // warning.png //========================================================== $this->iBuiltinIcon[0][0]= 1043 ; $this->iBuiltinIcon[0][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. - 'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'. - '0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'. - '5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'. - 'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'. - 'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'. - '/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'. - 'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'. - 'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'. - 'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'. - 'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'. - 'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'. - 'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'. - 'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'. + 'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'. + '0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'. + '5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'. + 'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'. + 'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'. + '/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'. + 'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'. + 'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'. + 'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'. + 'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'. + 'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'. + 'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'. + 'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ; //========================================================== // edit.png //========================================================== $this->iBuiltinIcon[1][0]= 959 ; $this->iBuiltinIcon[1][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'. - 'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'. - 'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'. - 'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'. - 'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'. - 'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'. - 'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'. - 'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'. - 'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'. - 'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'. - 'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'. - 'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'. + 'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'. + 'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'. + 'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'. + 'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'. + 'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'. + 'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'. + 'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'. + 'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'. + 'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'. + 'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'. + 'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ; //========================================================== // endconstrain.png //========================================================== $this->iBuiltinIcon[2][0]= 666 ; $this->iBuiltinIcon[2][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'. - 'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'. - 'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'. - 'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'. - '7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'. - '7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'. - 'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'. - 'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'. + 'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'. + 'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'. + 'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'. + '7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'. + '7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'. + 'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'. + 'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ; //========================================================== // mail.png //========================================================== $this->iBuiltinIcon[3][0]= 1122 ; $this->iBuiltinIcon[3][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'. - 'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'. - 'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'. - 'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'. - '3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'. - '7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'. - 'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'. - 'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'. - '6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'. - 'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'. - 'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'. - 'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'. - 'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'. - 'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'. + 'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'. + 'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'. + 'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'. + '3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'. + '7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'. + 'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'. + 'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'. + '6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'. + 'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'. + 'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'. + 'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'. + 'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'. + 'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ; //========================================================== // startconstrain.png //========================================================== $this->iBuiltinIcon[4][0]= 725 ; $this->iBuiltinIcon[4][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'. - 'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'. - 'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'. - 'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'. - '5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'. - 'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'. - 'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'. - '5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'. - 'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'. + 'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'. + 'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'. + 'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'. + '5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'. + 'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'. + 'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'. + '5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'. + 'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ; //========================================================== // calc.png //========================================================== $this->iBuiltinIcon[5][0]= 589 ; $this->iBuiltinIcon[5][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'. - 'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'. - 'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'. - '3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'. - 'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'. - 'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'. - 'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'. - 'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'. + 'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'. + 'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'. + '3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'. + 'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'. + 'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'. + 'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'. + 'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ; //========================================================== // mag.png //========================================================== $this->iBuiltinIcon[6][0]= 1415 ; $this->iBuiltinIcon[6][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. - 'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'. - '0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'. - 'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'. - 'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'. - 'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'. - '8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'. - 'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'. - '/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'. - 'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'. - 'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'. - 'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'. - 'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'. - 'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'. - 'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'. - 'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'. - 'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'. - 'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'. - 'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'. + 'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'. + '0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'. + 'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'. + 'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'. + 'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'. + '8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'. + 'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'. + '/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'. + 'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'. + 'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'. + 'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'. + 'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'. + 'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'. + 'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'. + 'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'. + 'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'. + 'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'. + 'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ; //========================================================== // lock.png //========================================================== $this->iBuiltinIcon[7][0]= 963 ; $this->iBuiltinIcon[7][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'. - 'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'. - 'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'. - 'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'. - 'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'. - 'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'. - 'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'. - 'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'. - 'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'. - 'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'. - '2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'. - 'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'. + 'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'. + 'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'. + 'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'. + 'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'. + 'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'. + 'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'. + 'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'. + 'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'. + 'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'. + '2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'. + 'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ; //========================================================== // stop.png //========================================================== $this->iBuiltinIcon[8][0]= 889 ; $this->iBuiltinIcon[8][1]= - 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'. - 'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'. - 'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'. - 'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'. - 'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'. - 'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'. - 'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'. - 'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'. - 'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'. - 'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'. - 'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'. + 'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'. + 'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'. + 'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'. + 'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'. + 'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'. + 'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'. + 'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'. + 'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'. + 'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'. + 'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ; //========================================================== // error.png //========================================================== $this->iBuiltinIcon[9][0]= 541 ; $this->iBuiltinIcon[9][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. - 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. - 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'. - '2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'. - 'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'. - 'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'. - 'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'. - 'iOsCHgAAAABJRU5ErkJggg==' ; + 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'. + 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'. + 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'. + '2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'. + 'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'. + 'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'. + 'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'. + 'iOsCHgAAAABJRU5ErkJggg==' ; //========================================================== // openfolder.png //========================================================== $this->iBuiltinIcon[10][0]= 2040 ; $this->iBuiltinIcon[10][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'. - 'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'. - 'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'. - 'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'. - 'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'. - '9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'. - 'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'. - '4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'. - 'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'. - 'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'. - 'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'. - 'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'. - 'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'. - 'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'. - 'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'. - 'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'. - 'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'. - 'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'. - 'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'. - 'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'. - 'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'. - 'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'. - 'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'. - '+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'. - '4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'. - 'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'. - 'dBntAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'. + 'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'. + 'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'. + 'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'. + 'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'. + '9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'. + 'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'. + '4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'. + 'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'. + 'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'. + 'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'. + 'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'. + 'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'. + 'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'. + 'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'. + 'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'. + 'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'. + 'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'. + 'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'. + 'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'. + 'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'. + 'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'. + 'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'. + '+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'. + '4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'. + 'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'. + 'dBntAAAAAElFTkSuQmCC' ; //========================================================== // folder.png //========================================================== $this->iBuiltinIcon[11][0]= 1824 ; $this->iBuiltinIcon[11][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'. - '6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'. - 'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'. - '309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'. - 'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'. - 'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'. - '3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'. - 'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'. - 'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'. - '/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'. - '4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'. - 'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'. - 'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'. - 'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'. - 'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'. - 'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'. - 'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'. - 'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'. - 'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'. - 'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'. - 'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'. - 'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'. - 'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'. - 'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'. + '6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'. + 'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'. + '309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'. + 'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'. + 'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'. + '3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'. + 'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'. + 'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'. + '/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'. + '4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'. + 'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'. + 'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'. + 'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'. + 'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'. + 'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'. + 'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'. + 'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'. + 'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'. + 'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'. + 'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'. + 'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'. + 'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'. + 'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ; //========================================================== // file_important.png //========================================================== $this->iBuiltinIcon[12][0]= 1785 ; $this->iBuiltinIcon[12][1]= - 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. - 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'. - 'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'. - 'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'. - '1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'. - 's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'. - 'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'. - 'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'. - 'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'. - '73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'. - '4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'. - 'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'. - 'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'. - 'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'. - 'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'. - 't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'. - '9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'. - 'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'. - 'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'. - 'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'. - '8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'. - 'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'. - 'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'. - '7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ; + 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'. + 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'. + 'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'. + 'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'. + '1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'. + 's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'. + 'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'. + 'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'. + 'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'. + '73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'. + '4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'. + 'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'. + 'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'. + 'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'. + 'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'. + 't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'. + '9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'. + 'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'. + 'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'. + 'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'. + '8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'. + 'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'. + 'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'. + '7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ; $this->iLen = count($this->iBuiltinIcon); } @@ -1566,7 +1526,7 @@ class IconImage private $iyalign='center'; private $iScale=1.0; - public function __construct($aIcon, $aScale=1) + public function IconImage($aIcon, $aScale=1) { global $_gPredefIcons ; if (is_string($aIcon)) { @@ -1641,19 +1601,18 @@ class TextProperty private $iFFamily=FF_FONT1; private $iFStyle=FS_NORMAL; private $iFSize=10; - private $iFontArray=array(); private $iColor="black"; private $iText=""; private $iHAlign="left"; private $iVAlign="bottom"; - + //--------------- // CONSTRUCTOR - public function __construct($aTxt='') + public function TextProperty($aTxt='') { $this->iText = $aTxt; } - + //--------------- // PUBLIC METHODS public function Set($aTxt) @@ -1678,7 +1637,7 @@ class TextProperty } $this->csimalt=$aAltText; } - + public function SetCSIMAlt($aAltText) { if (is_string($aAltText)) { @@ -1692,7 +1651,7 @@ class TextProperty { $this->iColor = $aColor; } - + public function HasTabs() { if (is_string($this->iText)) { @@ -1701,7 +1660,7 @@ class TextProperty return false; } } - + // Get number of tabs in string public function GetNbrTabs() { @@ -1711,44 +1670,34 @@ class TextProperty return 0; } } - + // Set alignment public function Align($aHAlign, $aVAlign="bottom") { $this->iHAlign=$aHAlign; $this->iVAlign=$aVAlign; } - + // Synonym public function SetAlign($aHAlign, $aVAlign="bottom") { $this->iHAlign=$aHAlign; $this->iVAlign=$aVAlign; } - + // Specify font public function SetFont($aFFamily, $aFStyle=FS_NORMAL, $aFSize=10) { $this->iFFamily = $aFFamily; - $this->iFStyle = $aFStyle; - $this->iFSize = $aFSize; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; } - public function SetColumnFonts($aFontArray) - { - if (!is_array($aFontArray) || count($aFontArray[0]) != 3) { - JpGraphError::RaiseL(6033); - // 'Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)' - } - $this->iFontArray = $aFontArray; - } - - public function IsColumns() { return is_array($this->iText) ; } - + // Get width of text. If text contains several columns separated by // tabs then return both the total width as well as an array with a // width for each column. @@ -1760,7 +1709,7 @@ class TextProperty if (strlen($this->iText) == 0) { return 0; } - $tmp = preg_split('/\t/', $this->iText); + $tmp = split("\t", $this->iText); if (count($tmp) <= 1 || !$aUseTabs) { $w = $aImg->GetTextWidth($this->iText); return $w + 2*$extra_margin; @@ -1780,13 +1729,7 @@ class TextProperty // Must be an array of texts. In this case we return the sum of the // length + a fixed margin of 4 pixels on each text string $n = count($this->iText); - $nf = count($this->iFontArray); for ($i=0, $w=0; $i < $n; ++$i) { - if ($i < $nf) { - $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]); - } else { - $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); - } $tmp = $this->iText[$i]; if (is_string($tmp)) { $w += $aImg->GetTextWidth($tmp)+$extra_margin; @@ -1811,16 +1754,10 @@ class TextProperty $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); if (is_array($this->iText)) { $n = count($this->iText); - $nf = count($this->iFontArray); for ($i=0, $w=array(); $i < $n; ++$i) { $tmp = $this->iText[$i]; if (is_string($tmp)) { - if ($i < $nf) { - $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]); - } else { - $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); - } - $w[$i] = $aImg->GetTextWidth($tmp)+$aMargin; + $w[$i] = $aImg->GetTextWidth($this->iText[$i])+$aMargin; } else { if (is_object($tmp) === false) { JpGraphError::RaiseL(6012); @@ -1833,35 +1770,20 @@ class TextProperty return array($this->GetWidth($aImg)); } } - + // Get total height of text public function GetHeight($aImg) { - $nf = count($this->iFontArray); - $maxheight = -1; - - if ($nf > 0) { - // We have to find out the largest font and take that one as the - // height of the row - for ($i=0; $i < $nf; ++$i) { - $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]); - $height = $aImg->GetFontHeight(); - $maxheight = max($height, $maxheight); - } - } - $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); - $height = $aImg->GetFontHeight(); - $maxheight = max($height, $maxheight); - return $maxheight; + return $aImg->GetFontHeight(); } - + // Unhide/hide the text public function Show($aShow=true) { $this->iShow=$aShow; } - + // Stroke text at (x,y) coordinates. If the text contains tabs then the // x parameter should be an array of positions to be used for each successive // tab mark. If no array is supplied then the tabs will be ignored. @@ -1871,15 +1793,16 @@ class TextProperty $aImg->SetColor($this->iColor); $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); $aImg->SetTextAlign($this->iHAlign, $this->iVAlign); - if ($this->GetNbrTabs() < 1) { + if ($this->GetNbrTabs() <= 1) { if (is_string($this->iText)) { + // Get rid of any "\t" characters and stroke string if (is_array($aX)) { $aX=$aX[0]; } if (is_array($aY)) { $aY=$aY[0]; } - $aImg->StrokeText($aX, $aY, $this->iText); + $aImg->StrokeText($aX, $aY, str_replace("\t", " ", $this->iText)); } elseif (is_array($this->iText) && ($n = count($this->iText)) > 0) { $ax = is_array($aX) ; $ay = is_array($aY) ; @@ -1900,26 +1823,14 @@ class TextProperty if (is_object($tmp)) { $tmp->Stroke($aImg, $aX[$i], $aY[$i]); } else { - if ($i < count($this->iFontArray)) { - $font = $this->iFontArray[$i]; - $aImg->SetFont($font[0], $font[1], $font[2]); - } else { - $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); - } $aImg->StrokeText($aX[$i], $aY[$i], str_replace("\t", " ", $tmp)); } } } } else { - $tmp = preg_split('/\t/', $this->iText); + $tmp = split("\t", $this->iText); $n = min(count($tmp), count($aX)); for ($i=0; $i < $n; ++$i) { - if ($i < count($this->iFontArray)) { - $font = $this->iFontArray[$i]; - $aImg->SetFont($font[0], $font[1], $font[2]); - } else { - $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); - } $aImg->StrokeText($aX[$i], $aY, $tmp[$i]); } } @@ -1953,7 +1864,7 @@ class HeaderProperty //--------------- // CONSTRUCTOR - public function __construct() + public function HeaderProperty() { $this->grid = new LineProperty(); } @@ -1970,28 +1881,23 @@ class HeaderProperty $this->iIntervall = $aInt; } - public function SetInterval($aInt) - { - $this->iIntervall = $aInt; - } - public function GetIntervall() { return $this->iIntervall ; } - + public function SetFont($aFFamily, $aFStyle=FS_NORMAL, $aFSize=10) { $this->iFFamily = $aFFamily; - $this->iFStyle = $aFStyle; - $this->iFSize = $aFSize; + $this->iFStyle = $aFStyle; + $this->iFSize = $aFSize; } public function SetFontColor($aColor) { $this->iTextColor = $aColor; } - + public function GetFontHeight($aImg) { $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); @@ -2009,12 +1915,12 @@ class HeaderProperty $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize); return $aImg->GetTextWidth($aStr); } - + public function SetStyle($aStyle) { $this->iStyle = $aStyle; } - + public function SetBackgroundColor($aColor) { $this->iBackgroundColor=$aColor; @@ -2029,24 +1935,24 @@ class HeaderProperty { $this->iFrameColor=$aColor; } - + // Only used by day scale public function SetWeekendColor($aColor) { $this->iWeekendBackgroundColor=$aColor; } - + // Only used by day scale public function SetSundayFontColor($aColor) { $this->iSundayTextColor=$aColor; } - + public function SetTitleVertMargin($aMargin) { $this->iTitleVertMargin=$aMargin; } - + public function SetLabelFormatString($aStr) { $this->iLabelFormStr=$aStr; @@ -2091,6 +1997,7 @@ class GanttScale // Out image to stroke the scale to private $iImg; private $iTableHeaderBackgroundColor="white"; + private $iTableHeaderFrameColor="black"; private $iTableHeaderFrameWeight=1; private $iAvailableHeight=-1; @@ -2098,11 +2005,11 @@ class GanttScale private $iDateLocale; private $iVertLayout=GANTT_EVEN; private $iUsePlotWeekendBackground=true; - private $iWeekStart = 1; // Default to have weekends start on Monday - + private $iWeekStart = 1; // Default to have weekends start on Monday + //--------------- // CONSTRUCTOR - public function __construct($aImg) + public function GanttScale($aImg) { $this->iImg = $aImg; $this->iDateLocale = new DateLocale(); @@ -2133,7 +2040,7 @@ class GanttScale $this->year = new HeaderProperty(); $this->year->SetFont(FF_FONT1, FS_BOLD); - + $this->divider=new LineProperty(); $this->dividerh=new LineProperty(); $this->dividerh->SetWeight(2); @@ -2145,7 +2052,7 @@ class GanttScale $this->tableTitle->Show(false); $this->actinfo = new GanttActivityInfo(); } - + //--------------- // PUBLIC METHODS // Specify what headers should be visible @@ -2167,37 +2074,37 @@ class GanttScale $this->day->grid->SetColor("black"); } } - + // Should the weekend background stretch all the way down in the plotarea public function UseWeekendBackground($aShow) { $this->iUsePlotWeekendBackground = $aShow; } - + // Have a range been specified? public function IsRangeSet() { return $this->iStartDate!=-1 && $this->iEndDate!=-1; } - + // Should the layout be from top or even? public function SetVertLayout($aLayout) { $this->iVertLayout = $aLayout; } - + // Which locale should be used? public function SetDateLocale($aLocale) { $this->iDateLocale->Set($aLocale); } - + // Number of days we are showing public function GetNumberOfDays() { return round(($this->iEndDate-$this->iStartDate)/SECPERDAY); } - + // The width of the actual plot area public function GetPlotWidth() { @@ -2218,7 +2125,7 @@ class GanttScale public function SetWeekStart($aStartDay) { $this->iWeekStart = $aStartDay % 7; - + //Recalculate the startday since this will change the week start $this->SetRange($this->iStartDate, $this->iEndDate); } @@ -2235,25 +2142,25 @@ class GanttScale return $this->hour->iShowLabels; } - + // Do we show day scale? public function IsDisplayDay() { return $this->day->iShowLabels; } - + // Do we show week scale? public function IsDisplayWeek() { return $this->week->iShowLabels; } - + // Do we show month scale? public function IsDisplayMonth() { return $this->month->iShowLabels; } - + // Do we show year scale? public function IsDisplayYear() { @@ -2287,7 +2194,7 @@ class GanttScale // Get day in week for start and ending date (Sun==0) $ds=strftime("%w", $this->iStartDate); $de=strftime("%w", $this->iEndDate); - + // We want to start on iWeekStart day. But first we subtract a week // if the startdate is "behind" the day the week start at. // This way we ensure that the given start date is always included @@ -2300,7 +2207,7 @@ class GanttScale } $adjdate = strtotime(($this->iWeekStart-$ds).' day', $d /*$this->iStartDate*/); $this->iStartDate = $adjdate; - + // We want to end on the last day of the week $preferredEndDay = ($this->iWeekStart+6)%7; if ($preferredEndDay != $de) { @@ -2319,7 +2226,7 @@ class GanttScale /////////////////////////////////////// // PRIVATE Methods - + // Determine the height of all the scale headers combined public function GetHeaderHeight() { @@ -2351,7 +2258,7 @@ class GanttScale } return $height; } - + // Get width (in pixels) for a single day public function GetDayWidth() { @@ -2378,7 +2285,7 @@ class GanttScale return 365; } } - + // Get week number public function GetWeekNbr($aDate, $aSunStart=true) { @@ -2396,28 +2303,28 @@ class GanttScale if ($aSunStart) { $day += 60*60*24; } - + /*------------------------------------------------------------------------- - According to ISO-8601 : - "Week 01 of a year is per definition the first week that has the Thursday in this year, - which is equivalent to the week that contains the fourth day of January. - In other words, the first week of a new year is the week that has the majority of its - days in the new year." + According to ISO-8601 : + "Week 01 of a year is per definition the first week that has the Thursday in this year, + which is equivalent to the week that contains the fourth day of January. + In other words, the first week of a new year is the week that has the majority of its + days in the new year." - Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!! - - day of year = date("z", $day) + 1 - offset to thursday = 3 - (date("w", $day) + 6) % 7 - first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7 - week number = (thursday's day of year - first thursday's day of year) / 7 + 1 - ---------------------------------------------------------------------------*/ + Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!! + day of year = date("z", $day) + 1 + offset to thursday = 3 - (date("w", $day) + 6) % 7 + first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7 + week number = (thursday's day of year - first thursday's day of year) / 7 + 1 + ---------------------------------------------------------------------------*/ + $thursday = $day + 60 * 60 * 24 * (3 - (date("w", $day) + 6) % 7); // take week's thursday $week = 1 + (date("z", $thursday) - (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $thursday)))) % 7) / 7; - + return $week; } - + // Is year a leap year? public function IsLeap($aYear) { @@ -2436,7 +2343,7 @@ class GanttScale { return 0+Date("Y", $aDate); } - + // Return number of days in a year public function GetNumDaysInMonth($aMonth, $aYear) { @@ -2448,7 +2355,7 @@ class GanttScale return $days[$aMonth]; } } - + // Get day in month public function GetMonthDayNbr($aDate) { @@ -2460,14 +2367,14 @@ class GanttScale { return 0+strftime("%j", $aDate); } - + // Get month number public function GetMonthNbr($aDate) { return 0+strftime("%m", $aDate); } - - // Translate a date to screen coordinates (horizontal scale) + + // Translate a date to screen coordinates (horizontal scale) public function TranslateDate($aDate) { // @@ -2497,34 +2404,29 @@ class GanttScale } // Get screen coordinatesz for the vertical position for a bar - public function TranslateVertPos($aPos, $atTop=false) + public function TranslateVertPos($aPos) { $img=$this->iImg; + $ph=$this->iAvailableHeight; if ($aPos > $this->iVertLines) { JpGraphError::RaiseL(6015, $aPos); } // 'Illegal vertical position %d' if ($this->iVertLayout == GANTT_EVEN) { // Position the top bar at 1 vert spacing from the scale - $pos = round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing); + return round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing); } else { // position the top bar at 1/2 a vert spacing from the scale - $pos = round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing); + return round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing); } - - if ($atTop) { - $pos -= $this->iVertSpacing; - } - - return $pos; } - + // What is the vertical spacing? public function GetVertSpacing() { return $this->iVertSpacing; } - + // Convert a date to timestamp public function NormalizeDate($aDate) { @@ -2546,7 +2448,7 @@ class GanttScale //Unknown date format in GanttScale ($aDate)."); } - + // Convert a time string to minutes public function TimeToMinutes($aTimeString) @@ -2574,7 +2476,7 @@ class GanttScale if ($this->minute->iShowLabels) { $img->SetFont($this->minute->iFFamily, $this->minute->iFStyle, $this->minute->iFSize); $yb = $yt + $img->GetFontHeight() + - $this->minute->iTitleVertMargin + $this->minute->iFrameWeight; + $this->minute->iTitleVertMargin + $this->minute->iFrameWeight; if ($getHeight) { return $yb - $img->top_margin; } @@ -2586,7 +2488,7 @@ class GanttScale $img->SetTextAlign("center"); $day = date('w', $this->iStartDate); $minint = $this->minute->GetIntervall() ; - + if (60 % $minint !== 0) { JpGraphError::RaiseL(6018, $minint); //'Intervall for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an intervall of '.$minint.' minutes.'); @@ -2626,17 +2528,19 @@ class GanttScale } switch ($this->minute->iStyle) { - case MINUTESTYLE_CUSTOM: - $txt = date($this->minute->iLabelFormStr, $datestamp); - break; - case MINUTESTYLE_MM: - default: - // 15 - $txt = date('i', $datestamp); - break; - } + case MINUTESTYLE_CUSTOM: + $txt = date($this->minute->iLabelFormStr, $datestamp); + break; + case MINUTESTYLE_MM: + default: + // 15 + $txt = date('i', $datestamp); + break; + } $img->StrokeText(round($x+$width/2), round($yb-$this->minute->iTitleVertMargin), $txt); + // FIXME: The rounding problem needs to be solved properly ... + // // Fix a rounding problem the wrong way .. // If we also have hour scale then don't draw the firsta or last // gridline since that will be overwritten by the hour scale gridline if such exists. @@ -2670,7 +2574,7 @@ class GanttScale if ($this->hour->iShowLabels) { $img->SetFont($this->hour->iFFamily, $this->hour->iFStyle, $this->hour->iFSize); $yb = $yt + $img->GetFontHeight() + - $this->hour->iTitleVertMargin + $this->hour->iFrameWeight; + $this->hour->iTitleVertMargin + $this->hour->iFrameWeight; if ($getHeight) { return $yb - $img->top_margin; } @@ -2711,25 +2615,25 @@ class GanttScale } switch ($this->hour->iStyle) { - case HOURSTYLE_HMAMPM: - // 1:35pm - $txt = date('g:ia', $datestamp); - break; - case HOURSTYLE_H24: - // 13 - $txt = date('H', $datestamp); - break; - case HOURSTYLE_HAMPM: - $txt = date('ga', $datestamp); - break; - case HOURSTYLE_CUSTOM: - $txt = date($this->hour->iLabelFormStr, $datestamp); - break; - case HOURSTYLE_HM24: - default: - $txt = date('H:i', $datestamp); - break; - } + case HOURSTYLE_HMAMPM: + // 1:35pm + $txt = date('g:ia', $datestamp); + break; + case HOURSTYLE_H24: + // 13 + $txt = date('H', $datestamp); + break; + case HOURSTYLE_HAMPM: + $txt = date('ga', $datestamp); + break; + case HOURSTYLE_CUSTOM: + $txt = date($this->hour->iLabelFormStr, $datestamp); + break; + case HOURSTYLE_HM24: + default: + $txt = date('H:i', $datestamp); + break; + } $img->StrokeText(round($x+$width/2), round($yb-$this->hour->iTitleVertMargin), $txt); $img->SetColor($this->hour->grid->iColor); $img->SetLineWeight($this->hour->grid->iWeight); @@ -2776,11 +2680,11 @@ class GanttScale $img->SetTextAlign("center"); $day = date('w', $this->iStartDate); $datestamp = $this->iStartDate; - + $doback = !($this->hour->iShowLabels || $this->minute->iShowLabels); setlocale(LC_TIME, $this->iDateLocale->iLocale); - + for ($i=0; $i < $this->GetNumberOfDays(); ++$i, $x+=$daywidth, $day += 1,$day %= 7) { if ($day==6 || $day==0) { $img->SetColor($this->day->iWeekendBackgroundColor); @@ -2807,61 +2711,61 @@ class GanttScale } switch ($this->day->iStyle) { - case DAYSTYLE_LONG: - // "Monday" - $txt = strftime('%A', $datestamp); - break; - case DAYSTYLE_SHORT: - // "Mon" - $txt = strftime('%a', $datestamp); - break; - case DAYSTYLE_SHORTDAYDATE1: - // "Mon 23/6" - $txt = strftime('%a %d/'.$mn, $datestamp); - break; - case DAYSTYLE_SHORTDAYDATE2: - // "Mon 23 Jun" - $txt = strftime('%a %d %b', $datestamp); - break; - case DAYSTYLE_SHORTDAYDATE3: - // "Mon 23 Jun 2003" - $txt = strftime('%a %d %b %Y', $datestamp); - break; - case DAYSTYLE_LONGDAYDATE1: - // "Monday 23 Jun" - $txt = strftime('%A %d %b', $datestamp); - break; - case DAYSTYLE_LONGDAYDATE2: - // "Monday 23 Jun 2003" - $txt = strftime('%A %d %b %Y', $datestamp); - break; - case DAYSTYLE_SHORTDATE1: - // "23/6" - $txt = strftime('%d/'.$mn, $datestamp); - break; - case DAYSTYLE_SHORTDATE2: - // "23 Jun" - $txt = strftime('%d %b', $datestamp); - break; - case DAYSTYLE_SHORTDATE3: - // "Mon 23" - $txt = strftime('%a %d', $datestamp); - break; - case DAYSTYLE_SHORTDATE4: - // "23" - $txt = strftime('%d', $datestamp); - break; - case DAYSTYLE_CUSTOM: - // Custom format - $txt = strftime($this->day->iLabelFormStr, $datestamp); - break; - case DAYSTYLE_ONELETTER: - default: - // "M" - $txt = strftime('%A', $datestamp); - $txt = strtoupper($txt[0]); - break; - } + case DAYSTYLE_LONG: + // "Monday" + $txt = strftime('%A', $datestamp); + break; + case DAYSTYLE_SHORT: + // "Mon" + $txt = strftime('%a', $datestamp); + break; + case DAYSTYLE_SHORTDAYDATE1: + // "Mon 23/6" + $txt = strftime('%a %d/'.$mn, $datestamp); + break; + case DAYSTYLE_SHORTDAYDATE2: + // "Mon 23 Jun" + $txt = strftime('%a %d %b', $datestamp); + break; + case DAYSTYLE_SHORTDAYDATE3: + // "Mon 23 Jun 2003" + $txt = strftime('%a %d %b %Y', $datestamp); + break; + case DAYSTYLE_LONGDAYDATE1: + // "Monday 23 Jun" + $txt = strftime('%A %d %b', $datestamp); + break; + case DAYSTYLE_LONGDAYDATE2: + // "Monday 23 Jun 2003" + $txt = strftime('%A %d %b %Y', $datestamp); + break; + case DAYSTYLE_SHORTDATE1: + // "23/6" + $txt = strftime('%d/'.$mn, $datestamp); + break; + case DAYSTYLE_SHORTDATE2: + // "23 Jun" + $txt = strftime('%d %b', $datestamp); + break; + case DAYSTYLE_SHORTDATE3: + // "Mon 23" + $txt = strftime('%a %d', $datestamp); + break; + case DAYSTYLE_SHORTDATE4: + // "23" + $txt = strftime('%d', $datestamp); + break; + case DAYSTYLE_CUSTOM: + // Custom format + $txt = strftime($this->day->iLabelFormStr, $datestamp); + break; + case DAYSTYLE_ONELETTER: + default: + // "M" + $txt = strftime('%A', $datestamp); + $txt = strtoupper($txt[0]); + break; + } if ($day==0) { $img->SetColor($this->day->iSundayTextColor); @@ -2887,7 +2791,7 @@ class GanttScale } return $aYCoord; } - + // Stroke week header and grid public function StrokeWeeks($aYCoord, $getHeight=false) { @@ -2915,43 +2819,43 @@ class GanttScale $img->SetTextAlign("center"); $txtOffset = $weekwidth/2+1; } elseif ($this->week->iStyle==WEEKSTYLE_FIRSTDAY || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 || - $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) { + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 || + $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) { $img->SetTextAlign("left"); $txtOffset = 3; } else { JpGraphError::RaiseL(6021); - //("Unknown formatting style for week."); } - + //("Unknown formatting style for week."); + for ($i=0; $i<$this->GetNumberOfDays()/7; ++$i, $x+=$weekwidth) { $img->PushColor($this->week->iTextColor); - + if ($this->week->iStyle==WEEKSTYLE_WNBR) { $txt = sprintf($this->week->iLabelFormStr, $weeknbr); } elseif ($this->week->iStyle==WEEKSTYLE_FIRSTDAY || - $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR) { + $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR) { $txt = date("j/n", $week); } elseif ($this->week->iStyle==WEEKSTYLE_FIRSTDAY2 || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) { + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) { $monthnbr = date("n", $week)-1; $shortmonth = $this->iDateLocale->GetShortMonthName($monthnbr); $txt = Date("j", $week)." ".$shortmonth; } if ($this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR || - $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) { + $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) { $w = sprintf($this->week->iLabelFormStr, $weeknbr); $txt .= ' '.$w; } - + $img->StrokeText( round($x+$txtOffset), round($yb-$this->week->iTitleVertMargin), $txt ); - + $week = strtotime('+7 day', $week); $weeknbr = $this->GetWeekNbr($week); $img->PopColor(); @@ -2966,38 +2870,38 @@ class GanttScale } return $aYCoord; } - + // Format the mont scale header string public function GetMonthLabel($aMonthNbr, $year) { $sn = $this->iDateLocale->GetShortMonthName($aMonthNbr); $ln = $this->iDateLocale->GetLongMonthName($aMonthNbr); switch ($this->month->iStyle) { - case MONTHSTYLE_SHORTNAME: - $m=$sn; - break; - case MONTHSTYLE_LONGNAME: - $m=$ln; - break; - case MONTHSTYLE_SHORTNAMEYEAR2: - $m=$sn." '".substr("".$year, 2); - break; - case MONTHSTYLE_SHORTNAMEYEAR4: - $m=$sn." ".$year; - break; - case MONTHSTYLE_LONGNAMEYEAR2: - $m=$ln." '".substr("".$year, 2); - break; - case MONTHSTYLE_LONGNAMEYEAR4: - $m=$ln." ".$year; - break; - case MONTHSTYLE_FIRSTLETTER: - $m=$sn[0]; - break; - } + case MONTHSTYLE_SHORTNAME: + $m=$sn; + break; + case MONTHSTYLE_LONGNAME: + $m=$ln; + break; + case MONTHSTYLE_SHORTNAMEYEAR2: + $m=$sn." '".substr("".$year, 2); + break; + case MONTHSTYLE_SHORTNAMEYEAR4: + $m=$sn." ".$year; + break; + case MONTHSTYLE_LONGNAMEYEAR2: + $m=$ln." '".substr("".$year, 2); + break; + case MONTHSTYLE_LONGNAMEYEAR4: + $m=$ln." ".$year; + break; + case MONTHSTYLE_FIRSTLETTER: + $m=$sn[0]; + break; + } return $m; } - + // Stroke month scale and gridlines public function StrokeMonths($aYCoord, $getHeight=false) { @@ -3012,7 +2916,7 @@ class GanttScale $monthnbr = $this->GetMonthNbr($this->iStartDate)-1; $xt=$img->left_margin+$this->iLabelWidth; $xb=$img->width-$img->right_margin+1; - + $img->SetColor($this->month->iBackgroundColor); $img->FilledRectangle($xt, $yt, $xb, $yb); @@ -3021,7 +2925,7 @@ class GanttScale $year = 0+strftime("%Y", $this->iStartDate); $img->SetTextAlign("center"); if ($this->GetMonthNbr($this->iStartDate) == $this->GetMonthNbr($this->iEndDate) - && $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate)) { + && $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate)) { $monthwidth=$this->GetDayWidth()*($this->GetMonthDayNbr($this->iEndDate) - $this->GetMonthDayNbr($this->iStartDate) + 1); } else { $monthwidth=$this->GetDayWidth()*($this->GetNumDaysInMonth($monthnbr, $year)-$this->GetMonthDayNbr($this->iStartDate)+1); @@ -3096,7 +3000,7 @@ class GanttScale } else { $yearwidth=$this->GetDayWidth()*($this->GetNumDaysInYear($year)-$this->GetYearDayNbr($this->iStartDate)+1); } - + // The space for a year must be at least 20% bigger than the actual text // so we allow 10% margin on each side if ($yearwidth >= 1.20*$img->GetTextWidth("".$year)) { @@ -3136,7 +3040,7 @@ class GanttScale } return $aYCoord; } - + // Stroke table title (upper left corner) public function StrokeTableHeaders($aYBottom) { @@ -3161,7 +3065,7 @@ class GanttScale // Draw the horizontal dividing line $this->dividerh->Stroke($img, $xt, $yb, $img->width-$img->right_margin, $yb); - + // Draw the vertical dividing line // We do the width "manually" since we want the line only to grow // to the left @@ -3193,8 +3097,8 @@ class GanttScale { if (!$this->IsRangeSet()) { JpGraphError::RaiseL(6022); - //("Gantt scale has not been specified."); } + //("Gantt scale has not been specified."); $img=$this->iImg; // If minutes are displayed then hour interval must be 1 @@ -3202,10 +3106,10 @@ class GanttScale JpGraphError::RaiseL(6023); //('If you display both hour and minutes the hour intervall must be 1 (Otherwise it doesn\' make sense to display minutes).'); } - + // Stroke all headers. As argument we supply the offset from the // top which depends on any previous headers - + // First find out the height of each header $offy=$this->StrokeYears(0, true); $offm=$this->StrokeMonths($offy, true); @@ -3227,10 +3131,9 @@ class GanttScale // Now when we now the oaverall size of the scale headers // we can stroke the overall table headers $this->StrokeTableHeaders($offmin); - + // Now we can calculate the correct scaling factor for each vertical position $this->iAvailableHeight = $img->height - $img->top_margin - $img->bottom_margin - $offd; - $this->iVertHeaderSize = $offmin; if ($this->iVertSpacing == -1) { $this->iVertSpacing = $this->iAvailableHeight / $this->iVertLines; @@ -3253,7 +3156,7 @@ class GanttConstraint //--------------- // CONSTRUCTOR - public function __construct($aRow, $aType, $aColor, $aArrowSize, $aArrowType) + public function GanttConstraint($aRow, $aType, $aColor, $aArrowSize, $aArrowType) { $this->iConstrainType = $aType; $this->iConstrainRow = $aRow; @@ -3279,14 +3182,14 @@ class GanttPlotObject public $constraints = array(); public $iCaptionMargin=5; public $iConstrainPos=array(); - protected $iStart=""; // Start date - public $iVPos=0; // Vertical position - protected $iLabelLeftMargin=2; // Title margin - - public function __construct() + protected $iStart=""; // Start date + public $iVPos=0; // Vertical position + protected $iLabelLeftMargin=2; // Title margin + + public function GanttPlotObject() { $this->title = new TextProperty(); - $this->title->Align('left', 'center'); + $this->title->Align("left", "center"); $this->caption = new TextProperty(); } @@ -3312,7 +3215,7 @@ class GanttPlotObject $this->csimwintarget=$aWinTarget; $this->csimalt=$aAlt; } - + public function SetCSIMAlt($aAlt) { if (!is_string($aAlt)) { @@ -3333,6 +3236,12 @@ class GanttPlotObject $this->iConstrainPos = array($xt,$yt,$xb,$yb); } + /* + function GetConstrain() { + return array($this->iConstrainRow,$this->iConstrainType); + } + */ + public function GetMinDate() { return $this->iStart; @@ -3342,7 +3251,7 @@ class GanttPlotObject { return $this->iStart; } - + public function SetCaptionMargin($aMarg) { $this->iCaptionMargin=$aMarg; @@ -3352,7 +3261,7 @@ class GanttPlotObject { return 0; } - + public function GetLineNbr() { return $this->iVPos; @@ -3384,13 +3293,13 @@ class Progress public $iFillColor='black'; public $iDensity=98; public $iHeight=0.65; - + public function Set($aProg) { if ($aProg < 0.0 || $aProg > 1.0) { JpGraphError::RaiseL(6027); - //("Progress value must in range [0, 1]"); } + //("Progress value must in range [0, 1]"); $this->iProgress = $aProg; } @@ -3405,15 +3314,15 @@ class Progress { $this->iFillColor = $aColor; } - + public function SetHeight($aHeight) { $this->iHeight = $aHeight; } } -define('GANTT_HGRID1', 0); -define('GANTT_HGRID2', 1); +DEFINE('GANTT_HGRID1', 0); +DEFINE('GANTT_HGRID2', 1); //=================================================== // CLASS HorizontalGridLine @@ -3428,13 +3337,13 @@ class HorizontalGridLine private $line=null; private $iStart=0; // 0=from left margin, 1=just along header - public function __construct() + public function HorizontalGridLine() { $this->line = new LineProperty(); $this->line->SetColor('gray@0.4'); $this->line->SetStyle('dashed'); } - + public function Show($aShow=true) { $this->iShow = $aShow; @@ -3520,14 +3429,11 @@ class GanttBar extends GanttPlotObject private $iPattern=GANTT_RDIAG; private $iPatternColor="blue"; private $iPatternDensity=95; - private $iBreakStyle=false; - private $iBreakLineStyle='dotted'; - private $iBreakLineWeight=1; //--------------- // CONSTRUCTOR - public function __construct($aPos, $aLabel, $aStart, $aEnd, $aCaption="", $aHeightFactor=0.6) + public function GanttBar($aPos, $aLabel, $aStart, $aEnd, $aCaption="", $aHeightFactor=0.6) { - parent::__construct(); + parent::GanttPlotObject(); $this->iStart = $aStart; // Is the end date given as a date or as number of days added to start date? if (is_string($aEnd)) { @@ -3552,7 +3458,7 @@ class GanttBar extends GanttPlotObject $this->rightMark->Hide(); $this->progress = new Progress(); } - + //--------------- // PUBLIC METHODS public function SetShadow($aShadow=true, $aColor="gray") @@ -3560,19 +3466,12 @@ class GanttBar extends GanttPlotObject $this->iShadow=$aShadow; $this->iShadowColor=$aColor; } - - public function SetBreakStyle($aFlg=true, $aLineStyle='dotted', $aLineWeight=1) - { - $this->iBreakStyle = $aFlg; - $this->iBreakLineStyle = $aLineStyle; - $this->iBreakLineWeight = $aLineWeight; - } - + public function GetMaxDate() { return $this->iEnd; } - + public function SetHeight($aHeight) { $this->iHeightFactor = $aHeight; @@ -3606,7 +3505,7 @@ class GanttBar extends GanttPlotObject return -1; } } - + public function SetPattern($aPattern, $aColor="blue", $aDensity=95) { $this->iPattern = $aPattern; @@ -3629,16 +3528,17 @@ class GanttBar extends GanttPlotObject $vs = $this->iHeightFactor; } else { JpGraphError::RaiseL(6028, $this->iHeightFactor); - // ("Specified height (".$this->iHeightFactor.") for gantt bar is out of range."); } - + //("Specified height (".$this->iHeightFactor.") for gantt bar is out of range."); + // Clip date to min max dates to show $st = $aScale->NormalizeDate($this->iStart); $en = $aScale->NormalizeDate($this->iEnd); + $limst = max($st, $aScale->iStartDate); $limen = min($en, $aScale->iEndDate); - + $xt = round($aScale->TranslateDate($limst)); $xb = round($aScale->TranslateDate($limen)); $yt = round($aScale->TranslateVertPos($this->iVPos)-$vs-($aScale->GetVertSpacing()/2-$vs/2)); @@ -3659,11 +3559,11 @@ class GanttBar extends GanttPlotObject if (! empty($this->title->csimtarget[$i])) { $this->csimarea .= "title->csimtarget[$i]."\""; - + if (! empty($this->title->csimwintarget[$i])) { $this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\" "; } - + if (! empty($this->title->csimalt[$i])) { $tmp = $this->title->csimalt[$i]; $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; @@ -3672,46 +3572,35 @@ class GanttBar extends GanttPlotObject } } } - + // Check if the bar is totally outside the current scale range if ($en < $aScale->iStartDate || $st > $aScale->iEndDate) { return; } - + // Remember the positions for the bar $this->SetConstrainPos($xt, $yt, $xb, $yb); - - - + $prect->ShowFrame(false); $prect->SetBackground($this->iFillColor); - if ($this->iBreakStyle) { + if ($this->iShadow) { $aImg->SetColor($this->iFrameColor); - $olds = $aImg->SetLineStyle($this->iBreakLineStyle); - $oldw = $aImg->SetLineWeight($this->iBreakLineWeight); - $aImg->StyleLine($xt, $yt, $xb, $yt); - $aImg->StyleLine($xt, $yb, $xb, $yb); - $aImg->SetLineStyle($olds); - $aImg->SetLineWeight($oldw); + $aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor); + $prect->SetPos(new Rectangle($xt+1, $yt+1, $xb-$xt-$this->iShadowWidth-2, $yb-$yt-$this->iShadowWidth-2)); + $prect->Stroke($aImg); } else { - if ($this->iShadow) { - $aImg->SetColor($this->iFrameColor); - $aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor); - $prect->SetPos(new Rectangle($xt+1, $yt+1, $xb-$xt-$this->iShadowWidth-2, $yb-$yt-$this->iShadowWidth-2)); - $prect->Stroke($aImg); - } else { - $prect->SetPos(new Rectangle($xt, $yt, $xb-$xt+1, $yb-$yt+1)); - $prect->Stroke($aImg); - $aImg->SetColor($this->iFrameColor); - $aImg->Rectangle($xt, $yt, $xb, $yb); - } + $prect->SetPos(new Rectangle($xt, $yt, $xb-$xt+1, $yb-$yt+1)); + $prect->Stroke($aImg); + $aImg->SetColor($this->iFrameColor); + $aImg->Rectangle($xt, $yt, $xb, $yb); } + // CSIM for bar if (! empty($this->csimtarget)) { $coords = "$xt,$yt,$xb,$yt,$xb,$yb,$xt,$yb"; $this->csimarea .= "csimtarget."\""; - + if (!empty($this->csimwintarget)) { $this->csimarea .= " target=\"".$this->csimwintarget."\" "; } @@ -3732,19 +3621,19 @@ class GanttBar extends GanttPlotObject $endpos = $xtp+$len; if ($endpos > $xt) { - // Take away the length of the progress that is not visible (before the start date) + // Take away the length of the progress that is not visible (before the start date) $len -= ($xt-$xtp); // Is the the progress bar visible after the start date? if ($xtp < $xt) { $xtp = $xt; } - + // Make sure that the progess bar doesn't extend over the end date if ($xtp+$len-1 > $xb) { $len = $xb - $xtp ; } - + $prog = $factory->Create($this->progress->iPattern, $this->progress->iColor); $prog->SetDensity($this->progress->iDensity); $prog->SetBackground($this->progress->iFillColor); @@ -3759,7 +3648,7 @@ class GanttBar extends GanttPlotObject $prog->Stroke($aImg); } } - + // We don't plot the end mark if the bar has been capped if ($limst == $st) { $y = $middle; @@ -3780,7 +3669,7 @@ class GanttBar extends GanttPlotObject $y = $yb ; } $this->rightMark->Stroke($aImg, $xb, $y); - + $margin = $this->iCaptionMargin; if ($this->rightMark->show) { $margin += $this->rightMark->GetWidth(); @@ -3797,12 +3686,12 @@ class GanttBar extends GanttPlotObject class MileStone extends GanttPlotObject { public $mark; - + //--------------- // CONSTRUCTOR - public function __construct($aVPos, $aLabel, $aDate, $aCaption="") + public function MileStone($aVPos, $aLabel, $aDate, $aCaption="") { - GanttPlotObject::__construct(); + GanttPlotObject::GanttPlotObject(); $this->caption->Set($aCaption); $this->caption->Align("left", "center"); $this->caption->SetFont(FF_FONT1, FS_BOLD); @@ -3816,15 +3705,15 @@ class MileStone extends GanttPlotObject $this->iVPos = $aVPos; $this->iStart = $aDate; } - + //--------------- // PUBLIC METHODS - + public function GetAbsHeight($aImg) { return max($this->title->GetHeight($aImg), $this->mark->GetWidth()); } - + public function Stroke($aImg, $aScale) { // Put the mark in the middle at the middle of the day @@ -3847,14 +3736,14 @@ class MileStone extends GanttPlotObject $title_xt = $colstarts[$i]; $title_xb = $title_xt + $colwidth[$i]; $coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb"; - + if (!empty($this->title->csimtarget[$i])) { $this->csimarea .= "title->csimtarget[$i]."\""; - + if (!empty($this->title->csimwintarget[$i])) { $this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\""; } - + if (! empty($this->title->csimalt[$i])) { $tmp = $this->title->csimalt[$i]; $this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" "; @@ -3872,13 +3761,13 @@ class MileStone extends GanttPlotObject // this milestone $w = $this->mark->GetWidth()/2; $this->SetConstrainPos($x, round($y-$w), $x, round($y+$w)); - + // Setup CSIM if ($this->csimtarget != '') { $this->mark->SetCSIMTarget($this->csimtarget); $this->mark->SetCSIMAlt($this->csimalt); } - + $this->mark->Stroke($aImg, $x, $y); $this->caption->Stroke($aImg, $x+$this->mark->width/2+$this->iCaptionMargin, $y); @@ -3894,9 +3783,9 @@ class MileStone extends GanttPlotObject class TextPropertyBelow extends TextProperty { - public function __construct($aTxt='') + public function TextPropertyBelow($aTxt='') { - parent::__construct($aTxt); + parent::TextProperty($aTxt); } public function GetColWidth($aImg, $aMargin=0) @@ -3911,15 +3800,13 @@ class GanttVLine extends GanttPlotObject { private $iLine; private $title_margin=3; - private $iDayOffset=0.5; - private $iStartRow = -1; - private $iEndRow = -1; - + private $iDayOffset=1; + //--------------- // CONSTRUCTOR - public function __construct($aDate, $aTitle="", $aColor="darkred", $aWeight=2, $aStyle="solid") + public function GanttVLine($aDate, $aTitle="", $aColor="black", $aWeight=3, $aStyle="dashed") { - GanttPlotObject::__construct(); + GanttPlotObject::GanttPlotObject(); $this->iLine = new LineProperty(); $this->iLine->SetColor($aColor); $this->iLine->SetWeight($aWeight); @@ -3932,33 +3819,20 @@ class GanttVLine extends GanttPlotObject //--------------- // PUBLIC METHODS - // Set start and end rows for the VLine. By default the entire heigh of the - // Gantt chart is used - public function SetRowSpan($aStart, $aEnd=-1) - { - $this->iStartRow = $aStart; - $this->iEndRow = $aEnd; - } - public function SetDayOffset($aOff=0.5) { if ($aOff < 0.0 || $aOff > 1.0) { JpGraphError::RaiseL(6029); - //("Offset for vertical line must be in range [0,1]"); } + //("Offset for vertical line must be in range [0,1]"); $this->iDayOffset = $aOff; } - + public function SetTitleMargin($aMarg) { $this->title_margin = $aMarg; } - - public function SetWeight($aWeight) - { - $this->iLine->SetWeight($aWeight); - } - + public function Stroke($aImg, $aScale) { $d = $aScale->NormalizeDate($this->iStart); @@ -3968,20 +3842,9 @@ class GanttVLine extends GanttPlotObject if ($this->iDayOffset != 0.0) { $d += 24*60*60*$this->iDayOffset; } - $x = $aScale->TranslateDate($d);//d=1006858800, - - if ($this->iStartRow > -1) { - $y1 = $aScale->TranslateVertPos($this->iStartRow, true) ; - } else { - $y1 = $aScale->iVertHeaderSize+$aImg->top_margin; - } - - if ($this->iEndRow > -1) { - $y2 = $aScale->TranslateVertPos($this->iEndRow); - } else { - $y2 = $aImg->height - $aImg->bottom_margin; - } - + $x = $aScale->TranslateDate($d); + $y1 = $aScale->iVertHeaderSize+$aImg->top_margin; + $y2 = $aImg->height - $aImg->bottom_margin; $this->iLine->Stroke($aImg, $x, $y1, $x, $y2); $this->title->Align("center", "top"); $this->title->Stroke($aImg, $x, $y2+$this->title_margin); @@ -4003,7 +3866,7 @@ class LinkArrow private $iSize=ARROW_S2; private $iColor='black'; - public function __construct($x, $y, $aDirection, $aType=ARROWT_SOLID, $aSize=ARROW_S2) + public function LinkArrow($x, $y, $aDirection, $aType=ARROWT_SOLID, $aSize=ARROW_S2) { $this->iDirection = $aDirection; $this->iType = $aType; @@ -4011,7 +3874,7 @@ class LinkArrow $this->ix = $x; $this->iy = $y; } - + public function SetColor($aColor) { $this->iColor = $aColor; @@ -4033,38 +3896,38 @@ class LinkArrow $x = $this->ix; $y = $this->iy; switch ($this->iDirection) { - case ARROW_DOWN: - $c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y); - break; - case ARROW_UP: - $c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y); - break; - case ARROW_LEFT: - $c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y); - break; - case ARROW_RIGHT: - $c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y); - break; - default: - JpGraphError::RaiseL(6030); - //('Unknown arrow direction for link.'); - die(); - break; - } + case ARROW_DOWN: + $c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y); + break; + case ARROW_UP: + $c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y); + break; + case ARROW_LEFT: + $c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y); + break; + case ARROW_RIGHT: + $c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y); + break; + default: + JpGraphError::RaiseL(6030); +//('Unknown arrow direction for link.'); + die(); + break; + } $aImg->SetColor($this->iColor); switch ($this->iType) { - case ARROWT_SOLID: - $aImg->FilledPolygon($c); - break; - case ARROWT_OPEN: - $aImg->Polygon($c); - break; - default: - JpGraphError::RaiseL(6031); - //('Unknown arrow type for link.'); - die(); - break; - } + case ARROWT_SOLID: + $aImg->FilledPolygon($c); + break; + case ARROWT_OPEN: + $aImg->Polygon($c); + break; + default: + JpGraphError::RaiseL(6031); +//('Unknown arrow type for link.'); + die(); + break; + } } } @@ -4086,7 +3949,7 @@ class GanttLink private $iArrowSize=ARROW_S2; private $iArrowType=ARROWT_SOLID; - public function __construct($x1=0, $y1=0, $x2=0, $y2=0) + public function GanttLink($x1=0, $y1=0, $x2=0, $y2=0) { $this->ix1 = $x1; $this->ix2 = $x2; @@ -4117,7 +3980,7 @@ class GanttLink $this->iArrowSize = $aSize; $this->iArrowType = $aType; } - + public function SetWeight($aWeight) { $this->iWeight = $aWeight; @@ -4151,52 +4014,52 @@ class GanttLink $midy = round(($y2-$y1)/2+$y1); if ($x2 > $x1) { switch ($this->iPathType) { - case 0: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 1: - case 2: - case 3: - $c = array($x1,$y1,$x2,$y1,$x2,$y2); - break; - default: - JpGraphError::RaiseL(6032, $this->iPathType); - //('Internal error: Unknown path type (='.$this->iPathType .') specified for link.'); - exit(1); - break; - } + case 0: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 1: + case 2: + case 3: + $c = array($x1,$y1,$x2,$y1,$x2,$y2); + break; + default: + JpGraphError::RaiseL(6032, $this->iPathType); +//('Internal error: Unknown path type (='.$this->iPathType .') specified for link.'); + exit(1); + break; + } } else { switch ($this->iPathType) { - case 0: - case 1: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 2: - // Always extend out horizontally a bit from the first point - // If we draw a link back in time (end to start) and the bars - // are very close we also change the path so it comes in from - // the left on the activity - $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, - $x1+$this->iPathExtend,$midy, - $x2,$midy,$x2,$y2); - break; - case 3: - if ($y2-$midy < 6) { - $c = array($x1,$y1,$x1,$midy, - $x2-$this->iPathExtend,$midy, - $x2-$this->iPathExtend,$y2, - $x2,$y2); - $arrowtype = ARROW_RIGHT; - } else { - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - } - break; - default: - JpGraphError::RaiseL(6032, $this->iPathType); - //('Internal error: Unknown path type specified for link.'); - exit(1); - break; - } + case 0: + case 1: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 2: + // Always extend out horizontally a bit from the first point + // If we draw a link back in time (end to start) and the bars + // are very close we also change the path so it comes in from + // the left on the activity + $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, + $x1+$this->iPathExtend,$midy, + $x2,$midy,$x2,$y2); + break; + case 3: + if ($y2-$midy < 6) { + $c = array($x1,$y1,$x1,$midy, + $x2-$this->iPathExtend,$midy, + $x2-$this->iPathExtend,$y2, + $x2,$y2); + $arrowtype = ARROW_RIGHT; + } else { + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + } + break; + default: + JpGraphError::RaiseL(6032, $this->iPathType); +//('Internal error: Unknown path type specified for link.'); + exit(1); + break; + } } $arrow = new LinkArrow($x2, $y2, $arrowtype); } else { @@ -4205,50 +4068,50 @@ class GanttLink $midy = round(($y1-$y2)/2+$y2); if ($x2 > $x1) { switch ($this->iPathType) { - case 0: - case 1: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 3: - if ($midy-$y2 < 8) { - $arrowtype = ARROW_RIGHT; - $c = array($x1,$y1,$x1,$y2,$x2,$y2); - } else { - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - } - break; - default: - JpGraphError::RaiseL(6032, $this->iPathType); - //('Internal error: Unknown path type specified for link.'); - break; - } + case 0: + case 1: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 3: + if ($midy-$y2 < 8) { + $arrowtype = ARROW_RIGHT; + $c = array($x1,$y1,$x1,$y2,$x2,$y2); + } else { + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + } + break; + default: + JpGraphError::RaiseL(6032, $this->iPathType); +//('Internal error: Unknown path type specified for link.'); + break; + } } else { switch ($this->iPathType) { - case 0: - case 1: - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - break; - case 2: - // Always extend out horizontally a bit from the first point - $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, - $x1+$this->iPathExtend,$midy, - $x2,$midy,$x2,$y2); - break; - case 3: - if ($midy-$y2 < 16) { - $arrowtype = ARROW_RIGHT; - $c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy, - $x2-$this->iPathExtend,$y2, - $x2,$y2); - } else { - $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); - } - break; - default: - JpGraphError::RaiseL(6032, $this->iPathType); - //('Internal error: Unknown path type specified for link.'); - break; - } + case 0: + case 1: + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + break; + case 2: + // Always extend out horizontally a bit from the first point + $c = array($x1,$y1,$x1+$this->iPathExtend,$y1, + $x1+$this->iPathExtend,$midy, + $x2,$midy,$x2,$y2); + break; + case 3: + if ($midy-$y2 < 16) { + $arrowtype = ARROW_RIGHT; + $c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy, + $x2-$this->iPathExtend,$y2, + $x2,$y2); + } else { + $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2); + } + break; + default: + JpGraphError::RaiseL(6032, $this->iPathType); +//('Internal error: Unknown path type specified for link.'); + break; + } } $arrow = new LinkArrow($x2, $y2, $arrowtype); } diff --git a/onyx2/include/jpgraph/jpgraph_gb2312.php b/onyx2/include/jpgraph/jpgraph_gb2312.php index 7eafce1..5e4fe4c 100644 --- a/onyx2/include/jpgraph/jpgraph_gb2312.php +++ b/onyx2/include/jpgraph/jpgraph_gb2312.php @@ -1,11 +1,11 @@ 25745, 13126 => 31216, 13127 => 22478, 13128 => 27225, 13129 => 25104, 13130 => 21576, 13131 => 20056, 13132 => 31243, 13133 => 24809, 13134 => 28548, 13135 => 35802, 13136 => 25215, 13137 => 36894, 13138 => 39563, 13139 => 31204, - 13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744, - 13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831, - 13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021, - 13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815, - 13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364, - 13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504, - 13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986, - 13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607, - 13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648, - 13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571, - 13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337, - 13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162, - 13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810, - 13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943, - 13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850, - 13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913, - 13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789, - 13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874, - 13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995, - 13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419, - 13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828, - 13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140, - 13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923, - 13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169, - 13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171, - 13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140, - 13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955, - 13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285, - 13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966, - 13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129, - 13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377, - 13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443, - 13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548, - 13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423, - 13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783, - 13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011, - 13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932, - 13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265, - 13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532, - 13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072, - 13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856, - 13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008, - 13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583, - 13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993, - 13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300, - 13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853, - 13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025, - 13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746, - 13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026, - 13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923, - 13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497, - 13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563, - 13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581, - 13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922, - 13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701, - 13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534, - 13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544, - 13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045, - 13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810, - 13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346, - 13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558, - 13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769, - 13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943, - 13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799, - 13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108, - 14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240, - 14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281, - 14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718, - 14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453, - 14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277, - 14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938, - 14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775, - 14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857, - 14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536, - 14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452, - 14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439, - 14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859, - 14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016, - 14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155, - 14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911, - 14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315, - 14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413, - 14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679, - 14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014, - 14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995, - 14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023, - 14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212, - 14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613, - 14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127, - 14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538, - 14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913, - 14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178, - 14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925, - 14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195, - 14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923, - 14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705, - 14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957, - 14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733, - 14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011, - 14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684, - 14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010, - 14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789, - 14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831, - 14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685, - 14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467, - 14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129, - 14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503, - 14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815, - 14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272, - 14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476, - 14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925, - 14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916, - 14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054, - 14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448, - 14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592, - 14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191, - 14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789, - 14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740, - 14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330, - 14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829, - 14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065, - 14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023, - 14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219, - 14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085, - 14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752, - 14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717, - 14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477, - 14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627, - 14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009, - 14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680, - 14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418, - 14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203, - 14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657, - 14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756, - 14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720, - 14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946, - 14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399, - 14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518, - 14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774, - 14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946, - 14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252, - 15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719, - 15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010, - 15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576, - 15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707, - 15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796, - 15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462, - 15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970, - 15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822, - 15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854, - 15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674, - 15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935, - 15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229, - 15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826, - 15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746, - 15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249, - 15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669, - 15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522, - 15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637, - 15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749, - 15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513, - 15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598, - 15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363, - 15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034, - 15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395, - 15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982, - 15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082, - 15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426, - 15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478, - 15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002, - 15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550, - 15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362, - 15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860, - 15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575, - 15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315, - 15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943, - 15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145, - 15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581, - 15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293, - 15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558, - 15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728, - 15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477, - 15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014, - 15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047, - 15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389, - 15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564, - 15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735, - 15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509, - 15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130, - 15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463, - 15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299, - 15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028, - 15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626, - 15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170, - 15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165, - 15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105, - 15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170, - 15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230, - 15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923, - 15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048, - 15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452, - 15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928, - 15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416, - 15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061, - 15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276, - 15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816, - 15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545, - 15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030, - 15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040, - 15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465, - 15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424, - 15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367, - 15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496, - 15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776, - 15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891, - 15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994, - 16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345, - 16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975, - 16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350, - 16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968, - 16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771, - 16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499, - 16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185, - 16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811, - 16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827, - 16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354, - 16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475, - 16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391, - 16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840, - 16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359, - 16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454, - 16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719, - 16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420, - 16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745, - 16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372, - 16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193, - 16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895, - 16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713, - 16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639, - 16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572, - 16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518, - 16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436, - 16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438, - 16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013, - 16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048, - 16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047, - 16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867, - 16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400, - 16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432, - 16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324, - 16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519, - 16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782, - 16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432, - 16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582, - 16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852, - 16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604, - 16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142, - 16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937, - 16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742, - 16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769, - 16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525, - 16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243, - 16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872, - 16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967, - 16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107, - 16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618, - 16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278, - 16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725, - 16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705, - 16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016, - 16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857, - 16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534, - 16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044, - 16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446, - 16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523, - 16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860, - 16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510, - 16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540, - 16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653, - 16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459, - 16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371, - 16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504, - 16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177, - 16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746, - 16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585, - 16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476, - 17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434, - 17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475, - 17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033, - 17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067, - 17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426, - 17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725, - 17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683, - 17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125, - 17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522, - 17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809, - 17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654, - 17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376, - 17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308, - 17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391, - 17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855, - 17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269, - 17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825, - 17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193, - 17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551, - 17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217, - 17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279, - 17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126, - 17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629, - 17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169, - 17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273, - 17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819, - 17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279, - 17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982, - 17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215, - 17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287, - 17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048, - 17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035, - 17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007, - 17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700, - 17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869, - 17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522, - 17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311, - 17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288, - 17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565, - 17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423, - 17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221, - 17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957, - 17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197, - 17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892, - 17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899, - 17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062, - 17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485, - 17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812, - 17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597, - 17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472, - 17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424, - 17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467, - 17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982, - 17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957, - 17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521, - 17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329, - 17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256, - 17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842, - 17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527, - 17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713, - 17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607, - 17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305, - 17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687, - 17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418, - 17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340, - 17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050, - 17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973, - 17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900, - 17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843, - 17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166, - 17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484, - 18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889, - 18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646, - 18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422, - 18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855, - 18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784, - 18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215, - 18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865, - 18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323, - 18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688, - 18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085, - 18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878, - 18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069, - 18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545, - 18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595, - 18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378, - 18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708, - 18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039, - 18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431, - 18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623, - 18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206, - 18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165, - 18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682, - 18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228, - 18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198, - 18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041, - 18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845, - 18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527, - 18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094, - 18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079, - 18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154, - 18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570, - 18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063, - 18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982, - 18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756, - 18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200, - 18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161, - 18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748, - 18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173, - 18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635, - 18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466, - 18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593, - 18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785, - 18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719, - 18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384, - 18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922, - 18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187, - 18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705, - 18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195, - 18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862, - 18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049, - 18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022, - 18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441, - 18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378, - 18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892, - 18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260, - 18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578, - 18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903, - 18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736, - 18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503, - 18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556, - 18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775, - 18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145, - 18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457, - 18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183, - 18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319, - 18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988, - 18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045, - 18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313, - 18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135, - 18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690, - 19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335, - 19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107, - 19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159, - 19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365, - 19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643, - 19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163, - 19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806, - 19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530, - 19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460, - 19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174, - 19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329, - 19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646, - 19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101, - 19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465, - 19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928, - 19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684, - 19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561, - 19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308, - 19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031, - 19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496, - 19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987, - 19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051, - 19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865, - 19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368, - 19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439, - 19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609, - 19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240, - 19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543, - 19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319, - 19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439, - 19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553, - 19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604, - 19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549, - 19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492, - 19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826, - 19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138, - 19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192, - 19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631, - 19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845, - 19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848, - 19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538, - 19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059, - 19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867, - 19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305, - 19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799, - 19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064, - 19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159, - 19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825, - 19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684, - 19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834, - 19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086, - 19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311, - 19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351, - 19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516, - 19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413, - 19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237, - 19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361, - 19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648, - 19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242, - 19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114, - 19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302, - 19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534, - 19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822, - 19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043, - 19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916, - 19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024, - 19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202, - 19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975, - 19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505, - 19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536, - 19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361, - 20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807, - 20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479, - 20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614, - 20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031, - 20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205, - 20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239, - 20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441, - 20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985, - 20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065, - 20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569, - 20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044, - 20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436, - 20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494, - 20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237, - 20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212, - 20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823, - 20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802, - 20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177, - 20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713, - 20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911, - 20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989, - 20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115, - 20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454, - 20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758, - 20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979, - 20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184, - 20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688, - 20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046, - 20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616, - 20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673, - 20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456, - 20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140, - 20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814, - 20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055, - 20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831, - 20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179, - 20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195, - 20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880, - 20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463, - 20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658, - 20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889, - 20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844, - 20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455, - 20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571, - 20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125, - 20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411, - 20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184, - 20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982, - 20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066, - 20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957, - 20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687, - 20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035, - 20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465, - 20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110, - 20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927, - 20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873, - 20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203, - 20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195, - 20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547, - 20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757, - 20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276, - 20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469, - 20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079, - 20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937, - 20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416, - 20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310, - 20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839, - 20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436, - 20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746, - 20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476, - 20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495, - 20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113, - 20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208, - 20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992, - 20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591, - 21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676, - 21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928, - 21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918, - 21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494, - 21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968, - 21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381, - 21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951, - 21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778, - 21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433, - 21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197, - 21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673, - 21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900, - 21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589, - 21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811, - 21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764, - 21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240, - 21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535, - 21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609, - 21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185, - 21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721, - 21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814, - 21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828, - 21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219, - 21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553, - 21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703, - 21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736, - 21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080, - 21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377, - 21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825, - 21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110, - 21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286, - 21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841, - 21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089, - 21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431, - 21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419, - 21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786, - 21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946, - 21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044, - 21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900, - 21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588, - 21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503, - 21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895, - 21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234, - 21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376, - 21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095, - 21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164, - 21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277, - 21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798, - 21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681, - 21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039, - 21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299, - 21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481, - 21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157, - 21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156, - 21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192, - 21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711, - 21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048, - 21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688, - 21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528, - 21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838, - 21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637, - 21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449, - 21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432, - 21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454, - 21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960, - 21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214, - 21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806, - 21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746, - 21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071, - 21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495, - 21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024, - 21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663, - 21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379, - 21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596, - 21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103, - 22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525, - 22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930, - 22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844, - 22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540, - 22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286, - 22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370, - 22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092, - 22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258, - 22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835, - 22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047, - 22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325, - 22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030, - 22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920, - 22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172, - 22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417, - 22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481, - 22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065, - 22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496, - 22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880, - 22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341, - 22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186, - 22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918, - 22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181, - 22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846, - 22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700, - 22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528, - 22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164, - 22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043, - 22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258, - 22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394, - 22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049, - 22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275, - 22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459, - 22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257, - 22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152, - 22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316, - 22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800, - 22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120, - 22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008, - 22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829, - 22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996, - 22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022, - 22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115, - 22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164, - 22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422, - 22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286, - 22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347, - 22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043, - 22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089, - 22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121, - 22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155, - 22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193, - 22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258, - 22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233, - 22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314, - 22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285, - 22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355, - 22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348, - 22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458, - 22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433, - 22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467, - 22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478, - 22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606, - 22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588, - 22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666, - 22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710, - 22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709, - 22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718, - 22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320, - 22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335, - 22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128, - 22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149, - 22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819, - 22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924, - 23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744, - 23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765, - 23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791, - 23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798, - 23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808, - 23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824, - 23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839, - 23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852, - 23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861, - 23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869, - 23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879, - 23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890, - 23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370, - 23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442, - 23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484, - 23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516, - 23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015, - 23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025, - 23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048, - 23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072, - 23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090, - 23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103, - 23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155, - 23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190, - 23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165, - 23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232, - 23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981, - 23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042, - 23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654, - 23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316, - 23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319, - 23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405, - 23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376, - 23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436, - 23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452, - 23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490, - 23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511, - 23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541, - 23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553, - 23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657, - 23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729, - 23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423, - 23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425, - 23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470, - 23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432, - 23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473, - 23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439, - 23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545, - 23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500, - 23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531, - 23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556, - 23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617, - 23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596, - 23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583, - 23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600, - 23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587, - 23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641, - 23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712, - 23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706, - 23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718, - 23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688, - 23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729, - 23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816, - 23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820, - 23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759, - 23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770, - 23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761, - 23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907, - 23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912, - 23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932, - 23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997, - 23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994, - 23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977, - 23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060, - 23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079, - 23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044, - 24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142, - 24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171, - 24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169, - 24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231, - 24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303, - 24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364, - 24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823, - 24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586, - 24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194, - 24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303, - 24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419, - 24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466, - 24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482, - 24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592, - 24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550, - 24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665, - 24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638, - 24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750, - 24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786, - 24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826, - 24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530, - 24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501, - 24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526, - 24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588, - 24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593, - 24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623, - 24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636, - 24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677, - 24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670, - 24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717, - 24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722, - 24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725, - 24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792, - 24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795, - 24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863, - 24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825, - 24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815, - 24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811, - 24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891, - 24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919, - 24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983, - 24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994, - 24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995, - 24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956, - 24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964, - 24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756, - 24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052, - 24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061, - 24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093, - 24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100, - 24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139, - 24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228, - 24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251, - 24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281, - 24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081, - 24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132, - 24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692, - 24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688, - 24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708, - 24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723, - 24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748, - 24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810, - 24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844, - 24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870, - 24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919, - 24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913, - 24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955, - 24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450, - 24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473, - 24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508, - 24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364, - 24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390, - 24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417, - 24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427, - 24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459, - 25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461, - 25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496, - 25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536, - 25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821, - 25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271, - 25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276, - 25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300, - 25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313, - 25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209, - 25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249, - 25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274, - 25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210, - 25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579, - 25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574, - 25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568, - 25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591, - 25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639, - 25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698, - 25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730, - 25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716, - 25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797, - 25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864, - 25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832, - 25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004, - 25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077, - 25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385, - 25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398, - 25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410, - 25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418, - 25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426, - 25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732, - 25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792, - 25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764, - 25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860, - 25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863, - 25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883, - 25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902, - 25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976, - 25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947, - 25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983, - 25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015, - 25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052, - 25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186, - 25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095, - 25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121, - 25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203, - 25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255, - 25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197, - 25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384, - 25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349, - 25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367, - 25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486, - 25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463, - 25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425, - 25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536, - 25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617, - 25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641, - 25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698, - 25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751, - 25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443, - 25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652, - 25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423, - 25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837, - 25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851, - 25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902, - 25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917, - 25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945, - 25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962, - 25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994, - 25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407, - 25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632, - 25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700, - 25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380, - 25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925, - 25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986, - 26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962, - 26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046, - 26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033, - 26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057, - 26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114, - 26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004, - 26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230, - 26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224, - 26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270, - 26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318, - 26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580, - 26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379, - 26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546, - 26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557, - 26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571, - 26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581, - 26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589, - 26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421, - 26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446, - 26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459, - 26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475, - 26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494, - 26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502, - 26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514, - 26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524, - 26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537, - 26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546, - 26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551, - 26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559, - 26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565, - 26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013, - 26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599, - 26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619, - 26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657, - 26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662, - 26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787, - 26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742, - 26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788, - 26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805, - 26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825, - 26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865, - 26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890, - 26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462, - 26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474, - 26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536, - 26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492, - 26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601, - 26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586, - 26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552, - 26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674, - 26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722, - 26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709, - 26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686, - 26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767, - 26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818, - 26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873, - 26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967, - 26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976, - 26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008, - 26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015, - 26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979, - 26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051, - 26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082, - 26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135, - 26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237, - 26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216, - 26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197, - 26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280, - 26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522, - 26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538, - 26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553, - 26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722, - 26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727, - 26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737, - 27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749, - 27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558, - 27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122, - 27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255, - 27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969, - 27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096, - 27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133, - 27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164, - 27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207, - 27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209, - 27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279, - 27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342, - 27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155, - 27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168, - 27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185, - 27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278, - 27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343, - 27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311, - 27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330, - 27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816, - 27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637, - 27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661, - 27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681, - 27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909, - 27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270, - 27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924, - 27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945, - 27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999, - 27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962, - 27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384, - 27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005, - 27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389, - 27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068, - 27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107, - 27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120, - 27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127, - 27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169, - 27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406, - 27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428, - 27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481, - 27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129, - 27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315, - 27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054, - 27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066, - 27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829, - 27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849, - 27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950, - 27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032, - 27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050, - 27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088, - 27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213, - 27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113, - 27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161, - 27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067, - 27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063, - 27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109, - 27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529, - 27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679, - 27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838, - 27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035, - 27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795, - 27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720, - 27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027, - 27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778, - 27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764, - 27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806, - 27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796, - 27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855, - 27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905, - 27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956, - 28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012, - 28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699, - 28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457, - 28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489, - 28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544, - 28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568, - 28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589, - 28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624, - 28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016, - 28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066, - 28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607, - 28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633, - 28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866, - 28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026, - 28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036, - 28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044, - 28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061, - 28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068, - 28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074, - 28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088, - 28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093, - 28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101, - 28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107, - 28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116, - 28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121, - 28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132, - 28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141, - 28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151, - 28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159, - 28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166, - 28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175, - 28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188, - 28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199, - 28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210, - 28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217, - 28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227, - 28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233, - 28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241, - 28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247, - 28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252, - 28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202, - 28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213, - 28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235, - 28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287, - 28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344, - 28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918, - 28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488, - 28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498, - 28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505, - 28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516, - 28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523, - 28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535, - 28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547, - 28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554, - 28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563, - 28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109, - 28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136, - 28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146, - 28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182, - 28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193, - 28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213, - 28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232, - 28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242, - 28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271, - 28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285, - 28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315, - 28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353, - 28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398, - 28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411, - 28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943, - 28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004, - 29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045, - 29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070, - 29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099, - 29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137, - 29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386, - 29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790, - 29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806, - 29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779, - 29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850, - 29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040, - 29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055, - 29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071, - 29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381, - 29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426, - 29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443, - 29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474, - 29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485, - 29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479, - 29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545, - 29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579, - 29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513, - 29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570, - 29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590, - 29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632, - 29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623, - 29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683, - 29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699, - 29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649, - 29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770, - 29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711, - 29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741, - 29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769, - 29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784, - 29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826, - 29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566, - 29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482, - 29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509, - 29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544, - 29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520, - 29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518, - 29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564, - 29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586, - 29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655, - 29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621, - 29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668, - 29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706, - 29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742, - 29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775, - 29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808, - 29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260, - 29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325, - 29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339, - 29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353, - 29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384, - 29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039, - 29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687, - 29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889, - 29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922, - 29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948, - 29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976, - 29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725, - 29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750, - 29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174, - 29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211, - 29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199, - 29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200, - 29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217, - 29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246, - 29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253, - 29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283, - 30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301, - 30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280, - 30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277, - 30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310, - 30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303, - 30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344, - 30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361, - 30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396, - 30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416, - 30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425, - 30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426, - 30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468, - 30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508, - 30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973, - 30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294, - 30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311, - 30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643, - 30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671, - 30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718, - 30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839, - 30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702, - 30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589, - 30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518, - 30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834, - 30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066, - 30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267, - 30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082, - 30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094, - 30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099, - 30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105, - 30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113, - 30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118, - 30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125, - 30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138, - 30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143, - 30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151, - 30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159, - 30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802, - 30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834, - 30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536, - 30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616, - 30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633, - 30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752, - 30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214, - 30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654, - 30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673, - 30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715, - 30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583, - 30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605, - 30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672, - 30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677, - 30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751, - 30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772, - 0 => 0 ); +13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744, +13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831, +13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021, +13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815, +13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364, +13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504, +13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986, +13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607, +13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648, +13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571, +13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337, +13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162, +13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810, +13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943, +13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850, +13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913, +13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789, +13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874, +13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995, +13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419, +13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828, +13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140, +13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923, +13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169, +13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171, +13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140, +13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955, +13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285, +13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966, +13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129, +13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377, +13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443, +13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548, +13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423, +13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783, +13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011, +13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932, +13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265, +13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532, +13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072, +13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856, +13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008, +13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583, +13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993, +13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300, +13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853, +13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025, +13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746, +13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026, +13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923, +13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497, +13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563, +13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581, +13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922, +13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701, +13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534, +13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544, +13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045, +13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810, +13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346, +13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558, +13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769, +13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943, +13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799, +13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108, +14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240, +14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281, +14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718, +14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453, +14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277, +14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938, +14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775, +14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857, +14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536, +14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452, +14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439, +14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859, +14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016, +14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155, +14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911, +14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315, +14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413, +14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679, +14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014, +14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995, +14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023, +14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212, +14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613, +14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127, +14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538, +14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913, +14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178, +14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925, +14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195, +14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923, +14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705, +14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957, +14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733, +14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011, +14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684, +14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010, +14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789, +14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831, +14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685, +14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467, +14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129, +14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503, +14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815, +14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272, +14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476, +14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925, +14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916, +14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054, +14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448, +14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592, +14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191, +14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789, +14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740, +14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330, +14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829, +14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065, +14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023, +14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219, +14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085, +14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752, +14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717, +14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477, +14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627, +14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009, +14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680, +14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418, +14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203, +14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657, +14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756, +14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720, +14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946, +14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399, +14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518, +14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774, +14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946, +14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252, +15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719, +15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010, +15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576, +15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707, +15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796, +15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462, +15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970, +15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822, +15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854, +15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674, +15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935, +15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229, +15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826, +15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746, +15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249, +15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669, +15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522, +15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637, +15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749, +15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513, +15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598, +15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363, +15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034, +15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395, +15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982, +15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082, +15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426, +15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478, +15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002, +15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550, +15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362, +15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860, +15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575, +15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315, +15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943, +15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145, +15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581, +15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293, +15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558, +15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728, +15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477, +15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014, +15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047, +15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389, +15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564, +15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735, +15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509, +15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130, +15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463, +15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299, +15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028, +15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626, +15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170, +15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165, +15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105, +15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170, +15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230, +15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923, +15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048, +15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452, +15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928, +15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416, +15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061, +15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276, +15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816, +15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545, +15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030, +15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040, +15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465, +15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424, +15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367, +15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496, +15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776, +15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891, +15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994, +16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345, +16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975, +16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350, +16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968, +16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771, +16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499, +16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185, +16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811, +16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827, +16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354, +16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475, +16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391, +16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840, +16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359, +16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454, +16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719, +16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420, +16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745, +16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372, +16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193, +16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895, +16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713, +16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639, +16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572, +16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518, +16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436, +16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438, +16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013, +16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048, +16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047, +16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867, +16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400, +16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432, +16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324, +16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519, +16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782, +16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432, +16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582, +16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852, +16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604, +16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142, +16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937, +16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742, +16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769, +16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525, +16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243, +16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872, +16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967, +16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107, +16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618, +16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278, +16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725, +16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705, +16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016, +16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857, +16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534, +16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044, +16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446, +16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523, +16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860, +16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510, +16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540, +16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653, +16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459, +16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371, +16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504, +16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177, +16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746, +16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585, +16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476, +17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434, +17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475, +17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033, +17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067, +17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426, +17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725, +17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683, +17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125, +17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522, +17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809, +17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654, +17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376, +17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308, +17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391, +17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855, +17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269, +17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825, +17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193, +17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551, +17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217, +17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279, +17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126, +17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629, +17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169, +17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273, +17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819, +17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279, +17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982, +17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215, +17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287, +17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048, +17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035, +17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007, +17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700, +17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869, +17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522, +17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311, +17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288, +17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565, +17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423, +17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221, +17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957, +17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197, +17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892, +17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899, +17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062, +17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485, +17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812, +17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597, +17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472, +17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424, +17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467, +17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982, +17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957, +17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521, +17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329, +17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256, +17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842, +17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527, +17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713, +17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607, +17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305, +17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687, +17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418, +17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340, +17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050, +17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973, +17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900, +17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843, +17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166, +17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484, +18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889, +18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646, +18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422, +18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855, +18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784, +18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215, +18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865, +18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323, +18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688, +18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085, +18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878, +18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069, +18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545, +18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595, +18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378, +18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708, +18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039, +18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431, +18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623, +18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206, +18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165, +18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682, +18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228, +18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198, +18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041, +18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845, +18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527, +18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094, +18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079, +18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154, +18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570, +18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063, +18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982, +18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756, +18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200, +18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161, +18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748, +18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173, +18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635, +18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466, +18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593, +18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785, +18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719, +18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384, +18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922, +18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187, +18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705, +18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195, +18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862, +18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049, +18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022, +18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441, +18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378, +18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892, +18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260, +18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578, +18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903, +18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736, +18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503, +18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556, +18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775, +18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145, +18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457, +18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183, +18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319, +18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988, +18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045, +18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313, +18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135, +18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690, +19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335, +19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107, +19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159, +19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365, +19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643, +19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163, +19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806, +19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530, +19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460, +19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174, +19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329, +19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646, +19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101, +19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465, +19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928, +19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684, +19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561, +19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308, +19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031, +19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496, +19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987, +19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051, +19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865, +19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368, +19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439, +19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609, +19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240, +19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543, +19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319, +19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439, +19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553, +19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604, +19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549, +19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492, +19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826, +19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138, +19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192, +19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631, +19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845, +19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848, +19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538, +19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059, +19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867, +19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305, +19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799, +19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064, +19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159, +19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825, +19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684, +19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834, +19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086, +19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311, +19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351, +19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516, +19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413, +19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237, +19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361, +19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648, +19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242, +19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114, +19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302, +19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534, +19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822, +19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043, +19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916, +19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024, +19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202, +19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975, +19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505, +19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536, +19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361, +20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807, +20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479, +20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614, +20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031, +20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205, +20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239, +20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441, +20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985, +20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065, +20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569, +20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044, +20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436, +20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494, +20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237, +20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212, +20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823, +20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802, +20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177, +20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713, +20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911, +20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989, +20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115, +20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454, +20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758, +20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979, +20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184, +20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688, +20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046, +20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616, +20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673, +20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456, +20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140, +20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814, +20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055, +20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831, +20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179, +20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195, +20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880, +20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463, +20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658, +20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889, +20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844, +20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455, +20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571, +20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125, +20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411, +20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184, +20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982, +20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066, +20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957, +20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687, +20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035, +20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465, +20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110, +20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927, +20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873, +20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203, +20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195, +20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547, +20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757, +20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276, +20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469, +20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079, +20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937, +20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416, +20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310, +20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839, +20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436, +20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746, +20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476, +20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495, +20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113, +20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208, +20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992, +20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591, +21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676, +21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928, +21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918, +21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494, +21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968, +21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381, +21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951, +21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778, +21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433, +21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197, +21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673, +21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900, +21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589, +21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811, +21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764, +21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240, +21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535, +21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609, +21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185, +21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721, +21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814, +21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828, +21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219, +21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553, +21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703, +21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736, +21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080, +21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377, +21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825, +21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110, +21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286, +21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841, +21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089, +21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431, +21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419, +21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786, +21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946, +21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044, +21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900, +21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588, +21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503, +21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895, +21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234, +21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376, +21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095, +21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164, +21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277, +21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798, +21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681, +21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039, +21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299, +21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481, +21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157, +21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156, +21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192, +21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711, +21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048, +21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688, +21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528, +21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838, +21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637, +21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449, +21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432, +21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454, +21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960, +21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214, +21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806, +21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746, +21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071, +21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495, +21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024, +21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663, +21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379, +21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596, +21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103, +22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525, +22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930, +22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844, +22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540, +22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286, +22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370, +22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092, +22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258, +22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835, +22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047, +22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325, +22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030, +22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920, +22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172, +22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417, +22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481, +22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065, +22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496, +22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880, +22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341, +22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186, +22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918, +22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181, +22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846, +22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700, +22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528, +22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164, +22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043, +22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258, +22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394, +22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049, +22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275, +22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459, +22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257, +22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152, +22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316, +22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800, +22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120, +22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008, +22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829, +22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996, +22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022, +22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115, +22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164, +22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422, +22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286, +22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347, +22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043, +22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089, +22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121, +22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155, +22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193, +22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258, +22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233, +22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314, +22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285, +22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355, +22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348, +22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458, +22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433, +22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467, +22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478, +22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606, +22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588, +22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666, +22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710, +22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709, +22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718, +22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320, +22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335, +22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128, +22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149, +22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819, +22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924, +23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744, +23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765, +23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791, +23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798, +23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808, +23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824, +23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839, +23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852, +23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861, +23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869, +23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879, +23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890, +23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370, +23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442, +23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484, +23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516, +23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015, +23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025, +23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048, +23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072, +23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090, +23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103, +23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155, +23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190, +23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165, +23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232, +23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981, +23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042, +23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654, +23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316, +23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319, +23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405, +23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376, +23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436, +23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452, +23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490, +23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511, +23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541, +23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553, +23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657, +23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729, +23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423, +23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425, +23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470, +23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432, +23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473, +23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439, +23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545, +23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500, +23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531, +23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556, +23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617, +23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596, +23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583, +23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600, +23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587, +23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641, +23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712, +23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706, +23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718, +23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688, +23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729, +23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816, +23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820, +23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759, +23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770, +23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761, +23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907, +23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912, +23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932, +23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997, +23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994, +23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977, +23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060, +23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079, +23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044, +24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142, +24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171, +24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169, +24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231, +24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303, +24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364, +24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823, +24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586, +24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194, +24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303, +24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419, +24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466, +24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482, +24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592, +24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550, +24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665, +24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638, +24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750, +24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786, +24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826, +24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530, +24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501, +24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526, +24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588, +24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593, +24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623, +24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636, +24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677, +24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670, +24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717, +24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722, +24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725, +24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792, +24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795, +24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863, +24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825, +24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815, +24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811, +24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891, +24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919, +24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983, +24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994, +24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995, +24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956, +24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964, +24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756, +24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052, +24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061, +24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093, +24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100, +24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139, +24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228, +24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251, +24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281, +24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081, +24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132, +24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692, +24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688, +24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708, +24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723, +24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748, +24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810, +24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844, +24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870, +24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919, +24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913, +24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955, +24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450, +24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473, +24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508, +24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364, +24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390, +24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417, +24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427, +24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459, +25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461, +25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496, +25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536, +25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821, +25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271, +25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276, +25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300, +25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313, +25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209, +25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249, +25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274, +25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210, +25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579, +25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574, +25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568, +25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591, +25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639, +25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698, +25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730, +25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716, +25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797, +25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864, +25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832, +25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004, +25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077, +25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385, +25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398, +25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410, +25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418, +25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426, +25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732, +25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792, +25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764, +25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860, +25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863, +25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883, +25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902, +25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976, +25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947, +25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983, +25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015, +25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052, +25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186, +25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095, +25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121, +25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203, +25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255, +25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197, +25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384, +25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349, +25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367, +25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486, +25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463, +25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425, +25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536, +25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617, +25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641, +25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698, +25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751, +25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443, +25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652, +25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423, +25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837, +25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851, +25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902, +25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917, +25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945, +25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962, +25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994, +25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407, +25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632, +25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700, +25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380, +25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925, +25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986, +26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962, +26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046, +26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033, +26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057, +26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114, +26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004, +26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230, +26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224, +26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270, +26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318, +26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580, +26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379, +26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546, +26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557, +26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571, +26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581, +26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589, +26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421, +26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446, +26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459, +26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475, +26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494, +26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502, +26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514, +26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524, +26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537, +26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546, +26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551, +26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559, +26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565, +26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013, +26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599, +26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619, +26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657, +26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662, +26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787, +26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742, +26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788, +26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805, +26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825, +26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865, +26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890, +26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462, +26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474, +26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536, +26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492, +26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601, +26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586, +26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552, +26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674, +26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722, +26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709, +26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686, +26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767, +26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818, +26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873, +26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967, +26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976, +26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008, +26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015, +26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979, +26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051, +26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082, +26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135, +26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237, +26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216, +26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197, +26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280, +26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522, +26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538, +26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553, +26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722, +26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727, +26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737, +27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749, +27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558, +27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122, +27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255, +27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969, +27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096, +27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133, +27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164, +27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207, +27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209, +27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279, +27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342, +27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155, +27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168, +27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185, +27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278, +27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343, +27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311, +27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330, +27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816, +27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637, +27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661, +27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681, +27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909, +27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270, +27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924, +27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945, +27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999, +27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962, +27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384, +27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005, +27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389, +27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068, +27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107, +27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120, +27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127, +27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169, +27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406, +27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428, +27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481, +27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129, +27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315, +27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054, +27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066, +27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829, +27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849, +27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950, +27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032, +27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050, +27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088, +27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213, +27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113, +27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161, +27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067, +27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063, +27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109, +27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529, +27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679, +27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838, +27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035, +27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795, +27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720, +27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027, +27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778, +27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764, +27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806, +27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796, +27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855, +27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905, +27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956, +28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012, +28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699, +28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457, +28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489, +28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544, +28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568, +28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589, +28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624, +28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016, +28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066, +28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607, +28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633, +28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866, +28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026, +28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036, +28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044, +28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061, +28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068, +28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074, +28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088, +28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093, +28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101, +28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107, +28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116, +28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121, +28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132, +28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141, +28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151, +28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159, +28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166, +28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175, +28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188, +28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199, +28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210, +28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217, +28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227, +28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233, +28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241, +28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247, +28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252, +28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202, +28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213, +28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235, +28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287, +28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344, +28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918, +28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488, +28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498, +28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505, +28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516, +28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523, +28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535, +28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547, +28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554, +28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563, +28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109, +28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136, +28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146, +28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182, +28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193, +28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213, +28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232, +28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242, +28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271, +28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285, +28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315, +28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353, +28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398, +28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411, +28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943, +28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004, +29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045, +29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070, +29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099, +29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137, +29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386, +29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790, +29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806, +29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779, +29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850, +29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040, +29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055, +29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071, +29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381, +29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426, +29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443, +29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474, +29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485, +29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479, +29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545, +29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579, +29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513, +29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570, +29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590, +29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632, +29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623, +29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683, +29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699, +29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649, +29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770, +29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711, +29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741, +29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769, +29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784, +29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826, +29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566, +29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482, +29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509, +29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544, +29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520, +29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518, +29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564, +29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586, +29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655, +29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621, +29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668, +29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706, +29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742, +29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775, +29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808, +29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260, +29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325, +29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339, +29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353, +29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384, +29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039, +29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687, +29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889, +29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922, +29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948, +29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976, +29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725, +29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750, +29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174, +29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211, +29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199, +29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200, +29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217, +29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246, +29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253, +29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283, +30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301, +30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280, +30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277, +30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310, +30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303, +30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344, +30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361, +30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396, +30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416, +30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425, +30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426, +30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468, +30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508, +30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973, +30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294, +30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311, +30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643, +30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671, +30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718, +30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839, +30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702, +30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589, +30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518, +30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834, +30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066, +30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267, +30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082, +30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094, +30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099, +30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105, +30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113, +30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118, +30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125, +30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138, +30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143, +30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151, +30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159, +30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802, +30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834, +30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536, +30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616, +30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633, +30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752, +30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214, +30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654, +30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673, +30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715, +30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583, +30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605, +30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672, +30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677, +30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751, +30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772, +0 => 0 ); public function gb2utf8($gb) { @@ -1526,7 +1526,7 @@ class GB2312toUTF8 } return $utf8; } - + public function u2utf8($c) { $str=''; diff --git a/onyx2/include/jpgraph/jpgraph_gradient.php b/onyx2/include/jpgraph/jpgraph_gradient.php index 4468f76..7afd4a2 100644 --- a/onyx2/include/jpgraph/jpgraph_gradient.php +++ b/onyx2/include/jpgraph/jpgraph_gradient.php @@ -1,28 +1,28 @@ img = $img; } @@ -48,287 +48,286 @@ class Gradient // PUBLIC METHODS // Produce a gradient filled rectangle with a smooth transition between // two colors. - // ($xl,$yt) Top left corner - // ($xr,$yb) Bottom right - // $from_color Starting color in gradient - // $to_color End color in the gradient - // $style Which way is the gradient oriented? + // ($xl,$yt) Top left corner + // ($xr,$yb) Bottom right + // $from_color Starting color in gradient + // $to_color End color in the gradient + // $style Which way is the gradient oriented? public function FilledRectangle($xl, $yt, $xr, $yb, $from_color, $to_color, $style=1) { - $this->img->SetLineWeight(1); switch ($style) { - case GRAD_VER: - $steps = ceil(abs($xr-$xl)+1); - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); - for ($i=0, $x=$xl; $i < $steps; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yt, $x, $yb); - $x += $delta; - } - break; - - case GRAD_HOR: - $steps = ceil(abs($yb-$yt)+1); - $delta = $yb >= $yt ? 1 : -1; - $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); - for ($i=0,$y=$yt; $i < $steps; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl, $y, $xr, $y); - $y += $delta; - } - break; - - case GRAD_MIDHOR: - $steps = ceil(abs($yb-$yt)/2); - $delta = $yb >= $yt ? 1 : -1; - $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); - for ($y=$yt, $i=0; $i < $steps; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl, $y, $xr, $y); - $y += $delta; - } - --$i; - if (abs($yb-$yt) % 2 == 1) { - --$steps; - } - for ($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl, $y, $xr, $y); - $y += $delta; - } - $this->img->Line($xl, $y, $xr, $y); - break; - - case GRAD_MIDVER: - $steps = ceil(abs($xr-$xl)/2); - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); - for ($x=$xl, $i=0; $i < $steps; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - --$i; - if (abs($xr-$xl) % 2 == 1) { - --$steps; - } - for ($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - $this->img->Line($x, $yb, $x, $yt); - break; - - case GRAD_WIDE_MIDVER: - $diff = ceil(abs($xr-$xl)); - $steps = floor(abs($diff)/3); - $firststep = $diff - 2*$steps ; - $delta = $xr >= $xl ? 1 : -1; - $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors); - for ($x=$xl, $i=0; $i < $firststep; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - --$i; - $this->img->current_color = $colors[$i]; - for ($j=0; $j< $steps; ++$j) { - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - - for ($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - break; - - case GRAD_WIDE_MIDHOR: - $diff = ceil(abs($yb-$yt)); - $steps = floor(abs($diff)/3); - $firststep = $diff - 2*$steps ; - $delta = $yb >= $yt? 1 : -1; - $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors); - for ($y=$yt, $i=0; $i < $firststep; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl, $y, $xr, $y); - $y += $delta; - } - --$i; - $this->img->current_color = $colors[$i]; - for ($j=0; $j < $steps; ++$j) { - $this->img->Line($xl, $y, $xr, $y); - $y += $delta; - } - for ($j=0; $j < $steps; ++$j, --$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($xl, $y, $xr, $y); - $y += $delta; - } - break; - - case GRAD_LEFT_REFLECTION: - $steps1 = ceil(0.3*abs($xr-$xl)); - $delta = $xr>=$xl ? 1 : -1; - - $from_color = $this->img->rgb->Color($from_color); - $adj = 1.4; - $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2])))); - $from_color2 = array(min(255, $from_color[0]+$m), - min(255, $from_color[1]+$m), min(255, $from_color[2]+$m)); - - $this->GetColArray($from_color2, $to_color, $steps1, $colors, $this->numcolors); - $n = count($colors); - for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - $steps2 = max(1, ceil(0.08*abs($xr-$xl))); - $this->img->SetColor($to_color); - for ($j=0; $j< $steps2; ++$j) { - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - $steps = abs($xr-$xl)-$steps1-$steps2; - $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors); - $n = count($colors); - for ($i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - break; - - case GRAD_RIGHT_REFLECTION: - $steps1 = ceil(0.7*abs($xr-$xl)); - $delta = $xr>=$xl ? 1 : -1; - - $this->GetColArray($from_color, $to_color, $steps1, $colors, $this->numcolors); - $n = count($colors); - for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - $steps2 = max(1, ceil(0.08*abs($xr-$xl))); - $this->img->SetColor($to_color); - for ($j=0; $j< $steps2; ++$j) { - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - - $from_color = $this->img->rgb->Color($from_color); - $adj = 1.4; - $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2])))); - $from_color = array(min(255, $from_color[0]+$m), - min(255, $from_color[1]+$m), min(255, $from_color[2]+$m)); - - $steps = abs($xr-$xl)-$steps1-$steps2; - $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors); - $n = count($colors); - for ($i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - break; - - case GRAD_CENTER: - $steps = ceil(min(($yb-$yt)+1, ($xr-$xl)+1)/2); - $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); - $dx = ($xr-$xl)/2; - $dy = ($yb-$yt)/2; - $x=$xl;$y=$yt;$x2=$xr;$y2=$yb; - $n = count($colors); - for ($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Rectangle($x, $y, $x2, $y2); - } - $this->img->Line($x, $y, $x2, $y2); - break; - - case GRAD_RAISED_PANEL: - // right to left - $steps1 = $xr-$xl; - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($to_color, $from_color, $steps1, $colors, $this->numcolors); - $n = count($colors); - for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - - // left to right - $xr -= 3; - $xl += 3; - $yb -= 3; - $yt += 3; - $steps2 = $xr-$xl; - $delta = $xr>=$xl ? 1 : -1; - for ($x=$xl, $j=$steps2; $j >= 0; --$j) { - $this->img->current_color = $colors[$j]; - $this->img->Line($x, $yb, $x, $yt); - $x += $delta; - } - break; - - case GRAD_DIAGONAL: - // use the longer dimension to determine the required number of steps. - // first loop draws from one corner to the mid-diagonal and the second - // loop draws from the mid-diagonal to the opposing corner. - if ($xr-$xl > $yb - $yt) { - // width is greater than height -> use x-dimension for steps - $steps = $xr-$xl; - $delta = $xr>=$xl ? 1 : -1; - $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors); - $n = count($colors); - - for ($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $y = $yt+($i/$steps)*($yb-$yt)*$delta; - $this->img->Line($x, $yt, $xl, $y); - $x += $delta; - } - - for ($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$steps+$i]; - $y = $yt+($i/$steps)*($yb-$yt)*$delta; - $this->img->Line($x, $yb, $xr, $y); - $x += $delta; - } - } else { - // height is greater than width -> use y-dimension for steps - $steps = $yb-$yt; - $delta = $yb>=$yt ? 1 : -1; - $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors); - $n = count($colors); - - for ($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$i]; - $x = $xl+($i/$steps)*($xr-$xl)*$delta; - $this->img->Line($x, $yt, $xl, $y); - $y += $delta; - } - - for ($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) { - $this->img->current_color = $colors[$steps+$i]; - $x = $xl+($i/$steps)*($xr-$xl)*$delta; - $this->img->Line($x, $yb, $xr, $y); - $x += $delta; - } - } - break; - - default: - JpGraphError::RaiseL(7001, $style); - //("Unknown gradient style (=$style)."); - break; + case GRAD_VER: + $steps = ceil(abs($xr-$xl)); + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); + for ($i=0, $x=$xl; $i < $steps; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yt, $x, $yb); + $x += $delta; } + break; + + case GRAD_HOR: + $steps = ceil(abs($yb-$yt)); + $delta = $yb>=$yt ? 1 : -1; + $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); + for ($i=0,$y=$yt; $i < $steps; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl, $y, $xr, $y); + $y += $delta; + } + break; + + case GRAD_MIDHOR: + $steps = ceil(abs($yb-$yt)/2); + $delta = $yb >= $yt ? 1 : -1; + $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); + for ($y=$yt, $i=0; $i < $steps; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl, $y, $xr, $y); + $y += $delta; + } + --$i; + if (abs($yb-$yt) % 2 == 1) { + --$steps; + } + for ($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl, $y, $xr, $y); + $y += $delta; + } + $this->img->Line($xl, $y, $xr, $y); + break; + + case GRAD_MIDVER: + $steps = ceil(abs($xr-$xl)/2); + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); + for ($x=$xl, $i=0; $i < $steps; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + --$i; + if (abs($xr-$xl) % 2 == 1) { + --$steps; + } + for ($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + $this->img->Line($x, $yb, $x, $yt); + break; + + case GRAD_WIDE_MIDVER: + $diff = ceil(abs($xr-$xl)); + $steps = floor(abs($diff)/3); + $firststep = $diff - 2*$steps ; + $delta = $xr >= $xl ? 1 : -1; + $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors); + for ($x=$xl, $i=0; $i < $firststep; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + --$i; + $this->img->current_color = $colors[$i]; + for ($j=0; $j< $steps; ++$j) { + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + + for ($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + break; + + case GRAD_WIDE_MIDHOR: + $diff = ceil(abs($yb-$yt)); + $steps = floor(abs($diff)/3); + $firststep = $diff - 2*$steps ; + $delta = $yb >= $yt? 1 : -1; + $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors); + for ($y=$yt, $i=0; $i < $firststep; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl, $y, $xr, $y); + $y += $delta; + } + --$i; + $this->img->current_color = $colors[$i]; + for ($j=0; $j < $steps; ++$j) { + $this->img->Line($xl, $y, $xr, $y); + $y += $delta; + } + for ($j=0; $j < $steps; ++$j, --$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($xl, $y, $xr, $y); + $y += $delta; + } + break; + + case GRAD_LEFT_REFLECTION: + $steps1 = ceil(0.3*abs($xr-$xl)); + $delta = $xr>=$xl ? 1 : -1; + + $from_color = $this->img->rgb->Color($from_color); + $adj = 1.4; + $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2])))); + $from_color2 = array(min(255, $from_color[0]+$m), + min(255, $from_color[1]+$m), min(255, $from_color[2]+$m)); + + $this->GetColArray($from_color2, $to_color, $steps1, $colors, $this->numcolors); + $n = count($colors); + for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + $steps2 = max(1, ceil(0.08*abs($xr-$xl))); + $this->img->SetColor($to_color); + for ($j=0; $j< $steps2; ++$j) { + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + $steps = abs($xr-$xl)-$steps1-$steps2; + $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors); + $n = count($colors); + for ($i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + break; + + case GRAD_RIGHT_REFLECTION: + $steps1 = ceil(0.7*abs($xr-$xl)); + $delta = $xr>=$xl ? 1 : -1; + + $this->GetColArray($from_color, $to_color, $steps1, $colors, $this->numcolors); + $n = count($colors); + for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + $steps2 = max(1, ceil(0.08*abs($xr-$xl))); + $this->img->SetColor($to_color); + for ($j=0; $j< $steps2; ++$j) { + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + + $from_color = $this->img->rgb->Color($from_color); + $adj = 1.4; + $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2])))); + $from_color = array(min(255, $from_color[0]+$m), + min(255, $from_color[1]+$m), min(255, $from_color[2]+$m)); + + $steps = abs($xr-$xl)-$steps1-$steps2; + $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors); + $n = count($colors); + for ($i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + break; + + case GRAD_CENTER: + $steps = ceil(min(($yb-$yt)+1, ($xr-$xl)+1)/2); + $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors); + $dx = ($xr-$xl)/2; + $dy = ($yb-$yt)/2; + $x=$xl;$y=$yt;$x2=$xr;$y2=$yb; + $n = count($colors); + for ($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Rectangle($x, $y, $x2, $y2); + } + $this->img->Line($x, $y, $x2, $y2); + break; + + case GRAD_RAISED_PANEL: + // right to left + $steps1 = $xr-$xl; + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($to_color, $from_color, $steps1, $colors, $this->numcolors); + $n = count($colors); + for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + + // left to right + $xr -= 3; + $xl += 3; + $yb -= 3; + $yt += 3; + $steps2 = $xr-$xl; + $delta = $xr>=$xl ? 1 : -1; + for ($x=$xl, $j=$steps2; $j >= 0; --$j) { + $this->img->current_color = $colors[$j]; + $this->img->Line($x, $yb, $x, $yt); + $x += $delta; + } + break; + + case GRAD_DIAGONAL: + // use the longer dimension to determine the required number of steps. + // first loop draws from one corner to the mid-diagonal and the second + // loop draws from the mid-diagonal to the opposing corner. + if ($xr-$xl > $yb - $yt) { + // width is greater than height -> use x-dimension for steps + $steps = $xr-$xl; + $delta = $xr>=$xl ? 1 : -1; + $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors); + $n = count($colors); + + for ($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $y = $yt+($i/$steps)*($yb-$yt)*$delta; + $this->img->Line($x, $yt, $xl, $y); + $x += $delta; + } + + for ($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$steps+$i]; + $y = $yt+($i/$steps)*($yb-$yt)*$delta; + $this->img->Line($x, $yb, $xr, $y); + $x += $delta; + } + } else { + // height is greater than width -> use y-dimension for steps + $steps = $yb-$yt; + $delta = $yb>=$yt ? 1 : -1; + $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors); + $n = count($colors); + + for ($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$i]; + $x = $xl+($i/$steps)*($xr-$xl)*$delta; + $this->img->Line($x, $yt, $xl, $y); + $y += $delta; + } + + for ($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) { + $this->img->current_color = $colors[$steps+$i]; + $x = $xl+($i/$steps)*($xr-$xl)*$delta; + $this->img->Line($x, $yb, $xr, $y); + $x += $delta; + } + } + break; + + default: + JpGraphError::RaiseL(7001, $style); +//("Unknown gradient style (=$style)."); + break; + } } // Fill a special case of a polygon with a flat bottom @@ -341,7 +340,7 @@ class Gradient if (count($pts) == 0) { return; } - + $maxy=$pts[1]; $miny=$pts[1]; $n = count($pts) ; @@ -351,7 +350,7 @@ class Gradient $miny = min($miny, $y); $maxy = max($maxy, $y); } - + $colors = array(); $this->GetColArray($from_color, $to_color, abs($maxy-$miny)+1, $colors, $this->numcolors); for ($i=$miny, $idx=0; $i <= $maxy; ++$i) { @@ -363,14 +362,14 @@ class Gradient while ($idx < $n-1) { $p1 = array(round($pts[$idx*2]),round($pts[$idx*2+1])); $p2 = array(round($pts[++$idx*2]),round($pts[$idx*2+1])); - + // Find the largest rectangle we can fill $y = max($p1[1], $p2[1]) ; for ($yy=$maxy; $yy > $y; --$yy) { $this->img->current_color = $colmap[$yy]; $this->img->Line($p1[0], $yy, $p2[0]-1, $yy); } - + if ($p1[1] == $p2[1]) { continue; } @@ -407,23 +406,22 @@ class Gradient if ($arr_size==0) { return; } - // If color is given as text get it's corresponding r,g,b values $from_color = $this->img->rgb->Color($from_color); $to_color = $this->img->rgb->Color($to_color); - + $rdelta=($to_color[0]-$from_color[0])/$numcols; $gdelta=($to_color[1]-$from_color[1])/$numcols; $bdelta=($to_color[2]-$from_color[2])/$numcols; - $colorsperstep = $numcols/$arr_size; - $prevcolnum = -1; - $from_alpha = floatval($from_color[3]); - $to_alpha = floatval($to_color[3]); + $colorsperstep = $numcols/$arr_size; + $prevcolnum = -1; + $from_alpha = $from_color[3]; + $to_alpha = $to_color[3]; $adelta = ($to_alpha - $from_alpha) / $numcols ; for ($i=0; $i < $arr_size; ++$i) { $colnum = floor($colorsperstep*$i); if ($colnum == $prevcolnum) { - $colors[$i] = $colidx; + $colors[$i] = $colidx; } else { $r = floor($from_color[0] + $colnum*$rdelta); $g = floor($from_color[1] + $colnum*$gdelta); diff --git a/onyx2/include/jpgraph/jpgraph_iconplot.php b/onyx2/include/jpgraph/jpgraph_iconplot.php index 8413741..4b66c21 100644 --- a/onyx2/include/jpgraph/jpgraph_iconplot.php +++ b/onyx2/include/jpgraph/jpgraph_iconplot.php @@ -1,11 +1,11 @@ iFile = $aFile; $this->iX=$aX; @@ -95,7 +95,7 @@ class IconPlot $this->iHorAnchor=$aXAnchor; $this->iVertAnchor=$aYAnchor; } - + public function PreStrokeAdjust($aGraph) { // Nothing to do ... @@ -143,15 +143,15 @@ class IconPlot return true; } - public function Stroke($aImg, $axscale=null, $ayscale=null) + public function Stroke($aImg, $axscale, $ayscale) { $this->StrokeWithScale($aImg, $axscale, $ayscale); } public function StrokeWithScale($aImg, $axscale, $ayscale) { - if ($this->iScalePosX === null || $this->iScalePosY === null || - $axscale === null || $ayscale === null) { + if ($this->iScalePosX === null || + $this->iScalePosY === null) { $this->_Stroke($aImg); } else { $this->_Stroke( @@ -188,7 +188,7 @@ class IconPlot $iconw = imagesx($gdimg); $iconh = imagesy($gdimg); - + if ($aReturnWidthHeight) { return array(round($iconw*$this->iScale),round($iconh*$this->iScale)); } diff --git a/onyx2/include/jpgraph/jpgraph_imgtrans.php b/onyx2/include/jpgraph/jpgraph_imgtrans.php index ced8746..910aa82 100644 --- a/onyx2/include/jpgraph/jpgraph_imgtrans.php +++ b/onyx2/include/jpgraph/jpgraph_imgtrans.php @@ -1,11 +1,11 @@ gdImg = $aGdImg; @@ -30,7 +30,7 @@ class ImgTrans { - // Parameter check + // Parameter check if ($aHorizonPos < 0 || $aHorizonPos > 1.0) { JpGraphError::RaiseL(9001); //("Value for image transformation out of bounds.\nVanishing point on horizon must be specified as a value between 0 and 1."); @@ -46,7 +46,7 @@ class ImgTrans } else { $hh = $h; } - + $newgdh = imagecreatetruecolor($ww, $hh); $crgb = new RGB($newgdh); $fillColor = $crgb->Allocate($aFillColor); @@ -58,7 +58,7 @@ class ImgTrans } $mid = round($w * $aHorizonPos); - + $last=$h; for ($y=0; $y < $h; ++$y) { $yp = $h-$y-1; @@ -127,7 +127,7 @@ class ImgTrans } else { $ww = $w; } - + $newgdh = imagecreatetruecolor($ww, $hh); $crgb = new RGB($newgdh); $fillColor = $crgb->Allocate($aFillColor); diff --git a/onyx2/include/jpgraph/jpgraph_led.php b/onyx2/include/jpgraph/jpgraph_led.php index ac68d04..01e77cf 100644 --- a/onyx2/include/jpgraph/jpgraph_led.php +++ b/onyx2/include/jpgraph/jpgraph_led.php @@ -1,16 +1,53 @@ 'L', Cyrilic, other symbols and special symbols for +// simulation some latin and cyrilic chars. +// Added: New Color schemas. +// Deleted: Some minor bugs (StrokeNumber first parameter may be eq empty string, +// false or null - added check see line 294; +// change color schema check for easy maintenance: 291; +// change check on key exist in chars array: moved from StrokeNumber +// function to _GetLED: 251; +// //======================================================================== -// Constants for color schema +// Samples for troubled chars: "ԡ \r \r | \r >\n< W\r" +// W + +//---------------------------------------------------------------------------- +// Each character is encoded line by line with the "On"-LEDs corresponding to +// a '1' in the bianry mask of 4 bits. +// +// 4-bit mask: +// +// 0 ____ +// 1 ___x +// 2 __x_ +// 3 __xx +// 4 _x__ +// 5 _x_x +// 6 _xx_ +// 7 _xxx +// 8 x___ +// 9 x__x +// 10 x_x_ +// 11 x_xx +// 12 xx__ +// 13 xx_x +// 14 xxx_ +// 15 xxxx +//---------------------------------------------------------------------------- + +// Constants for color schema. See definition of iColorSchema below DEFINE('LEDC_RED', 0); DEFINE('LEDC_GREEN', 1); DEFINE('LEDC_BLUE', 2); @@ -27,13 +64,7 @@ DEFINE('LEDC_TEAL', 12); DEFINE('LEDC_STEELBLUE', 13); DEFINE('LEDC_NAVY', 14); DEFINE('LEDC_INVERTGRAY', 15); - -// Check that mb_strlen() is available -if (! function_exists('mb_strlen')) { - JpGraphError::RaiseL(25500); - //'Multibyte strings must be enabled in the PHP installation in order to run the LED module - // so that the function mb_strlen() is available. See PHP documentation for more information.' -} +// ! It correlate with two-dimensional array $iColorSchema //======================================================================== // CLASS DigitalLED74 @@ -47,171 +78,156 @@ class DigitalLED74 private $iLED_Y=7; // fg-up, fg-down, bg private $iColorSchema = array( - LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0 - LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1 - LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2 - LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3 - LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'), - LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'), - LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'), - LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'), - LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'), - LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'), - LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'), - LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'), - LEDC_TEAL => array('teal','teal:0.7','teal:0.5'), - LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'), - LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14 - LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15 - ); - /* Each line of the character is encoded as a 4 bit value - 0 ____ - 1 ___x - 2 __x_ - 3 __xx - 4 _x__ - 5 _x_x - 6 _xx_ - 7 _xxx - 8 x___ - 9 x__x - 10 x_x_ - 11 x_xx - 12 xx__ - 13 xx_x - 14 xxx_ - 15 xxxx - */ - + LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0 + LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1 + LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2 + LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3 + LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'), + LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'), + LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'), + LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'), + LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'), + LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'), + LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'), + LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'), + LEDC_TEAL => array('teal','teal:0.7','teal:0.5'), + LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'), + LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14 + LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15 + ); private $iLEDSpec = array( - 0 => array(6,9,11,15,13,9,6), - 1 => array(2,6,10,2,2,2,2), - 2 => array(6,9,1,2,4,8,15), - 3 => array(6,9,1,6,1,9,6), - 4 => array(1,3,5,9,15,1,1), - 5 => array(15,8,8,14,1,9,6), - 6 => array(6,8,8,14,9,9,6), - 7 => array(15,1,1,2,4,4,4), - 8 => array(6,9,9,6,9,9,6), - 9 => array(6,9,9,7,1,1,6), - '!' => array(4,4,4,4,4,0,4), - '?' => array(6,9,1,2,2,0,2), - '#' => array(0,9,15,9,15,9,0), - '@' => array(6,9,11,11,10,9,6), - '-' => array(0,0,0,15,0,0,0), - '_' => array(0,0,0,0,0,0,15), - '=' => array(0,0,15,0,15,0,0), - '+' => array(0,0,4,14,4,0,0), - '|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus 'Ы' - ',' => array(0,0,0,0,0,12,4), - '.' => array(0,0,0,0,0,12,12), - ':' => array(12,12,0,0,0,12,12), - ';' => array(12,12,0,0,0,12,4), - '[' => array(3,2,2,2,2,2,3), - ']' => array(12,4,4,4,4,4,12), - '(' => array(1,2,2,2,2,2,1), - ')' => array(8,4,4,4,4,4,8), - '{' => array(3,2,2,6,2,2,3), - '}' => array(12,4,4,6,4,4,12), - '<' => array(1,2,4,8,4,2,1), - '>' => array(8,4,2,1,2,4,8), - '*' => array(9,6,15,6,9,0,0), - '"' => array(10,10,0,0,0,0,0), - '\'' => array(4,4,0,0,0,0,0), - '`' => array(4,2,0,0,0,0,0), - '~' => array(13,11,0,0,0,0,0), - '^' => array(4,10,0,0,0,0,0), - '\\' => array(8,8,4,6,2,1,1), - '/' => array(1,1,2,6,4,8,8), - '%' => array(1,9,2,6,4,9,8), - '&' => array(0,4,10,4,11,10,5), - '$' => array(2,7,8,6,1,14,4), - ' ' => array(0,0,0,0,0,0,0), - '•' => array(0,0,6,6,0,0,0), //149 - '°' => array(14,10,14,0,0,0,0), //176 - '†' => array(4,4,14,4,4,4,4), //134 - '‡' => array(4,4,14,4,14,4,4), //135 - '±' => array(0,4,14,4,0,14,0), //177 - '‰' => array(0,4,2,15,2,4,0), //137 show right arrow - '™' => array(0,2,4,15,4,2,0), //156 show left arrow - 'Ў' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus 'Ф' - "\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus 'У' - "\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus 'М','Ш' ,'Щ' - "\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus 'Ж' - "Ґ" => array(10,5,10,5,10,5,10), //chess - "µ" => array(15,0,15,0,15,0,15), //4 horizontal lines - // latin - 'A' => array(6,9,9,15,9,9,9), - 'B' => array(14,9,9,14,9,9,14), - 'C' => array(6,9,8,8,8,9,6), - 'D' => array(14,9,9,9,9,9,14), - 'E' => array(15,8,8,14,8,8,15), - 'F' => array(15,8,8,14,8,8,8), - 'G' => array(6,9,8,8,11,9,6), - 'H' => array(9,9,9,15,9,9,9), - 'I' => array(14,4,4,4,4,4,14), - 'J' => array(15,1,1,1,1,9,6), - 'K' => array(8,9,10,12,12,10,9), - 'L' => array(8,8,8,8,8,8,15), - 'M' => array(8,13,10,8,8,8,8),// need to add \r - 'N' => array(9,9,13,11,9,9,9), - 'O' => array(6,9,9,9,9,9,6), - 'P' => array(14,9,9,14,8,8,8), - 'Q' => array(6,9,9,9,13,11,6), - 'R' => array(14,9,9,14,12,10,9), - 'S' => array(6,9,8,6,1,9,6), - 'T' => array(14,4,4,4,4,4,4), - 'U' => array(9,9,9,9,9,9,6), - 'V' => array(0,0,0,10,10,10,4), - 'W' => array(8,8,8,8,10,13,8),// need to add \r - 'X' => array(9,9,6,6,6,9,9), - 'Y' => array(10,10,10,10,4,4,4), - 'Z' => array(15,1,2,6,4,8,15), - // russian utf-8 - 'А' => array(6,9,9,15,9,9,9), - 'Б' => array(14,8,8,14,9,9,14), - 'В' => array(14,9,9,14,9,9,14), - 'Г' => array(15,8,8,8,8,8,8), - 'Д' => array(14,9,9,9,9,9,14), - 'Е' => array(15,8,8,14,8,8,15), - 'Ё' => array(6,15,8,14,8,8,15), - //Ж is combine: >\n< - 'З' => array(6,9,1,2,1,9,6), - 'И' => array(9,9,9,11,13,9,9), - 'Й' => array(13,9,9,11,13,9,9), - 'К' => array(9,10,12,10,9,9,9), - 'Л' => array(7,9,9,9,9,9,9), - 'М' => array(8,13,10,8,8,8,8),// need to add \r - 'Н' => array(9,9,9,15,9,9,9), - 'О' => array(6,9,9,9,9,9,6), - 'П' => array(15,9,9,9,9,9,9), - 'Р' => array(14,9,9,14,8,8,8), - 'С' => array(6,9,8,8,8,9,6), - 'Т' => array(14,4,4,4,4,4,4), - 'У' => array(9,9,9,7,1,9,6), - 'Ф' => array(2,7,10,10,7,2,2),// need to add Ў - 'Х' => array(9,9,6,6,6,9,9), - 'Ц' => array(10,10,10,10,10,15,1), - 'Ч' => array(9,9,9,7,1,1,1), - 'Ш' => array(10,10,10,10,10,10,15),// \r - 'Щ' => array(10,10,10,10,10,15,0),// need to add \r - 'Ъ' => array(12,4,4,6,5,5,6), - 'Ы' => array(8,8,8,14,9,9,14),// need to add | - 'Ь' => array(8,8,8,14,9,9,14), - 'Э' => array(6,9,1,7,1,9,6), - 'Ю' => array(2,2,2,3,2,2,2),// need to add O - 'Я' => array(7,9,9,7,3,5,9) - ); + 0 => array(6,9,11,15,13,9,6), + //0 => array(6,9,9,9,9,9,6), + //0 => array(15,9,9,9,9,9,15), + 1 => array(2,6,10,2,2,2,2), + 2 => array(6,9,1,2,4,8,15), + 3 => array(6,9,1,6,1,9,6), + 4 => array(1,3,5,9,15,1,1), + 5 => array(15,8,8,14,1,9,6), + 6 => array(6,8,8,14,9,9,6), + 7 => array(15,1,1,2,4,4,4), + 8 => array(6,9,9,6,9,9,6), + 9 => array(6,9,9,7,1,1,6), + '!' => array(4,4,4,4,4,0,4), + '?' => array(6,9,1,2,2,0,2), + '#' => array(0,9,15,9,15,9,0), + '@' => array(6,9,11,11,10,9,6), + '-' => array(0,0,0,15,0,0,0), + '_' => array(0,0,0,0,0,0,15), + '=' => array(0,0,15,0,15,0,0), + '+' => array(0,0,4,14,4,0,0), + '|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus '' + ',' => array(0,0,0,0,0,12,4), + '.' => array(0,0,0,0,0,12,12), + ':' => array(12,12,0,0,0,12,12), + ';' => array(12,12,0,0,0,12,4), + '[' => array(3,2,2,2,2,2,3), + ']' => array(12,4,4,4,4,4,12), + '(' => array(1,2,2,2,2,2,1), + ')' => array(8,4,4,4,4,4,8), + '{' => array(3,2,2,6,2,2,3), + '}' => array(12,4,4,6,4,4,12), + '<' => array(1,2,4,8,4,2,1), + '>' => array(8,4,2,1,2,4,8), + '*' => array(9,6,15,6,9,0,0), + '"' => array(10,10,0,0,0,0,0), + '\'' => array(4,4,0,0,0,0,0), + '`' => array(4,2,0,0,0,0,0), + '~' => array(13,11,0,0,0,0,0), + '^' => array(4,10,0,0,0,0,0), + '\\' => array(8,8,4,6,2,1,1), + '/' => array(1,1,2,6,4,8,8), + '%' => array(1,9,2,6,4,9,8), + '&' => array(0,4,10,4,11,10,5), + '$' => array(2,7,8,6,1,14,4), + ' ' => array(0,0,0,0,0,0,0), + '' => array(0,0,6,6,0,0,0), //149 + '' => array(14,10,14,0,0,0,0), //176 + '' => array(4,4,14,4,4,4,4), //134 + '' => array(4,4,14,4,14,4,4), //135 + '' => array(0,4,14,4,0,14,0), //177 + '' => array(0,4,2,15,2,4,0), //137 show right arrow + '' => array(0,2,4,15,4,2,0), //156 show left arrow + '' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus '' + "\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus '' + "\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus '','' ,'' + "\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus '' + "" => array(10,5,10,5,10,5,10), //chess + "" => array(15,0,15,0,15,0,15), //4 horizontal lines +// latin + 'A' => array(6,9,9,15,9,9,9), + 'B' => array(14,9,9,14,9,9,14), + 'C' => array(6,9,8,8,8,9,6), + 'D' => array(14,9,9,9,9,9,14), + 'E' => array(15,8,8,14,8,8,15), + 'F' => array(15,8,8,14,8,8,8), + 'G' => array(6,9,8,8,11,9,6), + 'H' => array(9,9,9,15,9,9,9), + 'I' => array(14,4,4,4,4,4,14), + 'J' => array(15,1,1,1,1,9,6), + 'K' => array(8,9,10,12,12,10,9), + 'L' => array(8,8,8,8,8,8,15), + 'M' => array(8,13,10,8,8,8,8),// need to add \r + 'N' => array(9,9,13,11,9,9,9), + //'O' => array(0,6,9,9,9,9,6), + 'O' => array(6,9,9,9,9,9,6), + 'P' => array(14,9,9,14,8,8,8), + 'Q' => array(6,9,9,9,13,11,6), + 'R' => array(14,9,9,14,12,10,9), + 'S' => array(6,9,8,6,1,9,6), + 'T' => array(14,4,4,4,4,4,4), + 'U' => array(9,9,9,9,9,9,6), + 'V' => array(0,0,0,10,10,10,4), + 'W' => array(8,8,8,8,10,13,8),// need to add \r + 'X' => array(9,9,6,6,6,9,9), + //'Y' => array(9,9,9,9,6,6,6), + 'Y' => array(10,10,10,10,4,4,4), + 'Z' => array(15,1,2,6,4,8,15), +// russian cp1251 + '' => array(6,9,9,15,9,9,9), + '' => array(14,8,8,14,9,9,14), + '' => array(14,9,9,14,9,9,14), + '' => array(15,8,8,8,8,8,8), + '' => array(14,9,9,9,9,9,14), + '' => array(15,8,8,14,8,8,15), + '' => array(6,15,8,14,8,8,15), + // is combine: >\n< + '' => array(6,9,1,2,1,9,6), + '' => array(9,9,9,11,13,9,9), + '' => array(13,9,9,11,13,9,9), + '' => array(9,10,12,10,9,9,9), + '' => array(7,9,9,9,9,9,9), + '' => array(8,13,10,8,8,8,8),// need to add \r + '' => array(9,9,9,15,9,9,9), + '' => array(6,9,9,9,9,9,6), + '' => array(15,9,9,9,9,9,9), + '' => array(14,9,9,14,8,8,8), + '' => array(6,9,8,8,8,9,6), + '' => array(14,4,4,4,4,4,4), + '' => array(9,9,9,7,1,9,6), + '' => array(2,7,10,10,7,2,2),// need to add + '' => array(9,9,6,6,6,9,9), + '' => array(10,10,10,10,10,15,1), + '' => array(9,9,9,7,1,1,1), + '' => array(10,10,10,10,10,10,15),// \r + '' => array(10,10,10,10,10,15,0),// need to add \r + '' => array(12,4,4,6,5,5,6), + '' => array(8,8,8,14,9,9,14),// need to add | + '' => array(8,8,8,14,9,9,14), + '' => array(6,9,1,7,1,9,6), + '' => array(2,2,2,3,2,2,2),// need to add O + '' => array(7,9,9,7,3,5,9) + ); private $iSuperSampling = 3; private $iMarg = 1; private $iRad = 4; - - public function __construct($aRadius = 2, $aMargin= 0.6) + + public function DigitalLED74($aRadius = 2, $aMargin= 0.6) { $this->iRad = $aRadius; $this->iMarg = $aMargin; } - + public function SetSupersampling($aSuperSampling = 2) { $this->iSuperSampling = $aSuperSampling; @@ -227,7 +243,7 @@ class DigitalLED74 // Margin in between "Led" dots $marg = $this->iMarg * $this->iSuperSampling; - + $swidth = $width*$this->iSuperSampling; $sheight = $height*$this->iSuperSampling; @@ -265,27 +281,20 @@ class DigitalLED74 return $img; } - - public function Stroke($aValStr, $aColor = 0, $aFileName = '') - { - $this->StrokeNumber($aValStr, $aColor, $aFileName); - } - - - public function StrokeNumber($aValStr, $aColor = 0, $aFileName = '') + public function StrokeNumber($aValStr, $aColor = 0) { if ($aColor < 0 || $aColor >= sizeof($this->iColorSchema)) { $aColor = 0; } - if (($n = mb_strlen($aValStr, 'utf8')) == 0) { + if (($n = strlen($aValStr)) == 0) { $aValStr = ' '; $n = 1; } for ($i = 0; $i < $n; ++$i) { - $d = mb_substr($aValStr, $i, 1, 'utf8'); - if (ctype_digit($d)) { + $d = substr($aValStr, $i, 1); + if ($d >= '0' && $d <= '9') { $d = (int)$d; } else { $d = strtoupper($d); @@ -302,11 +311,7 @@ class DigitalLED74 $number_img->Copy($digit_img[$i]->img, $i*$w, 0, 0, 0, $w, $h, $w, $h); } - if ($aFileName != '') { - $number_img->Stream($aFileName); - } else { - $number_img->Headers(); - $number_img->Stream(); - } + $number_img->Headers(); + $number_img->Stream(); } } diff --git a/onyx2/include/jpgraph/jpgraph_legend.inc.php b/onyx2/include/jpgraph/jpgraph_legend.inc.php deleted file mode 100755 index 09ba7da..0000000 --- a/onyx2/include/jpgraph/jpgraph_legend.inc.php +++ /dev/null @@ -1,557 +0,0 @@ -hide=$aHide; - } - - public function SetHColMargin($aXMarg) - { - $this->xmargin = $aXMarg; - } - - public function SetVColMargin($aSpacing) - { - $this->ylinespacing = $aSpacing ; - } - - public function SetLeftMargin($aXMarg) - { - $this->xlmargin = $aXMarg; - } - - // Synonym - public function SetLineSpacing($aSpacing) - { - $this->ylinespacing = $aSpacing ; - } - - public function SetShadow($aShow='gray', $aWidth=4) - { - if (is_string($aShow)) { - $this->shadow_color = $aShow; - $this->shadow=true; - } else { - $this->shadow = $aShow; - } - $this->shadow_width = $aWidth; - } - - public function SetMarkAbsSize($aSize) - { - $this->mark_abs_vsize = $aSize ; - $this->mark_abs_hsize = $aSize ; - } - - public function SetMarkAbsVSize($aSize) - { - $this->mark_abs_vsize = $aSize ; - } - - public function SetMarkAbsHSize($aSize) - { - $this->mark_abs_hsize = $aSize ; - } - - public function SetLineWeight($aWeight) - { - $this->weight = $aWeight; - } - - public function SetFrameWeight($aWeight) - { - $this->frameweight = $aWeight; - } - - public function SetLayout($aDirection=LEGEND_VERT) - { - $this->layout_n = $aDirection==LEGEND_VERT ? 1 : 99 ; - } - - public function SetColumns($aCols) - { - $this->layout_n = $aCols ; - } - - public function SetReverse($f=true) - { - $this->reverse = $f ; - } - - // Set color on frame around box - public function SetColor($aFontColor, $aColor='black') - { - $this->font_color=$aFontColor; - $this->color=$aColor; - } - - public function SetFont($aFamily, $aStyle=FS_NORMAL, $aSize=10) - { - $this->font_family = $aFamily; - $this->font_style = $aStyle; - $this->font_size = $aSize; - } - - public function SetPos($aX, $aY, $aHAlign='right', $aVAlign='top') - { - $this->Pos($aX, $aY, $aHAlign, $aVAlign); - } - - public function SetAbsPos($aX, $aY, $aHAlign='right', $aVAlign='top') - { - $this->xabspos=$aX; - $this->yabspos=$aY; - $this->halign=$aHAlign; - $this->valign=$aVAlign; - } - - public function Pos($aX, $aY, $aHAlign='right', $aVAlign='top') - { - if (!($aX<1 && $aY<1)) { - JpGraphError::RaiseL(25120);//(" Position for legend must be given as percentage in range 0-1"); - } - $this->xpos=$aX; - $this->ypos=$aY; - $this->halign=$aHAlign; - $this->valign=$aVAlign; - } - - public function SetFillColor($aColor) - { - $this->fill_color=$aColor; - } - - public function Clear() - { - $this->txtcol = array(); - } - - public function Add($aTxt, $aColor, $aPlotmark='', $aLinestyle=0, $csimtarget='', $csimalt='', $csimwintarget='') - { - $this->txtcol[]=array($aTxt,$aColor,$aPlotmark,$aLinestyle,$csimtarget,$csimalt,$csimwintarget); - } - - public function GetCSIMAreas() - { - return $this->csimareas; - } - - public function SetBackgroundGradient($aFrom='navy', $aTo='silver', $aGradType=2) - { - $this->bkg_gradtype=$aGradType; - $this->bkg_gradfrom = $aFrom; - $this->bkg_gradto = $aTo; - } - - public function HasItems() - { - return (boolean)(count($this->txtcol)); - } - - public function Stroke($aImg) - { - // Constant - $fillBoxFrameWeight=1; - - if ($this->hide) { - return; - } - - $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); - - if ($this->reverse) { - $this->txtcol = array_reverse($this->txtcol); - } - - $n=count($this->txtcol); - if ($n == 0) { - return; - } - - // Find out the max width and height of each column to be able - // to size the legend box. - $numcolumns = ($n > $this->layout_n ? $this->layout_n : $n); - for ($i=0; $i < $numcolumns; ++$i) { - $colwidth[$i] = $aImg->GetTextWidth($this->txtcol[$i][0]) + - 2*$this->xmargin + 2*$this->mark_abs_hsize; - $colheight[$i] = 0; - } - - // Find our maximum height in each row - $rows = 0 ; - $rowheight[0] = 0; - for ($i=0; $i < $n; ++$i) { - $h = max($this->mark_abs_vsize, $aImg->GetTextHeight($this->txtcol[$i][0]))+$this->ylinespacing; - - // Makes sure we always have a minimum of 1/4 (1/2 on each side) of the mark as space - // between two vertical legend entries - //$h = round(max($h,$this->mark_abs_vsize+$this->ymargin)); - //echo "Textheight #$i: tetxheight=".$aImg->GetTextHeight($this->txtcol[$i][0]).', '; - //echo "h=$h ({$this->mark_abs_vsize},{$this->ymargin})
"; - if ($i % $numcolumns == 0) { - $rows++; - $rowheight[$rows-1] = 0; - } - $rowheight[$rows-1] = max($rowheight[$rows-1], $h)+1; - } - - $abs_height = 0; - for ($i=0; $i < $rows; ++$i) { - $abs_height += $rowheight[$i] ; - } - - // Make sure that the height is at least as high as mark size + ymargin - $abs_height = max($abs_height, $this->mark_abs_vsize); - $abs_height += $this->ybottom_margin; - - // Find out the maximum width in each column - for ($i=$numcolumns; $i < $n; ++$i) { - $colwidth[$i % $numcolumns] = max( - $aImg->GetTextWidth($this->txtcol[$i][0])+2*$this->xmargin+2*$this->mark_abs_hsize, - $colwidth[$i % $numcolumns] - ); - } - - // Get the total width - $mtw = 0; - for ($i=0; $i < $numcolumns; ++$i) { - $mtw += $colwidth[$i] ; - } - - // remove the last rows interpace margin (since there is no next row) - $abs_height -= $this->ylinespacing; - - - // Find out maximum width we need for legend box - $abs_width = $mtw+$this->xlmargin+($numcolumns-1)*$this->mark_abs_hsize; - - if ($this->xabspos === -1 && $this->yabspos === -1) { - $this->xabspos = $this->xpos*$aImg->width ; - $this->yabspos = $this->ypos*$aImg->height ; - } - - // Positioning of the legend box - if ($this->halign == 'left') { - $xp = $this->xabspos; - } elseif ($this->halign == 'center') { - $xp = $this->xabspos - $abs_width/2; - } else { - $xp = $aImg->width - $this->xabspos - $abs_width; - } - - $yp=$this->yabspos; - if ($this->valign == 'center') { - $yp-=$abs_height/2; - } elseif ($this->valign == 'bottom') { - $yp-=$abs_height; - } - - // Stroke legend box - $aImg->SetColor($this->color); - $aImg->SetLineWeight($this->frameweight); - $aImg->SetLineStyle('solid'); - - if ($this->shadow) { - $aImg->ShadowRectangle( - $xp, - $yp, - $xp+$abs_width+$this->shadow_width+2, - $yp+$abs_height+$this->shadow_width+2, - $this->fill_color, - $this->shadow_width+2, - $this->shadow_color - ); - } else { - $aImg->SetColor($this->fill_color); - $aImg->FilledRectangle($xp, $yp, $xp+$abs_width, $yp+$abs_height); - $aImg->SetColor($this->color); - $aImg->Rectangle($xp, $yp, $xp+$abs_width, $yp+$abs_height); - } - - if ($this->bkg_gradtype >= 0) { - $grad = new Gradient($aImg); - $grad->FilledRectangle( - $xp+1, - $yp+1, - $xp+$abs_width-3, - $yp+$abs_height-3, - $this->bkg_gradfrom, - $this->bkg_gradto, - $this->bkg_gradtype - ); - } - - // x1,y1 is the position for the legend marker + text - // The vertical position is the baseline position for the text - // and every marker is adjusted acording to that. - - // For multiline texts this get more complicated. - - $x1 = $xp + $this->xlmargin; - $y1 = $yp + $rowheight[0] - $this->ylinespacing + 2 ; // The ymargin is included in rowheight - - // Now, y1 is the bottom vertical position of the first legend, i.e if - // the legend has multiple lines it is the bottom line. - - $grad = new Gradient($aImg); - $patternFactory = null; - - // Now stroke each legend in turn - // Each plot has added the following information to the legend - // p[0] = Legend text - // p[1] = Color, - // p[2] = For markers a reference to the PlotMark object - // p[3] = For lines the line style, for gradient the negative gradient style - // p[4] = CSIM target - // p[5] = CSIM Alt text - $i = 1 ; - $row = 0; - foreach ($this->txtcol as $p) { - - // STROKE DEBUG BOX - if (_JPG_DEBUG) { - $aImg->SetLineWeight(1); - $aImg->SetColor('red'); - $aImg->SetLineStyle('solid'); - $aImg->Rectangle($x1, $y1, $xp+$abs_width-1, $y1-$rowheight[$row]); - } - - $aImg->SetLineWeight($this->weight); - $x1 = round($x1)+1; // We add one to not collide with the border - $y1=round($y1); - - // This is the center offset up from the baseline which is - // considered the "center" of the marks. This gets slightly complicated since - // we need to consider if the text is a multiline paragraph or if it is only - // a single line. The reason is that for single line the y1 corresponds to the baseline - // and that is fine. However for a multiline paragraph there is no single baseline - // and in that case the y1 corresponds to the lowest y for the bounding box. In that - // case we center the mark in the middle of the paragraph - if (!preg_match('/\n/', $p[0])) { - // Single line - $marky = ceil($y1-$this->mark_abs_vsize/2)-1; - } else { - // Paragraph - $marky = $y1 - $aImg->GetTextHeight($p[0])/2; - - // echo "y1=$y1, p[o]={$p[0]}, marky=$marky
"; - } - - //echo "
Mark #$i: marky=$marky
"; - - $x1 += $this->mark_abs_hsize; - - if (!empty($p[2]) && $p[2]->GetType() > -1) { - - - // Make a plot mark legend. This is constructed with a mark which - // is run through with a line - - // First construct a bit of the line that looks exactly like the - // line in the plot - $aImg->SetColor($p[1]); - if (is_string($p[3]) || $p[3]>0) { - $aImg->SetLineStyle($p[3]); - $aImg->StyleLine($x1-$this->mark_abs_hsize, $marky, $x1+$this->mark_abs_hsize, $marky); - } - - // Stroke a mark using image - if ($p[2]->GetType() == MARK_IMG) { - $p[2]->Stroke($aImg, $x1, $marky); - } - - // Stroke a mark with the standard size - // (As long as it is not an image mark ) - if ($p[2]->GetType() != MARK_IMG) { - - // Clear any user callbacks since we ont want them called for - // the legend marks - $p[2]->iFormatCallback = ''; - $p[2]->iFormatCallback2 = ''; - - // Since size for circles is specified as the radius - // this means that we must half the size to make the total - // width behave as the other marks - if ($p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE) { - $p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize)/2); - $p[2]->Stroke($aImg, $x1, $marky); - } else { - $p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize)); - $p[2]->Stroke($aImg, $x1, $marky); - } - } - } elseif (!empty($p[2]) && (is_string($p[3]) || $p[3]>0)) { - // Draw a styled line - $aImg->SetColor($p[1]); - $aImg->SetLineStyle($p[3]); - $aImg->StyleLine($x1-$this->mark_abs_hsize, $marky, $x1+$this->mark_abs_hsize, $marky); - $aImg->StyleLine($x1-$this->mark_abs_hsize, $marky+1, $x1+$this->mark_abs_hsize, $marky+1); - } else { - // Draw a colored box - $color = $p[1] ; - - // We make boxes slightly larger to better show - $boxsize = max($this->mark_abs_vsize, $this->mark_abs_hsize) + 2 ; - - $ym = $marky-ceil($boxsize/2) ; // Marker y-coordinate - - // We either need to plot a gradient or a - // pattern. To differentiate we use a kludge. - // Patterns have a p[3] value of < -100 - if ($p[3] < -100) { - // p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity - if ($patternFactory == null) { - $patternFactory = new RectPatternFactory(); - } - $prect = $patternFactory->Create($p[1][0], $p[1][1], 1); - $prect->SetBackground($p[1][3]); - $prect->SetDensity($p[1][2]+1); - $prect->SetPos(new Rectangle($x1, $ym, $boxsize, $boxsize)); - $prect->Stroke($aImg); - $prect=null; - } else { - if (is_array($color) && count($color)==2) { - // The client want a gradient color - $grad->FilledRectangle( - $x1-$boxsize/2, - $ym, - $x1+$boxsize/2, - $ym+$boxsize, - $color[0], - $color[1], - -$p[3] - ); - } else { - $aImg->SetColor($p[1]); - $aImg->FilledRectangle($x1-$boxsize/2, $ym, $x1+$boxsize/2, $ym+$boxsize); - } - - // Draw a plot frame line - $aImg->SetColor($this->color); - $aImg->SetLineWeight($fillBoxFrameWeight); - $aImg->Rectangle( - $x1-$boxsize/2, - $ym, - $x1+$boxsize/2, - $ym+$boxsize - ); - } - } - $aImg->SetColor($this->font_color); - $aImg->SetFont($this->font_family, $this->font_style, $this->font_size); - $aImg->SetTextAlign('left', 'baseline'); - - $debug=false; - $aImg->StrokeText( - $x1+$this->mark_abs_hsize+$this->xmargin, - $y1, - $p[0], - 0, - 'left', - $debug - ); - - // Add CSIM for Legend if defined - if (!empty($p[4])) { - $xs = $x1 - $this->mark_abs_hsize ; - $ys = $y1 + 1 ; - $xe = $x1 + $aImg->GetTextWidth($p[0]) + $this->mark_abs_hsize + $this->xmargin ; - $ye = $y1-$rowheight[$row]+1; - $coords = "$xs,$ys,$xe,$y1,$xe,$ye,$xs,$ye"; - if (! empty($p[4])) { - $this->csimareas .= "csimareas .= " target=\"".$p[6]."\""; - } - - if (!empty($p[5])) { - $tmp=sprintf($p[5], $p[0]); - $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" "; - } - $this->csimareas .= " />\n"; - } - } - - if ($i >= $this->layout_n) { - $x1 = $xp+$this->xlmargin; - $row++; - if (!empty($rowheight[$row])) { - $y1 += $rowheight[$row]; - } - $i = 1; - } else { - $x1 += $colwidth[($i-1) % $numcolumns] ; - ++$i; - } - } - } -} // Class diff --git a/onyx2/include/jpgraph/jpgraph_line.php b/onyx2/include/jpgraph/jpgraph_line.php index a05df1a..f09fe74 100644 --- a/onyx2/include/jpgraph/jpgraph_line.php +++ b/onyx2/include/jpgraph/jpgraph_line.php @@ -1,13 +1,13 @@ Plot($datay, $datax); $this->mark = new PlotMark() ; - $this->color = ColorFactory::getColor(); - $this->fill_color = $this->color; } //--------------- // PUBLIC METHODS - public function SetFilled($aFlg=true) + // Set style, filled or open + public function SetFilled($aFlag=true) { - $this->filled = $aFlg; + JpGraphError::RaiseL(10001);//('LinePlot::SetFilled() is deprecated. Use SetFillColor()'); } - + public function SetBarCenter($aFlag=true) { $this->barcenter=$aFlag; @@ -65,30 +63,24 @@ class LinePlot extends Plot { $this->line_style=$aStyle; } - + public function SetStepStyle($aFlag=true) { $this->step_style = $aFlag; } - + public function SetColor($aColor) { parent::SetColor($aColor); } - + public function SetFillFromYMin($f=true) { $this->fillFromMin = $f ; } - - public function SetFillFromYMax($f=true) - { - $this->fillFromMax = $f ; - } - + public function SetFillColor($aColor, $aFilled=true) { - //$this->color = $aColor; $this->fill_color=$aColor; $this->filled=$aFilled; } @@ -101,7 +93,7 @@ class LinePlot extends Plot $this->filled = $aFilled; $this->fillgrad = true; } - + public function Legend($graph) { if ($this->legend!="") { @@ -151,16 +143,17 @@ class LinePlot extends Plot } $this->filledAreas[] = array($aMin,$aMax,$aColor,$aFilled,$aBorder); } - + // Gets called before any axis are stroked public function PreStrokeAdjust($graph) { - // If another plot type have already adjusted the + // If another plot type have already adjusted the // offset we don't touch it. // (We check for empty in case the scale is a log scale // and hence doesn't contain any xlabel_offset) - if (empty($graph->xaxis->scale->ticks->xlabel_offset) || $graph->xaxis->scale->ticks->xlabel_offset == 0) { + if (empty($graph->xaxis->scale->ticks->xlabel_offset) || + $graph->xaxis->scale->ticks->xlabel_offset == 0) { if ($this->center) { ++$this->numpoints; $a=0.5; @@ -174,7 +167,7 @@ class LinePlot extends Plot //$graph->xaxis->scale->ticks->SupressMinorTickMarks(); } } - + public function SetFastStroke($aFlg=true) { $this->iFastStroke = $aFlg; @@ -217,7 +210,7 @@ class LinePlot extends Plot $img->Polygon($cord, false, true); } - + public function Stroke($img, $xscale, $yscale) { $idx=0; @@ -225,8 +218,9 @@ class LinePlot extends Plot if (isset($this->coords[1])) { if (count($this->coords[1])!=$numpoints) { JpGraphError::RaiseL(2003, count($this->coords[1]), $numpoints); + } //("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); - } else { + else { $exist_x = true; } } else { @@ -266,22 +260,18 @@ class LinePlot extends Plot $yscale->Translate($this->coords[0][$startpoint]) ); + if ($this->filled) { - if ($this->fillFromMax) { - //$max = $yscale->GetMaxVal(); - $cord[$idx++] = $xscale->Translate($xs); - $cord[$idx++] = $yscale->scale_abs[1]; - } else { - $min = $yscale->GetMinVal(); - if ($min > 0 || $this->fillFromMin) { - $fillmin = $yscale->scale_abs[0];//Translate($min); - } else { - $fillmin = $yscale->Translate(0); - } - - $cord[$idx++] = $xscale->Translate($xs); - $cord[$idx++] = $fillmin; + $min = $yscale->GetMinVal(); + if ($min > 0 || $this->fillFromMin) { + $fillmin = $yscale->scale_abs[0]; + }//Translate($min); + else { + $fillmin = $yscale->Translate(0); } + + $cord[$idx++] = $xscale->Translate($xs); + $cord[$idx++] = $fillmin; } $xt = $xscale->Translate($xs); $yt = $yscale->Translate($this->coords[0][$startpoint]); @@ -308,7 +298,7 @@ class LinePlot extends Plot } $xt = $xscale->Translate($x); $yt = $yscale->Translate($this->coords[0][$pnts]); - + $y=$this->coords[0][$pnts]; if ($this->step_style) { // To handle null values within step style we need to record the @@ -383,14 +373,10 @@ class LinePlot extends Plot if ($this->filled) { $cord[$idx++] = $xt; - if ($this->fillFromMax) { - $cord[$idx++] = $yscale->scale_abs[1]; + if ($min > 0 || $this->fillFromMin) { + $cord[$idx++] = $yscale->Translate($min); } else { - if ($min > 0 || $this->fillFromMin) { - $cord[$idx++] = $yscale->Translate($min); - } else { - $cord[$idx++] = $yscale->Translate(0); - } + $cord[$idx++] = $yscale->Translate(0); } if ($this->fillgrad) { $img->SetLineWeight(1); @@ -402,13 +388,9 @@ class LinePlot extends Plot $img->SetColor($this->fill_color); $img->FilledPolygon($cord); } - if ($this->weight > 0) { - $img->SetLineWeight($this->weight); + if ($this->line_weight > 0) { $img->SetColor($this->color); - // Remove first and last coordinate before drawing the line - // sine we otherwise get the vertical start and end lines which - // doesn't look appropriate - $img->Polygon(array_slice($cord, 2, count($cord)-4)); + $img->Polygon($cord); } } @@ -423,26 +405,28 @@ class LinePlot extends Plot $areaCoords[] = $minY; $areaCoords = - array_merge( - $areaCoords, - array_slice( - $cord, - $this->filledAreas[$i][0] * $factor, - ($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor - ) - ); + array_merge( + $areaCoords, + array_slice( + $cord, + $this->filledAreas[$i][0] * $factor, + ($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor + ) + ); $areaCoords[] = $areaCoords[sizeof($areaCoords)-2]; // last x - $areaCoords[] = $minY; // last y - - if ($this->filledAreas[$i][3]) { - $img->SetColor($this->filledAreas[$i][2]); - $img->FilledPolygon($areaCoords); - $img->SetColor($this->color); - } + $areaCoords[] = $minY; // last y + + if ($this->filledAreas[$i][3]) { + $img->SetColor($this->filledAreas[$i][2]); + $img->FilledPolygon($areaCoords); + $img->SetColor($this->color); + } // Check if we should draw the frame. // If not we still re-draw the line since it might have been // partially overwritten by the filled area and it doesn't look // very good. + // TODO: The behaviour is undefined if the line does not have + // any line at the position of the area. if ($this->filledAreas[$i][4]) { $img->Polygon($areaCoords); } else { @@ -500,7 +484,7 @@ class AccLinePlot extends Plot private $iStartEndZero=true; //--------------- // CONSTRUCTOR - public function __construct($plots) + public function AccLinePlot($plots) { $this->plots = $plots; $this->nbrplots = count($plots); @@ -526,7 +510,7 @@ class AccLinePlot extends Plot $p->DoLegend($graph); } } - + public function Max() { list($xmax) = $this->plots[0]->Max(); @@ -586,11 +570,11 @@ class AccLinePlot extends Plot public function PreStrokeAdjust($graph) { - // If another plot type have already adjusted the + // If another plot type have already adjusted the // offset we don't touch it. // (We check for empty in case the scale is a log scale // and hence doesn't contain any xlabel_offset) - + if (empty($graph->xaxis->scale->ticks->xlabel_offset) || $graph->xaxis->scale->ticks->xlabel_offset == 0) { if ($this->center) { @@ -619,7 +603,7 @@ class AccLinePlot extends Plot { $n=count($aData); $i=0; - + // If first point is undefined we will set it to the same as the first // valid data if ($aData[$i]==='-') { @@ -677,6 +661,8 @@ class AccLinePlot extends Plot return true; } + + // To avoid duplicate of line drawing code here we just // change the y-values for each plot and then restore it // after we have made the stroke. We must do this copy since diff --git a/onyx2/include/jpgraph/jpgraph_log.php b/onyx2/include/jpgraph/jpgraph_log.php index c0eaa23..4be33f5 100644 --- a/onyx2/include/jpgraph/jpgraph_log.php +++ b/onyx2/include/jpgraph/jpgraph_log.php @@ -1,13 +1,13 @@ LinearScale($min, $max, $type); $this->ticks = new LogTicks(); $this->name = 'log'; } @@ -38,8 +38,8 @@ class LogScale extends LinearScale if (!is_numeric($a)) { if ($a != '' && $a != '-' && $a != 'x') { JpGraphError::RaiseL(11001); - // ('Your data contains non-numeric values.'); } + //('Your data contains non-numeric values.'); return 1; } if ($a < 0) { @@ -61,8 +61,8 @@ class LogScale extends LinearScale if (!is_numeric($a)) { if ($a != '' && $a != '-' && $a != 'x') { JpGraphError::RaiseL(11001); - //('Your data contains non-numeric values.'); } + //('Your data contains non-numeric values.'); return 1; } if ($a==0) { @@ -71,7 +71,7 @@ class LogScale extends LinearScale $a=log10($a); return round(($a*1.0 - $this->scale[0]) * $this->scale_factor); } - + // Use bcpow() for increased precision public function GetMinVal() { @@ -81,7 +81,7 @@ class LogScale extends LinearScale return round(pow(10, $this->scale[0]), 14); } } - + public function GetMaxVal() { if (function_exists("bcpow")) { @@ -90,7 +90,7 @@ class LogScale extends LinearScale return round(pow(10, $this->scale[1]), 14); } } - + // Logarithmic autoscaling is much simplier since we just // set the min and max to logs of the min and max values. // Note that for log autoscale the "maxstep" the fourth argument @@ -101,7 +101,7 @@ class LogScale extends LinearScale if ($min==0) { $min=1; } - + if ($max <= 0) { JpGraphError::RaiseL(11004); //('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.'); @@ -127,7 +127,7 @@ class LogScale extends LinearScale $this->Update($img, $smin, $smax); } //--------------- - // PRIVATE METHODS +// PRIVATE METHODS } // Class //=================================================== @@ -140,7 +140,7 @@ class LogTicks extends Ticks private $ticklabels_pos = array(); //--------------- // CONSTRUCTOR - public function __construct() + public function LogTicks() { } //--------------- @@ -154,7 +154,7 @@ class LogTicks extends Ticks { $this->label_logtype = $aType; } - + // For log scale it's meaningless to speak about a major step // We just return -1 to make the framework happy (specifically // StrokeLabels() ) @@ -184,16 +184,16 @@ class LogTicks extends Ticks $limit = $scale->GetMaxVal(); $nextMajor = 10*$start; $step = $nextMajor / 10.0; - - + + $img->SetLineWeight($this->weight); - + if ($scale->type == "y") { // member direction specified if the ticks should be on // left or right side. $a=$pos + $this->direction*$this->GetMinTickAbsSize(); $a2=$pos + $this->direction*$this->GetMajTickAbsSize(); - + $count=1; $this->maj_ticks_pos[0]=$scale->Translate($start); $this->maj_ticklabels_pos[0]=$scale->Translate($start); @@ -227,7 +227,7 @@ class LogTicks extends Ticks $this->maj_ticks_pos[$i]=$ys; $this->maj_ticklabels_pos[$i]=$ys; - + if ($this->label_formfunc != '') { $f = $this->label_formfunc; $this->maj_ticks_label[$i]=call_user_func($f, $nextMajor); diff --git a/onyx2/include/jpgraph/jpgraph_meshinterpolate.inc.php b/onyx2/include/jpgraph/jpgraph_meshinterpolate.inc.php deleted file mode 100755 index 1c8dc91..0000000 --- a/onyx2/include/jpgraph/jpgraph_meshinterpolate.inc.php +++ /dev/null @@ -1,108 +0,0 @@ -Linear($aData, $aFactor); -} - -/** - * Utility class to interpolate a given data matrix - * - */ -class MeshInterpolate -{ - private $data = array(); - - /** - * Calculate the mid points of the given rectangle which has its top left - * corner at $row,$col. The $aFactordecides how many spliots should be done. - * i.e. how many more divisions should be done recursively - * - * @param $row Top left corner of square to work with - * @param $col Top left corner of square to work with - * $param $aFactor In how many subsquare should we split this square. A value of 1 indicates that no action - */ - public function IntSquare($aRow, $aCol, $aFactor) - { - if ($aFactor <= 1) { - return; - } - - $step = pow(2, $aFactor-1); - - $v0 = $this->data[$aRow][$aCol]; - $v1 = $this->data[$aRow][$aCol + $step]; - $v2 = $this->data[$aRow + $step][$aCol]; - $v3 = $this->data[$aRow + $step][$aCol + $step]; - - $this->data[$aRow][$aCol + $step / 2] = ($v0 + $v1) / 2; - $this->data[$aRow + $step / 2][$aCol] = ($v0 + $v2) / 2; - $this->data[$aRow + $step][$aCol + $step / 2] = ($v2 + $v3) / 2; - $this->data[$aRow + $step / 2][$aCol + $step] = ($v1 + $v3) / 2; - $this->data[$aRow + $step / 2][$aCol + $step / 2] = ($v0 + $v1 + $v2 + $v3) / 4; - - $this->IntSquare($aRow, $aCol, $aFactor-1); - $this->IntSquare($aRow, $aCol + $step / 2, $aFactor-1); - $this->IntSquare($aRow + $step / 2, $aCol, $aFactor-1); - $this->IntSquare($aRow + $step / 2, $aCol + $step / 2, $aFactor-1); - } - - /** - * Interpolate values in a matrice so that the total number of data points - * in vert and horizontal axis are $aIntNbr more. For example $aIntNbr=2 will - * make the data matrice have tiwce as many vertical and horizontal dta points. - * - * Note: This will blow up the matrcide in memory size in the order of $aInNbr^2 - * - * @param $ &$aData The original data matricde - * @param $aInNbr Interpolation factor - * @return the interpolated matrice - */ - public function Linear(&$aData, $aIntFactor) - { - $step = pow(2, $aIntFactor-1); - - $orig_cols = count($aData[0]); - $orig_rows = count($aData); - // Number of new columns/rows - // N = (a-1) * 2^(f-1) + 1 - $p = pow(2, $aIntFactor-1); - $new_cols = $p * ($orig_cols - 1) + 1; - $new_rows = $p * ($orig_rows - 1) + 1; - - $this->data = array_fill(0, $new_rows, array_fill(0, $new_cols, 0)); - // Initialize the new matrix with the values that we know - for ($i = 0; $i < $new_rows; $i++) { - for ($j = 0; $j < $new_cols; $j++) { - $v = 0 ; - if (($i % $step == 0) && ($j % $step == 0)) { - $v = $aData[$i / $step][$j / $step]; - } - $this->data[$i][$j] = $v; - } - } - - for ($i = 0; $i < $new_rows-1; $i += $step) { - for ($j = 0; $j < $new_cols-1; $j += $step) { - $this->IntSquare($i, $j, $aIntFactor); - } - } - - return $this->data; - } -} diff --git a/onyx2/include/jpgraph/jpgraph_mgraph.php b/onyx2/include/jpgraph/jpgraph_mgraph.php index 32b1c53..e43a2d9 100644 --- a/onyx2/include/jpgraph/jpgraph_mgraph.php +++ b/onyx2/include/jpgraph/jpgraph_mgraph.php @@ -1,13 +1,13 @@ iWidth = $aWidth; $this->iHeight = $aHeight; - - // If the cached version exist just read it directly from the - // cache, stream it back to browser and exit - if ($aCachedName!='' && READ_CACHE && $aInline) { - $this->cache = new ImgStreamCache(); - $this->cache->SetTimeOut($aTimeOut); - $image = new Image(); - if ($this->cache->GetAndStream($image, $aCachedName)) { - exit(); - } - } - $this->inline = $aInline; - $this->cache_name = $aCachedName; - - $this->title = new Text(); - $this->title->ParagraphAlign('center'); - $this->title->SetFont(FF_FONT2, FS_BOLD); - $this->title->SetMargin(3); - $this->title->SetAlign('center'); - - $this->subtitle = new Text(); - $this->subtitle->ParagraphAlign('center'); - $this->subtitle->SetFont(FF_FONT1, FS_BOLD); - $this->subtitle->SetMargin(3); - $this->subtitle->SetAlign('center'); - - $this->subsubtitle = new Text(); - $this->subsubtitle->ParagraphAlign('center'); - $this->subsubtitle->SetFont(FF_FONT1, FS_NORMAL); - $this->subsubtitle->SetMargin(3); - $this->subsubtitle->SetAlign('center'); - - $this->footer = new Footer(); } // Specify background fill color for the combined graph @@ -120,6 +75,10 @@ class MGraph $aCenter=true; $aX=null; + if ($GLOBALS['gd2'] && !USE_TRUECOLOR) { + JpGraphError::RaiseL(12001); + //("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x you must enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts."); + } if (is_numeric($aCenter_aX)) { $aX=$aCenter_aX; } @@ -130,7 +89,7 @@ class MGraph JpGraphError::RaiseL(12002, $aFileName); //('Incorrect file name for MGraph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type'); } - + $valid_formats = array('png', 'jpg', 'gif'); $aImgFormat = strtolower($e[count($e)-1]); if ($aImgFormat == 'jpeg') { @@ -147,27 +106,62 @@ class MGraph $this->background_image_y = $aY; } + + // Private helper function for backgound image + public function _loadBkgImage($aFile='') + { + if ($aFile == '') { + $aFile = $this->background_image; + } + + // Remove case sensitivity and setup appropriate function to create image + // Get file extension. This should be the LAST '.' separated part of the filename + $e = explode('.', $aFile); + $ext = strtolower($e[count($e)-1]); + if ($ext == "jpeg") { + $ext = "jpg"; + } + + if (trim($ext) == '') { + $ext = 'png'; + } // Assume PNG if no extension specified + + $supported = imagetypes(); + if (($ext == 'jpg' && !($supported & IMG_JPG)) || + ($ext == 'gif' && !($supported & IMG_GIF)) || + ($ext == 'png' && !($supported & IMG_PNG))) { + JpGraphError::RaiseL(12004, $aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. '); + } + + if ($ext == "jpg" || $ext == "jpeg") { + $f = "imagecreatefromjpeg"; + $ext = "jpg"; + } else { + $f = "imagecreatefrom".$ext; + } + + $img = @$f($aFile); + if (!$img) { + JpGraphError::RaiseL(12005, $aFile); + //(" Can't read background image: '".$aFile."'"); + } + return $img; + } + public function _strokeBackgroundImage() { if ($this->background_image == '') { return; } - $bkgimg = Graph::LoadBkgImage('', $this->background_image); - + $bkgimg = $this->_loadBkgImage(); // Background width & Heoght $bw = imagesx($bkgimg); $bh = imagesy($bkgimg); - // Canvas width and height $cw = imagesx($this->img); $ch = imagesy($this->img); - if ($this->doshadow) { - $cw -= $this->shadow_width; - $ch -= $this->shadow_width; - } - if ($this->background_image_x === null || $this->background_image_y === null) { if ($this->background_image_center) { // Center original image in the plot area @@ -182,14 +176,87 @@ class MGraph $x = $this->background_image_x; $y = $this->background_image_y; } - imagecopymerge($this->img, $bkgimg, $x, $y, 0, 0, $bw, $bh, $this->background_image_mix); + $this->_imageCp($bkgimg, $x, $y, 0, 0, $bw, $bh, $this->background_image_mix); + } + + public function _imageCp($aSrcImg, $x, $y, $fx, $fy, $w, $h, $mix=100) + { + imagecopymerge($this->img, $aSrcImg, $x, $y, $fx, $fy, $w, $h, $mix); + } + + public function _imageCreate($aWidth, $aHeight) + { + if ($aWidth <= 1 || $aHeight <= 1) { + JpGraphError::RaiseL(12006, $aWidth, $aHeight); + //("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)"); + } + if (@$GLOBALS['gd2']==true && USE_TRUECOLOR) { + $this->img = @imagecreatetruecolor($aWidth, $aHeight); + if ($this->img < 1) { + JpGraphError::RaiseL(12011); + // die("JpGraph Error: Can't create truecolor image. Check that you really have GD2 library installed."); + } + ImageAlphaBlending($this->img, true); + } else { + $this->img = @imagecreate($aWidth, $aHeight); + if ($this->img < 1) { + JpGraphError::RaiseL(12012); + // die("JpGraph Error: Can't create image. Check that you really have the GD library installed."); + } + } + } + + public function _polygon($p, $closed=false) + { + if ($this->iLineWeight==0) { + return; + } + $n=count($p); + $oldx = $p[0]; + $oldy = $p[1]; + for ($i=2; $i < $n; $i+=2) { + imageline($this->img, $oldx, $oldy, $p[$i], $p[$i+1], $this->iCurrentColor); + $oldx = $p[$i]; + $oldy = $p[$i+1]; + } + if ($closed) { + imageline($this->img, $p[$n*2-2], $p[$n*2-1], $p[0], $p[1], $this->iCurrentColor); + } + } + + public function _filledPolygon($pts) + { + $n=count($pts); + for ($i=0; $i < $n; ++$i) { + $pts[$i] = round($pts[$i]); + } + imagefilledpolygon($this->img, $pts, count($pts)/2, $this->iCurrentColor); + } + + public function _rectangle($xl, $yu, $xr, $yl) + { + for ($i=0; $i < $this->iLineWeight; ++$i) { + $this->_polygon(array($xl+$i,$yu+$i,$xr-$i,$yu+$i, + $xr-$i,$yl-$i,$xl+$i,$yl-$i, + $xl+$i,$yu+$i)); + } + } + + public function _filledRectangle($xl, $yu, $xr, $yl) + { + $this->_filledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl)); + } + + public function _setColor($aColor) + { + $this->iCurrentColor = $this->iRGB->Allocate($aColor); } public function AddMix($aGraph, $x=0, $y=0, $mix=100, $fx=0, $fy=0, $w=0, $h=0) { $this->_gdImgHandle($aGraph->Stroke(_IMG_HANDLER), $x, $y, $fx=0, $fy=0, $w, $h, $mix); } - + public function Add($aGraph, $x=0, $y=0, $fx=0, $fy=0, $w=0, $h=0) { $this->_gdImgHandle($aGraph->Stroke(_IMG_HANDLER), $x, $y, $fx=0, $fy=0, $w, $h); @@ -224,74 +291,92 @@ class MGraph $this->expired = $aFlg; } + // Generate image header + public function Headers() + { + + // In case we are running from the command line with the client version of + // PHP we can't send any headers. + $sapi = php_sapi_name(); + if ($sapi == 'cli') { + return; + } + + if (headers_sent()) { + echo "
JpGraph Error: +HTTP headers have already been sent.
Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it's image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).

Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser.

For example it is a common mistake to leave a blank line before the opening \"<?php\".

"; + + die(); + } + + if ($this->expired) { + header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . "GMT"); + header("Cache-Control: no-cache, must-revalidate"); + header("Pragma: no-cache"); + } + header("Content-type: image/$this->img_format"); + } + public function SetImgFormat($aFormat, $aQuality=75) { - $this->image_format = $aFormat; $this->image_quality = $aQuality; - } - - // Set the shadow around the whole image - public function SetShadow($aShowShadow=true, $aShadowWidth=4, $aShadowColor='gray@0.3') - { - $this->doshadow = $aShowShadow; - $this->shadow_color = $aShadowColor; - $this->shadow_width = $aShadowWidth; - $this->footer->iBottomMargin += $aShadowWidth; - $this->footer->iRightMargin += $aShadowWidth; - } - - public function StrokeTitle($image, $w, $h) - { - // Stroke title - if ($this->title->t !== '') { - $margin = 3; - - $y = $this->title->margin; - if ($this->title->halign == 'center') { - $this->title->Center(0, $w, $y); - } elseif ($this->title->halign == 'left') { - $this->title->SetPos($this->title->margin+2, $y); - } elseif ($this->title->halign == 'right') { - $indent = 0; - if ($this->doshadow) { - $indent = $this->shadow_width+2; - } - $this->title->SetPos($w-$this->title->margin-$indent, $y, 'right'); + $aFormat = strtolower($aFormat); + $tst = true; + $supported = imagetypes(); + if ($aFormat=="auto") { + if ($supported & IMG_PNG) { + $this->img_format="png"; + } elseif ($supported & IMG_JPG) { + $this->img_format="jpeg"; + } elseif ($supported & IMG_GIF) { + $this->img_format="gif"; + } else { + JpGraphError::RaiseL(12008); } - $this->title->Stroke($image); - - // ... and subtitle - $y += $this->title->GetTextHeight($image) + $margin + $this->subtitle->margin; - if ($this->subtitle->halign == 'center') { - $this->subtitle->Center(0, $w, $y); - } elseif ($this->subtitle->halign == 'left') { - $this->subtitle->SetPos($this->subtitle->margin+2, $y); - } elseif ($this->subtitle->halign == 'right') { - $indent = 0; - if ($this->doshadow) { - $indent = $this->shadow_width+2; + //(" Your PHP (and GD-lib) installation does not appear to support any known graphic formats.". + return true; + } else { + if ($aFormat=="jpeg" || $aFormat=="png" || $aFormat=="gif") { + if ($aFormat=="jpeg" && !($supported & IMG_JPG)) { + $tst=false; + } elseif ($aFormat=="png" && !($supported & IMG_PNG)) { + $tst=false; + } elseif ($aFormat=="gif" && !($supported & IMG_GIF)) { + $tst=false; + } else { + $this->img_format=$aFormat; + return true; } - $this->subtitle->SetPos($this->img->width-$this->subtitle->margin-$indent, $y, 'right'); + } else { + $tst=false; } - $this->subtitle->Stroke($image); - - // ... and subsubtitle - $y += $this->subtitle->GetTextHeight($image) + $margin + $this->subsubtitle->margin; - if ($this->subsubtitle->halign == 'center') { - $this->subsubtitle->Center(0, $w, $y); - } elseif ($this->subsubtitle->halign == 'left') { - $this->subsubtitle->SetPos($this->subsubtitle->margin+2, $y); - } elseif ($this->subsubtitle->halign == 'right') { - $indent = 0; - if ($this->doshadow) { - $indent = $this->shadow_width+2; - } - $this->subsubtitle->SetPos($w-$this->subsubtitle->margin-$indent, $y, 'right'); + if (!$tst) { + JpGraphError::RaiseL(12009, $aFormat); } - $this->subsubtitle->Stroke($image); + //(" Your PHP installation does not support the chosen graphic format: $aFormat"); } } + // Stream image to browser or to file + public function Stream($aFile="") + { + $func="image".$this->img_format; + if ($this->img_format=="jpeg" && $this->image_quality != null) { + $res = @$func($this->img, $aFile, $this->image_quality); + } else { + if ($aFile != "") { + $res = @$func($this->img, $aFile); + } else { + $res = @$func($this->img); + } + } + if (!$res) { + JpGraphError::RaiseL(12010, $aFile); + } + //("Can't create or stream image to file $aFile Check that PHP has enough permission to write a file to the current directory."); + } + public function Stroke($aFileName='') { // Find out the necessary size for the container image @@ -307,44 +392,30 @@ class MGraph $h += $this->tm+$this->bm; // User specified width,height overrides - if ($this->iWidth !== null && $this->iWidth !== 0) { + if ($this->iWidth !== null) { $w = $this->iWidth; } - if ($this->iHeight!== null && $this->iHeight !== 0) { + if ($this->iHeight!== null) { $h = $this->iHeight; } - if ($this->doshadow) { - $w += $this->shadow_width; - $h += $this->shadow_width; - } + $this->_imageCreate($w, $h); + $this->iRGB = new RGB($this->img); - $image = new Image($w, $h); - $image->SetImgFormat($this->image_format, $this->image_quality); + $this->_setcolor($this->iFillColor); + $this->_filledRectangle(0, 0, $w-1, $h-1); - if ($this->doshadow) { - $image->SetColor($this->iFrameColor); - $image->ShadowRectangle(0, 0, $w-1, $h-1, $this->iFillColor, $this->shadow_width, $this->shadow_color); - $w -= $this->shadow_width; - $h -= $this->shadow_width; - } else { - $image->SetColor($this->iFillColor); - $image->FilledRectangle(0, 0, $w-1, $h-1); - } - $image->SetExpired($this->expired); - - $this->img = $image->img; $this->_strokeBackgroundImage(); - if ($this->iDoFrame && ! $this->doshadow) { - $image->SetColor($this->iFrameColor); - $image->SetLineWeight($this->iFrameWeight); - $image->Rectangle(0, 0, $w-1, $h-1); + if ($this->iDoFrame) { + $this->_setColor($this->iFrameColor); + $this->iLineWeight=$this->iFrameWeight; + $this->_rectangle(0, 0, $w-1, $h-1); } // Copy all sub graphs to the container for ($i=0; $i < $this->iCnt; ++$i) { - $image->CopyMerge( + $this->_imageCp( $this->iGraphs[$i][0], $this->iGraphs[$i][1]+$this->lm, $this->iGraphs[$i][2]+$this->tm, @@ -352,24 +423,16 @@ class MGraph $this->iGraphs[$i][4], $this->iGraphs[$i][5], $this->iGraphs[$i][6], - -1, - -1, /* Full from width and height */ - $this->iGraphs[$i][7] + $this->iGraphs[$i][7] ); } - $this->StrokeTitle($image, $w, $h); - $this->footer->Stroke($image); - // Output image if ($aFileName == _IMG_HANDLER) { - return $image->img; + return $this->img; } else { - //Finally stream the generated picture - $this->cache = new ImgStreamCache(); - $this->cache->PutAndStream($image, $this->cache_name, $this->inline, $aFileName); + $this->Headers(); + $this->Stream($aFileName); } } } - -// EOF diff --git a/onyx2/include/jpgraph/jpgraph_pie.php b/onyx2/include/jpgraph/jpgraph_pie.php index 9df26d9..4ea8bf5 100644 --- a/onyx2/include/jpgraph/jpgraph_pie.php +++ b/onyx2/include/jpgraph/jpgraph_pie.php @@ -1,21 +1,21 @@ array(136,34,40,45,46,62,63,134,74,10,120,136,141,168,180,77,209,218,346,395,89,430), - "pastel" => array(27,415,128,59,66,79,105,110,42,147,152,230,236,240,331,337,405,38), - "water" => array(8,370,24,40,335,56,213,237,268,14,326,387,10,388), - "sand" => array(27,168,34,170,19,50,65,72,131,209,46,393)); + "earth" => array(136,34,40,45,46,62,63,134,74,10,120,136,141,168,180,77,209,218,346,395,89,430), + "pastel" => array(27,415,128,59,66,79,105,110,42,147,152,230,236,240,331,337,405,38), + "water" => array(8,370,24,40,335,56,213,237,268,14,326,387,10,388), + "sand" => array(27,168,34,170,19,50,65,72,131,209,46,393)); + protected $theme="earth"; protected $setslicecolors=array(); protected $labeltype=0; // Default to percentage protected $pie_border=true; @@ -69,14 +67,14 @@ class PiePlot protected $iGuideVFactor=1.4; protected $iGuideLineRFactor=0.8; protected $la = array(); // Holds the exact angle for each label - + //--------------- // CONSTRUCTOR - public function __construct($data) + public function PiePlot($data) { $this->data = array_reverse($data); $this->title = new Text(""); - $this->title->SetFont(FF_DEFAULT, FS_BOLD); + $this->title->SetFont(FF_FONT1, FS_BOLD); $this->value = new DisplayValue(); $this->value->Show(); $this->value->SetFormat('%.1f%%'); @@ -110,12 +108,12 @@ class PiePlot { $this->color = $aColor; } - + public function SetSliceColors($aColors) { $this->setslicecolors = $aColors; } - + public function SetShadow($aColor='darkgray', $aDropWidth=4) { $this->ishadowcolor = $aColor; @@ -132,7 +130,7 @@ class PiePlot $this->csimalts=array_reverse($aAlts); } } - + public function GetCSIMareas() { return $this->csimareas; @@ -167,7 +165,7 @@ class PiePlot $xp = floor(($radius*cos($ea))+$xc); $yp = floor($yc-$radius*sin($ea)); $coords.= ", $xp, $yp"; - + //add coordinates every 0.2 radians $a=$ea+0.2; @@ -190,7 +188,7 @@ class PiePlot $coords.= ", $xp, $yp"; $a += 0.2; } - + //Add the last point on the arc $xp = floor($radius*cos($sa)+$xc); $yp = floor($yc-$radius*sin($sa)); @@ -209,20 +207,16 @@ class PiePlot } } - + public function SetTheme($aTheme) { -// JpGraphError::RaiseL(15012,$aTheme); -// return; - if (in_array($aTheme, array_keys($this->themearr))) { $this->theme = $aTheme; - $this->is_using_plot_theme = true; } else { - JpGraphError::RaiseL(15001, $aTheme);//("PiePLot::SetTheme() Unknown theme: $aTheme"); - } + JpGraphError::RaiseL(15001, $aTheme); + }//("PiePLot::SetTheme() Unknown theme: $aTheme"); } - + public function ExplodeSlice($e, $radius=20) { if (! is_integer($e)) { @@ -251,14 +245,15 @@ class PiePlot if ($aStart < 0 || $aStart > 360) { JpGraphError::RaiseL(15004);//('Slice start angle must be between 0 and 360 degrees.'); } - if ($aStart == 0) { - $this->startangle = 0; - } else { - $this->startangle = 360-$aStart; - $this->startangle *= M_PI/180; - } + $this->startangle = 360-$aStart; + $this->startangle *= M_PI/180; } - + + public function SetFont($family, $style=FS_NORMAL, $size=10) + { + JpGraphError::RaiseL(15005);//('PiePlot::SetFont() is deprecated. Use PiePlot->value->SetFont() instead.'); + } + // Size in percentage public function SetSize($aSize) { @@ -269,7 +264,13 @@ class PiePlot } //("PiePlot::SetSize() Radius for pie must either be specified as a fraction [0, 0.5] of the size of the image or as an absolute size in pixels in the range [10, 1000]"); } - + + public function SetFontColor($aColor) + { + JpGraphError::RaiseL(15007); + //('PiePlot::SetFontColor() is deprecated. Use PiePlot->value->SetColor() instead.'); + } + // Set label arrays public function SetLegends($aLegend) { @@ -287,15 +288,15 @@ class PiePlot { $this->ilabelposadj=$aLblPosAdj; } - + // Should we display actual value or percentage? - public function SetLabelType($aType) + public function SetLabelType($t) { - if ($aType < 0 || $aType > 2) { - JpGraphError::RaiseL(15008, $aType); + if ($t < 0 || $t > 2) { + JpGraphError::RaiseL(15008, $t); } //("PiePlot::SetLabelType() Type for pie plots must be 0 or 1 (not $t)."); - $this->labeltype = $aType; + $this->labeltype=$t; } // Deprecated. @@ -310,7 +311,7 @@ class PiePlot $this->pie_border = $exterior; $this->pie_interior_border = $interior; } - + // Setup the legends public function Legend($graph) { @@ -331,7 +332,7 @@ class PiePlot $this->setslicecolors = array_reverse($this->setslicecolors); } } - + $sum=0; for ($i=0; $i < $n; ++$i) { $sum += $this->data[$i]; @@ -344,16 +345,14 @@ class PiePlot // Make sure we don't plot more values than data points // (in case the user added more legends than data points) - $legendsCount = is_array($this->legends) ? count($this->legends) : 0; - $n = min($legendsCount, count($this->data)); + $n = min(count($this->legends), count($this->data)); if ($this->legends != "") { $this->legends = array_reverse(array_slice($this->legends, 0, $n)); } for ($i=$n-1; $i >= 0; --$i) { $l = $this->legends[$i]; // Replace possible format with actual values - $count = is_array($this->csimalts) ? count($this->csimalts) : 0; - if ($count > $i) { + if (count($this->csimalts) > $i) { $fmt = $this->csimalts[$i]; } else { $fmt = "%d"; // Deafult Alt if no other has been specified @@ -376,15 +375,13 @@ class PiePlot } if ($this->setslicecolors==null) { - $csimtarget = isset($this->csimtargets[$i]) ? $this->csimtargets[$i] : null; - $graph->legend->Add($l, $colors[$ta[$i%$numcolors]], "", 0, $csimtarget, $alt, $wintarg); + $graph->legend->Add($l, $colors[$ta[$i%$numcolors]], "", 0, $this->csimtargets[$i], $alt, $wintarg); } else { - $csimtarget = isset($this->csimtargets[$i]) ? $this->csimtargets[$i] : null; - $graph->legend->Add($l, $this->setslicecolors[$i%$numcolors], "", 0, $csimtarget, $alt, $wintarg); + $graph->legend->Add($l, $this->setslicecolors[$i%$numcolors], "", 0, $this->csimtargets[$i], $alt, $wintarg); } } } - + // Adjust the rounded percetage value so that the sum of // of the pie slices are always 100% // Using the Hare/Niemeyer method @@ -398,7 +395,7 @@ class PiePlot $mul=10000; } } - + $tmp = array(); $result = array(); $quote_sum=0; @@ -444,7 +441,7 @@ class PiePlot // aaoption == 1 just the body // aaoption == 2 just the values - // Explode scaling. If anti alias we scale the image + // Explode scaling. If anti anti alias we scale the image // twice and we also need to scale the exploding distance $expscale = $aaoption === 1 ? 2 : 1; @@ -453,15 +450,11 @@ class PiePlot $this->adjusted_data = $this->AdjPercentage($this->data); } - if ($this->use_plot_theme_colors) { - $this->setslicecolors = null; - } - $colors = array_keys($img->rgb->rgb_table); sort($colors); $ta=$this->themearr[$this->theme]; $n = count($this->data); - + if ($this->setslicecolors==null) { $numcolors=count($ta); } else { @@ -483,12 +476,12 @@ class PiePlot for ($i=0; $i < $n; ++$i) { $sum += $this->data[$i]; } - + // Bail out with error if the sum is 0 if ($sum==0) { - JpGraphError::RaiseL(15009);//("Sum of all data is 0 for Pie."); - } - + JpGraphError::RaiseL(15009); + }//("Sum of all data is 0 for Pie."); + // Set up the pie-circle if ($this->radius <= 1) { $radius = floor($this->radius*min($img->width, $img->height)); @@ -501,13 +494,13 @@ class PiePlot } else { $xc = $this->posx ; } - + if ($this->posy <= 1 && $this->posy > 0) { $yc = round($this->posy*$img->height); } else { $yc = $this->posy ; } - + $n = count($this->data); if ($this->explode_all) { @@ -539,7 +532,7 @@ class PiePlot $xcm = $xc + $this->explode_radius[$j]*cos($la)*$expscale; $ycm = $yc - $this->explode_radius[$j]*sin($la)*$expscale; - + $xcm += $this->ishadowdrop*$expscale; $ycm += $this->ishadowdrop*$expscale; @@ -557,7 +550,8 @@ class PiePlot $radius-1, $angle1*180/M_PI, $angle2*180/M_PI, - $this->ishadowcolor + $slicecolor, + $arccolor ); } } @@ -576,7 +570,7 @@ class PiePlot // There are n slices in total for ($i=0; $sum>0 && $i < $n; ++$i) { - // $j is the actual index used for the slice + // $j is the actual index used for the slice $j = $n-$i-1; // Make sure we havea valid distance to explode the slice @@ -599,18 +593,19 @@ class PiePlot // We avoid some trouble by not allowing end angle to be 0, in that case // we translate to 360 + // la is used to hold the label angle, which is centered on the slice if ($angle2 < 0.0001 && $angle1 > 0.0001) { $this->la[$i] = 2*M_PI - (abs(2*M_PI-$angle1)/2.0+$angle1); - } elseif ($angle1 > $angle2) { - // The case where the slice crosses the 3 a'clock line - // Remember that the slices are counted clockwise and - // labels are counted counter clockwise so we need to revert with 2 PI - $this->la[$i] = 2*M_PI-$this->NormAngle($angle1 + ((2*M_PI - $angle1)+$angle2)/2); } else { $this->la[$i] = 2*M_PI - (abs($angle2-$angle1)/2.0+$angle1); } + $_sa = round($angle1*180/M_PI); + $_ea = round($angle2*180/M_PI); + $_la = round($this->la[$i]*180/M_PI); + //echo "ang1=$_sa , ang2=$_ea - la=$_la
"; + // Too avoid rounding problems we skip the slice if it is too small if ($d < 0.00001) { continue; @@ -623,13 +618,7 @@ class PiePlot } else { $slicecolor=$this->setslicecolors[$i%$numcolors]; } - -// $_sa = round($angle1*180/M_PI); -// $_ea = round($angle2*180/M_PI); -// $_la = round($this->la[$i]*180/M_PI); -// echo "Slice#$i: ang1=$_sa , ang2=$_ea, la=$_la, color=$slicecolor
"; - - + // If we have enabled antialias then we don't draw any border so // make the bordedr color the same as the slice color if ($this->pie_interior_border && $aaoption===0) { @@ -652,11 +641,12 @@ class PiePlot $_ea = round($angle2*180/M_PI); $_la = round($this->la[$i]*180/M_PI); //echo "[$i] sa=$_sa, ea=$_ea, la[$i]=$_la, (color=$slicecolor)
"; + // The CakeSlice method draws a full circle in case of start angle = end angle - // for pie slices we want this in case the slice have a value larger than 99% of the - // total sum - if (abs($_ea-$_sa) >= 1 || $d == $sum) { + // for pie slices we don't want this behaviour unless we only have one + // slice in the pie in case it is the wanted behaviour + if (abs($_ea-$_sa) > 0.1 || $n==1) { $img->CakeSlice($xcm, $ycm, $radius-1, $radius-1, $_sa, $_ea, $slicecolor, $arccolor); } } @@ -741,16 +731,16 @@ class PiePlot $n = count($this->labels); //----------------------------------------------------------------------- - // Step 1 of the algorithm is to construct a number of clusters - // a cluster is defined as all slices within the same quadrant (almost) - // that has an angular distance less than the treshold - //----------------------------------------------------------------------- - $tresh_hold=25 * M_PI/180; // 25 degrees difference to be in a cluster - $incluster=false; // flag if we are currently in a cluster or not - $clusters = array(); // array of clusters - $cidx=-1; // running cluster index + // Step 1 of the algorithm is to construct a number of clusters + // a cluster is defined as all slices within the same quadrant (almost) + // that has an angular distance less than the treshold + //----------------------------------------------------------------------- + $tresh_hold=25 * M_PI/180; // 25 degrees difference to be in a cluster + $incluster=false; // flag if we are currently in a cluster or not + $clusters = array(); // array of clusters + $cidx=-1; // running cluster index - // Go through all the labels and construct a number of clusters + // Go through all the labels and construct a number of clusters for ($i=0; $i < $n-1; ++$i) { // Calc the angle distance between two consecutive slices $a1=$this->la[$i]; @@ -797,7 +787,7 @@ class PiePlot $clusters[$cidx][1]++; $i++; } - + $incluster = false; } } elseif ($q1 == $q2) { @@ -807,8 +797,8 @@ class PiePlot // cluster. If we don't do this then we risk that the label // for the cluster of one will cross the guide-line if ($q1 == 0 && $cidx > -1 && - $clusters[$cidx][1] == 1 && - $this->Quadrant($this->la[$clusters[$cidx][0]]) == 0) { + $clusters[$cidx][1] == 1 && + $this->Quadrant($this->la[$clusters[$cidx][0]]) == 0) { $clusters[$cidx][1]++; } else { $cidx++; @@ -844,18 +834,18 @@ class PiePlot } /* - if( true ) { - // Debug printout in labels - for( $i=0; $i <= $cidx; ++$i ) { - for( $j=0; $j < $clusters[$i][1]; ++$j ) { - $a = $this->la[$clusters[$i][0]+$j]; - $aa = round($a*180/M_PI); - $q = $this->Quadrant($a); - $this->labels[$clusters[$i][0]+$j]="[$q:$aa] $i:$j"; - } - } - } - */ + if( true ) { + // Debug printout in labels + for( $i=0; $i <= $cidx; ++$i ) { + for( $j=0; $j < $clusters[$i][1]; ++$j ) { + $a = $this->la[$clusters[$i][0]+$j]; + $aa = round($a*180/M_PI); + $q = $this->Quadrant($a); + $this->labels[$clusters[$i][0]+$j]="[$q:$aa] $i:$j"; + } + } + } + */ //----------------------------------------------------------------------- // Step 2 of the algorithm is use the clusters and draw the labels @@ -875,7 +865,7 @@ class PiePlot // Walk through all the clusters for ($i=0; $i < $nc; ++$i) { - // Start angle and number of slices in this cluster + // Start angle and number of slices in this cluster $csize = $clusters[$i][1]; $a = $this->la[$clusters[$i][0]]; $q = $this->Quadrant($a); @@ -911,12 +901,12 @@ class PiePlot // Now adjust the position of the labels in each cluster starting // with the slice that is closest to the equator of the pie $a = $this->la[$clusters[$i][0]+$idx]; - + // Guide line start in the center of the arc of the slice $r = $radius+$this->explode_radius[$n-1-($clusters[$i][0]+$idx)]; $x = round($r*cos($a)+$xc); $y = round($yc-$r*sin($a)); - + // The distance from the arc depends on chosen font and the "R-Factor" $r += $fh*$this->iGuideLineRFactor; @@ -1033,7 +1023,7 @@ class PiePlot public function StrokeLabel($label, $img, $xc, $yc, $a, $r) { - // Default value + // Default value if ($this->ilabelposadj === 'auto') { $this->ilabelposadj = 0.65; } @@ -1043,16 +1033,16 @@ class PiePlot if ($this->ilabelposadj < 1.0) { $this->value->SetAlign('center', 'center'); $this->value->margin = 0; - + $xt=round($this->ilabelposadj*$r*cos($a)+$xc); $yt=round($yc-$this->ilabelposadj*$r*sin($a)); - + $this->value->Stroke($img, $label, $xt, $yt); } else { $this->value->halign = "left"; $this->value->valign = "top"; $this->value->margin = 0; - + // Position the axis title. // dx, dy is the offset from the top left corner of the bounding box that sorrounds the text // that intersects with the extension of the corresponding axis. The code looks a little @@ -1075,7 +1065,7 @@ class PiePlot if ($this->ilabelposadj > 1.0 && $this->ilabelposadj < 5.0) { $r *= $this->ilabelposadj; } - + $r += $img->GetFontHeight()/1.5; $xt=round($r*cos($a)+$xc); @@ -1101,7 +1091,7 @@ class PiePlot if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { $dx=(1-($a-M_PI*5/4)*2/M_PI); } - + if ($a>=7*M_PI/4) { $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; } @@ -1117,15 +1107,10 @@ class PiePlot if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { $dy=0; } - + $this->value->Stroke($img, $label, $xt-$dx*$w, $yt-$dy*$h); } } - - public function UsePlotThemeColors($flag = true) - { - $this->use_plot_theme_colors = $flag; - } } // Class @@ -1136,16 +1121,16 @@ class PiePlot //=================================================== class PiePlotC extends PiePlot { - private $imidsize=0.5; // Fraction of total width + private $imidsize=0.5; // Fraction of total width private $imidcolor='white'; public $midtitle=''; private $middlecsimtarget=''; private $middlecsimwintarget=''; private $middlecsimalt=''; - public function __construct($data, $aCenterTitle='') + public function PiePlotC($data, $aCenterTitle='') { - parent::__construct($data); + parent::PiePlot($data); $this->midtitle = new Text(); $this->midtitle->ParagraphAlign('center'); } @@ -1204,7 +1189,7 @@ class PiePlotC extends PiePlot $xp = floor(($this->imidsize*$radius*cos($ea))+$xc); $yp = floor($yc-($this->imidsize*$radius*sin($ea))); $coords = "$xp, $yp"; - + //add coordinates every 0.25 radians $a=$ea+0.25; @@ -1245,7 +1230,7 @@ class PiePlotC extends PiePlot $coords.= ", $xp, $yp"; $a -= 0.25; } - + //Add the last point on the arc $xp = floor($radius*cos($ea)+$xc); $yp = floor($yc-$radius*sin($ea)); @@ -1258,7 +1243,7 @@ class PiePlotC extends PiePlot if (!empty($this->csimtargets[$i])) { $this->csimareas .= "csimtargets[$i]."\""; + $this->csimtargets[$i]."\""; if (!empty($this->csimwintargets[$i])) { $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; } @@ -1274,7 +1259,7 @@ class PiePlotC extends PiePlot public function Stroke($img, $aaoption=0) { - // Stroke the pie but don't stroke values + // Stroke the pie but don't stroke values $tmp = $this->value->show; $this->value->show = false; parent::Stroke($img, $aaoption); @@ -1358,16 +1343,12 @@ class PieGraph extends Graph public $pieaa = false ; //--------------- // CONSTRUCTOR - public function __construct($width=300, $height=200, $cachedName="", $timeout=0, $inline=1) + public function PieGraph($width=300, $height=200, $cachedName="", $timeout=0, $inline=1) { - parent::__construct($width, $height, $cachedName, $timeout, $inline); + $this->Graph($width, $height, $cachedName, $timeout, $inline); $this->posx=$width/2; $this->posy=$height/2; $this->SetColor(array(255,255,255)); - - if ($this->graph_theme) { - $this->graph_theme->ApplyGraph($this); - } } //--------------- @@ -1388,32 +1369,19 @@ class PieGraph extends Graph if (is_array($aObj)) { $n = count($aObj); for ($i=0; $i < $n; ++$i) { - //if ($aObj[$i]->theme) { - // $this->ClearTheme(); - //} $this->plots[] = $aObj[$i]; } } else { - //if ($aObj->theme) { - // $this->ClearTheme(); - //} $this->plots[] = $aObj; } } - - if ($this->graph_theme) { - $this->graph_theme->SetupPlot($aObj); - if ($aObj->is_using_plot_theme) { - $aObj->UsePlotThemeColors(); - } - } } public function SetAntiAliasing($aFlg=true) { $this->pieaa = $aFlg; } - + public function SetColor($c) { $this->SetMarginColor($c); @@ -1426,8 +1394,7 @@ class PieGraph extends Graph foreach ($this->plots as $p) { $csim .= $p->GetCSIMareas(); } - - $csim.= $this->legend->GetCSIMareas(); + //$csim.= $this->legend->GetCSIMareas(); if (preg_match_all("/area shape=\"(\w+)\" coords=\"([0-9\, ]+)\"/", $csim, $coords)) { $this->img->SetColor($this->csimcolor); $n = count($coords[0]); @@ -1454,7 +1421,6 @@ class PieGraph extends Graph // Method description public function Stroke($aStrokeFileName="") { - // If the filename is the predefined value = '_csim_special_' // we assume that the call to stroke only needs to do enough // to correctly generate the CSIM maps. @@ -1464,12 +1430,6 @@ class PieGraph extends Graph // code below. $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - // If we are called the second time (perhaps the user has called GetHTMLImageMap() - // himself then the legends have alsready been populated once in order to get the - // CSIM coordinats. Since we do not want the legends to be populated a second time - // we clear the legends - $this->legend->Clear(); - // We need to know if we have stroked the plot in the // GetCSIMareas. Otherwise the CSIM hasn't been generated // and in the case of GetCSIM called before stroke to generate @@ -1494,7 +1454,7 @@ class PieGraph extends Graph $oldimg = $this->img->img; $this->img->CreateImgCanvas(2*$w, 2*$h); - + $this->img->SetColor($this->margin_color); $this->img->FilledRectangle(0, 0, 2*$w-1, 2*$h-1); @@ -1560,7 +1520,6 @@ class PieGraph extends Graph $this->StrokeFrameBackground(); } else { $this->StrokeFrame(); - $this->StrokeBackgroundGrad(); } } @@ -1578,7 +1537,7 @@ class PieGraph extends Graph if (!$_csim) { - // Stroke texts + // Stroke texts if ($this->texts != null) { $n = count($this->texts); for ($i=0; $i < $n; ++$i) { @@ -1596,7 +1555,7 @@ class PieGraph extends Graph require_once('jpgraph_imgtrans.php'); //JpGraphError::Raise('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.'); } - + $tform = new ImgTrans($this->img->img); $this->img->img = $tform->Skew3D( $this->iImgTransHorizon, diff --git a/onyx2/include/jpgraph/jpgraph_pie3d.php b/onyx2/include/jpgraph/jpgraph_pie3d.php index 955e995..9bc2bfe 100644 --- a/onyx2/include/jpgraph/jpgraph_pie3d.php +++ b/onyx2/include/jpgraph/jpgraph_pie3d.php @@ -1,13 +1,13 @@ radius = 0.5; $this->data = $data; @@ -38,7 +39,7 @@ class PiePlot3D extends PiePlot //--------------- // PUBLIC METHODS - + // Set label arrays public function SetLegends($aLegend) { @@ -71,14 +72,22 @@ class PiePlot3D extends PiePlot $this->edgeweight = $aWeight; } + // Dummy function to make Pie3D behave in a similair way to 2D + public function ShowBorder($exterior=true, $interior=true) + { + JpGraphError::RaiseL(14001); + //('Pie3D::ShowBorder() . Deprecated function. Use Pie3D::SetEdge() to control the edges around slices.'); + } + // Specify projection angle for 3D in degrees // Must be between 20 and 70 degrees public function SetAngle($a) { if ($a<5 || $a>90) { JpGraphError::RaiseL(14002); + } //("PiePlot3D::SetAngle() 3D Pie projection angle must be between 5 and 85 degrees."); - } else { + else { $this->angle = $a; } } @@ -102,7 +111,7 @@ class PiePlot3D extends PiePlot $yp = floor($yp+$thick); $coords.= ", $xp, $yp"; } - + //add coordinates every 0.2 radians $a=$sa+0.2; while ($a<$ea) { @@ -115,7 +124,7 @@ class PiePlot3D extends PiePlot $coords.= ", $xp, $yp"; $a += 0.2; } - + //Add the last point on the arc $xp = floor($width*cos($ea)/2+$xc); $yp = floor($yc-$height*sin($ea)/2); @@ -129,11 +138,11 @@ class PiePlot3D extends PiePlot if (!empty($this->csimtargets[$i])) { $this->csimareas .= "csimtargets[$i]."\""; - + if (!empty($this->csimwintargets[$i])) { $this->csimareas .= " target=\"".$this->csimwintargets[$i]."\" "; } - + if (!empty($this->csimalts[$i])) { $tmp=sprintf($this->csimalts[$i], $this->data[$i]); $this->csimareas .= "alt=\"$tmp\" title=\"$tmp\" "; @@ -148,19 +157,19 @@ class PiePlot3D extends PiePlot $this->ilabelposadj=$aLblPosAdj; } - + // Distance from the pie to the labels public function SetLabelMargin($m) { $this->value->SetMargin($m); } - + // Show a thin line from the pie to the label for a specific slice public function ShowLabelHint($f=true) { $this->showlabelhint=$f; } - + // Set color of hint line to label for each slice public function SetLabelHintColor($c) { @@ -197,13 +206,13 @@ class PiePlot3D extends PiePlot return $a; } - + // Draw one 3D pie slice at position ($xc,$yc) with height $z public function Pie3DSlice($img, $xc, $yc, $w, $h, $sa, $ea, $z, $fillcolor, $shadow=0.65) { - - // Due to the way the 3D Pie algorithm works we are + + // Due to the way the 3D Pie algorithm works we are // guaranteed that any slice we get into this method // belongs to either the left or right side of the // pie ellipse. Hence, no slice will cross 90 or 270 @@ -216,9 +225,9 @@ class PiePlot3D extends PiePlot $p[] = array(); // Setup pre-calculated values - $rsa = $sa/180*M_PI; // to Rad - $rea = $ea/180*M_PI; // to Rad - $sinsa = sin($rsa); + $rsa = $sa/180*M_PI; // to Rad + $rea = $ea/180*M_PI; // to Rad + $sinsa = sin($rsa); $cossa = cos($rsa); $sinea = sin($rea); $cosea = cos($rea); @@ -237,7 +246,7 @@ class PiePlot3D extends PiePlot } $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cossa,$z+$yc-$h*$sinsa); + $xc+$w*$cossa,$z+$yc-$h*$sinsa); $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); for ($a=$rsa; $a < 2*M_PI; $a += $step) { @@ -263,16 +272,16 @@ class PiePlot3D extends PiePlot $pt[] = $xc + $w*cos($a); $pt[] = $yc - $h*sin($a); } - + $pt[] = $xc+$w*$cosea; $pt[] = $yc-$h*$sinea; $pt[] = $xc; $pt[] = $yc; } else { $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cossa,$z+$yc-$h*$sinsa); + $xc+$w*$cossa,$z+$yc-$h*$sinsa); $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); - + $rea = $rea == 0.0 ? 2*M_PI : $rea; for ($a=$rsa; $a < $rea; $a += $step) { $tca = cos($a); @@ -287,7 +296,7 @@ class PiePlot3D extends PiePlot $pt[] = $yc-$h*$sinea; $pt[] = $xc; $pt[] = $yc; - + $p[] = $xc+$w*$cosea; $p[] = $z+$yc-$h*$sinea; $p[] = $xc+$w*$cosea; @@ -298,7 +307,7 @@ class PiePlot3D extends PiePlot } elseif ($sa >= 180) { $p = array($xc,$yc,$xc,$yc+$z,$xc+$w*$cosea,$z+$yc-$h*$sinea); $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); - + for ($a=$rea; $a>$rsa; $a -= $step) { $tca = cos($a); $tsa = sin($a); @@ -312,7 +321,7 @@ class PiePlot3D extends PiePlot $pt[] = $yc-$h*$sinsa; $pt[] = $xc; $pt[] = $yc; - + $p[] = $xc+$w*$cossa; $p[] = $z+$yc-$h*$sinsa; $p[] = $xc+$w*$cossa; @@ -356,9 +365,9 @@ class PiePlot3D extends PiePlot $pt[] = $yc; } else { // $sa >= 90 && $ea <= 180 $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cosea,$z+$yc-$h*$sinea, - $xc+$w*$cosea,$yc-$h*$sinea, - $xc,$yc); + $xc+$w*$cosea,$z+$yc-$h*$sinea, + $xc+$w*$cosea,$yc-$h*$sinea, + $xc,$yc); $pt = array($xc,$yc,$xc+$w*$cosea,$yc-$h*$sinea); @@ -375,9 +384,9 @@ class PiePlot3D extends PiePlot } else { // sa > 0 && ea < 90 $p = array($xc,$yc,$xc,$yc+$z, - $xc+$w*$cossa,$z+$yc-$h*$sinsa, - $xc+$w*$cossa,$yc-$h*$sinsa, - $xc,$yc); + $xc+$w*$cossa,$z+$yc-$h*$sinsa, + $xc+$w*$cossa,$yc-$h*$sinsa, + $xc,$yc); $pt = array($xc,$yc,$xc+$w*$cossa,$yc-$h*$sinsa); @@ -391,7 +400,7 @@ class PiePlot3D extends PiePlot $pt[] = $xc; $pt[] = $yc; } - + $img->PushColor($fillcolor.":".$shadow); $img->FilledPolygon($p); $img->PopColor(); @@ -408,7 +417,7 @@ class PiePlot3D extends PiePlot } $this->startangle = $aStart; } - + // Draw a 3D Pie public function Pie3D( $aaoption, @@ -426,7 +435,7 @@ class PiePlot3D extends PiePlot $edgeweight=1 ) { - //--------------------------------------------------------------------------- + //--------------------------------------------------------------------------- // As usual the algorithm get more complicated than I originally // envisioned. I believe that this is as simple as it is possible // to do it with the features I want. It's a good exercise to start @@ -462,7 +471,7 @@ class PiePlot3D extends PiePlot // slice. Not a major problem though. //--------------------------------------------------------------------------- - + // Determine the height of the ellippse which gives an // indication of the inclination angle $h = ($angle/90.0)*$d; @@ -470,7 +479,7 @@ class PiePlot3D extends PiePlot for ($i=0; $iexplode_radius[$i]*cos($la*M_PI/180)*$expscale, - $yc - $this->explode_radius[$i]*sin($la*M_PI/180) * ($h/$d) *$expscale ); + $yc - $this->explode_radius[$i]*sin($la*M_PI/180) * ($h/$d) *$expscale ); $adjexplode[$idx] = $explode; $labeldata[$i] = array($la,$explode[0],$explode[1]); $originalangles[$i] = array($a,$a+$da); @@ -513,15 +522,15 @@ class PiePlot3D extends PiePlot $ne = $this->NormAngle($a+$da); if ($da <= 180) { // If the slice size is <= 90 it can at maximum cut across - // one boundary (either 90 or 270) where it needs to be split - $split=-1; // no split - if (($da<=90 && ($a <= 90 && $ne > 90)) || - (($da <= 180 && $da >90) && (($a < 90 || $a >= 270) && $ne > 90))) { - $split = 90; - } elseif (($da<=90 && ($a <= 270 && $ne > 270)) || + // one boundary (either 90 or 270) where it needs to be split + $split=-1; // no split + if (($da<=90 && ($a <= 90 && $ne > 90)) || + (($da <= 180 && $da >90) && (($a < 90 || $a >= 270) && $ne > 90))) { + $split = 90; + } elseif (($da<=90 && ($a <= 270 && $ne > 270)) || (($da<=180 && $da>90) && ($a >= 90 && $a < 270 && ($a+$da) > 270))) { - $split = 270; - } + $split = 270; + } if ($split > 0) { // split in two $angles[$idx] = array($a,$split); $adjcolors[$idx] = $colors[$i % $numcolors]; @@ -565,7 +574,9 @@ class PiePlot3D extends PiePlot // c) If start is > 270 (hence the firstr split is at 90) // and the slice is so large that it goes all the way // around 270. - if (($a < 90 && ($a+$da > 270)) || ($a > 90 && $a<=270 && ($a+$da>360+90)) || ($a > 270 && $this->NormAngle($a+$da)>270)) { + if (($a < 90 && ($a+$da > 270)) || + ($a > 90 && $a<=270 && ($a+$da>360+90)) || + ($a > 270 && $this->NormAngle($a+$da)>270)) { $angles[++$idx] = array($split,360-$split); $adjcolors[$idx] = $colors[$i % $numcolors]; $adjexplode[$idx] = $explode; @@ -621,10 +632,10 @@ class PiePlot3D extends PiePlot // Step 3. Print slices in z-order // $cnt = 0; - + // First stroke all the slices between 90 and 270 (left half circle) // counterclockwise - + while ($angles[$j][0] < 270 && $aaoption !== 2) { list($x, $y) = $adjexplode[$j]; @@ -640,7 +651,7 @@ class PiePlot3D extends PiePlot $adjcolors[$j], $shadow ); - + $last = array($x,$y,$j); $j++; @@ -653,14 +664,14 @@ class PiePlot3D extends PiePlot } ++$cnt; } - + $slice_left = $n-$cnt; $j=$start-1; if ($j<0) { $j=$n-1; } $cnt = 0; - + // The stroke all slices from 90 to -90 (right half circle) // clockwise while ($cnt < $slice_left && $aaoption !== 2) { @@ -688,7 +699,7 @@ class PiePlot3D extends PiePlot } $cnt++; } - + // Now do a special thing. Stroke the last slice on the left // halfcircle one more time. This is needed in the case where // the slice close to 270 have been exploded. In that case the @@ -739,7 +750,7 @@ class PiePlot3D extends PiePlot } $this->StrokeLabels($l, $img, $labeldata[$i][0]*M_PI/180, $x, $y, $z); - + $this->Add3DSliceToCSIM( $i, $labeldata[$i][1], @@ -770,7 +781,7 @@ class PiePlot3D extends PiePlot $idx=0; $img->PushColor($edgecolor); $img->SetLineWeight($edgeweight); - + $fulledge = true; for ($i=0; $i < count($data) && $fulledge; ++$i) { if (empty($this->explode_radius[$i])) { @@ -780,7 +791,7 @@ class PiePlot3D extends PiePlot $fulledge = false; } } - + for ($i=0; $i < count($data); ++$i, ++$idx) { $da = $data[$i]/$sum * 2*M_PI; @@ -838,15 +849,15 @@ class PiePlot3D extends PiePlot if ($sa < M_PI && $ea > M_PI) { $sa = M_PI; } - + if ($sa < 2*M_PI && (($ea >= 2*M_PI) || ($ea > 0 && $ea < $sa))) { $ea = 2*M_PI; } if ($sa >= M_PI && $ea <= 2*M_PI) { $p = array($xc + $w*cos($sa),$yc - $h*sin($sa), - $xc + $w*cos($sa),$z + $yc - $h*sin($sa)); - + $xc + $w*cos($sa),$z + $yc - $h*sin($sa)); + for ($a=$sa+$step; $a < $ea; $a += $step) { $p[] = $xc + $w*cos($a); $p[] = $z + $yc - $h*sin($a); @@ -879,20 +890,20 @@ class PiePlot3D extends PiePlot } else { $ca = $this->setslicecolors; } - + if ($this->posx <= 1 && $this->posx > 0) { $xc = round($this->posx*$img->width); } else { $xc = $this->posx ; } - + if ($this->posy <= 1 && $this->posy > 0) { $yc = round($this->posy*$img->height); } else { $yc = $this->posy ; } - + if ($this->radius <= 1) { $width = floor($this->radius*min($img->width, $img->height)); // Make sure that the pie doesn't overflow the image border @@ -912,7 +923,7 @@ class PiePlot3D extends PiePlot // pie slice width (=pie radius) but since the perspective depends // on the inclination angle we use some heuristics to make the edge // slightly thicker the less the angle. - + // Has user specified an absolute thickness? In that case use // that instead @@ -923,7 +934,6 @@ class PiePlot3D extends PiePlot $thick = $width/12; } $a = $this->angle; - if ($a <= 30) { $thick *= 1.6; } elseif ($a <= 40) { @@ -998,11 +1008,9 @@ class PiePlot3D extends PiePlot } else { $w=$img->GetTextWidth($label); } - while ($a > 2*M_PI) { $a -= 2*M_PI; } - if ($a>=7*M_PI/4 || $a <= M_PI/4) { $dx=0; } @@ -1015,7 +1023,7 @@ class PiePlot3D extends PiePlot if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { $dx=(1-($a-M_PI*5/4)*2/M_PI); } - + if ($a>=7*M_PI/4) { $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; } @@ -1031,17 +1039,17 @@ class PiePlot3D extends PiePlot if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { $dy=0; } - + $x = round($xp-$dx*$w); $y = round($yp-$dy*$h); + // Mark anchor point for debugging /* $img->SetColor('red'); $img->Line($xp-10,$yp,$xp+10,$yp); $img->Line($xp,$yp-10,$xp,$yp+10); */ - $oldmargin = $this->value->margin; $this->value->margin=0; $this->value->Stroke($img, $label, $x, $y); diff --git a/onyx2/include/jpgraph/jpgraph_plotband.php b/onyx2/include/jpgraph/jpgraph_plotband.php index 738f211..272569a 100644 --- a/onyx2/include/jpgraph/jpgraph_plotband.php +++ b/onyx2/include/jpgraph/jpgraph_plotband.php @@ -1,22 +1,22 @@ x=$aX; $this->y=$aY; @@ -52,10 +52,10 @@ class RectPattern protected $weight; protected $rect=null; protected $doframe=true; - protected $linespacing; // Line spacing in pixels + protected $linespacing; // Line spacing in pixels protected $iBackgroundColor=-1; // Default is no background fill - - public function __construct($aColor, $aWeight=1) + + public function RectPattern($aColor, $aWeight=1) { $this->color = $aColor; $this->weight = $aWeight; @@ -70,7 +70,7 @@ class RectPattern { $this->rect = $aRect; } - + public function ShowFrame($aShow=true) { $this->doframe=$aShow; @@ -119,9 +119,9 @@ class RectPattern //===================================================================== class RectPatternSolid extends RectPattern { - public function __construct($aColor="black", $aWeight=1) + public function RectPatternSolid($aColor="black", $aWeight=1) { - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); } public function DoPattern($aImg) @@ -142,12 +142,12 @@ class RectPatternSolid extends RectPattern //===================================================================== class RectPatternHor extends RectPattern { - public function __construct($aColor="black", $aWeight=1, $aLineSpacing=7) + public function RectPatternHor($aColor="black", $aWeight=1, $aLineSpacing=7) { - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); $this->linespacing = $aLineSpacing; } - + public function DoPattern($aImg) { $x0 = $this->rect->x; @@ -166,9 +166,9 @@ class RectPatternHor extends RectPattern //===================================================================== class RectPatternVert extends RectPattern { - public function __construct($aColor="black", $aWeight=1, $aLineSpacing=7) + public function RectPatternVert($aColor="black", $aWeight=1, $aLineSpacing=7) { - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); $this->linespacing = $aLineSpacing; } @@ -194,9 +194,9 @@ class RectPatternVert extends RectPattern //===================================================================== class RectPatternRDiag extends RectPattern { - public function __construct($aColor="black", $aWeight=1, $aLineSpacing=12) + public function RectPatternRDiag($aColor="black", $aWeight=1, $aLineSpacing=12) { - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); $this->linespacing = $aLineSpacing; } @@ -230,7 +230,7 @@ class RectPatternRDiag extends RectPattern $x0 += $this->linespacing; $x1 += $this->linespacing; } - + $y0=$this->rect->y + ($x0-$xe); $x0=$xe; } else { @@ -244,7 +244,7 @@ class RectPatternRDiag extends RectPattern $y1 += $this->linespacing; $y0 += $this->linespacing; } - + $diff = $y1-$ye; $y1 = $ye; $x1 = $diff + $this->rect->x; @@ -257,17 +257,17 @@ class RectPatternRDiag extends RectPattern } } } - + //===================================================================== // Class RectPatternLDiag // Implements left diagonal pattern //===================================================================== class RectPatternLDiag extends RectPattern { - public function __construct($aColor="black", $aWeight=1, $aLineSpacing=12) + public function RectPatternLDiag($aColor="black", $aWeight=1, $aLineSpacing=12) { $this->linespacing = $aLineSpacing; - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); } public function DoPattern($aImg) @@ -299,7 +299,7 @@ class RectPatternLDiag extends RectPattern $x0 += $this->linespacing; $x1 += $this->linespacing; } - + $y0=$this->rect->ye - ($x0-$xe); $x0=$xe; } else { @@ -335,9 +335,9 @@ class RectPattern3DPlane extends RectPattern // top of the band. Specifies how fast the lines // converge. - public function __construct($aColor="black", $aWeight=1) + public function RectPattern3DPlane($aColor="black", $aWeight=1) { - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); $this->SetDensity(10); // Slightly larger default } @@ -345,7 +345,7 @@ class RectPattern3DPlane extends RectPattern { $this->alpha=$aHorizon; } - + public function DoPattern($aImg) { // "Fake" a nice 3D grid-effect. @@ -395,43 +395,43 @@ class RectPattern3DPlane extends RectPattern $x0_right = $middle + $dist * $factor; $c = $apa - $d*$apa/$dist; } - + // Horizontal lines // They need some serious consideration since they are a function // of perspective depth (alpha) and density (linespacing) $x0=$this->rect->x; $x1=$this->rect->xe; $y=$this->rect->ye; - + // The first line is drawn directly. Makes the loop below slightly // more readable. $aImg->Line($x0, $y, $x1, $y); $hls = $this->linespacing; - + // A correction factor for vertical "brick" line spacing to account for // a) the difference in number of pixels hor vs vert // b) visual apperance to make the first layer of "bricks" look more // square. $vls = $this->linespacing*0.6; - + $ds = $hls*($apa-$vls)/$apa; // Get the slope for the "perspective line" going from bottom right // corner to top left corner of the "first" brick. - + // Uncomment the following lines if you want to get a visual understanding // of what this helpline does. BTW this mimics the way you would get the // perspective right when drawing on paper. /* - $x0 = $middle; - $y0 = $this->rect->ye; - $len=floor(($this->rect->ye-$this->rect->y)/$vls); - $x1 = $middle+round($len*$ds); - $y1 = $this->rect->ye-$len*$vls; - $aImg->PushColor("red"); - $aImg->Line($x0,$y0,$x1,$y1); - $aImg->PopColor(); + $x0 = $middle; + $y0 = $this->rect->ye; + $len=floor(($this->rect->ye-$this->rect->y)/$vls); + $x1 = $middle+round($len*$ds); + $y1 = $this->rect->ye-$len*$vls; + $aImg->PushColor("red"); + $aImg->Line($x0,$y0,$x1,$y1); + $aImg->PopColor(); */ - + $y -= $vls; $k=($this->rect->ye-($this->rect->ye-$vls))/($middle-($middle-$ds)); $dist = $hls; @@ -455,9 +455,9 @@ class RectPatternCross extends RectPattern { private $vert=null; private $hor=null; - public function __construct($aColor="black", $aWeight=1) + public function RectPatternCross($aColor="black", $aWeight=1) { - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); $this->vert = new RectPatternVert($aColor, $aWeight); $this->hor = new RectPatternHor($aColor, $aWeight); } @@ -497,9 +497,9 @@ class RectPatternDiagCross extends RectPattern { private $left=null; private $right=null; - public function __construct($aColor="black", $aWeight=1) + public function RectPatternDiagCross($aColor="black", $aWeight=1) { - parent::__construct($aColor, $aWeight); + parent::RectPattern($aColor, $aWeight); $this->right = new RectPatternRDiag($aColor, $aWeight); $this->left = new RectPatternLDiag($aColor, $aWeight); } @@ -536,41 +536,41 @@ class RectPatternDiagCross extends RectPattern //===================================================================== class RectPatternFactory { - public function __construct() + public function RectPatternFactory() { // Empty } public function Create($aPattern, $aColor, $aWeight=1) { switch ($aPattern) { - case BAND_RDIAG: - $obj = new RectPatternRDiag($aColor, $aWeight); - break; - case BAND_LDIAG: - $obj = new RectPatternLDiag($aColor, $aWeight); - break; - case BAND_SOLID: - $obj = new RectPatternSolid($aColor, $aWeight); - break; - case BAND_VLINE: - $obj = new RectPatternVert($aColor, $aWeight); - break; - case BAND_HLINE: - $obj = new RectPatternHor($aColor, $aWeight); - break; - case BAND_3DPLANE: - $obj = new RectPattern3DPlane($aColor, $aWeight); - break; - case BAND_HVCROSS: - $obj = new RectPatternCross($aColor, $aWeight); - break; - case BAND_DIAGCROSS: - $obj = new RectPatternDiagCross($aColor, $aWeight); - break; - default: - JpGraphError::RaiseL(16003, $aPattern); - //(" Unknown pattern specification ($aPattern)"); - } + case BAND_RDIAG: + $obj = new RectPatternRDiag($aColor, $aWeight); + break; + case BAND_LDIAG: + $obj = new RectPatternLDiag($aColor, $aWeight); + break; + case BAND_SOLID: + $obj = new RectPatternSolid($aColor, $aWeight); + break; + case BAND_VLINE: + $obj = new RectPatternVert($aColor, $aWeight); + break; + case BAND_HLINE: + $obj = new RectPatternHor($aColor, $aWeight); + break; + case BAND_3DPLANE: + $obj = new RectPattern3DPlane($aColor, $aWeight); + break; + case BAND_HVCROSS: + $obj = new RectPatternCross($aColor, $aWeight); + break; + case BAND_DIAGCROSS: + $obj = new RectPatternDiagCross($aColor, $aWeight); + break; + default: + JpGraphError::RaiseL(16003, $aPattern); +//(" Unknown pattern specification ($aPattern)"); + } return $obj; } } @@ -590,7 +590,7 @@ class PlotBand private $min; private $max; - public function __construct($aDir, $aPattern, $aMin, $aMax, $aColor="black", $aWeight=1, $aDepth=DEPTH_BACK) + public function PlotBand($aDir, $aPattern, $aMin, $aMax, $aColor="black", $aWeight=1, $aDepth=DEPTH_BACK) { $f = new RectPatternFactory(); $this->prect = $f->Create($aPattern, $aColor, $aWeight); @@ -603,14 +603,14 @@ class PlotBand $this->max = $aMax; $this->depth=$aDepth; } - + // Set position. aRect contains absolute image coordinates public function SetPos($aRect) { assert($this->prect != null) ; $this->prect->SetPos($aRect); } - + public function ShowFrame($aFlag=true) { $this->prect->ShowFrame($aFlag); @@ -621,22 +621,22 @@ class PlotBand { $this->depth=$aDepth; } - + public function SetDensity($aDens) { $this->prect->SetDensity($aDens); } - + public function GetDir() { return $this->dir; } - + public function GetMin() { return $this->min; } - + public function GetMax() { return $this->max; @@ -646,7 +646,7 @@ class PlotBand { // Nothing to do } - + // Display band public function Stroke($aImg, $aXScale, $aYScale) { @@ -661,8 +661,8 @@ class PlotBand // Only draw the bar if it actually appears in the range if ($this->min < $aYScale->GetMaxVal() && $this->max > $aYScale->GetMinVal()) { - - // Trucate to limit of axis + + // Trucate to limit of axis $this->min = max($this->min, $aYScale->GetMinVal()); $this->max = min($this->max, $aYScale->GetMaxVal()); @@ -673,18 +673,18 @@ class PlotBand $this->prect->SetPos(new Rectangle($x, $y, $width, $height)); $this->prect->Stroke($aImg); } - } else { // VERTICAL + } else { // VERTICAL if ($this->min === 'min') { $this->min = $aXScale->GetMinVal(); } if ($this->max === 'max') { $this->max = $aXScale->GetMaxVal(); } - + // Only draw the bar if it actually appears in the range if ($this->min < $aXScale->GetMaxVal() && $this->max > $aXScale->GetMinVal()) { - - // Trucate to limit of axis + + // Trucate to limit of axis $this->min = max($this->min, $aXScale->GetMinVal()); $this->max = min($this->max, $aXScale->GetMaxVal()); diff --git a/onyx2/include/jpgraph/jpgraph_plotline.php b/onyx2/include/jpgraph/jpgraph_plotline.php deleted file mode 100755 index da4c490..0000000 --- a/onyx2/include/jpgraph/jpgraph_plotline.php +++ /dev/null @@ -1,171 +0,0 @@ -direction = $aDir; - $this->color=$aColor; - $this->weight=$aWeight; - $this->scaleposition=$aPos; - } - - public function SetLegend($aLegend, $aCSIM='', $aCSIMAlt='', $aCSIMWinTarget='') - { - $this->legend = $aLegend; - $this->legendcsimtarget = $aCSIM; - $this->legendcsimwintarget = $aCSIMWinTarget; - $this->legendcsimalt = $aCSIMAlt; - } - - public function HideLegend($f=true) - { - $this->hidelegend = $f; - } - - public function SetPosition($aScalePosition) - { - $this->scaleposition=$aScalePosition; - } - - public function SetDirection($aDir) - { - $this->direction = $aDir; - } - - public function SetColor($aColor) - { - $this->color=$aColor; - } - - public function SetWeight($aWeight) - { - $this->weight=$aWeight; - } - - public function SetLineStyle($aStyle) - { - $this->iLineStyle = $aStyle; - } - - public function GetCSIMAreas() - { - return ''; - } - - //--------------- - // PRIVATE METHODS - - public function DoLegend($graph) - { - if (!$this->hidelegend) { - $this->Legend($graph); - } - } - - // Framework function the chance for each plot class to set a legend - public function Legend($aGraph) - { - if ($this->legend != '') { - $dummyPlotMark = new PlotMark(); - $lineStyle = 1; - $aGraph->legend->Add( - $this->legend, - $this->color, - $dummyPlotMark, - $lineStyle, - $this->legendcsimtarget, - $this->legendcsimalt, - $this->legendcsimwintarget - ); - } - } - - public function PreStrokeAdjust($aGraph) - { - // Nothing to do - } - - // Called by framework to allow the object to draw - // optional information in the margin area - public function StrokeMargin($aImg) - { - // Nothing to do - } - - // Framework function to allow the object to adjust the scale - public function PrescaleSetup($aGraph) - { - // Nothing to do - } - - public function Min() - { - return array(null,null); - } - - public function Max() - { - return array(null,null); - } - - public function _Stroke($aImg, $aMinX, $aMinY, $aMaxX, $aMaxY, $aXPos, $aYPos) - { - $aImg->SetColor($this->color); - $aImg->SetLineWeight($this->weight); - $oldStyle = $aImg->SetLineStyle($this->iLineStyle); - if ($this->direction == VERTICAL) { - $ymin_abs = $aMinY; - $ymax_abs = $aMaxY; - $xpos_abs = $aXPos; - $aImg->StyleLine($xpos_abs, $ymin_abs, $xpos_abs, $ymax_abs); - } elseif ($this->direction == HORIZONTAL) { - $xmin_abs = $aMinX; - $xmax_abs = $aMaxX; - $ypos_abs = $aYPos; - $aImg->StyleLine($xmin_abs, $ypos_abs, $xmax_abs, $ypos_abs); - } else { - JpGraphError::RaiseL(25125);//(" Illegal direction for static line"); - } - $aImg->SetLineStyle($oldStyle); - } - - public function Stroke($aImg, $aXScale, $aYScale) - { - $this->_Stroke( - $aImg, - $aImg->left_margin, - $aYScale->Translate($aYScale->GetMinVal()), - $aImg->width-$aImg->right_margin, - $aYScale->Translate($aYScale->GetMaxVal()), - $aXScale->Translate($this->scaleposition), - $aYScale->Translate($this->scaleposition) - ); - } -} diff --git a/onyx2/include/jpgraph/jpgraph_plotmark.inc.php b/onyx2/include/jpgraph/jpgraph_plotmark.inc.php index 0f587d2..92c0ce5 100644 --- a/onyx2/include/jpgraph/jpgraph_plotmark.inc.php +++ b/onyx2/include/jpgraph/jpgraph_plotmark.inc.php @@ -1,11 +1,11 @@ title = new Text(); $this->title->Hide(); @@ -62,7 +62,7 @@ class PlotMark $this->iFileName = $aFileName; $this->iScale = $aScale; } - + public function SetCallback($aFunc) { $this->iFormatCallback = $aFunc; @@ -72,17 +72,17 @@ class PlotMark { $this->iFormatCallback2 = $aFunc; } - + public function GetType() { return $this->type; } - + public function SetColor($aColor) { $this->color=$aColor; } - + public function SetFillColor($aFillColor) { $this->fill_color = $aFillColor; @@ -98,7 +98,7 @@ class PlotMark { $this->width=$aWidth; } - + public function SetWidth($aWidth) { $this->width=$aWidth; @@ -107,25 +107,25 @@ class PlotMark public function SetDefaultWidth() { switch ($this->type) { - case MARK_CIRCLE: - case MARK_FILLEDCIRCLE: - $this->width=4; - break; - default: - $this->width=7; - } + case MARK_CIRCLE: + case MARK_FILLEDCIRCLE: + $this->width=4; + break; + default: + $this->width=7; } - + } + public function GetWidth() { return $this->width; } - + public function Hide($aHide=true) { $this->show = !$aHide; } - + public function Show($aShow=true) { $this->show = $aShow; @@ -136,23 +136,23 @@ class PlotMark $this->yvalue=$aY; $this->xvalue=$aX; } - + public function SetCSIMTarget($aTarget, $aWinTarget='') { $this->csimtarget=$aTarget; $this->csimwintarget=$aWinTarget; } - + public function SetCSIMAlt($aAlt) { $this->csimalt=$aAlt; } - + public function GetCSIMAreas() { return $this->csimareas; } - + public function AddCSIMPoly($aPts) { $coords = round($aPts[0]).", ".round($aPts[1]); @@ -175,7 +175,7 @@ class PlotMark $this->csimareas .= " />\n"; } } - + public function AddCSIMCircle($x, $y, $r) { $x = round($x); @@ -196,7 +196,7 @@ class PlotMark $this->csimareas .= " />\n"; } } - + public function Stroke($img, $x, $y) { if (!$this->show) { @@ -241,91 +241,91 @@ class PlotMark ($this->type >= MARK_FLAG1 && $this->type <= MARK_FLAG4) || $this->type >= MARK_IMG_PUSHPIN) { - // Note: For the builtin images we use the "filename" parameter + // Note: For the builtin images we use the "filename" parameter // to denote the color $anchor_x = 0.5; $anchor_y = 0.5; switch ($this->type) { - case MARK_FLAG1: - case MARK_FLAG2: - case MARK_FLAG3: - case MARK_FLAG4: - $this->markimg = FlagCache::GetFlagImgByName($this->type-MARK_FLAG1+1, $filename); - break; + case MARK_FLAG1: + case MARK_FLAG2: + case MARK_FLAG3: + case MARK_FLAG4: + $this->markimg = FlagCache::GetFlagImgByName($this->type-MARK_FLAG1+1, $filename); + break; - case MARK_IMG: - // Load an image and use that as a marker - // Small optimization, if we have already read an image don't - // waste time reading it again. - if ($this->markimg == '' || !($this->oldfilename === $filename)) { - $this->markimg = Graph::LoadBkgImage('', $filename); - $this->oldfilename = $filename ; - } - break; - - case MARK_IMG_PUSHPIN: - case MARK_IMG_SPUSHPIN: - case MARK_IMG_LPUSHPIN: - if ($this->imgdata_pushpins == null) { - require_once 'imgdata_pushpins.inc.php'; - $this->imgdata_pushpins = new ImgData_PushPins(); - } - $this->markimg = $this->imgdata_pushpins->GetImg($this->type, $filename); - list($anchor_x, $anchor_y) = $this->imgdata_pushpins->GetAnchor(); - break; - - case MARK_IMG_SQUARE: - if ($this->imgdata_squares == null) { - require_once 'imgdata_squares.inc.php'; - $this->imgdata_squares = new ImgData_Squares(); - } - $this->markimg = $this->imgdata_squares->GetImg($this->type, $filename); - list($anchor_x, $anchor_y) = $this->imgdata_squares->GetAnchor(); - break; - - case MARK_IMG_STAR: - if ($this->imgdata_stars == null) { - require_once 'imgdata_stars.inc.php'; - $this->imgdata_stars = new ImgData_Stars(); - } - $this->markimg = $this->imgdata_stars->GetImg($this->type, $filename); - list($anchor_x, $anchor_y) = $this->imgdata_stars->GetAnchor(); - break; - - case MARK_IMG_BEVEL: - if ($this->imgdata_bevels == null) { - require_once 'imgdata_bevels.inc.php'; - $this->imgdata_bevels = new ImgData_Bevels(); - } - $this->markimg = $this->imgdata_bevels->GetImg($this->type, $filename); - list($anchor_x, $anchor_y) = $this->imgdata_bevels->GetAnchor(); - break; - - case MARK_IMG_DIAMOND: - if ($this->imgdata_diamonds == null) { - require_once 'imgdata_diamonds.inc.php'; - $this->imgdata_diamonds = new ImgData_Diamonds(); - } - $this->markimg = $this->imgdata_diamonds->GetImg($this->type, $filename); - list($anchor_x, $anchor_y) = $this->imgdata_diamonds->GetAnchor(); - break; - - case MARK_IMG_BALL: - case MARK_IMG_SBALL: - case MARK_IMG_MBALL: - case MARK_IMG_LBALL: - if ($this->imgdata_balls == null) { - require_once 'imgdata_balls.inc.php'; - $this->imgdata_balls = new ImgData_Balls(); - } - $this->markimg = $this->imgdata_balls->GetImg($this->type, $filename); - list($anchor_x, $anchor_y) = $this->imgdata_balls->GetAnchor(); - break; + case MARK_IMG: + // Load an image and use that as a marker + // Small optimization, if we have already read an image don't + // waste time reading it again. + if ($this->markimg == '' || !($this->oldfilename === $filename)) { + $this->markimg = Graph::LoadBkgImage('', $filename); + $this->oldfilename = $filename ; } + break; + + case MARK_IMG_PUSHPIN: + case MARK_IMG_SPUSHPIN: + case MARK_IMG_LPUSHPIN: + if ($this->imgdata_pushpins == null) { + require_once 'imgdata_pushpins.inc.php'; + $this->imgdata_pushpins = new ImgData_PushPins(); + } + $this->markimg = $this->imgdata_pushpins->GetImg($this->type, $filename); + list($anchor_x, $anchor_y) = $this->imgdata_pushpins->GetAnchor(); + break; + + case MARK_IMG_SQUARE: + if ($this->imgdata_squares == null) { + require_once 'imgdata_squares.inc.php'; + $this->imgdata_squares = new ImgData_Squares(); + } + $this->markimg = $this->imgdata_squares->GetImg($this->type, $filename); + list($anchor_x, $anchor_y) = $this->imgdata_squares->GetAnchor(); + break; + + case MARK_IMG_STAR: + if ($this->imgdata_stars == null) { + require_once 'imgdata_stars.inc.php'; + $this->imgdata_stars = new ImgData_Stars(); + } + $this->markimg = $this->imgdata_stars->GetImg($this->type, $filename); + list($anchor_x, $anchor_y) = $this->imgdata_stars->GetAnchor(); + break; + + case MARK_IMG_BEVEL: + if ($this->imgdata_bevels == null) { + require_once 'imgdata_bevels.inc.php'; + $this->imgdata_bevels = new ImgData_Bevels(); + } + $this->markimg = $this->imgdata_bevels->GetImg($this->type, $filename); + list($anchor_x, $anchor_y) = $this->imgdata_bevels->GetAnchor(); + break; + + case MARK_IMG_DIAMOND: + if ($this->imgdata_diamonds == null) { + require_once 'imgdata_diamonds.inc.php'; + $this->imgdata_diamonds = new ImgData_Diamonds(); + } + $this->markimg = $this->imgdata_diamonds->GetImg($this->type, $filename); + list($anchor_x, $anchor_y) = $this->imgdata_diamonds->GetAnchor(); + break; + + case MARK_IMG_BALL: + case MARK_IMG_SBALL: + case MARK_IMG_MBALL: + case MARK_IMG_LBALL: + if ($this->imgdata_balls == null) { + require_once 'imgdata_balls.inc.php'; + $this->imgdata_balls = new ImgData_Balls(); + } + $this->markimg = $this->imgdata_balls->GetImg($this->type, $filename); + list($anchor_x, $anchor_y) = $this->imgdata_balls->GetAnchor(); + break; + } $w = $img->GetWidth($this->markimg); $h = $img->GetHeight($this->markimg); - + $dw = round($imgscale * $w); $dh = round($imgscale * $h); @@ -334,15 +334,15 @@ class PlotMark $dx = round($x-$dw*$anchor_x); $dy = round($y-$dh*$anchor_y); - + $this->width = max($dx, $dy); - + $img->Copy($this->markimg, $dx, $dy, 0, 0, $dw, $dh, $w, $h); if (!empty($this->csimtarget)) { $this->csimareas = "csimtarget)."\""; - + $dx.','.$dy.','.round($dx+$dw).','.round($dy+$dh).'" '. + "href=\"".htmlentities($this->csimtarget)."\""; + if (!empty($this->csimwintarget)) { $this->csimareas .= " target=\"".$this->csimwintarget."\" "; } @@ -353,7 +353,7 @@ class PlotMark } $this->csimareas .= " />\n"; } - + // Stroke title $this->title->Align("center", "top"); $this->title->Stroke($img, $x, $y+round($dh/2)); @@ -366,65 +366,65 @@ class PlotMark $pts=0; switch ($this->type) { - case MARK_SQUARE: - $c[]=$x-$dx;$c[]=$y-$dy; - $c[]=$x+$dx;$c[]=$y-$dy; - $c[]=$x+$dx;$c[]=$y+$dy; - $c[]=$x-$dx;$c[]=$y+$dy; - $c[]=$x-$dx;$c[]=$y-$dy; - $pts=5; - break; - case MARK_UTRIANGLE: - ++$dx;++$dy; - $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $c[]=$x;$c[]=$y-0.87*$dy; - $c[]=$x+$dx;$c[]=$y+0.87*$dy; - $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $pts=4; - break; - case MARK_DTRIANGLE: - ++$dx;++$dy; - $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $c[]=$x-$dx;$c[]=$y-0.87*$dy; - $c[]=$x+$dx;$c[]=$y-0.87*$dy; - $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx - $pts=4; - break; - case MARK_DIAMOND: - $c[]=$x;$c[]=$y+$dy; - $c[]=$x-$dx;$c[]=$y; - $c[]=$x;$c[]=$y-$dy; - $c[]=$x+$dx;$c[]=$y; - $c[]=$x;$c[]=$y+$dy; - $pts=5; - break; - case MARK_LEFTTRIANGLE: - $c[]=$x;$c[]=$y; - $c[]=$x;$c[]=$y+2*$dy; - $c[]=$x+$dx*2;$c[]=$y; - $c[]=$x;$c[]=$y; - $pts=4; - break; - case MARK_RIGHTTRIANGLE: - $c[]=$x-$dx*2;$c[]=$y; - $c[]=$x;$c[]=$y+2*$dy; - $c[]=$x;$c[]=$y; - $c[]=$x-$dx*2;$c[]=$y; - $pts=4; - break; - case MARK_FLASH: - $dy *= 2; - $c[]=$x+$dx/2; $c[]=$y-$dy; - $c[]=$x-$dx+$dx/2; $c[]=$y+$dy*0.7-$dy; - $c[]=$x+$dx/2; $c[]=$y+$dy*1.3-$dy; - $c[]=$x-$dx+$dx/2; $c[]=$y+2*$dy-$dy; - $img->SetLineWeight($weight); - $img->SetColor($color); - $img->Polygon($c); - $img->SetLineWeight(1); - $this->AddCSIMPoly($c); - break; - } + case MARK_SQUARE: + $c[]=$x-$dx;$c[]=$y-$dy; + $c[]=$x+$dx;$c[]=$y-$dy; + $c[]=$x+$dx;$c[]=$y+$dy; + $c[]=$x-$dx;$c[]=$y+$dy; + $c[]=$x-$dx;$c[]=$y-$dy; + $pts=5; + break; + case MARK_UTRIANGLE: + ++$dx;++$dy; + $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $c[]=$x;$c[]=$y-0.87*$dy; + $c[]=$x+$dx;$c[]=$y+0.87*$dy; + $c[]=$x-$dx;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $pts=4; + break; + case MARK_DTRIANGLE: + ++$dx;++$dy; + $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $c[]=$x-$dx;$c[]=$y-0.87*$dy; + $c[]=$x+$dx;$c[]=$y-0.87*$dy; + $c[]=$x;$c[]=$y+0.87*$dy; // tan(60)/2*$dx + $pts=4; + break; + case MARK_DIAMOND: + $c[]=$x;$c[]=$y+$dy; + $c[]=$x-$dx;$c[]=$y; + $c[]=$x;$c[]=$y-$dy; + $c[]=$x+$dx;$c[]=$y; + $c[]=$x;$c[]=$y+$dy; + $pts=5; + break; + case MARK_LEFTTRIANGLE: + $c[]=$x;$c[]=$y; + $c[]=$x;$c[]=$y+2*$dy; + $c[]=$x+$dx*2;$c[]=$y; + $c[]=$x;$c[]=$y; + $pts=4; + break; + case MARK_RIGHTTRIANGLE: + $c[]=$x-$dx*2;$c[]=$y; + $c[]=$x;$c[]=$y+2*$dy; + $c[]=$x;$c[]=$y; + $c[]=$x-$dx*2;$c[]=$y; + $pts=4; + break; + case MARK_FLASH: + $dy *= 2; + $c[]=$x+$dx/2; $c[]=$y-$dy; + $c[]=$x-$dx+$dx/2; $c[]=$y+$dy*0.7-$dy; + $c[]=$x+$dx/2; $c[]=$y+$dy*1.3-$dy; + $c[]=$x-$dx+$dx/2; $c[]=$y+2*$dy-$dy; + $img->SetLineWeight($weight); + $img->SetColor($color); + $img->Polygon($c); + $img->SetLineWeight(1); + $this->AddCSIMPoly($c); + break; + } if ($pts>0) { $this->AddCSIMPoly($c); @@ -467,7 +467,7 @@ class PlotMark $img->Line($x-$dx-1, $y, $x+$dx+1, $y); $this->AddCSIMCircle($x, $y, $dx+$dy); } - + // Stroke title $this->title->Align("center", "center"); $this->title->Stroke($img, $x, $y); @@ -483,19 +483,13 @@ class PlotMark //======================================================================== class ImgData { - protected $name = ''; // Each subclass gives a name - protected $an = array(); // Data array names - protected $colors = array(); // Available colors - protected $index = array(); // Index for colors - protected $maxidx = 0 ; // Max color index + protected $name = ''; // Each subclass gives a name + protected $an = array(); // Data array names + protected $colors = array(); // Available colors + protected $index = array(); // Index for colors + protected $maxidx = 0 ; // Max color index protected $anchor_x=0.5; protected $anchor_y=0.5 ; // Where is the center of the image - - public function __construct() - { - // Empty - } - // Create a GD image from the data and return a GD handle public function GetImg($aMark, $aIdx) { @@ -513,7 +507,6 @@ class ImgData } return Image::CreateFromString(base64_decode($this->{$n}[$idx][1])); } - public function GetAnchor() { return array($this->anchor_x,$this->anchor_y); @@ -523,10 +516,10 @@ class ImgData // Keep a global flag cache to reduce memory usage $_gFlagCache=array( -1 => null, -2 => null, -3 => null, -4 => null, + 1 => null, + 2 => null, + 3 => null, + 4 => null, ); // Only supposed to b called as statics class FlagCache diff --git a/onyx2/include/jpgraph/jpgraph_polar.php b/onyx2/include/jpgraph/jpgraph_polar.php index 55e8b4c..cb94f3d 100644 --- a/onyx2/include/jpgraph/jpgraph_polar.php +++ b/onyx2/include/jpgraph/jpgraph_polar.php @@ -1,20 +1,20 @@ csimtargets=$aTargets; $this->csimalts=$aAlts; } - + // Get all created areas public function GetCSIMareas() { return $this->csimareas; } - + public function SetLegend($aLegend, $aCSIM="", $aCSIMAlt="") { $this->legend = $aLegend; @@ -143,7 +143,7 @@ class PolarPlot list($x1, $y1) = $scale->PTranslate($this->coord[2*$i], $this->coord[2*$i+1]); $p[2*$i] = $x1; $p[2*$i+1] = $y1; - + if (isset($this->csimtargets[$i])) { $this->mark->SetCSIMTarget($this->csimtargets[$i]); $this->mark->SetCSIMAlt($this->csimalts[$i]); @@ -192,9 +192,9 @@ class PolarAxis extends Axis private $show_angle_tick=true; private $radius_tick_color='black'; - public function __construct($img, $aScale) + public function PolarAxis($img, $aScale) { - parent::__construct($img, $aScale); + parent::Axis($img, $aScale); } public function ShowAngleDegreeMark($aFlg=true) @@ -260,7 +260,7 @@ class PolarAxis extends Axis $this->radius_tick_color = $aRadColor; $this->angle_tick_color = $aAngleColor; } - + // Private methods public function StrokeGrid($pos) { @@ -281,7 +281,7 @@ class PolarAxis extends Axis } $i++; } - + $limit = max($this->img->plotwidth, $this->img->plotheight)*1.4 ; while ($r < $limit) { $off = $r; @@ -360,7 +360,7 @@ class PolarAxis extends Axis if (!$this->show_angle_label) { return; } - + $x0 = round($this->img->left_margin+$this->img->plotwidth/2)+1; $d = max($this->img->plotwidth, $this->img->plotheight)*1.42; @@ -381,20 +381,17 @@ class PolarAxis extends Axis $margin=5; $tl = $this->angle_tick_len ; // Outer len - $tl2 = $this->angle_tick_len2 ; // Interior len + $tl2 = $this->angle_tick_len2 ; // Interior len - $this->img->SetColor($this->angle_tick_color); + $this->img->SetColor($this->angle_tick_color); $rot90 = $this->img->a == 90 ; if ($type == POLAR_360) { - - // Corner angles of the four corners $ca1 = atan($h/$w)/M_PI*180; $ca2 = 180-$ca1; $ca3 = $ca1+180; $ca4 = 360-$ca1; $end = 360; - while ($a < $end) { $ca = cos($a/180*M_PI); $sa = sin($a/180*M_PI); @@ -457,20 +454,15 @@ class PolarAxis extends Axis } if ($a != 0 && $a != 180) { $t->Align($ha, $va); - if ($this->scale->clockwise) { - $t->Set(360-$a); - } else { - $t->Set($a); - } - if ($this->show_angle_mark && $t->font_family > 4) { - $a .= SymChar::Get('degree'); + if ($this->show_angle_mark) { + $a .= ''; } + $t->Set($a); $t->Stroke($this->img, $xt, $yt); if ($this->show_angle_tick) { $this->img->Line($x1, $y1, $x2, $y2); } } - $a = (int) $a; $a += $this->angle_step; } } else { @@ -524,15 +516,14 @@ class PolarAxis extends Axis $y1=$y2=$yt; } $t->Align($ha, $va); - if ($this->show_angle_mark && $t->font_family > 4) { - $a .= SymChar::Get('degree'); + if ($this->show_angle_mark) { + $a .= ''; } $t->Set($a); $t->Stroke($this->img, $xt, $yt); if ($this->show_angle_tick) { $this->img->Line($x1, $y1, $x2, $y2); } - $a = (int) $a; $a += $this->angle_step; } } @@ -556,7 +547,8 @@ class PolarAxis extends Axis $this->title->SetPos($this->img->width-$this->img->right_margin, $y, "right", "top"); } elseif ($this->title_adjust=="middle" || $this->title_adjust=="center") { $this->title->SetPos( - ($this->img->width-$this->img->left_margin-$this->img->right_margin)/2+$this->img->left_margin, + ($this->img->width-$this->img->left_margin- + $this->img->right_margin)/2+$this->img->left_margin, $y, "center", "top" @@ -568,7 +560,7 @@ class PolarAxis extends Axis //('Unknown alignment specified for X-axis title. ('.$this->title_adjust.')'); } - + if (!$this->hide_labels) { $this->StrokeLabels($pos, false); } @@ -583,7 +575,7 @@ class PolarAxis extends Axis $i=0; while ($i < $n) { $this->scale->ticks->ticks_pos[$i] = - $mid-$this->scale->ticks->ticks_pos[$i] ; + $mid-$this->scale->ticks->ticks_pos[$i] ; ++$i; } @@ -591,15 +583,15 @@ class PolarAxis extends Axis $i=0; while ($i < $n) { $this->scale->ticks->maj_ticks_pos[$i] = - $mid-$this->scale->ticks->maj_ticks_pos[$i] ; + $mid-$this->scale->ticks->maj_ticks_pos[$i] ; ++$i; } - + $n = count($this->scale->ticks->maj_ticklabels_pos); $i=1; while ($i < $n) { $this->scale->ticks->maj_ticklabels_pos[$i] = - $mid-$this->scale->ticks->maj_ticklabels_pos[$i] ; + $mid-$this->scale->ticks->maj_ticklabels_pos[$i] ; ++$i; } @@ -641,18 +633,11 @@ class PolarAxis extends Axis class PolarScale extends LinearScale { private $graph; - public $clockwise=false; - public function __construct($aMax, $graph, $aClockwise) + public function PolarScale($aMax=0, $graph) { - parent::__construct(0, $aMax, 'x'); + parent::LinearScale(0, $aMax, 'x'); $this->graph = $graph; - $this->clockwise = $aClockwise; - } - - public function SetClockwise($aFlg) - { - $this->clockwise = $aFlg; } public function _Translate($v) @@ -666,13 +651,8 @@ class PolarScale extends LinearScale $w = $this->graph->img->plotwidth/2; $aRad = $aRad/$m*$w; - $a = $aAngle/180 * M_PI; - if ($this->clockwise) { - $a = 2*M_PI-$a; - } - - $x = cos($a) * $aRad; - $y = sin($a) * $aRad; + $x = cos($aAngle/180 * M_PI) * $aRad; + $y = sin($aAngle/180 * M_PI) * $aRad; $x += $this->_Translate(0); @@ -688,19 +668,11 @@ class PolarScale extends LinearScale class PolarLogScale extends LogScale { private $graph; - public $clockwise=false; - - public function __construct($aMax, $graph, $aClockwise=false) + public function PolarLogScale($aMax=1, $graph) { - parent::__construct(0, $aMax, 'x'); + parent::LogScale(0, $aMax, 'x'); $this->graph = $graph; $this->ticks->SetLabelLogType(LOGLABELS_MAGNITUDE); - $this->clockwise = $aClockwise; - } - - public function SetClockwise($aFlg) - { - $this->clockwise = $aFlg; } public function PTranslate($aAngle, $aRad) @@ -713,13 +685,8 @@ class PolarLogScale extends LogScale $w = $this->graph->img->plotwidth/2; $aRad = $aRad/$m*$w; - $a = $aAngle/180 * M_PI; - if ($this->clockwise) { - $a = 2*M_PI-$a; - } - - $x = cos($a) * $aRad; - $y = sin($a) * $aRad; + $x = cos($aAngle/180 * M_PI) * $aRad; + $y = sin($aAngle/180 * M_PI) * $aRad; $x += $w+$this->graph->img->left_margin;//$this->_Translate(0); if ($this->graph->iType == POLAR_360) { @@ -736,11 +703,10 @@ class PolarGraph extends Graph public $scale; public $axis; public $iType=POLAR_360; - private $iClockwise=false; - - public function __construct($aWidth=300, $aHeight=200, $aCachedName="", $aTimeOut=0, $aInline=true) + + public function PolarGraph($aWidth=300, $aHeight=200, $aCachedName="", $aTimeOut=0, $aInline=true) { - parent::__construct($aWidth, $aHeight, $aCachedName, $aTimeOut, $aInline) ; + parent::Graph($aWidth, $aHeight, $aCachedName, $aTimeOut, $aInline) ; $this->SetDensity(TICKD_DENSE); $this->SetBox(); $this->SetMarginColor('white'); @@ -751,29 +717,22 @@ class PolarGraph extends Graph $this->SetTickDensity(TICKD_NORMAL, $aDense); } - public function SetClockwise($aFlg) - { - $this->scale->SetClockwise($aFlg); - } - public function Set90AndMargin($lm=0, $rm=0, $tm=0, $bm=0) { $adj = ($this->img->height - $this->img->width)/2; $this->SetAngle(90); - $lm2 = -$adj + ($lm-$rm+$tm+$bm)/2; - $rm2 = -$adj + (-$lm+$rm+$tm+$bm)/2; - $tm2 = $adj + ($tm-$bm+$lm+$rm)/2; - $bm2 = $adj + (-$tm+$bm+$lm+$rm)/2; - $this->SetMargin($lm2, $rm2, $tm2, $bm2); + $this->img->SetMargin($lm-$adj, $rm-$adj, $tm+$adj, $bm+$adj); + $this->img->SetCenter(floor($this->img->width/2), floor($this->img->height/2)); $this->axis->SetLabelAlign('right', 'center'); + //JpGraphError::Raise('Set90AndMargin() is not supported for polar graphs.'); } public function SetScale($aScale, $rmax=0, $dummy1=1, $dummy2=1, $dummy3=1) { if ($aScale == 'lin') { - $this->scale = new PolarScale($rmax, $this, $this->iClockwise); + $this->scale = new PolarScale($rmax, $this); } elseif ($aScale == 'log') { - $this->scale = new PolarLogScale($rmax, $this, $this->iClockwise); + $this->scale = new PolarLogScale($rmax, $this); } else { JpGraphError::RaiseL(17004);//('Unknown scale type for polar graph. Must be "lin" or "log"'); } @@ -813,9 +772,9 @@ class PolarGraph extends Graph public function Stroke($aStrokeFileName="") { - // Start by adjusting the margin so that potential titles will fit. + // Start by adjusting the margin so that potential titles will fit. $this->AdjustMarginsForTitles(); - + // If the filename is the predefined value = '_csim_special_' // we assume that the call to stroke only needs to do enough // to correctly generate the CSIM maps. @@ -874,6 +833,7 @@ class PolarGraph extends Graph $pos = $this->img->plotheight/2 + $this->img->top_margin; } + if (!$_csim) { $this->StrokePlotArea(); } @@ -908,21 +868,16 @@ class PolarGraph extends Graph $this->img->plotheight+1 ); } elseif ($this->img->a == 90) { - $adj1 = round(($this->img->height - $this->img->width)/2); - $adj2 = round(($this->img->width - $this->img->height)/2); - $lm = $this->img->left_margin; - $rm = $this->img->right_margin; - $tm = $this->img->top_margin; - $bm = $this->img->bottom_margin; + $adj = round(($this->img->height - $this->img->width)/2); $this->img->CopyCanvasH( $oldimage, $this->img->img, - $adj2 + round(($lm-$rm+$tm+$bm)/2), - $adj1 + round(($tm-$bm+$lm+$rm)/2), - $adj2 + round(($lm-$rm+$tm+$bm)/2), - $adj1 + round(($tm-$bm+$lm+$rm)/2), - $this->img->plotheight+1, - $this->img->plotwidth+1 + $this->img->bottom_margin-$adj, + $this->img->left_margin+$adj, + $this->img->bottom_margin-$adj, + $this->img->left_margin+$adj, + $this->img->plotheight, + $this->img->plotwidth ); } $this->img->Destroy(); @@ -953,12 +908,12 @@ class PolarGraph extends Graph if (!$_csim) { $this->StrokeTexts(); $this->img->SetAngle($aa); - + // Draw an outline around the image map if (_JPG_DEBUG) { $this->DisplayClientSideaImageMapAreas(); } - + // If the filename is given as the special "__handle" // then the image handler is returned and the image is NOT // streamed back @@ -966,7 +921,12 @@ class PolarGraph extends Graph return $this->img->img; } else { // Finally stream the generated picture - $this->cache->PutAndStream($this->img, $this->cache_name, $this->inline, $aStrokeFileName); + $this->cache->PutAndStream( + $this->img, + $this->cache_name, + $this->inline, + $aStrokeFileName + ); } } } diff --git a/onyx2/include/jpgraph/jpgraph_radar.php b/onyx2/include/jpgraph/jpgraph_radar.php index fb8add8..8967ea6 100644 --- a/onyx2/include/jpgraph/jpgraph_radar.php +++ b/onyx2/include/jpgraph/jpgraph_radar.php @@ -1,27 +1,27 @@ GetMinVal(); @@ -29,23 +29,22 @@ class RadarLogTicks extends Ticks $nextMajor = 10*$start; $step = $nextMajor / 10.0; $count=1; - + $ticklen_maj=5; $dx_maj=round(sin($aAxisAngle)*$ticklen_maj); $dy_maj=round(cos($aAxisAngle)*$ticklen_maj); $ticklen_min=3; $dx_min=round(sin($aAxisAngle)*$ticklen_min); $dy_min=round(cos($aAxisAngle)*$ticklen_min); - + $aMajPos=array(); $aMajLabel=array(); - + if ($this->supress_first) { - $aMajLabel[] = ''; + $aMajLabel[]=""; } else { $aMajLabel[]=$start; } - $yr=$aScale->RelTranslate($start); $xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0]; $yt=$aPos-round($yr*sin($aAxisAngle)); @@ -55,7 +54,7 @@ class RadarLogTicks extends Ticks $grid[]=$yt; $aImg->SetLineWeight($this->weight); - + for ($y=$start; $y<=$limit; $y+=$step,++$count) { $yr=$aScale->RelTranslate($y); $xt=round($yr*cos($aAxisAngle))+$aScale->scale_abs[0]; @@ -66,15 +65,15 @@ class RadarLogTicks extends Ticks $aMajPos[]=$xt+2*$dx_maj; $aMajPos[]=$yt-$aImg->GetFontheight()/2; if (!$this->supress_tickmarks) { - if ($this->majcolor != '') { + if ($this->majcolor!="") { $aImg->PushColor($this->majcolor); } $aImg->Line($xt+$dx_maj, $yt+$dy_maj, $xt-$dx_maj, $yt-$dy_maj); - if ($this->majcolor != '') { + if ($this->majcolor!="") { $aImg->PopColor(); } } - if ($this->label_formfunc != '') { + if ($this->label_formfunc != "") { $f=$this->label_formfunc; $l = call_user_func($f, $nextMajor); } else { @@ -85,61 +84,66 @@ class RadarLogTicks extends Ticks $nextMajor *= 10; $step *= 10; $count=1; - } else { - if (!$this->supress_minor_tickmarks) { - if ($this->mincolor != '') { - $aImg->PushColor($this->mincolor); - } - $aImg->Line($xt+$dx_min, $yt+$dy_min, $xt-$dx_min, $yt-$dy_min); - if ($this->mincolor != '') { - $aImg->PopColor(); - } + } elseif (!$this->supress_minor_tickmarks) { + if ($this->mincolor!="") { + $aImg->PushColor($this->mincolor); + } + $aImg->Line($xt+$dx_min, $yt+$dy_min, $xt-$dx_min, $yt-$dy_min); + if ($this->mincolor!="") { + $aImg->PopColor(); } } } } } - -//=================================================== -// CLASS RadarLinear -// Description: Linear ticks -//=================================================== + class RadarLinearTicks extends Ticks { private $minor_step=1; + + private $major_step=2; private $xlabel_offset=0; private $xtick_offset=0; - public function __construct() + //--------------- + // CONSTRUCTOR + public function RadarLinearTicks() { // Empty } + //--------------- + // PUBLIC METHODS + + // Return major step size in world coordinates public function GetMajor() { return $this->major_step; } - + // Return minor step size in world coordinates public function GetMinor() { return $this->minor_step; } - + // Set Minor and Major ticks (in world coordinates) public function Set($aMajStep, $aMinStep=false) { if ($aMinStep==false) { $aMinStep=$aMajStep; } - + if ($aMajStep <= 0 || $aMinStep <= 0) { - JpGraphError::RaiseL(25064); - //JpGraphError::Raise(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem."); + JpGraphError::Raise(" Minor or major step size is 0. Check that you haven't + got an accidental SetTextTicks(0) in your code.

+ If this is not the case you might have stumbled upon a bug in JpGraph. + Please report this and if possible include the data that caused the + problem."); } - + $this->major_step=$aMajStep; $this->minor_step=$aMinStep; $this->is_set = true; @@ -150,26 +154,25 @@ class RadarLinearTicks extends Ticks // Prepare to draw linear ticks $maj_step_abs = abs($aScale->scale_factor*$this->major_step); $min_step_abs = abs($aScale->scale_factor*$this->minor_step); - $nbrmaj = round($aScale->world_abs_size/$maj_step_abs); - $nbrmin = round($aScale->world_abs_size/$min_step_abs); - $skip = round($nbrmin/$nbrmaj); // Don't draw minor on top of major + $nbrmaj = floor(($aScale->world_abs_size)/$maj_step_abs); + $nbrmin = floor(($aScale->world_abs_size)/$min_step_abs); + $skip = round($nbrmin/$nbrmaj); // Don't draw minor ontop of major // Draw major ticks $ticklen2=$this->major_abs_size; $dx=round(sin($aAxisAngle)*$ticklen2); $dy=round(cos($aAxisAngle)*$ticklen2); $label=$aScale->scale[0]+$this->major_step; - + $aImg->SetLineWeight($this->weight); - + // NEW $aMajPos = array(); $aMajLabel = array(); - for ($i=1; $i<=$nbrmaj; ++$i) { $xt=round($i*$maj_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0]; $yt=$aPos-round($i*$maj_step_abs*sin($aAxisAngle)); - if ($this->label_formfunc != '') { + if ($this->label_formfunc != "") { $f=$this->label_formfunc; $l = call_user_func($f, $label); } else { @@ -183,11 +186,11 @@ class RadarLinearTicks extends Ticks $aMajPos[($i-1)*2]=$xt+2*$dx; $aMajPos[($i-1)*2+1]=$yt-$aImg->GetFontheight()/2; if (!$this->supress_tickmarks) { - if ($this->majcolor != '') { + if ($this->majcolor!="") { $aImg->PushColor($this->majcolor); } $aImg->Line($xt+$dx, $yt+$dy, $xt-$dx, $yt-$dy); - if ($this->majcolor != '') { + if ($this->majcolor!="") { $aImg->PopColor(); } } @@ -198,7 +201,7 @@ class RadarLinearTicks extends Ticks $dx=round(sin($aAxisAngle)*$ticklen2); $dy=round(cos($aAxisAngle)*$ticklen2); if (!$this->supress_tickmarks && !$this->supress_minor_tickmarks) { - if ($this->mincolor != '') { + if ($this->mincolor!="") { $aImg->PushColor($this->mincolor); } for ($i=1; $i<=$nbrmin; ++$i) { @@ -209,13 +212,14 @@ class RadarLinearTicks extends Ticks $yt=$aPos-round($i*$min_step_abs*sin($aAxisAngle)); $aImg->Line($xt+$dx, $yt+$dy, $xt-$dx, $yt-$dy); } - if ($this->mincolor != '') { + if ($this->mincolor!="") { $aImg->PopColor(); } } } } + //=================================================== // CLASS RadarAxis @@ -224,50 +228,59 @@ class RadarLinearTicks extends Ticks class RadarAxis extends AxisPrototype { public $title=null; - private $title_color='navy'; + private $title_color="navy"; private $len=0; - - public function __construct($img, $aScale, $color=array(0,0,0)) + //--------------- + // CONSTRUCTOR + public function RadarAxis($img, $aScale, $color=array(0,0,0)) { - parent::__construct($img, $aScale, $color); - $this->len = $img->plotheight; + parent::Axis($img, $aScale, $color); + $this->len=$img->plotheight; $this->title = new Text(); $this->title->SetFont(FF_FONT1, FS_BOLD); $this->color = array(0,0,0); } - + //--------------- + // PUBLIC METHODS + public function SetTickLabels($aLabelArray, $aLabelColorArray=null) + { + $this->ticks_label = $aLabelArray; + $this->ticks_label_colors = $aLabelColorArray; + } + + // Stroke the axis - // $pos = Vertical position of axis + // $pos = Vertical position of axis // $aAxisAngle = Axis angle - // $grid = Returns an array with positions used to draw the grid - // $lf = Label flag, TRUE if the axis should have labels + // $grid = Returns an array with positions used to draw the grid + // $lf = Label flag, TRUE if the axis should have labels public function Stroke($pos, $aAxisAngle, &$grid, $title, $lf) { $this->img->SetColor($this->color); - + // Determine end points for the axis $x=round($this->scale->world_abs_size*cos($aAxisAngle)+$this->scale->scale_abs[0]); $y=round($pos-$this->scale->world_abs_size*sin($aAxisAngle)); - + // Draw axis $this->img->SetColor($this->color); $this->img->SetLineWeight($this->weight); if (!$this->hide) { $this->img->Line($this->scale->scale_abs[0], $pos, $x, $y); } - + $this->scale->ticks->Stroke($this->img, $grid, $pos, $aAxisAngle, $this->scale, $majpos, $majlabel); $ncolor=0; if (isset($this->ticks_label_colors)) { $ncolor=count($this->ticks_label_colors); } - + // Draw labels if ($lf && !$this->hide) { $this->img->SetFont($this->font_family, $this->font_style, $this->font_size); - $this->img->SetTextAlign('left', 'top'); + $this->img->SetTextAlign("left", "top"); $this->img->SetColor($this->label_color); - + // majpos contains (x,y) coordinates for labels if (! $this->hide_labels) { $n = floor(count($majpos)/2); @@ -276,7 +289,7 @@ class RadarAxis extends AxisPrototype if ($ncolor > 0) { $this->img->SetColor($this->ticks_label_colors[$i % $ncolor]); } - + if ($this->ticks_label != null && isset($this->ticks_label[$i])) { $this->img->StrokeText($majpos[$i*2], $majpos[$i*2+1], $this->ticks_label[$i]); } else { @@ -287,7 +300,9 @@ class RadarAxis extends AxisPrototype } $this->_StrokeAxisTitle($pos, $aAxisAngle, $title); } - + //--------------- + // PRIVATE METHODS + public function _StrokeAxisTitle($pos, $aAxisAngle, $title) { $this->title->Set($title); @@ -310,27 +325,24 @@ class RadarAxis extends AxisPrototype while ($aAxisAngle > 2*M_PI) { $aAxisAngle -= 2*M_PI; } - + // Around 3 a'clock if ($aAxisAngle>=7*M_PI/4 || $aAxisAngle <= M_PI/4) { $dx=-0.15; } // Small trimming to make the dist to the axis more even - // Around 12 a'clock if ($aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4) { $dx=($aAxisAngle-M_PI/4)*2/M_PI; } - // Around 9 a'clock if ($aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4) { $dx=1; } - // Around 6 a'clock if ($aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4) { $dx=(1-($aAxisAngle-M_PI*5/4)*2/M_PI); } - + if ($aAxisAngle>=7*M_PI/4) { $dy=(($aAxisAngle-M_PI)-3*M_PI/4)*2/M_PI; } @@ -349,7 +361,7 @@ class RadarAxis extends AxisPrototype if ($aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4) { $dy=0; } - + if (!$this->hide) { $this->title->Stroke($this->img, $xt-$dx*$w, $yt-$dy*$h, $title); } @@ -368,44 +380,46 @@ class RadarGrid private $show=false; private $weight=1; - public function __construct() + //------------ + // CONSTRUCTOR + public function RadarGrid() { - // Empty } + // PUBLIC METHODS public function SetColor($aMajColor) { $this->grid_color = $aMajColor; } - + public function SetWeight($aWeight) { $this->weight=$aWeight; } - + // Specify if grid should be dashed, dotted or solid public function SetLineStyle($aType) { $this->type = $aType; } - + // Decide if both major and minor grid should be displayed public function Show($aShowMajor=true) { $this->show=$aShowMajor; } - + + //---------------- + // PRIVATE METHODS public function Stroke($img, $grid) { if (!$this->show) { return; } - $nbrticks = count($grid[0])/2; $nbrpnts = count($grid); $img->SetColor($this->grid_color); $img->SetLineWeight($this->weight); - for ($i=0; $i<$nbrticks; ++$i) { for ($j=0; $j<$nbrpnts; ++$j) { $pnts[$j*2]=$grid[$j][$i*2]; @@ -413,13 +427,13 @@ class RadarGrid } for ($k=0; $k<$nbrpnts; ++$k) { $l=($k+1)%$nbrpnts; - if ($this->type == 'solid') { + if ($this->type == "solid") { $img->Line($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1]); - } elseif ($this->type == 'dotted') { + } elseif ($this->type == "dotted") { $img->DashedLine($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1], 1, 6); - } elseif ($this->type == 'dashed') { + } elseif ($this->type == "dashed") { $img->DashedLine($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1], 2, 4); - } elseif ($this->type == 'longdashed') { + } elseif ($this->type == "longdashed") { $img->DashedLine($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1], 8, 6); } } @@ -436,37 +450,33 @@ class RadarGrid class RadarPlot { public $mark=null; - public $legend=''; - public $legendcsimtarget=''; - public $legendcsimalt=''; - public $csimtargets=array(); // Array of targets for CSIM - public $csimareas=""; // Resultant CSIM area tags - public $csimalts=null; // ALT:s for corresponding target + public $legend=""; private $data=array(); private $fill=false; private $fill_color=array(200,170,180); private $color=array(0,0,0); private $weight=1; private $linestyle='solid'; - //--------------- // CONSTRUCTOR - public function __construct($data) + public function RadarPlot($data) { $this->data = $data; $this->mark = new PlotMark(); } + //--------------- + // PUBLIC METHODS public function Min() { return Min($this->data); } - + public function Max() { return Max($this->data); } - + public function SetLegend($legend) { $this->legend=$legend; @@ -476,23 +486,23 @@ class RadarPlot { $this->linestyle=$aStyle; } - + public function SetLineWeight($w) { $this->weight=$w; } - + public function SetFillColor($aColor) { $this->fill_color = $aColor; $this->fill = true; } - + public function SetFill($f=true) { $this->fill = $f; } - + public function SetColor($aColor, $aFillColor=false) { $this->color = $aColor; @@ -501,92 +511,64 @@ class RadarPlot $this->fill = true; } } - - // Set href targets for CSIM - public function SetCSIMTargets($aTargets, $aAlts=null) - { - $this->csimtargets=$aTargets; - $this->csimalts=$aAlts; - } - - // Get all created areas + public function GetCSIMareas() { - return $this->csimareas; + JpGraphError::RaiseL(18001); + //("Client side image maps not supported for RadarPlots."); } - + public function Stroke($img, $pos, $scale, $startangle) { $nbrpnts = count($this->data); $astep=2*M_PI/$nbrpnts; $a=$startangle; - + + // Rotate each point to the correct axis-angle + // TODO: Update for LogScale for ($i=0; $i<$nbrpnts; ++$i) { - - // Rotate each non null point to the correct axis-angle + //$c=$this->data[$i]; $cs=$scale->RelTranslate($this->data[$i]); $x=round($cs*cos($a)+$scale->scale_abs[0]); $y=round($pos-$cs*sin($a)); - + /* + $c=log10($c); + $x=round(($c-$scale->scale[0])*$scale->scale_factor*cos($a)+$scale->scale_abs[0]); + $y=round($pos-($c-$scale->scale[0])*$scale->scale_factor*sin($a)); + */ $pnts[$i*2]=$x; $pnts[$i*2+1]=$y; - - // If the next point is null then we draw this polygon segment - // to the center, skip the next and draw the next segment from - // the center up to the point on the axis with the first non-null - // value and continues from that point. Some additoinal logic is necessary - // to handle the boundary conditions - if ($i < $nbrpnts-1) { - if (is_null($this->data[$i+1])) { - $cs = 0; - $x=round($cs*cos($a)+$scale->scale_abs[0]); - $y=round($pos-$cs*sin($a)); - $pnts[$i*2]=$x; - $pnts[$i*2+1]=$y; - $a += $astep; - } - } - $a += $astep; } - if ($this->fill) { $img->SetColor($this->fill_color); $img->FilledPolygon($pnts); } - $img->SetLineWeight($this->weight); $img->SetColor($this->color); $img->SetLineStyle($this->linestyle); - $pnts[] = $pnts[0]; - $pnts[] = $pnts[1]; + $pnts[]=$pnts[0]; + $pnts[]=$pnts[1]; $img->Polygon($pnts); $img->SetLineStyle('solid'); // Reset line style to default - // Add plotmarks on top if ($this->mark->show) { for ($i=0; $i < $nbrpnts; ++$i) { - if (isset($this->csimtargets[$i])) { - $this->mark->SetCSIMTarget($this->csimtargets[$i]); - $this->mark->SetCSIMAlt($this->csimalts[$i]); - $this->mark->SetCSIMAltVal($pnts[$i*2], $pnts[$i*2+1]); - $this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]); - $this->csimareas .= $this->mark->GetCSIMAreas(); - } else { - $this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]); - } + $this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]); } } } - + + //--------------- + // PRIVATE METHODS public function GetCount() { return count($this->data); } - + public function Legend($graph) { - if ($this->legend == '') { + if ($this->legend=="") { return; } if ($this->fill) { @@ -609,44 +591,56 @@ class RadarGraph extends Graph private $posy; private $len; private $axis_title=null; - - public function __construct($width=300, $height=200, $cachedName="", $timeout=0, $inline=1) + //--------------- + // CONSTRUCTOR + public function RadarGraph($width=300, $height=200, $cachedName="", $timeout=0, $inline=1) { - parent::__construct($width, $height, $cachedName, $timeout, $inline); - $this->posx = $width/2; - $this->posy = $height/2; - $this->len = min($width, $height)*0.35; + $this->Graph($width, $height, $cachedName, $timeout, $inline); + $this->posx=$width/2; + $this->posy=$height/2; + $this->len=min($width, $height)*0.35; $this->SetColor(array(255,255,255)); $this->SetTickDensity(TICKD_NORMAL); - $this->SetScale('lin'); + $this->SetScale("lin"); $this->SetGridDepth(DEPTH_FRONT); } + //--------------- + // PUBLIC METHODS + public function SupressTickMarks($f=true) + { + if (ERR_DEPRECATED) { + JpGraphError::RaiseL(18002); + } + //('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.'); + $this->axis->scale->ticks->SupressTickMarks($f); + } + public function HideTickMarks($aFlag=true) { $this->axis->scale->ticks->SupressTickMarks($aFlag); } - + public function ShowMinorTickmarks($aFlag=true) { $this->yscale->ticks->SupressMinorTickMarks(!$aFlag); } - + public function SetScale($axtype, $ymin=1, $ymax=1, $dummy1=null, $dumy2=null) { - if ($axtype != 'lin' && $axtype != 'log') { + if ($axtype != "lin" && $axtype != "log") { JpGraphError::RaiseL(18003, $axtype); //("Illegal scale for radarplot ($axtype). Must be \"lin\" or \"log\""); } - if ($axtype == 'lin') { + if ($axtype=="lin") { $this->yscale = new LinearScale($ymin, $ymax); $this->yscale->ticks = new RadarLinearTicks(); $this->yscale->ticks->SupressMinorTickMarks(); - } elseif ($axtype == 'log') { + } elseif ($axtype=="log") { $this->yscale = new LogScale($ymin, $ymax); $this->yscale->ticks = new RadarLogTicks(); } - + $this->axis = new RadarAxis($this->img, $this->yscale); $this->grid = new RadarGrid(); } @@ -655,8 +649,8 @@ class RadarGraph extends Graph { if ($aSize < 0.1 || $aSize>1) { JpGraphError::RaiseL(18004, $aSize); - //("Radar Plot size must be between 0.1 and 1. (Your value=$s)"); } + //("Radar Plot size must be between 0.1 and 1. (Your value=$s)"); $this->len=min($this->img->width, $this->img->height)*$aSize/2; } @@ -669,22 +663,22 @@ class RadarGraph extends Graph { $this->ytick_factor=25; switch ($densy) { - case TICKD_DENSE: - $this->ytick_factor=12; - break; - case TICKD_NORMAL: - $this->ytick_factor=25; - break; - case TICKD_SPARSE: - $this->ytick_factor=40; - break; - case TICKD_VERYSPARSE: - $this->ytick_factor=70; - break; - default: - JpGraphError::RaiseL(18005, $densy); - //("RadarPlot Unsupported Tick density: $densy"); - } + case TICKD_DENSE: + $this->ytick_factor=12; + break; + case TICKD_NORMAL: + $this->ytick_factor=25; + break; + case TICKD_SPARSE: + $this->ytick_factor=40; + break; + case TICKD_VERYSPARSE: + $this->ytick_factor=70; + break; + default: + JpGraphError::RaiseL(18005, $densy); +//("RadarPlot Unsupported Tick density: $densy"); + } } public function SetPos($px, $py=0.5) @@ -694,48 +688,26 @@ class RadarGraph extends Graph public function SetCenter($px, $py=0.5) { - if ($px >= 0 && $px <= 1) { - $this->posx = $this->img->width*$px; - } else { - $this->posx = $px; - } - if ($py >= 0 && $py <= 1) { - $this->posy = $this->img->height*$py; - } else { - $this->posy = $py; - } + assert($px > 0 && $py > 0); + $this->posx=$this->img->width*$px; + $this->posy=$this->img->height*$py; } - public function SetColor($aColor) + public function SetColor($c) { - $this->SetMarginColor($aColor); + $this->SetMarginColor($c); } - - public function SetTitles($aTitleArray) + + public function SetTitles($title) { - $this->axis_title = $aTitleArray; + $this->axis_title = $title; } - public function Add($aPlot) + public function Add($splot) { - if ($aPlot == null) { - JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph."); - } - if (is_array($aPlot) && count($aPlot) > 0) { - $cl = $aPlot[0]; - } else { - $cl = $aPlot; - } - - if ($cl instanceof Text) { - $this->AddText($aPlot); - } elseif (class_exists('IconPlot', false) && ($cl instanceof IconPlot)) { - $this->AddIcon($aPlot); - } else { - $this->plots[] = $aPlot; - } + $this->plots[]=$splot; } - + public function GetPlotsYMinMax($aPlots) { $min=$aPlots[0]->Min(); @@ -746,59 +718,21 @@ class RadarGraph extends Graph } if ($min < 0) { JpGraphError::RaiseL(18006, $min); - //("Minimum data $min (Radar plots should only be used when all data points > 0)"); } + //("Minimum data $min (Radar plots should only be used when all data points > 0)"); return array($min,$max); } - public function StrokeIcons() - { - if ($this->iIcons != null) { - $n = count($this->iIcons); - for ($i=0; $i < $n; ++$i) { - $this->iIcons[$i]->Stroke($this->img); - } - } - } - - public function StrokeTexts() - { - if ($this->texts != null) { - $n = count($this->texts); - for ($i=0; $i < $n; ++$i) { - $this->texts[$i]->Stroke($this->img); - } - } - } - // Stroke the Radar graph - public function Stroke($aStrokeFileName='') + public function Stroke($aStrokeFileName="") { - - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // a best we can. Therefor you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName === _CSIM_SPECIALFILE); - - // We need to know if we have stroked the plot in the - // GetCSIMareas. Otherwise the CSIM hasn't been generated - // and in the case of GetCSIM called before stroke to generate - // CSIM without storing an image to disk GetCSIM must call Stroke. - $this->iHasStroked = true; - $n = count($this->plots); // Set Y-scale - - if (!$this->yscale->IsSpecified() && count($this->plots) > 0) { + if (!$this->yscale->IsSpecified() && count($this->plots)>0) { list($min, $max) = $this->GetPlotsYMinMax($this->plots); $this->yscale->AutoScale($this->img, 0, $max, $this->len/$this->ytick_factor); } elseif ($this->yscale->IsSpecified() && - ($this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified())) { - + ($this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified())) { // The tick calculation will use the user suplied min/max values to determine // the ticks. If auto_ticks is false the exact user specifed min and max // values will be used for the scale. @@ -817,91 +751,75 @@ class RadarGraph extends Graph // Set start position end length of scale (in absolute pixels) $this->yscale->SetConstants($this->posx, $this->len); - + // We need as many axis as there are data points $nbrpnts=$this->plots[0]->GetCount(); - + // If we have no titles just number the axis 1,2,3,... if ($this->axis_title==null) { for ($i=0; $i < $nbrpnts; ++$i) { $this->axis_title[$i] = $i+1; } - } elseif (count($this->axis_title) < $nbrpnts) { + } elseif (count($this->axis_title)<$nbrpnts) { JpGraphError::RaiseL(18007); - // ("Number of titles does not match number of points in plot."); } + //("Number of titles does not match number of points in plot."); for ($i=0; $i < $n; ++$i) { if ($nbrpnts != $this->plots[$i]->GetCount()) { JpGraphError::RaiseL(18008); - //("Each radar plot must have the same number of data points."); } } + //("Each radar plot must have the same number of data points."); - if (!$_csim) { - if ($this->background_image != '') { - $this->StrokeFrameBackground(); - } else { - $this->StrokeFrame(); - $this->StrokeBackgroundGrad(); - } + if ($this->background_image != "") { + $this->StrokeFrameBackground(); + } else { + $this->StrokeFrame(); } $astep=2*M_PI/$nbrpnts; - if (!$_csim) { - if ($this->iIconDepth == DEPTH_BACK) { - $this->StrokeIcons(); - } - - - // Prepare legends - for ($i=0; $i < $n; ++$i) { - $this->plots[$i]->Legend($this); - } - $this->legend->Stroke($this->img); - $this->footer->Stroke($this->img); + // Prepare legends + for ($i=0; $i < $n; ++$i) { + $this->plots[$i]->Legend($this); } + $this->legend->Stroke($this->img); + $this->footer->Stroke($this->img); - if (!$_csim) { - if ($this->grid_depth == DEPTH_BACK) { - // Draw axis and grid - for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { - $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); - } - $this->grid->Stroke($this->img, $grid); - } - if ($this->iIconDepth == DEPTH_BACK) { - $this->StrokeIcons(); + if ($this->grid_depth == DEPTH_BACK) { + // Draw axis and grid + for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { + $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); } } - + // Plot points $a=M_PI/2; for ($i=0; $i < $n; ++$i) { $this->plots[$i]->Stroke($this->img, $this->posy, $this->yscale, $a); } - - if (!$_csim) { - if ($this->grid_depth != DEPTH_BACK) { - // Draw axis and grid - for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { - $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); - } - $this->grid->Stroke($this->img, $grid); + + if ($this->grid_depth != DEPTH_BACK) { + // Draw axis and grid + for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { + $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); } - - $this->StrokeTitles(); - $this->StrokeTexts(); - if ($this->iIconDepth == DEPTH_FRONT) { - $this->StrokeIcons(); + } + $this->grid->Stroke($this->img, $grid); + $this->StrokeTitles(); + + // Stroke texts + if ($this->texts != null) { + foreach ($this->texts as $t) { + $t->Stroke($this->img); } } // Should we do any final image transformation - if ($this->iImgTrans && !$_csim) { + if ($this->iImgTrans) { if (!class_exists('ImgTrans', false)) { require_once('jpgraph_imgtrans.php'); } - + $tform = new ImgTrans($this->img->img); $this->img->img = $tform->Skew3D( $this->iImgTransHorizon, @@ -913,17 +831,20 @@ class RadarGraph extends Graph $this->iImgTransBorder ); } - - if (!$_csim) { - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if ($aStrokeFileName == _IMG_HANDLER) { - return $this->img->img; - } else { - // Finally stream the generated picture - $this->cache->PutAndStream($this->img, $this->cache_name, $this->inline, $aStrokeFileName); - } + + // If the filename is given as the special "__handle" + // then the image handler is returned and the image is NOT + // streamed back + if ($aStrokeFileName == _IMG_HANDLER) { + return $this->img->img; + } else { + // Finally stream the generated picture + $this->cache->PutAndStream( + $this->img, + $this->cache_name, + $this->inline, + $aStrokeFileName + ); } } } // Class diff --git a/onyx2/include/jpgraph/jpgraph_regstat.php b/onyx2/include/jpgraph/jpgraph_regstat.php index e15b061..b5b9891 100644 --- a/onyx2/include/jpgraph/jpgraph_regstat.php +++ b/onyx2/include/jpgraph/jpgraph_regstat.php @@ -1,13 +1,13 @@ y2 = array(); $this->xdata = $xdata; @@ -52,7 +52,7 @@ class Spline $p = $s*$this->y2[$i-1]+2.0; $this->y2[$i] = ($s-1.0)/$p; $delta[$i] = ($ydata[$i+1]-$ydata[$i])/($xdata[$i+1]-$xdata[$i]) - - ($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]); + ($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]); $delta[$i] = (6.0*$delta[$i]/($xdata[$i+1]-$xdata[$i-1])-$s*$delta[$i-1])/$p; } @@ -106,7 +106,7 @@ class Spline $a = ($this->xdata[$max]-$xpoint)/$h; $b = ($xpoint-$this->xdata[$min])/$h; return $a*$this->ydata[$min]+$b*$this->ydata[$max]+ - (($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0; + (($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0; } } @@ -121,13 +121,13 @@ class Bezier * @license released under QPL * @abstract Bezier interoplated point generation, * computed from control points data sets, based on Paul Bourke algorithm : - * http://local.wasp.uwa.edu.au/~pbourke/geometry/bezier/index2.html + * http://astronomy.swin.edu.au/~pbourke/curves/bezier/ */ private $datax = array(); private $datay = array(); private $n=0; - - public function __construct($datax, $datay, $attraction_factor = 1) + + public function Bezier($datax, $datay, $attraction_factor = 1) { // Adding control point multiple time will raise their attraction power over the curve $this->n = count($datax); @@ -150,35 +150,22 @@ class Bezier $this->n *= $attraction_factor; } - /** - * Return a set of data points that specifies the bezier curve with $steps points - * @param $steps Number of new points to return - * @return array($datax, $datay) - */ public function Get($steps) { $datax = array(); $datay = array(); for ($i = 0; $i < $steps; $i++) { list($datumx, $datumy) = $this->GetPoint((double) $i / (double) $steps); - $datax[$i] = $datumx; - $datay[$i] = $datumy; + $datax[] = $datumx; + $datay[] = $datumy; } - + $datax[] = end($this->datax); $datay[] = end($this->datay); - + return array($datax, $datay); } - - /** - * Return one point on the bezier curve. $mu is the position on the curve where $mu is in the - * range 0 $mu < 1 where 0 is tha start point and 1 is the end point. Note that every newly computed - * point depends on all the existing points - * - * @param $mu Position on the bezier curve - * @return array($x, $y) - */ + public function GetPoint($mu) { $n = $this->n - 1; diff --git a/onyx2/include/jpgraph/jpgraph_rgb.inc.php b/onyx2/include/jpgraph/jpgraph_rgb.inc.php deleted file mode 100755 index 929b1c4..0000000 --- a/onyx2/include/jpgraph/jpgraph_rgb.inc.php +++ /dev/null @@ -1,615 +0,0 @@ -img = $aImg; - - // Conversion array between color names and RGB - $this->rgb_table = array( - 'aqua'=> array(0,255,255), - 'lime'=> array(0,255,0), - 'teal'=> array(0,128,128), - 'whitesmoke'=>array(245,245,245), - 'gainsboro'=>array(220,220,220), - 'oldlace'=>array(253,245,230), - 'linen'=>array(250,240,230), - 'antiquewhite'=>array(250,235,215), - 'papayawhip'=>array(255,239,213), - 'blanchedalmond'=>array(255,235,205), - 'bisque'=>array(255,228,196), - 'peachpuff'=>array(255,218,185), - 'navajowhite'=>array(255,222,173), - 'moccasin'=>array(255,228,181), - 'cornsilk'=>array(255,248,220), - 'ivory'=>array(255,255,240), - 'lemonchiffon'=>array(255,250,205), - 'seashell'=>array(255,245,238), - 'mintcream'=>array(245,255,250), - 'azure'=>array(240,255,255), - 'aliceblue'=>array(240,248,255), - 'lavender'=>array(230,230,250), - 'lavenderblush'=>array(255,240,245), - 'mistyrose'=>array(255,228,225), - 'white'=>array(255,255,255), - 'black'=>array(0,0,0), - 'darkslategray'=>array(47,79,79), - 'dimgray'=>array(105,105,105), - 'slategray'=>array(112,128,144), - 'lightslategray'=>array(119,136,153), - 'gray'=>array(190,190,190), - 'lightgray'=>array(211,211,211), - 'midnightblue'=>array(25,25,112), - 'navy'=>array(0,0,128), - 'indigo'=>array(75,0,130), - 'electricindigo'=>array(102,0,255), - 'deepindigo'=>array(138,43,226), - 'pigmentindigo'=>array(75,0,130), - 'indigodye'=>array(0,65,106), - 'cornflowerblue'=>array(100,149,237), - 'darkslateblue'=>array(72,61,139), - 'slateblue'=>array(106,90,205), - 'mediumslateblue'=>array(123,104,238), - 'lightslateblue'=>array(132,112,255), - 'mediumblue'=>array(0,0,205), - 'royalblue'=>array(65,105,225), - 'blue'=>array(0,0,255), - 'dodgerblue'=>array(30,144,255), - 'deepskyblue'=>array(0,191,255), - 'skyblue'=>array(135,206,235), - 'lightskyblue'=>array(135,206,250), - 'steelblue'=>array(70,130,180), - 'lightred'=>array(211,167,168), - 'lightsteelblue'=>array(176,196,222), - 'lightblue'=>array(173,216,230), - 'powderblue'=>array(176,224,230), - 'paleturquoise'=>array(175,238,238), - 'darkturquoise'=>array(0,206,209), - 'mediumturquoise'=>array(72,209,204), - 'turquoise'=>array(64,224,208), - 'cyan'=>array(0,255,255), - 'lightcyan'=>array(224,255,255), - 'cadetblue'=>array(95,158,160), - 'mediumaquamarine'=>array(102,205,170), - 'aquamarine'=>array(127,255,212), - 'darkgreen'=>array(0,100,0), - 'darkolivegreen'=>array(85,107,47), - 'darkseagreen'=>array(143,188,143), - 'seagreen'=>array(46,139,87), - 'mediumseagreen'=>array(60,179,113), - 'lightseagreen'=>array(32,178,170), - 'palegreen'=>array(152,251,152), - 'springgreen'=>array(0,255,127), - 'lawngreen'=>array(124,252,0), - 'green'=>array(0,255,0), - 'chartreuse'=>array(127,255,0), - 'mediumspringgreen'=>array(0,250,154), - 'greenyellow'=>array(173,255,47), - 'limegreen'=>array(50,205,50), - 'yellowgreen'=>array(154,205,50), - 'forestgreen'=>array(34,139,34), - 'olivedrab'=>array(107,142,35), - 'darkkhaki'=>array(189,183,107), - 'khaki'=>array(240,230,140), - 'palegoldenrod'=>array(238,232,170), - 'lightgoldenrodyellow'=>array(250,250,210), - 'lightyellow'=>array(255,255,200), - 'yellow'=>array(255,255,0), - 'gold'=>array(255,215,0), - 'lightgoldenrod'=>array(238,221,130), - 'goldenrod'=>array(218,165,32), - 'darkgoldenrod'=>array(184,134,11), - 'rosybrown'=>array(188,143,143), - 'indianred'=>array(205,92,92), - 'saddlebrown'=>array(139,69,19), - 'sienna'=>array(160,82,45), - 'peru'=>array(205,133,63), - 'burlywood'=>array(222,184,135), - 'beige'=>array(245,245,220), - 'wheat'=>array(245,222,179), - 'sandybrown'=>array(244,164,96), - 'tan'=>array(210,180,140), - 'chocolate'=>array(210,105,30), - 'firebrick'=>array(178,34,34), - 'brown'=>array(165,42,42), - 'darksalmon'=>array(233,150,122), - 'salmon'=>array(250,128,114), - 'lightsalmon'=>array(255,160,122), - 'orange'=>array(255,165,0), - 'darkorange'=>array(255,140,0), - 'coral'=>array(255,127,80), - 'lightcoral'=>array(240,128,128), - 'tomato'=>array(255,99,71), - 'orangered'=>array(255,69,0), - 'red'=>array(255,0,0), - 'hotpink'=>array(255,105,180), - 'deeppink'=>array(255,20,147), - 'pink'=>array(255,192,203), - 'lightpink'=>array(255,182,193), - 'palevioletred'=>array(219,112,147), - 'maroon'=>array(176,48,96), - 'mediumvioletred'=>array(199,21,133), - 'violetred'=>array(208,32,144), - 'magenta'=>array(255,0,255), - 'violet'=>array(238,130,238), - 'plum'=>array(221,160,221), - 'orchid'=>array(218,112,214), - 'mediumorchid'=>array(186,85,211), - 'darkorchid'=>array(153,50,204), - 'darkviolet'=>array(148,0,211), - 'blueviolet'=>array(138,43,226), - 'purple'=>array(160,32,240), - 'mediumpurple'=>array(147,112,219), - 'thistle'=>array(216,191,216), - 'snow1'=>array(255,250,250), - 'snow2'=>array(238,233,233), - 'snow3'=>array(205,201,201), - 'snow4'=>array(139,137,137), - 'seashell1'=>array(255,245,238), - 'seashell2'=>array(238,229,222), - 'seashell3'=>array(205,197,191), - 'seashell4'=>array(139,134,130), - 'AntiqueWhite1'=>array(255,239,219), - 'AntiqueWhite2'=>array(238,223,204), - 'AntiqueWhite3'=>array(205,192,176), - 'AntiqueWhite4'=>array(139,131,120), - 'bisque1'=>array(255,228,196), - 'bisque2'=>array(238,213,183), - 'bisque3'=>array(205,183,158), - 'bisque4'=>array(139,125,107), - 'peachPuff1'=>array(255,218,185), - 'peachpuff2'=>array(238,203,173), - 'peachpuff3'=>array(205,175,149), - 'peachpuff4'=>array(139,119,101), - 'navajowhite1'=>array(255,222,173), - 'navajowhite2'=>array(238,207,161), - 'navajowhite3'=>array(205,179,139), - 'navajowhite4'=>array(139,121,94), - 'lemonchiffon1'=>array(255,250,205), - 'lemonchiffon2'=>array(238,233,191), - 'lemonchiffon3'=>array(205,201,165), - 'lemonchiffon4'=>array(139,137,112), - 'ivory1'=>array(255,255,240), - 'ivory2'=>array(238,238,224), - 'ivory3'=>array(205,205,193), - 'ivory4'=>array(139,139,131), - 'honeydew'=>array(193,205,193), - 'lavenderblush1'=>array(255,240,245), - 'lavenderblush2'=>array(238,224,229), - 'lavenderblush3'=>array(205,193,197), - 'lavenderblush4'=>array(139,131,134), - 'mistyrose1'=>array(255,228,225), - 'mistyrose2'=>array(238,213,210), - 'mistyrose3'=>array(205,183,181), - 'mistyrose4'=>array(139,125,123), - 'azure1'=>array(240,255,255), - 'azure2'=>array(224,238,238), - 'azure3'=>array(193,205,205), - 'azure4'=>array(131,139,139), - 'slateblue1'=>array(131,111,255), - 'slateblue2'=>array(122,103,238), - 'slateblue3'=>array(105,89,205), - 'slateblue4'=>array(71,60,139), - 'royalblue1'=>array(72,118,255), - 'royalblue2'=>array(67,110,238), - 'royalblue3'=>array(58,95,205), - 'royalblue4'=>array(39,64,139), - 'dodgerblue1'=>array(30,144,255), - 'dodgerblue2'=>array(28,134,238), - 'dodgerblue3'=>array(24,116,205), - 'dodgerblue4'=>array(16,78,139), - 'steelblue1'=>array(99,184,255), - 'steelblue2'=>array(92,172,238), - 'steelblue3'=>array(79,148,205), - 'steelblue4'=>array(54,100,139), - 'deepskyblue1'=>array(0,191,255), - 'deepskyblue2'=>array(0,178,238), - 'deepskyblue3'=>array(0,154,205), - 'deepskyblue4'=>array(0,104,139), - 'skyblue1'=>array(135,206,255), - 'skyblue2'=>array(126,192,238), - 'skyblue3'=>array(108,166,205), - 'skyblue4'=>array(74,112,139), - 'lightskyblue1'=>array(176,226,255), - 'lightskyblue2'=>array(164,211,238), - 'lightskyblue3'=>array(141,182,205), - 'lightskyblue4'=>array(96,123,139), - 'slategray1'=>array(198,226,255), - 'slategray2'=>array(185,211,238), - 'slategray3'=>array(159,182,205), - 'slategray4'=>array(108,123,139), - 'lightsteelblue1'=>array(202,225,255), - 'lightsteelblue2'=>array(188,210,238), - 'lightsteelblue3'=>array(162,181,205), - 'lightsteelblue4'=>array(110,123,139), - 'lightblue1'=>array(191,239,255), - 'lightblue2'=>array(178,223,238), - 'lightblue3'=>array(154,192,205), - 'lightblue4'=>array(104,131,139), - 'lightcyan1'=>array(224,255,255), - 'lightcyan2'=>array(209,238,238), - 'lightcyan3'=>array(180,205,205), - 'lightcyan4'=>array(122,139,139), - 'paleturquoise1'=>array(187,255,255), - 'paleturquoise2'=>array(174,238,238), - 'paleturquoise3'=>array(150,205,205), - 'paleturquoise4'=>array(102,139,139), - 'cadetblue1'=>array(152,245,255), - 'cadetblue2'=>array(142,229,238), - 'cadetblue3'=>array(122,197,205), - 'cadetblue4'=>array(83,134,139), - 'turquoise1'=>array(0,245,255), - 'turquoise2'=>array(0,229,238), - 'turquoise3'=>array(0,197,205), - 'turquoise4'=>array(0,134,139), - 'cyan1'=>array(0,255,255), - 'cyan2'=>array(0,238,238), - 'cyan3'=>array(0,205,205), - 'cyan4'=>array(0,139,139), - 'darkslategray1'=>array(151,255,255), - 'darkslategray2'=>array(141,238,238), - 'darkslategray3'=>array(121,205,205), - 'darkslategray4'=>array(82,139,139), - 'aquamarine1'=>array(127,255,212), - 'aquamarine2'=>array(118,238,198), - 'aquamarine3'=>array(102,205,170), - 'aquamarine4'=>array(69,139,116), - 'darkseagreen1'=>array(193,255,193), - 'darkseagreen2'=>array(180,238,180), - 'darkseagreen3'=>array(155,205,155), - 'darkseagreen4'=>array(105,139,105), - 'seagreen1'=>array(84,255,159), - 'seagreen2'=>array(78,238,148), - 'seagreen3'=>array(67,205,128), - 'seagreen4'=>array(46,139,87), - 'palegreen1'=>array(154,255,154), - 'palegreen2'=>array(144,238,144), - 'palegreen3'=>array(124,205,124), - 'palegreen4'=>array(84,139,84), - 'springgreen1'=>array(0,255,127), - 'springgreen2'=>array(0,238,118), - 'springgreen3'=>array(0,205,102), - 'springgreen4'=>array(0,139,69), - 'chartreuse1'=>array(127,255,0), - 'chartreuse2'=>array(118,238,0), - 'chartreuse3'=>array(102,205,0), - 'chartreuse4'=>array(69,139,0), - 'olivedrab1'=>array(192,255,62), - 'olivedrab2'=>array(179,238,58), - 'olivedrab3'=>array(154,205,50), - 'olivedrab4'=>array(105,139,34), - 'darkolivegreen1'=>array(202,255,112), - 'darkolivegreen2'=>array(188,238,104), - 'darkolivegreen3'=>array(162,205,90), - 'darkolivegreen4'=>array(110,139,61), - 'khaki1'=>array(255,246,143), - 'khaki2'=>array(238,230,133), - 'khaki3'=>array(205,198,115), - 'khaki4'=>array(139,134,78), - 'lightgoldenrod1'=>array(255,236,139), - 'lightgoldenrod2'=>array(238,220,130), - 'lightgoldenrod3'=>array(205,190,112), - 'lightgoldenrod4'=>array(139,129,76), - 'yellow1'=>array(255,255,0), - 'yellow2'=>array(238,238,0), - 'yellow3'=>array(205,205,0), - 'yellow4'=>array(139,139,0), - 'gold1'=>array(255,215,0), - 'gold2'=>array(238,201,0), - 'gold3'=>array(205,173,0), - 'gold4'=>array(139,117,0), - 'goldenrod1'=>array(255,193,37), - 'goldenrod2'=>array(238,180,34), - 'goldenrod3'=>array(205,155,29), - 'goldenrod4'=>array(139,105,20), - 'darkgoldenrod1'=>array(255,185,15), - 'darkgoldenrod2'=>array(238,173,14), - 'darkgoldenrod3'=>array(205,149,12), - 'darkgoldenrod4'=>array(139,101,8), - 'rosybrown1'=>array(255,193,193), - 'rosybrown2'=>array(238,180,180), - 'rosybrown3'=>array(205,155,155), - 'rosybrown4'=>array(139,105,105), - 'indianred1'=>array(255,106,106), - 'indianred2'=>array(238,99,99), - 'indianred3'=>array(205,85,85), - 'indianred4'=>array(139,58,58), - 'sienna1'=>array(255,130,71), - 'sienna2'=>array(238,121,66), - 'sienna3'=>array(205,104,57), - 'sienna4'=>array(139,71,38), - 'burlywood1'=>array(255,211,155), - 'burlywood2'=>array(238,197,145), - 'burlywood3'=>array(205,170,125), - 'burlywood4'=>array(139,115,85), - 'wheat1'=>array(255,231,186), - 'wheat2'=>array(238,216,174), - 'wheat3'=>array(205,186,150), - 'wheat4'=>array(139,126,102), - 'tan1'=>array(255,165,79), - 'tan2'=>array(238,154,73), - 'tan3'=>array(205,133,63), - 'tan4'=>array(139,90,43), - 'chocolate1'=>array(255,127,36), - 'chocolate2'=>array(238,118,33), - 'chocolate3'=>array(205,102,29), - 'chocolate4'=>array(139,69,19), - 'firebrick1'=>array(255,48,48), - 'firebrick2'=>array(238,44,44), - 'firebrick3'=>array(205,38,38), - 'firebrick4'=>array(139,26,26), - 'brown1'=>array(255,64,64), - 'brown2'=>array(238,59,59), - 'brown3'=>array(205,51,51), - 'brown4'=>array(139,35,35), - 'salmon1'=>array(255,140,105), - 'salmon2'=>array(238,130,98), - 'salmon3'=>array(205,112,84), - 'salmon4'=>array(139,76,57), - 'lightsalmon1'=>array(255,160,122), - 'lightsalmon2'=>array(238,149,114), - 'lightsalmon3'=>array(205,129,98), - 'lightsalmon4'=>array(139,87,66), - 'orange1'=>array(255,165,0), - 'orange2'=>array(238,154,0), - 'orange3'=>array(205,133,0), - 'orange4'=>array(139,90,0), - 'darkorange1'=>array(255,127,0), - 'darkorange2'=>array(238,118,0), - 'darkorange3'=>array(205,102,0), - 'darkorange4'=>array(139,69,0), - 'coral1'=>array(255,114,86), - 'coral2'=>array(238,106,80), - 'coral3'=>array(205,91,69), - 'coral4'=>array(139,62,47), - 'tomato1'=>array(255,99,71), - 'tomato2'=>array(238,92,66), - 'tomato3'=>array(205,79,57), - 'tomato4'=>array(139,54,38), - 'orangered1'=>array(255,69,0), - 'orangered2'=>array(238,64,0), - 'orangered3'=>array(205,55,0), - 'orangered4'=>array(139,37,0), - 'deeppink1'=>array(255,20,147), - 'deeppink2'=>array(238,18,137), - 'deeppink3'=>array(205,16,118), - 'deeppink4'=>array(139,10,80), - 'hotpink1'=>array(255,110,180), - 'hotpink2'=>array(238,106,167), - 'hotpink3'=>array(205,96,144), - 'hotpink4'=>array(139,58,98), - 'pink1'=>array(255,181,197), - 'pink2'=>array(238,169,184), - 'pink3'=>array(205,145,158), - 'pink4'=>array(139,99,108), - 'lightpink1'=>array(255,174,185), - 'lightpink2'=>array(238,162,173), - 'lightpink3'=>array(205,140,149), - 'lightpink4'=>array(139,95,101), - 'palevioletred1'=>array(255,130,171), - 'palevioletred2'=>array(238,121,159), - 'palevioletred3'=>array(205,104,137), - 'palevioletred4'=>array(139,71,93), - 'maroon1'=>array(255,52,179), - 'maroon2'=>array(238,48,167), - 'maroon3'=>array(205,41,144), - 'maroon4'=>array(139,28,98), - 'violetred1'=>array(255,62,150), - 'violetred2'=>array(238,58,140), - 'violetred3'=>array(205,50,120), - 'violetred4'=>array(139,34,82), - 'magenta1'=>array(255,0,255), - 'magenta2'=>array(238,0,238), - 'magenta3'=>array(205,0,205), - 'magenta4'=>array(139,0,139), - 'mediumred'=>array(140,34,34), - 'orchid1'=>array(255,131,250), - 'orchid2'=>array(238,122,233), - 'orchid3'=>array(205,105,201), - 'orchid4'=>array(139,71,137), - 'plum1'=>array(255,187,255), - 'plum2'=>array(238,174,238), - 'plum3'=>array(205,150,205), - 'plum4'=>array(139,102,139), - 'mediumorchid1'=>array(224,102,255), - 'mediumorchid2'=>array(209,95,238), - 'mediumorchid3'=>array(180,82,205), - 'mediumorchid4'=>array(122,55,139), - 'darkorchid1'=>array(191,62,255), - 'darkorchid2'=>array(178,58,238), - 'darkorchid3'=>array(154,50,205), - 'darkorchid4'=>array(104,34,139), - 'purple1'=>array(155,48,255), - 'purple2'=>array(145,44,238), - 'purple3'=>array(125,38,205), - 'purple4'=>array(85,26,139), - 'mediumpurple1'=>array(171,130,255), - 'mediumpurple2'=>array(159,121,238), - 'mediumpurple3'=>array(137,104,205), - 'mediumpurple4'=>array(93,71,139), - 'thistle1'=>array(255,225,255), - 'thistle2'=>array(238,210,238), - 'thistle3'=>array(205,181,205), - 'thistle4'=>array(139,123,139), - 'gray1'=>array(10,10,10), - 'gray2'=>array(40,40,30), - 'gray3'=>array(70,70,70), - 'gray4'=>array(100,100,100), - 'gray5'=>array(130,130,130), - 'gray6'=>array(160,160,160), - 'gray7'=>array(190,190,190), - 'gray8'=>array(210,210,210), - 'gray9'=>array(240,240,240), - 'darkgray'=>array(100,100,100), - 'darkblue'=>array(0,0,139), - 'darkcyan'=>array(0,139,139), - 'darkmagenta'=>array(139,0,139), - 'darkred'=>array(139,0,0), - 'silver'=>array(192, 192, 192), - 'eggplant'=>array(144,176,168), - 'lightgreen'=>array(144,238,144)); - } - - - //---------------- - // PUBLIC METHODS - // Colors can be specified as either - // 1. #xxxxxx HTML style - // 2. "colorname" as a named color - // 3. array(r,g,b) RGB triple - // This function translates this to a native RGB format and returns an - // RGB triple. - - public function Color($aColor) - { - if (is_string($aColor)) { - $matches = array(); - // this regex will parse a color string and fill the $matches array as such: - // 0: the full match if any - // 1: a hex string preceded by a hash, can be 3 characters (#fff) or 6 (#ffffff) (4 or 5 also accepted but...) - // 2,3,4: r,g,b values in hex if the first character of the string is # - // 5: all alpha-numeric characters at the beginning of the string if string does not start with # - // 6: alpha value prefixed by @ if supplied - // 7: alpha value with @ stripped - // 8: adjust value prefixed with : if supplied - // 9: adjust value with : stripped - $regex = '/(#([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2}))?([\w]+)?(@([\d\.,]+))?(:([\d\.,]+))?/'; - if (!preg_match($regex, $aColor, $matches)) { - JpGraphError::RaiseL(25078, $aColor);//(" Unknown color: $aColor"); - } - if (empty($matches[5])) { - $r = strlen($matches[2]) == 1 ? $matches[2].$matches[2] : $matches[2]; - $g = strlen($matches[3]) == 1 ? $matches[3].$matches[3] : $matches[3]; - $b = strlen($matches[4]) == 1 ? $matches[4].$matches[4] : $matches[4]; - $r = hexdec($r); - $g = hexdec($g); - $b = hexdec($b); - } else { - if (!isset($this->rgb_table[$matches[5]])) { - JpGraphError::RaiseL(25078, $aColor);//(" Unknown color: $aColor"); - } - $r = $this->rgb_table[$matches[5]][0]; - $g = $this->rgb_table[$matches[5]][1]; - $b = $this->rgb_table[$matches[5]][2]; - } - $alpha = isset($matches[7]) ? str_replace(',', '.', $matches[7]) : 0; - $adj = isset($matches[9]) ? str_replace(',', '.', $matches[9]) : 1.0; - - if ($adj < 0) { - JpGraphError::RaiseL(25077);//('Adjustment factor for color must be > 0'); - } - - // Scale adj so that an adj=2 always - // makes the color 100% white (i.e. 255,255,255. - // and adj=1 neutral and adj=0 black. - if ($adj == 1) { - return array($r,$g,$b,$alpha); - } elseif ($adj > 1) { - $m = ($adj-1.0)*(255-min(255, min($r, min($g, $b)))); - return array(min(255, $r+$m), min(255, $g+$m), min(255, $b+$m),$alpha); - } elseif ($adj < 1) { - $m = ($adj-1.0)*max(255, max($r, max($g, $b))); - return array(max(0, $r+$m), max(0, $g+$m), max(0, $b+$m),$alpha); - } - } elseif (is_array($aColor)) { - if (!isset($aColor[3])) { - $aColor[3] = 0; - } - return $aColor; - } else { - JpGraphError::RaiseL(25079, $aColor, count($aColor));//(" Unknown color specification: $aColor , size=".count($aColor)); - } - } - - // Compare two colors - // return true if equal - public function Equal($aCol1, $aCol2) - { - $c1 = $this->Color($aCol1); - $c2 = $this->Color($aCol2); - return $c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2] ; - } - - // Allocate a new color in the current image - // Return new color index, -1 if no more colors could be allocated - public function Allocate($aColor, $aAlpha=0.0) - { - list($r, $g, $b, $a) = $this->color($aColor); - // If alpha is specified in the color string then this - // takes precedence over the second argument - if ($a > 0) { - $aAlpha = $a; - } - if ($aAlpha < 0 || $aAlpha > 1) { - JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0'); - } - return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127)); - } - - // Try to convert an array with three valid numbers to the corresponding hex array - // This is currenly only used in processing the colors for barplots in order to be able - // to handle the case where the color might be specified as an array of colros as well. - // In that case we must be able to find out if an array of values should be interpretated as - // a single color (specifeid as an RGB triple) - public static function tryHexConversion($aColor) - { - if (is_array($aColor)) { - if (count($aColor) == 3) { - if (is_numeric($aColor[0]) && is_numeric($aColor[1]) && is_numeric($aColor[2])) { - if (($aColor[0] >= 0 && $aColor[0] <= 255) && - ($aColor[1] >= 0 && $aColor[1] <= 255) && - ($aColor[2] >= 0 && $aColor[2] <= 255)) { - return sprintf('#%02x%02x%02x', $aColor[0], $aColor[1], $aColor[2]); - } - } - } - } - return $aColor; - } - - // Return a RGB tripple corresponding to a position in the normal light spectrum - // The argumen values is in the range [0, 1] where a value of 0 correponds to blue and - // a value of 1 corresponds to red. Values in betwen is mapped to a linear interpolation - // of the constituting colors in the visible color spectra. - // The $aDynamicRange specified how much of the dynamic range we shold use - // a value of 1.0 give the full dyanmic range and a lower value give more dark - // colors. In the extreme of 0.0 then all colors will be black. - public static function GetSpectrum($aVal, $aDynamicRange=1.0) - { - if ($aVal < 0 || $aVal > 1.0001) { - return array(0,0,0); // Invalid case - just return black - } - - $sat = round(255*$aDynamicRange); - $a = 0.25; - if ($aVal <= 0.25) { - return array(0, round($sat*$aVal/$a), $sat); - } elseif ($aVal <= 0.5) { - return array(0, $sat, round($sat-$sat*($aVal-0.25)/$a)); - } elseif ($aVal <= 0.75) { - return array(round($sat*($aVal-0.5)/$a), $sat, 0); - } else { - return array($sat, round($sat-$sat*($aVal-0.75)/$a), 0); - } - } -} // Class diff --git a/onyx2/include/jpgraph/jpgraph_scatter.php b/onyx2/include/jpgraph/jpgraph_scatter.php index 550338e..eb0c6be 100644 --- a/onyx2/include/jpgraph/jpgraph_scatter.php +++ b/onyx2/include/jpgraph/jpgraph_scatter.php @@ -1,13 +1,13 @@ iAngles = $angles; - parent::__construct($datay, $datax); + $this->Plot($datay, $datax); $this->value->SetAlign('center', 'center'); $this->value->SetMargin(15); @@ -99,7 +97,7 @@ class FieldPlot extends Plot public function Stroke($img, $xscale, $yscale) { - // Remeber base color and size + // Remeber base color and size $bc = $this->arrow->iColor; $bs = $this->arrow->iSize; $bas = $this->arrow->iArrowSize; @@ -134,7 +132,7 @@ class FieldPlot extends Plot $this->value->Stroke($img, $this->coords[0][$i], $xt, $yt); } } - + // Framework function public function Legend($aGraph) { @@ -158,24 +156,24 @@ class FieldPlot extends Plot //=================================================== class ScatterPlot extends Plot { - public $mark; - public $link; + public $mark = ''; private $impuls = false; + private $linkpoints = false; + private $linkpointweight=1; + private $linkpointcolor="black"; //--------------- // CONSTRUCTOR - public function __construct($datay, $datax=false) + public function ScatterPlot($datay, $datax=false) { - if (is_array($datax) && (count($datax) != count($datay))) { - JpGraphError::RaiseL(20003);//("Scatterplot must have equal number of X and Y points."); - } - parent::__construct($datay, $datax); + if ((count($datax) != count($datay)) && is_array($datax)) { + JpGraphError::RaiseL(20003); + }//("Scatterplot must have equal number of X and Y points."); + $this->Plot($datay, $datax); $this->mark = new PlotMark(); $this->mark->SetType(MARK_SQUARE); $this->mark->SetColor($this->color); $this->value->SetAlign('center', 'center'); $this->value->SetMargin(0); - $this->link = new LineProperty(1, 'black', 'solid'); - $this->link->iShow = false; } //--------------- @@ -185,18 +183,12 @@ class ScatterPlot extends Plot $this->impuls = $f; } - public function SetStem($f=true) - { - $this->impuls = $f; - } - // Combine the scatter plot points with a line - public function SetLinkPoints($aFlag=true, $aColor="black", $aWeight=1, $aStyle='solid') + public function SetLinkPoints($aFlag=true, $aColor="black", $aWeight=1) { - $this->link->iShow = $aFlag; - $this->link->iColor = $aColor; - $this->link->iWeight = $aWeight; - $this->link->iStyle = $aStyle; + $this->linkpoints=$aFlag; + $this->linkpointcolor=$aColor; + $this->linkpointweight=$aWeight; } public function Stroke($img, $xscale, $yscale) @@ -207,11 +199,11 @@ class ScatterPlot extends Plot } else { $yzero=$yscale->scale_abs[0]; } - + $this->csimareas = ''; for ($i=0; $i<$this->numpoints; ++$i) { - // Skip null values + // Skip null values if ($this->coords[0][$i]==='' || $this->coords[0][$i]==='-' || $this->coords[0][$i]==='x') { continue; } @@ -224,12 +216,10 @@ class ScatterPlot extends Plot $yt = $yscale->Translate($this->coords[0][$i]); - if ($this->link->iShow && isset($yt_old)) { - $img->SetColor($this->link->iColor); - $img->SetLineWeight($this->link->iWeight); - $old = $img->SetLineStyle($this->link->iStyle); - $img->StyleLine($xt_old, $yt_old, $xt, $yt); - $img->SetLineStyle($old); + if ($this->linkpoints && isset($yt_old)) { + $img->SetColor($this->linkpointcolor); + $img->SetLineWeight($this->linkpointweight); + $img->Line($xt_old, $yt_old, $xt, $yt); } if ($this->impuls) { @@ -237,7 +227,7 @@ class ScatterPlot extends Plot $img->SetLineWeight($this->weight); $img->Line($xt, $yzero, $xt, $yt); } - + if (!empty($this->csimtargets[$i])) { if (!empty($this->csimwintargets[$i])) { $this->mark->SetCSIMTarget($this->csimtargets[$i], $this->csimwintargets[$i]); @@ -246,7 +236,7 @@ class ScatterPlot extends Plot } $this->mark->SetCSIMAlt($this->csimalts[$i]); } - + if (isset($this->coords[1])) { $this->mark->SetCSIMAltVal($this->coords[0][$i], $this->coords[1][$i]); } else { @@ -254,7 +244,7 @@ class ScatterPlot extends Plot } $this->mark->Stroke($img, $xt, $yt); - + $this->csimareas .= $this->mark->GetCSIMAreas(); $this->value->Stroke($img, $this->coords[0][$i], $xt, $yt); @@ -262,7 +252,7 @@ class ScatterPlot extends Plot $yt_old = $yt; } } - + // Framework function public function Legend($aGraph) { diff --git a/onyx2/include/jpgraph/jpgraph_stock.php b/onyx2/include/jpgraph/jpgraph_stock.php index c5d6120..8943ad4 100644 --- a/onyx2/include/jpgraph/jpgraph_stock.php +++ b/onyx2/include/jpgraph/jpgraph_stock.php @@ -1,13 +1,13 @@ iTupleSize) { JpGraphError::RaiseL(21001, $this->iTupleSize); //('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.'); } - parent::__construct($datay, $datax); + $this->Plot($datay, $datax); $this->numpoints /= $this->iTupleSize; } //--------------- // PUBLIC METHODS - + public function SetColor($aColor, $aColor1='white', $aColor2='darkred', $aColor3='darkred') { $this->color = $aColor; @@ -67,7 +67,7 @@ class StockPlot extends Plot $graph->xaxis->scale->ticks->SetXLabelOffset($a); $graph->SetTextScaleOff($b); } - + // Method description public function Stroke($img, $xscale, $yscale) { @@ -78,8 +78,9 @@ class StockPlot extends Plot if (isset($this->coords[1])) { if (count($this->coords[1])!=$n) { JpGraphError::RaiseL(2003, count($this->coords[1]), $n); - // ("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); - } else { + } + //("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); + else { $exist_x = true; } } else { @@ -91,26 +92,23 @@ class StockPlot extends Plot } else { $xs=0; } - + $ts = $this->iTupleSize; $this->csimareas = ''; for ($i=0; $i<$n; ++$i) { - //If value is NULL, then don't draw a bar at all - if ($this->coords[0][$i*$ts] === null) { + //If value is NULL, then don't draw a bar at all + if ($this->coords[0][$i] === null) { continue; } if ($exist_x) { $x=$this->coords[1][$i]; - if ($x === null) { - continue; - } } else { $x=$i; } $xt = $xscale->Translate($x); - + $neg = $this->coords[0][$i*$ts] > $this->coords[0][$i*$ts+1] ; $yopen = $yscale->Translate($this->coords[0][$i*$ts]); $yclose = $yscale->Translate($this->coords[0][$i*$ts+1]); @@ -133,7 +131,7 @@ class StockPlot extends Plot } else { $img->SetColor($this->color); } - + $img->Rectangle($xl, $yopen, $xr, $yclose); if ($yopen < $yclose) { @@ -159,8 +157,8 @@ class StockPlot extends Plot // Setup image maps if (!empty($this->csimtargets[$i])) { $this->csimareas.= 'csimareas .= ' href="'.$this->csimtargets[$i].'"'; if (!empty($this->csimalts[$i])) { $sval=$this->csimalts[$i]; @@ -185,11 +183,10 @@ class BoxPlot extends StockPlot { private $iPColor='black'; private $iNColor='white'; - - public function __construct($datay, $datax=false) + public function BoxPlot($datay, $datax=false) { $this->iTupleSize=5; - parent::__construct($datay, $datax); + parent::StockPlot($datay, $datax); } public function SetMedianColor($aPos, $aNeg) @@ -205,7 +202,7 @@ class BoxPlot extends StockPlot } else { $img->SetColor($this->iPColor); } - + $y = $yscale->Translate($this->coords[0][$i*5+4]); $img->Line($xl, $y, $xr, $y); } diff --git a/onyx2/include/jpgraph/jpgraph_table.php b/onyx2/include/jpgraph/jpgraph_table.php deleted file mode 100755 index b6d8de5..0000000 --- a/onyx2/include/jpgraph/jpgraph_table.php +++ /dev/null @@ -1,1502 +0,0 @@ -iVal = new Text($aVal); - $this->iRow = $aRow; - $this->iCol = $aCol; - $this->iPRow = $aRow; // Initialiy each cell is its own parent - $this->iPCol = $aCol; - $this->iIconConstrain = array(-1,-1); - } - - public function Init($aTable) - { - $this->iTable = $aTable; - } - - public function SetCSIMTarget($aTarget, $aAlt='', $aWinTarget='') - { - $this->iCSIMtarget = $aTarget; - $this->iCSIMwintarget = $aWinTarget; - $this->iCSIMalt = $aAlt; - } - - public function GetCSIMArea() - { - if ($this->iCSIMtarget !== '') { - return $this->iCSIMArea; - } else { - return ''; - } - } - - public function SetImageConstrain($aType, $aVal) - { - if (!in_array($aType, array(TIMG_WIDTH, TIMG_HEIGHT))) { - JpGraphError::RaiseL(27015); - } - $this->iIconConstrain = array($aType,$aVal); - } - - public function SetCountryFlag($aFlag, $aScale=1.0, $aMix=100, $aStdSize=3) - { - $this->iIcon = new IconPlot(); - $this->iIcon->SetCountryFlag($aFlag, 0, 0, $aScale, $aMix, $aStdSize); - } - - public function SetImage($aFile, $aScale=1.0, $aMix=100) - { - $this->iIcon = new IconPlot($aFile, 0, 0, $aScale, $aMix); - } - - public function SetImageFromString($aStr, $aScale=1.0, $aMix=100) - { - $this->iIcon = new IconPlot("", 0, 0, $aScale, $aMix); - $this->iIcon->CreateFromString($aStr); - } - - public function SetRowColSpan($aRowSpan, $aColSpan) - { - $this->iRowSpan = $aRowSpan; - $this->iColSpan = $aColSpan; - $this->iMerged = true; - } - - public function SetMerged($aPRow, $aPCol, $aFlg=true) - { - $this->iMerged = $aFlg; - $this->iPRow=$aPRow; - $this->iPCol=$aPCol; - } - - public function IsMerged() - { - return $this->iMerged; - } - - public function SetNumberFormat($aF) - { - $this->iNumberFormat = $aF; - } - - public function Set($aTxt) - { - $this->iVal->Set($aTxt); - } - - public function SetFont($aFF, $aFS, $aFSize) - { - $this->iFF = $aFF; - $this->iFS = $aFS; - $this->iFSize = $aFSize; - $this->iVal->SetFont($aFF, $aFS, $aFSize); - } - - public function SetFillColor($aColor) - { - $this->iBGColor=$aColor; - } - - public function SetFontColor($aColor) - { - $this->iFontColor=$aColor; - } - - public function SetGridColor($aLeft, $aTop=null, $aBottom=null, $aRight=null) - { - if ($aLeft !== null) { - $this->iGridColor[0] = $aLeft; - } - if ($aTop !== null) { - $this->iGridColor[1] = $aTop; - } - if ($aBottom !== null) { - $this->iGridColor[2] = $aBottom; - } - if ($aRight !== null) { - $this->iGridColor[3] = $aRight; - } - } - - public function SetGridStyle($aLeft, $aTop=null, $aBottom=null, $aRight=null) - { - if ($aLeft !== null) { - $this->iGridStyle[0] = $aLeft; - } - if ($aTop !== null) { - $this->iGridStyle[1] = $aTop; - } - if ($aBottom !== null) { - $this->iGridStyle[2] = $aBottom; - } - if ($aRight !== null) { - $this->iGridStyle[3] = $aRight; - } - } - - public function SetGridWeight($aLeft=null, $aTop=null, $aBottom=null, $aRight=null) - { - $weight_arr = array($aLeft, $aTop, $aBottom, $aRight); - for ($i = 0; $i < count($weight_arr); $i++) { - if ($weight_arr[$i] === "") { - $weight_arr[$i] = 0; - } - } - if ($aLeft !== null) { - $this->iGridWeight[0] = $weight_arr[0]; - } - if ($aTop !== null) { - $this->iGridWeight[1] = $weight_arr[1]; - } - if ($aBottom !== null) { - $this->iGridWeight[2] = $weight_arr[2]; - } - if ($aRight !== null) { - $this->iGridWeight[3] = $weight_arr[3]; - } - } - - public function SetMargin($aLeft, $aRight, $aTop, $aBottom) - { - $this->iMarginLeft=$aLeft; - $this->iMarginRight=$aRight; - $this->iMarginTop=$aTop; - $this->iMarginBottom=$aBottom; - } - - public function GetWidth($aImg) - { - if ($this->iIcon !== null) { - if ($this->iIconConstrain[0] == TIMG_WIDTH) { - $this->iIcon->SetScale(1); - $tmp = $this->iIcon->GetWidthHeight(); - $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[0]); - } elseif ($this->iIconConstrain[0] == TIMG_HEIGHT) { - $this->iIcon->SetScale(1); - $tmp = $this->iIcon->GetWidthHeight(); - $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[1]); - } - $tmp = $this->iIcon->GetWidthHeight(); - $iwidth = $tmp[0]; - } else { - $iwidth=0; - } - if ($this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->dir == 0) { - $pwidth = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetWidth($aImg); - } elseif ($this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->dir == 90) { - $pwidth = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetFontHeight($aImg)+2; - } else { - $pwidth = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetWidth($aImg)+2; - } - - $pcolspan = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iColSpan; - return round(max($iwidth, $pwidth)/$pcolspan) + $this->iMarginLeft + $this->iMarginRight; - } - - public function GetHeight($aImg) - { - if ($this->iIcon !== null) { - if ($this->iIconConstrain[0] == TIMG_WIDTH) { - $this->iIcon->SetScale(1); - $tmp = $this->iIcon->GetWidthHeight(); - $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[0]); - } elseif ($this->iIconConstrain[0] == TIMG_HEIGHT) { - $this->iIcon->SetScale(1); - $tmp = $this->iIcon->GetWidthHeight(); - $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[1]); - } - $tmp = $this->iIcon->GetWidthHeight(); - $iheight = $tmp[1]; - } else { - $iheight = 0; - } - if ($this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->dir == 0) { - $pheight = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetHeight($aImg); - } else { - $pheight = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetHeight($aImg)+1; - } - $prowspan = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iRowSpan; - return round(max($iheight, $pheight)/$prowspan) + $this->iMarginTop + $this->iMarginBottom; - } - - public function SetAlign($aHorAlign='left', $aVertAlign='bottom') - { - $aHorAlign = strtolower($aHorAlign); - $aVertAlign = strtolower($aVertAlign); - $chk = array('left','right','center','bottom','top','middle'); - if (!in_array($aHorAlign, $chk) || !in_array($aVertAlign, $chk)) { - JpGraphError::RaiseL(27011, $aHorAlign, $aVertAlign); - } - $this->iVertAlign = $aVertAlign; - $this->iHorAlign = $aHorAlign; - } - - public function AdjustMarginsForGrid() - { - if ($this->iCol > 0) { - switch ($this->iGridStyle[0]) { - case TGRID_SINGLE: $wf=1; break; - case TGRID_DOUBLE: $wf=3; break; - case TGRID_DOUBLE2: $wf=4; break; - } - $this->iMarginLeft += $this->iGridWeight[0]*$wf; - } - if ($this->iRow > 0) { - switch ($this->iGridStyle[1]) { - case TGRID_SINGLE: $wf=1; break; - case TGRID_DOUBLE: $wf=3; break; - case TGRID_DOUBLE2: $wf=4; break; - } - $this->iMarginTop += $this->iGridWeight[1]*$wf; - } - if ($this->iRow+$this->iRowSpan-1 < $this->iTable->iSize[0]-1) { - switch ($this->iGridStyle[2]) { - case TGRID_SINGLE: $wf=1; break; - case TGRID_DOUBLE: $wf=3; break; - case TGRID_DOUBLE2: $wf=4; break; - } - $this->iMarginBottom += $this->iGridWeight[2]*$wf; - } - if ($this->iCol+$this->iColSpan-1 < $this->iTable->iSize[1]-1) { - switch ($this->iGridStyle[3]) { - case TGRID_SINGLE: $wf=1; break; - case TGRID_DOUBLE: $wf=3; break; - case TGRID_DOUBLE2: $wf=4; break; - } - $this->iMarginRight += $this->iGridWeight[3]*$wf; - } - } - - public function StrokeVGrid($aImg, $aX, $aY, $aWidth, $aHeight, $aDir=1) - { - // Left or right grid line - // For the right we increase the X-pos and for the right we decrease it. This is - // determined by the direction argument. - $idx = $aDir==1 ? 0 : 3; - - // We don't stroke the grid lines that are on the edge of the table since this is - // the place of the border. - if ((($this->iCol > 0 && $idx==0) || ($this->iCol+$this->iColSpan-1 < $this->iTable->iSize[1]-1 && $idx==3)) - && $this->iGridWeight[$idx] > 0) { - $x = $aDir==1 ? $aX : $aX + $aWidth-1; - $y = $aY+$aHeight-1; - $aImg->SetColor($this->iGridColor[$idx]); - switch ($this->iGridStyle[$idx]) { - case TGRID_SINGLE: - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); - } - break; - - case TGRID_DOUBLE: - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); - } - $x += $this->iGridWeight[$idx]*2; - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); - } - break; - - case TGRID_DOUBLE2: - for ($i=0; $i < $this->iGridWeight[$idx]*2; ++$i) { - $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); - } - $x += $this->iGridWeight[$idx]*3; - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); - } - break; - } - } - } - - public function StrokeHGrid($aImg, $aX, $aY, $aWidth, $aHeight, $aDir=1) - { - // Top or bottom grid line - // For the left we increase the X-pos and for the right we decrease it. This is - // determined by the direction argument. - $idx = $aDir==1 ? 1 : 2; - - // We don't stroke the grid lines that are on the edge of the table since this is - // the place of the border. - if ((($this->iRow > 0 && $idx==1) || ($this->iRow+$this->iRowSpan-1 < $this->iTable->iSize[0]-1 && $idx==2)) - && $this->iGridWeight[$idx] > 0) { - $y = $aDir==1 ? $aY : $aY+$aHeight-1; - $x = $aX+$aWidth-1; - $aImg->SetColor($this->iGridColor[$idx]); - switch ($this->iGridStyle[$idx]) { - case TGRID_SINGLE: - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($aX, $y+$i, $x, $y+$i); - } - break; - - case TGRID_DOUBLE: - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($aX, $y+$i, $x, $y+$i); - } - $y += $this->iGridWeight[$idx]*2; - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($aX, $y+$i, $x, $y+$i); - } - break; - - case TGRID_DOUBLE2: - for ($i=0; $i < $this->iGridWeight[$idx]*2; ++$i) { - $aImg->Line($aX, $y+$i, $x, $y+$i); - } - $y += $this->iGridWeight[$idx]*3; - for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { - $aImg->Line($aX, $y+$i, $x, $y+$i); - } - break; - } - } - } - - public function Stroke($aImg, $aX, $aY, $aWidth, $aHeight) - { - // If this is a merged cell we only stroke if it is the parent cell. - // The parent cell holds the merged cell block - if ($this->iMerged && ($this->iRow != $this->iPRow || $this->iCol != $this->iPCol)) { - return; - } - - if ($this->iBGColor != '') { - $aImg->SetColor($this->iBGColor); - $aImg->FilledRectangle($aX, $aY, $aX+$aWidth-1, $aY+$aHeight-1); - } - - $coords = $aX.','.$aY.','.($aX+$aWidth-1).','.$aY.','.($aX+$aWidth-1).','.($aY+$aHeight-1).','.$aX.','.($aY+$aHeight-1); - if (! empty($this->iCSIMtarget)) { - $this->iCSIMArea = 'iCSIMwintarget)) { - $this->iCSIMArea .= " target=\"".$this->iCSIMwintarget."\""; - } - if (! empty($this->iCSIMalt)) { - $this->iCSIMArea .= ' alt="'.$this->iCSIMalt.'" title="'.$this->iCSIMalt."\" "; - } - $this->iCSIMArea .= " />\n"; - } - - $this->StrokeVGrid($aImg, $aX, $aY, $aWidth, $aHeight); - $this->StrokeVGrid($aImg, $aX, $aY, $aWidth, $aHeight, -1); - $this->StrokeHGrid($aImg, $aX, $aY, $aWidth, $aHeight); - $this->StrokeHGrid($aImg, $aX, $aY, $aWidth, $aHeight, -1); - - if ($this->iIcon !== null) { - switch ($this->iHorAlign) { - case 'left': - $x = $aX+$this->iMarginLeft; - $hanchor='left'; - break; - case 'center': - case 'middle': - $x = $aX+$this->iMarginLeft+round(($aWidth-$this->iMarginLeft-$this->iMarginRight)/2); - $hanchor='center'; - break; - case 'right': - $x = $aX+$aWidth-$this->iMarginRight-1; - $hanchor='right'; - break; - default: - JpGraphError::RaiseL(27012, $this->iHorAlign); - } - - switch ($this->iVertAlign) { - case 'top': - $y = $aY+$this->iMarginTop; - $vanchor='top'; - break; - case 'center': - case 'middle': - $y = $aY+$this->iMarginTop+round(($aHeight-$this->iMarginTop-$this->iMarginBottom)/2); - $vanchor='center'; - break; - case 'bottom': - $y = $aY+$aHeight-1-$this->iMarginBottom; - $vanchor='bottom'; - break; - default: - JpGraphError::RaiseL(27012, $this->iVertAlign); - } - $this->iIcon->SetAnchor($hanchor, $vanchor); - $this->iIcon->_Stroke($aImg, $x, $y); - } - $this->iVal->SetColor($this->iFontColor); - $this->iVal->SetFont($this->iFF, $this->iFS, $this->iFSize); - switch ($this->iHorAlign) { - case 'left': - $x = $aX+$this->iMarginLeft; - break; - case 'center': - case 'middle': - $x = $aX+$this->iMarginLeft+round(($aWidth-$this->iMarginLeft-$this->iMarginRight)/2); - break; - case 'right': - $x = $aX+$aWidth-$this->iMarginRight-1; - break; - default: - JpGraphError::RaiseL(27012, $this->iHorAlign); - } - // A workaround for the shortcomings in the TTF font handling in GD - // The anchor position for rotated text (=90) is to "short" so we add - // an offset based on the actual font size - if ($this->iVal->dir != 0 && $this->iVal->font_family >= 10) { - $aY += 4 + round($this->iVal->font_size*0.8); - } - switch ($this->iVertAlign) { - case 'top': - $y = $aY+$this->iMarginTop; - break; - case 'center': - case 'middle': - $y = $aY+$this->iMarginTop+round(($aHeight-$this->iMarginTop-$this->iMarginBottom)/2); - //$y -= round($this->iVal->GetFontHeight($aImg)/2); - $y -= round($this->iVal->GetHeight($aImg)/2); - break; - case 'bottom': - //$y = $aY+$aHeight-1-$this->iMarginBottom-$this->iVal->GetFontHeight($aImg); - $y = $aY+$aHeight-$this->iMarginBottom-$this->iVal->GetHeight($aImg); - break; - default: - JpGraphError::RaiseL(27012, $this->iVertAlign); - } - $this->iVal->SetAlign($this->iHorAlign, 'top'); - if ($this->iNumberFormat !== null && is_numeric($this->iVal->t)) { - $this->iVal->t = sprintf($this->iNumberFormat, $this->iVal->t); - } - $this->iVal->Stroke($aImg, $x, $y); - } -} - -//--------------------------------------------------------------------- -// CLASS GTextTable -// Description: -// Graphic text table -//--------------------------------------------------------------------- -class GTextTable -{ - public $iCells = array(); - public $iSize=array(0,0); // Need to be public since they are used by the cell - private $iWidth=0; - private $iHeight=0; - private $iColWidth=null; - private $iRowHeight=null; - private $iImg=null; - private $iXPos=0; - private $iYPos=0; - private $iScaleXPos=null; - private $iScaleYPos=null; - private $iBGColor=''; - private $iBorderColor='black'; - private $iBorderWeight=1; - private $iInit=false; - private $iYAnchor='top'; - private $iXAnchor='left'; - /*----------------------------------------------------------------- - * First and second phase constructors - *----------------------------------------------------------------- - */ - public function __construct() - { - // Empty - } - - public function Init($aRows=0, $aCols=0, $aFillText='') - { - $this->iSize[0] = $aRows; - $this->iSize[1] = $aCols; - for ($i=0; $i < $this->iSize[0]; ++$i) { - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$i][$j] = new GTextTableCell($aFillText, $i, $j); - $this->iCells[$i][$j]->Init($this); - } - } - $this->iInit=true; - } - - /*----------------------------------------------------------------- - * Outer border of table - *----------------------------------------------------------------- - */ - public function SetBorder($aWeight=1, $aColor='black') - { - $this->iBorderColor=$aColor; - $this->iBorderWeight = $aWeight; - } - - - /*----------------------------------------------------------------- - * Position in graph of table - *----------------------------------------------------------------- - */ - public function SetPos($aX, $aY) - { - $this->iXPos = $aX; - $this->iYPos = $aY; - } - - public function SetScalePos($aX, $aY) - { - $this->iScaleXPos = $aX; - $this->iScaleYPos = $aY; - } - - public function SetAnchorPos($aXAnchor, $aYAnchor='top') - { - $this->iXAnchor = $aXAnchor; - $this->iYAnchor = $aYAnchor; - } - - /*----------------------------------------------------------------- - * Setup country flag in a cell - *----------------------------------------------------------------- - */ - public function SetCellCountryFlag($aRow, $aCol, $aFlag, $aScale=1.0, $aMix=100, $aStdSize=3) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetCountryFlag($aFlag, $aScale, $aMix, $aStdSize); - } - - /*----------------------------------------------------------------- - * Setup image in a cell - *----------------------------------------------------------------- - */ - public function SetCellImage($aRow, $aCol, $aFile, $aScale=1.0, $aMix=100) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetImage($aFile, $aScale, $aMix); - } - - public function SetRowImage($aRow, $aFile, $aScale=1.0, $aMix=100) - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetImage($aFile, $aScale, $aMix); - } - } - - public function SetColImage($aCol, $aFile, $aScale=1.0, $aMix=100) - { - $this->_chkC($aCol); - for ($j=0; $j < $this->iSize[0]; ++$j) { - $this->iCells[$j][$aCol]->SetImage($aFile, $aScale, $aMix); - } - } - - public function SetImage($aFileR1, $aScaleC1=null, $aMixR2=null, $aC2=null, $aFile=null, $aScale=1.0, $aMix=100) - { - if ($aScaleC1 !== null && $aMixR2!==null && $aC2!==null && $aFile!==null) { - $this->_chkR($aArgR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - } else { - if ($aScaleC1 !== null) { - $aScale = $aScaleC1; - } - if ($aMixR2 !== null) { - $aMix = $aMixR2; - } - $aFile = $aFileR1; - $aMixR2 = $this->iSize[0]-1; - $aFileR1 = 0; - $aC2 = $this->iSize[1]-1; - $aScaleC1 = 0; - } - for ($i=$aArgR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->SetImage($aFile, $aScale, $aMix); - } - } - } - - public function SetCellImageConstrain($aRow, $aCol, $aType, $aVal) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetImageConstrain($aType, $aVal); - } - - /*----------------------------------------------------------------- - * Generate a HTML version of the table - *----------------------------------------------------------------- - */ - public function toString() - { - $t = ''; - for ($i=0; $i < $this->iSize[0]; ++$i) { - $t .= ''; - for ($j=0; $j < $this->iSize[1]; ++$j) { - $t .= ''; - } - $t .= ''; - } - $t .= '
'; - if ($this->iCells[$i][$j]->iMerged) { - $t .= 'M '; - } - $t .= 'val='.$this->iCells[$i][$j]->iVal->t; - $t .= ' (cs='.$this->iCells[$i][$j]->iColSpan. - ', rs='.$this->iCells[$i][$j]->iRowSpan.')'; - $t .= '
'; - return $t; - } - - /*----------------------------------------------------------------- - * Specify data for table - *----------------------------------------------------------------- - */ - public function Set($aArg1, $aArg2=null, $aArg3=null) - { - if ($aArg2===null && $aArg3===null) { - if (is_array($aArg1)) { - if (is_array($aArg1[0])) { - $m = count($aArg1); - // Find the longest row - $n=0; - for ($i=0; $i < $m; ++$i) { - $n = max(count($aArg1[$i]), $n); - } - for ($i=0; $i < $m; ++$i) { - for ($j=0; $j < $n; ++$j) { - if (isset($aArg1[$i][$j])) { - $this->_setcell($i, $j, (string)$aArg1[$i][$j]); - } else { - $this->_setcell($i, $j); - } - } - } - $this->iSize[0] = $m; - $this->iSize[1] = $n; - $this->iInit=true; - } else { - JpGraphError::RaiseL(27001); - //('Illegal argument to GTextTable::Set(). Array must be 2 dimensional'); - } - } else { - JpGraphError::RaiseL(27002); - //('Illegal argument to GTextTable::Set()'); - } - } else { - // Must be in the form (row,col,val) - $this->_chkR($aArg1); - $this->_chkC($aArg2); - $this->_setcell($aArg1, $aArg2, (string)$aArg3); - } - } - - /*--------------------------------------------------------------------- - * Cell margin setting - *--------------------------------------------------------------------- - */ - public function SetPadding($aArgR1, $aC1=null, $aR2=null, $aC2=null, $aPad=null) - { - if ($aC1 !== null && $aR2!==null && $aC2!==null && $aPad!==null) { - $this->_chkR($aArgR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - } else { - $aPad = $aArgR1; - $aR2 = $this->iSize[0]-1; - $aArgR1 = 0; - $aC2 = $this->iSize[1]-1; - $aC1 = 0; - } - for ($i=$aArgR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->SetMargin($aPad, $aPad, $aPad, $aPad); - } - } - } - - public function SetRowPadding($aRow, $aPad) - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetMargin($aPad, $aPad, $aPad, $aPad); - } - } - - public function SetColPadding($aCol, $aPad) - { - $this->_chkC($aCol); - for ($j=0; $j < $this->iSize[0]; ++$j) { - $this->iCells[$j][$aCol]->SetMargin($aPad, $aPad, $aPad, $aPad); - } - } - - public function SetCellPadding($aRow, $aCol, $aPad) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetMargin($aPad, $aPad, $aPad, $aPad); - } - - - /*--------------------------------------------------------------------- - * Cell text orientation setting - *--------------------------------------------------------------------- - */ - public function SetTextOrientation($aArgR1, $aC1=null, $aR2=null, $aC2=null, $aO=null) - { - if ($aC1 !== null && $aR2!==null && $aC2!==null && $aPad!==null) { - $this->_chkR($aArgR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - } else { - $aO = $aArgR1; - $aR2 = $this->iSize[0]-1; - $aArgR1 = 0; - $aC2 = $this->iSize[1]-1; - $aC1 = 0; - } - for ($i=$aArgR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->iVal->SetOrientation($aO); - } - } - } - - public function SetRowTextOrientation($aRow, $aO) - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->iVal->SetOrientation($aO); - } - } - - public function SetColTextOrientation($aCol, $aO) - { - $this->_chkC($aCol); - for ($j=0; $j < $this->iSize[0]; ++$j) { - $this->iCells[$j][$aCol]->iVal->SetOrientation($aO); - } - } - - public function SetCellTextOrientation($aRow, $aCol, $aO) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->iVal->SetOrientation($aO); - } - - - - - /*--------------------------------------------------------------------- - * Font color setting - *--------------------------------------------------------------------- - */ - - public function SetColor($aArgR1, $aC1=null, $aR2=null, $aC2=null, $aArg=null) - { - if ($aC1 !== null && $aR2!==null && $aC2!==null && $aArg!==null) { - $this->_chkR($aArgR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - } else { - $aArg = $aArgR1; - $aR2 = $this->iSize[0]-1; - $aArgR1 = 0; - $aC2 = $this->iSize[1]-1; - $aC1 = 0; - } - for ($i=$aArgR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->SetFontColor($aArg); - } - } - } - - public function SetRowColor($aRow, $aColor) - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetFontColor($aColor); - } - } - - public function SetColColor($aCol, $aColor) - { - $this->_chkC($aCol); - for ($i=0; $i < $this->iSize[0]; ++$i) { - $this->iCells[$i][$aCol]->SetFontColor($aColor); - } - } - - public function SetCellColor($aRow, $aCol, $aColor) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetFontColor($aColor); - } - - /*--------------------------------------------------------------------- - * Fill color settings - *--------------------------------------------------------------------- - */ - - public function SetFillColor($aArgR1, $aC1=null, $aR2=null, $aC2=null, $aArg=null) - { - if ($aC1 !== null && $aR2!==null && $aC2!==null && $aArg!==null) { - $this->_chkR($aArgR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - for ($i=$aArgR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->SetFillColor($aArg); - } - } - } else { - $this->iBGColor = $aArgR1; - } - } - - public function SetRowFillColor($aRow, $aColor) - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetFillColor($aColor); - } - } - - public function SetColFillColor($aCol, $aColor) - { - $this->_chkC($aCol); - for ($i=0; $i < $this->iSize[0]; ++$i) { - $this->iCells[$i][$aCol]->SetFillColor($aColor); - } - } - - public function SetCellFillColor($aRow, $aCol, $aColor) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetFillColor($aColor); - } - - /*--------------------------------------------------------------------- - * Font family setting - *--------------------------------------------------------------------- - */ - public function SetFont() - { - $numargs = func_num_args(); - if ($numargs == 2 || $numargs == 3) { - $aFF = func_get_arg(0); - $aFS = func_get_arg(1); - if ($numargs == 3) { - $aFSize=func_get_arg(2); - } else { - $aFSize=10; - } - $aR2 = $this->iSize[0]-1; - $aR1 = 0; - $aC2 = $this->iSize[1]-1; - $aC1 = 0; - } elseif ($numargs == 6 || $numargs == 7) { - $aR1 = func_get_arg(0); - $aC1 = func_get_arg(1); - $aR2 = func_get_arg(2); - $aC2 = func_get_arg(3); - $aFF = func_get_arg(4); - $aFS = func_get_arg(5); - if ($numargs == 7) { - $aFSize=func_get_arg(6); - } else { - $aFSize=10; - } - } else { - JpGraphError::RaiseL(27003); - //('Wrong number of arguments to GTextTable::SetColor()'); - } - $this->_chkR($aR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - for ($i=$aR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->SetFont($aFF, $aFS, $aFSize); - } - } - } - - public function SetRowFont($aRow, $aFF, $aFS, $aFSize=10) - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetFont($aFF, $aFS, $aFSize); - } - } - - public function SetColFont($aCol, $aFF, $aFS, $aFSize=10) - { - $this->_chkC($aCol); - for ($i=0; $i < $this->iSize[0]; ++$i) { - $this->iCells[$i][$aCol]->SetFont($aFF, $aFS, $aFSize); - } - } - - public function SetCellFont($aRow, $aCol, $aFF, $aFS, $aFSize=10) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetFont($aFF, $aFS, $aFSize); - } - - /*--------------------------------------------------------------------- - * Cell align settings - *--------------------------------------------------------------------- - */ - - public function SetAlign($aR1HAlign=null, $aC1VAlign=null, $aR2=null, $aC2=null, $aHArg=null, $aVArg='center') - { - if ($aC1VAlign !== null && $aR2!==null && $aC2!==null && $aHArg!==null) { - $this->_chkR($aR1HAlign); - $this->_chkC($aC1VAlign); - $this->_chkR($aR2); - $this->_chkC($aC2); - } else { - if ($aR1HAlign === null) { - JpGraphError::RaiseL(27010); - } - if ($aC1VAlign === null) { - $aC1VAlign = 'center'; - } - $aHArg = $aR1HAlign; - $aVArg = $aC1VAlign === null ? 'center' : $aC1VAlign ; - $aR2 = $this->iSize[0]-1; - $aR1HAlign = 0; - $aC2 = $this->iSize[1]-1; - $aC1VAlign = 0; - } - for ($i=$aR1HAlign; $i <= $aR2; ++$i) { - for ($j=$aC1VAlign; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->SetAlign($aHArg, $aVArg); - } - } - } - - public function SetCellAlign($aRow, $aCol, $aHorAlign, $aVertAlign='bottom') - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetAlign($aHorAlign, $aVertAlign); - } - - public function SetRowAlign($aRow, $aHorAlign, $aVertAlign='bottom') - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetAlign($aHorAlign, $aVertAlign); - } - } - - public function SetColAlign($aCol, $aHorAlign, $aVertAlign='bottom') - { - $this->_chkC($aCol); - for ($i=0; $i < $this->iSize[0]; ++$i) { - $this->iCells[$i][$aCol]->SetAlign($aHorAlign, $aVertAlign); - } - } - - /*--------------------------------------------------------------------- - * Cell number format - *--------------------------------------------------------------------- - */ - - public function SetNumberFormat($aArgR1, $aC1=null, $aR2=null, $aC2=null, $aArg=null) - { - if ($aC1 !== null && $aR2!==null && $aC2!==null && $aArg!==null) { - $this->_chkR($aArgR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - } else { - $aArg = $aArgR1; - $aR2 = $this->iSize[0]-1; - $aArgR1 = 0; - $aC2 = $this->iSize[1]-1; - $aC1 = 0; - } - if (!is_string($aArg)) { - JpGraphError::RaiseL(27013); // argument must be a string - } - for ($i=$aArgR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - $this->iCells[$i][$j]->SetNumberFormat($aArg); - } - } - } - - public function SetRowNumberFormat($aRow, $aF) - { - $this->_chkR($aRow); - if (!is_string($aF)) { - JpGraphError::RaiseL(27013); // argument must be a string - } - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetNumberFormat($aF); - } - } - - public function SetColNumberFormat($aCol, $aF) - { - $this->_chkC($aCol); - if (!is_string($aF)) { - JpGraphError::RaiseL(27013); // argument must be a string - } - for ($i=0; $i < $this->iSize[0]; ++$i) { - $this->iCells[$i][$aCol]->SetNumberFormat($aF); - } - } - - public function SetCellNumberFormat($aRow, $aCol, $aF) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - if (!is_string($aF)) { - JpGraphError::RaiseL(27013); // argument must be a string - } - $this->iCells[$aRow][$aCol]->SetNumberFormat($aF); - } - - /*--------------------------------------------------------------------- - * Set row and column min size - *--------------------------------------------------------------------- - */ - - public function SetMinColWidth($aColWidth, $aWidth=null) - { - // If there is only one argument this means that all - // columns get set to the same width - if ($aWidth===null) { - for ($i=0; $i < $this->iSize[1]; ++$i) { - $this->iColWidth[$i] = $aColWidth; - } - } else { - $this->_chkC($aColWidth); - $this->iColWidth[$aColWidth] = $aWidth; - } - } - - public function SetMinRowHeight($aRowHeight, $aHeight=null) - { - // If there is only one argument this means that all - // rows get set to the same height - if ($aHeight===null) { - for ($i=0; $i < $this->iSize[0]; ++$i) { - $this->iRowHeight[$i] = $aRowHeight; - } - } else { - $this->_chkR($aRowHeight); - $this->iRowHeight[$aRowHeight] = $aHeight; - } - } - - /*--------------------------------------------------------------------- - * Grid line settings - *--------------------------------------------------------------------- - */ - - public function SetGrid($aWeight=1, $aColor='black', $aStyle=TGRID_SINGLE) - { - $rc = $this->iSize[0]; - $cc = $this->iSize[1]; - for ($i=0; $i < $rc; ++$i) { - for ($j=0; $j < $cc; ++$j) { - $this->iCells[$i][$j]->SetGridColor($aColor, $aColor); - $this->iCells[$i][$j]->SetGridWeight($aWeight, $aWeight); - $this->iCells[$i][$j]->SetGridStyle($aStyle); - } - } - } - - public function SetColGrid($aCol, $aWeight=1, $aColor='black', $aStyle=TGRID_SINGLE) - { - $this->_chkC($aCol); - for ($i=0; $i < $this->iSize[0]; ++$i) { - $this->iCells[$i][$aCol]->SetGridWeight($aWeight); - $this->iCells[$i][$aCol]->SetGridColor($aColor); - $this->iCells[$i][$aCol]->SetGridStyle($aStyle); - } - } - - public function SetRowGrid($aRow, $aWeight=1, $aColor='black', $aStyle=TGRID_SINGLE) - { - $this->_chkR($aRow); - for ($j=0; $j < $this->iSize[1]; ++$j) { - $this->iCells[$aRow][$j]->SetGridWeight(null, $aWeight); - $this->iCells[$aRow][$j]->SetGridColor(null, $aColor); - $this->iCells[$aRow][$j]->SetGridStyle(null, $aStyle); - } - } - - /*--------------------------------------------------------------------- - * Merge cells - *--------------------------------------------------------------------- - */ - - public function MergeRow($aRow, $aHAlign='center', $aVAlign='center') - { - $this->_chkR($aRow); - $this->MergeCells($aRow, 0, $aRow, $this->iSize[1]-1, $aHAlign, $aVAlign); - } - - public function MergeCol($aCol, $aHAlign='center', $aVAlign='center') - { - $this->_chkC($aCol); - $this->MergeCells(0, $aCol, $this->iSize[0]-1, $aCol, $aHAlign, $aVAlign); - } - - public function MergeCells($aR1, $aC1, $aR2, $aC2, $aHAlign='center', $aVAlign='center') - { - if ($aR1 > $aR2 || $aC1 > $aC2) { - JpGraphError::RaiseL(27004); - //('GTextTable::MergeCells(). Specified cell range to be merged is not valid.'); - } - $this->_chkR($aR1); - $this->_chkC($aC1); - $this->_chkR($aR2); - $this->_chkC($aC2); - $rspan = $aR2-$aR1+1; - $cspan = $aC2-$aC1+1; - // Setup the parent cell for this merged group - if ($this->iCells[$aR1][$aC1]->IsMerged()) { - JpGraphError::RaiseL(27005, $aR1, $aC1, $aR2, $aC2); - //("Cannot merge already merged cells in the range ($aR1,$aC1), ($aR2,$aC2)"); - } - $this->iCells[$aR1][$aC1]->SetRowColSpan($rspan, $cspan); - $this->iCells[$aR1][$aC1]->SetAlign($aHAlign, $aVAlign); - for ($i=$aR1; $i <= $aR2; ++$i) { - for ($j=$aC1; $j <= $aC2; ++$j) { - if (! ($i == $aR1 && $j == $aC1)) { - if ($this->iCells[$i][$j]->IsMerged()) { - JpGraphError::RaiseL(27005, $aR1, $aC1, $aR2, $aC2); - //("Cannot merge already merged cells in the range ($aR1,$aC1), ($aR2,$aC2)"); - } - $this->iCells[$i][$j]->SetMerged($aR1, $aC1, true); - } - } - } - } - - - /*--------------------------------------------------------------------- - * CSIM methods - *--------------------------------------------------------------------- - */ - - public function SetCSIMTarget($aTarget, $aAlt=null, $aAutoTarget=false) - { - $m = $this->iSize[0]; - $n = $this->iSize[1]; - $csim = ''; - for ($i=0; $i < $m; ++$i) { - for ($j=0; $j < $n; ++$j) { - if ($aAutoTarget) { - $t = $aTarget."?row=$i&col=$j"; - } else { - $t = $aTarget; - } - $this->iCells[$i][$j]->SetCSIMTarget($t, $aAlt); - } - } - } - - public function SetCellCSIMTarget($aRow, $aCol, $aTarget, $aAlt=null) - { - $this->_chkR($aRow); - $this->_chkC($aCol); - $this->iCells[$aRow][$aCol]->SetCSIMTarget($aTarget, $aAlt); - } - - /*--------------------------------------------------------------------- - * Private methods - *--------------------------------------------------------------------- - */ - - public function GetCSIMAreas() - { - $m = $this->iSize[0]; - $n = $this->iSize[1]; - $csim = ''; - for ($i=0; $i < $m; ++$i) { - for ($j=0; $j < $n; ++$j) { - $csim .= $this->iCells[$i][$j]->GetCSIMArea(); - } - } - return $csim; - } - - public function _chkC($aCol) - { - if (! $this->iInit) { - JpGraphError::Raise(27014); // Table not initialized - } - if ($aCol < 0 || $aCol >= $this->iSize[1]) { - JpGraphError::RaiseL(27006, $aCol); - } - //("GTextTable:\nColumn argument ($aCol) is outside specified table size."); - } - - public function _chkR($aRow) - { - if (! $this->iInit) { - JpGraphError::Raise(27014); // Table not initialized - } - if ($aRow < 0 || $aRow >= $this->iSize[0]) { - JpGraphError::RaiseL(27007, $aRow); - } - //("GTextTable:\nRow argument ($aRow) is outside specified table size."); - } - - public function _getScalePos() - { - if ($this->iScaleXPos === null || $this->iScaleYPos === null) { - return false; - } - return array($this->iScaleXPos, $this->iScaleYPos); - } - - public function _autoSizeTable($aImg) - { - // Get maximum column width and row height - $m = $this->iSize[0]; - $n = $this->iSize[1]; - $w=1; - $h=1; - - // Get maximum row height per row - for ($i=0; $i < $m; ++$i) { - $h=0; - for ($j=0; $j < $n; ++$j) { - $h = max($h, $this->iCells[$i][$j]->GetHeight($aImg)); - } - if (isset($this->iRowHeight[$i])) { - $this->iRowHeight[$i] = max($h, $this->iRowHeight[$i]); - } else { - $this->iRowHeight[$i] = $h; - } - } - - // Get maximum col width per columns - for ($j=0; $j < $n; ++$j) { - $w=0; - for ($i=0; $i < $m; ++$i) { - $w = max($w, $this->iCells[$i][$j]->GetWidth($aImg)); - } - if (isset($this->iColWidth[$j])) { - $this->iColWidth[$j] = max($w, $this->iColWidth[$j]); - } else { - $this->iColWidth[$j] = $w; - } - } - } - - public function _setcell($aRow, $aCol, $aVal='') - { - if (isset($this->iCells[$aRow][$aCol])) { - $this->iCells[$aRow][$aCol]->Set($aVal); - } else { - $this->iCells[$aRow][$aCol] = new GTextTableCell((string)$aVal, $aRow, $aCol); - $this->iCells[$aRow][$aCol]->Init($this); - } - } - - public function StrokeWithScale($aImg, $aXScale, $aYScale) - { - if (is_numeric($this->iScaleXPos) && is_numeric($this->iScaleYPos)) { - $x = round($aXScale->Translate($this->iScaleXPos)); - $y = round($aYScale->Translate($this->iScaleYPos)); - $this->Stroke($aImg, $x, $y); - } else { - $this->Stroke($aImg); - } - } - - public function Stroke($aImg, $aX=null, $aY=null) - { - if ($aX !== null && $aY !== null) { - $this->iXPos = $aX; - $this->iYPos = $aY; - } - - $rc = $this->iSize[0]; // row count - $cc = $this->iSize[1]; // column count - - if ($rc == 0 || $cc == 0) { - JpGraphError::RaiseL(27009); - } - - // Adjust margins of each cell based on the weight of the grid. Each table grid line - // is actually occupying the left side and top part of each cell. - for ($j=0; $j < $cc; ++$j) { - $this->iCells[0][$j]->iMarginTop += $this->iBorderWeight; - } - for ($i=0; $i < $rc; ++$i) { - $this->iCells[$i][0]->iMarginLeft += $this->iBorderWeight; - } - for ($i=0; $i < $rc; ++$i) { - for ($j=0; $j < $cc; ++$j) { - $this->iCells[$i][$j]->AdjustMarginsForGrid(); - } - } - - // adjust row and column size depending on cell content - $this->_autoSizeTable($aImg); - - if ($this->iSize[1] != count($this->iColWidth) || $this->iSize[0] != count($this->iRowHeight)) { - JpGraphError::RaiseL(27008); - //('Column and row size arrays must match the dimesnions of the table'); - } - - // Find out overall table size - $width=0; - for ($i=0; $i < $cc; ++$i) { - $width += $this->iColWidth[$i]; - } - $height=0; - for ($i=0; $i < $rc; ++$i) { - $height += $this->iRowHeight[$i]; - } - - // Adjust the X,Y position to alway be at the top left corner - // The anchor position, i.e. how the client want to interpret the specified - // x and y coordinate must be taken into account - switch (strtolower($this->iXAnchor)) { - case 'left': - break; - case 'center': - $this->iXPos -= round($width/2); - break; - case 'right': - $this->iXPos -= $width; - break; - } - switch (strtolower($this->iYAnchor)) { - case 'top': - break; - case 'center': - case 'middle': - $this->iYPos -= round($height/2); - break; - case 'bottom': - $this->iYPos -= $height; - break; - } - - // Set the overall background color of the table if set - if ($this->iBGColor !== '') { - $aImg->SetColor($this->iBGColor); - $aImg->FilledRectangle($this->iXPos, $this->iYPos, $this->iXPos+$width, $this->iYPos+$height); - } - - // Stroke all cells - $rpos=$this->iYPos; - for ($i=0; $i < $rc; ++$i) { - $cpos=$this->iXPos; - for ($j=0; $j < $cc; ++$j) { - // Calculate width and height of this cell if it is spanning - // more than one column or row - $cwidth=0; - for ($k=0; $k < $this->iCells[$i][$j]->iColSpan; ++$k) { - $cwidth += $this->iColWidth[$j+$k]; - } - $cheight=0; - for ($k=0; $k < $this->iCells[$i][$j]->iRowSpan; ++$k) { - $cheight += $this->iRowHeight[$i+$k]; - } - - $this->iCells[$i][$j]->Stroke($aImg, $cpos, $rpos, $cwidth, $cheight); - $cpos += $this->iColWidth[$j]; - } - $rpos += $this->iRowHeight[$i]; - } - - // Stroke outer border - $aImg->SetColor($this->iBorderColor); - if ($this->iBorderWeight == 1) { - $aImg->Rectangle($this->iXPos, $this->iYPos, $this->iXPos+$width, $this->iYPos+$height); - } else { - for ($i=0; $i < $this->iBorderWeight; ++$i) { - $aImg->Rectangle( - $this->iXPos+$i, - $this->iYPos+$i, - $this->iXPos+$width-1+$this->iBorderWeight-$i, - $this->iYPos+$height-1+$this->iBorderWeight-$i - ); - } - } - } -} - -/* - EOF - */ diff --git a/onyx2/include/jpgraph/jpgraph_text.inc.php b/onyx2/include/jpgraph/jpgraph_text.inc.php deleted file mode 100755 index c823ac9..0000000 --- a/onyx2/include/jpgraph/jpgraph_text.inc.php +++ /dev/null @@ -1,387 +0,0 @@ -t = $aTxt; - $this->x = round($aXAbsPos); - $this->y = round($aYAbsPos); - $this->margin = 0; - } - //--------------- - // PUBLIC METHODS - // Set the string in the text object - public function Set($aTxt) - { - $this->t = $aTxt; - } - - // Alias for Pos() - public function SetPos($aXAbsPos=0, $aYAbsPos=0, $aHAlign="left", $aVAlign="top") - { - //$this->Pos($aXAbsPos,$aYAbsPos,$aHAlign,$aVAlign); - $this->x = $aXAbsPos; - $this->y = $aYAbsPos; - $this->halign = $aHAlign; - $this->valign = $aVAlign; - } - - public function SetScalePos($aX, $aY) - { - $this->iScalePosX = $aX; - $this->iScalePosY = $aY; - } - - // Specify alignment for the text - public function Align($aHAlign, $aVAlign="top", $aParagraphAlign="") - { - $this->halign = $aHAlign; - $this->valign = $aVAlign; - if ($aParagraphAlign != "") { - $this->paragraph_align = $aParagraphAlign; - } - } - - // Alias - public function SetAlign($aHAlign, $aVAlign="top", $aParagraphAlign="") - { - $this->Align($aHAlign, $aVAlign, $aParagraphAlign); - } - - // Specifies the alignment for a multi line text - public function ParagraphAlign($aAlign) - { - $this->paragraph_align = $aAlign; - } - - // Specifies the alignment for a multi line text - public function SetParagraphAlign($aAlign) - { - $this->paragraph_align = $aAlign; - } - - public function SetShadow($aShadowColor='gray', $aShadowWidth=3) - { - $this->ishadowwidth=$aShadowWidth; - $this->shadow=$aShadowColor; - $this->boxed=true; - } - - public function SetWordWrap($aCol) - { - $this->iWordwrap = $aCol ; - } - - // Specify that the text should be boxed. fcolor=frame color, bcolor=border color, - // $shadow=drop shadow should be added around the text. - public function SetBox($aFrameColor=array(255,255,255), $aBorderColor=array(0,0,0), $aShadowColor=false, $aCornerRadius=4, $aShadowWidth=3) - { - if ($aFrameColor === false) { - $this->boxed=false; - } else { - $this->boxed=true; - } - $this->fcolor=$aFrameColor; - $this->bcolor=$aBorderColor; - // For backwards compatibility when shadow was just true or false - if ($aShadowColor === true) { - $aShadowColor = 'gray'; - } - $this->shadow=$aShadowColor; - $this->icornerradius=$aCornerRadius; - $this->ishadowwidth=$aShadowWidth; - } - - public function SetBox2($aFrameColor=array(255,255,255), $aBorderColor=array(0,0,0), $aShadowColor=false, $aCornerRadius=4, $aShadowWidth=3) - { - $this->iBoxType=2; - $this->SetBox($aFrameColor, $aBorderColor, $aShadowColor, $aCornerRadius, $aShadowWidth); - } - - // Hide the text - public function Hide($aHide=true) - { - $this->hide=$aHide; - } - - // This looks ugly since it's not a very orthogonal design - // but I added this "inverse" of Hide() to harmonize - // with some classes which I designed more recently (especially) - // jpgraph_gantt - public function Show($aShow=true) - { - $this->hide=!$aShow; - } - - // Specify font - public function SetFont($aFamily, $aStyle=FS_NORMAL, $aSize=10) - { - $this->font_family=$aFamily; - $this->font_style=$aStyle; - $this->font_size=$aSize; - } - - // Center the text between $left and $right coordinates - public function Center($aLeft, $aRight, $aYAbsPos=false) - { - $this->x = $aLeft + ($aRight-$aLeft)/2; - $this->halign = "center"; - if (is_numeric($aYAbsPos)) { - $this->y = $aYAbsPos; - } - } - - // Set text color - public function SetColor($aColor) - { - $this->color = $aColor; - } - - public function SetAngle($aAngle) - { - $this->SetOrientation($aAngle); - } - - // Orientation of text. Note only TTF fonts can have an arbitrary angle - public function SetOrientation($aDirection=0) - { - if (is_numeric($aDirection)) { - $this->dir=$aDirection; - } elseif ($aDirection=="h") { - $this->dir = 0; - } elseif ($aDirection=="v") { - $this->dir = 90; - } else { - JpGraphError::RaiseL(25051); - }//(" Invalid direction specified for text."); - } - - // Total width of text - public function GetWidth($aImg) - { - $aImg->SetFont($this->font_family, $this->font_style, $this->raw_font_size); - $w = $aImg->GetTextWidth($this->t, $this->dir); - return $w; - } - - // Hight of font - public function GetFontHeight($aImg) - { - $aImg->SetFont($this->font_family, $this->font_style, $this->raw_font_size); - $h = $aImg->GetFontHeight(); - return $h; - } - - public function GetTextHeight($aImg) - { - $aImg->SetFont($this->font_family, $this->font_style, $this->raw_font_size); - $h = $aImg->GetTextHeight($this->t, $this->dir); - return $h; - } - - public function GetHeight($aImg) - { - // Synonym for GetTextHeight() - $aImg->SetFont($this->font_family, $this->font_style, $this->raw_font_size); - $h = $aImg->GetTextHeight($this->t, $this->dir); - return $h; - } - - // Set the margin which will be interpretated differently depending - // on the context. - public function SetMargin($aMarg) - { - $this->margin = $aMarg; - } - - public function StrokeWithScale($aImg, $axscale, $ayscale) - { - if ($this->iScalePosX === null || $this->iScalePosY === null) { - $this->Stroke($aImg); - } else { - $this->Stroke( - $aImg, - round($axscale->Translate($this->iScalePosX)), - round($ayscale->Translate($this->iScalePosY)) - ); - } - } - - public function SetCSIMTarget($aURITarget, $aAlt='', $aWinTarget='') - { - $this->iCSIMtarget = $aURITarget; - $this->iCSIMalt = $aAlt; - $this->iCSIMWinTarget = $aWinTarget; - } - - public function GetCSIMareas() - { - if ($this->iCSIMtarget !== '') { - return $this->iCSIMarea; - } else { - return ''; - } - } - - // Display text in image - public function Stroke($aImg, $x=null, $y=null) - { - if ($x !== null) { - $this->x = round($x); - } - if ($y !== null) { - $this->y = round($y); - } - - // Insert newlines - if ($this->iWordwrap > 0) { - $this->t = wordwrap($this->t, $this->iWordwrap, "\n"); - } - - // If position been given as a fraction of the image size - // calculate the absolute position - if ($this->x < 1 && $this->x > 0) { - $this->x *= $aImg->width; - } - if ($this->y < 1 && $this->y > 0) { - $this->y *= $aImg->height; - } - - $aImg->PushColor($this->color); - $aImg->SetFont($this->font_family, $this->font_style, $this->raw_font_size); - $aImg->SetTextAlign($this->halign, $this->valign); - - if ($this->boxed) { - if ($this->fcolor=="nofill") { - $this->fcolor=false; - } - - $oldweight=$aImg->SetLineWeight(1); - - if ($this->iBoxType == 2 && $this->font_family > FF_FONT2+2) { - $bbox = $aImg->StrokeBoxedText2( - $this->x, - $this->y, - $this->t, - $this->dir, - $this->fcolor, - $this->bcolor, - $this->shadow, - $this->paragraph_align, - 2, - 4, - $this->icornerradius, - $this->ishadowwidth - ); - } else { - $bbox = $aImg->StrokeBoxedText( - $this->x, - $this->y, - $this->t, - $this->dir, - $this->fcolor, - $this->bcolor, - $this->shadow, - $this->paragraph_align, - 3, - 3, - $this->icornerradius, - $this->ishadowwidth - ); - } - - $aImg->SetLineWeight($oldweight); - } else { - $debug=false; - $bbox = $aImg->StrokeText($this->x, $this->y, $this->t, $this->dir, $this->paragraph_align, $debug); - } - - // Create CSIM targets - $coords = $bbox[0].','.$bbox[1].','.$bbox[2].','.$bbox[3].','.$bbox[4].','.$bbox[5].','.$bbox[6].','.$bbox[7]; - $this->iCSIMarea = "iCSIMtarget)."\" "; - if (trim($this->iCSIMalt) != '') { - $this->iCSIMarea .= " alt=\"".$this->iCSIMalt."\" "; - $this->iCSIMarea .= " title=\"".$this->iCSIMalt."\" "; - } - if (trim($this->iCSIMWinTarget) != '') { - $this->iCSIMarea .= " target=\"".$this->iCSIMWinTarget."\" "; - } - $this->iCSIMarea .= " />\n"; - - $aImg->PopColor($this->color); - } - - public function __get($name) - { - if (strpos($name, 'raw_') !== false) { - // if $name == 'raw_left_margin' , return $this->_left_margin; - $variable_name = '_' . str_replace('raw_', '', $name); - return $this->$variable_name; - } - - $variable_name = '_' . $name; - - if (isset($this->$variable_name)) { - return $this->$variable_name * SUPERSAMPLING_SCALE; - } else { - JpGraphError::RaiseL('25132', $name); - } - } - - public function __set($name, $value) - { - $this->{'_'.$name} = $value; - } -} // Class diff --git a/onyx2/include/jpgraph/jpgraph_theme.inc.php b/onyx2/include/jpgraph/jpgraph_theme.inc.php deleted file mode 100755 index 39fb130..0000000 --- a/onyx2/include/jpgraph/jpgraph_theme.inc.php +++ /dev/null @@ -1,139 +0,0 @@ -color_index = 0; - } - /** - * - */ - abstract public function GetColorList(); - - /** - * - */ - abstract public function ApplyPlot($plot); - - - /** - * - */ - public function SetupPlot($plot) - { - if (is_array($plot)) { - foreach ($plot as $obj) { - $this->ApplyPlot($obj); - } - } else { - $this->ApplyPlot($plot); - } - } - - /** - * - */ - public function ApplyGraph($graph) - { - $this->graph = $graph; - $method_name = ''; - - if (get_class($graph) == 'Graph') { - $method_name = 'SetupGraph'; - } else { - $method_name = 'Setup' . get_class($graph); - } - - if (method_exists($this, $method_name)) { - $this->$method_name($graph); - } else { - JpGraphError::RaiseL(30001, $method_name, $method_name); //Theme::%s() is not defined. \nPlease make %s(\$graph) function in your theme classs. - } - } - - /** - * - */ - public function PreStrokeApply($graph) - { - } - - /** - * - */ - public function GetThemeColors($num = 30) - { - $result_list = array(); - - $old_index = $this->color_index; - $this->color_index = 0; - $count = 0; - - $i = 0; - while (true) { - for ($j = 0; $j < count($this->GetColorList()); $j++) { - if (++$count > $num) { - break 2; - } - $result_list[] = $this->GetNextColor(); - } - $i++; - } - - $this->color_index = $old_index; - - return $result_list; - } - - /** - * - */ - public function GetNextColor() - { - $color_list = $this->GetColorList(); - - $color = null; - if (isset($color_list[$this->color_index])) { - $color = $color_list[$this->color_index]; - } else { - $color_count = count($color_list); - if ($color_count <= $this->color_index) { - $color_tmp = $color_list[$this->color_index % $color_count]; - $brightness = 1.0 - intval($this->color_index / $color_count) * 0.2; - $rgb = new RGB(); - $color = $color_tmp . ':' . $brightness; - $color = $rgb->Color($color); - $alpha = array_pop($color); - $color = $rgb->tryHexConversion($color); - if ($alpha) { - $color .= '@' . $alpha; - } - } - } - - $this->color_index++; - - return $color; - } -} // Class diff --git a/onyx2/include/jpgraph/jpgraph_ttf.inc.php b/onyx2/include/jpgraph/jpgraph_ttf.inc.php index 6fb8203..7956293 100644 --- a/onyx2/include/jpgraph/jpgraph_ttf.inc.php +++ b/onyx2/include/jpgraph/jpgraph_ttf.inc.php @@ -1,153 +1,69 @@ g2312 = new GB2312toUTF8(); } return $this->g2312->gb2utf8($aTxt); - } elseif ($aFF === FF_BIG5) { + } elseif ($aFF === FF_CHINESE) { if (!function_exists('iconv')) { JpGraphError::RaiseL(25006); //('Usage of FF_CHINESE (FF_BIG5) font family requires that your PHP setup has the iconv() function. By default this is not compiled into PHP (needs the "--width-iconv" when configured).'); @@ -270,198 +186,125 @@ class TTF private $font_files; private $style_names; - public function __construct() + //--------------- + // CONSTRUCTOR + public function TTF() { - // String names for font styles to be used in error messages - $this->style_names=array( - FS_NORMAL =>'normal', - FS_BOLD =>'bold', - FS_ITALIC =>'italic', - FS_BOLDITALIC =>'bolditalic'); + // String names for font styles to be used in error messages + $this->style_names=array(FS_NORMAL =>'normal', + FS_BOLD =>'bold', + FS_ITALIC =>'italic', + FS_BOLDITALIC =>'bolditalic'); // File names for available fonts $this->font_files=array( - FF_COURIER => array(FS_NORMAL =>'cour.ttf', - FS_BOLD =>'courbd.ttf', - FS_ITALIC =>'couri.ttf', - FS_BOLDITALIC =>'courbi.ttf' ), - FF_GEORGIA => array(FS_NORMAL =>'georgia.ttf', - FS_BOLD =>'georgiab.ttf', - FS_ITALIC =>'georgiai.ttf', - FS_BOLDITALIC =>'' ), - FF_TREBUCHE =>array(FS_NORMAL =>'trebuc.ttf', - FS_BOLD =>'trebucbd.ttf', - FS_ITALIC =>'trebucit.ttf', - FS_BOLDITALIC =>'trebucbi.ttf' ), - FF_VERDANA => array(FS_NORMAL =>'verdana.ttf', - FS_BOLD =>'verdanab.ttf', - FS_ITALIC =>'verdanai.ttf', - FS_BOLDITALIC =>'' ), - FF_TIMES => array(FS_NORMAL =>'times.ttf', - FS_BOLD =>'timesbd.ttf', - FS_ITALIC =>'timesi.ttf', - FS_BOLDITALIC =>'timesbi.ttf' ), - FF_COMIC => array(FS_NORMAL =>'comic.ttf', - FS_BOLD =>'comicbd.ttf', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_ARIAL => array(FS_NORMAL =>'arial.ttf', - FS_BOLD =>'arialbd.ttf', - FS_ITALIC =>'ariali.ttf', - FS_BOLDITALIC =>'arialbi.ttf' ) , - FF_VERA => array(FS_NORMAL =>'Vera.ttf', - FS_BOLD =>'VeraBd.ttf', - FS_ITALIC =>'VeraIt.ttf', - FS_BOLDITALIC =>'VeraBI.ttf' ), - FF_VERAMONO => array(FS_NORMAL =>'VeraMono.ttf', - FS_BOLD =>'VeraMoBd.ttf', - FS_ITALIC =>'VeraMoIt.ttf', - FS_BOLDITALIC =>'VeraMoBI.ttf' ), - FF_VERASERIF=> array(FS_NORMAL =>'VeraSe.ttf', - FS_BOLD =>'VeraSeBd.ttf', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ) , + FF_COURIER => array(FS_NORMAL =>'cour.ttf', + FS_BOLD =>'courbd.ttf', + FS_ITALIC =>'couri.ttf', + FS_BOLDITALIC =>'courbi.ttf' ), + FF_GEORGIA => array(FS_NORMAL =>'georgia.ttf', + FS_BOLD =>'georgiab.ttf', + FS_ITALIC =>'georgiai.ttf', + FS_BOLDITALIC =>'' ), + FF_TREBUCHE =>array(FS_NORMAL =>'trebuc.ttf', + FS_BOLD =>'trebucbd.ttf', + FS_ITALIC =>'trebucit.ttf', + FS_BOLDITALIC =>'trebucbi.ttf' ), + FF_VERDANA => array(FS_NORMAL =>'verdana.ttf', + FS_BOLD =>'verdanab.ttf', + FS_ITALIC =>'verdanai.ttf', + FS_BOLDITALIC =>'' ), + FF_TIMES => array(FS_NORMAL =>'times.ttf', + FS_BOLD =>'timesbd.ttf', + FS_ITALIC =>'timesi.ttf', + FS_BOLDITALIC =>'timesbi.ttf' ), + FF_COMIC => array(FS_NORMAL =>'comic.ttf', + FS_BOLD =>'comicbd.ttf', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_ARIAL => array(FS_NORMAL =>'arial.ttf', + FS_BOLD =>'arialbd.ttf', + FS_ITALIC =>'ariali.ttf', + FS_BOLDITALIC =>'arialbi.ttf' ) , + FF_VERA => array(FS_NORMAL =>'Vera.ttf', + FS_BOLD =>'VeraBd.ttf', + FS_ITALIC =>'VeraIt.ttf', + FS_BOLDITALIC =>'VeraBI.ttf' ), + FF_VERAMONO => array(FS_NORMAL =>'VeraMono.ttf', + FS_BOLD =>'VeraMoBd.ttf', + FS_ITALIC =>'VeraMoIt.ttf', + FS_BOLDITALIC =>'VeraMoBI.ttf' ), + FF_VERASERIF=> array(FS_NORMAL =>'VeraSe.ttf', + FS_BOLD =>'VeraSeBd.ttf', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ) , /* Chinese fonts */ - FF_SIMSUN => array( - FS_NORMAL =>'simsun.ttc', - FS_BOLD =>'simhei.ttf', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_CHINESE => array( - FS_NORMAL =>CHINESE_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - FF_BIG5 => array( - FS_NORMAL =>CHINESE_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_SIMSUN => array(FS_NORMAL =>'simsun.ttc', + FS_BOLD =>'simhei.ttf', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_CHINESE => array(FS_NORMAL =>CHINESE_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), /* Japanese fonts */ - FF_MINCHO => array( - FS_NORMAL =>MINCHO_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - - FF_PMINCHO => array( - FS_NORMAL =>PMINCHO_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - - FF_GOTHIC => array( - FS_NORMAL =>GOTHIC_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - - FF_PGOTHIC => array( - FS_NORMAL =>PGOTHIC_TTF_FONT, - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_MINCHO => array(FS_NORMAL =>MINCHO_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_PMINCHO => array(FS_NORMAL =>PMINCHO_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_GOTHIC => array(FS_NORMAL =>GOTHIC_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_PGOTHIC => array(FS_NORMAL =>PGOTHIC_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_MINCHO => array(FS_NORMAL =>PMINCHO_TTF_FONT, + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), /* Hebrew fonts */ - FF_DAVID => array( - FS_NORMAL =>'DAVIDNEW.TTF', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_DAVID => array(FS_NORMAL =>'DAVIDNEW.TTF', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), - FF_MIRIAM => array( - FS_NORMAL =>'MRIAMY.TTF', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_MIRIAM => array(FS_NORMAL =>'MRIAMY.TTF', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), - FF_AHRON => array( - FS_NORMAL =>'ahronbd.ttf', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), + FF_AHRON => array(FS_NORMAL =>'ahronbd.ttf', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), /* Misc fonts */ - FF_DIGITAL => array( - FS_NORMAL =>'DIGIRU__.TTF', - FS_BOLD =>'Digirtu_.ttf', - FS_ITALIC =>'Digir___.ttf', - FS_BOLDITALIC =>'DIGIRT__.TTF' ), - - /* This is an experimental font for the speedometer development - FF_SPEEDO => array( - FS_NORMAL =>'Speedo.ttf', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - */ - - FF_COMPUTER => array( - FS_NORMAL =>'COMPUTER.TTF', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - - FF_CALCULATOR => array( - FS_NORMAL =>'Triad_xs.ttf', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - - /* Dejavu fonts */ - FF_DV_SANSSERIF => array( - FS_NORMAL =>array('DejaVuSans.ttf'), - FS_BOLD =>array('DejaVuSans-Bold.ttf','DejaVuSansBold.ttf'), - FS_ITALIC =>array('DejaVuSans-Oblique.ttf','DejaVuSansOblique.ttf'), - FS_BOLDITALIC =>array('DejaVuSans-BoldOblique.ttf','DejaVuSansBoldOblique.ttf') ), - - FF_DV_SANSSERIFMONO => array( - FS_NORMAL =>array('DejaVuSansMono.ttf','DejaVuMonoSans.ttf'), - FS_BOLD =>array('DejaVuSansMono-Bold.ttf','DejaVuMonoSansBold.ttf'), - FS_ITALIC =>array('DejaVuSansMono-Oblique.ttf','DejaVuMonoSansOblique.ttf'), - FS_BOLDITALIC =>array('DejaVuSansMono-BoldOblique.ttf','DejaVuMonoSansBoldOblique.ttf') ), - - FF_DV_SANSSERIFCOND => array( - FS_NORMAL =>array('DejaVuSansCondensed.ttf','DejaVuCondensedSans.ttf'), - FS_BOLD =>array('DejaVuSansCondensed-Bold.ttf','DejaVuCondensedSansBold.ttf'), - FS_ITALIC =>array('DejaVuSansCondensed-Oblique.ttf','DejaVuCondensedSansOblique.ttf'), - FS_BOLDITALIC =>array('DejaVuSansCondensed-BoldOblique.ttf','DejaVuCondensedSansBoldOblique.ttf') ), - - FF_DV_SERIF => array( - FS_NORMAL =>array('DejaVuSerif.ttf'), - FS_BOLD =>array('DejaVuSerif-Bold.ttf','DejaVuSerifBold.ttf'), - FS_ITALIC =>array('DejaVuSerif-Italic.ttf','DejaVuSerifItalic.ttf'), - FS_BOLDITALIC =>array('DejaVuSerif-BoldItalic.ttf','DejaVuSerifBoldItalic.ttf') ), - - FF_DV_SERIFCOND => array( - FS_NORMAL =>array('DejaVuSerifCondensed.ttf','DejaVuCondensedSerif.ttf'), - FS_BOLD =>array('DejaVuSerifCondensed-Bold.ttf','DejaVuCondensedSerifBold.ttf'), - FS_ITALIC =>array('DejaVuSerifCondensed-Italic.ttf','DejaVuCondensedSerifItalic.ttf'), - FS_BOLDITALIC =>array('DejaVuSerifCondensed-BoldItalic.ttf','DejaVuCondensedSerifBoldItalic.ttf') ), - - - /* Placeholders for defined fonts */ - FF_USERFONT1 => array( - FS_NORMAL =>'', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - - FF_USERFONT2 => array( - FS_NORMAL =>'', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - - FF_USERFONT3 => array( - FS_NORMAL =>'', - FS_BOLD =>'', - FS_ITALIC =>'', - FS_BOLDITALIC =>'' ), - + FF_DIGITAL => array(FS_NORMAL =>'DIGIRU__.TTF', + FS_BOLD =>'Digirtu_.ttf', + FS_ITALIC =>'Digir___.ttf', + FS_BOLDITALIC =>'DIGIRT__.TTF' ), + FF_SPEEDO => array(FS_NORMAL =>'Speedo.ttf', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_COMPUTER => array(FS_NORMAL =>'COMPUTER.TTF', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), + FF_CALCULATOR => array(FS_NORMAL =>'Triad_xs.ttf', + FS_BOLD =>'', + FS_ITALIC =>'', + FS_BOLDITALIC =>'' ), ); } @@ -474,166 +317,24 @@ class TTF if (!$fam) { JpGraphError::RaiseL(25046, $family);//("Specified TTF font family (id=$family) is unknown or does not exist. Please note that TTF fonts are not distributed with JpGraph for copyright reasons. You can find the MS TTF WEB-fonts (arial, courier etc) for download at http://corefonts.sourceforge.net/"); } - $ff = @$fam[$style]; + $f = @$fam[$style]; - // There are several optional file names. They are tried in order - // and the first one found is used - if (!is_array($ff)) { - $ff = array($ff); + if ($f==='') { + JpGraphError::RaiseL(25047, $this->style_names[$style], $this->font_files[$family][FS_NORMAL]); + }//('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.'); + if (!$f) { + JpGraphError::RaiseL(25048, $fam);//("Unknown font style specification [$fam]."); } - $jpgraph_font_dir = dirname(__FILE__).'/fonts/'; - - foreach ($ff as $font_file) { - // All font families are guaranteed to have the normal style - - if ($font_file==='') { - JpGraphError::RaiseL(25047, $this->style_names[$style], $this->font_files[$family][FS_NORMAL]); - }//('Style "'.$this->style_names[$style].'" is not available for font family '.$this->font_files[$family][FS_NORMAL].'.'); - if (!$font_file) { - JpGraphError::RaiseL(25048, $fam);//("Unknown font style specification [$fam]."); - } - - // check jpgraph/src/fonts dir - $jpgraph_font_file = $jpgraph_font_dir . $font_file; - if (file_exists($jpgraph_font_file) === true && is_readable($jpgraph_font_file) === true) { - $font_file = $jpgraph_font_file; - break; - } - - // check OS font dir - if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) { - $font_file = MBTTF_DIR.$font_file; - } else { - $font_file = TTF_DIR.$font_file; - } - if (file_exists($font_file) === true && is_readable($font_file) === true) { - break; - } + if ($family >= FF_MINCHO && $family <= FF_PGOTHIC) { + $f = MBTTF_DIR.$f; + } else { + $f = TTF_DIR.$f; } - if (!file_exists($font_file)) { - JpGraphError::RaiseL(25049, $font_file);//("Font file \"$font_file\" is not readable or does not exist."); + if (file_exists($f) === false || is_readable($f) === false) { + JpGraphError::RaiseL(25049, $f);//("Font file \"$f\" is not readable or does not exist."); } - - return $font_file; - } - - public function SetUserFont($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->font_files[FF_USERFONT] = - array(FS_NORMAL => $aNormal, - FS_BOLD => $aBold, - FS_ITALIC => $aItalic, - FS_BOLDITALIC => $aBoldIt ) ; - } - - public function SetUserFont1($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->font_files[FF_USERFONT1] = - array(FS_NORMAL => $aNormal, - FS_BOLD => $aBold, - FS_ITALIC => $aItalic, - FS_BOLDITALIC => $aBoldIt ) ; - } - - public function SetUserFont2($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->font_files[FF_USERFONT2] = - array(FS_NORMAL => $aNormal, - FS_BOLD => $aBold, - FS_ITALIC => $aItalic, - FS_BOLDITALIC => $aBoldIt ) ; - } - - public function SetUserFont3($aNormal, $aBold='', $aItalic='', $aBoldIt='') - { - $this->font_files[FF_USERFONT3] = - array(FS_NORMAL => $aNormal, - FS_BOLD => $aBold, - FS_ITALIC => $aItalic, - FS_BOLDITALIC => $aBoldIt ) ; + return $f; } } // Class - - -//============================================================================= -// CLASS SymChar -// Description: Code values for some commonly used characters that -// normally isn't available directly on the keyboard, for example -// mathematical and greek symbols. -//============================================================================= -class SymChar -{ - public static function Get($aSymb, $aCapital=false) - { - $iSymbols = array( - /* Greek */ - array('alpha','03B1','0391'), - array('beta','03B2','0392'), - array('gamma','03B3','0393'), - array('delta','03B4','0394'), - array('epsilon','03B5','0395'), - array('zeta','03B6','0396'), - array('ny','03B7','0397'), - array('eta','03B8','0398'), - array('theta','03B8','0398'), - array('iota','03B9','0399'), - array('kappa','03BA','039A'), - array('lambda','03BB','039B'), - array('mu','03BC','039C'), - array('nu','03BD','039D'), - array('xi','03BE','039E'), - array('omicron','03BF','039F'), - array('pi','03C0','03A0'), - array('rho','03C1','03A1'), - array('sigma','03C3','03A3'), - array('tau','03C4','03A4'), - array('upsilon','03C5','03A5'), - array('phi','03C6','03A6'), - array('chi','03C7','03A7'), - array('psi','03C8','03A8'), - array('omega','03C9','03A9'), - /* Money */ - array('euro','20AC'), - array('yen','00A5'), - array('pound','20A4'), - /* Math */ - array('approx','2248'), - array('neq','2260'), - array('not','2310'), - array('def','2261'), - array('inf','221E'), - array('sqrt','221A'), - array('int','222B'), - /* Misc */ - array('copy','00A9'), - array('para','00A7'), - array('tm','2122'), /* Trademark symbol */ - array('rtm','00AE'), /* Registered trademark */ - array('degree','00b0'), - array('lte','2264'), /* Less than or equal */ - array('gte','2265'), /* Greater than or equal */ - - ); - - $n = count($iSymbols); - $i=0; - $found = false; - $aSymb = strtolower($aSymb); - while ($i < $n && !$found) { - $found = $aSymb === $iSymbols[$i++][0]; - } - if ($found) { - $ca = $iSymbols[--$i]; - if ($aCapital && count($ca)==3) { - $s = $ca[2]; - } else { - $s = $ca[1]; - } - return sprintf('&#%04d;', hexdec($s)); - } else { - return ''; - } - } -} diff --git a/onyx2/include/jpgraph/jpgraph_utils.inc.php b/onyx2/include/jpgraph/jpgraph_utils.inc.php index 7bd977c..55199b2 100644 --- a/onyx2/include/jpgraph/jpgraph_utils.inc.php +++ b/onyx2/include/jpgraph/jpgraph_utils.inc.php @@ -1,13 +1,13 @@ iFunc = $aFunc; $this->iXFunc = $aXFunc; } - + public function E($aXMin, $aXMax, $aSteps=50) { $this->iMin = $aXMin; @@ -41,294 +41,370 @@ class FuncGenerator } else { JpGraphError::RaiseL(24001); }//('FuncGenerator : No function specified. '); - + @eval($t); - + // If there is an error in the function specifcation this is the only // way we can discover that. if (empty($xa) || empty($ya)) { JpGraphError::RaiseL(24002); }//('FuncGenerator : Syntax error in function specification '); - + return array($xa,$ya); } } +//============================================================================= +// CLASS SymChar +// Description: Code values for some commonly used characters that +// normally isn't available directly on the keyboard, for example +// mathematical and greek symbols. +//============================================================================= +class SymChar +{ + public static function Get($aSymb, $aCapital=false) + { + $iSymbols = array( + /* Greek */ + array('alpha','03B1','0391'), + array('beta','03B2','0392'), + array('gamma','03B3','0393'), + array('delta','03B4','0394'), + array('epsilon','03B5','0395'), + array('zeta','03B6','0396'), + array('ny','03B7','0397'), + array('eta','03B8','0398'), + array('theta','03B8','0398'), + array('iota','03B9','0399'), + array('kappa','03BA','039A'), + array('lambda','03BB','039B'), + array('mu','03BC','039C'), + array('nu','03BD','039D'), + array('xi','03BE','039E'), + array('omicron','03BF','039F'), + array('pi','03C0','03A0'), + array('rho','03C1','03A1'), + array('sigma','03C3','03A3'), + array('tau','03C4','03A4'), + array('upsilon','03C5','03A5'), + array('phi','03C6','03A6'), + array('chi','03C7','03A7'), + array('psi','03C8','03A8'), + array('omega','03C9','03A9'), + /* Money */ + array('euro','20AC'), + array('yen','00A5'), + array('pound','20A4'), + /* Math */ + array('approx','2248'), + array('neq','2260'), + array('not','2310'), + array('def','2261'), + array('inf','221E'), + array('sqrt','221A'), + array('int','222B'), + /* Misc */ + array('copy','00A9'), + array('para','00A7'), + array('tm','2122'), /* Trademark symbol */ + array('rtm','00AE') /* Registered trademark */ + +); + + $n = count($iSymbols); + $i=0; + $found = false; + $aSymb = strtolower($aSymb); + while ($i < $n && !$found) { + $found = $aSymb === $iSymbols[$i++][0]; + } + if ($found) { + $ca = $iSymbols[--$i]; + if ($aCapital && count($ca)==3) { + $s = $ca[2]; + } else { + $s = $ca[1]; + } + return sprintf('&#%04d;', hexdec($s)); + } else { + return ''; + } + } +} + //============================================================================= // CLASS DateScaleUtils // Description: Help to create a manual date scale //============================================================================= -define('DSUTILS_MONTH', 1); // Major and minor ticks on a monthly basis -define('DSUTILS_MONTH1', 1); // Major and minor ticks on a monthly basis -define('DSUTILS_MONTH2', 2); // Major ticks on a bi-monthly basis -define('DSUTILS_MONTH3', 3); // Major icks on a tri-monthly basis -define('DSUTILS_MONTH6', 4); // Major on a six-monthly basis -define('DSUTILS_WEEK1', 5); // Major ticks on a weekly basis -define('DSUTILS_WEEK2', 6); // Major ticks on a bi-weekly basis -define('DSUTILS_WEEK4', 7); // Major ticks on a quod-weekly basis -define('DSUTILS_DAY1', 8); // Major ticks on a daily basis -define('DSUTILS_DAY2', 9); // Major ticks on a bi-daily basis -define('DSUTILS_DAY4', 10); // Major ticks on a qoud-daily basis -define('DSUTILS_YEAR1', 11); // Major ticks on a yearly basis -define('DSUTILS_YEAR2', 12); // Major ticks on a bi-yearly basis -define('DSUTILS_YEAR5', 13); // Major ticks on a five-yearly basis +DEFINE('DSUTILS_MONTH', 1); // Major and minor ticks on a monthly basis +DEFINE('DSUTILS_MONTH1', 1); // Major and minor ticks on a monthly basis +DEFINE('DSUTILS_MONTH2', 2); // Major ticks on a bi-monthly basis +DEFINE('DSUTILS_MONTH3', 3); // Major icks on a tri-monthly basis +DEFINE('DSUTILS_MONTH6', 4); // Major on a six-monthly basis +DEFINE('DSUTILS_WEEK1', 5); // Major ticks on a weekly basis +DEFINE('DSUTILS_WEEK2', 6); // Major ticks on a bi-weekly basis +DEFINE('DSUTILS_WEEK4', 7); // Major ticks on a quod-weekly basis +DEFINE('DSUTILS_DAY1', 8); // Major ticks on a daily basis +DEFINE('DSUTILS_DAY2', 9); // Major ticks on a bi-daily basis +DEFINE('DSUTILS_DAY4', 10); // Major ticks on a qoud-daily basis +DEFINE('DSUTILS_YEAR1', 11); // Major ticks on a yearly basis +DEFINE('DSUTILS_YEAR2', 12); // Major ticks on a bi-yearly basis +DEFINE('DSUTILS_YEAR5', 13); // Major ticks on a five-yearly basis class DateScaleUtils { - public static $iMin=0; - public static $iMax=0; + public $iMin=0; + public $iMax=0; - private static $starthour; - private static $startmonth; - private static $startday; - private static $startyear; - private static $endmonth; - private static $endyear; - private static $endday; - private static $tickPositions=array(); - private static $minTickPositions=array(); - private static $iUseWeeks = true; + private $starthour; + private $startmonth; + private $startday; + private $startyear; + private $endmonth; + private $endyear; + private $endday; + private $tickPositions=array(); + private $minTickPositions=array(); + private $iUseWeeks = true; - public static function UseWeekFormat($aFlg) + public function UseWeekFormat($aFlg) { - self::$iUseWeeks = $aFlg; + $this->iUseWeeks = $aFlg; } - public static function doYearly($aType, $aMinor=false) + public function doYearly($aType, $aMinor=false) { $i=0; $j=0; - $m = self::$startmonth; - $y = self::$startyear; + $m = $this->startmonth; + $y = $this->startyear; - if (self::$startday == 1) { - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); + if ($this->startday == 1) { + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); } ++$m; switch ($aType) { - case DSUTILS_YEAR1: - for ($y=self::$startyear; $y <= self::$endyear; ++$y) { - if ($aMinor) { - while ($m <= 12) { - if (!($y == self::$endyear && $m > self::$endmonth)) { - self::$minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); - } - ++$m; - } - $m=1; + case DSUTILS_YEAR1: + for ($y=$this->startyear; $y <= $this->endyear; ++$y) { + if ($aMinor) { + while ($m <= 12) { + if (!($y == $this->endyear && $m > $this->endmonth)) { + $this->minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); } - self::$tickPositions[$i++] = mktime(0, 0, 0, 1, 1, $y); + ++$m; } - break; - case DSUTILS_YEAR2: - $y=self::$startyear; - while ($y <= self::$endyear) { - self::$tickPositions[$i++] = mktime(0, 0, 0, 1, 1, $y); - for ($k=0; $k < 1; ++$k) { - ++$y; - if ($aMinor) { - self::$minTickPositions[$j++] = mktime(0, 0, 0, 1, 1, $y); - } - } - ++$y; - } - break; - case DSUTILS_YEAR5: - $y=self::$startyear; - while ($y <= self::$endyear) { - self::$tickPositions[$i++] = mktime(0, 0, 0, 1, 1, $y); - for ($k=0; $k < 4; ++$k) { - ++$y; - if ($aMinor) { - self::$minTickPositions[$j++] = mktime(0, 0, 0, 1, 1, $y); - } - } - ++$y; - } - break; + $m=1; + } + $this->tickPositions[$i++] = mktime(0, 0, 0, 1, 1, $y); } + break; + case DSUTILS_YEAR2: + $y=$this->startyear; + while ($y <= $this->endyear) { + $this->tickPositions[$i++] = mktime(0, 0, 0, 1, 1, $y); + for ($k=0; $k < 1; ++$k) { + ++$y; + if ($aMinor) { + $this->minTickPositions[$j++] = mktime(0, 0, 0, 1, 1, $y); + } + } + ++$y; + } + break; + case DSUTILS_YEAR5: + $y=$this->startyear; + while ($y <= $this->endyear) { + $this->tickPositions[$i++] = mktime(0, 0, 0, 1, 1, $y); + for ($k=0; $k < 4; ++$k) { + ++$y; + if ($aMinor) { + $this->minTickPositions[$j++] = mktime(0, 0, 0, 1, 1, $y); + } + } + ++$y; + } + break; + } } - public static function doDaily($aType, $aMinor=false) + public function doDaily($aType, $aMinor=false) { - $m = self::$startmonth; - $y = self::$startyear; - $d = self::$startday; - $h = self::$starthour; + $m = $this->startmonth; + $y = $this->startyear; + $d = $this->startday; + $h = $this->starthour; $i=0; $j=0; if ($h == 0) { - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, $d, $y); + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, $d, $y); + $t = mktime(0, 0, 0, $m, $d, $y); + } else { + $t = mktime(0, 0, 0, $m, $d, $y); } - $t = mktime(0, 0, 0, $m, $d, $y); - switch ($aType) { - case DSUTILS_DAY1: - while ($t <= self::$iMax) { - $t = strtotime('+1 day', $t); - self::$tickPositions[$i++] = $t; - if ($aMinor) { - self::$minTickPositions[$j++] = strtotime('+12 hours', $t); - } - } - break; - case DSUTILS_DAY2: - while ($t <= self::$iMax) { - $t = strtotime('+1 day', $t); - if ($aMinor) { - self::$minTickPositions[$j++] = $t; - } - $t = strtotime('+1 day', $t); - self::$tickPositions[$i++] = $t; - } - break; - case DSUTILS_DAY4: - while ($t <= self::$iMax) { - for ($k=0; $k < 3; ++$k) { - $t = strtotime('+1 day', $t); - if ($aMinor) { - self::$minTickPositions[$j++] = $t; - } - } - $t = strtotime('+1 day', $t); - self::$tickPositions[$i++] = $t; - } - break; + case DSUTILS_DAY1: + while ($t <= $this->iMax) { + $t += 3600*24; + $this->tickPositions[$i++] = $t; } + break; + case DSUTILS_DAY2: + while ($t <= $this->iMax) { + $t += 3600*24; + if ($aMinor) { + $this->minTickPositions[$j++] = $t; + } + $t += 3600*24; + $this->tickPositions[$i++] = $t; + } + break; + case DSUTILS_DAY4: + while ($t <= $this->iMax) { + for ($k=0; $k < 3; ++$k) { + $t += 3600*24; + if ($aMinor) { + $this->minTickPositions[$j++] = $t; + } + } + $t += 3600*24; + $this->tickPositions[$i++] = $t; + } + break; + } } - public static function doWeekly($aType, $aMinor=false) + public function doWeekly($aType, $aMinor=false) { $hpd = 3600*24; $hpw = 3600*24*7; // Find out week number of min date - $thursday = self::$iMin + $hpd * (3 - (date('w', self::$iMin) + 6) % 7); + $thursday = $this->iMin + $hpd * (3 - (date('w', $this->iMin) + 6) % 7); $week = 1 + (date('z', $thursday) - (11 - date('w', mktime(0, 0, 0, 1, 1, date('Y', $thursday)))) % 7) / 7; - $daynumber = date('w', self::$iMin); + $daynumber = date('w', $this->iMin); if ($daynumber == 0) { $daynumber = 7; } - $m = self::$startmonth; - $y = self::$startyear; - $d = self::$startday; + $m = $this->startmonth; + $y = $this->startyear; + $d = $this->startday; $i=0; $j=0; // The assumption is that the weeks start on Monday. If the first day // is later in the week then the first week tick has to be on the following // week. if ($daynumber == 1) { - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, $d, $y); + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, $d, $y); $t = mktime(0, 0, 0, $m, $d, $y) + $hpw; } else { $t = mktime(0, 0, 0, $m, $d, $y) + $hpd*(8-$daynumber); } switch ($aType) { - case DSUTILS_WEEK1: - $cnt=0; - break; - case DSUTILS_WEEK2: - $cnt=1; - break; - case DSUTILS_WEEK4: - $cnt=3; - break; - } - while ($t <= self::$iMax) { - self::$tickPositions[$i++] = $t; + case DSUTILS_WEEK1: + $cnt=0; + break; + case DSUTILS_WEEK2: + $cnt=1; + break; + case DSUTILS_WEEK4: + $cnt=3; + break; + } + while ($t <= $this->iMax) { + $this->tickPositions[$i++] = $t; for ($k=0; $k < $cnt; ++$k) { $t += $hpw; if ($aMinor) { - self::$minTickPositions[$j++] = $t; + $this->minTickPositions[$j++] = $t; } } $t += $hpw; } } - public static function doMonthly($aType, $aMinor=false) + public function doMonthly($aType, $aMinor=false) { $monthcount=0; - $m = self::$startmonth; - $y = self::$startyear; + $m = $this->startmonth; + $y = $this->startyear; $i=0; $j=0; // Skip the first month label if it is before the startdate - if (self::$startday == 1) { - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); + if ($this->startday == 1) { + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); $monthcount=1; } if ($aType == 1) { - if (self::$startday < 15) { - self::$minTickPositions[$j++] = mktime(0, 0, 0, $m, 15, $y); + if ($this->startday < 15) { + $this->minTickPositions[$j++] = mktime(0, 0, 0, $m, 15, $y); } } ++$m; // Loop through all the years included in the scale - for ($y=self::$startyear; $y <= self::$endyear; ++$y) { + for ($y=$this->startyear; $y <= $this->endyear; ++$y) { // Loop through all the months. There are three cases to consider: // 1. We are in the first year and must start with the startmonth // 2. We are in the end year and we must stop at last month of the scale // 3. A year in between where we run through all the 12 months - $stopmonth = $y == self::$endyear ? self::$endmonth : 12; + $stopmonth = $y == $this->endyear ? $this->endmonth : 12; while ($m <= $stopmonth) { switch ($aType) { - case DSUTILS_MONTH1: - // Set minor tick at the middle of the month - if ($aMinor) { - if ($m <= $stopmonth) { - if (!($y==self::$endyear && $m==$stopmonth && self::$endday < 15)) { - self::$minTickPositions[$j++] = mktime(0, 0, 0, $m, 15, $y); - } - } - } - // Major at month - // Get timestamp of first hour of first day in each month - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); - - break; - case DSUTILS_MONTH2: - if ($aMinor) { - // Set minor tick at start of each month - self::$minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); - } - - // Major at every second month - // Get timestamp of first hour of first day in each month - if ($monthcount % 2 == 0) { - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); - } - break; - case DSUTILS_MONTH3: - if ($aMinor) { - // Set minor tick at start of each month - self::$minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); - } - // Major at every third month - // Get timestamp of first hour of first day in each month - if ($monthcount % 3 == 0) { - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); - } - break; - case DSUTILS_MONTH6: - if ($aMinor) { - // Set minor tick at start of each month - self::$minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); - } - // Major at every third month - // Get timestamp of first hour of first day in each month - if ($monthcount % 6 == 0) { - self::$tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); - } - break; + case DSUTILS_MONTH1: + // Set minor tick at the middle of the month + if ($aMinor) { + if ($m <= $stopmonth) { + if (!($y==$this->endyear && $m==$stopmonth && $this->endday < 15)) { + $this->minTickPositions[$j++] = mktime(0, 0, 0, $m, 15, $y); + } } + } + // Major at month + // Get timestamp of first hour of first day in each month + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); + + break; + case DSUTILS_MONTH2: + if ($aMinor) { + // Set minor tick at start of each month + $this->minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); + } + + // Major at every second month + // Get timestamp of first hour of first day in each month + if ($monthcount % 2 == 0) { + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); + } + break; + case DSUTILS_MONTH3: + if ($aMinor) { + // Set minor tick at start of each month + $this->minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); + } + // Major at every third month + // Get timestamp of first hour of first day in each month + if ($monthcount % 3 == 0) { + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); + } + break; + case DSUTILS_MONTH6: + if ($aMinor) { + // Set minor tick at start of each month + $this->minTickPositions[$j++] = mktime(0, 0, 0, $m, 1, $y); + } + // Major at every third month + // Get timestamp of first hour of first day in each month + if ($monthcount % 6 == 0) { + $this->tickPositions[$i++] = mktime(0, 0, 0, $m, 1, $y); + } + break; + } ++$m; ++$monthcount; } @@ -338,20 +414,20 @@ class DateScaleUtils // For the case where all dates are within the same month // we want to make sure we have at least two ticks on the scale // since the scale want work properly otherwise - if (self::$startmonth == self::$endmonth && self::$startyear == self::$endyear && $aType==1) { - self::$tickPositions[$i++] = mktime(0, 0, 0, self::$startmonth + 1, 1, self::$startyear); + if ($this->startmonth == $this->endmonth && $this->startyear == $this->endyear && $aType==1) { + $this->tickPositions[$i++] = mktime(0, 0, 0, $this->startmonth + 1, 1, $this->startyear); } - return array(self::$tickPositions,self::$minTickPositions); + return array($this->tickPositions,$this->minTickPositions); } - public static function GetTicks($aData, $aType=1, $aMinor=false, $aEndPoints=false) + public function GetTicks($aData, $aType=1, $aMinor=false, $aEndPoints=false) { $n = count($aData); - return self::GetTicksFromMinMax($aData[0], $aData[$n-1], $aType, $aMinor, $aEndPoints); + return $this->GetTicksFromMinMax($aData[0], $aData[$n-1], $aType, $aMinor, $aEndPoints); } - public static function GetAutoTicks($aMin, $aMax, $aMaxTicks=10, $aMinor=false) + public function GetAutoTicks($aMin, $aMax, $aMaxTicks=10, $aMinor=false) { $diff = $aMax - $aMin; $spd = 3600*24; @@ -359,7 +435,7 @@ class DateScaleUtils $spm = $spd*30; $spy = $spd*352; - if (self::$iUseWeeks) { + if ($this->iUseWeeks) { $w = 'W'; } else { $w = 'd M'; @@ -369,10 +445,14 @@ class DateScaleUtils // First value: Main decision point // Second value: Array of formatting depending on divisor for wanted max number of ticks. ,.. $tt = array( - array($spw, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',-1,DSUTILS_DAY4,'d M')), - array($spm, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',7,DSUTILS_WEEK1,$w,-1,DSUTILS_WEEK2,$w)), - array($spy, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M',7,DSUTILS_WEEK1,$w,14,DSUTILS_WEEK2,$w,30,DSUTILS_MONTH1,'M',60,DSUTILS_MONTH2,'M',-1,DSUTILS_MONTH3,'M')), - array(-1, array(30,DSUTILS_MONTH1,'M-Y',60,DSUTILS_MONTH2,'M-Y',90,DSUTILS_MONTH3,'M-Y',180,DSUTILS_MONTH6,'M-Y',352,DSUTILS_YEAR1,'Y',704,DSUTILS_YEAR2,'Y',-1,DSUTILS_YEAR5,'Y'))); + array($spw, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',-1,DSUTILS_DAY4,'d M')), + array($spm, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M', + 7,DSUTILS_WEEK1,$w,-1,DSUTILS_WEEK2,$w)), + array($spy, array(1,DSUTILS_DAY1,'d M',2,DSUTILS_DAY2,'d M',4,DSUTILS_DAY4,'d M', + 7,DSUTILS_WEEK1,$w,14,DSUTILS_WEEK2,$w, + 30,DSUTILS_MONTH1,'M',60,DSUTILS_MONTH2,'M',-1,DSUTILS_MONTH3,'M')), + array(-1, array(30,DSUTILS_MONTH1,'M-Y',60,DSUTILS_MONTH2,'M-Y',90,DSUTILS_MONTH3,'M-Y', + 180,DSUTILS_MONTH6,'M-Y',352,DSUTILS_YEAR1,'Y',704,DSUTILS_YEAR2,'Y',-1,DSUTILS_YEAR5,'Y'))); $ntt = count($tt); $nd = floor($diff/$spd); @@ -384,7 +464,7 @@ class DateScaleUtils if ($nd/$t[3*$j] <= $aMaxTicks || $j==$n-1) { $type = $t[3*$j+1]; $fs = $t[3*$j+2]; - list($tickPositions, $minTickPositions) = self::GetTicksFromMinMax($aMin, $aMax, $type, $aMinor); + list($tickPositions, $minTickPositions) = $this->GetTicksFromMinMax($aMin, $aMax, $type, $aMinor); return array($fs,$tickPositions,$minTickPositions,$type); } } @@ -392,26 +472,26 @@ class DateScaleUtils } } - public static function GetTicksFromMinMax($aMin, $aMax, $aType, $aMinor=false, $aEndPoints=false) + public function GetTicksFromMinMax($aMin, $aMax, $aType, $aMinor=false, $aEndPoints=false) { - self::$starthour = date('G', $aMin); - self::$startmonth = date('n', $aMin); - self::$startday = date('j', $aMin); - self::$startyear = date('Y', $aMin); - self::$endmonth = date('n', $aMax); - self::$endyear = date('Y', $aMax); - self::$endday = date('j', $aMax); - self::$iMin = $aMin; - self::$iMax = $aMax; + $this->starthour = date('G', $aMin); + $this->startmonth = date('n', $aMin); + $this->startday = date('j', $aMin); + $this->startyear = date('Y', $aMin); + $this->endmonth = date('n', $aMax); + $this->endyear = date('Y', $aMax); + $this->endday = date('j', $aMax); + $this->iMin = $aMin; + $this->iMax = $aMax; if ($aType <= DSUTILS_MONTH6) { - self::doMonthly($aType, $aMinor); + $this->doMonthly($aType, $aMinor); } elseif ($aType <= DSUTILS_WEEK4) { - self::doWeekly($aType, $aMinor); + $this->doWeekly($aType, $aMinor); } elseif ($aType <= DSUTILS_DAY4) { - self::doDaily($aType, $aMinor); + $this->doDaily($aType, $aMinor); } elseif ($aType <= DSUTILS_YEAR5) { - self::doYearly($aType, $aMinor); + $this->doYearly($aType, $aMinor); } else { JpGraphError::RaiseL(24003); } @@ -425,7 +505,7 @@ class DateScaleUtils $tickPositions[$i] = $aData[$n-1]; } - return array(self::$tickPositions,self::$minTickPositions); + return array($this->tickPositions,$this->minTickPositions); } } @@ -434,6 +514,7 @@ class DateScaleUtils //============================================================================= class ReadFileData { + //---------------------------------------------------------------------------- // Desciption: // Read numeric data from a file. @@ -448,7 +529,7 @@ class ReadFileData //---------------------------------------------------------------------------- public static function FromCSV($aFile, &$aData, $aSepChar=',', $aMaxLineLength=1024) { - $rh = @fopen($aFile, 'r'); + $rh = fopen($aFile, 'r'); if ($rh === false) { return false; } @@ -472,255 +553,4 @@ class ReadFileData } return $cnt; } - - //---------------------------------------------------------------------------- - // Desciption: - // Read numeric data from a file. - // Each value should be separated by either a new line or by a specified - // separator character (default is ','). - // Before returning the data each value is converted to a proper float - // value. The routine is robust in the sense that non numeric data in the - // file will be discarded. - // - // Options: - // 'separator' => ',', - // 'enclosure' => '"', - // 'readlength' => 1024, - // 'ignore_first' => false, - // 'first_as_key' => false - // 'escape' => '\', # PHP >= 5.3 only - // - // Returns: - // The number of lines read on success, FALSE on failure - //---------------------------------------------------------------------------- - public static function FromCSV2($aFile, &$aData, $aOptions = array()) - { - $aDefaults = array( - 'separator' => ',', - 'enclosure' => chr(34), - 'escape' => chr(92), - 'readlength' => 1024, - 'ignore_first' => false, - 'first_as_key' => false - ); - - $aOptions = array_merge( - $aDefaults, - is_array($aOptions) ? $aOptions : array() - ); - - if ($aOptions['first_as_key']) { - $aOptions['ignore_first'] = true; - } - - $rh = @fopen($aFile, 'r'); - - if ($rh === false) { - return false; - } - - $aData = array(); - $aLine = fgetcsv( - $rh, - $aOptions['readlength'], - $aOptions['separator'], - $aOptions['enclosure'] - /*, $aOptions['escape'] # PHP >= 5.3 only */ - ); - - // Use numeric array keys for the columns by default - // If specified use first lines values as assoc keys instead - $keys = array_keys($aLine); - if ($aOptions['first_as_key']) { - $keys = array_values($aLine); - } - - $num_lines = 0; - $num_cols = count($aLine); - - while ($aLine !== false) { - if (is_array($aLine) && count($aLine) != $num_cols) { - JpGraphError::RaiseL(24004); - // 'ReadCSV2: Column count mismatch in %s line %d' - } - - // fgetcsv returns NULL for empty lines - if (!is_null($aLine)) { - $num_lines++; - - if (!($aOptions['ignore_first'] && $num_lines == 1) && is_numeric($aLine[0])) { - for ($i = 0; $i < $num_cols; $i++) { - $aData[ $keys[$i] ][] = floatval($aLine[$i]); - } - } - } - - $aLine = fgetcsv( - $rh, - $aOptions['readlength'], - $aOptions['separator'], - $aOptions['enclosure'] - /*, $aOptions['escape'] # PHP >= 5.3 only*/ - ); - } - - fclose($rh); - - if ($aOptions['ignore_first']) { - $num_lines--; - } - - return $num_lines; - } - - // Read data from two columns in a plain text file - public static function From2Col($aFile, $aCol1, $aCol2, $aSepChar=' ') - { - $lines = @file($aFile, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); - if ($lines === false) { - return false; - } - $s = '/[\s]+/'; - if ($aSepChar == ',') { - $s = '/[\s]*,[\s]*/'; - } elseif ($aSepChar == ';') { - $s = '/[\s]*;[\s]*/'; - } - foreach ($lines as $line => $datarow) { - $split = preg_split($s, $datarow); - $aCol1[] = floatval(trim($split[0])); - $aCol2[] = floatval(trim($split[1])); - } - - return count($lines); - } - - // Read data from one columns in a plain text file - public static function From1Col($aFile, $aCol1) - { - $lines = @file($aFile, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); - if ($lines === false) { - return false; - } - foreach ($lines as $line => $datarow) { - $aCol1[] = floatval(trim($datarow)); - } - - return count($lines); - } - - public static function FromMatrix($aFile, $aSepChar=' ') - { - $lines = @file($aFile, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES); - if ($lines === false) { - return false; - } - $mat = array(); - $reg = '/'.$aSepChar.'/'; - foreach ($lines as $line => $datarow) { - $row = preg_split($reg, trim($datarow)); - foreach ($row as $key => $cell) { - $row[$key] = floatval(trim($cell)); - } - $mat[] = $row; - } - return $mat; - } -} - -define('__LR_EPSILON', 1.0e-8); -//============================================================================= -// Class LinearRegression -//============================================================================= -class LinearRegression -{ - private $ix=array(); - private $iy=array(); - private $ib=0; - private $ia=0; - private $icalculated=false; - public $iDet=0; - public $iCorr=0; - public $iStdErr=0; - - public function __construct($aDataX, $aDataY) - { - if (count($aDataX) !== count($aDataY)) { - JpGraph::Raise('LinearRegression: X and Y data array must be of equal length.'); - } - $this->ix = $aDataX; - $this->iy = $aDataY; - } - - public function Calc() - { - $this->icalculated = true; - - $n = count($this->ix); - $sx2 = 0 ; - $sy2 = 0 ; - $sxy = 0 ; - $sx = 0 ; - $sy = 0 ; - - for ($i=0; $i < $n; ++$i) { - $sx2 += $this->ix[$i] * $this->ix[$i]; - $sy2 += $this->iy[$i] * $this->iy[$i]; - $sxy += $this->ix[$i] * $this->iy[$i]; - $sx += $this->ix[$i]; - $sy += $this->iy[$i]; - } - - if ($n*$sx2 - $sx*$sx > __LR_EPSILON) { - $this->ib = ($n*$sxy - $sx*$sy) / ($n*$sx2 - $sx*$sx); - $this->ia = ($sy - $this->ib*$sx) / $n; - - $sx = $this->ib * ($sxy - $sx*$sy/$n); - $sy2 = $sy2 - $sy*$sy/$n; - $sy = $sy2 - $sx; - - $this->iDet = $sx / $sy2; - $this->iCorr = sqrt($this->iDet); - if ($n > 2) { - $this->iStdErr = sqrt($sy / ($n-2)); - } else { - $this->iStdErr = NAN ; - } - } else { - $this->ib = 0; - $this->ia = 0; - } - } - - public function GetAB() - { - if ($this->icalculated == false) { - $this->Calc(); - } - return array($this->ia, $this->ib); - } - - public function GetStat() - { - if ($this->icalculated == false) { - $this->Calc(); - } - return array($this->iStdErr, $this->iCorr, $this->iDet); - } - - public function GetY($aMinX, $aMaxX, $aStep=1) - { - if ($this->icalculated == false) { - $this->Calc(); - } - - $yy = array(); - $i = 0; - for ($x=$aMinX; $x <= $aMaxX; $x += $aStep) { - $xx[$i ] = $x; - $yy[$i++] = $this->ia + $this->ib * $x; - } - - return array($xx,$yy); - } } diff --git a/onyx2/include/jpgraph/jpgraph_windrose.php b/onyx2/include/jpgraph/jpgraph_windrose.php deleted file mode 100755 index d80c0fc..0000000 --- a/onyx2/include/jpgraph/jpgraph_windrose.php +++ /dev/null @@ -1,1733 +0,0 @@ -iZeroSum=0; - foreach ($aData as $idx => $legdata) { - $legsum = array_sum($legdata); - $maxnum = max($maxnum, count($legdata)-1); - $max = max($legsum-$legdata[0], $max); - $totlegsum += $legsum; - $this->iZeroSum += $legdata[0] ; - } - if (round($totlegsum) > 100) { - JpGraphError::RaiseL(22001, $legsum); - //("Total percentage for all windrose legs in a windrose plot can not exceed 100% !\n(Current max is: ".$legsum.')'); - } - $this->iMax = $max ; - $this->iMaxNum = $maxnum; - $this->iNumCirc = $this->GetNumCirc(); - $this->iMaxVal = $this->iNumCirc * $this->iDelta ; - } - - // Return number of grid circles - public function GetNumCirc() - { - // Never return less than 1 circles - $num = ceil($this->iMax / $this->iDelta); - return max(1, $num) ; - } - - public function SetMaxValue($aMax) - { - $this->iMax = $aMax; - $this->iNumCirc = $this->GetNumCirc(); - $this->iMaxVal = $this->iNumCirc * $this->iDelta ; - } - - // Set step size for circular grid - public function Set($aMax, $aDelta=null) - { - if ($aDelta==null) { - $this->SetMaxValue($aMax); - return; - } - $this->iDelta = $aDelta; - $this->iNumCirc = ceil($aMax/$aDelta); //$this->GetNumCirc(); - $this->iMaxVal = $this->iNumCirc * $this->iDelta ; - $this->iMax=$aMax; - // Remember that user has specified interval so don't - // do autoscaling - $this->iManualScale = true; - } - - public function AutoScale($aRadius, $aMinDist=30) - { - if ($this->iManualScale) { - return; - } - - // Make sure distance (in pixels) between two circles - // is never less than $aMinDist pixels - $tst = ceil($aRadius / $this->iNumCirc) ; - - while ($tst <= $aMinDist && $this->iDelta < 100) { - $this->iDelta += 5; - $tst = ceil($aRadius / $this->GetNumCirc()) ; - } - - if ($this->iDelta >= 100) { - JpGraphError::RaiseL(22002);//('Graph is too small to have a scale. Please make the graph larger.'); - } - - // If the distance is to large try with multiples of 2 instead - if ($tst > $aMinDist * 3) { - $this->iDelta = 2; - $tst = ceil($aRadius / $this->iNumCirc) ; - - while ($tst <= $aMinDist && $this->iDelta < 100) { - $this->iDelta += 2; - $tst = ceil($aRadius / $this->GetNumCirc()) ; - } - - if ($this->iDelta >= 100) { - JpGraphError::RaiseL(22002); //('Graph is too small to have a scale. Please make the graph larger.'); - } - } - - $this->iNumCirc = $this->GetNumCirc(); - $this->iMaxVal = $this->iNumCirc * $this->iDelta ; - } - - // Return max of all leg values - public function GetMax() - { - return $this->iMax; - } - - public function Hide($aFlg=true) - { - $this->iHideLabels = $aFlg; - } - - public function SetAngle($aAngle) - { - $this->iAngle = $aAngle ; - } - - // Translate a Leg value to radius distance - public function RelTranslate($aVal, $r, $ri) - { - $tv = round($aVal/$this->iMaxVal*($r-$ri)); - return $tv ; - } - - public function SetLabelAlign($aAlign) - { - $this->iLblAlign = $aAlign ; - } - - public function SetLabelFormat($aFmt) - { - $this->iLblFmt = $aFmt ; - } - - public function SetLabelFillColor($aBkgColor, $aBorderColor=false) - { - $this->iFontBkgColor = $aBkgColor; - if ($aBorderColor === false) { - $this->iFontFrameColor = $aBkgColor; - } else { - $this->iFontFrameColor = $aBorderColor; - } - } - - public function SetFontColor($aColor) - { - $this->iFontColor = $aColor ; - $this->iZFontColor = $aColor ; - } - - public function SetFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=10) - { - $this->iFontFamily = $aFontFamily ; - $this->iFontStyle = $aFontStyle ; - $this->iFontSize = $aFontSize ; - $this->SetZFont($aFontFamily, $aFontStyle, $aFontSize); - } - - public function SetZFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=10) - { - $this->iZFontFamily = $aFontFamily ; - $this->iZFontStyle = $aFontStyle ; - $this->iZFontSize = $aFontSize ; - } - - public function SetZeroLabel($aTxt) - { - $this->iLblZeroTxt = $aTxt ; - } - - public function SetZFontColor($aColor) - { - $this->iZFontColor = $aColor ; - } - - public function StrokeLabels($aImg, $xc, $yc, $ri, $rr) - { - if ($this->iHideLabels) { - return; - } - - // Setup some convinient vairables - $a = $this->iAngle * M_PI/180.0; - $n = $this->iNumCirc; - $d = $this->iDelta; - - // Setup the font and font color - $val = new Text(); - $val->SetFont($this->iFontFamily, $this->iFontStyle, $this->iFontSize); - $val->SetColor($this->iFontColor); - - if ($this->iFontBkgColor !== false) { - $val->SetBox($this->iFontBkgColor, $this->iFontFrameColor); - } - - // Position the labels relative to the radiant circles - if ($this->iLblAlign == LBLALIGN_TOP) { - if ($a > 0 && $a <= M_PI/2) { - $val->SetAlign('left', 'bottom'); - } elseif ($a > M_PI/2 && $a <= M_PI) { - $val->SetAlign('right', 'bottom'); - } - } elseif ($this->iLblAlign == LBLALIGN_CENTER) { - $val->SetAlign('center', 'center'); - } - - // Stroke the labels close to each circle - $v = $d ; - $si = sin($a); - $co = cos($a); - for ($i=0; $i < $n; ++$i, $v += $d) { - $r = $ri + ($i+1) * $rr; - $x = $xc + $co * $r; - $y = $yc - $si * $r; - $val->Set(sprintf($this->iLblFmt, $v)); - $val->Stroke($aImg, $x, $y); - } - - // Print the text in the zero circle - if ($this->iLblZeroTxt === null) { - $this->iLblZeroTxt = sprintf($this->iLblFmt, $this->iZeroSum); - } else { - $this->iLblZeroTxt = sprintf($this->iLblZeroTxt, $this->iZeroSum); - } - - $val->Set($this->iLblZeroTxt); - $val->SetAlign('center', 'center'); - $val->SetParagraphAlign('center'); - $val->SetColor($this->iZFontColor); - $val->SetFont($this->iZFontFamily, $this->iZFontStyle, $this->iZFontSize); - $val->Stroke($aImg, $xc, $yc); - } -} - -//=================================================== -// CLASS LegendStyle -//=================================================== -class LegendStyle -{ - public $iLength = 40; - public $iMargin = 20 ; - public $iBottomMargin=5; - public $iCircleWeight=2; - public $iCircleRadius = 18; - public $iCircleColor='black'; - public $iTxtFontFamily=FF_VERDANA; - public $iTxtFontStyle=FS_NORMAL; - public $iTxtFontSize=8; - public $iLblFontFamily=FF_VERDANA; - public $iLblFontStyle=FS_NORMAL; - public $iLblFontSize=8; - public $iCircleFontFamily=FF_VERDANA; - public $iCircleFontStyle=FS_NORMAL; - public $iCircleFontSize=8; - public $iLblFontColor='black'; - public $iTxtFontColor='black'; - public $iCircleFontColor='black'; - public $iShow=true; - public $iFormatString='%.1f'; - public $iTxtMargin=6; - public $iTxt=''; - public $iZCircleTxt='Calm'; - - public function SetFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=10) - { - $this->iLblFontFamily = $aFontFamily ; - $this->iLblFontStyle = $aFontStyle ; - $this->iLblFontSize = $aFontSize ; - $this->iTxtFontFamily = $aFontFamily ; - $this->iTxtFontStyle = $aFontStyle ; - $this->iTxtFontSize = $aFontSize ; - $this->iCircleFontFamily = $aFontFamily ; - $this->iCircleFontStyle = $aFontStyle ; - $this->iCircleFontSize = $aFontSize ; - } - - public function SetLFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=10) - { - $this->iLblFontFamily = $aFontFamily ; - $this->iLblFontStyle = $aFontStyle ; - $this->iLblFontSize = $aFontSize ; - } - - public function SetTFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=10) - { - $this->iTxtFontFamily = $aFontFamily ; - $this->iTxtFontStyle = $aFontStyle ; - $this->iTxtFontSize = $aFontSize ; - } - - public function SetCFont($aFontFamily, $aFontStyle=FS_NORMAL, $aFontSize=10) - { - $this->iCircleFontFamily = $aFontFamily ; - $this->iCircleFontStyle = $aFontStyle ; - $this->iCircleFontSize = $aFontSize ; - } - - - public function SetFontColor($aColor) - { - $this->iTxtFontColor = $aColor ; - $this->iLblFontColor = $aColor ; - $this->iCircleFontColor = $aColor ; - } - - public function SetTFontColor($aColor) - { - $this->iTxtFontColor = $aColor ; - } - - public function SetLFontColor($aColor) - { - $this->iLblFontColor = $aColor ; - } - - public function SetCFontColor($aColor) - { - $this->iCircleFontColor = $aColor ; - } - - public function SetCircleWeight($aWeight) - { - $this->iCircleWeight = $aWeight; - } - - public function SetCircleRadius($aRadius) - { - $this->iCircleRadius = $aRadius; - } - - public function SetCircleColor($aColor) - { - $this->iCircleColor = $aColor ; - } - - public function SetCircleText($aTxt) - { - $this->iZCircleTxt = $aTxt; - } - - public function SetMargin($aMarg, $aBottomMargin=5) - { - $this->iMargin=$aMarg; - $this->iBottomMargin=$aBottomMargin; - } - - public function SetLength($aLength) - { - $this->iLength = $aLength ; - } - - public function Show($aFlg=true) - { - $this->iShow = $aFlg; - } - - public function Hide($aFlg=true) - { - $this->iShow = ! $aFlg; - } - - public function SetFormat($aFmt) - { - $this->iFormatString=$aFmt; - } - - public function SetText($aTxt) - { - $this->iTxt = $aTxt ; - } -} - -define('RANGE_OVERLAPPING', 0); -define('RANGE_DISCRETE', 1); - -//=================================================== -// CLASS WindrosePlot -//=================================================== -class WindrosePlot -{ - private $iAntiAlias=true; - private $iData=array(); - public $iX=0.5; - public $iY=0.5; - public $iSize=0.55; - private $iGridColor1='gray'; - private $iGridColor2='darkgreen'; - private $iRadialColorArray=array(); - private $iRadialWeightArray=array(); - private $iRadialStyleArray=array(); - private $iRanges = array(1,2,3,5,6,10,13.5,99.0); - private $iRangeStyle = RANGE_OVERLAPPING ; - public $iCenterSize=60; - private $iType = WINDROSE_TYPE16; - public $iFontFamily=FF_VERDANA; - public $iFontStyle=FS_NORMAL; - public $iFontSize=10; - public $iFontColor='darkgray'; - private $iRadialGridStyle='longdashed'; - private $iAllDirectionLabels = array('E','ENE','NE','NNE','N','NNW','NW','WNW','W','WSW','SW','SSW','S','SSE','SE','ESE'); - private $iStandardDirections = array(); - private $iCircGridWeight=3; - private $iRadialGridWeight=1; - private $iLabelMargin=12; - private $iLegweights = array(2,4,6,8,10,12,14,16,18,20); - private $iLegColors = array('orange','black','blue','red','green','purple','navy','yellow','brown'); - private $iLabelFormatString=''; - private $iLabels=array(); - private $iLabelPositioning = LBLPOSITION_EDGE; - private $iColor='white'; - private $iShowBox=false; - private $iBoxColor='black'; - private $iBoxWeight=1; - private $iBoxStyle='solid'; - private $iOrdinalEncoding=KEYENCODING_ANTICLOCKWISE; - public $legend=null; - - public function __construct($aData) - { - $this->iData = $aData; - $this->legend = new LegendStyle(); - - // Setup the scale - $this->scale = new WindrosePlotScale($this->iData); - - // default label for free type i agle and a degree sign - $this->iLabelFormatString = '%.1f'.SymChar::Get('degree'); - - $delta = 2*M_PI/16; - for ($i=0, $a=0; $i < 16; ++$i, $a += $delta) { - $this->iStandardDirections[$this->iAllDirectionLabels[$i]] = $a; - } - } - - // Dummy method to make window plots have the same signature as the - // layout classes since windrose plots are "leaf" classes in the hierarchy - public function LayoutSize() - { - return 1; - } - - public function SetSize($aSize) - { - $this->iSize = $aSize; - } - - public function SetDataKeyEncoding($aEncoding) - { - $this->iOrdinalEncoding = $aEncoding; - } - - public function SetColor($aColor) - { - $this->iColor = $aColor; - } - - public function SetRadialColors($aColors) - { - $this->iRadialColorArray = $aColors; - } - - public function SetRadialWeights($aWeights) - { - $this->iRadialWeightArray = $aWeights; - } - - public function SetRadialStyles($aStyles) - { - $this->iRadialStyleArray = $aStyles; - } - - public function SetBox($aColor='black', $aWeight=1, $aStyle='solid', $aShow=true) - { - $this->iShowBox = $aShow ; - $this->iBoxColor = $aColor ; - $this->iBoxWeight = $aWeight ; - $this->iBoxStyle = $aStyle; - } - - public function SetLabels($aLabels) - { - $this->iLabels = $aLabels ; - } - - public function SetLabelMargin($aMarg) - { - $this->iLabelMargin = $aMarg ; - } - - public function SetLabelFormat($aLblFormat) - { - $this->iLabelFormatString = $aLblFormat ; - } - - public function SetCompassLabels($aLabels) - { - if (count($aLabels) != 16) { - JpgraphError::RaiseL(22004); //('Label specification for windrose directions must have 16 values (one for each compass direction).'); - } - $this->iAllDirectionLabels = $aLabels ; - - $delta = 2*M_PI/16; - for ($i=0, $a=0; $i < 16; ++$i, $a += $delta) { - $this->iStandardDirections[$this->iAllDirectionLabels[$i]] = $a; - } - } - - public function SetCenterSize($aSize) - { - $this->iCenterSize = $aSize; - } - // Alias for SetCenterSize - public function SetZCircleSize($aSize) - { - $this->iCenterSize = $aSize; - } - - public function SetFont($aFFam, $aFStyle=FS_NORMAL, $aFSize=10) - { - $this->iFontFamily = $aFFam ; - $this->iFontStyle = $aFStyle ; - $this->iFontSize = $aFSize ; - } - - public function SetFontColor($aColor) - { - $this->iFontColor=$aColor; - } - - public function SetGridColor($aColor1, $aColor2) - { - $this->iGridColor1 = $aColor1; - $this->iGridColor2 = $aColor2; - } - - public function SetGridWeight($aGrid1=1, $aGrid2=2) - { - $this->iCircGridWeight = $aGrid1 ; - $this->iRadialGridWeight = $aGrid2 ; - } - - public function SetRadialGridStyle($aStyle) - { - $aStyle = strtolower($aStyle); - if (!in_array($aStyle, array('solid','dotted','dashed','longdashed'))) { - JpGraphError::RaiseL(22005); //("Line style for radial lines must be on of ('solid','dotted','dashed','longdashed') "); - } - $this->iRadialGridStyle=$aStyle; - } - - public function SetRanges($aRanges) - { - $this->iRanges = $aRanges; - } - - public function SetRangeStyle($aStyle) - { - $this->iRangeStyle = $aStyle; - } - - public function SetRangeColors($aLegColors) - { - $this->iLegColors = $aLegColors; - } - - public function SetRangeWeights($aWeights) - { - $n=count($aWeights); - for ($i=0; $i< $n; ++$i) { - $aWeights[$i] = floor($aWeights[$i]/2); - } - $this->iLegweights = $aWeights; - } - - public function SetType($aType) - { - if ($aType < WINDROSE_TYPE4 || $aType > WINDROSE_TYPEFREE) { - JpGraphError::RaiseL(22006); //('Illegal windrose type specified.'); - } - $this->iType = $aType; - } - - // Alias for SetPos() - public function SetCenterPos($aX, $aY) - { - $this->iX = $aX; - $this->iY = $aY; - } - - public function SetPos($aX, $aY) - { - $this->iX = $aX; - $this->iY = $aY; - } - - public function SetAntiAlias($aFlag) - { - $this->iAntiAlias = $aFlag ; - if (! $aFlag) { - $this->iCircGridWeight = 1; - } - } - - public function _ThickCircle($aImg, $aXC, $aYC, $aRad, $aWeight=2, $aColor) - { - $aImg->SetColor($aColor); - $aRad *= 2 ; - $aImg->Ellipse($aXC, $aYC, $aRad, $aRad); - if ($aWeight > 1) { - $aImg->Ellipse($aXC, $aYC, $aRad+1, $aRad+1); - $aImg->Ellipse($aXC, $aYC, $aRad+2, $aRad+2); - if ($aWeight > 2) { - $aImg->Ellipse($aXC, $aYC, $aRad+3, $aRad+3); - $aImg->Ellipse($aXC, $aYC, $aRad+3, $aRad+4); - $aImg->Ellipse($aXC, $aYC, $aRad+4, $aRad+3); - } - } - } - - public function _StrokeWindLeg($aImg, $xc, $yc, $a, $ri, $r, $weight, $color) - { - - // If less than 1 px long then we assume this has been caused by rounding problems - // and should not be stroked - if ($r < 1) { - return; - } - - $xt = $xc + cos($a)*$ri; - $yt = $yc - sin($a)*$ri; - $xxt = $xc + cos($a)*($ri+$r); - $yyt = $yc - sin($a)*($ri+$r); - - $x1 = $xt - $weight*sin($a); - $y1 = $yt - $weight*cos($a); - $x2 = $xxt - $weight*sin($a); - $y2 = $yyt - $weight*cos($a); - - $x3 = $xxt + $weight*sin($a); - $y3 = $yyt + $weight*cos($a); - $x4 = $xt + $weight*sin($a); - $y4 = $yt + $weight*cos($a); - - $pts = array($x1,$y1,$x2,$y2,$x3,$y3,$x4,$y4); - $aImg->SetColor($color); - $aImg->FilledPolygon($pts); - } - - public function _StrokeLegend($aImg, $x, $y, $scaling=1, $aReturnWidth=false) - { - if (! $this->legend->iShow) { - return 0; - } - - $nlc = count($this->iLegColors); - $nlw = count($this->iLegweights); - - // Setup font for ranges - $value = new Text(); - $value->SetAlign('center', 'bottom'); - $value->SetFont( - $this->legend->iLblFontFamily, - $this->legend->iLblFontStyle, - $this->legend->iLblFontSize*$scaling - ); - $value->SetColor($this->legend->iLblFontColor); - - // Remember x-center - $xcenter = $x ; - - // Construct format string - $fmt = $this->legend->iFormatString.'-'.$this->legend->iFormatString; - - // Make sure that the length of each range is enough to cover the - // size of the labels - $tst = sprintf($fmt, $this->iRanges[0], $this->iRanges[1]); - $value->Set($tst); - $w = $value->GetWidth($aImg); - $l = round(max($this->legend->iLength * $scaling, $w*1.5)); - - $r = $this->legend->iCircleRadius * $scaling ; - $len = 2*$r + $this->scale->iMaxNum * $l; - - // We are called just to find out the width - if ($aReturnWidth) { - return $len; - } - - $x -= round($len/2); - $x += $r; - - // 4 pixels extra vertical margin since the circle sometimes is +/- 1 pixel of the - // theorethical radius due to imperfection in the GD library - //$y -= round(max($r,$scaling*$this->iLegweights[($this->scale->iMaxNum-1) % $nlw])+4*$scaling); - $y -= ($this->legend->iCircleRadius + 2)*$scaling+$this->legend->iBottomMargin*$scaling; - - // Adjust for bottom text - if ($this->legend->iTxt != '') { - // Setup font for text - $value->Set($this->legend->iTxt); - $y -= /*$this->legend->iTxtMargin + */ $value->GetHeight($aImg); - } - - // Stroke 0-circle - $this->_ThickCircle( - $aImg, - $x, - $y, - $r, - $this->legend->iCircleWeight, - $this->legend->iCircleColor - ); - - // Remember the center of the circe - $xc=$x; - $yc=$y; - - $value->SetAlign('center', 'bottom'); - $x += $r+1; - - // Stroke all used ranges - $txty = $y - - round($this->iLegweights[($this->scale->iMaxNum-1)%$nlw]*$scaling) - 4*$scaling; - if ($this->scale->iMaxNum >= count($this->iRanges)) { - JpGraphError::RaiseL(22007); //('To few values for the range legend.'); - } - $i=0; - $idx=0; - while ($i < $this->scale->iMaxNum) { - $y1 = $y - round($this->iLegweights[$i % $nlw]*$scaling); - $y2 = $y + round($this->iLegweights[$i % $nlw]*$scaling); - $x2 = $x + $l ; - $aImg->SetColor($this->iLegColors[$i % $nlc]); - $aImg->FilledRectangle($x, $y1, $x2, $y2); - if ($this->iRangeStyle == RANGE_OVERLAPPING) { - $lbl = sprintf($fmt, $this->iRanges[$idx], $this->iRanges[$idx+1]); - } else { - $lbl = sprintf($fmt, $this->iRanges[$idx], $this->iRanges[$idx+1]); - ++$idx; - } - $value->Set($lbl); - $value->Stroke($aImg, $x+$l/2, $txty); - $x = $x2; - ++$i; - ++$idx; - } - - // Setup circle font - $value->SetFont( - $this->legend->iCircleFontFamily, - $this->legend->iCircleFontStyle, - $this->legend->iCircleFontSize*$scaling - ); - $value->SetColor($this->legend->iCircleFontColor); - - // Stroke 0-circle text - $value->Set($this->legend->iZCircleTxt); - $value->SetAlign('center', 'center'); - $value->ParagraphAlign('center'); - $value->Stroke($aImg, $xc, $yc); - - // Setup circle font - $value->SetFont( - $this->legend->iTxtFontFamily, - $this->legend->iTxtFontStyle, - $this->legend->iTxtFontSize*$scaling - ); - $value->SetColor($this->legend->iTxtFontColor); - - // Draw the text under the legend - $value->Set($this->legend->iTxt); - $value->SetAlign('center', 'top'); - $value->SetParagraphAlign('center'); - $value->Stroke($aImg, $xcenter, $y2+$this->legend->iTxtMargin*$scaling); - } - - public function SetAutoScaleAngle($aIsRegRose=true) - { - - // If the user already has manually set an angle don't - // trye to find a position - if (is_numeric($this->scale->iAngle)) { - return; - } - - if ($aIsRegRose) { - - // Create a complete data for all directions - // and translate string directions to ordinal values. - // This will much simplify the logic below - for ($i=0; $i < 16; ++$i) { - $dtxt = $this->iAllDirectionLabels[$i]; - if (!empty($this->iData[$dtxt])) { - $data[$i] = $this->iData[$dtxt]; - } elseif (!empty($this->iData[strtolower($dtxt)])) { - $data[$i] = $this->iData[strtolower($dtxt)]; - } elseif (!empty($this->iData[$i])) { - $data[$i] = $this->iData[$i]; - } else { - $data[$i] = array(); - } - } - - // Find the leg which has the lowest weighted sum of number of data around it - $c0 = array_sum($data[0]); - $c1 = array_sum($data[1]); - $found = 1; - $min = $c0+$c1*100; // Initialize to a high value - for ($i=1; $i < 15; ++$i) { - $c2 = array_sum($data[$i+1]); - - // Weight the leg we will use more to give preference - // to a short middle leg even if the 3 way sum is similair - $w = $c0 + 3*$c1 + $c2 ; - if ($w < $min) { - $min = $w; - $found = $i; - } - $c0 = $c1; - $c1 = $c2; - } - $this->scale->iAngle = $found*22.5; - } else { - $n = count($this->iData); - foreach ($this->iData as $dir => $leg) { - if (!is_numeric($dir)) { - $pos = array_search(strtoupper($dir), $this->iAllDirectionLabels); - if ($pos !== false) { - $dir = $pos*22.5; - } - } - $data[round($dir)] = $leg; - } - - // Get all the angles for the data and sort it - $keys = array_keys($data); - sort($keys, SORT_NUMERIC); - - $n = count($data); - $found = false; - $max = 0 ; - for ($i=0; $i < 15; ++$i) { - $try_a = round(22.5*$i); - - if ($try_a > $keys[$n-1]) { - break; - } - - if (in_array($try_a, $keys)) { - continue; - } - - // Find the angle just lower than this - $j=0; - while ($j < $n && $keys[$j] <= $try_a) { - ++$j; - } - if ($j == 0) { - $kj = 0; - $keys[$n-1]; - $d1 = 0; - abs($kj-$try_a); - } else { - --$j; - $kj = $keys[$j]; - $d1 = abs($kj-$try_a); - } - - // Find the angle just larger than this - $l=$n-1; - while ($l >= 0 && $keys[$l] >= $try_a) { - --$l; - } - if ($l == $n-1) { - $kl = $keys[0]; - $d2 = abs($kl-$try_a); - } else { - ++$l; - $kl = $keys[$l]; - $d2 = abs($kl-$try_a); - } - - // Weight the distance so that legs with large spread - // gets a better weight - $w = $d1 + $d2; - if ($i == 0) { - $w = round(1.4 * $w); - } - $diff = abs($d1 - $d2); - $w *= (360-$diff); - if ($w > $max) { - $found = $i; - $max = $w; - } - } - - $a = $found*22.5; - - // Some heuristics to have some preferred positions - if ($keys[$n-1] < 25) { - $a = 45; - } elseif ($keys[0] > 60) { - $a = 45; - } elseif ($keys[0] > 25 && $keys[$n-1] < 340) { - $a = 0; - } elseif ($keys[$n-1] < 75) { - $a = 90; - } elseif ($keys[$n-1] < 120) { - $a = 135; - } elseif ($keys[$n-1] < 160) { - $a = 180; - } - - $this->scale->iAngle = $a ; - } - } - - public function NormAngle($a) - { - while ($a > 360) { - $a -= 360; - } - return $a; - } - - public function SetLabelPosition($aPos) - { - $this->iLabelPositioning = $aPos ; - } - - public function _StrokeFreeRose($dblImg, $value, $scaling, $xc, $yc, $r, $ri) - { - - // Plot radial grid lines and remember the end position - // and the angle for later use when plotting the labels - if ($this->iType != WINDROSE_TYPEFREE) { - JpGraphError::RaiseL(22008); //('Internal error: Trying to plot free Windrose even though type is not a free windorose'); - } - - // Check if we should auto-position the angle for the - // labels. Basically we try to find a firection with smallest - // (or none) data. - $this->SetAutoScaleAngle(false); - - $nlc = count($this->iLegColors); - $nlw = count($this->iLegweights); - - // Stroke grid lines for directions and remember the - // position for the labels - $txtpos=array(); - $num = count($this->iData); - - $keys = array_keys($this->iData); - - foreach ($this->iData as $dir => $legdata) { - if (in_array($dir, $this->iAllDirectionLabels, true) === true) { - $a = $this->iStandardDirections[strtoupper($dir)]; - if (in_array($a*180/M_PI, $keys)) { - JpGraphError::RaiseL(22009, round($a*180/M_PI)); - //('You have specified the same direction twice, once with an angle and once with a compass direction ('.$a*180/M_PI.' degrees.)'); - } - } elseif (is_numeric($dir)) { - $this->NormAngle($dir); - - if ($this->iOrdinalEncoding == KEYENCODING_CLOCKWISE) { - $dir = 360-$dir; - } - - $a = $dir * M_PI/180; - } else { - JpGraphError::RaiseL(22010);//('Direction must either be a numeric value or one of the 16 compass directions'); - } - - $xxc = round($xc + cos($a)*$ri); - $yyc = round($yc - sin($a)*$ri); - $x = round($xc + cos($a)*$r); - $y = round($yc - sin($a)*$r); - if (empty($this->iRadialColorArray[$dir])) { - $dblImg->SetColor($this->iGridColor2); - } else { - $dblImg->SetColor($this->iRadialColorArray[$dir]); - } - if (empty($this->iRadialWeightArray[$dir])) { - $dblImg->SetLineWeight($this->iRadialGridWeight); - } else { - $dblImg->SetLineWeight($this->iRadialWeightArray[$dir]); - } - if (empty($this->iRadialStyleArray[$dir])) { - $dblImg->SetLineStyle($this->iRadialGridStyle); - } else { - $dblImg->SetLineStyle($this->iRadialStyleArray[$dir]); - } - $dblImg->StyleLine($xxc, $yyc, $x, $y); - $txtpos[] = array($x,$y,$a); - } - $dblImg->SetLineWeight(1); - - // Setup labels - $lr = $scaling * $this->iLabelMargin; - - if ($this->iLabelPositioning == LBLPOSITION_EDGE) { - $value->SetAlign('left', 'top'); - } else { - $value->SetAlign('center', 'center'); - $value->SetMargin(0); - } - - for ($i=0; $i < $num; ++$i) { - list($x, $y, $a) = $txtpos[$i]; - - // Determine the label - - $da = $a*180/M_PI; - if ($this->iOrdinalEncoding == KEYENCODING_CLOCKWISE) { - $da = 360 - $da; - } - - //$da = 360-$da; - - if (!empty($this->iLabels[$keys[$i]])) { - $lbl = $this->iLabels[$keys[$i]]; - } else { - $lbl = sprintf($this->iLabelFormatString, $da); - } - - if ($this->iLabelPositioning == LBLPOSITION_CENTER) { - $dx = $dy = 0; - } else { - // LBLPOSIITON_EDGE - if ($a>=7*M_PI/4 || $a <= M_PI/4) { - $dx=0; - } - if ($a>=M_PI/4 && $a <= 3*M_PI/4) { - $dx=($a-M_PI/4)*2/M_PI; - } - if ($a>=3*M_PI/4 && $a <= 5*M_PI/4) { - $dx=1; - } - if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { - $dx=(1-($a-M_PI*5/4)*2/M_PI); - } - - if ($a>=7*M_PI/4) { - $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; - } - if ($a<=M_PI/4) { - $dy=(0.5+$a*2/M_PI); - } - if ($a>=M_PI/4 && $a <= 3*M_PI/4) { - $dy=1; - } - if ($a>=3*M_PI/4 && $a <= 5*M_PI/4) { - $dy=(1-($a-3*M_PI/4)*2/M_PI); - } - if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { - $dy=0; - } - } - - $value->Set($lbl); - $th = $value->GetHeight($dblImg); - $tw = $value->GetWidth($dblImg); - $xt=round($lr*cos($a)+$x) - $dx*$tw; - $yt=round($y-$lr*sin($a)) - $dy*$th; - - $value->Stroke($dblImg, $xt, $yt); - } - - if (__DEBUG) { - $dblImg->SetColor('red'); - $dblImg->Circle($xc, $yc, $lr+$r); - } - - // Stroke all the legs - reset($this->iData); - $i=0; - foreach ($this->iData as $dir => $legdata) { - $legdata = array_slice($legdata, 1); - $nn = count($legdata); - - $a = $txtpos[$i][2]; - $rri = $ri/$scaling; - for ($j=0; $j < $nn; ++$j) { - // We want the non scaled original radius - $legr = $this->scale->RelTranslate($legdata[$j], $r/$scaling, $ri/$scaling) ; - $this->_StrokeWindLeg( - $dblImg, - $xc, - $yc, - $a, - $rri *$scaling, - $legr *$scaling, - $this->iLegweights[$j % $nlw] * $scaling, - $this->iLegColors[$j % $nlc] - ); - $rri += $legr; - } - ++$i; - } - } - - // Translate potential string specified compass labels to their - // corresponding index. - public function FixupIndexes($aDataArray, $num) - { - $ret = array(); - $keys = array_keys($aDataArray); - foreach ($aDataArray as $idx => $data) { - if (is_string($idx)) { - $idx = strtoupper($idx); - $res = array_search($idx, $this->iAllDirectionLabels); - if ($res === false) { - JpGraphError::RaiseL(22011, $idx); //('Windrose index must be numeric or direction label. You have specified index='.$idx); - } - $idx = $res; - if ($idx % (16 / $num) !== 0) { - JpGraphError::RaiseL(22012); //('Windrose radial axis specification contains a direction which is not enabled.'); - } - $idx /= (16/$num) ; - - if (in_array($idx, $keys, 1)) { - JpgraphError::RaiseL(22013, $idx); //('You have specified the look&feel for the same compass direction twice, once with text and once with index (Index='.$idx.')'); - } - } - if ($idx < 0 || $idx > 15) { - JpgraphError::RaiseL(22014); //('Index for copmass direction must be between 0 and 15.'); - } - $ret[$idx] = $data; - } - return $ret; - } - - public function _StrokeRegularRose($dblImg, $value, $scaling, $xc, $yc, $r, $ri) - { - // _StrokeRegularRose($dblImg,$xc,$yc,$r,$ri) - // Plot radial grid lines and remember the end position - // and the angle for later use when plotting the labels - switch ($this->iType) { - case WINDROSE_TYPE4: - $num = 4; break; - case WINDROSE_TYPE8: - $num = 8; break; - case WINDROSE_TYPE16: - $num = 16; break; - default: - JpGraphError::RaiseL(22015);//('You have specified an undefined Windrose plot type.'); - } - - // Check if we should auto-position the angle for the - // labels. Basically we try to find a firection with smallest - // (or none) data. - $this->SetAutoScaleAngle(true); - - $nlc = count($this->iLegColors); - $nlw = count($this->iLegweights); - - $this->iRadialColorArray = $this->FixupIndexes($this->iRadialColorArray, $num); - $this->iRadialWeightArray = $this->FixupIndexes($this->iRadialWeightArray, $num); - $this->iRadialStyleArray = $this->FixupIndexes($this->iRadialStyleArray, $num); - - $txtpos=array(); - $a = 2*M_PI/$num; - $dblImg->SetColor($this->iGridColor2); - $dblImg->SetLineStyle($this->iRadialGridStyle); - $dblImg->SetLineWeight($this->iRadialGridWeight); - - // Translate any name specified directions to the index - // so we can easily use it in the loop below - for ($i=0; $i < $num; ++$i) { - $xxc = round($xc + cos($a*$i)*$ri); - $yyc = round($yc - sin($a*$i)*$ri); - $x = round($xc + cos($a*$i)*$r); - $y = round($yc - sin($a*$i)*$r); - if (empty($this->iRadialColorArray[$i])) { - $dblImg->SetColor($this->iGridColor2); - } else { - $dblImg->SetColor($this->iRadialColorArray[$i]); - } - if (empty($this->iRadialWeightArray[$i])) { - $dblImg->SetLineWeight($this->iRadialGridWeight); - } else { - $dblImg->SetLineWeight($this->iRadialWeightArray[$i]); - } - if (empty($this->iRadialStyleArray[$i])) { - $dblImg->SetLineStyle($this->iRadialGridStyle); - } else { - $dblImg->SetLineStyle($this->iRadialStyleArray[$i]); - } - - $dblImg->StyleLine($xxc, $yyc, $x, $y); - $txtpos[] = array($x,$y,$a*$i); - } - $dblImg->SetLineWeight(1); - - $lr = $scaling * $this->iLabelMargin; - if ($this->iLabelPositioning == LBLPOSITION_CENTER) { - $value->SetAlign('center', 'center'); - } else { - $value->SetAlign('left', 'top'); - $value->SetMargin(0); - $lr /= 2 ; - } - - for ($i=0; $i < $num; ++$i) { - list($x, $y, $a) = $txtpos[$i]; - - // Set the position of the label - if ($this->iLabelPositioning == LBLPOSITION_CENTER) { - $dx = $dy = 0; - } else { - // LBLPOSIITON_EDGE - if ($a>=7*M_PI/4 || $a <= M_PI/4) { - $dx=0; - } - if ($a>=M_PI/4 && $a <= 3*M_PI/4) { - $dx=($a-M_PI/4)*2/M_PI; - } - if ($a>=3*M_PI/4 && $a <= 5*M_PI/4) { - $dx=1; - } - if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { - $dx=(1-($a-M_PI*5/4)*2/M_PI); - } - - if ($a>=7*M_PI/4) { - $dy=(($a-M_PI)-3*M_PI/4)*2/M_PI; - } - if ($a<=M_PI/4) { - $dy=(0.5+$a*2/M_PI); - } - if ($a>=M_PI/4 && $a <= 3*M_PI/4) { - $dy=1; - } - if ($a>=3*M_PI/4 && $a <= 5*M_PI/4) { - $dy=(1-($a-3*M_PI/4)*2/M_PI); - } - if ($a>=5*M_PI/4 && $a <= 7*M_PI/4) { - $dy=0; - } - } - - $value->Set($this->iAllDirectionLabels[$i*(16/$num)]); - $th = $value->GetHeight($dblImg); - $tw = $value->GetWidth($dblImg); - $xt=round($lr*cos($a)+$x) - $dx*$tw; - $yt=round($y-$lr*sin($a)) - $dy*$th; - - $value->Stroke($dblImg, $xt, $yt); - } - - if (__DEBUG) { - $dblImg->SetColor("red"); - $dblImg->Circle($xc, $yc, $lr+$r); - } - - // Stroke all the legs - reset($this->iData); - $keys = array_keys($this->iData); - foreach ($this->iData as $idx => $legdata) { - $legdata = array_slice($legdata, 1); - $nn = count($legdata); - if (is_string($idx)) { - $idx = strtoupper($idx); - $idx = array_search($idx, $this->iAllDirectionLabels); - if ($idx === false) { - JpGraphError::RaiseL(22016);//('Windrose leg index must be numeric or direction label.'); - } - if ($idx % (16 / $num) !== 0) { - JpGraphError::RaiseL(22017);//('Windrose data contains a direction which is not enabled. Please adjust what labels are displayed.'); - } - $idx /= (16/$num) ; - - if (in_array($idx, $keys, 1)) { - JpgraphError::RaiseL(22018, $idx);//('You have specified data for the same compass direction twice, once with text and once with index (Index='.$idx.')'); - } - } - if ($idx < 0 || $idx > 15) { - JpgraphError::RaiseL(22019);//('Index for direction must be between 0 and 15. You can\'t specify angles for a Regular Windplot, only index and compass directions.'); - } - $a = $idx * (360 / $num) ; - $a *= M_PI/180.0; - $rri = $ri/$scaling; - for ($j=0; $j < $nn; ++$j) { - // We want the non scaled original radius - $legr = $this->scale->RelTranslate($legdata[$j], $r/$scaling, $ri/$scaling) ; - $this->_StrokeWindLeg( - $dblImg, - $xc, - $yc, - $a, - $rri *$scaling, - $legr *$scaling, - $this->iLegweights[$j % $nlw] * $scaling, - $this->iLegColors[$j % $nlc] - ); - $rri += $legr; - } - } - } - - - public function getWidth($aImg) - { - $scaling = 1;//$this->iAntiAlias ? 2 : 1 ; - if ($this->iSize > 0 && $this->iSize < 1) { - $this->iSize *= min($aImg->width, $aImg->height); - } - - - $value = new Text(); - $value->SetFont($this->iFontFamily, $this->iFontStyle, $this->iFontSize*$scaling); - $value->SetColor($this->iFontColor); - // Setup extra size around the graph needed so that the labels - // doesn't get cut. For this we need to find the largest label. - // The code below gives a possible a little to large margin. The - // really, really proper way would be to account for what angle - // the label are at - $n = count($this->iLabels); - if ($n > 0) { - $maxh=0; - $maxw=0; - foreach ($this->iLabels as $key => $lbl) { - $value->Set($lbl); - $maxw = max($maxw, $value->GetWidth($aImg)); - } - } else { - $value->Set('888.888'); // Dummy value to get width/height - $maxw = $value->GetWidth($aImg); - } - // Add an extra margin of 50% the font size - $maxw += round($this->iFontSize*$scaling * 0.4) ; - - $valxmarg = 1.5*$maxw+2*$this->iLabelMargin*$scaling; - $w = round($this->iSize*$scaling + $valxmarg); - - // Make sure that the width of the legend fits - $legendwidth = $this->_StrokeLegend($aImg, 0, 0, $scaling, true)+10*$scaling; - $w = max($w, $legendwidth); - - return $w; - } - - public function getHeight($aImg) - { - $scaling = 1;//$this->iAntiAlias ? 2 : 1 ; - if ($this->iSize > 0 && $this->iSize < 1) { - $this->iSize *= min($aImg->width, $aImg->height); - } - - $value = new Text(); - $value->SetFont($this->iFontFamily, $this->iFontStyle, $this->iFontSize*$scaling); - $value->SetColor($this->iFontColor); - // Setup extra size around the graph needed so that the labels - // doesn't get cut. For this we need to find the largest label. - // The code below gives a possible a little to large margin. The - // really, really proper way would be to account for what angle - // the label are at - $n = count($this->iLabels); - if ($n > 0) { - $maxh=0; - $maxw=0; - foreach ($this->iLabels as $key => $lbl) { - $value->Set($lbl); - $maxh = max($maxh, $value->GetHeight($aImg)); - } - } else { - $value->Set('180.8'); // Dummy value to get width/height - $maxh = $value->GetHeight($aImg); - } - // Add an extra margin of 50% the font size - //$maxh += round($this->iFontSize*$scaling * 0.5) ; - $valymarg = 2*$maxh+2*$this->iLabelMargin*$scaling; - - $legendheight = round($this->legend->iShow ? 1 : 0); - $legendheight *= max($this->legend->iCircleRadius*2, $this->legend->iTxtFontSize*2)+ - $this->legend->iMargin + $this->legend->iBottomMargin + 2; - $legendheight *= $scaling; - $h = round($this->iSize*$scaling + $valymarg) + $legendheight ; - - return $h; - } - - public function Stroke($aGraph) - { - $aImg = $aGraph->img; - - if ($this->iX > 0 && $this->iX < 1) { - $this->iX = round($aImg->width * $this->iX) ; - } - - if ($this->iY > 0 && $this->iY < 1) { - $this->iY = round($aImg->height * $this->iY) ; - } - - if ($this->iSize > 0 && $this->iSize < 1) { - $this->iSize *= min($aImg->width, $aImg->height); - } - - if ($this->iCenterSize > 0 && $this->iCenterSize < 1) { - $this->iCenterSize *= $this->iSize; - } - - $this->scale->AutoScale(($this->iSize - $this->iCenterSize)/2, round(2.5*$this->scale->iFontSize)); - - $scaling = $this->iAntiAlias ? 2 : 1 ; - - $value = new Text(); - $value->SetFont($this->iFontFamily, $this->iFontStyle, $this->iFontSize*$scaling); - $value->SetColor($this->iFontColor); - - $legendheight = round($this->legend->iShow ? 1 : 0); - $legendheight *= max($this->legend->iCircleRadius*2, $this->legend->iTxtFontSize*2)+ - $this->legend->iMargin + $this->legend->iBottomMargin + 2; - $legendheight *= $scaling; - - $w = $scaling*$this->getWidth($aImg); - $h = $scaling*$this->getHeight($aImg); - - // Copy back the double buffered image to the proper canvas - $ww = $w / $scaling ; - $hh = $h / $scaling ; - - // Create the double buffer - if ($this->iAntiAlias) { - $dblImg = new RotImage($w, $h); - // Set the background color - $dblImg->SetColor($this->iColor); - $dblImg->FilledRectangle(0, 0, $w, $h); - } else { - $dblImg = $aImg ; - // Make sure the ix and it coordinates correpond to the new top left center - $dblImg->SetTranslation($this->iX-$w/2, $this->iY-$h/2); - } - - if (__DEBUG) { - $dblImg->SetColor('red'); - $dblImg->Rectangle(0, 0, $w-1, $h-1); - } - - $dblImg->SetColor('black'); - - if ($this->iShowBox) { - $dblImg->SetColor($this->iBoxColor); - $old = $dblImg->SetLineWeight($this->iBoxWeight); - $dblImg->SetLineStyle($this->iBoxStyle); - $dblImg->Rectangle(0, 0, $w-1, $h-1); - $dblImg->SetLineWeight($old); - } - - $xc = round($w/2); - $yc = round(($h-$legendheight)/2); - - if (__DEBUG) { - $dblImg->SetColor('red'); - $old = $dblImg->SetLineWeight(2); - $dblImg->Line($xc-5, $yc-5, $xc+5, $yc+5); - $dblImg->Line($xc+5, $yc-5, $xc-5, $yc+5); - $dblImg->SetLineWeight($old); - } - - $this->iSize *= $scaling; - - // Inner circle size - $ri = $this->iCenterSize/2 ; - - // Full circle radius - $r = round($this->iSize/2); - - // Get number of grid circles - $n = $this->scale->GetNumCirc(); - - // Plot circle grids - $ri *= $scaling ; - $rr = round(($r-$ri)/$n); - for ($i = 1; $i <= $n; ++$i) { - $this->_ThickCircle( - $dblImg, - $xc, - $yc, - $rr*$i+$ri, - $this->iCircGridWeight, - $this->iGridColor1 - ); - } - - $num = 0 ; - - if ($this->iType == WINDROSE_TYPEFREE) { - $this->_StrokeFreeRose($dblImg, $value, $scaling, $xc, $yc, $r, $ri); - } else { - // Check if we need to re-code the interpretation of the ordinal - // number in the data. Internally ordinal value 0 is East and then - // counted anti-clockwise. The user might choose an encoding - // that have 0 being the first axis to the right of the "N" axis and then - // counted clock-wise - if ($this->iOrdinalEncoding == KEYENCODING_CLOCKWISE) { - if ($this->iType == WINDROSE_TYPE16) { - $const1 = 19; - $const2 = 16; - } elseif ($this->iType == WINDROSE_TYPE8) { - $const1 = 9; - $const2 = 8; - } else { - $const1 = 4; - $const2 = 4; - } - $tmp = array(); - $n=count($this->iData); - foreach ($this->iData as $key => $val) { - if (is_numeric($key)) { - $key = ($const1 - $key) % $const2 ; - } - $tmp[$key] = $val; - } - $this->iData = $tmp; - } - $this->_StrokeRegularRose($dblImg, $value, $scaling, $xc, $yc, $r, $ri); - } - - // Stroke the labels - $this->scale->iFontSize *= $scaling; - $this->scale->iZFontSize *= $scaling; - $this->scale->StrokeLabels($dblImg, $xc, $yc, $ri, $rr); - - // Stroke the inner circle again since the legs - // might have written over it - $this->_ThickCircle($dblImg, $xc, $yc, $ri, $this->iCircGridWeight, $this->iGridColor1); - - if ($ww > $aImg->width) { - JpgraphError::RaiseL(22020); - //('Windrose plot is too large to fit the specified Graph size. Please use WindrosePlot::SetSize() to make the plot smaller or increase the size of the Graph in the initial WindroseGraph() call.'); - } - - $x = $xc; - $y = $h; - $this->_StrokeLegend($dblImg, $x, $y, $scaling); - - if ($this->iAntiAlias) { - $aImg->Copy($dblImg->img, $this->iX-$ww/2, $this->iY-$hh/2, 0, 0, $ww, $hh, $w, $h); - } - - // We need to restore the translation matrix - $aImg->SetTranslation(0, 0); - } -} - -//============================================================ -// CLASS WindroseGraph -//============================================================ -class WindroseGraph extends Graph -{ - private $posx; - private $posy; - public $plots=array(); - - public function __construct($width=300, $height=200, $cachedName="", $timeout=0, $inline=1) - { - parent::__construct($width, $height, $cachedName, $timeout, $inline); - $this->posx=$width/2; - $this->posy=$height/2; - $this->SetColor('white'); - $this->title->SetFont(FF_VERDANA, FS_NORMAL, 12); - $this->title->SetMargin(8); - $this->subtitle->SetFont(FF_VERDANA, FS_NORMAL, 10); - $this->subtitle->SetMargin(0); - $this->subsubtitle->SetFont(FF_VERDANA, FS_NORMAL, 8); - $this->subsubtitle->SetMargin(0); - } - - public function StrokeTexts() - { - if ($this->texts != null) { - $n = count($this->texts); - for ($i=0; $i < $n; ++$i) { - $this->texts[$i]->Stroke($this->img); - } - } - } - - public function StrokeIcons() - { - if ($this->iIcons != null) { - $n = count($this->iIcons); - for ($i=0; $i < $n; ++$i) { - // Since Windrose graphs doesn't have any linear scale the position of - // each icon has to be given as absolute coordinates - $this->iIcons[$i]->_Stroke($this->img); - } - } - } - - //--------------- - // PUBLIC METHODS - public function Add($aObj) - { - if (is_array($aObj) && count($aObj) > 0) { - $cl = $aObj[0]; - } else { - $cl = $aObj; - } - if ($cl instanceof Text) { - $this->AddText($aObj); - } elseif ($cl instanceof IconPlot) { - $this->AddIcon($aObj); - } elseif (($cl instanceof WindrosePlot) || ($cl instanceof LayoutRect) || ($cl instanceof LayoutHor)) { - $this->plots[] = $aObj; - } else { - JpgraphError::RaiseL(22021); - } - } - - public function AddText($aTxt, $aToY2=false) - { - parent::AddText($aTxt); - } - - public function SetColor($c) - { - $this->SetMarginColor($c); - } - - // Method description - public function Stroke($aStrokeFileName="") - { - - // If the filename is the predefined value = '_csim_special_' - // we assume that the call to stroke only needs to do enough - // to correctly generate the CSIM maps. - // We use this variable to skip things we don't strictly need - // to do to generate the image map to improve performance - // as best we can. Therefore you will see a lot of tests !$_csim in the - // code below. - $_csim = ($aStrokeFileName===_CSIM_SPECIALFILE); - - // We need to know if we have stroked the plot in the - // GetCSIMareas. Otherwise the CSIM hasn't been generated - // and in the case of GetCSIM called before stroke to generate - // CSIM without storing an image to disk GetCSIM must call Stroke. - $this->iHasStroked = true; - - if ($this->background_image != "" || $this->background_cflag != "") { - $this->StrokeFrameBackground(); - } else { - $this->StrokeFrame(); - } - - // n holds number of plots - $n = count($this->plots); - for ($i=0; $i < $n ; ++$i) { - $this->plots[$i]->Stroke($this); - } - - $this->footer->Stroke($this->img); - $this->StrokeIcons(); - $this->StrokeTexts(); - $this->StrokeTitles(); - - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if ($aStrokeFileName == _IMG_HANDLER) { - return $this->img->img; - } else { - // Finally stream the generated picture - $this->cache->PutAndStream( - $this->img, - $this->cache_name, - $this->inline, - $aStrokeFileName - ); - } - } -} // Class diff --git a/onyx2/include/jpgraph/lang/de.inc.php b/onyx2/include/jpgraph/lang/de.inc.php index 3edd483..35a2274 100644 --- a/onyx2/include/jpgraph/lang/de.inc.php +++ b/onyx2/include/jpgraph/lang/de.inc.php @@ -1,11 +1,10 @@ array('
JpGraph Fehler: -HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zeile %d.
Erklärung:
HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert würden und daher nur Mist dargestellt würde).

Wahrscheinlich steht Text im Skript bevor Graph::Stroke() aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden.

Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor Graph::Stroke() zu lassen."<?php".

',2), +HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zeile %d.Erklrung:
HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert wrden und daher nur Mist dargestellt wrde).

Wahrscheinlich steht Text im Skript bevor Graph::Stroke() aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrchen, die eventuell bereits zum Browser gesendet wurden.

Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor Graph::Stroke() zu lassen."<?php".',2), /* ** Setup Fehler */ -11 => array('Es wurde kein Pfad für CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0), -12 => array('Es wurde kein Pfad für TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0), +11 => array('Es wurde kein Pfad fr CACHE_DIR angegeben. Bitte gib einen Pfad CACHE_DIR in der Datei jpg-config.inc an.',0), +12 => array('Es wurde kein Pfad fr TTF_DIR angegeben und der Pfad kann nicht automatisch ermittelt werden. Bitte gib den Pfad in der Datei jpg-config.inc an.',0), 13 => array('The installed PHP version (%s) is not compatible with this release of the library. The library requires at least PHP version %s',2), /* @@ -34,25 +33,24 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 2001 => array('Die Anzahl der Farben ist nicht gleich der Anzahl der Vorlagen in BarPlot::SetPattern().',0), 2002 => array('Unbekannte Vorlage im Aufruf von BarPlot::SetPattern().',0), 2003 => array('Anzahl der X- und Y-Koordinaten sind nicht identisch. Anzahl der X-Koordinaten: %d; Anzahl der Y-Koordinaten: %d.',2), -2004 => array('Alle Werte für ein Balkendiagramm (barplot) müssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2), -2005 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), -2006 => array('Unbekannte Position für die Werte der Balken: %s.',1), +2004 => array('Alle Werte fr ein Balkendiagramm (barplot) mssen numerisch sein. Du hast den Wert nr [%d] == %s angegeben.',2), +2005 => array('Du hast einen leeren Vektor fr die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2006 => array('Unbekannte Position fr die Werte der Balken: %s.',1), 2007 => array('Kann GroupBarPlot nicht aus einem leeren Vektor erzeugen.',0), 2008 => array('GroupBarPlot Element nbr %d wurde nicht definiert oder ist leer.',0), 2009 => array('Eins der Objekte, das an GroupBar weitergegeben wurde ist kein Balkendiagramm (BarPlot). Versichere Dich, dass Du den GroupBarPlot aus einem Vektor von Balkendiagrammen (barplot) oder AccBarPlot-Objekten erzeugst. (Class = %s)',1), 2010 => array('Kann AccBarPlot nicht aus einem leeren Vektor erzeugen.',0), 2011 => array('AccBarPlot-Element nbr %d wurde nicht definiert oder ist leer.',1), 2012 => array('Eins der Objekte, das an AccBar weitergegeben wurde ist kein Balkendiagramm (barplot). Versichere Dich, dass Du den AccBar-Plot aus einem Vektor von Balkendiagrammen (barplot) erzeugst. (Class=%s)',1), -2013 => array('Du hast einen leeren Vektor für die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), +2013 => array('Du hast einen leeren Vektor fr die Schattierungsfarben im Balkendiagramm (barplot) angegeben.',0), 2014 => array('Die Anzahl der Datenpunkte jeder Datenreihe in AccBarPlot muss gleich sein.',0), -2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0), /* ** jpgraph_date */ -3001 => array('Es ist nur möglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0), +3001 => array('Es ist nur mglich, entweder SetDateAlign() oder SetTimeAlign() zu benutzen, nicht beides!',0), /* ** jpgraph_error @@ -64,9 +62,9 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_flags */ -5001 => array('Unbekannte Flaggen-Größe (%d).',1), +5001 => array('Unbekannte Flaggen-Gre (%d).',1), 5002 => array('Der Flaggen-Index %s existiert nicht.',1), -5003 => array('Es wurde eine ungültige Ordnungszahl (%d) für den Flaggen-Index angegeben.',1), +5003 => array('Es wurde eine ungltige Ordnungszahl (%d) fr den Flaggen-Index angegeben.',1), 5004 => array('Der Landesname %s hat kein korrespondierendes Flaggenbild. Die Flagge mag existieren, abr eventuell unter einem anderen Namen, z.B. versuche "united states" statt "usa".',1), @@ -74,36 +72,35 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_gantt */ -6001 => array('Interner Fehler. Die Höhe für ActivityTitles ist < 0.',0), -6002 => array('Es dürfen keine negativen Werte für die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0), -6003 => array('Ungültiges Format für den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1), -6004 => array('Ungültiges Format für den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1), +6001 => array('Interner Fehler. Die Hhe fr ActivityTitles ist < 0.',0), +6002 => array('Es drfen keine negativen Werte fr die Gantt-Diagramm-Dimensionen angegeben werden. Verwende 0, wenn die Dimensionen automatisch ermittelt werden sollen.',0), +6003 => array('Ungltiges Format fr den Bedingungs-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei index 0 starten und Vektoren in der Form (Row,Constrain-To,Constrain-Type) enthalten.',1), +6004 => array('Ungltiges Format fr den Fortschritts-Parameter bei Index=%d in CreateSimple(). Der Parameter muss bei Index 0 starten und Vektoren in der Form (Row,Progress) enthalten.',1), 6005 => array('SetScale() ist nicht sinnvoll bei Gantt-Diagrammen.',0), -6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitäten mit Termin. [GetBarMinMax() start >= n]',0), -6007 => array('Plausibiltätsprüfung für die automatische Gantt-Diagramm-Größe schlug fehl. Entweder die Breite (=%d) oder die Höhe (=%d) ist größer als MAX_GANTTIMG_SIZE. Dies kann möglicherweise durch einen falschen Wert bei einer Aktivität hervorgerufen worden sein.',2), -6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivität hat.',2), +6006 => array('Das Gantt-Diagramm kann nicht automatisch skaliert werden. Es existieren keine Aktivitten mit Termin. [GetBarMinMax() start >= n]',0), +6007 => array('Plausibilttsprfung fr die automatische Gantt-Diagramm-Gre schlug fehl. Entweder die Breite (=%d) oder die Hhe (=%d) ist grer als MAX_GANTTIMG_SIZE. Dies kann mglicherweise durch einen falschen Wert bei einer Aktivitt hervorgerufen worden sein.',2), +6008 => array('Du hast eine Bedingung angegeben von Reihe=%d bis Reihe=%d, die keine Aktivitt hat.',2), 6009 => array('Unbekannter Bedingungstyp von Reihe=%d bis Reihe=%d',2), -6010 => array('Ungültiger Icon-Index für das eingebaute Gantt-Icon [%d]',1), -6011 => array('Argument für IconImage muss entweder ein String oder ein Integer sein.',0), +6010 => array('Ungltiger Icon-Index fr das eingebaute Gantt-Icon [%d]',1), +6011 => array('Argument fr IconImage muss entweder ein String oder ein Integer sein.',0), 6012 => array('Unbekannter Typ bei der Gantt-Objekt-Title-Definition.',0), -6015 => array('Ungültige vertikale Position %d',1), -6016 => array('Der eingegebene Datums-String (%s) für eine Gantt-Aktivität kann nicht interpretiert werden. Versichere Dich, dass es ein gültiger Datumsstring ist, z.B. 2005-04-23 13:30',1), +6015 => array('Ungltige vertikale Position %d',1), +6016 => array('Der eingegebene Datums-String (%s) fr eine Gantt-Aktivitt kann nicht interpretiert werden. Versichere Dich, dass es ein gltiger Datumsstring ist, z.B. 2005-04-23 13:30',1), 6017 => array('Unbekannter Datumstyp in GanttScale (%s).',1), -6018 => array('Intervall für Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1), -6019 => array('Die vorhandene Breite (%d) für die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Größenermittlung oder vergrößere die Breite des Diagramms.',1), -6020 => array('Das Intervall für die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1), -6021 => array('Unbekanntes Format für die Woche.',0), +6018 => array('Intervall fr Minuten muss ein gerader Teiler einer Stunde sein, z.B. 1,5,10,12,15,20,30, etc. Du hast ein Intervall von %d Minuten angegeben.',1), +6019 => array('Die vorhandene Breite (%d) fr die Minuten ist zu klein, um angezeigt zu werden. Bitte benutze die automatische Grenermittlung oder vergrere die Breite des Diagramms.',1), +6020 => array('Das Intervall fr die Stunden muss ein gerader Teiler eines Tages sein, z.B. 0:30, 1:00, 1:30, 4:00, etc. Du hast ein Intervall von %d eingegeben.',1), +6021 => array('Unbekanntes Format fr die Woche.',0), 6022 => array('Die Gantt-Skala wurde nicht eingegeben.',0), 6023 => array('Wenn Du sowohl Stunden als auch Minuten anzeigen lassen willst, muss das Stunden-Interval gleich 1 sein (anderenfalls ist es nicht sinnvoll, Minuten anzeigen zu lassen).',0), 6024 => array('Das CSIM-Ziel muss als String angegeben werden. Der Start des Ziels ist: %d',1), 6025 => array('Der CSIM-Alt-Text muss als String angegeben werden. Der Beginn des Alt-Textes ist: %d',1), 6027 => array('Der Fortschrittswert muss im Bereich [0, 1] liegen.',0), -6028 => array('Die eingegebene Höhe (%d) für GanttBar ist nicht im zulässigen Bereich.',1), -6029 => array('Der Offset für die vertikale Linie muss im Bereich [0,1] sein.',0), -6030 => array('Unbekannte Pfeilrichtung für eine Verbindung.',0), -6031 => array('Unbekannter Pfeiltyp für eine Verbindung.',0), -6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) für eine Verbindung.',1), -6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0), +6028 => array('Die eingegebene Hhe (%d) fr GanttBar ist nicht im zulssigen Bereich.',1), +6029 => array('Der Offset fr die vertikale Linie muss im Bereich [0,1] sein.',0), +6030 => array('Unbekannte Pfeilrichtung fr eine Verbindung.',0), +6031 => array('Unbekannter Pfeiltyp fr eine Verbindung.',0), +6032 => array('Interner Fehler: Unbekannter Pfadtyp (=%d) fr eine Verbindung.',1), /* ** jpgraph_gradient @@ -115,108 +112,107 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_iconplot */ -8001 => array('Der Mix-Wert für das Icon muss zwischen 0 und 100 sein.',0), -8002 => array('Die Ankerposition für Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0), -8003 => array('Es ist nicht möglich, gleichzeitig ein Bild und eine Landesflagge für dasselbe Icon zu definieren',0), -8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufügen (per include).',0), +8001 => array('Der Mix-Wert fr das Icon muss zwischen 0 und 100 sein.',0), +8002 => array('Die Ankerposition fr Icons muss entweder "top", "bottom", "left", "right" oder "center" sein.',0), +8003 => array('Es ist nicht mglich, gleichzeitig ein Bild und eine Landesflagge fr dasselbe Icon zu definieren',0), +8004 => array('Wenn Du Landesflaggen benutzen willst, musst Du die Datei "jpgraph_flags.php" hinzufgen (per include).',0), /* ** jpgraph_imgtrans */ -9001 => array('Der Wert für die Bildtransformation ist außerhalb des zulässigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0), +9001 => array('Der Wert fr die Bildtransformation ist auerhalb des zulssigen Bereichs. Der verschwindende Punkt am Horizont muss als Wert zwischen 0 und 1 angegeben werden.',0), /* ** jpgraph_lineplot */ 10001 => array('Die Methode LinePlot::SetFilled() sollte nicht mehr benutzt werden. Benutze lieber SetFillColor()',0), -10002 => array('Der Plot ist zu kompliziert für FastLineStroke. Benutze lieber den StandardStroke()',0), +10002 => array('Der Plot ist zu kompliziert fr FastLineStroke. Benutze lieber den StandardStroke()',0), 10003 => array('Each plot in an accumulated lineplot must have the same number of data points.',0), /* ** jpgraph_log */ 11001 => array('Deine Daten enthalten nicht-numerische Werte.',0), -11002 => array('Negative Werte können nicht für logarithmische Achsen verwendet werden.',0), +11002 => array('Negative Werte knnen nicht fr logarithmische Achsen verwendet werden.',0), 11003 => array('Deine Daten enthalten nicht-numerische Werte.',0), -11004 => array('Skalierungsfehler für die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der größte Wert muss größer sein als Null. Es ist mathematisch nicht möglich, einen Wert gleich Null in der Skala zu haben.',0), -11005 => array('Das Tick-Intervall für die logarithmische Achse ist nicht definiert. Lösche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0), +11004 => array('Skalierungsfehler fr die logarithmische Achse. Es gibt ein Problem mit den Daten der Achse. Der grte Wert muss grer sein als Null. Es ist mathematisch nicht mglich, einen Wert gleich Null in der Skala zu haben.',0), +11005 => array('Das Tick-Intervall fr die logarithmische Achse ist nicht definiert. Lsche jeden Aufruf von SetTextLabelStart() oder SetTextTickInterval() bei der logarithmischen Achse.',0), /* ** jpgraph_mgraph */ -12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0), -12002 => array('Ungültiger Dateiname für MGraph::SetBackgroundImage() : %s. Die Datei muss eine gültige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1), -12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() für Dateiname: %s',2), -12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), +12001 => array("Du benutzt GD 2.x und versuchst ein Nicht-Truecolor-Bild als Hintergrundbild zu benutzen. Um Hintergrundbilder mit GD 2.x zu benutzen, ist es notwendig Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualitt der Truetype-Schriften sehr schlecht, wenn man Truetype-Schriften mit Truecolor-Bildern verwendet.",0), +12002 => array('Ungltiger Dateiname fr MGraph::SetBackgroundImage() : %s. Die Datei muss eine gltige Dateierweiterung haben (jpg,gif,png), wenn die automatische Typerkennung verwendet wird.',1), +12003 => array('Unbekannte Dateierweiterung (%s) in MGraph::SetBackgroundImage() fr Dateiname: %s',2), +12004 => array('Das Bildformat des Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht untersttzt. ',1), 12005 => array('Das Hintergrundbild kann nicht gelesen werden: %s',1), -12006 => array('Es wurden ungültige Größen für Breite oder Höhe beim Erstellen des Bildes angegeben, (Breite=%d, Höhe=%d)',2), -12007 => array('Das Argument für MGraph::Add() ist nicht gültig für GD.',0), -12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu unterstützen.',0), -12009 => array('Deine PHP-Installation unterstützt das gewählte Bildformat nicht: %s',1), -12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. Überprüfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1), -12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), -12012 => array('Es konnte kein Bild erzeugt werden. Überprüfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), +12006 => array('Es wurden ungltige Gren fr Breite oder Hhe beim Erstellen des Bildes angegeben, (Breite=%d, Hhe=%d)',2), +12007 => array('Das Argument fr MGraph::Add() ist nicht gltig fr GD.',0), +12008 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Bildformate zu untersttzen.',0), +12009 => array('Deine PHP-Installation untersttzt das gewhlte Bildformat nicht: %s',1), +12010 => array('Es konnte kein Bild als Datei %s erzeugt werden. berprfe, ob Du die entsprechenden Schreibrechte im aktuellen Verzeichnis hast.',1), +12011 => array('Es konnte kein Truecolor-Bild erzeugt werden. berprfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), +12012 => array('Es konnte kein Bild erzeugt werden. berprfe, ob Du wirklich die GD2-Bibliothek installiert hast.',0), /* ** jpgraph_pie3d */ -14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstücke zu kontrollieren.',0), +14001 => array('Pie3D::ShowBorder(). Missbilligte Funktion. Benutze Pie3D::SetEdge(), um die Ecken der Tortenstcke zu kontrollieren.',0), 14002 => array('PiePlot3D::SetAngle() 3D-Torten-Projektionswinkel muss zwischen 5 und 85 Grad sein.',0), 14003 => array('Interne Festlegung schlug fehl. Pie3D::Pie3DSlice',0), -14004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), -14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhüllen bei der Suche nach dem Startindex.',0,), -14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus für 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhüllen beim Erstellen des Bildes.',0), -14007 => array('Die Breite für das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0), +14004 => array('Tortenstck-Startwinkel muss zwischen 0 und 360 Grad sein.',0), +14005 => array('Pie3D Interner Fehler: Versuch, zweimal zu umhllen bei der Suche nach dem Startindex.',0,), +14006 => array('Pie3D Interner Fehler: Z-Sortier-Algorithmus fr 3D-Tortendiagramme funktioniert nicht einwandfrei (2). Versuch, zweimal zu umhllen beim Erstellen des Bildes.',0), +14007 => array('Die Breite fr das 3D-Tortendiagramm ist 0. Gib eine Breite > 0 an.',0), /* ** jpgraph_pie */ 15001 => array('PiePLot::SetTheme() Unbekannter Stil: %s',1), -15002 => array('Argument für PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0), -15003 => array('Argument für PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0), -15004 => array('Tortenstück-Startwinkel muss zwischen 0 und 360 Grad sein.',0), +15002 => array('Argument fr PiePlot::ExplodeSlice() muss ein Integer-Wert sein',0), +15003 => array('Argument fr PiePlot::Explode() muss ein Vektor mit Integer-Werten sein.',0), +15004 => array('Tortenstck-Startwinkel muss zwischen 0 und 360 Grad sein.',0), 15005 => array('PiePlot::SetFont() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetFont().',0), -15006 => array('PiePlot::SetSize() Radius für Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgröße oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0), +15006 => array('PiePlot::SetSize() Radius fr Tortendiagramm muss entweder als Bruch [0, 0.5] der Bildgre oder als Absoluwert in Pixel im Bereich [10, 1000] angegeben werden.',0), 15007 => array('PiePlot::SetFontColor() sollte nicht mehr verwendet werden. Benutze stattdessen PiePlot->value->SetColor()..',0), -15008 => array('PiePlot::SetLabelType() der Typ für Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1), -15009 => array('Ungültiges Tortendiagramm. Die Summe aller Daten ist Null.',0), +15008 => array('PiePlot::SetLabelType() der Typ fr Tortendiagramme muss entweder 0 or 1 sein (nicht %d).',1), +15009 => array('Ungltiges Tortendiagramm. Die Summe aller Daten ist Null.',0), 15010 => array('Die Summe aller Daten ist Null.',0), -15011 => array('Um Bildtransformationen benutzen zu können, muss die Datei jpgraph_imgtrans.php eingefügt werden (per include).',0), // @todo translate into German -15012 => array('PiePlot::SetTheme() is no longer recommended. Use PieGraph::SetTheme()',0), +15011 => array('Um Bildtransformationen benutzen zu knnen, muss die Datei jpgraph_imgtrans.php eingefgt werden (per include).',0), /* ** jpgraph_plotband */ -16001 => array('Die Dichte für das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1), -16002 => array('Es wurde keine Position für das Pattern angegeben.',0), +16001 => array('Die Dichte fr das Pattern muss zwischen 1 und 100 sein. (Du hast %f eingegeben)',1), +16002 => array('Es wurde keine Position fr das Pattern angegeben.',0), 16003 => array('Unbekannte Pattern-Definition (%d)',0), -16004 => array('Der Mindeswert für das PlotBand ist größer als der Maximalwert. Bitte korrigiere dies!',0), +16004 => array('Der Mindeswert fr das PlotBand ist grer als der Maximalwert. Bitte korrigiere dies!',0), /* ** jpgraph_polar */ -17001 => array('PolarPlots müssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0), -17002 => array('Unbekannte Ausrichtung für X-Achsen-Titel. (%s)',1), -//17003 => array('Set90AndMargin() wird für PolarGraph nicht unterstützt.',0), -17004 => array('Unbekannter Achsentyp für PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0), +17001 => array('PolarPlots mssen eine gerade Anzahl von Datenpunkten haben. Jeder Datenpunkt ist ein Tupel (Winkel, Radius).',0), +17002 => array('Unbekannte Ausrichtung fr X-Achsen-Titel. (%s)',1), +//17003 => array('Set90AndMargin() wird fr PolarGraph nicht untersttzt.',0), +17004 => array('Unbekannter Achsentyp fr PolarGraph. Er muss entweder \'lin\' oder \'log\' sein.',0), /* ** jpgraph_radar */ -18001 => array('ClientSideImageMaps werden für RadarPlots nicht unterstützt.',0), +18001 => array('ClientSideImageMaps werden fr RadarPlots nicht untersttzt.',0), 18002 => array('RadarGraph::SupressTickMarks() sollte nicht mehr verwendet werden. Benutze stattdessen HideTickMarks().',0), -18003 => array('Ungültiger Achsentyp für RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1), -18004 => array('Die RadarPlot-Größe muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1), -18005 => array('RadarPlot: nicht unterstützte Tick-Dichte: %d',1), +18003 => array('Ungltiger Achsentyp fr RadarPlot (%s). Er muss entweder \'lin\' oder \'log\' sein.',1), +18004 => array('Die RadarPlot-Gre muss zwischen 0.1 und 1 sein. (Dein Wert=%f)',1), +18005 => array('RadarPlot: nicht untersttzte Tick-Dichte: %d',1), 18006 => array('Minimum Daten %f (RadarPlots sollten nur verwendet werden, wenn alle Datenpunkte einen Wert > 0 haben).',1), 18007 => array('Die Anzahl der Titel entspricht nicht der Anzahl der Datenpunkte.',0), 18008 => array('Jeder RadarPlot muss die gleiche Anzahl von Datenpunkten haben.',0), @@ -226,29 +222,29 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei */ 19001 => array('Spline: Anzahl der X- und Y-Koordinaten muss gleich sein.',0), -19002 => array('Ungültige Dateneingabe für Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0), +19002 => array('Ungltige Dateneingabe fr Spline. Zwei oder mehr aufeinanderfolgende X-Werte sind identisch. Jeder eigegebene X-Wert muss unterschiedlich sein, weil vom mathematischen Standpunkt ein Eins-zu-Eins-Mapping vorliegen muss, d.h. jeder X-Wert korrespondiert mit exakt einem Y-Wert.',0), 19003 => array('Bezier: Anzahl der X- und Y-Koordinaten muss gleich sein.',0), /* ** jpgraph_scatter */ -20001 => array('Fieldplots müssen die gleiche Anzahl von X und Y Datenpunkten haben.',0), -20002 => array('Bei Fieldplots muss ein Winkel für jeden X und Y Datenpunkt angegeben werden.',0), -20003 => array('Scatterplots müssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0), +20001 => array('Fieldplots mssen die gleiche Anzahl von X und Y Datenpunkten haben.',0), +20002 => array('Bei Fieldplots muss ein Winkel fr jeden X und Y Datenpunkt angegeben werden.',0), +20003 => array('Scatterplots mssen die gleiche Anzahl von X- und Y-Datenpunkten haben.',0), /* ** jpgraph_stock */ -21001 => array('Die Anzahl der Datenwerte für Stock-Charts müssen ein Mehrfaches von %d Datenpunkten sein.',1), +21001 => array('Die Anzahl der Datenwerte fr Stock-Charts mssen ein Mehrfaches von %d Datenpunkten sein.',1), /* ** jpgraph_plotmark */ 23001 => array('Der Marker "%s" existiert nicht in der Farbe: %d',2), -23002 => array('Der Farb-Index ist zu hoch für den Marker "%s"',1), +23002 => array('Der Farb-Index ist zu hoch fr den Marker "%s"',1), 23003 => array('Ein Dateiname muss angegeben werden, wenn Du den Marker-Typ auf MARK_IMG setzt.',0), /* @@ -258,69 +254,69 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 24001 => array('FuncGenerator : Keine Funktion definiert. ',0), 24002 => array('FuncGenerator : Syntax-Fehler in der Funktionsdefinition ',0), 24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0), -24004 => array('ReadCSV2: Die anzahl der spalten fehler in %s reihe %d',2), + /* ** jpgraph */ -25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Unterstützung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0), -25002 => array('Diese PHP-Installation scheint nicht die benötigte GD-Bibliothek zu unterstützen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0), +25001 => array('Diese PHP-Installation ist nicht mit der GD-Bibliothek kompiliert. Bitte kompiliere PHP mit GD-Untersttzung neu, damit JpGraph funktioniert. (Weder die Funktion imagetypes() noch imagecreatefromstring() existiert!)',0), +25002 => array('Diese PHP-Installation scheint nicht die bentigte GD-Bibliothek zu untersttzen. Bitte schau in der PHP-Dokumentation nach, wie man die GD-Bibliothek installiert und aktiviert.',0), 25003 => array('Genereller PHP Fehler : Bei %s:%d : %s',3), 25004 => array('Genereller PHP Fehler : %s ',1), 25005 => array('PHP_SELF, die PHP-Global-Variable kann nicht ermittelt werden. PHP kann nicht von der Kommandozeile gestartet werden, wenn der Cache oder die Bilddateien automatisch benannt werden sollen.',0), -25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie benötigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmäßig in PHP kompiliert (benötigt "--width-iconv" bei der Konfiguration).',0), -25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht unterstützt wird. Hinweis: Benutze \'\', um das defaultmäßige Lokale für diese geographische Region festzulegen.',1), -25008 => array('Die Bild-Breite und Höhe in Graph::Graph() müssen numerisch sein',0), +25006 => array('Die Benutzung der FF_CHINESE (FF_BIG5) Schriftfamilie bentigt die iconv() Funktion in Deiner PHP-Konfiguration. Dies wird nicht defaultmig in PHP kompiliert (bentigt "--width-iconv" bei der Konfiguration).',0), +25007 => array('Du versuchst das lokale (%s) zu verwenden, was von Deiner PHP-Installation nicht untersttzt wird. Hinweis: Benutze \'\', um das defaultmige Lokale fr diese geographische Region festzulegen.',1), +25008 => array('Die Bild-Breite und Hhe in Graph::Graph() mssen numerisch sein',0), 25009 => array('Die Skalierung der Achsen muss angegeben werden mit Graph::SetScale()',0), -25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), -25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), -25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufügen.',0), -25013 => array('Es können nur Standard-Plots zu multiplen Y-Achsen hinzugefügt werden',0), -25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufügen.',0), -25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufügen.',0), -25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufügen.',0), -25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualität der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0), -25018 => array('Falscher Dateiname für Graph::SetBackgroundImage() : "%s" muss eine gültige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1), -25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() für Dateiname: "%s"',2), +25010 => array('Graph::Add() Du hast versucht, einen leeren Plot zum Graph hinzuzufgen.',0), +25011 => array('Graph::AddY2() Du hast versucht, einen leeren Plot zum Graph hinzuzufgen.',0), +25012 => array('Graph::AddYN() Du hast versucht, einen leeren Plot zum Graph hinzuzufgen.',0), +25013 => array('Es knnen nur Standard-Plots zu multiplen Y-Achsen hinzugefgt werden',0), +25014 => array('Graph::AddText() Du hast versucht, einen leeren Text zum Graph hinzuzufgen.',0), +25015 => array('Graph::AddLine() Du hast versucht, eine leere Linie zum Graph hinzuzufgen.',0), +25016 => array('Graph::AddBand() Du hast versucht, ein leeres Band zum Graph hinzuzufgen.',0), +25017 => array('Du benutzt GD 2.x und versuchst, ein Hintergrundbild in einem Truecolor-Bild zu verwenden. Um Hintergrundbilder mit GD 2.x zu verwenden, ist es notwendig, Truecolor zu aktivieren, indem die USE_TRUECOLOR-Konstante auf TRUE gesetzt wird. Wegen eines Bugs in GD 2.0.1 ist die Qualitt der Schrift sehr schlecht, wenn Truetype-Schrift in Truecolor-Bildern verwendet werden.',0), +25018 => array('Falscher Dateiname fr Graph::SetBackgroundImage() : "%s" muss eine gltige Dateinamenerweiterung (jpg,gif,png) haben, wenn die automatische Dateityperkennung verwenndet werden soll.',1), +25019 => array('Unbekannte Dateinamenerweiterung (%s) in Graph::SetBackgroundImage() fr Dateiname: "%s"',2), -25020 => array('Graph::SetScale(): Dar Maximalwert muss größer sein als der Mindestwert.',0), -25021 => array('Unbekannte Achsendefinition für die Y-Achse. (%s)',1), -25022 => array('Unbekannte Achsendefinition für die X-Achse. (%s)',1), -25023 => array('Nicht unterstützter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), -25024 => array('Nicht unterstützter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), -25025 => array('Nicht unterstützte Tick-Dichte: %d',1), -25026 => array('Nicht unterstützter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp für automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0), -25027 => array('Kann cached CSIM "%s" zum Lesen nicht öffnen.',1), -25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. Überprüfe die Rechte.',1), -25029 => array('Kann nicht in das CSIM "%s" schreiben. Überprüfe die Schreibrechte und den freien Speicherplatz.',1), +25020 => array('Graph::SetScale(): Dar Maximalwert muss grer sein als der Mindestwert.',0), +25021 => array('Unbekannte Achsendefinition fr die Y-Achse. (%s)',1), +25022 => array('Unbekannte Achsendefinition fr die X-Achse. (%s)',1), +25023 => array('Nicht untersttzter Y2-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25024 => array('Nicht untersttzter X-Achsentyp: "%s" muss einer von (lin,log,int) sein.',1), +25025 => array('Nicht untersttzte Tick-Dichte: %d',1), +25026 => array('Nicht untersttzter Typ der nicht angegebenen Y-Achse. Du hast entweder: 1. einen Y-Achsentyp fr automatisches Skalieren definiert, aber keine Plots angegeben. 2. eine Achse direkt definiert, aber vergessen, die Tick-Dichte zu festzulegen.',0), +25027 => array('Kann cached CSIM "%s" zum Lesen nicht ffnen.',1), +25028 => array('Apache/PHP hat keine Schreibrechte, in das CSIM-Cache-Verzeichnis (%s) zu schreiben. berprfe die Rechte.',1), +25029 => array('Kann nicht in das CSIM "%s" schreiben. berprfe die Schreibrechte und den freien Speicherplatz.',1), -25030 => array('Fehlender Skriptname für StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0), +25030 => array('Fehlender Skriptname fr StrokeCSIM(). Der Name des aktuellen Skriptes muss als erster Parameter von StrokeCSIM() angegeben werden.',0), 25031 => array('Der Achsentyp muss mittels Graph::SetScale() angegeben werden.',0), -25032 => array('Es existieren keine Plots für die Y-Achse nbr:%d',1), +25032 => array('Es existieren keine Plots fr die Y-Achse nbr:%d',1), 25033 => array('',0), 25034 => array('Undefinierte X-Achse kann nicht gezeichnet werden. Es wurden keine Plots definiert.',0), -25035 => array('Du hast Clipping aktiviert. Clipping wird nur für Diagramme mit 0 oder 90 Grad Rotation unterstützt. Bitte verändere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1), +25035 => array('Du hast Clipping aktiviert. Clipping wird nur fr Diagramme mit 0 oder 90 Grad Rotation untersttzt. Bitte verndere Deinen Rotationswinkel (=%d Grad) dementsprechend oder deaktiviere Clipping.',1), 25036 => array('Unbekannter Achsentyp AxisStyle() : %s',1), -25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht unterstützt. ',1), +25037 => array('Das Bildformat Deines Hintergrundbildes (%s) wird von Deiner System-Konfiguration nicht untersttzt. ',1), 25038 => array('Das Hintergrundbild scheint von einem anderen Typ (unterschiedliche Dateierweiterung) zu sein als der angegebene Typ. Angegebenen: %s; Datei: %s',2), 25039 => array('Hintergrundbild kann nicht gelesen werden: "%s"',1), -25040 => array('Es ist nicht möglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0), -25041 => array('Um Landesflaggen als Hintergrund benutzen zu können, muss die Datei "jpgraph_flags.php" eingefügt werden (per include).',0), +25040 => array('Es ist nicht mglich, sowohl ein Hintergrundbild als auch eine Hintergrund-Landesflagge anzugeben.',0), +25041 => array('Um Landesflaggen als Hintergrund benutzen zu knnen, muss die Datei "jpgraph_flags.php" eingefgt werden (per include).',0), 25042 => array('Unbekanntes Hintergrundbild-Layout',0), 25043 => array('Unbekannter Titelhintergrund-Stil.',0), -25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmöglich ist, einen gültigen min/max Wert für die Y-Achse zu ermitteln (nur Null-Werte).',0), -25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfügbar. Diese Schriften können nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0), +25044 => array('Automatisches Skalieren kann nicht verwendet werden, weil es unmglich ist, einen gltigen min/max Wert fr die Y-Achse zu ermitteln (nur Null-Werte).',0), +25045 => array('Die Schriftfamilien FF_HANDWRT und FF_BOOK sind wegen Copyright-Problemen nicht mehr verfgbar. Diese Schriften knnen nicht mehr mit JpGraph verteilt werden. Bitte lade Dir Schriften von http://corefonts.sourceforge.net/ herunter.',0), 25046 => array('Angegebene TTF-Schriftfamilie (id=%d) ist unbekannt oder existiert nicht. Bitte merke Dir, dass TTF-Schriften wegen Copyright-Problemen nicht mit JpGraph mitgeliefert werden. Du findest MS-TTF-Internetschriften (arial, courier, etc.) zum Herunterladen unter http://corefonts.sourceforge.net/',1), -25047 => array('Stil %s ist nicht verfügbar für Schriftfamilie %s',2), +25047 => array('Stil %s ist nicht verfgbar fr Schriftfamilie %s',2), 25048 => array('Unbekannte Schriftstildefinition [%s].',1), 25049 => array('Schriftdatei "%s" ist nicht lesbar oder existiert nicht.',1), -25050 => array('Erstes Argument für Text::Text() muss ein String sein.',0), -25051 => array('Ungültige Richtung angegeben für Text.',0), -25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung für Text.',0), -25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung für Text.',0), +25050 => array('Erstes Argument fr Text::Text() muss ein String sein.',0), +25051 => array('Ungltige Richtung angegeben fr Text.',0), +25052 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte vertikale Ausrichtung fr Text.',0), +25053 => array('PANIK: Interner Fehler in SuperScript::Stroke(). Unbekannte horizontale Ausrichtung fr Text.',0), 25054 => array('Interner Fehler: Unbekannte Grid-Achse %s',1), 25055 => array('Axis::SetTickDirection() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetTickSide().',0), 25056 => array('SetTickLabelMargin() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelMargin().',0), @@ -328,94 +324,81 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 25058 => array('TextLabelIntevall >= 1 muss angegeben werden.',0), 25059 => array('SetLabelPos() sollte nicht mehr verwendet werden. Benutze stattdessen Axis::SetLabelSide().',0), -25060 => array('Unbekannte Ausrichtung angegeben für X-Achsentitel (%s).',1), -25061 => array('Unbekannte Ausrichtung angegeben für Y-Achsentitel (%s).',1), -25062 => array('Label unter einem Winkel werden für die Y-Achse nicht unterstützt.',0), +25060 => array('Unbekannte Ausrichtung angegeben fr X-Achsentitel (%s).',1), +25061 => array('Unbekannte Ausrichtung angegeben fr Y-Achsentitel (%s).',1), +25062 => array('Label unter einem Winkel werden fr die Y-Achse nicht untersttzt.',0), 25063 => array('Ticks::SetPrecision() sollte nicht mehr verwendet werden. Benutze stattdessen Ticks::SetLabelFormat() (oder Ticks::SetFormatCallback()).',0), -25064 => array('Kleinere oder größere Schrittgröße ist 0. Überprüfe, ob Du fälschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell über einen Bug in JpGraph gestolpert. Bitte sende einen Report und füge den Code an, der den Fehler verursacht hat.',0), -25065 => array('Tick-Positionen müssen als array() angegeben werden',0), +25064 => array('Kleinere oder grere Schrittgre ist 0. berprfe, ob Du flschlicherweise SetTextTicks(0) in Deinem Skript hast. Wenn dies nicht der Fall ist, bist Du eventuell ber einen Bug in JpGraph gestolpert. Bitte sende einen Report und fge den Code an, der den Fehler verursacht hat.',0), +25065 => array('Tick-Positionen mssen als array() angegeben werden',0), 25066 => array('Wenn die Tick-Positionen und -Label von Hand eingegeben werden, muss die Anzahl der Ticks und der Label gleich sein.',0), -25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein für den Tickabstand.',0), -25068 => array('Ein Plot hat eine ungültige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildfläche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0), -25069 => array('Grace muss größer sein als 0',0), +25067 => array('Deine von Hand eingegebene Achse und Ticks sind nicht korrekt. Die Skala scheint zu klein zu sein fr den Tickabstand.',0), +25068 => array('Ein Plot hat eine ungltige Achse. Dies kann beispielsweise der Fall sein, wenn Du automatisches Text-Skalieren verwendest, um ein Liniendiagramm zu zeichnen mit nur einem Datenpunkt, oder wenn die Bildflche zu klein ist. Es kann auch der Fall sein, dass kein Datenpunkt einen numerischen Wert hat (vielleicht nur \'-\' oder \'x\').',0), +25069 => array('Grace muss grer sein als 0',0), 25070 => array('Deine Daten enthalten nicht-numerische Werte.',0), -25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der größer ist als der Maximalwert für die Achse. Dies ist nicht möglich.',0), -25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht möglich.',0), -25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist außerhalb der Grenzen (r=%f).',1), -25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [für %s Achse]. Dieses Problem könnte verursacht werden durch den Versuch, \'ungültige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2), -25075 => array('Die automatischen Ticks können nicht gesetzt werden, weil min==max.',0), -25077 => array('Einstellfaktor für die Farbe muss größer sein als 0',0), +25071 => array('Du hast mit SetAutoMin() einen Mindestwert angegeben, der grer ist als der Maximalwert fr die Achse. Dies ist nicht mglich.',0), +25072 => array('Du hast mit SetAutoMax() einen Maximalwert angegeben, der kleiner ist als der Minimalwert der Achse. Dies ist nicht mglich.',0), +25073 => array('Interner Fehler. Der Integer-Skalierungs-Algorithmus-Vergleich ist auerhalb der Grenzen (r=%f).',1), +25074 => array('Interner Fehler. Der Skalierungsbereich ist negativ (%f) [fr %s Achse]. Dieses Problem knnte verursacht werden durch den Versuch, \'ungltige\' Werte in die Daten-Vektoren einzugeben (z.B. nur String- oder NULL-Werte), was beim automatischen Skalieren einen Fehler erzeugt.',2), +25075 => array('Die automatischen Ticks knnen nicht gesetzt werden, weil min==max.',0), +25077 => array('Einstellfaktor fr die Farbe muss grer sein als 0',0), 25078 => array('Unbekannte Farbe: %s',1), -25079 => array('Unbekannte Farbdefinition: %s, Größe=%d',2), +25079 => array('Unbekannte Farbdefinition: %s, Gre=%d',2), -25080 => array('Der Alpha-Parameter für Farben muss zwischen 0.0 und 1.0 liegen.',0), -25081 => array('Das ausgewählte Grafikformat wird entweder nicht unterstützt oder ist unbekannt [%s]',1), -25082 => array('Es wurden ungültige Größen für Breite und Höhe beim Erstellen des Bildes definiert (Breite=%d, Höhe=%d).',2), -25083 => array('Es wurde eine ungültige Größe beim Kopieren des Bildes angegeben. Die Größe für das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0), -25084 => array('Fehler beim Erstellen eines temporären GD-Canvas. Möglicherweise liegt ein Arbeitsspeicherproblem vor.',0), -25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht unterstützen Format oder er represäntiert ein kaputtes Bild.',0), -25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder höher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmäßig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0), -25087 => array('Diese PHP-Version wurde ohne TTF-Unterstützung konfiguriert. PHP muss mit TTF-Unterstützung neu kompiliert und installiert werden.',0), -25088 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0), -25089 => array('Die GD-Schriftunterstützung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0), +25080 => array('Der Alpha-Parameter fr Farben muss zwischen 0.0 und 1.0 liegen.',0), +25081 => array('Das ausgewhlte Grafikformat wird entweder nicht untersttzt oder ist unbekannt [%s]',1), +25082 => array('Es wurden ungltige Gren fr Breite und Hhe beim Erstellen des Bildes definiert (Breite=%d, Hhe=%d).',2), +25083 => array('Es wurde eine ungltige Gre beim Kopieren des Bildes angegeben. Die Gre fr das kopierte Bild wurde auf 1 Pixel oder weniger gesetzt.',0), +25084 => array('Fehler beim Erstellen eines temporren GD-Canvas. Mglicherweise liegt ein Arbeitsspeicherproblem vor.',0), +25085 => array('Ein Bild kann nicht aus dem angegebenen String erzeugt werden. Er ist entweder in einem nicht untersttzen Format oder er represntiert ein kaputtes Bild.',0), +25086 => array('Du scheinst nur GD 1.x installiert zu haben. Um Alphablending zu aktivieren, ist GD 2.x oder hher notwendig. Bitte installiere GD 2.x oder versichere Dich, dass die Konstante USE_GD2 richtig gesetzt ist. Standardmig wird die installierte GD-Version automatisch erkannt. Ganz selten wird GD2 erkannt, obwohl nur GD1 installiert ist. Die Konstante USE_GD2 muss dann zu "false" gesetzt werden.',0), +25087 => array('Diese PHP-Version wurde ohne TTF-Untersttzung konfiguriert. PHP muss mit TTF-Untersttzung neu kompiliert und installiert werden.',0), +25088 => array('Die GD-Schriftuntersttzung wurde falsch konfiguriert. Der Aufruf von imagefontwidth() ist fehlerhaft.',0), +25089 => array('Die GD-Schriftuntersttzung wurde falsch konfiguriert. Der Aufruf von imagefontheight() ist fehlerhaft.',0), 25090 => array('Unbekannte Richtung angegeben im Aufruf von StrokeBoxedText() [%s].',1), -25091 => array('Die interne Schrift untestützt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0), -25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Möglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1), +25091 => array('Die interne Schrift untesttzt das Schreiben von Text in einem beliebigen Winkel nicht. Benutze stattdessen TTF-Schriften.',0), +25092 => array('Es liegt entweder ein Konfigurationsproblem mit TrueType oder ein Problem beim Lesen der Schriftdatei "%s" vor. Versichere Dich, dass die Datei existiert und Leserechte und -pfad vergeben sind. (wenn \'basedir\' restriction in PHP aktiviert ist, muss die Schriftdatei im Dokumentwurzelverzeichnis abgelegt werden). Mglicherweise ist die FreeType-Bibliothek falsch installiert. Versuche, mindestens zur FreeType-Version 2.1.13 zu aktualisieren und kompiliere GD mit einem korrekten Setup neu, damit die FreeType-Bibliothek gefunden werden kann.',1), 25093 => array('Die Schriftdatei "%s" kann nicht gelesen werden beim Aufruf von Image::GetBBoxTTF. Bitte versichere Dich, dass die Schrift gesetzt wurde, bevor diese Methode aufgerufen wird, und dass die Schrift im TTF-Verzeichnis installiert ist.',1), 25094 => array('Die Textrichtung muss in einem Winkel zwischen 0 und 90 engegeben werden.',0), 25095 => array('Unbekannte Schriftfamilien-Definition. ',0), -25096 => array('Der Farbpalette können keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die größtmögliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0), +25096 => array('Der Farbpalette knnen keine weiteren Farben zugewiesen werden. Dem Bild wurde bereits die grtmgliche Anzahl von Farben (%d) zugewiesen und die Palette ist voll. Verwende stattdessen ein TrueColor-Bild',0), 25097 => array('Eine Farbe wurde als leerer String im Aufruf von PushColor() angegegeben.',0), 25098 => array('Negativer Farbindex. Unpassender Aufruf von PopColor().',0), -25099 => array('Die Parameter für Helligkeit und Kontrast sind außerhalb des zulässigen Bereichs [-1,1]',0), +25099 => array('Die Parameter fr Helligkeit und Kontrast sind auerhalb des zulssigen Bereichs [-1,1]',0), 25100 => array('Es liegt ein Problem mit der Farbpalette und dem GD-Setup vor. Bitte deaktiviere anti-aliasing oder verwende GD2 mit TrueColor. Wenn die GD2-Bibliothek installiert ist, versichere Dich, dass die Konstante USE_GD2 auf "true" gesetzt und TrueColor aktiviert ist.',0), -25101 => array('Ungültiges numerisches Argument für SetLineStyle(): (%d)',1), -25102 => array('Ungültiges String-Argument für SetLineStyle(): %s',1), -25103 => array('Ungültiges Argument für SetLineStyle %s',1), +25101 => array('Ungltiges numerisches Argument fr SetLineStyle(): (%d)',1), +25102 => array('Ungltiges String-Argument fr SetLineStyle(): %s',1), +25103 => array('Ungltiges Argument fr SetLineStyle %s',1), 25104 => array('Unbekannter Linientyp: %s',1), -25105 => array('Es wurden NULL-Daten für ein gefülltes Polygon angegeben. Sorge dafür, dass keine NULL-Daten angegeben werden.',0), -25106 => array('Image::FillToBorder : es können keine weiteren Farben zugewiesen werden.',0), -25107 => array('In Datei "%s" kann nicht geschrieben werden. Überprüfe die aktuellen Schreibrechte.',1), -25108 => array('Das Bild kann nicht gestreamt werden. Möglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0), -25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu unterstützen. Sorge zunächst dafür, dass GD als PHP-Modul kompiliert ist. Wenn Du außerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0), +25105 => array('Es wurden NULL-Daten fr ein geflltes Polygon angegeben. Sorge dafr, dass keine NULL-Daten angegeben werden.',0), +25106 => array('Image::FillToBorder : es knnen keine weiteren Farben zugewiesen werden.',0), +25107 => array('In Datei "%s" kann nicht geschrieben werden. berprfe die aktuellen Schreibrechte.',1), +25108 => array('Das Bild kann nicht gestreamt werden. Mglicherweise liegt ein Fehler im PHP/GD-Setup vor. Kompiliere PHP neu und verwende die eingebaute GD-Bibliothek, die mit PHP angeboten wird.',0), +25109 => array('Deine PHP- (und GD-lib-) Installation scheint keine bekannten Grafikformate zu untersttzen. Sorge zunchst dafr, dass GD als PHP-Modul kompiliert ist. Wenn Du auerdem JPEG-Bilder verwenden willst, musst Du die JPEG-Bibliothek installieren. Weitere Details sind in der PHP-Dokumentation zu finden.',0), -25110 => array('Dein PHP-Installation unterstützt das gewählte Grafikformat nicht: %s',1), -25111 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), +25110 => array('Dein PHP-Installation untersttzt das gewhlte Grafikformat nicht: %s',1), +25111 => array('Das gecachete Bild %s kann nicht gelscht werden. Problem mit den Rechten?',1), 25112 => array('Das Datum der gecacheten Datei (%s) liegt in der Zukunft.',1), -25113 => array('Das gecachete Bild %s kann nicht gelöscht werden. Problem mit den Rechten?',1), -25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte für die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1), -25115 => array('Berechtigung für gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1), -25116 => array('Datei kann nicht aus dem Cache %s geöffnet werden',1), -25117 => array('Gecachetes Bild %s kann nicht zum Lesen geöffnet werden.',1), +25113 => array('Das gecachete Bild %s kann nicht gelscht werden. Problem mit den Rechten?',1), +25114 => array('PHP hat nicht die erforderlichen Rechte, um in die Cache-Datei %s zu schreiben. Bitte versichere Dich, dass der Benutzer, der PHP anwendet, die entsprechenden Schreibrechte fr die Datei hat, wenn Du das Cache-System in JPGraph verwenden willst.',1), +25115 => array('Berechtigung fr gecachetes Bild %s kann nicht gesetzt werden. Problem mit den Rechten?',1), +25116 => array('Datei kann nicht aus dem Cache %s geffnet werden',1), +25117 => array('Gecachetes Bild %s kann nicht zum Lesen geffnet werden.',1), 25118 => array('Verzeichnis %s kann nicht angelegt werden. Versichere Dich, dass PHP die Schreibrechte in diesem Verzeichnis hat.',1), -25119 => array('Rechte für Datei %s können nicht gesetzt werden. Problem mit den Rechten?',1), +25119 => array('Rechte fr Datei %s knnen nicht gesetzt werden. Problem mit den Rechten?',1), -25120 => array('Die Position für die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0), -25121 => array('Eine leerer Datenvektor wurde für den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0), +25120 => array('Die Position fr die Legende muss als Prozentwert im Bereich 0-1 angegeben werden.',0), +25121 => array('Eine leerer Datenvektor wurde fr den Plot eingegeben. Es muss wenigstens ein Datenpunkt vorliegen.',0), 25122 => array('Stroke() muss als Subklasse der Klasse Plot definiert sein.',0), 25123 => array('Du kannst keine Text-X-Achse mit X-Koordinaten verwenden. Benutze stattdessen eine "int" oder "lin" Achse.',0), -25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwärts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0), -25125 => array('Ungültige Richtung für statische Linie.',0), -25126 => array('Es kann kein TrueColor-Bild erzeugt werden. Überprüfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0), +25124 => array('Der Eingabedatenvektor mus aufeinanderfolgende Werte von 0 aufwrts beinhalten. Der angegebene Y-Vektor beginnt mit leeren Werten (NULL).',0), +25125 => array('Ungltige Richtung fr statische Linie.',0), +25126 => array('Es kann kein TrueColor-Bild erzeugt werden. berprfe, ob die GD2-Bibliothek und PHP korrekt aufgesetzt wurden.',0), 25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0), 25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0), 25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0), -25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2), - -25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0), -25132 => array('Undefined property %s.',1), // @todo translate -25133 => array('Use Graph::SetTheme() after Graph::SetScale().',0), // @todo translate - -/* -** jpgraph_led -*/ - -25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0), - - /* **--------------------------------------------------------------------------------------------- ** Pro-version strings @@ -426,19 +409,19 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_table */ -27001 => array('GTextTable: Ungültiges Argument für Set(). Das Array-Argument muss 2-- dimensional sein.',0), -27002 => array('GTextTable: Ungültiges Argument für Set()',0), -27003 => array('GTextTable: Falsche Anzahl von Argumenten für GTextTable::SetColor()',0), -27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungültig.',0), -27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) können nicht ein weiteres Mal verschmolzen werden.',4), -27006 => array('GTextTable: Spalten-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), -27007 => array('GTextTable: Zeilen-Argument = %d liegt außerhalb der festgelegten Tabellengröße.',1), -27008 => array('GTextTable: Spalten- und Zeilengröße müssen zu den Dimensionen der Tabelle passen.',0), +27001 => array('GTextTable: Ungltiges Argument fr Set(). Das Array-Argument muss 2-- dimensional sein.',0), +27002 => array('GTextTable: Ungltiges Argument fr Set()',0), +27003 => array('GTextTable: Falsche Anzahl von Argumenten fr GTextTable::SetColor()',0), +27004 => array('GTextTable: Angegebener Zellenbereich, der verschmolzen werden soll, ist ungltig.',0), +27005 => array('GTextTable: Bereits verschmolzene Zellen im Bereich (%d,%d) bis (%d,%d) knnen nicht ein weiteres Mal verschmolzen werden.',4), +27006 => array('GTextTable: Spalten-Argument = %d liegt auerhalb der festgelegten Tabellengre.',1), +27007 => array('GTextTable: Zeilen-Argument = %d liegt auerhalb der festgelegten Tabellengre.',1), +27008 => array('GTextTable: Spalten- und Zeilengre mssen zu den Dimensionen der Tabelle passen.',0), 27009 => array('GTextTable: Die Anzahl der Tabellenspalten oder -zeilen ist 0. Versichere Dich, dass die Methoden Init() oder Set() aufgerufen werden.',0), 27010 => array('GTextTable: Es wurde keine Ausrichtung beim Aufruf von SetAlign() angegeben.',0), 27011 => array('GTextTable: Es wurde eine unbekannte Ausrichtung beim Aufruf von SetAlign() abgegeben. Horizontal=%s, Vertikal=%s',2), -27012 => array('GTextTable: Interner Fehler. Es wurde ein ungültiges Argument festgeleget %s',1), -27013 => array('GTextTable: Das Argument für FormatNumber() muss ein String sein.',0), +27012 => array('GTextTable: Interner Fehler. Es wurde ein ungltiges Argument festgeleget %s',1), +27013 => array('GTextTable: Das Argument fr FormatNumber() muss ein String sein.',0), 27014 => array('GTextTable: Die Tabelle wurde weder mit einem Aufruf von Set() noch von Init() initialisiert.',0), 27015 => array('GTextTable: Der Zellenbildbedingungstyp muss entweder TIMG_WIDTH oder TIMG_HEIGHT sein.',0), @@ -446,25 +429,25 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei ** jpgraph_windrose */ -22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht überschreiten!\n(Aktuell max: %d)',1), -22002 => array('Das Bild ist zu klein für eine Skala. Bitte vergrößere das Bild.',0), -22004 => array('Die Etikettendefinition für Windrosenrichtungen müssen 16 Werte haben (eine für jede Kompassrichtung).',0), -22005 => array('Der Linientyp für radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0), -22006 => array('Es wurde ein ungültiger Windrosentyp angegeben.',0), -22007 => array('Es wurden zu wenig Werte für die Bereichslegende angegeben.',0), +22001 => array('Die Gesamtsumme der prozentualen Anteile aller Windrosenarme darf 100%% nicht berschreiten!\n(Aktuell max: %d)',1), +22002 => array('Das Bild ist zu klein fr eine Skala. Bitte vergrere das Bild.',0), +22004 => array('Die Etikettendefinition fr Windrosenrichtungen mssen 16 Werte haben (eine fr jede Kompassrichtung).',0), +22005 => array('Der Linientyp fr radiale Linien muss einer von ("solid","dotted","dashed","longdashed") sein.',0), +22006 => array('Es wurde ein ungltiger Windrosentyp angegeben.',0), +22007 => array('Es wurden zu wenig Werte fr die Bereichslegende angegeben.',0), 22008 => array('Interner Fehler: Versuch, eine freie Windrose zu plotten, obwohl der Typ keine freie Windrose ist.',0), 22009 => array('Du hast die gleiche Richtung zweimal angegeben, einmal mit einem Winkel und einmal mit einer Kompassrichtung (%f Grad).',0), 22010 => array('Die Richtung muss entweder ein numerischer Wert sein oder eine der 16 Kompassrichtungen',0), 22011 => array('Der Windrosenindex muss ein numerischer oder Richtungswert sein. Du hast angegeben Index=%d',1), -22012 => array('Die radiale Achsendefinition für die Windrose enthält eine nicht aktivierte Richtung.',0), -22013 => array('Du hast dasselbe Look&Feel für die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), -22014 => array('Der Index für eine Kompassrichtung muss zwischen 0 und 15 sein.',0), +22012 => array('Die radiale Achsendefinition fr die Windrose enthlt eine nicht aktivierte Richtung.',0), +22013 => array('Du hast dasselbe Look&Feel fr die gleiche Kompassrichtung zweimal engegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22014 => array('Der Index fr eine Kompassrichtung muss zwischen 0 und 15 sein.',0), 22015 => array('Du hast einen unbekannten Windrosenplottyp angegeben.',0), 22016 => array('Der Windrosenarmindex muss ein numerischer oder ein Richtungswert sein.',0), 22017 => array('Die Windrosendaten enthalten eine Richtung, die nicht aktiviert ist. Bitte berichtige, welche Label angezeigt werden sollen.',0), -22018 => array('Du hast für dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), -22019 => array('Der Index für eine Richtung muss zwischen 0 und 15 sein. Winkel dürfen nicht für einen regelmäßigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0), -22020 => array('Der Windrosenplot ist zu groß für die angegebene Bildgröße. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrößere das Bild im ursprünglichen Aufruf von WindroseGraph().',0), +22018 => array('Du hast fr dieselbe Kompassrichtung zweimal Daten angegeben, einmal mit Text und einmal mit einem Index (Index=%d)',1), +22019 => array('Der Index fr eine Richtung muss zwischen 0 und 15 sein. Winkel drfen nicht fr einen regelmigen Windplot angegeben werden, sondern entweder ein Index oder eine Kompassrichtung.',0), +22020 => array('Der Windrosenplot ist zu gro fr die angegebene Bildgre. Benutze entweder WindrosePlot::SetSize(), um den Plot kleiner zu machen oder vergrere das Bild im ursprnglichen Aufruf von WindroseGraph().',0), 22021 => array('It is only possible to add Text, IconPlot or WindrosePlot to a Windrose Graph',0), /* @@ -472,7 +455,7 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei */ 13001 => array('Unbekannter Nadeltypstil (%d).',1), -13002 => array('Ein Wert für das Odometer (%f) ist außerhalb des angegebenen Bereichs [%f,%f]',3), +13002 => array('Ein Wert fr das Odometer (%f) ist auerhalb des angegebenen Bereichs [%f,%f]',3), /* ** jpgraph_barcode @@ -480,71 +463,36 @@ HTTP header wurden bereits gesendet.
Fehler in der Datei %s in der Zei 1001 => array('Unbekannte Kodier-Specifikation: %s',1), 1002 => array('datenvalidierung schlug fehl. [%s] kann nicht mittels der Kodierung "%s" kodiert werden',2), -1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht möglich in Code 128',1), +1003 => array('Interner Kodierfehler. Kodieren von %s ist nicht mglich in Code 128',1), 1004 => array('Interner barcode Fehler. Unbekannter UPC-E Kodiertyp: %s',1), 1005 => array('Interner Fehler. Das Textzeichen-Tupel (%s, %s) kann nicht im Code-128 Zeichensatz C kodiert werden.',2), -1006 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0), -1007 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0), -1008 => array('Interner Kodierfehler für CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0), -1009 => array('Kodieren mittels CODE 93 wird noch nicht unterstützt.',0), -1010 => array('Kodieren mittels POSTNET wird noch nicht unterstützt.',0), -1011 => array('Nicht untrstütztes Barcode-Backend für den Typ %s',1), +1006 => array('Interner Kodierfehler fr CODE 128. Es wurde versucht, CTRL in CHARSET != A zu kodieren.',0), +1007 => array('Interner Kodierfehler fr CODE 128. Es wurde versucht, DEL in CHARSET != B zu kodieren.',0), +1008 => array('Interner Kodierfehler fr CODE 128. Es wurde versucht, kleine Buchstaben in CHARSET != B zu kodieren.',0), +1009 => array('Kodieren mittels CODE 93 wird noch nicht untersttzt.',0), +1010 => array('Kodieren mittels POSTNET wird noch nicht untersttzt.',0), +1011 => array('Nicht untrsttztes Barcode-Backend fr den Typ %s',1), /* ** PDF417 */ -26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0), 26001 => array('PDF417: Die Anzahl der Spalten muss zwischen 1 und 30 sein.',0), 26002 => array('PDF417: Der Fehler-Level muss zwischen 0 und 8 sein.',0), -26003 => array('PDF417: Ungültiges Format für Eingabedaten, um sie mit PDF417 zu kodieren.',0), -26004 => array('PDF417: die eigebenen Daten können nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2), -26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geöffnet werden.',1), -26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei für PDF417-Cluster %d ist fehlerhaft.',1), -26007 => array('PDF417: Interner Fehler. GetPattern: Ungültiger Code-Wert %d (Zeile %d)',2), +26003 => array('PDF417: Ungltiges Format fr Eingabedaten, um sie mit PDF417 zu kodieren.',0), +26004 => array('PDF417: die eigebenen Daten knnen nicht mit Fehler-Level %d und %d spalten kodiert werden, weil daraus zu viele Symbole oder mehr als 90 Zeilen resultieren.',2), +26005 => array('PDF417: Die Datei "%s" kann nicht zum Schreiben geffnet werden.',1), +26006 => array('PDF417: Interner Fehler. Die Eingabedatendatei fr PDF417-Cluster %d ist fehlerhaft.',1), +26007 => array('PDF417: Interner Fehler. GetPattern: Ungltiger Code-Wert %d (Zeile %d)',2), 26008 => array('PDF417: Interner Fehler. Modus wurde nicht in der Modusliste!! Modus %d',1), -26009 => array('PDF417: Kodierfehler: Ungültiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1), +26009 => array('PDF417: Kodierfehler: Ungltiges Zeichen. Zeichen kann nicht mit ASCII-Code %d kodiert werden.',1), 26010 => array('PDF417: Interner Fehler: Keine Eingabedaten beim Dekodieren.',0), -26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht möglich.',0), -26012 => array('PDF417: Interner Fehler. Es wurden für den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0), +26011 => array('PDF417: Kodierfehler. Numerisches Kodieren bei nicht-numerischen Daten nicht mglich.',0), +26012 => array('PDF417: Interner Fehler. Es wurden fr den Binary-Kompressor keine Daten zum Dekodieren eingegeben.',0), 26013 => array('PDF417: Interner Fehler. Checksum Fehler. Koeffiziententabellen sind fehlerhaft.',0), -26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewörtern eingegeben.',0), -26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusübertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1), -26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusübertragungsmodus beim Dekodieren.',0), - - -/* -** jpgraph_contour -*/ - -28001 => array('Dritten parameter fur Contour muss ein vector der fargen sind.',0), -28002 => array('Die anzahlen der farges jeder isobar linien muss gleich sein.',0), -28003 => array('ContourPlot Interner Fehler: isobarHCrossing: Spalten index ist zu hoch (%d)',1), -28004 => array('ContourPlot Interner Fehler: isobarHCrossing: Reihe index ist zu hoch (%d)',1), -28005 => array('ContourPlot Interner Fehler: isobarVCrossing: Reihe index ist zu hoch (%d)',1), -28006 => array('ContourPlot Interner Fehler: isobarVCrossing: Spalten index ist zu hoch (%d)',1), -28007 => array('ContourPlot. Interpolation faktor ist zu hoch (>5)',0), - - -/* - * jpgraph_matrix and colormap -*/ -29201 => array('Min range value must be less or equal to max range value for colormaps',0), -29202 => array('The distance between min and max value is too small for numerical precision',0), -29203 => array('Number of color quantification level must be at least %d',1), -29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3), -29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1), -29206 => array('Invalid object added to MatrixGraph',0), -29207 => array('Empty input data specified for MatrixPlot',0), -29208 => array('Unknown side specifiction for matrix labels "%s"',1), -29209 => array('CSIM Target matrix must be the same size as the data matrix (csim=%d x %d, data=%d x %d)',4), -29210 => array('CSIM Target for matrix labels does not match the number of labels (csim=%d, labels=%d)',2), - - -/* -* jpgraph_theme -*/ -30001 => array("Theme::%s() is not defined. \nPlease make %s(\$graph) function in your theme classs.",2), +26014 => array('PDF417: Interner Fehler. Es wurden keine Daten zum Berechnen von Kodewrtern eingegeben.',0), +26015 => array('PDF417: Interner Fehler. Ein Eintrag 0 in die Statusbertragungstabellen ist nicht NULL. Eintrag 1 = (%s)',1), +26016 => array('PDF417: Interner Fehler: Nichtregistrierter Statusbertragungsmodus beim Dekodieren.',0), ); diff --git a/onyx2/include/jpgraph/lang/en.inc.php b/onyx2/include/jpgraph/lang/en.inc.php index a2f4f5a..734e85b 100644 --- a/onyx2/include/jpgraph/lang/en.inc.php +++ b/onyx2/include/jpgraph/lang/en.inc.php @@ -1,11 +1,11 @@ array(' - + @@ -69,4 +69,4 @@
JpGraph Error: +10 => array('
JpGraph Error: HTTP headers have already been sent.
Caused by output from file %s at line %d.
Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).

Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser.

For example it is a common mistake to leave a blank line before the opening "<?php".

',2), /* @@ -44,7 +44,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 2012 => array('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects. (Class=%s)',1), 2013 => array('You have specified an empty array for shadow colors in the bar plot.',0), 2014 => array('Number of datapoints for each data set in accbarplot must be the same',0), -2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0), /* @@ -102,7 +101,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 6030 => array('Unknown arrow direction for link.',0), 6031 => array('Unknown arrow type for link.',0), 6032 => array('Internal error: Unknown path type (=%d) specified for link.',1), -6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0), /* ** jpgraph_gradient @@ -187,7 +185,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 15009 => array('Illegal pie plot. Sum of all data is zero for Pie Plot',0), 15010 => array('Sum of all data is 0 for Pie.',0), 15011 => array('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.',0), -15012 => array('PiePlot::SetTheme() is no longer supported. Use PieGraph::SetTheme()',0), /* ** jpgraph_plotband @@ -258,7 +255,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 24001 => array('FuncGenerator : No function specified. ',0), 24002 => array('FuncGenerator : Syntax error in function specification ',0), 24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0), -24004 => array('ReadCSV2: Column count mismatch in %s line %d',2), /* ** jpgraph */ @@ -402,17 +398,7 @@ HTTP headers have already been sent.
Caused by output from file %s at 25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0), 25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0), 25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0), -25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2), -25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0), -25132 => array('Undefined property %s.',1), -25133 => array('Use Graph::SetTheme() after Graph::SetScale().',0), - -/* -** jpgraph_led -*/ - -25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0), /* **--------------------------------------------------------------------------------------------- @@ -490,7 +476,7 @@ HTTP headers have already been sent.
Caused by output from file %s at /* ** PDF417 */ -26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0), + 26001 => array('PDF417: Number of Columns must be >= 1 and <= 30',0), 26002 => array('PDF417: Error level must be between 0 and 8',0), 26003 => array('PDF417: Invalid format for input data to encode with PDF417',0), @@ -508,36 +494,5 @@ HTTP headers have already been sent.
Caused by output from file %s at 26015 => array('PDF417: Internal error. State transition table entry 0 is NULL. Entry 1 = (%s)',1), 26016 => array('PDF417: Internal error: Unrecognized state transition mode in decode.',0), -/* -** jpgraph_contour -*/ - -28001 => array('Third argument to Contour must be an array of colors.',0), -28002 => array('Number of colors must equal the number of isobar lines specified',0), -28003 => array('ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)',1), -28004 => array('ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)',1), -28005 => array('ContourPlot Internal Error: isobarVCrossing: Row index too large (%d)',1), -28006 => array('ContourPlot Internal Error: isobarVCrossing: Col index too large (%d)',1), -28007 => array('ContourPlot interpolation factor is too large (>5)',0), - -/* - * jpgraph_matrix and colormap -*/ -29201 => array('Min range value must be less or equal to max range value for colormaps',0), -29202 => array('The distance between min and max value is too small for numerical precision',0), -29203 => array('Number of color quantification level must be at least %d',1), -29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3), -29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1), -29206 => array('Invalid object added to MatrixGraph',0), -29207 => array('Empty input data specified for MatrixPlot',0), -29208 => array('Unknown side specifiction for matrix labels "%s"',1), -29209 => array('CSIM Target matrix must be the same size as the data matrix (csim=%d x %d, data=%d x %d)',4), -29210 => array('CSIM Target for matrix labels does not match the number of labels (csim=%d, labels=%d)',2), - - -/* -* jpgraph_theme -*/ -30001 => array("Theme::%s() is not defined. \nPlease make %s(\$graph) function in your theme classs.",2), ); diff --git a/onyx2/include/jpgraph/lang/prod.inc.php b/onyx2/include/jpgraph/lang/prod.inc.php index ab7ea87..f7d4569 100644 --- a/onyx2/include/jpgraph/lang/prod.inc.php +++ b/onyx2/include/jpgraph/lang/prod.inc.php @@ -4,9 +4,9 @@ // Description: Special localization file with the same error messages // for all errors. // Created: 2006-02-18 -// Ver: $Id: prod.inc.php 1886 2009-10-01 23:30:16Z ljp $ +// Ver: $Id: prod.inc.php 993 2008-03-30 21:17:41Z ljp $ // -// Copyright (c) Asial Corporation. All rights reserved. +// Copyright (c) Aditus Consulting. All rights reserved. //======================================================================== */ @@ -19,7 +19,7 @@ $_jpg_messages = array( /* ** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text */ -10 => array('
JpGraph Error: +10 => array('
JpGraph Error: HTTP headers have already been sent.
Caused by output from file %s at line %d.
Explanation:
HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it\'s image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text).

Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser.

For example it is a common mistake to leave a blank line before the opening "<?php".

',2), @@ -75,7 +75,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 6030 => array(DEFAULT_ERROR_MESSAGE.'6030',0), 6031 => array(DEFAULT_ERROR_MESSAGE.'6031',0), 6032 => array(DEFAULT_ERROR_MESSAGE.'6032',0), -6033 => array(DEFAULT_ERROR_MESSAGE.'6033',0), 7001 => array(DEFAULT_ERROR_MESSAGE.'7001',0), 8001 => array(DEFAULT_ERROR_MESSAGE.'8001',0), 8002 => array(DEFAULT_ERROR_MESSAGE.'8002',0), @@ -120,7 +119,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 15009 => array(DEFAULT_ERROR_MESSAGE.'15009',0), 15010 => array(DEFAULT_ERROR_MESSAGE.'15010',0), 15011 => array(DEFAULT_ERROR_MESSAGE.'15011',0), -15012 => array(DEFAULT_ERROR_MESSAGE.'15012',0), 16001 => array(DEFAULT_ERROR_MESSAGE.'16001',0), 16002 => array(DEFAULT_ERROR_MESSAGE.'16002',0), 16003 => array(DEFAULT_ERROR_MESSAGE.'16003',0), @@ -149,7 +147,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 24001 => array(DEFAULT_ERROR_MESSAGE.'24001',0), 24002 => array(DEFAULT_ERROR_MESSAGE.'24002',0), 24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0), -24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0), 25001 => array(DEFAULT_ERROR_MESSAGE.'25001',0), 25002 => array(DEFAULT_ERROR_MESSAGE.'25002',0), 25003 => array(DEFAULT_ERROR_MESSAGE.'25003',0), @@ -278,11 +275,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 25127 => array(DEFAULT_ERROR_MESSAGE.'25127',0), 25128 => array(DEFAULT_ERROR_MESSAGE.'25128',0), 25129 => array(DEFAULT_ERROR_MESSAGE.'25129',0), -25130 => array(DEFAULT_ERROR_MESSAGE.'25130',0), -25131 => array(DEFAULT_ERROR_MESSAGE.'25131',0), -25132 => array(DEFAULT_ERROR_MESSAGE.'25132',0), -25133 => array(DEFAULT_ERROR_MESSAGE.'25133',0), -25500 => array(DEFAULT_ERROR_MESSAGE.'25500',0), 24003 => array(DEFAULT_ERROR_MESSAGE.'24003',0), 24004 => array(DEFAULT_ERROR_MESSAGE.'24004',0), 24005 => array(DEFAULT_ERROR_MESSAGE.'24005',0), @@ -328,7 +320,6 @@ HTTP headers have already been sent.
Caused by output from file %s at 1009 => array(DEFAULT_ERROR_MESSAGE.'1009',0), 1010 => array(DEFAULT_ERROR_MESSAGE.'1010',0), 1011 => array(DEFAULT_ERROR_MESSAGE.'1011',0), -26000 => array(DEFAULT_ERROR_MESSAGE.'26000',0), 26001 => array(DEFAULT_ERROR_MESSAGE.'26001',0), 26002 => array(DEFAULT_ERROR_MESSAGE.'26002',0), 26003 => array(DEFAULT_ERROR_MESSAGE.'26003',0), @@ -361,24 +352,4 @@ HTTP headers have already been sent.
Caused by output from file %s at 27013 => array(DEFAULT_ERROR_MESSAGE.'27013',0), 27014 => array(DEFAULT_ERROR_MESSAGE.'27014',0), 27015 => array(DEFAULT_ERROR_MESSAGE.'27015',0), - -28001 => array(DEFAULT_ERROR_MESSAGE.'28001',0), -28002 => array(DEFAULT_ERROR_MESSAGE.'28002',0), -28003 => array(DEFAULT_ERROR_MESSAGE.'28003',0), -28004 => array(DEFAULT_ERROR_MESSAGE.'28004',0), -28005 => array(DEFAULT_ERROR_MESSAGE.'28005',0), -28006 => array(DEFAULT_ERROR_MESSAGE.'28006',0), -28007 => array(DEFAULT_ERROR_MESSAGE.'28007',0), - -29201 => array(DEFAULT_ERROR_MESSAGE.'28001',0), -29202 => array(DEFAULT_ERROR_MESSAGE.'28002',0), -29203 => array(DEFAULT_ERROR_MESSAGE.'28003',0), -29204 => array(DEFAULT_ERROR_MESSAGE.'28004',0), -29205 => array(DEFAULT_ERROR_MESSAGE.'28005',0), -29206 => array(DEFAULT_ERROR_MESSAGE.'28006',0), -29207 => array(DEFAULT_ERROR_MESSAGE.'28007',0), -29208 => array(DEFAULT_ERROR_MESSAGE.'28008',0), -29209 => array(DEFAULT_ERROR_MESSAGE.'28009',0), -29210 => array(DEFAULT_ERROR_MESSAGE.'28010',0), - ); diff --git a/onyx2/include/jpgraph/themes/AquaTheme.class.php b/onyx2/include/jpgraph/themes/AquaTheme.class.php deleted file mode 100755 index 97cde78..0000000 --- a/onyx2/include/jpgraph/themes/AquaTheme.class.php +++ /dev/null @@ -1,201 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.80, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(4); - - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - //$plot->SetShadow(); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - $plot->SetColor($this->GetNextColor()); - $plot->SetWeight(2); -// $plot->SetBarCenter(); - break; - } - - case 'PiePlot': - { - $plot->SetCenter(0.5, 0.45); - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/GreenTheme.class.php b/onyx2/include/jpgraph/themes/GreenTheme.class.php deleted file mode 100755 index 199b1b7..0000000 --- a/onyx2/include/jpgraph/themes/GreenTheme.class.php +++ /dev/null @@ -1,182 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - /* - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - */ - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - - $plot->SetColor($this->GetNextColor().'@0.4'); - $plot->SetWeight(2); - break; - } - - case 'PiePlot': - { - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/OceanTheme.class.php b/onyx2/include/jpgraph/themes/OceanTheme.class.php deleted file mode 100755 index ebbc91b..0000000 --- a/onyx2/include/jpgraph/themes/OceanTheme.class.php +++ /dev/null @@ -1,184 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - /* - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - */ - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - - $plot->SetColor($this->GetNextColor()); - $plot->SetWeight(2); - break; - } - - case 'PiePlot': - { - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/OrangeTheme.class.php b/onyx2/include/jpgraph/themes/OrangeTheme.class.php deleted file mode 100755 index 65f954a..0000000 --- a/onyx2/include/jpgraph/themes/OrangeTheme.class.php +++ /dev/null @@ -1,184 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - /* - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - */ - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - - $plot->SetColor($this->GetNextColor().'@0.4'); - $plot->SetWeight(2); - break; - } - - case 'PiePlot': - { - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/PastelTheme.class.php b/onyx2/include/jpgraph/themes/PastelTheme.class.php deleted file mode 100755 index b4832d2..0000000 --- a/onyx2/include/jpgraph/themes/PastelTheme.class.php +++ /dev/null @@ -1,179 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.80, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(4); - - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - $plot->SetColor($this->GetNextColor().'@0.4'); - $plot->SetWeight(2); -// $plot->SetBarCenter(); - break; - } - - case 'PiePlot': - { - $plot->SetCenter(0.5, 0.45); - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/RoseTheme.class.php b/onyx2/include/jpgraph/themes/RoseTheme.class.php deleted file mode 100755 index cd41b44..0000000 --- a/onyx2/include/jpgraph/themes/RoseTheme.class.php +++ /dev/null @@ -1,184 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - /* - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - */ - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - - $plot->SetColor($this->GetNextColor().'@0.4'); - $plot->SetWeight(2); - break; - } - - case 'PiePlot': - { - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/SoftyTheme.class.php b/onyx2/include/jpgraph/themes/SoftyTheme.class.php deleted file mode 100755 index c5e3fd9..0000000 --- a/onyx2/include/jpgraph/themes/SoftyTheme.class.php +++ /dev/null @@ -1,213 +0,0 @@ -SetFrame(false); - $graph->SetMarginColor('white'); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // y2~ - if (isset($graph->y2axis)) { - $graph->y2axis->title->SetColor($this->font_color); - $graph->y2axis->SetColor($this->axis_color, $this->font_color); - $graph->y2axis->SetTickSide(SIDE_LEFT); - $graph->y2axis->SetLabelMargin(8); - $graph->y2axis->HideLine(); - $graph->y2axis->HideTicks(); - } - - // yn - if (isset($graph->y2axis)) { - foreach ($graph->ynaxis as $axis) { - $axis->title->SetColor($this->font_color); - $axis->SetColor($this->axis_color, $this->font_color); - $axis->SetTickSide(SIDE_LEFT); - $axis->SetLabelMargin(8); - $axis->HideLine(); - $axis->HideTicks(); - } - } - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - $graph->ygrid->SetFill(true, '#FFFFFF', $this->background_color); - $graph->xgrid->Show(); - $graph->xgrid->SetColor($this->grid_color); - $graph->xgrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - $plot->value->SetAlign('center', 'center'); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - - $plot->SetColor($this->GetNextColor()); - $plot->SetWeight(2); -// $plot->SetBarCenter(); - break; - } - - case 'PiePlot': - { - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - $plot->value->SetAlign('center', 'center'); - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - $_plot->SetValuePos('center'); - } - break; - } - - case 'ScatterPlot': - { - break; - } - - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/UniversalTheme.class.php b/onyx2/include/jpgraph/themes/UniversalTheme.class.php deleted file mode 100755 index f5a0b01..0000000 --- a/onyx2/include/jpgraph/themes/UniversalTheme.class.php +++ /dev/null @@ -1,187 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBox(true, '#DADADA'); -// $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - $graph->xaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - //$graph->xaxis->SetLabelMargin(30); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); -// $graph->yaxis->SetTickPositions(array(50, 100, 150)); -// $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetFill(true, '#FFFFFF', $this->background_color); - // $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.80, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(4); - - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - $plot->SetColor($this->GetNextColor().'@0.4'); - $plot->SetWeight(2); - break; - } - - case 'PiePlot': - { - $plot->SetCenter(0.5, 0.45); - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/jpgraph/themes/VividTheme.class.php b/onyx2/include/jpgraph/themes/VividTheme.class.php deleted file mode 100755 index 836e5ac..0000000 --- a/onyx2/include/jpgraph/themes/VividTheme.class.php +++ /dev/null @@ -1,179 +0,0 @@ -img; - $height = $img->height; - $graph->SetMargin($img->left_margin, $img->right_margin, $img->top_margin, $height * 0.25); - */ - $graph->SetFrame(false); - $graph->SetMarginColor('white'); - $graph->SetBackgroundGradient($this->background_color, '#FFFFFF', GRAD_HOR, BGRAD_PLOT); - - // legend - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.85, 'center', 'top'); - $graph->legend->SetFillColor('white'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(3); - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // xaxis - $graph->xaxis->title->SetColor($this->font_color); - $graph->xaxis->SetColor($this->axis_color, $this->font_color); - $graph->xaxis->SetTickSide(SIDE_BOTTOM); - $graph->xaxis->SetLabelMargin(10); - - // yaxis - $graph->yaxis->title->SetColor($this->font_color); - $graph->yaxis->SetColor($this->axis_color, $this->font_color); - $graph->yaxis->SetTickSide(SIDE_LEFT); - $graph->yaxis->SetLabelMargin(8); - $graph->yaxis->HideLine(); - $graph->yaxis->HideTicks(); - $graph->xaxis->SetTitleMargin(15); - - // grid - $graph->ygrid->SetColor($this->grid_color); - $graph->ygrid->SetLineStyle('dotted'); - - - // font - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - -// $graph->img->SetAntiAliasing(); - } - - - public function SetupPieGraph($graph) - { - - // graph - $graph->SetFrame(false); - - // legend - $graph->legend->SetFillColor('white'); - - $graph->legend->SetFrameWeight(0); - $graph->legend->Pos(0.5, 0.80, 'center', 'top'); - $graph->legend->SetLayout(LEGEND_HOR); - $graph->legend->SetColumns(4); - - $graph->legend->SetShadow(false); - $graph->legend->SetMarkAbsSize(5); - - // title - $graph->title->SetColor($this->font_color); - $graph->subtitle->SetColor($this->font_color); - $graph->subsubtitle->SetColor($this->font_color); - - $graph->SetAntiAliasing(); - } - - - public function PreStrokeApply($graph) - { - if ($graph->legend->HasItems()) { - $img = $graph->img; - $graph->SetMargin( - $img->raw_left_margin, - $img->raw_right_margin, - $img->raw_top_margin, - is_numeric($img->raw_bottom_margin) ? $img->raw_bottom_margin : $img->height * 0.25 - ); - } - } - - public function ApplyPlot($plot) - { - switch (get_class($plot)) { - case 'GroupBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'AccBarPlot': - { - foreach ($plot->plots as $_plot) { - $this->ApplyPlot($_plot); - } - break; - } - - case 'BarPlot': - { - $plot->Clear(); - - $color = $this->GetNextColor(); - $plot->SetColor($color); - $plot->SetFillColor($color); - $plot->SetShadow('red', 3, 4, false); - break; - } - - case 'LinePlot': - { - $plot->Clear(); - $plot->SetColor($this->GetNextColor().'@0.4'); - $plot->SetWeight(2); -// $plot->SetBarCenter(); - break; - } - - case 'PiePlot': - { - $plot->SetCenter(0.5, 0.45); - $plot->ShowBorder(false); - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - case 'PiePlot3D': - { - $plot->SetSliceColors($this->GetThemeColors()); - break; - } - - default: - { - } - } - } -} diff --git a/onyx2/include/server/messagerie.php b/onyx2/include/server/messagerie.php index 6f477bc..adecc6a 100644 --- a/onyx2/include/server/messagerie.php +++ b/onyx2/include/server/messagerie.php @@ -45,8 +45,8 @@ if ($onglet == "rapports") { } $bdd->reconnexion(); - $data = $bdd->query("SELECT * FROM $table_mail WHERE destinataire = ".$planete->id_user." AND expediteur IS NULL AND vu != 's' ORDER BY id DESC;"); - $bdd->query("UPDATE $table_mail SET vu = 0 WHERE destinataire = ".$planete->id_user." AND expediteur IS NULL AND vu != 's';"); + $data = $bdd->query("SELECT * FROM $table_mail WHERE destinataire = ".$planete->id_user." AND expediteur = false AND vu != 's' ORDER BY id DESC;"); + $bdd->query("UPDATE $table_mail SET vu = 0 WHERE destinataire = ".$planete->id_user." AND expediteur = false AND vu != 's';"); $bdd->deconnexion(); $template->assign('messages', $data); diff --git a/onyx2/lang/fr.xml b/onyx2/lang/fr.xml index c5eddb7..49b9b97 100644 --- a/onyx2/lang/fr.xml +++ b/onyx2/lang/fr.xml @@ -860,30 +860,30 @@ Armure moléculaire - Shade - Strong Shade - Canon à plasma - Canon à combustible - Lanceur de torpille plasma + Tourelle légère M202 XP + Canon de défense automatique + Artillerie lourde de 440mm + Lance-missiles Archer + Batterie de missiles Anaconda Silo de missiles Shiva Canon à accélération magnétique Prototype Intercepteur Longsword - Prototype Séraphin - Prototype de chasseur lourd Tarasque - Prototype de bombardier Gigas + Prototype Bombardier Longsword + Corvette de classe Mako + Prototype de Frégate Récupération Prototype de Destroyer - Prototype de Destroyer de classe CVP - Prototype de Croiseur de classe CCS - Prototype de Croiseur de classe Révérence - Prototype de Cuirassé - Prototype de Super croiseur - Prototype de Porte-vaisseau - Prototype de Porte-vaisseau lourd - Prototype de station orbitale - Prototype de ... + Prototype de Croiseur de classe Halcyon + Prototype de Croiseur de classe Marathon + Prototype de Porte-vaisseaux + Prototype de Super Porte-Vaisseaux + Prototype de Vaisseau d'exfiltration de classe Black Cat + Prototype de Super canon à accélération magnétique + Bunker souterrain + Bunker souterrain + Bunker souterrain Expansion @@ -1038,11 +1038,11 @@ ~#DESCRIPTION MANQUANTE#~ Armure moléculaire - Shade - Strong Shade - Canon à plasma - Canon à combustible - Lanceur de torpille plasma + ~#DESCRIPTION MANQUANTE#~ Tourelle légère M202 XP + ~#DESCRIPTION MANQUANTE#~ Canon de défense automatique + ~#DESCRIPTION MANQUANTE#~ Artillerie lourde de 440mm + ~#DESCRIPTION MANQUANTE#~ Lance-missiles Archer + ~#DESCRIPTION MANQUANTE#~ Batterie de missiles Anaconda ~#DESCRIPTION MANQUANTE#~ Silo de missiles Shiva ~#DESCRIPTION MANQUANTE#~ Canon à accélération magnétique diff --git a/onyx2/tpl/admin/print_choixP.tpl b/onyx2/tpl/admin/print_choixP.tpl index 0089143..b3c6605 100644 --- a/onyx2/tpl/admin/print_choixP.tpl +++ b/onyx2/tpl/admin/print_choixP.tpl @@ -37,22 +37,4 @@
-
-

Liste des planètes existantes

- - - - - - - - {foreach from=$planetes item=planete} - - - - - - - {/foreach} -
PlanèteJoueurPosition
{$planete.nom_planete}{$planete.pseudo}{$planete.galaxie}:{$planete.ss}:{$planete.position}
-{include file='game/footer.tpl'} +{include file='game/footer.tpl'} \ No newline at end of file diff --git a/onyx2/tpl/game/accueil.tpl b/onyx2/tpl/game/accueil.tpl index 8b888ab..a17d21b 100644 --- a/onyx2/tpl/game/accueil.tpl +++ b/onyx2/tpl/game/accueil.tpl @@ -27,7 +27,7 @@

Infos

{if $smarty.const.SURFACE == "planete"}

{php}dDonnees::nameVilles($this->_tpl_vars['planete']->batiments[17]){/php}

-

Diamètre: {$diametre|separerNombres} km ({$planete->casesRest} case{if $planete->casesRest > 1}s{/if} disponible{if $planete->casesRest > 1}s{/if} sur {$planete->cases})

+

Diamètre: {$diametre|separerNombres} km ({$planete->casesRest} case{if $planete->casesRest > 1}s{/if} disponible{if $planete->casesRest > 1}s{/if} sur {php}dDonnees::capaciteVilles($this->_tpl_vars['planete']){/php})

{/if}

Race : {$planete->race}

position: {$planete->galaxie}.{$planete->ss}.{$planete->position}

@@ -111,4 +111,4 @@

Infos de l'alliance

{$planete->details.texte_interne} {/if} -{include file='game/footer.tpl'} +{include file='game/footer.tpl'} \ No newline at end of file diff --git a/onyx2/tpl/game/flotte1.tpl b/onyx2/tpl/game/flotte1.tpl index b161ca0..c1b685c 100644 --- a/onyx2/tpl/game/flotte1.tpl +++ b/onyx2/tpl/game/flotte1.tpl @@ -8,7 +8,7 @@ {if $flottesEC} {foreach from=$flottesEC item=flotteEC}
{$flotteEC->nom|escape}{$flotteEC->nom|escape} {$flotteEC->txtMission($flotteEC->mission)} {$flotteEC->nb_vais} {if $flotteEC->end_type == "2"}{$flotteEC->end_planete->nom_alliance} [{$flotteEC->end_planete->galaxie}:{$flotteEC->end_planete->ss}:A]{elseif $flotteEC->end_type == "1"}[{$flotteEC->end_planete}]{elseif $flotteEC->end_type == "3"}[{$flotteEC->end_planete}:A]{else}{$flotteEC->end_planete->nom_planete} [{$flotteEC->end_planete->galaxie}:{$flotteEC->end_planete->ss}:{$flotteEC->end_planete->position}]{/if}
-{include file='game/footer.tpl'} +{include file='game/footer.tpl'} \ No newline at end of file diff --git a/onyx2/tpl/game/flotte2.tpl b/onyx2/tpl/game/flotte2.tpl index 750d705..e21742c 100644 --- a/onyx2/tpl/game/flotte2.tpl +++ b/onyx2/tpl/game/flotte2.tpl @@ -23,10 +23,10 @@

Envoyer

-
+
Temps de déplacement : -
Consomation : -
Complètez les champs ci-dessus
-{include file='game/footer.tpl'} +{include file='game/footer.tpl'} \ No newline at end of file diff --git a/onyx2/tpl/game/menu_joueurs.tpl b/onyx2/tpl/game/menu_joueurs.tpl index a7e0d8f..578040d 100644 --- a/onyx2/tpl/game/menu_joueurs.tpl +++ b/onyx2/tpl/game/menu_joueurs.tpl @@ -27,7 +27,6 @@
  • Armement
  • Défenses
  • Projets expérimentaux
  • -
  • Expansion
  • {/if}
  • @@ -68,4 +67,4 @@
  • Rapports de bug
  • F.A.Q.
  • Déconnexion
  • - + \ No newline at end of file diff --git a/schema.sql b/schema.sql index 096c278..5c7c4c7 100644 --- a/schema.sql +++ b/schema.sql @@ -608,7 +608,7 @@ CREATE TABLE IF NOT EXISTS `planete` ( `isolement` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0', `nom_planete` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', `moral` float NOT NULL DEFAULT 0.5, - `image` tinyint unsigned NOT NULL DEFAULT 0, + `image` tinyint(4) NOT NULL DEFAULT 0, `cases` int(11) NOT NULL DEFAULT 0, `debris_met` bigint(20) NOT NULL DEFAULT 0, `debris_cri` bigint(20) NOT NULL DEFAULT 0,