Пример #1
0
function map_show_types($map, $id, $types)
{
    $html = '';
    foreach ($types as $ptype => $rec) {
        $html .= clb_tag('option', clb_val($ptype, $rec, 'label'), '', array('value' => $ptype));
    }
    return clb_tag('select', '', $html, array('id' => $id, 'name' => $id, 'multiple' => 'multiple', 'size' => min(20, count($types)) + 1, 'onchange' => 'map_refresh(' . $map . ', \'purge\');'));
}
Пример #2
0
function pfind_routes($waypoints, $links, $prop, $type_names)
{
    global $wpdb;
    //convert lat/lng to nearest station(s)
    $metric = clb_val('', $prop, 'units') == 'km';
    $get_steps = clb_val(TRUE, $prop, 'getSteps');
    $get_plyline = clb_val(TRUE, $prop, 'getPolyline');
    $dist_only = clb_val(TRUE, $prop, 'dist_only');
    $trip_meters = 0;
    clb_timing(__LINE__);
    $result = array();
    $result['error'] = 200;
    //start optimistically
    $result['error_str'] = 'no errors';
    $html = '';
    $bounds = array();
    $polyline = '';
    $aoe_data = array();
    $markers = array_fill(0, count($waypoints), FALSE);
    //initialise the markers array with a false for each waypoint
    $marker_path = 'http://chart.apis.google.com/chart?chst=d_map_xpin_letter&chld=pin|%|65BA4A|000000|000000';
    $tab_style = 'margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: silver; border-right-color: silver; border-bottom-color: silver; border-left-color: silver; background-color: rgb(238, 238, 238); border-collapse: collapse; color: rgb(0, 0, 0); width: 100%;';
    $has_route = FALSE;
    //gets set when we have some sort of route between waypoints
    /*
    	****
    	currently the route between waypoints is found, processed and then the next waypoint is handled
    	if there are multiple nodes in an intermediate waypoint then the chosen route to and route from the way point may not pick the same nodes
    	this case could be hanlded by adding a walk step at the beginning of the following step to go between the two chosen nodes
    	or all intermediate routes could be processed and then ones with matching intermedite nodes chosen which would probably be harder to code.
    */
    $orig = FALSE;
    $way_no = 0;
    foreach ($waypoints as $route_no => $sel) {
        $dest = array();
        foreach ($sel as $key => $val) {
            //waypoints can be array(pnum => array(place record)) or array(pnum, pnum), hence the choice below
            $pnum = is_array($val) ? $key : $val;
            //check each pnum and see if it needs to be split into platforms, but not if dist only
            if (!$dist_only && isset($links['stat2plat'][$pnum])) {
                $dest = array_merge($dest, $links['stat2plat'][$pnum]);
            } else {
                $dest[] = $pnum;
            }
        }
        if (clb_count($orig)) {
            $candidates = pfind_steps($orig, $dest, $links, $type_names, $dist_only);
            //<= ****** call to shortest path
            //qlog(__LINE__, $waypoints, count($candidates), $candidates);
            //sift though candidates and choose best
            switch (clb_val('best', $prop, 'opto')) {
                case 'time':
                    $pick_fld = 'duration';
                    break;
                case 'changes':
                    $pick_fld = 'minchanges';
                    break;
                case 'dist':
                    $pick_fld = 'meters';
                    break;
                case 'best':
                default:
                    $pick_fld = 'best';
                    break;
            }
            $pick_rec = FALSE;
            $pick_val = FALSE;
            foreach ($candidates as $no => $option) {
                if ($pick_fld == 'best') {
                    $test = $option['scores']['meters'] + 1000 * $option['scores']['minchanges'];
                } else {
                    $test = $option['scores'][$pick_fld];
                }
                if ($pick_val === FALSE || $test < $pick_val) {
                    $pick_rec = $no;
                    $pick_val = $test;
                }
            }
            if ($pick_rec === FALSE) {
                //no routes found
                $result['error'] = 604;
                $result['error_str'] = 'no connecting routes found';
                $result['Routes'][] = FALSE;
                //maintain place for numbering
            } else {
                $pnum1 = FALSE;
                if (!clb_val(FALSE, $markers, $way_no - 1)) {
                    $place = clb_val(FALSE, $candidates, $pick_rec, 'orig');
                    $pnum1 = clb_val('', $place, 'pnum');
                    $icon = str_replace('%', substr('ABCDEFGHIJKLMNOPQRSTUVWXYZ', $way_no - 1, 1), $marker_path);
                    $markers[$way_no - 1] = array('url' => $icon, 'lat' => clb_val(0, $place, 'lat'), 'lng' => clb_val(0, $place, 'lng'), 'name' => clb_val('', $place, RF_NODES_NAME), 'desc' => clb_val('', $place, RF_NODES_DESC));
                    $ptype = clb_val('', $place, 'ptype');
                    $orig_detials = clb_val('', $type_names, $ptype, 'label') . ': ' . clb_val('', $place, RF_NODES_NAME) . ' / ' . clb_val('', $place, RF_NODES_DESC);
                    if ($get_steps) {
                        $row = '';
                        $row .= clb_tag('td', '', clb_tag('img/', '', '', array('src' => $icon)), array('style' => 'cursor:pointer'));
                        $row .= clb_tag('td', $orig_detials, '', array('style' => 'vertical-align: middle;width: 100%'));
                        $html .= clb_tag('table', '', clb_tag('tbody', '', clb_tag('tr', '', $row, array('style' => 'cursor:pointer'))), array('style' => $tab_style));
                    }
                }
                $has_route = TRUE;
                //signals we have a route to return
                //add the points for this route into the array for the polyline
                if ($get_plyline) {
                    $temp = FALSE;
                    if (function_exists('pline_splice')) {
                        $temp = pline_splice($wpdb, $candidates[$pick_rec]['links'], $pnum1);
                    }
                    //pnum1 added 2/8/2009
                    if (clb_count($temp)) {
                        $aoe_data = $temp;
                    }
                    //array_merge($aoe_data, $temp);
                }
                $steps = $candidates[$pick_rec]['steps'];
                $meters = $candidates[$pick_rec]['scores']['meters'];
                $trip_meters += $meters;
                $summary = $metric ? pfind_kilo($meters) : pfind_miles($meters);
                //string with units
                $place = clb_val(FALSE, $candidates, $pick_rec, 'dest');
                $ptype = clb_val('', $place, 'ptype');
                $dest_detials = clb_val('', $type_names, $ptype, 'label') . ': ' . clb_val('', $place, RF_NODES_NAME) . ' / ' . clb_val('', $place, RF_NODES_DESC);
                $icon = str_replace('%', substr('ABCDEFGHIJKLMNOPQRSTUVWXYZ', $way_no, 1), $marker_path);
                $markers[$way_no] = array('url' => $icon, 'lat' => clb_val(0, $place, 'lat'), 'lng' => clb_val(0, $place, 'lng'), 'name' => clb_val('', $place, RF_NODES_NAME), 'desc' => clb_val('', $place, RF_NODES_DESC));
                $step_list = array();
                if ($get_steps) {
                    $table = '';
                    foreach ($steps as $s => $pt) {
                        $row = '';
                        $row .= clb_tag('td', $s + 1, '', array('style' => 'vertical-align:top;border-top: 1px solid #cdcdcd;padding:0.3em 3px 0.3em 3px;margin: 0px;text-align:right;'));
                        $row .= clb_tag('td', '', clb_val('', $pt, 'desc'), array('style' => 'vertical-align:top;border-top: 1px solid #cdcdcd;padding:0.3em 3px 0.3em 3px;margin: 0px;width:100%;'));
                        $dist = clb_val(0, $pt, 'dist');
                        $dist = $metric ? pfind_kilo($dist) : pfind_miles($dist);
                        $row .= clb_tag('td', '', $dist, array('style' => 'vertical-align:top;border-top: 1px solid #cdcdcd;padding-top:0.3em;padding-right:3px;padding-bottom:0.3em;padding-left:0.5em;margin: 0px;text-align:right;'));
                        $table .= clb_tag('tr', '', $row);
                        $step_meters = clb_val(0, $pt, 'dist');
                        $step_list[] = array('lat' => clb_val(0, $pt, 'lat'), 'lng' => clb_val(0, $pt, 'lng'), 'PolylineIndex' => 0, 'DescriptionHtml' => clb_val('', $pt, 'desc'), 'Distance' => array('meters' => $step_meters, 'miles' => pfind_miles($step_meters, FALSE), 'html' => $metric ? pfind_kilo($meters) : pfind_miles($meters)), 'Duration' => array());
                    }
                    $html .= clb_tag('table', '', clb_tag('tbody', '', $table));
                    //add end marker on each route
                    $row = '';
                    $row .= clb_tag('td', '', clb_tag('img/', '', '', array('src' => $icon)), array('style' => 'cursor:pointer'));
                    $row .= clb_tag('td', $dest_detials, '', array('style' => 'vertical-align: middle;width: 100%'));
                    $html .= clb_tag('table', '', clb_tag('tbody', '', clb_tag('tr', '', $row, array('style' => 'cursor:pointer'))), array('style' => $tab_style));
                }
                $route = array();
                $route['NumSteps'] = count($step_list);
                /*
                	geocodes are Placemark type values with the top level fields: address, AddressDetails, Point
                	we dont have the address details breakdown so just providing the address if we have it and the Point data
                */
                $m = $markers[$route_no - 1];
                $route['StartGeocode'] = array('address' => clb_val('', $m, 'addr'), 'Point' => array('coordinates' => array(clb_val('', $m, 'lat'), clb_val('', $m, 'lng'), 0)));
                $m = $markers[$route_no];
                $route['EndGeocode'] = array('address' => clb_val('', $m, 'addr'), 'Point' => array('coordinates' => array(clb_val('', $m, 'lat'), clb_val('', $m, 'lng'), 0)));
                if (isset($candidates[$no]['EndLatLng'])) {
                    $pt = preg_split('/\\s*,\\s*/', $candidates[$no]['EndLatLng']);
                    $route['EndLatLng'] = array('lat' => clb_val(0, $pt, 0), 'lng' => clb_val(0, $pt, 1));
                } else {
                    $route['EndLatLng'] = $route['EndGeocode']['Point'];
                }
                $route['SummaryHtml'] = $summary;
                $route['Distance'] = array('meters' => $meters, 'miles' => pfind_miles($meters, FALSE), 'html' => $summary);
                $route['Duration'] = array();
                $route['Steps'] = $step_list;
                $result['Routes'][] = $route;
            }
        }
        $orig = $dest;
        $way_no++;
    }
    if ($has_route) {
        if (clb_count($aoe_data) && $get_plyline) {
            $attr = array('color' => clb_val('#0000FF', $prop, 'color'), 'weight' => clb_val(5, $prop, 'stroke'), 'opacity' => clb_val(0.5, $prop, 'opacity'), 'pregran' => TRUE, 'do_bounds' => TRUE, 'max_pts' => 1000, 'calc_len' => FALSE, 'split' => TRUE);
            $batch = FALSE;
            if (function_exists('pline_make')) {
                $batch = pline_make($aoe_data, $attr);
            }
            if (is_array($batch)) {
                $bounds = array_shift($batch);
                //first element of a batch is the bounds
                $polyline = array();
                foreach ($batch as $no => $line) {
                    //dont use the variable $bounds here as we want to keep the value from above
                    $seg_bounds = clb_val(FALSE, $line, 'bounds');
                    if ($seg_bounds) {
                        unset($line['bounds']);
                    }
                    $polyline[] = array('ident' => 'seg' . $no, 'pline' => $line);
                }
                // $txt = clb_json($polyline);
                // qlog(__LINE__, $txt);
            }
            //qlog(__LINE__, count($batch), $polyline);
        }
        $summary = $metric ? pfind_kilo($trip_meters) : pfind_miles($trip_meters);
        //string with units
        $html = clb_tag('div', $summary, '', array('style' => 'text-align:right;padding-bottom:0.3em;')) . $html;
        $result['Bounds'] = $bounds;
        $result['Polylines'] = $polyline;
        $result['html'] = $html;
        $result['NumRoutes'] = 1;
        //routes between waypoints so waypoints-1
        $result['NumGeocodes'] = 2;
        //number of waypoints with coords
        $result['CopyrightsHtml'] = '&copy;' . htmlentities('2008' . ' Logoriph Ltd');
        $result['SummaryHtml'] = $summary;
        $result['Distance'] = array('meters' => $meters, 'miles' => pfind_miles($meters, FALSE), 'html' => $summary);
        $result['Duration'] = array();
        $result['Markers'] = $markers;
        $result['querytime'] = clb_timing('querytime');
        qlog(__LINE__, 'package result', $result['querytime']);
    }
    return $result;
}
Пример #3
0
*/
$result = pfind_service($_REQUEST, $pfind_defs, $editor_types, $p2p_paths);
if ($result['error'] == 604) {
    $_REQUEST['gd'] = 0;
    //turn off distance only
    $_REQUEST['gp'] = 0;
    //turn off polyline
    $_REQUEST['gs'] = 0;
    //turn off steps
    $result = pfind_service($_REQUEST, $pfind_defs, $editor_types, $p2p_paths);
}
switch ($service) {
    case 'javascript':
        $sid = clb_val('', $_REQUEST, 'sid');
        $func = clb_val('mfw_dir_result', $_REQUEST, 'callback');
        $return_data = clb_json($result, "'");
        $callback = $func . '(\'' . $sid . '\',' . $return_data . ');';
        rs_response('application/javascript', $callback, 'UTF-8');
        break;
    case 'json':
        $return_data = json_encode($result);
        rs_response('application/json', $return_data, 'UTF-8');
        break;
    case 'xml':
        $return_data = clb_xml($result, 'RouteFinder');
        rs_response('xml', clb_tag('xml?', '', '', array('version' => '1.0', 'encoding' => 'utf-8')) . clb_tag('responses', '', $return_data), 'UTF-8');
        break;
    default:
        header('x', TRUE, 400);
        //Deliver a 'bad request' response
}
Пример #4
0
 function clb_response($type, $data, $encoding = '')
 {
     @ob_end_clean();
     //should be buffering but @ stops warning if not
     if ($encoding) {
         $encoding = '; charset=' . $encoding;
     }
     $ctype = is_int(strpos($type, '/')) ? $type : 'text/' . $type;
     header('Content-type: ' . $ctype . $encoding, TRUE);
     //true indicates thatprevious content type should be replaced.
     header('Cache-Control: no-cache, must-revalidate');
     // HTTP/1.1
     header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
     // Date in the past
     switch ($type) {
         case 'xml':
             echo clb_tag('xml?', '', '', array('version' => '1.0', 'encoding' => 'utf-8')) . clb_tag('responses', '', $data);
             break;
         case 'html':
             echo '<html><head></head><body>' . $data . '</body></html>';
             break;
         default:
             echo $data;
             break;
     }
     exit(0);
 }
