forked from garakh/kladrapi-jsclient
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.kladr.min.js
1 lines (1 loc) · 11 KB
/
jquery.kladr.min.js
1
!function(t){function e(t){var e={},r={type:"contentType",name:"query",withParents:"withParent"};t.parentType&&t.parentId&&(e[t.parentType+"Id"]=t.parentId);for(var i in t)n(t,i)&&t[i]&&(e[n(r,i)?r[i]:i]=t[i]);return e}function n(t,e){return t.hasOwnProperty(e)}function r(t){var e=window.console;e&&e.error&&e.error(t)}t.kladr={},t.kladr.url="http://kladr-api.ru/api.php",t.kladr.type={region:"region",district:"district",city:"city",street:"street",building:"building"},t.kladr.typeCode={city:1,settlement:2,village:4},t.kladr.validate=function(e){var n=t.kladr.type;switch(e.type){case n.region:case n.district:case n.city:if(e.parentType&&!e.parentId)return r("parentId undefined"),!1;break;case n.street:if(e.parentType!=n.city)return r('parentType must equal "city"'),!1;if(!e.parentId)return r("parentId undefined"),!1;break;case n.building:if(!e.zip){if(!~t.inArray(e.parentType,[n.street,n.city]))return r('parentType must equal "street" or "city"'),!1;if(!e.parentId)return r("parentId undefined"),!1}break;default:if(!e.oneString)return r("type incorrect"),!1}return e.oneString&&e.parentType&&!e.parentId?(r("parentId undefined"),!1):e.typeCode&&e.type!=n.city?(r('type must equal "city"'),!1):e.limit<1?(r("limit must greater than 0"),!1):!0},t.kladr.api=function(n,i){if(!i)return void r("Callback undefined");if(!t.kladr.validate(n))return void i([]);var a=setTimeout(function(){i([]),a=null},3e3);t.getJSON(t.kladr.url+"?callback=?",e(n),function(t){a&&(i(t.result||[]),clearTimeout(a))})},t.kladr.check=function(e,n){return n?(e.withParents=!1,e.limit=1,void t.kladr.api(e,function(t){n(t&&t.length?t[0]:!1)})):void r("Callback undefined")}}(jQuery),function(t,e){function n(e,n){function r(t,e){return t.isGet?d.get(t.str[0]):(d.set(t),void e())}var d=function(){var n="kladr-data",r=e.data(n);return r||(r=t.extend({},o,l),e.data(n,r)),{set:function(t){if(t.obj)for(var i in t.obj)a(t.obj,i)&&a(o,i)&&(r[i]=t.obj[i]);else t.str&&!t.isGet&&a(o,t.str[0])&&(r[t.str[0]]=t.str[1]);e.data(n,r)},get:function(t){return a(o,t)||a(l,t)?r[t]:void 0},_set:function(t,i){r[t]=i,e.data(n,r)},_get:function(t){return a(r,t)?r[t]:void 0}}}();return r(n,function(){function n(n){var r=t(document.getElementById("kladr_autocomplete"));r.length||(r=t('<div id="kladr_autocomplete"></div>').appendTo(document.body));var a=j("guid");a?(_=r.find(".autocomplete"+a),B=r.find(".spinner"+a),t(window).off(x),e.off(x),_.off(x)):(a=i(),S("guid",a),e.attr("autocomplete","off"),_=t('<ul class="autocomplete'+a+' autocomplete" style="display: none;"></ul>').appendTo(r),B=t('<div class="spinner'+a+' spinner" style="display: none;"></div>').appendTo(r),y(),o(),h()),n()}function r(e,n){var r,i,o,l;_.empty();for(var u in e)a(e,u)&&(r=e[u],i=j("valueFormat")(r,n),o=j("labelFormat")(r,n),l=t('<a data-val="'+i+'">'+o+"</a>"),l.data("kladr-object",r),t("<li></li>").append(l).appendTo(_))}function o(){var t=e.offset(),n=e.outerWidth(),r=e.outerHeight();if(o.top!=t.top||o.left!=t.left||o.width!=n||o.height!=r){o.top=t.top,o.left=t.left,o.width=n,o.height=r,_.css({top:t.top+r+"px",left:t.left});var i=_.outerWidth()-_.width();_.width(n-i);var a=B.width(),l=B.height();B.css({top:t.top+(r-l)/2-1,left:t.left+n-a-2})}}function l(n){if(!(n.which>8&&n.which<46)){if(!k("open_before"))return void s();C(null);var i=e.val();if(!t.trim(i))return I(!1),void s();var a=b(i);if(!k("send_before",a))return void s();g(),k("send"),j("source")(a,function(n){return k("receive"),e.is(":focus")?t.trim(e.val())&&n.length?(r(n,a),o(),m(),_.slideDown(50),void k("open")):(m(),C(null),void s()):(m(),void s())})}}function s(){k("close_before")&&(_.empty().hide(),k("close"))}function c(t){var e=_.find("li.active");switch(t.which){case u.up:e.length?(e.removeClass("active"),e.prev().length&&(e=e.prev())):e=_.find("li").last(),function(){var t=_.scrollTop(),n=_.offset(),r=e.outerHeight(),i=e.offset();i.top-n.top<0&&_.scrollTop(t-r)}(),e.addClass("active"),p();break;case u.down:e.length?(e.removeClass("active"),e.next().length&&(e=e.next())):e=_.find("li").first(),function(){var t=_.scrollTop(),n=_.height(),r=_.offset(),i=e.outerHeight(),a=e.offset();a.top-r.top+i>n&&_.scrollTop(t+i)}(),e.addClass("active"),p();break;case u.enter:s()}}function f(){var n=t(this);return n.is("a")&&(n=n.parents("li")),n.addClass("active"),p(),s(),e.focus(),!1}function p(){if(k("select_before")){var t=_.find(".active a");t.length&&(e.val(t.attr("data-val")),I(!1),C(t.data("kladr-object")),k("select",j("current")))}}function v(){function n(t,e){I(e),C(t)}if(j("verify")&&k("check_before")){var r=t.trim(e.val());if(!r)return void n(null,!1);if(j("current"))return void I(!1);var i=b(r);if(i.withParents=!1,i.limit=10,!k("send_before",i))return n(null,!1),void k("check",null);g(),k("send"),j("source")(i,function(r){function o(t,e){m(),n(t,e)}if(k("receive"),!t.trim(e.val()))return void o(null,!1);var l=i.name.toLowerCase(),u=null,d=null;for(var s in r)if(a(r,s)&&(u=r[s].name.toLowerCase(),l==u)){d=r[s];break}d&&e.val(j("valueFormat")(d,i)),o(d,!d),k("check",d)})}}function y(){function n(t,n){e.val(t?j("valueFormat")(t,n):""),C(t)}var r={setValue:function(e){return"object"===t.type(e)?r.setValueByObject(e):"number"===t.type(e)?r.setValueById(e):"string"===t.type(e)?r.setValueByName(e):e?r:r.clear()},setValueByName:function(e){if(e=t.trim(e+"")){var i=b("");if(i.name=T(e),i.withParents=!1,i.limit=10,!k("send_before",i))return n(null,i),r;k("send"),j("source")(i,function(t){k("receive");var e=i.name.toLowerCase(),r=null,o=null;for(var l in t)if(a(t,l)&&(r=t[l].name.toLowerCase(),e==r)){o=t[l];break}n(o,i)})}return r},setValueById:function(e){var i=b("");return i.parentType=i.type,i.parentId=e,i.limit=1,t.kladr.api(i,function(t){t.length&&n(t[0],i)}),r},setValueByObject:function(t){return n(t,b("")),r},clear:function(){return n(null,null),r}};S("controller",r)}function h(){function n(){var n=e.val();if(n){var r=b(n),i=r.type,a=r.parentType,o=t.kladr.type,l=!0;return i==o.street&&a!=o.city&&(l=!1),i!=o.building||~t.inArray(a,[o.street,o.city])||(l=!1),l&&v(),!!j("current")}return!1}var r=0;!function i(){++r>5||n()||setTimeout(i,100)}()}function k(n,r){if(!n)return!0;var i=n.replace(/_([a-z])/gi,function(t,e){return e.toUpperCase()});return e.trigger("kladr_"+n,r),"function"===t.type(j(i))?j(i).call(e.get(0),r)!==!1:!0}function g(){j("spinner")&&j("showSpinner")(B)}function m(){j("spinner")&&j("hideSpinner")(B)}function b(t){var e,n={},r=["token","key","type","typeCode","parentType","parentId","oneString","withParents","limit"];for(e=0;e<r.length;e++)n[r[e]]=j(r[e]);n.name=T(t);var i,a=j("parentInput");return a&&(i=w(a,n.type),i&&(n.parentType=i.type,n.parentId=i.id)),n.oneString&&(n.withParents=!0),n}function w(e,n){var r,i=t.kladr.getInputs(e),o=t.kladr.type,l={},u=null;i.each(function(){var e,n=t(this);(e=n.attr("data-kladr-id"))&&(l[n.attr("data-kladr-type")]=e)});for(r in o){if(r==n)return u;a(o,r)&&l[r]&&(u={type:r,id:l[r]})}return u}function T(t){for(var e="abcdefghijklmnopqrstuvwxyz",n=t.toLowerCase(),r=0;r<n.length;r++)if(~e.indexOf(n[r]))return I(!0),t;return I(!1),t}function C(t){S("current",t),t&&t.id?e.attr("data-kladr-id",t.id):e.removeAttr("data-kladr-id"),j("oneString")&&t&&t.contentType&&e.attr("data-kladr-type",t.contentType)}function I(t){t?e.addClass("kladr-error"):e.removeClass("kladr-error")}function j(t){return d._get(t)}function S(t,e){d._set(t,e)}var _=null,B=null,x=".kladr";n(function(){var n=!1;e.attr("data-kladr-type",j("type")||"").attr("data-kladr-one-string",j("oneString")||null).on("keyup"+x,l).on("keydown"+x,c).on("blur"+x+" change"+x,function(){n||(v(),s())}),_.on("touchstart"+x+" click"+x,"li, a",function(){n=!0,f.call(this),n=!1}).on("mouseenter"+x,function(){n=!0}).on("mouseleave"+x,function(){n=!1}),t(window).on("resize"+x,o)})})}function r(n){var r={obj:!1,str:!1,isGet:!1};return"object"===t.type(n)?(r.obj=n,r):("string"===t.type(n)&&(r.str=arguments,r.isGet=arguments[1]===e),r)}function i(){return i.guid?++i.guid:i.guid=1}function a(t,e){return t.hasOwnProperty(e)}var o={token:null,key:null,type:null,typeCode:null,parentType:null,parentId:null,limit:10,oneString:!1,withParents:!1,parentInput:null,verify:!1,spinner:!0,open:null,close:null,send:null,receive:null,select:null,check:null,openBefore:null,closeBefore:null,sendBefore:null,selectBefore:null,checkBefore:null,source:function(e,n){t.kladr.api(e,n)},labelFormat:function(e,n){var r;if(n.oneString)return e.parents?(r=t.extend(!0,[],e.parents),r.push(e),t.kladr.buildAddress(r)):(e.typeShort?e.typeShort+". ":"")+e.name;var i,a,o,l,u="";return e.typeShort&&(u+=e.typeShort+". "),i=e.name,a=i.toLowerCase(),o=n.name.toLowerCase(),l=a.indexOf(o),l=~l?l:0,o.length<a.length?(u+=i.substr(0,l),u+="<strong>"+i.substr(l,o.length)+"</strong>",u+=i.substr(l+o.length)):u+="<strong>"+i+"</strong>",u},valueFormat:function(e,n){var r;return n.oneString?e.parents?(r=t.extend(!0,[],e.parents),r.push(e),t.kladr.buildAddress(r)):(e.typeShort?e.typeShort+". ":"")+e.name:e.name},showSpinner:function(t){var e=-.2,n=setInterval(function(){return t.is(":visible")?(t.css("background-position","0% "+e+"%"),e+=5.555556,void(e>95&&(e=-.2))):(clearInterval(n),void(n=null))},30);t.show()},hideSpinner:function(t){t.hide()}},l={current:null,controller:null},u={up:38,down:40,enter:13};t.kladr=t.extend(t.kladr,{setDefault:function(t,e){var n=r(t,e);if(n.obj)for(var i in n.obj)a(o,i)&&(o[i]=n.obj[i]);else n.str&&!n.isGet&&a(o,n.str[0])&&(o[n.str[0]]=n.str[1])},getDefault:function(t){return a(o,t)?o[t]:void 0},getInputs:function(e){var n=t(e||document.body),r="[data-kladr-type]";return n.filter(r).add(n.find(r))},getAddress:function(e,n){var r,i=t.kladr.getInputs(e),o=t.kladr.type,l={},u={};i.each(function(){var e,n,r,i=t(this);if(i.attr("data-kladr-id"))if(e=i.kladr("current"),i.attr("data-kladr-one-string")&&e.parents){n=t.extend(!0,[],e.parents),n.push(e);for(r in n)a(n,r)&&(l[n[r].contentType]=n[r])}else l[i.attr("data-kladr-type")]=e;else l[i.attr("data-kladr-type")]=i.val()});for(r in o)a(o,r)&&l[r]&&(u[r]=l[r]);return(n||t.kladr.buildAddress)(u)},buildAddress:function(e){var n,r,i=[],o="",l="",u="",d="";t:for(n in e)if(a(e,n)){if("object"===t.type(e[n])){for(r=0;r<i.length;r++)if(i[r]==e[n].id)continue t;i.push(e[n].id),u=e[n].name,d=e[n].typeShort+". ",l=e[n].zip||l}else u=e[n],d="";o&&(o+=", "),o+=d+u}return o=(l?l+", ":"")+o}}),t.fn.kladr=function(e,i){var a=r(e,i),o=null;return this.each(function(){var e=n(t(this),a);return a.isGet?(o=e,!1):void 0}),a.isGet?o:this}}(jQuery),function(t){t.fn.kladrZip=function(e){var n=t(e||document.body);return this.keydown(function(e){var n=e.charCode||e.keyCode||0,r=8==n||9==n||13==n||46==n||110==n||190==n||n>=35&&40>=n||n>=96&&105>=n;return t(this).val().length>=6?r:r||n>=48&&57>=n}),this.keyup(function(){function e(t){t?r.addClass("kladr-error"):r.removeClass("kladr-error")}var r=t(this),i=r.val();return i?void t.kladr.api({type:t.kladr.type.building,zip:i,withParents:!0,limit:1},function(r){var i,a,o=r.length&&r[0];if(r=[],o){e(!1),o.parents&&(r=t.extend(!0,[],o.parents)),r.push(o);for(i in r)r.hasOwnProperty(i)&&(a=n.find('[data-kladr-type="'+r[i].contentType+'"]'),a.kladr("controller").setValueByObject(r[i]))}else e(!0)}):void e(!1)}),this}}(jQuery);