| 1 |
var KLADR_SERVER = "http://kladr.org.ru/addr_suggest.php"; |
|---|
| 2 |
|
|---|
| 3 |
function AddressSuggestions() {} |
|---|
| 4 |
AddressSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) { |
|---|
| 5 |
var oThis = this; |
|---|
| 6 |
var sendValue = autoControl.textbox.value; |
|---|
| 7 |
var req = { task: "suggest", value: sendValue }; |
|---|
| 8 |
var parent = autoControl.group.getParent(autoControl); |
|---|
| 9 |
for (t in parent) req[t] = parent[t]; // add all properties in request |
|---|
| 10 |
|
|---|
| 11 |
if (this.lastReq) |
|---|
| 12 |
if (req.region != this.lastReq.region || |
|---|
| 13 |
req.zone != this.lastReq.zone || |
|---|
| 14 |
req.settlement != this.lastReq.settlement) |
|---|
| 15 |
JsHttpRequest.CACHE = {}; |
|---|
| 16 |
|
|---|
| 17 |
if (!autoControl.needAutocomplete()) return; |
|---|
| 18 |
JsHttpRequest.query( |
|---|
| 19 |
KLADR_SERVER, req, function(result, errors) { |
|---|
| 20 |
if (result) { |
|---|
| 21 |
if (autoControl.textbox.value == sendValue) { |
|---|
| 22 |
if (result.level > 4) { |
|---|
| 23 |
autoControl.selectedNode = result; |
|---|
| 24 |
autoControl.showInputs(); |
|---|
| 25 |
} else { |
|---|
| 26 |
autoControl.autosuggest(result, bTypeAhead); |
|---|
| 27 |
oThis.lastReq = req; |
|---|
| 28 |
} |
|---|
| 29 |
} |
|---|
| 30 |
} |
|---|
| 31 |
}, |
|---|
| 32 |
false |
|---|
| 33 |
); |
|---|
| 34 |
} |
|---|
| 35 |
AddressSuggestions.prototype.fieldToString = function(s) { |
|---|
| 36 |
if (s.level<5) return s.name + " (" + s.type + ")"; |
|---|
| 37 |
else return s.name + " (" + s.type + ", " + s._index + ")"; |
|---|
| 38 |
} |
|---|
| 39 |
|
|---|
| 40 |
function KladrGroup() { |
|---|
| 41 |
this.inputs = []; |
|---|
| 42 |
this.titles = []; |
|---|
| 43 |
this.correct = null; |
|---|
| 44 |
} |
|---|
| 45 |
|
|---|
| 46 |
KladrGroup.prototype.check = function() { |
|---|
| 47 |
var oThis = this; |
|---|
| 48 |
var index = this.getIndex(); |
|---|
| 49 |
var bId = this.getBuildingId(); |
|---|
| 50 |
var sId = this.getStreetId(); |
|---|
| 51 |
var req = { |
|---|
| 52 |
task: "checkIndex", |
|---|
| 53 |
userIndex: index, |
|---|
| 54 |
buildingId: bId, |
|---|
| 55 |
streetId: sId |
|---|
| 56 |
}; |
|---|
| 57 |
oThis.correct = 2; // идет проверка |
|---|
| 58 |
JsHttpRequest.query( |
|---|
| 59 |
KLADR_SERVER, req, function(result, errors) { |
|---|
| 60 |
if (result && result.correct) { |
|---|
| 61 |
oThis.correct = 1; |
|---|
| 62 |
oThis.getIndexInput().textbox.className = ""; |
|---|
| 63 |
} |
|---|
| 64 |
else { |
|---|
| 65 |
oThis.correct = 0; |
|---|
| 66 |
oThis.getIndexInput().textbox.className = "blocked"; |
|---|
| 67 |
} |
|---|
| 68 |
}, |
|---|
| 69 |
false |
|---|
| 70 |
); |
|---|
| 71 |
} |
|---|
| 72 |
|
|---|
| 73 |
KladrGroup.prototype.getIndexInput = function() { |
|---|
| 74 |
for (var i=0;i<this.inputs.length;i++) { |
|---|
| 75 |
if (this.inputs[i].selectedNode && |
|---|
| 76 |
this.inputs[i].selectedNode.level == 5) break; // дом |
|---|
| 77 |
} |
|---|
| 78 |
if (i<this.inputs.length-1) |
|---|
| 79 |
return this.inputs[i+1]; |
|---|
| 80 |
return null; |
|---|
| 81 |
} |
|---|
| 82 |
|
|---|
| 83 |
KladrGroup.prototype.getIndex = function() { |
|---|
| 84 |
for (var i=0;i<this.inputs.length;i++) { |
|---|
| 85 |
if (this.inputs[i].selectedNode && |
|---|
| 86 |
this.inputs[i].selectedNode.level == 5) break; // дом |
|---|
| 87 |
} |
|---|
| 88 |
if (i<this.inputs.length-1) |
|---|
| 89 |
return this.inputs[i+1].textbox.value; |
|---|
| 90 |
return null; |
|---|
| 91 |
} |
|---|
| 92 |
KladrGroup.prototype.getBuildingId = function() { |
|---|
| 93 |
for (var i=0;i<this.inputs.length;i++) { |
|---|
| 94 |
if (this.inputs[i].selectedNode && |
|---|
| 95 |
this.inputs[i].selectedNode.level == 5) |
|---|
| 96 |
return this.inputs[i].selectedNode.id; |
|---|
| 97 |
} |
|---|
| 98 |
return null; |
|---|
| 99 |
} |
|---|
| 100 |
|
|---|
| 101 |
KladrGroup.prototype.getStreetId = function() { |
|---|
| 102 |
for (var i=0;i<this.inputs.length;i++) { |
|---|
| 103 |
if (this.inputs[i].selectedNode && |
|---|
| 104 |
this.inputs[i].selectedNode.level == 4) |
|---|
| 105 |
return this.inputs[i].selectedNode.id; |
|---|
| 106 |
} |
|---|
| 107 |
return null; |
|---|
| 108 |
} |
|---|
| 109 |
|
|---|
| 110 |
KladrGroup.prototype.add = function(c,t) { |
|---|
| 111 |
if (this.inputs.length>0) c.textbox.style.display = "none"; |
|---|
| 112 |
this.inputs.push(c); |
|---|
| 113 |
c.group = this; |
|---|
| 114 |
this.titles.push(t); |
|---|
| 115 |
} |
|---|
| 116 |
KladrGroup.prototype.needAutoComplete = function(c) { |
|---|
| 117 |
var p = this.inputs.indexOf(c); |
|---|
| 118 |
if (p>0 && this.inputs[p-1].selectedNode.level == 5) return false; |
|---|
| 119 |
return true; |
|---|
| 120 |
} |
|---|
| 121 |
KladrGroup.prototype.showNextInput = function(c) { |
|---|
| 122 |
var p = this.inputs.indexOf(c); |
|---|
| 123 |
if (p<this.inputs.length-1) { |
|---|
| 124 |
this.inputs[p+1].textbox.value = ""; |
|---|
| 125 |
this.inputs[p+1].textbox.style.display = "block"; |
|---|
| 126 |
if (c.selectedNode.level==4) |
|---|
| 127 |
this.titles[p+1].innerHTML = "Дом:" |
|---|
| 128 |
else if (c.selectedNode.level==5) |
|---|
| 129 |
this.titles[p+1].innerHTML = "Индекс:" |
|---|
| 130 |
else if (c.selectedNode.level==3) |
|---|
| 131 |
this.titles[p+1].innerHTML = "Улица/дом:" |
|---|
| 132 |
else { |
|---|
| 133 |
switch(p) { |
|---|
| 134 |
case 0: |
|---|
| 135 |
if (c.selectedNode.type=="Город") |
|---|
| 136 |
this.titles[p+1].innerHTML = "Город/поселение/улица:"; |
|---|
| 137 |
else |
|---|
| 138 |
this.titles[p+1].innerHTML = "Адм.Район/город:"; |
|---|
| 139 |
break; |
|---|
| 140 |
case 1: |
|---|
| 141 |
if (c.selectedNode.level==2) |
|---|
| 142 |
this.titles[p+1].innerHTML = "Поселение/улица/дом:"; |
|---|
| 143 |
else |
|---|
| 144 |
this.titles[p+1].innerHTML = "Город/село/улица:" |
|---|
| 145 |
break; |
|---|
| 146 |
case 2: |
|---|
| 147 |
if (c.selectedNode.level==2) |
|---|
| 148 |
this.titles[p+1].innerHTML = "Поселение/улица/дом:"; |
|---|
| 149 |
break; |
|---|
| 150 |
} |
|---|
| 151 |
} |
|---|
| 152 |
} |
|---|
| 153 |
} |
|---|
| 154 |
KladrGroup.prototype.hideNextInputs = function(c) { |
|---|
| 155 |
var p = this.inputs.indexOf(c); |
|---|
| 156 |
for (var i=p+1;i<this.inputs.length;i++) { |
|---|
| 157 |
this.inputs[i].textbox.style.display = "none"; |
|---|
| 158 |
this.titles[i].innerHTML = ""; |
|---|
| 159 |
} |
|---|
| 160 |
} |
|---|
| 161 |
KladrGroup.prototype.focusNext = function(c) { |
|---|
| 162 |
var p = this.inputs.indexOf(c); |
|---|
| 163 |
if (p<this.inputs.length-1) { |
|---|
| 164 |
this.inputs[p+1].textbox.focus(); |
|---|
| 165 |
} |
|---|
| 166 |
} |
|---|
| 167 |
KladrGroup.prototype.getParent = function(input) { |
|---|
| 168 |
var res = []; |
|---|
| 169 |
var p = this.inputs.indexOf(input); |
|---|
| 170 |
if (p==0 || p==-1) return null; |
|---|
| 171 |
var cn = this.inputs[p-1].selectedNode; |
|---|
| 172 |
if (!cn) return null; |
|---|
| 173 |
switch (cn.level) { |
|---|
| 174 |
case "0": return {region:cn.id}; |
|---|
| 175 |
case "1": return {zone:cn.id}; |
|---|
| 176 |
case "2": return {city:cn.id}; |
|---|
| 177 |
case "3": return {settlement:cn.id}; |
|---|
| 178 |
case "4": return {street:cn.id}; |
|---|
| 179 |
case "5": return {building:cn.id}; |
|---|
| 180 |
} |
|---|
| 181 |
} |
|---|
| 182 |
KladrGroup.prototype.setFilter = function(filter) { |
|---|
| 183 |
this.filter = filter; |
|---|
| 184 |
} |
|---|