Пример #5
0
function ajax_request()
{
    global $editor_types, $editor_tables;
    $xml = '';
    $msg = '';
    $rec_count = 0;
    $db = new wpdb(DB_USER, DB_PASSWORD, DB_NAME, DB_HOST);
    $pnum = clb_val(FALSE, $_REQUEST, 'pnum');
    if ($new_mark = preg_match('/^b(\\w{7})(\\w{7})/', $pnum, $m)) {
        $_REQUEST['lat'] = hexdec($m[1]) / 100000 - 180;
        $_REQUEST['lng'] = hexdec($m[2]) / 100000 - 180;
        $_REQUEST['coords'] = clb_b64e($_REQUEST['lat']) . clb_b64e($_REQUEST['lng']);
    }
    $ptype = clb_val(FALSE, $_REQUEST, 'ptype');
    //if the ptype is cust, default to the first table and type in the definitions that does or does not have a polyline
    if ($ptype == 'cust' && $new_mark) {
        foreach ($editor_types as $ptype => $spec) {
            if (clb_val(FALSE, $spec, 'polyline') == isset($_REQUEST['polyline'])) {
                break;
            }
        }
    }
    $table = FALSE;
    $prefixes = clb_column($editor_tables, 'prefix');
    if ($pnum && preg_match('/^(\\w+)_\\w+$/', $pnum, $m)) {
        $table = array_search($m[1], $prefixes);
    } else {
        if ($ptype) {
            $table = clb_val(FALSE, $editor_types, $ptype, 'table');
        }
    }
    $spec = clb_val(FALSE, $editor_tables, $table);
    $ajax = clb_val(FALSE, $_REQUEST, 'ajax');
    qlog(__LINE__, '>>>>', $ajax, $pnum, $ptype, $table, $new_mark ? 'new' : 'old');
    //, $spec);
    switch ($ajax) {
        case 'show':
            $sel = FALSE;
            if ($spec) {
                $select = clb_val(FALSE, $spec, 'select');
                $query = 'SELECT ' . clb_join($select, '`') . ' FROM ' . $table . ' WHERE pnum=' . clb_escape($pnum);
                $sel = $db->get_results($query, ARRAY_A);
            }
            //if not found via pnum, try title in each table.
            if (!$sel) {
                foreach ($editor_tables as $table => $spec) {
                    if (($select = clb_val(FALSE, $spec, 'select')) && in_array('title', $select)) {
                        $query = 'SELECT ' . clb_join($select, '`') . ' FROM ' . $table . ' WHERE title like ' . clb_escape($pnum . '%');
                        $sel = $db->get_results($query, ARRAY_A);
                        if ($sel) {
                            break;
                        }
                    }
                }
            }
            if (!$sel) {
                $msg = 'No matches found for: ' . $pnum;
            } else {
                $titles = clb_column($sel, 'title');
                $msg = count($sel) . ' matches found: ' . join(', ', $titles);
                $rec = reset($sel);
                $pnum = clb_val(FALSE, $rec, 'pnum');
                $xml .= clb_tag('response', '', '', array_merge(array('type' => 'centre'), array_intersect_key($rec, array('lat' => 0, 'lng' => 0)))) . "\n";
                $xml .= refesh_marker($db, $table, $pnum);
                $xml .= marker_bubble($db, $spec, $table, $pnum);
            }
            break;
        case 'route_list':
            //shows bubble on station showing list of routes
            $html = '';
            //find the route table and which field(s) hold the stop list
            $route_flds = '';
            foreach ($editor_tables as $route_tab => $info) {
                if ($route_flds = clb_val(FALSE, $info, 'routes')) {
                    break;
                }
            }
            if (!$route_flds) {
                break;
            }
            $route_flds = explode('/', $route_flds);
            //can be more than one field with '/' as a separator
            //build query to get route list
            $select = clb_val(FALSE, $editor_tables, $route_tab, 'select');
            $where = array();
            foreach ($route_flds as $fld) {
                $where[] = ' (`' . $fld . '` LIKE ' . clb_escape('%' . $pnum . '%') . ')';
            }
            $query = 'SELECT ' . clb_join(array_merge($select, $route_flds), '`') . ' FROM ' . $route_tab . ' WHERE ' . join(' OR ', $where);
            $sel = $db->get_results($query, ARRAY_A);
            if (clb_count($sel) == 0) {
                $msg = 'There are no routes for node: ' . $pnum;
            } else {
                $list = '';
                $alt = 0;
                foreach ($sel as $rec) {
                    foreach ($route_flds as $pos => $fld) {
                        $rnum = reset($rec);
                        $route_key = key($rec);
                        $script = 'map_ajax(the_map, \'show_route\', {\'pnum\':\'' . $rnum . '\',\'fld\':\'' . $fld . '\', \'stop\':\'' . $pnum . '\'});';
                        $name = $rnum . ':' . $pos . ': ' . clb_val(FALSE, $rec, 'title');
                        $list .= clb_tag('li', '', clb_tag('a', $name, '', array('onclick' => $script, 'href' => 'javascript:void(0);')), array('class' => 'alt' . $alt++ % 2));
                    }
                }
                $html .= clb_tag('ul', '', $list, array('class' => 'route_list')) . "\n";
                $form = clb_tag('form', '', $html, array('id' => 'info_win', 'action' => '', 'method' => 'get', 'onsubmit' => 'return false;')) . "\n";
                $xml .= clb_tag('response', '', htmlspecialchars($form), array('type' => 'bubble', 'pnum' => $pnum)) . "\n";
            }
            break;
        case 'new_route':
            //create new route
        //create new route
        case 'route_stop':
            //add stop to route
        //add stop to route
        case 'route_unstop':
            //remove stop from route
        //remove stop from route
        case 'show_route':
            //show route
            //		qlog(__LINE__, $table, $pnum, $spec);
            require_once CODE_DIR . 'pline_lib.php';
            //scan tables to find routes
            foreach ($editor_tables as $table => $info) {
                if ($routes = clb_val(FALSE, $info, 'routes')) {
                    break;
                }
            }
            if (!$routes) {
                break;
            }
            //did not find route table
            $routes = explode('/', $routes);
            $route_tab = $table;
            $select = clb_val(FALSE, $editor_tables, $route_tab, 'select');
            $route_key = reset($select);
            $stops = FALSE;
            $new_route = 'new_route' == $ajax;
            if ($new_route) {
                $fld = reset($routes);
                $newstop = $pnum;
                $stopindex = 0;
                $list = '';
                $title = clb_val(FALSE, $_REQUEST, 'title');
                $pnum = new_pnum($db, $table, $route_key);
                $ajax = 'route_stop';
            } else {
                $stopindex = clb_val(FALSE, $_REQUEST, 'stopindex');
                //this only come with route_stop and route_unstop
                $newstop = clb_val(FALSE, $_REQUEST, 'newstop');
                //this only come with route_stop
                $fld = clb_val(FALSE, $_REQUEST, 'fld');
                $select = array_merge($select, $routes);
                //select route record
                $query = 'SELECT ' . clb_join($select, '`') . ' FROM ' . $route_tab . ' WHERE ' . $route_key . '=' . clb_escape($pnum);
                $sel = $db->get_results($query, ARRAY_A);
                $rec = clb_count($sel) ? reset($sel) : FALSE;
                $list = clb_val(FALSE, $rec, $fld);
                $ptype = clb_val(FALSE, $rec, 'ptype');
                $title = clb_val(FALSE, $rec, 'title');
                //if (empty($list) && (reset($routes) == $fld) && ($fld
                if (empty($list)) {
                    $newstop = clb_val(FALSE, $_REQUEST, 'stop');
                    $stopindex = 0;
                    $ajax = 'route_stop';
                }
            }
            if (preg_match_all('/^(\\w+)\\s+(.*)/m', $list, $m)) {
                $stops = $m[1];
            }
            if (in_array($ajax, array('route_stop', 'route_unstop')) && is_numeric($stopindex)) {
                if (!$stops) {
                    $stops = array(FALSE);
                }
                //ensure loop runs at least once
                $new = '';
                foreach ($stops as $i => $stop_pnum) {
                    if ('route_unstop' == $ajax && $i == $stopindex) {
                        continue;
                    }
                    //skip the stop that is to be deleted
                    //add the stop on this line
                    if ($stop_pnum) {
                        $new .= $m[1][$i] . ' ' . trim($m[2][$i]) . "\n";
                    }
                    //add new station if this is the right position
                    if ('route_stop' == $ajax && $i == $stopindex && $newstop) {
                        //find maker table via ptype
                        $table = clb_val(FALSE, $editor_types, $ptype, 'table');
                        $query = 'SELECT lat, lng, pnum, ptype, title FROM ' . $table . ' WHERE pnum=' . clb_escape($newstop);
                        $sel = $db->get_results($query, ARRAY_A);
                        if ($sel) {
                            $new .= $newstop . ' ' . clb_val('', reset($sel), 'title') . "\n";
                        }
                    }
                }
                if (preg_match_all('/^(\\w+)\\s+(.*)/m', $new, $m)) {
                    $stops = $m[1];
                }
                //if forward direction and changing last item update orig, dest and title
                $rename = '';
                if (reset($routes) == $fld && clb_count($stops) <= $stopindex + 2) {
                    $orig = reset($m[2]);
                    $dest = end($m[2]);
                    $rename .= ', title=' . clb_escape($orig . ' - ' . $dest);
                    $rename .= ', orig=' . clb_escape($orig);
                    $rename .= ', dest=' . clb_escape($dest);
                }
                if ($new_route) {
                    $query = 'SELECT area, count(*) AS c FROM ' . $route_tab . ' WHERE ptype=' . clb_escape($ptype) . ' GROUP BY area';
                    $sel = $db->get_results($query, ARRAY_A);
                    $area = is_array($sel) ? clb_val('', reset($sel), 'area') : '';
                    $query = '';
                    $query .= ', ' . $route_key . '=' . clb_escape($pnum);
                    $query .= ', area=' . clb_escape($area);
                    $query .= ', ptype=' . clb_escape($ptype);
                    $query .= ', ' . $fld . '=' . clb_escape($new);
                    $query .= ', created=' . clb_escape(clb_now_utc());
                    $query = 'INSERT INTO ' . $route_tab . ' SET ' . trim($query, ', ') . $rename;
                } else {
                    $query = 'UPDATE ' . $route_tab . ' SET ' . $fld . '=' . clb_escape($new) . $rename . ' WHERE ' . $route_key . '=' . clb_escape($pnum);
                }
                $db->query($query);
            }
            if ($stops) {
                $index = array_search(clb_val(FALSE, $_REQUEST, 'stop'), $stops);
                //index of the stop we opened route from
                if (is_numeric($stopindex)) {
                    $index = Min($stopindex + ($newstop ? 1 : 0), clb_count($stops) - 1);
                }
                //use new index if provided and add one if new stop
                if (preg_match('/^(\\w+)_\\w+$/', reset($stops), $m)) {
                    $table = array_search($m[1], $prefixes);
                    $spec = clb_val(FALSE, $editor_tables, $table);
                    $points = array();
                    $names = array();
                    $pnums = array();
                    $query = 'SELECT lat, lng, pnum, ptype, title FROM ' . $table . ' WHERE pnum IN ' . clb_join($stops, TRUE);
                    $sel = $db->get_results($query, ARRAY_A);
                    //in theory could be multiple stop instances and need to give points in order so loop on $stops and look up record via xref
                    $xref = clb_column($sel, 'pnum');
                    if (clb_count($sel)) {
                        foreach ($stops as $stop_pnum) {
                            $rec = clb_val(FALSE, $sel, array_search($stop_pnum, $xref));
                            $points[] = array($rec['lat'], $rec['lng'], 0);
                            $names[] = str_replace('|', ',', $rec['title']);
                            $pnums[] = $rec['pnum'];
                            $rec['type'] = 'marker';
                            $xml .= clb_tag('response', '', '', $rec) . "\n";
                            $rec_count++;
                        }
                    }
                    foreach ($points as $i => $pt) {
                        if (!is_array($pt)) {
                            unset($points[$i]);
                        }
                    }
                    //remove non points if there are any
                    $line = pline_make($points, array('color' => '#FF0000'));
                    $line['names'] = join('|', $names);
                    $line['pnums'] = join('|', $pnums);
                    if ($line) {
                        $line = clb_join($line, '', '&', '=');
                    }
                    $attr = array('type' => 'route_pline', 'pnum' => $pnum, 'title' => $title, 'fld' => $fld, 'ptype' => $ptype, 'index' => $index);
                    if ($line) {
                        $xml .= clb_tag('response', '', htmlspecialchars($line), $attr) . "\n";
                    }
                }
            } else {
                $msg = 'This route (in this direction) has no stops. ';
            }
            break;
        case 'overlays':
            if (clb_val(FALSE, $_REQUEST, 'zm') < 9) {
                $msg = 'Zoom in to get markers to download.';
            } else {
                $rect = array();
                $rect[] = 'lat >= ' . clb_val(FALSE, $_REQUEST, 'bot');
                $rect[] = 'lng >= ' . clb_val(FALSE, $_REQUEST, 'lft');
                $rect[] = 'lat <= ' . clb_val(FALSE, $_REQUEST, 'top');
                $rect[] = 'lng <= ' . clb_val(FALSE, $_REQUEST, 'rgt');
                $qtypes = preg_split('/;/', clb_val(FALSE, $_REQUEST, 'types'), -1, PREG_SPLIT_NO_EMPTY);
                $tables = array();
                foreach ($qtypes as $ptype) {
                    $tables[clb_val('bad', $editor_types, $ptype, 'table')][] = $ptype;
                }
                if (!count($qtypes)) {
                    $msg = 'No marker types selected.';
                } else {
                    foreach ($tables as $table => $list) {
                        if ($table != 'bad' && count($list)) {
                            $prefix = clb_val(FALSE, $editor_tables, $table, 'prefix');
                            $types = preg_replace('/\\w+_/', '', clb_join($list, TRUE));
                            $query = '';
                            $query .= 'SELECT lat, lng, pnum, ptype, title FROM ' . $table . ' WHERE ';
                            $query .= ' ptype IN ' . $types . ' AND (' . join(' AND ', $rect) . ') ';
                            $sel = $db->get_results($query, ARRAY_A);
                            if (clb_count($sel)) {
                                foreach ($sel as $rec) {
                                    $rec['type'] = 'marker';
                                    if (!in_array($rec['ptype'], $list)) {
                                        $rec['ptype'] = $prefix . '_' . $rec['ptype'];
                                    }
                                    $xml .= clb_tag('response', '', '', $rec) . "\n";
                                    $rec_count++;
                                }
                            }
                        }
                    }
                }
                $msg = $rec_count ? count($sel) . ' markers loaded' : 'No markers found.';
                if ('purge' == clb_val(FALSE, $_REQUEST, 'purge')) {
                    $xml .= clb_tag('response', '', '', array('type' => 'purge')) . "\n";
                }
            }
            break;
        case 'saveline':
            require_once CODE_DIR . 'pline_lib.php';
            //fall through
        //fall through
        case 'save':
            //no real validation so just save and close
            if (!$spec) {
                $msg = 'could not identify the marker type.';
                break;
            }
            //('polyline'=>'line', 'select'=>' lat, lng, pnum, ptype, title, line, aoe_data')
            if ($new_mark) {
                $pnum = new_pnum($db, $table);
            }
            //get field names and types
            $def = array();
            $sel = $db->get_results('describe ' . $table, ARRAY_A);
            foreach ($sel as $rec) {
                $def[$rec['Field']] = $rec['Type'];
            }
            /*
            	normally save line is handled by the normal save 
            	but if we are saving a cut line, we need to save off the first part and 
            	then use the normal save to create the latter part as a new record
            	dont cut on first or last point of line
            */
            $points = FALSE;
            if ('saveline' == $ajax) {
                $points = pline_pts_arr(clb_val(FALSE, $_REQUEST, 'polyline'));
                //the rest of this is only for cutting a line
                if (($cut = clb_val(FALSE, $_REQUEST, 'cut')) && $cut + 1 < clb_count($points)) {
                    $first = array_slice($points, 0, $cut + 1);
                    //keep points up to and including cut
                    $points = array_slice($points, $cut);
                    //reduce points on and after cut for new record
                    $query = save_line_query($first, $spec);
                    $query .= '`' . 'lat' . '`=' . clb_escape($_REQUEST['lat']) . ',';
                    $query .= '`' . 'lng' . '`=' . clb_escape($_REQUEST['lng']) . ',';
                    $query .= '`' . 'end1' . '`=' . clb_escape($_REQUEST['end1']) . ',';
                    //adjusts mid point
                    $query .= '`' . 'end2' . '`=' . clb_escape($_REQUEST['end2']) . ',';
                    if ($new_mark) {
                        $query .= '`' . 'pnum' . '`=' . clb_escape($pnum) . ',';
                        $query .= '`' . 'ptype' . '`=' . clb_escape($ptype) . ',';
                        if (isset($def['created'])) {
                            $query .= '`' . 'created' . '`=' . clb_escape(clb_now_utc()) . ',';
                        }
                        $query = 'INSERT INTO ' . $table . ' SET ' . trim($query, ', ');
                    } else {
                        $query = 'UPDATE ' . $table . ' SET ' . trim($query, ', ') . ' WHERE pnum=' . clb_escape($pnum);
                    }
                    $res = $db->query($query);
                    $xml .= refesh_marker($db, $table, $pnum, $pnum);
                    unset($_REQUEST['pnum']);
                    //clear this so that the new marker does not remove the repositioned marker
                    $pnum = new_pnum($db, $table);
                    //new pnum for marker
                    $new_mark = TRUE;
                }
            }
            $query = '';
            if ('saveline' == $ajax && is_array($points)) {
                $query .= save_line_query($points, $spec);
            }
            foreach ($def as $fld => $type) {
                switch ($fld) {
                    case 'pnum':
                        if ($new_mark) {
                            $query .= '`' . $fld . '`=' . clb_escape($pnum) . ',';
                        }
                        break;
                    case 'created':
                        if ($new_mark) {
                            $query .= '`' . $fld . '`=' . clb_escape(clb_now_utc()) . ',';
                        }
                        break;
                    case 'ptype':
                        $query .= '`' . $fld . '`=' . clb_escape($ptype) . ',';
                        break;
                    default:
                        if (isset($_REQUEST[$fld])) {
                            $query .= '`' . $fld . '`=' . clb_escape($_REQUEST[$fld]) . ',';
                        }
                        break;
                }
            }
            qlog(__LINE__, $query);
            if ($new_mark) {
                $query = 'INSERT INTO ' . $table . ' SET ' . trim($query, ', ');
            }
            if (!$new_mark) {
                $query = 'UPDATE ' . $table . ' SET ' . trim($query, ', ') . ' WHERE pnum=' . clb_escape($pnum);
            }
            $res = $db->query($query);
            //when saving a marker remember the type to be used as the default for next new marker.
            $name = clb_val(FALSE, $spec, 'polyline') ? 'type_line' : 'type_mark';
            $xml .= clb_tag('response', '', $ptype, array('type' => 'state', 'pnum' => $name)) . "\n";
            //pnum is the "id" name is the "id" of the state we are setting
            $xml .= refesh_marker($db, $table, $pnum, clb_val(FALSE, $_REQUEST, 'pnum'));
            //want to fall through to show a bubble if saving a line
            //so break when either condition fails
            if ('saveline' == $ajax) {
                $xml .= marker_bubble($db, $spec, $table, $pnum);
            }
            break;
        case 'bubble':
            if (!$spec || !$pnum) {
                $msg = 'could not identify the marker type.';
                break;
            }
            $xml .= marker_bubble($db, $spec, $table, $pnum);
            break;
        case 'delete':
            $query = 'DELETE FROM ' . $table . ' WHERE pnum=' . clb_escape($pnum);
            $sel = $db->query($query);
            //remove old marker, which closes info box
            $xml .= clb_tag('response', '', '', array('type' => 'remove', 'pnum' => $_REQUEST['pnum'])) . "\n";
            break;
    }
    if ($ajax) {
        if ($msg) {
            $xml .= clb_tag('response', $msg, '', array('type' => 'info')) . "\n";
        }
        if (!$xml) {
            $xml .= clb_tag('response', '', '', array('type' => 'null')) . "\n";
        }
        // qlog(__LINE__, $xml);
        clb_response('xml', $xml);
    }
}
Пример #6
0
            }
        }
        inspect_data($path, 1);
    }
    echo clb_tag('pre', '', clb_tag('code', $cmd . 'p2p'));
    echo clb_tag('h3', 'Interchanges Process');
    echo clb_tag('p', 'This process looks at stations/stops accessed by routes (as given in the stops file) and determines which nodes are
	close but not connected.  It then creates walk links if the nodes are within 400m of each other.  This process relies on the p2p file 
	so walk links cannot be generated before the p2p, but the p2p file needs to be regenerated after running this process.');
    if (!is_file($p2p_path)) {
        echo clb_tag('p', 'There is no p2p file, you cannot run this process until it exists', '', array('style' => 'color:red;'));
    } else {
        $time = $test = clb_escape(clb_now_utc(filemtime($p2p_path)));
        if (is_file($stops_path)) {
            $test = clb_escape(clb_now_utc(filemtime($stops_path)));
        }
        //check station to station links of given types
        $query = 'SELECT 1 FROM ' . RF_LINKS_FROM . ' WHERE ' . RF_LINKS_MODIFIED . ' > ' . $time . ' AND ' . RF_LINKS_TYPE . ' IN ' . clb_join($node_types, TRUE);
        $links = $wpdb->get_results($query, ARRAY_A);
        if ($time < $test) {
            echo clb_tag('p', 'The stops file is more recent than this file and this file should be regenerated.', '', array('style' => 'color:red;'));
        } else {
            if (clb_count($links) > 0) {
                echo clb_tag('p', clb_count($links) . ' station to statio links have been added or updates so this should be rebuilt.', '', array('style' => 'color:#f1a629;'));
            } else {
                echo clb_tag('p', 'This file seems up to date', '', array('style' => 'color:green;'));
            }
        }
    }
    echo clb_tag('pre', '', clb_tag('code', $cmd . 'walk'));
}
Пример #7
0
    db_close();
    exit;
} else {
    if ($path) {
        clb_timing(__LINE__);
        $data = file_get_contents($path, FILE_BINARY);
        clb_timing('load');
        $map = clb_blob_dec($data);
        qpre(clb_timing('decode'), 'count', count($map, 1));
        qpre('file content length/array', $path, strlen($data), $map);
    }
}
db_close();
$base = clb_make_url() . '?m=';
echo clb_tag('p', '', clb_tag('a', 'near', '', array('href' => $base . 'near')));
echo clb_tag('p', '', clb_tag('a', 'raw', '', array('href' => $base . 'raw')));
echo clb_tag('p', '', clb_tag('a', 'stops', '', array('href' => $base . 'stops')));
echo clb_tag('p', '', clb_tag('a', 'links', '', array('href' => $base . 'links')));
echo clb_tag('p', '', clb_tag('a', 'p2p', '', array('href' => $base . 'p2p')));
echo clb_tag('p', '', clb_tag('a', 'interchange', '', array('href' => $base . 'interchange')));
echo clb_tag('p', '', clb_tag('a', 'check_raw_ends', '', array('href' => $base . '7')));
echo clb_tag('p', '', clb_tag('a', 'hardcoded test case', '', array('href' => $base . '8')));
echo clb_tag('p', '', clb_tag('a', 'audit of tyube stops', '', array('href' => $base . '9')));
echo clb_tag('p', '', clb_tag('a', 'hardcoded tests for specific short paths', '', array('href' => $base . '10')));
echo clb_tag('p', '', clb_tag('a', 'arrays connecting nodes to raw segs', '', array('href' => $base . '11')));
echo clb_tag('p', '', clb_tag('a', 'hardcoded insert of link record', '', array('href' => $base . '12')));
echo clb_tag('p', '', clb_tag('a', 'hardcoded test', '', array('href' => $base . 'test')));
?>
<pre>
/usr/local/php5/bin/php -f ~/Sites/bristolstreets/admin/pathinspector.php
</pre>