33 *
44 * Example:
55 *
6- * getZipCode('US', '90210', function (zip ) {
7- * console.log(zip );
6+ * getZipCode('US', '90210', function (result ) {
7+ * console.log(result );
88 * });
9- *
9+ *
1010 */
1111var getZipCode = function ( country , zip , callback ) {
12- var key = {
13- 'AD' : 0 ,
14- 'AR' : 2 ,
15- 'AS' : 0 ,
16- 'AT' : 2 ,
17- 'AU' : 2 ,
18- 'AX' : 0 ,
19- 'BD' : 1 ,
20- 'BE' : 1 ,
21- 'BG' : 1 ,
22- 'BM' : 0 ,
23- 'BR' : 1 ,
24- 'BY' : 1 ,
25- 'CA' : 1 ,
26- 'CH' : 1 ,
27- 'CO' : 1 ,
28- 'CR' : 0 ,
29- 'CZ' : 2 ,
30- 'DE' : 2 ,
31- 'DK' : 1 ,
32- 'DO' : 0 ,
33- 'DZ' : 2 ,
34- 'ES' : 2 ,
35- 'FI' : 1 ,
36- 'FO' : 0 ,
37- 'FR' : 2 ,
38- 'GB' : 2 ,
39- 'GF' : 0 ,
40- 'GG' : 0 ,
41- 'GL' : 0 ,
42- 'GP' : 0 ,
43- 'GT' : 0 ,
44- 'GU' : 0 ,
45- 'HR' : 1 ,
46- 'HU' : 1 ,
47- 'IE' : 0 ,
48- 'IM' : 0 ,
49- 'IN' : 3 ,
50- 'IS' : 0 ,
51- 'IT' : 2 ,
52- 'JE' : 0 ,
53- 'JP' : 3 ,
54- 'LI' : 0 ,
55- 'LK' : 1 ,
56- 'LT' : 2 ,
57- 'LU' : 1 ,
58- 'LV' : 1 ,
59- 'MC' : 0 ,
60- 'MD' : 1 ,
61- 'MH' : 0 ,
62- 'MK' : 0 ,
63- 'MP' : 0 ,
64- 'MQ' : 0 ,
65- 'MT' : 0 ,
66- 'MX' : 3 ,
67- 'MY' : 1 ,
68- 'NC' : 0 ,
69- 'NL' : 1 ,
70- 'NO' : 1 ,
71- 'NZ' : 1 ,
72- 'PH' : 1 ,
73- 'PK' : 2 ,
74- 'PL' : 2 ,
75- 'PM' : 0 ,
76- 'PR' : 0 ,
77- 'PT' : 3 ,
78- 'RE' : 0 ,
79- 'RO' : 2 ,
80- 'RU' : 2 ,
81- 'SE' : 2 ,
82- 'SI' : 0 ,
83- 'SJ' : 0 ,
84- 'SK' : 1 ,
85- 'SM' : 0 ,
86- 'TH' : 0 ,
87- 'TR' : 2 ,
88- 'UA' : 2 ,
89- 'US' : 2 ,
90- 'UY' : 1 ,
91- 'VA' : 0 ,
92- 'VI' : 0 ,
93- 'WF' : 0 ,
94- 'YT' : 0 ,
95- 'ZA' : 1
12+ var keys = {
13+ AD : 0 ,
14+ AR : 2 ,
15+ AS : 0 ,
16+ AT : 2 ,
17+ AU : 2 ,
18+ AX : 0 ,
19+ BD : 1 ,
20+ BE : 1 ,
21+ BG : 1 ,
22+ BM : 0 ,
23+ BR : 1 ,
24+ BY : 1 ,
25+ CA : 1 ,
26+ CH : 1 ,
27+ CO : 1 ,
28+ CR : 0 ,
29+ CZ : 2 ,
30+ DE : 2 ,
31+ DK : 1 ,
32+ DO : 0 ,
33+ DZ : 2 ,
34+ ES : 2 ,
35+ FI : 1 ,
36+ FO : 0 ,
37+ FR : 2 ,
38+ GB : 2 ,
39+ GF : 0 ,
40+ GG : 0 ,
41+ GL : 0 ,
42+ GP : 0 ,
43+ GT : 0 ,
44+ GU : 0 ,
45+ HR : 1 ,
46+ HU : 1 ,
47+ IE : 0 ,
48+ IM : 0 ,
49+ IN : 3 ,
50+ IS : 0 ,
51+ IT : 2 ,
52+ JE : 0 ,
53+ JP : 3 ,
54+ LI : 0 ,
55+ LK : 1 ,
56+ LT : 2 ,
57+ LU : 1 ,
58+ LV : 1 ,
59+ MC : 0 ,
60+ MD : 1 ,
61+ MH : 0 ,
62+ MK : 0 ,
63+ MP : 0 ,
64+ MQ : 0 ,
65+ MT : 0 ,
66+ MX : 3 ,
67+ MY : 1 ,
68+ NC : 0 ,
69+ NL : 1 ,
70+ NO : 1 ,
71+ NZ : 1 ,
72+ PH : 1 ,
73+ PK : 2 ,
74+ PL : 2 ,
75+ PM : 0 ,
76+ PR : 0 ,
77+ PT : 3 ,
78+ RE : 0 ,
79+ RO : 2 ,
80+ RU : 2 ,
81+ SE : 2 ,
82+ SI : 0 ,
83+ SJ : 0 ,
84+ SK : 1 ,
85+ SM : 0 ,
86+ TH : 0 ,
87+ TR : 2 ,
88+ UA : 2 ,
89+ US : 2 ,
90+ UY : 1 ,
91+ VA : 0 ,
92+ VI : 0 ,
93+ WF : 0 ,
94+ YT : 0 ,
95+ ZA : 1
96+ } ,
97+ patterns = {
98+ AD : / ^ ( ( [ a - z A - Z ] { 2 } \d { 3 } ) | ( \d { 4 } ) ) $ / ,
99+ AM_AZ_BJ_BY_CN_IN_KG_KZ_MN_RO_RS_RU_SG_TJ_TM_UZ : / ^ [ 0 - 9 ] { 6 } $ / ,
100+ AR : / ^ ( ( \d { 4 } ) | ( [ a - z A - Z ] { 1 } \d { 4 } [ a - z A - Z ] { 3 } ) ) $ / ,
101+ AS_BA_CS_CU_DE_DZ_EE_ES_FI_FM_GF_GP_GT_GU_HR_IC_ID_IL_IT_KE_KW_LT_MA_ME_MH_MM_MP_MQ_MX_MY_PK_PM_PR_PS_PW_RE_SA_SM_TH_TR_UA_UY_VI_VN_YU_ZM : / ^ [ 0 - 9 ] { 5 } $ / ,
102+ AT_AU_BD_BE_BG_CH_CX_CY_DK_GL_GW_HU_LI_LU_MD_MK_MZ_NO_NZ_PH_SD_SI_TN_VE_XK_ZA : / ^ [ 0 - 9 ] { 4 } $ / ,
103+ BM : / ^ [ a - z A - Z ] { 2 } \s \d { 2 } $ / ,
104+ BN : / ^ [ a - z A - Z ] { 2 } \d { 4 } $ / ,
105+ BR : / ^ ( \d { 5 } ) ( - \d { 3 } ) ? $ / ,
106+ CA : / ^ [ A B C E G H J K L M N P R S T V X Y ] { 1 } \d { 1 } [ A - Z ] { 1 } * \d { 1 } [ A - Z ] { 1 } \d { 1 } $ / ,
107+ CZ_GR_SE_SK : / ^ [ 0 - 9 ] { 3 } \s ? [ 0 - 9 ] { 2 } $ / ,
108+ FO : / ^ ( [ a - z A - Z ] { 2 } - ) ? ( \d { 3 } ) ? $ / ,
109+ FR : / ^ ( ( 0 [ 1 - 9 ] ) | ( [ 1 - 8 ] [ 0 - 9 ] ) | ( 9 [ 0 - 8 ] ) | ( 2 A ) | ( 2 B ) ) [ 0 - 9 ] { 3 } $ / ,
110+ GB : / ^ G I R ? 0 A A | [ A - P R - U W Y Z ] ( [ 0 - 9 ] { 1 , 2 } | ( [ A - H K - Y ] [ 0 - 9 ] | [ A - H K - Y ] [ 0 - 9 ] ( [ 0 - 9 ] | [ A B E H M N P R V - Y ] ) ) | [ 0 - 9 ] [ A - H J K S - U W ] ) ? [ 0 - 9 ] [ A B D - H J L N P - U W - Z ] { 2 } $ / ,
111+ GE : / ^ ( ( \d { 4 } ) | ( \d { 6 } ) ) $ / ,
112+ IE : / ^ ( ( [ a - z A - Z ] { 2 } ( \s ( ( [ a - z A - Z 0 - 9 ] { 1 } ) | ( \d { 2 } ) ) ) ? ) | ( [ a - z A - Z ] { 3 } ) ) $ / ,
113+ IS_MG : / ^ [ 0 - 9 ] { 3 } $ / ,
114+ JP : / ^ \d { 3 } ( - \d { 4 } ) ? $ / ,
115+ KR : / ^ \d { 3 } - \d { 3 } $ / ,
116+ LV : / ^ ( [ a - z A - Z ] { 2 } - ) ? ( \d { 4 } ) $ / ,
117+ MT : / ^ [ a - z A - Z ] { 3 } \s \d { 2 , 4 } $ / ,
118+ MV : / ^ \d { 4 , 5 } $ / ,
119+ NL : / ^ ( \d { 4 } ) \s ? [ a - z A - Z ] { 2 } $ / ,
120+ PL : / ^ \d { 2 } ( - ) ? \d { 3 } $ / ,
121+ PT : / ^ \d { 4 } ( - ) ? \d { 3 } $ / ,
122+ SZ : / ^ [ a - z A - Z ] { 1 } \d { 3 } $ / ,
123+ TW : / ^ \d { 3 } ( \d { 2 } ) ? $ / ,
124+ US : / ^ \d { 5 } ( - \d { 4 } ) ? $ / ,
96125 } ,
97126 headers = [
98127 'countryCode' ,
@@ -107,23 +136,60 @@ var getZipCode = function (country, zip, callback) {
107136 'latitude' ,
108137 'longitude' ,
109138 'accuracy'
110- ] ;
111- if ( typeof key [ country ] !== 'undefined' ) {
112- var k = key [ country ] > 0 ? zip . toUpperCase ( ) . replace ( / [ ^ 0 - 9 A - Z ] / g, '' ) . substr ( 0 , key [ country ] ) : 0 ;
113- window . zipCodesCallback = function ( zipCodes ) {
114- var result = { } ;
115- if ( typeof zipCodes [ zip ] !== 'undefined' ) {
116- for ( var i = 0 , len = headers . length ; i < len ; i ++ ) {
117- result [ headers [ i ] ] = zipCodes [ zip ] [ i ] ;
118- }
119- callback ( result ) ;
139+ ] ,
140+ pattern = null ,
141+ country = country && country . toLocaleUpperCase ( ) ;
142+
143+ // Check patterns.
144+ if ( typeof patterns [ country ] !== 'undefined' ) {
145+ pattern = patterns [ country ] ;
146+ }
147+ else {
148+ for ( var k in patterns ) {
149+ if ( patterns . hasOwnProperty ( k ) && k . indexOf ( country ) > 0 ) {
150+ pattern = patterns [ k ] ;
151+ break ;
120152 }
121- else {
122- callback ( false ) ;
153+ }
154+ }
155+ var result = {
156+ input : {
157+ country : country ,
158+ zip : zip
159+ } ,
160+ lookup : { } ,
161+ pattern : pattern ,
162+ validPattern : pattern && pattern . test ( zip ) ,
163+ validLookup : false ,
164+ valid : false
165+ } ;
166+
167+ // Process lookup if pattern is unmatched or validated.
168+ if ( ! result . pattern || result . validPattern ) {
169+ if ( typeof keys [ country ] !== 'undefined' ) {
170+ // Remove specificity that is beyond our database.
171+ if ( country === 'US' && zip . indexOf ( '-' ) === 5 ) {
172+ zip = zip . substring ( 0 , zip . indexOf ( '-' ) ) ;
123173 }
124- } ;
125- var script = document . createElement ( 'script' ) ;
126- script . src = 'https://' + country . toUpperCase ( ) + '.zipcodes.gdn/min/' + k + '.jsonp' ;
127- document . body . appendChild ( script ) ;
174+ window . zipCodesCallback = function ( zipCodes ) {
175+ if ( typeof zipCodes [ zip ] !== 'undefined' ) {
176+ for ( var i = 0 , len = headers . length ; i < len ; i ++ ) {
177+ result . lookup [ headers [ i ] ] = zipCodes [ zip ] [ i ] ;
178+ }
179+ result . validLookup = true ;
180+ result . valid = true ;
181+ }
182+ callback ( result ) ;
183+ } ;
184+ var k = keys [ country ] > 0 ? zip . toUpperCase ( ) . replace ( / [ ^ 0 - 9 A - Z ] / g, '' ) . substr ( 0 , keys [ country ] ) : 0 ,
185+ script = document . createElement ( 'script' ) ;
186+ script . src = 'https://' + country + '.zipcodes.gdn/min/' + k + '.jsonp' ;
187+ document . body . appendChild ( script ) ;
188+ }
189+ else {
190+ // Unable to lookup and/or pattern match.
191+ result . valid = true ;
192+ callback ( result ) ;
193+ }
128194 }
129195} ;
0 commit comments