Changes in / [20:30]

Show
Ignore:
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • /kladr/addr_suggest.php

    r20 r29  
    88require_once('include/JsHttpRequest.php'); 
    99 
    10 require_once('classes/region.class.php'); 
    11 require_once('classes/zone.class.php'); 
    12 require_once('classes/city.class.php'); 
    13 require_once('classes/settlement.class.php'); 
    14 require_once('classes/street.class.php'); 
    15  
    1610// ------------------------------------------------------------------------- 
    1711$JsHttpRequest =& new JsHttpRequest('utf-8'); 
    1812$database  = new database($config_db_host,$config_db_user,$config_db_pass,$config_db_name,''); 
    19 $tbRegions = new tbRegion("regions", "id", $database); 
    20 $tbZones = new tbZone("zones", "id", $database); 
    21 $tbCities = new tbCity("cities", "id", $database); 
    22 $tbSettlements = new tbSettlement("settlements", "id", $database); 
    23 $tbStreets = new tbStreet("streets", "id", $database); 
    2413 
    2514// ------------------------------------------------------------------------- 
    2615 
    2716$task = mosGetParam($_REQUEST,'task',''); 
     17$value = mosGetParam($_REQUEST, 'value', ''); 
    2818$region = mosGetParam($_REQUEST,'region',''); 
    2919$zone = mosGetParam($_REQUEST,'zone',''); 
     
    3222$street = mosGetParam($_REQUEST,'street',''); 
    3323 
     24$value = ($value=="" ? 0 : str_replace("'", "''", $value)); 
    3425$zone = ($zone=="" ? 0 : str_replace("'", "''", $zone)); 
    3526$region = ($region=="" ? 0 : str_replace("'", "''", $region)); 
     
    3930 
    4031switch($task) { 
    41     case 'suggestRegion': 
    42         $res = $tbRegions->suggest($region); 
    43         $_RESULT = array( 
    44             "regions" => $res 
    45         ); 
    46     break; 
    47     case 'suggestZone': 
    48         $res = $tbZones->suggest($region, $zone); 
    49         $_RESULT = array( 
    50             "zones" => $res 
    51         ); 
    52     break; 
    53     case 'suggestCity': 
    54         $res = $tbCities->suggest($region, $zone, $city); 
    55         $_RESULT = array( 
    56             "cities" => $res 
    57         ); 
    58     break; 
    59     case 'suggestSettlement': 
    60         $res = $tbSettlements->suggest($region, $zone, $city, $settlement); 
    61         $_RESULT = array( 
    62             "settlements" => $res 
    63         ); 
    64     break; 
    65     case 'suggestStreet': 
    66         $res = $tbStreets->suggest($region, $zone, $city, $settlement, $street); 
    67         $_RESULT = array( 
    68             "streets" => $res 
    69         ); 
     32    case 'suggest': 
     33        if ($settlement != 0 && $street == 0) { 
     34            // определяем улицу 
     35            $where_q = "WHERE name LIKE '$value%' AND parentSettlement = '$settlement'"; 
     36            $query = "SELECT temp.name, temp.id, types.name AS type, 4 AS level FROM ". 
     37                     "    (SELECT name, id, type FROM streets $where_q LIMIT 10) AS temp ". 
     38                     "        INNER JOIN types ON temp.type = types.id) ". 
     39                     "ORDER BY name LIMIT 10"; 
     40                $database->setQuery($query); 
     41                $res = $database->loadObjectList(); 
     42        } else if ($city != 0 && $settlement == 0 && $street == 0) { 
     43            // определяем поселение 
     44            $where_q = "WHERE name LIKE '$value%' AND parentCity = '$city'"; 
     45            $query = "SELECT temp.name, temp.id, types.name AS type, 3 AS level FROM ". 
     46                     "    (SELECT name, id, type FROM settlements $where_q LIMIT 10) AS temp ". 
     47                     "        INNER JOIN types ON temp.type = types.id ". 
     48                     "ORDER BY name LIMIT 10"; 
     49                $database->setQuery($query); 
     50                $res = $database->loadObjectList(); 
     51        } else if ($zone !=0 && $city == 0 && $settlement == 0 && $street == 0) { 
     52            // определяем город 
     53            $where_q = "WHERE name LIKE '$value%' AND parentZone = '$zone'"; 
     54            $query = "(SELECT temp.name, temp.id, types.name AS type, 2 AS level FROM ". 
     55                     "    (SELECT name, id, type FROM cities $where_q LIMIT 10) AS temp ". 
     56                     "        INNER JOIN types ON temp.type = types.id) ". 
     57                     "UNION ". 
     58                     "(SELECT temp.name, temp.id, types.name AS type, 3 AS level FROM ". 
     59                     "    (SELECT name, id, type FROM settlements $where_q LIMIT 10) AS temp ". 
     60                     "        INNER JOIN types ON temp.type = types.id) ". 
     61                     "ORDER BY name LIMIT 10"; 
     62                $database->setQuery($query); 
     63                $res = $database->loadObjectList(); 
     64        } else if ($region !=0 && $zone ==0 && $city ==0 && $settlement ==0 && $street ==0) { 
     65            // определяем район (или город или поселок, если Москва,Питер) 
     66            $where_q1 = "WHERE name LIKE '$value%' AND parent = '$region'"; 
     67            $where_q2 = "WHERE name LIKE '$value%' AND parentRegion = '$region' AND parentZone=0"; 
     68            $where_q3 = "WHERE name LIKE '$value%' AND parentRegion = '$region' AND parentZone=0 AND parentCity=0"; 
     69            $query = "(SELECT temp.name, temp.id, types.name AS type, 1 AS level FROM ". 
     70                     "    (SELECT name, id, type FROM zones $where_q1 LIMIT 10) AS temp ". 
     71                     "        INNER JOIN types ON temp.type = types.id) ". 
     72                     "UNION ". 
     73                     "(SELECT temp.name, temp.id, types.name AS type, 2 AS level FROM ". 
     74                     "    (SELECT name, id, type FROM cities $where_q2 LIMIT 10) AS temp ". 
     75                     "        INNER JOIN types ON temp.type = types.id) ". 
     76                     "UNION ". 
     77                     "(SELECT temp.name, temp.id, types.name AS type, 3 AS level FROM ". 
     78                     "    (SELECT name, id, type FROM settlements $where_q3 LIMIT 10) AS temp ". 
     79                     "        INNER JOIN types ON temp.type = types.id) ". 
     80                     "ORDER BY name LIMIT 10"; 
     81                $database->setQuery($query); 
     82                $res = $database->loadObjectList(); 
     83        } else if ($region ==0 && $zone ==0 && $city ==0 && $settlement == 0 && $street == 0) { 
     84            // определяем субъект 
     85            $where_q = "WHERE name LIKE '$value%'"; 
     86            $query = "SELECT temp.name, temp.id, types.name AS type, 0 AS level FROM ". 
     87                     "    (SELECT name, id, type FROM regions $where_q LIMIT 10) AS temp ". 
     88                     "        INNER JOIN types ON temp.type = types.id ". 
     89                     "ORDER BY name LIMIT 10"; 
     90                $database->setQuery($query); 
     91                $res = $database->loadObjectList(); 
     92        } 
     93         
     94        $_RESULT = $res; 
    7095    break; 
    7196} 
  • /kladr/index.html

    r18 r30  
    99<body> 
    1010    <table border="0" cellpadding="3" cellspacing="2"> 
    11         <tr><td>Region:</td><td><input type="text" id="kladr_region" size="40" /></td><td><div id="kladr_regionType"></div></td></tr> 
    12         <tr><td>Zone:</td><td><input type="text" id="kladr_zone" size="40" /></td><td><div id="kladr_zoneType"></div></td></tr> 
    13         <tr><td>City:</td><td><input type="text" id="kladr_city" size="40" /></td><td><div id="kladr_cityType"></div></td></tr> 
    14         <tr><td>Settlement:</td><td><input type="text" id="kladr_settlement" size="40" /></td><td><div id="kladr_settlementType"></div></td></tr>        
    15         <tr><td>Street:</td><td><input type="text" id="kladr_street" size="40" /></td><td><div id="kladr_streetType"></div></td></tr> 
     11        <tr><td>1</td><td><input type="text" id="kladr_0" size="40" /></td><td></td></tr> 
     12        <tr><td>2</td><td><input type="text" id="kladr_1" size="40" /></td><td></td></tr> 
     13        <tr><td>3</td><td><input type="text" id="kladr_2" size="40" /></td><td></td></tr> 
     14        <tr><td>4</td><td><input type="text" id="kladr_3" size="40" /></td><td></td></tr> 
     15        <tr><td>5</td><td><input type="text" id="kladr_4" size="40" /></td><td></td></tr> 
     16        <tr><td>6</td><td><input type="text" id="kladr_5" size="40" /></td><td></td></tr>        
    1617    </table> 
    1718</body> 
  • /kladr/kladr/addr_suggest.js

    r20 r29  
     1REQUEST_INTERVAL = 200; 
    12/* Autosuggest Textbox written by Nicholas C. Zakas 
    23   Taked from http://www.webreference.com/programming/javascript/ncz/ */ 
     
    4142    this.currentNodes = []; 
    4243    this.selectedNode = null; 
     44    this.pressTimer = null; 
    4345    //initialize the control 
    4446    this.init(); 
     
    179181 */ 
    180182AutoSuggestControl.prototype.handleKeyUp = function (oEvent /*:Event*/) { 
     183    var oThis = this; 
     184    function onTimer() { 
     185        oThis.provider.requestSuggestions(oThis, false); 
     186    } 
    181187    var iKeyCode = oEvent.keyCode 
    182188    //for backspace (8) and delete (46), shows suggestions without typeahead 
    183189    if (iKeyCode == 8 || iKeyCode == 46) { 
    184190        this.selectedNode = null; 
    185         this.provider.requestSuggestions(this, false); 
    186          
     191        clearTimeout(this.requestTimer); 
     192        this.cur = -1; 
     193        this.requestTimer = setTimeout(onTimer, REQUEST_INTERVAL); 
    187194    //make sure not to interfere with non-character keys 
    188195    } else if (iKeyCode>0 && iKeyCode < 32 || (iKeyCode >= 33 && iKeyCode < 46) || (iKeyCode >= 112 && iKeyCode <= 123)) { 
     
    190197//      alert(iKeyCode) 
    191198    } else { 
     199        clearTimeout(this.requestTimer); 
     200        this.cur = -1; 
     201        this.requestTimer = setTimeout(onTimer, REQUEST_INTERVAL); 
    192202        //request suggestions from the suggestion provider with typeahead 
    193         this.selectedNode = null;         
    194         this.provider.requestSuggestions(this, true); 
     203        this.selectedNode = null; 
    195204    } 
    196205}; 
     
    367376    //check for support of typeahead functionality 
    368377    if (this.textbox.createTextRange || this.textbox.setSelectionRange){ 
    369         var iLen = this.textbox.value.length;  
    370         this.textbox.value = sSuggestion;  
     378        var iLen = this.textbox.value.length; 
     379        this.textbox.value = sSuggestion; 
    371380        this.selectRange(iLen, sSuggestion.length); 
    372381    } 
     
    377386var EFIO_SERVER = "http://www.kladr.org.ru/addr_suggest.php"; 
    378387 
    379 function RegionSuggestions() {} 
    380 RegionSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 
    381     var sendValue = autoControl.textbox.value; 
    382     var req = { 
    383         task: "suggestRegion", 
    384         region: sendValue 
    385     }; 
    386     JsHttpRequest.query( 
    387         EFIO_SERVER, req, function(result, errors) { 
    388                 if (result && result.regions) { 
    389                 if (autoControl.textbox.value == sendValue) { 
    390                     autoControl.autosuggest(result.regions, false); 
    391                 } 
    392             }            
    393             }, 
    394             false 
    395         ); 
    396 
    397  
    398 function ZoneSuggestions(parentRegion) { 
    399     this.parentRegion = parentRegion; 
    400 
    401 ZoneSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 
     388function AddressSuggestions(group) { 
     389    this.group = group; 
     390
     391AddressSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 
    402392    var oThis = this; 
    403393    var sendValue = autoControl.textbox.value; 
    404     var req = { 
    405         task: "suggestZone", 
    406         zone: sendValue 
    407     }; 
    408     if (this.parentRegion.selectedNode) { 
    409         req.region = this.parentRegion.selectedNode.id;  
    410     } 
    411      
    412     // Если поменялось поле региона, кэш очищается 
    413     if (this.lastReq) 
    414         if (req.region != this.lastReq.region) JsHttpRequest.CACHE = {}; 
    415  
    416     JsHttpRequest.query( 
    417         EFIO_SERVER, req, function(result, errors) { 
    418                 if (result && result.zones) { 
    419                 if (autoControl.textbox.value == sendValue) 
    420                     autoControl.autosuggest(result.zones, false); 
    421                     oThis.lastReq = req; 
    422             }            
    423             }, 
    424             false 
    425         ); 
    426 
    427  
    428 function CitySuggestions(parentRegion, parentZone) { 
    429     this.parentRegion = parentRegion; 
    430     this.parentZone = parentZone; 
    431 
    432 CitySuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 
    433     var oThis = this; 
    434     var sendValue = autoControl.textbox.value; 
    435     var req = { 
    436         task: "suggestCity", 
    437         city: sendValue 
    438     }; 
    439      
    440     if (this.parentRegion.selectedNode) req.region = this.parentRegion.selectedNode.id;  
    441     if (this.parentZone.selectedNode) req.zone = this.parentZone.selectedNode.id;  
    442  
    443     // Если поменялись поля региона или области, кэш очищается 
    444     if (this.lastReq) 
    445         if (req.region != this.lastReq.region || req.zone != this.lastReq.zone) 
    446             JsHttpRequest.CACHE = {}; 
    447              
    448     JsHttpRequest.query( 
    449         EFIO_SERVER, req, function(result, errors) { 
    450                 if (result && result.cities) { 
    451                 if (autoControl.textbox.value == sendValue) { 
    452                     autoControl.autosuggest(result.cities, false); 
    453                     oThis.lastReq = req; 
    454                 } 
    455             }            
    456             }, 
    457             false 
    458         ); 
    459 
    460  
    461 function SettlementSuggestions(parentRegion, parentZone, parentCity) { 
    462     this.parentRegion = parentRegion; 
    463     this.parentZone = parentZone; 
    464     this.parentCity = parentCity; 
    465 
    466 SettlementSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 
    467     var oThis = this; 
    468     var sendValue = autoControl.textbox.value; 
    469     var req = { 
    470         task: "suggestSettlement", 
    471         settlement: sendValue 
    472     }; 
    473      
    474     if (this.parentRegion.selectedNode) req.region = this.parentRegion.selectedNode.id;  
    475     if (this.parentZone.selectedNode) req.zone = this.parentZone.selectedNode.id;  
    476     if (this.parentCity.selectedNode) req.city = this.parentCity.selectedNode.id; 
    477  
    478     // Если поменялись поля региона или области, кэш очищается 
     394    var req = { task: "suggest", value: sendValue }; 
     395    var parent = this.group.getParent(autoControl); 
     396    for (t in parent) req[t] = parent[t];  // add all properties in request 
     397 
    479398    if (this.lastReq) 
    480399        if (req.region != this.lastReq.region || 
    481400            req.zone != this.lastReq.zone || 
    482             req.city != this.lastReq.city) 
    483                 JsHttpRequest.CACHE = {}; 
    484              
    485     JsHttpRequest.query( 
    486         EFIO_SERVER, req, function(result, errors) { 
    487                 if (result && result.settlements) { 
    488                 if (autoControl.textbox.value == sendValue) { 
    489                     autoControl.autosuggest(result.settlements, false); 
    490                     oThis.lastReq = req; 
    491                 } 
    492             }            
    493             }, 
    494             false 
    495         ); 
    496 } 
    497  
    498 function StreetSuggestions(parentRegion, parentZone, parentCity, parentSettlement) { 
    499     this.parentRegion = parentRegion; 
    500     this.parentZone = parentZone; 
    501     this.parentCity = parentCity; 
    502     this.parentSettlement = parentSettlement;     
    503 } 
    504 StreetSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { 
    505     var oThis = this; 
    506     var sendValue = autoControl.textbox.value; 
    507     var req = { 
    508         task: "suggestStreet", 
    509         street: sendValue 
    510     }; 
    511      
    512     if (this.parentRegion.selectedNode) req.region = this.parentRegion.selectedNode.id;  
    513     if (this.parentZone.selectedNode) req.zone = this.parentZone.selectedNode.id;  
    514     if (this.parentCity.selectedNode) req.city = this.parentCity.selectedNode.id; 
    515     if (this.parentSettlement.selectedNode) req.settlement = this.parentSettlement.selectedNode.id; 
    516  
    517     if (this.lastReq) 
    518         if (req.region != this.lastReq.region || 
    519             req.zone != this.lastReq.zone || 
    520             req.city != this.lastReq.city || 
    521401            req.settlement != this.lastReq.settlement) 
    522402                JsHttpRequest.CACHE = {}; 
     
    524404    JsHttpRequest.query( 
    525405        EFIO_SERVER, req, function(result, errors) { 
    526                 if (result && result.streets) { 
     406                if (result) { 
    527407                if (autoControl.textbox.value == sendValue) { 
    528                     autoControl.autosuggest(result.streets, false); 
     408                    autoControl.autosuggest(result, bTypeAhead); 
    529409                    oThis.lastReq = req; 
    530410                } 
     
    543423                 c==45 || c == 39    ||  // - ' 
    544424                 c==1105 || c==1025  ||  // ё, Ё 
     425                 c==32               ||  // space 
    545426                 cc==9               ||  // tab 
    546427                 cc==0);                  // special symbols 
    547428} 
     429 
     430function KladrGroup() { 
     431    this.inputs = []; 
     432} 
     433KladrGroup.prototype.add = function(c) { 
     434    this.inputs.push(c); 
     435} 
     436KladrGroup.prototype.getParent = function(input) { 
     437    var res = []; 
     438    var p = this.inputs.indexOf(input); 
     439    if (p==0 || p==-1) return null; 
     440    var cn = this.inputs[p-1].selectedNode; 
     441    if (!cn) return null; 
     442    switch (cn.level) { 
     443        case "0": 
     444            return {region:cn.id}; 
     445        case "1": 
     446            return {zone:cn.id}; 
     447        case "2": 
     448            return {city:cn.id}; 
     449        case "3": 
     450            return {settlement:cn.id}; 
     451        case "4": 
     452            return {street:cn.id}; 
     453    } 
     454} 
    548455// ---------------------------------------------------------------------------- 
    549456window.onload = function () { 
    550     var regionInput = document.getElementById("kladr_region"); 
    551     var zoneInput = document.getElementById("kladr_zone"); 
    552     var cityInput = document.getElementById("kladr_city"); 
    553     var settlementInput = document.getElementById("kladr_settlement"); 
    554     var streetInput = document.getElementById("kladr_street"); 
    555     var region = new AutoSuggestControl(regionInput, new RegionSuggestions, kladrFilter); 
    556     var zone = new AutoSuggestControl(zoneInput, new ZoneSuggestions(region), kladrFilter); 
    557     var city = new AutoSuggestControl(cityInput, new CitySuggestions(region, zone), kladrFilter); 
    558     var settlement = new AutoSuggestControl(settlementInput, new SettlementSuggestions(region, zone, city), kladrFilter); 
    559     var street = new AutoSuggestControl(streetInput, new StreetSuggestions(region, zone, city, settlement), kladrFilter);     
    560 
     457    kladrGroup = new KladrGroup; 
     458    var f0Input = document.getElementById("kladr_0"); 
     459    var f1Input = document.getElementById("kladr_1"); 
     460    var f2Input = document.getElementById("kladr_2"); 
     461    var f3Input = document.getElementById("kladr_3"); 
     462     
     463    var f0 = new AddressSuggestions(kladrGroup); 
     464    var f1 = new AddressSuggestions(kladrGroup); 
     465    var f2 = new AddressSuggestions(kladrGroup); 
     466    var f3 = new AddressSuggestions(kladrGroup); 
     467 
     468    kladrGroup.add(new AutoSuggestControl(f0Input, f0, kladrFilter)); 
     469    kladrGroup.add(new AutoSuggestControl(f1Input, f1, kladrFilter)); 
     470    kladrGroup.add(new AutoSuggestControl(f2Input, f2, kladrFilter)); 
     471    kladrGroup.add(new AutoSuggestControl(f3Input, f3, kladrFilter)); 
     472