tw_zipcode 1.5.2 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,366 +1,854 @@
1
+ /*jshint unused:false */
1
2
  /**
2
- * 本著作係依據創用 姓名標示-相同方式分享 3.0 Unported (CC BY-SA 3.0) 授權條款進行授權。
3
- * 如欲瀏覽本授權條款之副本,請造訪 http://creativecommons.org/licenses/by-sa/3.0/deed.zh_TW
4
- *
5
- * This work is licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0).
6
- * To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/deed.en
7
- *
8
- * jQuery TWzipcode 台灣郵遞區號 jQuery 擴充套件
9
- * 輕鬆地建立多組台灣郵遞區號下拉清單,讀取快速、完全不需使用資料庫。
3
+ * jQuery TWzipcode plugin
10
4
  * http://app.essoduke.org/twzipcode/
5
+ * Copyright 2015 essoduke.org, Licensed MIT.
11
6
  *
12
- * @author: Essoduke Chang
13
- * @version: 1.5.2
7
+ * Changelog
8
+ * -------------------------------
9
+ * 因應員林鎮改制為員林市、頭份鎮改制為頭份市。
14
10
  *
15
- * [Changelog]
16
- * fix datasheet (Hsinchu, Chiayi)
17
- * Last Modify: Mon, 17 June 2013 04:30:11 GMT
11
+ * @author essoduke.org
12
+ * @version 1.7.1
13
+ * @license MIT License
14
+ * Last modified: 2015-08-12 16:22:13+08:00
18
15
  */
19
- ;(function ($) {
20
-
21
- 'use strict';
22
-
23
- // Zipcode JSON data
24
- var data = {
25
- '基隆市': {'仁愛區': '200', '信義區': '201', '中正區': '202', '中山區': '203', '安樂區': '204', '暖暖區': '205', '七堵區': '206'},
26
- '台北市': {'中正區': '100', '大同區': '103', '中山區': '104', '松山區': '105', '大安區': '106', '萬華區': '108', '信義區': '110', '士林區': '111', '北投區': '112', '內湖區': '114', '南港區': '115', '文山區': '116'},
27
- '新北市': {
28
- '萬里區': '207', '金山區': '208', '板橋區': '220', '汐止區': '221', '深坑區': '222', '石碇區': '223',
29
- '瑞芳區': '224', '平溪區': '226', '雙溪區': '227', '貢寮區': '228', '新店區': '231', '坪林區': '232',
30
- '烏來區': '233', '永和區': '234', '中和區': '235', '土城區': '236', '三峽區': '237', '樹林區': '238',
31
- '鶯歌區': '239', '三重區': '241', '新莊區': '242', '泰山區': '243', '林口區': '244', '蘆洲區': '247',
32
- '五股區': '248', '八里區': '249', '淡水區': '251', '三芝區': '252', '石門區': '253'
33
- },
34
- '宜蘭縣': {
35
- '宜蘭市': '260', '頭城鎮': '261', '礁溪鄉': '262', '壯圍鄉': '263', '員山鄉': '264', '羅東鎮': '265',
36
- '三星鄉': '266', '大同鄉': '267', '五結鄉': '268', '冬山鄉': '269', '蘇澳鎮': '270', '南澳鄉': '272',
37
- '釣魚台列嶼': '290'
38
- },
39
- '新竹市': {'東區': '300', '北區': '300', '香山區': '300'},
40
- '新竹縣': {
41
- '竹北市': '302', '湖口鄉': '303', '新豐鄉': '304', '新埔鎮': '305', '關西鎮': '306', '芎林鄉': '307',
42
- '寶山鄉': '308', '竹東鎮': '310', '五峰鄉': '311', '橫山鄉': '312', '尖石鄉': '313', '北埔鄉': '314',
43
- '峨嵋鄉': '315'
44
- },
45
- '桃園縣': {
46
- '中壢市': '320', '平鎮市': '324', '龍潭鄉': '325', '楊梅鎮': '326', '新屋鄉': '327', '觀音鄉': '328',
47
- '桃園市': '330', '龜山鄉': '333', '八德市': '334', '大溪鎮': '335', '復興鄉': '336', '大園鄉': '337',
48
- '蘆竹鄉': '338'
49
- },
50
- '苗栗縣': {
51
- '竹南鎮': '350', '頭份鎮': '351', '三灣鄉': '352', '南庄鄉': '353', '獅潭鄉': '354', '後龍鎮': '356',
52
- '通霄鎮': '357', '苑裡鎮': '358', '苗栗市': '360', '造橋鄉': '361', '頭屋鄉': '362', '公館鄉': '363',
53
- '大湖鄉': '364', '泰安鄉': '365', '銅鑼鄉': '366', '三義鄉': '367', '西湖鄉': '368', '卓蘭鎮': '369'
54
- },
55
- '台中市': {
56
- '中區': '400', '東區': '401', '南區': '402', '西區': '403', '北區': '404', '北屯區': '406', '西屯區': '407', '南屯區': '408',
57
- '太平區': '411', '大里區': '412', '霧峰區': '413', '烏日區': '414', '豐原區': '420', '后里區': '421',
58
- '石岡區': '422', '東勢區': '423', '和平區': '424', '新社區': '426', '潭子區': '427', '大雅區': '428',
59
- '神岡區': '429', '大肚區': '432', '沙鹿區': '433', '龍井區': '434', '梧棲區': '435', '清水區': '436',
60
- '大甲區': '437', '外埔區': '438', '大安區': '439'
61
- },
62
- '彰化縣': {
63
- '彰化市': '500', '芬園鄉': '502', '花壇鄉': '503', '秀水鄉': '504', '鹿港鎮': '505', '福興鄉': '506',
64
- '線西鄉': '507', '和美鎮': '508', '伸港鄉': '509', '員林鎮': '510', '社頭鄉': '511', '永靖鄉': '512',
65
- '埔心鄉': '513', '溪湖鎮': '514', '大村鄉': '515', '埔鹽鄉': '516', '田中鎮': '520', '北斗鎮': '521',
66
- '田尾鄉': '522', '埤頭鄉': '523', '溪州鄉': '524', '竹塘鄉': '525', '二林鎮': '526', '大城鄉': '527',
67
- '芳苑鄉': '528', '二水鄉': '530'
68
- },
69
- '南投縣': {
70
- '南投市': '540', '中寮鄉': '541', '草屯鎮': '542', '國姓鄉': '544', '埔里鎮': '545', '仁愛鄉': '546',
71
- '名間鄉': '551', '集集鎮': '552', '水里鄉': '553', '魚池鄉': '555', '信義鄉': '556', '竹山鎮': '557',
72
- '鹿谷鄉': '558'
73
- },
74
- '嘉義市': {'東區': '600', '西區': '600'},
75
- '嘉義縣': {
76
- '番路鄉': '602', '梅山鄉': '603', '竹崎鄉': '604', '阿里山': '605', '中埔鄉': '606', '大埔鄉': '607',
77
- '水上鄉': '608', '鹿草鄉': '611', '太保市': '612', '朴子市': '613', '東石鄉': '614', '六腳鄉': '615',
78
- '新港鄉': '616', '民雄鄉': '621', '大林鎮': '622', '溪口鄉': '623', '義竹鄉': '624', '布袋鎮': '625'
79
- },
80
- '雲林縣': {
81
- '斗南鎮': '630', '大埤鄉': '631', '虎尾鎮': '632', '土庫鎮': '633', '褒忠鄉': '634', '東勢鄉': '635',
82
- '臺西鄉': '636', '崙背鄉': '637', '麥寮鄉': '638', '斗六市': '640', '林內鄉': '643', '古坑鄉': '646',
83
- '莿桐鄉': '647', '西螺鎮': '648', '二崙鄉': '649', '北港鎮': '651', '水林鄉': '652', '口湖鄉': '653',
84
- '四湖鄉': '654', '元長鄉': '655'
85
- },
86
- '台南市': {
87
- '中西區': '700', '東區': '701', '南區': '702', '北區': '704', '安平區': '708', '安南區': '709',
88
- '永康區': '710', '歸仁區': '711', '新化區': '712', '左鎮區': '713', '玉井區': '714', '楠西區': '715',
89
- '南化區': '716', '仁德區': '717', '關廟區': '718', '龍崎區': '719', '官田區': '720', '麻豆區': '721',
90
- '佳里區': '722', '西港區': '723', '七股區': '724', '將軍區': '725', '學甲區': '726', '北門區': '727',
91
- '新營區': '730', '後壁區': '731', '白河區': '732', '東山區': '733', '六甲區': '734', '下營區': '735',
92
- '柳營區': '736', '鹽水區': '737', '善化區': '741', '大內區': '742', '山上區': '743', '新市區': '744',
93
- '安定區': '745'
94
- },
95
- '高雄市': {
96
- '新興區': '800', '前金區': '801', '苓雅區': '802', '鹽埕區': '803', '鼓山區': '804', '旗津區': '805',
97
- '前鎮區': '806', '三民區': '807', '楠梓區': '811', '小港區': '812', '左營區': '813',
98
- '仁武區': '814', '大社區': '815', '岡山區': '820', '路竹區': '821', '阿蓮區': '822', '田寮鄉': '823',
99
- '燕巢區': '824', '橋頭區': '825', '梓官區': '826', '彌陀區': '827', '永安區': '828', '湖內鄉': '829',
100
- '鳳山區': '830', '大寮區': '831', '林園區': '832', '鳥松區': '833', '大樹區': '840', '旗山區': '842',
101
- '美濃區': '843', '六龜區': '844', '內門區': '845', '杉林區': '846', '甲仙區': '847', '桃源區': '848',
102
- '那瑪夏區': '849', '茂林區': '851', '茄萣區': '852'
103
- },
104
- '屏東縣': {
105
- '屏東市': '900', '三地門': '901', '霧臺鄉': '902', '瑪家鄉': '903', '九如鄉': '904', '里港鄉': '905',
106
- '高樹鄉': '906', '鹽埔鄉': '907', '長治鄉': '908', '麟洛鄉': '909', '竹田鄉': '911', '內埔鄉': '912',
107
- '萬丹鄉': '913', '潮州鎮': '920', '泰武鄉': '921', '來義鄉': '922', '萬巒鄉': '923', '崁頂鄉': '924',
108
- '新埤鄉': '925', '南州鄉': '926', '林邊鄉': '927', '東港鎮': '928', '琉球鄉': '929', '佳冬鄉': '931',
109
- '新園鄉': '932', '枋寮鄉': '940', '枋山鄉': '941', '春日鄉': '942', '獅子鄉': '943', '車城鄉': '944',
110
- '牡丹鄉': '945', '恆春鎮': '946', '滿州鄉': '947'
111
- },
112
- '台東縣': {
113
- '臺東市': '950', '綠島鄉': '951', '蘭嶼鄉': '952', '延平鄉': '953', '卑南鄉': '954', '鹿野鄉': '955',
114
- '關山鎮': '956', '海端鄉': '957', '池上鄉': '958', '東河鄉': '959', '成功鎮': '961', '長濱鄉': '962',
115
- '太麻里鄉': '963', '金峰鄉': '964', '大武鄉': '965', '達仁鄉': '966'
116
- },
117
- '花蓮縣': {
118
- '花蓮市': '970', '新城鄉': '971', '秀林鄉': '972', '吉安鄉': '973', '壽豐鄉': '974', '鳳林鎮': '975',
119
- '光復鄉': '976', '豐濱鄉': '977', '瑞穗鄉': '978', '萬榮鄉': '979', '玉里鎮': '981', '卓溪鄉': '982',
120
- '富里鄉': '983'
121
- },
122
- '金門縣': {'金沙鎮': '890', '金湖鎮': '891', '金寧鄉': '892', '金城鎮': '893', '烈嶼鄉': '894', '烏坵鄉': '896'},
123
- '連江縣': {'南竿鄉': '209', '北竿鄉': '210', '莒光鄉': '211', '東引鄉': '212'},
124
- '澎湖縣': {'馬公市': '880', '西嶼鄉': '881', '望安鄉': '882', '七美鄉': '883', '白沙鄉': '884', '湖西鄉': '885'},
125
- '南海諸島': {'東沙': '817', '南沙': '819'}
16
+ ;
17
+ (function($, window, undefined) {
18
+
19
+ 'use strict';
20
+
21
+ // Zipcode JSON data
22
+ var data = {
23
+ '基隆市': {
24
+ '仁愛區': '200',
25
+ '信義區': '201',
26
+ '中正區': '202',
27
+ '中山區': '203',
28
+ '安樂區': '204',
29
+ '暖暖區': '205',
30
+ '七堵區': '206'
31
+ },
32
+ '台北市': {
33
+ '中正區': '100',
34
+ '大同區': '103',
35
+ '中山區': '104',
36
+ '松山區': '105',
37
+ '大安區': '106',
38
+ '萬華區': '108',
39
+ '信義區': '110',
40
+ '士林區': '111',
41
+ '北投區': '112',
42
+ '內湖區': '114',
43
+ '南港區': '115',
44
+ '文山區': '116'
45
+ },
46
+ '新北市': {
47
+ '萬里區': '207',
48
+ '金山區': '208',
49
+ '板橋區': '220',
50
+ '汐止區': '221',
51
+ '深坑區': '222',
52
+ '石碇區': '223',
53
+ '瑞芳區': '224',
54
+ '平溪區': '226',
55
+ '雙溪區': '227',
56
+ '貢寮區': '228',
57
+ '新店區': '231',
58
+ '坪林區': '232',
59
+ '烏來區': '233',
60
+ '永和區': '234',
61
+ '中和區': '235',
62
+ '土城區': '236',
63
+ '三峽區': '237',
64
+ '樹林區': '238',
65
+ '鶯歌區': '239',
66
+ '三重區': '241',
67
+ '新莊區': '242',
68
+ '泰山區': '243',
69
+ '林口區': '244',
70
+ '蘆洲區': '247',
71
+ '五股區': '248',
72
+ '八里區': '249',
73
+ '淡水區': '251',
74
+ '三芝區': '252',
75
+ '石門區': '253'
76
+ },
77
+ '宜蘭縣': {
78
+ '宜蘭市': '260',
79
+ '頭城鎮': '261',
80
+ '礁溪鄉': '262',
81
+ '壯圍鄉': '263',
82
+ '員山鄉': '264',
83
+ '羅東鎮': '265',
84
+ '三星鄉': '266',
85
+ '大同鄉': '267',
86
+ '五結鄉': '268',
87
+ '冬山鄉': '269',
88
+ '蘇澳鎮': '270',
89
+ '南澳鄉': '272',
90
+ '釣魚台列嶼': '290'
91
+ },
92
+ '新竹市': {
93
+ '東區': '300',
94
+ '北區': '300',
95
+ '香山區': '300'
96
+ },
97
+ '新竹縣': {
98
+ '竹北市': '302',
99
+ '湖口鄉': '303',
100
+ '新豐鄉': '304',
101
+ '新埔鎮': '305',
102
+ '關西鎮': '306',
103
+ '芎林鄉': '307',
104
+ '寶山鄉': '308',
105
+ '竹東鎮': '310',
106
+ '五峰鄉': '311',
107
+ '橫山鄉': '312',
108
+ '尖石鄉': '313',
109
+ '北埔鄉': '314',
110
+ '峨嵋鄉': '315'
111
+ },
112
+ '桃園市': {
113
+ '中壢區': '320',
114
+ '平鎮區': '324',
115
+ '龍潭區': '325',
116
+ '楊梅區': '326',
117
+ '新屋區': '327',
118
+ '觀音區': '328',
119
+ '桃園區': '330',
120
+ '龜山區': '333',
121
+ '八德區': '334',
122
+ '大溪區': '335',
123
+ '復興區': '336',
124
+ '大園區': '337',
125
+ '蘆竹區': '338'
126
+ },
127
+ '苗栗縣': {
128
+ '竹南鎮': '350',
129
+ '頭份市': '351',
130
+ '三灣鄉': '352',
131
+ '南庄鄉': '353',
132
+ '獅潭鄉': '354',
133
+ '後龍鎮': '356',
134
+ '通霄鎮': '357',
135
+ '苑裡鎮': '358',
136
+ '苗栗市': '360',
137
+ '造橋鄉': '361',
138
+ '頭屋鄉': '362',
139
+ '公館鄉': '363',
140
+ '大湖鄉': '364',
141
+ '泰安鄉': '365',
142
+ '銅鑼鄉': '366',
143
+ '三義鄉': '367',
144
+ '西湖鄉': '368',
145
+ '卓蘭鎮': '369'
146
+ },
147
+ '台中市': {
148
+ '中區': '400',
149
+ '東區': '401',
150
+ '南區': '402',
151
+ '西區': '403',
152
+ '北區': '404',
153
+ '北屯區': '406',
154
+ '西屯區': '407',
155
+ '南屯區': '408',
156
+ '太平區': '411',
157
+ '大里區': '412',
158
+ '霧峰區': '413',
159
+ '烏日區': '414',
160
+ '豐原區': '420',
161
+ '后里區': '421',
162
+ '石岡區': '422',
163
+ '東勢區': '423',
164
+ '和平區': '424',
165
+ '新社區': '426',
166
+ '潭子區': '427',
167
+ '大雅區': '428',
168
+ '神岡區': '429',
169
+ '大肚區': '432',
170
+ '沙鹿區': '433',
171
+ '龍井區': '434',
172
+ '梧棲區': '435',
173
+ '清水區': '436',
174
+ '大甲區': '437',
175
+ '外埔區': '438',
176
+ '大安區': '439'
177
+ },
178
+ '彰化縣': {
179
+ '彰化市': '500',
180
+ '芬園鄉': '502',
181
+ '花壇鄉': '503',
182
+ '秀水鄉': '504',
183
+ '鹿港鎮': '505',
184
+ '福興鄉': '506',
185
+ '線西鄉': '507',
186
+ '和美鎮': '508',
187
+ '伸港鄉': '509',
188
+ '員林市': '510',
189
+ '社頭鄉': '511',
190
+ '永靖鄉': '512',
191
+ '埔心鄉': '513',
192
+ '溪湖鎮': '514',
193
+ '大村鄉': '515',
194
+ '埔鹽鄉': '516',
195
+ '田中鎮': '520',
196
+ '北斗鎮': '521',
197
+ '田尾鄉': '522',
198
+ '埤頭鄉': '523',
199
+ '溪州鄉': '524',
200
+ '竹塘鄉': '525',
201
+ '二林鎮': '526',
202
+ '大城鄉': '527',
203
+ '芳苑鄉': '528',
204
+ '二水鄉': '530'
205
+ },
206
+ '南投縣': {
207
+ '南投市': '540',
208
+ '中寮鄉': '541',
209
+ '草屯鎮': '542',
210
+ '國姓鄉': '544',
211
+ '埔里鎮': '545',
212
+ '仁愛鄉': '546',
213
+ '名間鄉': '551',
214
+ '集集鎮': '552',
215
+ '水里鄉': '553',
216
+ '魚池鄉': '555',
217
+ '信義鄉': '556',
218
+ '竹山鎮': '557',
219
+ '鹿谷鄉': '558'
220
+ },
221
+ '嘉義市': {
222
+ '東區': '600',
223
+ '西區': '600'
224
+ },
225
+ '嘉義縣': {
226
+ '番路鄉': '602',
227
+ '梅山鄉': '603',
228
+ '竹崎鄉': '604',
229
+ '阿里山': '605',
230
+ '中埔鄉': '606',
231
+ '大埔鄉': '607',
232
+ '水上鄉': '608',
233
+ '鹿草鄉': '611',
234
+ '太保市': '612',
235
+ '朴子市': '613',
236
+ '東石鄉': '614',
237
+ '六腳鄉': '615',
238
+ '新港鄉': '616',
239
+ '民雄鄉': '621',
240
+ '大林鎮': '622',
241
+ '溪口鄉': '623',
242
+ '義竹鄉': '624',
243
+ '布袋鎮': '625'
244
+ },
245
+ '雲林縣': {
246
+ '斗南鎮': '630',
247
+ '大埤鄉': '631',
248
+ '虎尾鎮': '632',
249
+ '土庫鎮': '633',
250
+ '褒忠鄉': '634',
251
+ '東勢鄉': '635',
252
+ '臺西鄉': '636',
253
+ '崙背鄉': '637',
254
+ '麥寮鄉': '638',
255
+ '斗六市': '640',
256
+ '林內鄉': '643',
257
+ '古坑鄉': '646',
258
+ '莿桐鄉': '647',
259
+ '西螺鎮': '648',
260
+ '二崙鄉': '649',
261
+ '北港鎮': '651',
262
+ '水林鄉': '652',
263
+ '口湖鄉': '653',
264
+ '四湖鄉': '654',
265
+ '元長鄉': '655'
266
+ },
267
+ '台南市': {
268
+ '中西區': '700',
269
+ '東區': '701',
270
+ '南區': '702',
271
+ '北區': '704',
272
+ '安平區': '708',
273
+ '安南區': '709',
274
+ '永康區': '710',
275
+ '歸仁區': '711',
276
+ '新化區': '712',
277
+ '左鎮區': '713',
278
+ '玉井區': '714',
279
+ '楠西區': '715',
280
+ '南化區': '716',
281
+ '仁德區': '717',
282
+ '關廟區': '718',
283
+ '龍崎區': '719',
284
+ '官田區': '720',
285
+ '麻豆區': '721',
286
+ '佳里區': '722',
287
+ '西港區': '723',
288
+ '七股區': '724',
289
+ '將軍區': '725',
290
+ '學甲區': '726',
291
+ '北門區': '727',
292
+ '新營區': '730',
293
+ '後壁區': '731',
294
+ '白河區': '732',
295
+ '東山區': '733',
296
+ '六甲區': '734',
297
+ '下營區': '735',
298
+ '柳營區': '736',
299
+ '鹽水區': '737',
300
+ '善化區': '741',
301
+ '大內區': '742',
302
+ '山上區': '743',
303
+ '新市區': '744',
304
+ '安定區': '745'
305
+ },
306
+ '高雄市': {
307
+ '新興區': '800',
308
+ '前金區': '801',
309
+ '苓雅區': '802',
310
+ '鹽埕區': '803',
311
+ '鼓山區': '804',
312
+ '旗津區': '805',
313
+ '前鎮區': '806',
314
+ '三民區': '807',
315
+ '楠梓區': '811',
316
+ '小港區': '812',
317
+ '左營區': '813',
318
+ '仁武區': '814',
319
+ '大社區': '815',
320
+ '岡山區': '820',
321
+ '路竹區': '821',
322
+ '阿蓮區': '822',
323
+ '田寮鄉': '823',
324
+ '燕巢區': '824',
325
+ '橋頭區': '825',
326
+ '梓官區': '826',
327
+ '彌陀區': '827',
328
+ '永安區': '828',
329
+ '湖內鄉': '829',
330
+ '鳳山區': '830',
331
+ '大寮區': '831',
332
+ '林園區': '832',
333
+ '鳥松區': '833',
334
+ '大樹區': '840',
335
+ '旗山區': '842',
336
+ '美濃區': '843',
337
+ '六龜區': '844',
338
+ '內門區': '845',
339
+ '杉林區': '846',
340
+ '甲仙區': '847',
341
+ '桃源區': '848',
342
+ '那瑪夏區': '849',
343
+ '茂林區': '851',
344
+ '茄萣區': '852'
345
+ },
346
+ '屏東縣': {
347
+ '屏東市': '900',
348
+ '三地門': '901',
349
+ '霧臺鄉': '902',
350
+ '瑪家鄉': '903',
351
+ '九如鄉': '904',
352
+ '里港鄉': '905',
353
+ '高樹鄉': '906',
354
+ '鹽埔鄉': '907',
355
+ '長治鄉': '908',
356
+ '麟洛鄉': '909',
357
+ '竹田鄉': '911',
358
+ '內埔鄉': '912',
359
+ '萬丹鄉': '913',
360
+ '潮州鎮': '920',
361
+ '泰武鄉': '921',
362
+ '來義鄉': '922',
363
+ '萬巒鄉': '923',
364
+ '崁頂鄉': '924',
365
+ '新埤鄉': '925',
366
+ '南州鄉': '926',
367
+ '林邊鄉': '927',
368
+ '東港鎮': '928',
369
+ '琉球鄉': '929',
370
+ '佳冬鄉': '931',
371
+ '新園鄉': '932',
372
+ '枋寮鄉': '940',
373
+ '枋山鄉': '941',
374
+ '春日鄉': '942',
375
+ '獅子鄉': '943',
376
+ '車城鄉': '944',
377
+ '牡丹鄉': '945',
378
+ '恆春鎮': '946',
379
+ '滿州鄉': '947'
380
+ },
381
+ '台東縣': {
382
+ '臺東市': '950',
383
+ '綠島鄉': '951',
384
+ '蘭嶼鄉': '952',
385
+ '延平鄉': '953',
386
+ '卑南鄉': '954',
387
+ '鹿野鄉': '955',
388
+ '關山鎮': '956',
389
+ '海端鄉': '957',
390
+ '池上鄉': '958',
391
+ '東河鄉': '959',
392
+ '成功鎮': '961',
393
+ '長濱鄉': '962',
394
+ '太麻里鄉': '963',
395
+ '金峰鄉': '964',
396
+ '大武鄉': '965',
397
+ '達仁鄉': '966'
398
+ },
399
+ '花蓮縣': {
400
+ '花蓮市': '970',
401
+ '新城鄉': '971',
402
+ '秀林鄉': '972',
403
+ '吉安鄉': '973',
404
+ '壽豐鄉': '974',
405
+ '鳳林鎮': '975',
406
+ '光復鄉': '976',
407
+ '豐濱鄉': '977',
408
+ '瑞穗鄉': '978',
409
+ '萬榮鄉': '979',
410
+ '玉里鎮': '981',
411
+ '卓溪鄉': '982',
412
+ '富里鄉': '983'
413
+ },
414
+ '金門縣': {
415
+ '金沙鎮': '890',
416
+ '金湖鎮': '891',
417
+ '金寧鄉': '892',
418
+ '金城鎮': '893',
419
+ '烈嶼鄉': '894',
420
+ '烏坵鄉': '896'
421
+ },
422
+ '連江縣': {
423
+ '南竿鄉': '209',
424
+ '北竿鄉': '210',
425
+ '莒光鄉': '211',
426
+ '東引鄉': '212'
427
+ },
428
+ '澎湖縣': {
429
+ '馬公市': '880',
430
+ '西嶼鄉': '881',
431
+ '望安鄉': '882',
432
+ '七美鄉': '883',
433
+ '白沙鄉': '884',
434
+ '湖西鄉': '885'
435
+ },
436
+ '南海諸島': {
437
+ '東沙': '817',
438
+ '南沙': '819'
439
+ }
440
+ };
441
+
442
+ /**
443
+ * _hasOwnProperty for compatibility IE
444
+ * @param {Object} obj Object
445
+ * @param {string} property Property name
446
+ * @return {bool}
447
+ * @version 2.4.3
448
+ */
449
+ function _hasOwnProperty(obj, property) {
450
+ try {
451
+ return !window.hasOwnProperty ?
452
+ Object.prototype.hasOwnProperty.call(obj, property.toString()) :
453
+ obj.hasOwnProperty(property.toString());
454
+ } catch (ignore) {}
455
+ }
456
+ /**
457
+ * twzipcode Constructor
458
+ * @param {Object} container HTML element
459
+ * @param {(Object|string)} options User settings
460
+ * @constructor
461
+ */
462
+ function TWzipcode(container, options) {
463
+ /**
464
+ * Default settings
465
+ * @type {Object}
466
+ */
467
+ var defaults = {
468
+ 'countyName': 'county',
469
+ 'countySel': '',
470
+ 'css': [],
471
+ 'detect': false, // v1.6.7
472
+ 'districtName': 'district',
473
+ 'districtSel': '',
474
+ 'onCountySelect': null, // v1.5
475
+ 'onDistrictSelect': null, // v1.5
476
+ 'onZipcodeKeyUp': null, // v1.5
477
+ 'readonly': false,
478
+ 'zipcodeName': 'zipcode',
479
+ 'zipcodeSel': '',
480
+ 'zipcodeIntoDistrict': false, // v1.6.6
481
+ 'googleMapsKey': '' // v1.6.9
126
482
  };
483
+ /**
484
+ * DOM of selector
485
+ * @type {Object}
486
+ */
487
+ this.container = $(container);
488
+ /**
489
+ * Merge the options
490
+ * @type {Object}
491
+ */
492
+ this.options = $.extend({}, defaults, options);
493
+ // initialize
494
+ this.init();
495
+ }
496
+ /**
497
+ * twzipcode prototype
498
+ */
499
+ TWzipcode.prototype = {
127
500
 
128
- // Public functions
129
- var methods = {
130
-
131
- // Initialize
132
- init: function (options) {
133
-
134
- return this.each(function () {
135
-
136
- // Default settings
137
- var opts = $.extend({
138
- detect: false, //v1.4
139
- countyName: 'county',
140
- districtName: 'district',
141
- zipcodeName: 'zipcode',
142
- countySel: '',
143
- districtSel: '',
144
- zipcodeSel: '',
145
- readonly: false,
146
- onCountySelect: null, //v1.5
147
- onDistrictSelect: null, //v1.5
148
- onZipcodeKeyUp: null, //v1.5
149
- css: []
150
- }, options),
151
- self = $(this),
152
- tpl = [],
153
- wrap = {},
154
- county = {},
155
- opt = ['<option value="">縣市</option>', '<option value="">鄉鎮市區</option>'],
156
- // Data property
157
- role = {
158
- county: self.find('[data-role="county"]:first'),
159
- district: self.find('[data-role="district"]:first'),
160
- zipcode: self.find('[data-role="zipcode"]:first')
161
- };
162
-
163
- // Elements create
164
- $('<select/>')
165
- .attr({'name': opts.countyName, 'id': opts.countyName})
166
- .addClass(role.county.data('style') || (undefined !== opts.css[0] ? opts.css[0] : ''))
167
- .appendTo(role.county.length ? role.county : this);
168
-
169
- $('<select/>')
170
- .attr({'name': opts.districtName, 'id': opts.districtName})
171
- .addClass(role.district.data('style') || (undefined !== opts.css[1] ? opts.css[1] : ''))
172
- .appendTo(role.district.length ? role.district : this);
173
-
174
- $('<input/>')
175
- .attr({'type': 'text', 'name': opts.zipcodeName, 'id': opts.zipcodeName})
176
- .prop('readonly', opts.readonly)
177
- .addClass(role.zipcode.data('style') || (undefined !== opts.css[2] ? opts.css[2] : ''))
178
- .appendTo(role.zipcode.length ? role.zipcode : this);
179
-
180
- // Elements collection
181
- wrap.selector = {
182
- county: 'select[name="' + opts.countyName + '"][id="' + opts.countyName + '"]:first',
183
- district: 'select[name="' + opts.districtName + '"][id="' + opts.districtName + '"]:first',
184
- zipcode: 'input[type=text][name="' + opts.zipcodeName + '"][id="' + opts.zipcodeName + '"]:first'
185
- };
186
- wrap.county = self.find(wrap.selector.county);
187
- wrap.district = self.find(wrap.selector.district);
188
- wrap.zipcode = self.find(wrap.selector.zipcode);
189
-
190
- // Fill up the county list
191
- $(opt[0]).appendTo(wrap.county);
192
- $(opt[1]).appendTo(wrap.district);
193
-
194
- for (county in data) {
195
- if (data.hasOwnProperty(county)) {
196
- tpl.push('<option value="');
197
- tpl.push(county);
198
- tpl.push('">');
199
- tpl.push(county);
200
- tpl.push('</option>');
201
- }
202
- }
501
+ VERSION: '1.7.1',
203
502
 
204
- $(tpl.join('')).appendTo(wrap.county);
205
-
206
- // County change event
207
- self.on('change', wrap.selector.county, function () {
208
- var val = $(this).val(), tpl = [], district;
209
- wrap.district.empty();
210
- if (val) {
211
- for (district in data[val]) {
212
- if (data[val].hasOwnProperty(district)) {
213
- tpl.push('<option value="');
214
- tpl.push(district);
215
- tpl.push('">');
216
- tpl.push(district);
217
- tpl.push('</option>');
218
- }
219
- }
220
- wrap.district.append(tpl.join('')).trigger('change');
221
- } else {
222
- wrap.county.children('option:first').prop('selected', true);
223
- wrap.district.empty().append(opt[1]);
224
- wrap.zipcode.val('');
225
- }
226
- // callback binding
227
- if ('function' === typeof opts.onCountySelect) {
228
- opts.onCountySelect.call(this, wrap.county);
229
- }
230
- });
231
-
232
- // District change event
233
- self.on('change', wrap.selector.district, function () {
234
- var val = $(this).val();
235
- if (wrap.county.val()) {
236
- wrap.zipcode.val(data[wrap.county.val()][val]);
237
- }
238
- if ('function' === typeof opts.onDistrictSelect) {
239
- opts.onDistrictSelect.call(this, wrap.district);
240
- }
241
- });
242
-
243
- // Zipcode keyup, blur event
244
- self.on('keyup blur', wrap.selector.zipcode, function () {
245
- var me = $(this), val = '', i, j;
246
- me.val(me.val().replace(/[^0-9]/g, ''));
247
- val = me.val().toString();
248
- if (3 === val.length) {
249
- for (i in data) {
250
- if (data.hasOwnProperty(i)) {
251
- for (j in data[i]) {
252
- if (data[i].hasOwnProperty(j)) {
253
- if (val === data[i][j]) {
254
- wrap.county.val(i).trigger('change');
255
- wrap.district.val(j).trigger('change');
256
- break;
257
- }
258
- }
259
- }
260
- }
261
- }
262
- }
263
- if ('function' === typeof opts.onZipcodeKeyUp) {
264
- opts.onZipcodeKeyUp.call(this, wrap.zipcode);
265
- }
266
- });
267
-
268
- // After DOM creating successful trigger the event.
269
- wrap.county.val(opts.countySel).trigger('change');
270
-
271
- if (0 !== opts.districtSel.length) {
272
- wrap.district.val(opts.districtSel);
273
- } else {
274
- wrap.district.children('option:first').prop('selected', true);
275
- }
276
- wrap.zipcode.val(opts.zipcodeSel).trigger('blur');
277
- wrap.district.trigger('change');
278
-
279
- /**
280
- * location detection by W3C Geolocation API.
281
- * @version: 1.4.1
282
- */
283
- if (true === opts.detect) {
284
- // Ensure the google maps API has loaded.
285
- if ('object' !== typeof google.maps) {
286
- alert('Google Maps API was not reloaded.');
287
- return;
288
- }
289
- try {
290
- // browser supported
291
- if (undefined !== navigator.geolocation) {
292
- navigator.geolocation.getCurrentPosition(function (loc) {
293
- if (loc) {
294
- var geocoder = new google.maps.Geocoder(),
295
- latlng = new google.maps.LatLng(loc.coords.latitude, loc.coords.longitude);
296
- console.log(latlng);
297
- geocoder.geocode({'latLng': latlng}, function (results, status) {
298
- if (status === google.maps.GeocoderStatus.OK) {
299
- if (results[1]) {
300
- var zipcode = results[1].formatted_address.substring(0, 3);
301
- console.log(zipcode);
302
- if (0 !== zipcode) {
303
- wrap.zipcode.val(zipcode).trigger('blur');
304
- }
305
- }
306
- } else {
307
- alert('Geocoder failed due to: ' + status);
308
- }
309
- });
310
- }
311
- }, function (err) {
312
- console.log(err);
313
- });
314
- } else {
315
- alert('Your browser is not supported W3C Geolocation API.');
316
- return;
317
- }
318
- } catch (ignore) {
319
- }
503
+ /**
504
+ * Method: Get all post data
505
+ * @return {Object}
506
+ */
507
+ data: function() {
508
+ var wrap = this.wrap;
509
+ return _hasOwnProperty(data, wrap.county.val()) ? data[wrap.county.val()] : data;
510
+ },
511
+
512
+ /**
513
+ * Method: Serialize the data
514
+ * @return {string}
515
+ */
516
+ serialize: function() {
517
+ var result = [],
518
+ obj = {},
519
+ ele = {},
520
+ s = {};
521
+ obj = this.container.find('select,input');
522
+ if (obj.length) {
523
+ obj.each(function() {
524
+ ele = $(this);
525
+ result.push(ele.attr('name') + '=' + ele.val());
526
+ });
527
+ } else {
528
+ $(this).children().each(function() {
529
+ s = $(this);
530
+ result.push(s.attr('name') + '=' + s.val());
531
+ });
532
+ }
533
+ return result.join('&');
534
+ },
535
+
536
+ /**
537
+ * Method: Destroy the container.
538
+ * @this {twzipcode}
539
+ */
540
+ destroy: function() {
541
+ $.data(this.container.get(0), 'twzipcode', null);
542
+ if (this.container.length) {
543
+ return this.container.empty().off('change keyup blur');
544
+ }
545
+ },
546
+
547
+ /**
548
+ * Method: Reset the selected items to default.
549
+ * @this {twzipcode}
550
+ */
551
+ reset: function(container, obj) {
552
+ var self = this,
553
+ wrap = self.wrap,
554
+ county = {},
555
+ list = {
556
+ 'county': '<option value="">縣市</option>',
557
+ 'district': '<option value="">鄉鎮市區</option>'
558
+ },
559
+ tpl = [];
560
+
561
+ switch (obj) {
562
+ case 'district':
563
+ wrap.district.empty().html(list.district);
564
+ break;
565
+ default:
566
+ wrap.county.empty().html(list.county);
567
+ wrap.district.empty().html(list.district);
568
+ for (county in data) {
569
+ if (_hasOwnProperty(data, county)) {
570
+ tpl.push('<option value="' + county + '">' + county + '</option>');
571
+ }
572
+ }
573
+ $(tpl.join('')).appendTo(wrap.county);
574
+ break;
575
+ }
576
+ wrap.zipcode.val('');
577
+ },
578
+
579
+ /**
580
+ * Binding the event of the elements
581
+ * @this {twzipcode}
582
+ */
583
+ bindings: function() {
584
+
585
+ var self = this,
586
+ opts = self.options,
587
+ wrap = self.wrap,
588
+ dz = '',
589
+ dc = '',
590
+ dd = '';
591
+
592
+ // county
593
+ wrap.county.on('change', function() {
594
+ var val = $(this).val(),
595
+ district = {},
596
+ tpl = [];
597
+
598
+ wrap.district.empty();
599
+
600
+ if (val) {
601
+ if (true === opts.zipcodeIntoDistrict) {
602
+ for (district in data[val]) {
603
+ if (_hasOwnProperty(data[val], district)) {
604
+ tpl.push('<option value="' + district + '">');
605
+ tpl.push(data[val][district] + ' ' + district);
606
+ tpl.push('</option>');
607
+ }
608
+ }
609
+ } else {
610
+ for (district in data[val]) {
611
+ if (_hasOwnProperty(data[val], district)) {
612
+ tpl.push('<option value="' + district + '">');
613
+ tpl.push(district);
614
+ tpl.push('</option>');
615
+ }
616
+ }
617
+ }
618
+ wrap.district.append(tpl.join('')).trigger('change');
619
+ } else {
620
+ wrap.county.find('option:first').prop('selected', true);
621
+ self.reset('district');
622
+ }
623
+ // County callback binding
624
+ if ('function' === typeof opts.onCountySelect) {
625
+ opts.onCountySelect.call(this, wrap.county);
626
+ }
627
+ });
628
+ // District
629
+ wrap.district.on('change', function() {
630
+ var val = $(this).val();
631
+ if (wrap.county.val()) {
632
+ wrap.zipcode.val(data[wrap.county.val()][val]);
633
+ }
634
+ // District callback binding
635
+ if ('function' === typeof opts.onDistrictSelect) {
636
+ opts.onDistrictSelect.call(this, wrap.district);
637
+ }
638
+ });
639
+ // Zipcode
640
+ wrap.zipcode.on('keyup blur', function() {
641
+ var obj = $(this),
642
+ val = '',
643
+ i = '',
644
+ j = '';
645
+ obj.val(obj.val().replace(/[^0-9]/g, ''));
646
+ val = obj.val().toString();
647
+
648
+ if (3 === val.length) {
649
+ for (i in data) {
650
+ if (_hasOwnProperty(data, i)) {
651
+ for (j in data[i]) {
652
+ if (_hasOwnProperty(data[i], j)) {
653
+ if (val === data[i][j]) {
654
+ wrap.county.val(i).trigger('change');
655
+ wrap.district.val(j).trigger('change');
656
+ break;
657
+ }
320
658
  }
321
- });
659
+ }
660
+ }
661
+ }
662
+ }
663
+ // Zipcode callback binding
664
+ if ('function' === typeof opts.onZipcodeKeyUp) {
665
+ opts.onZipcodeKeyUp.call(this, wrap.zipcode);
666
+ }
667
+ });
668
+
669
+ dz = opts.zipcodeSel ?
670
+ opts.zipcodeSel :
671
+ (
672
+ undefined !== self.role.zipcode.data('value') ?
673
+ self.role.zipcode.data('value') :
674
+ opts.zipcodeSel
675
+ );
676
+
677
+ dc = opts.countySel ?
678
+ opts.countySel :
679
+ (
680
+ undefined !== self.role.county.data('value') ?
681
+ self.role.county.data('value') :
682
+ opts.countySel
683
+ );
684
+
685
+ dd = opts.districtSel ?
686
+ opts.districtSel :
687
+ (
688
+ undefined !== self.role.district.data('value') ?
689
+ self.role.district.data('value') :
690
+ opts.districtSel
691
+ );
692
+
693
+ // Default value
694
+ if (dc) {
695
+ self.wrap.county.val(dc).trigger('change');
696
+ if (_hasOwnProperty(data[dc], dd)) {
697
+ self.wrap.district.val(dd).trigger('change');
698
+ }
699
+ }
700
+ if (dz && 3 === dz.toString().length) {
701
+ self.wrap.zipcode.val(dz).trigger('blur');
702
+ }
703
+ },
704
+
705
+ /**
706
+ * Geolocation detect
707
+ * @this {twzipcode}
708
+ */
709
+ geoLocation: function() {
710
+ var self = this,
711
+ geolocation = navigator.geolocation,
712
+ options = {
713
+ 'maximumAge': 600000,
714
+ 'timeout': 3000,
715
+ 'enableHighAccuracy': false
322
716
  },
717
+ opts = self.options;
323
718
 
324
- //destroy
325
- destroy: function () {
326
- return this.each(function () {
327
- //unbind and destroy
328
- $(this).off('change', 'select')
329
- .off('keyup blur', 'input')
330
- .remove();
331
- });
719
+ if (!geolocation) {
720
+ return;
721
+ }
722
+
723
+ geolocation.getCurrentPosition(
724
+ function(loc) {
725
+ var latlng = {};
726
+ if (('coords' in loc) &&
727
+ ('latitude' in loc.coords) &&
728
+ ('longitude' in loc.coords)
729
+ ) {
730
+ latlng = [loc.coords.latitude, loc.coords.longitude];
731
+ $.getJSON(
732
+ 'https://maps.googleapis.com/maps/api/geocode/json', {
733
+ 'key': opts.googleMapsKey,
734
+ 'sensor': false,
735
+ 'latlng': latlng.join(',')
736
+ },
737
+ function(data) {
738
+ var postal = '';
739
+ if (data &&
740
+ _hasOwnProperty(data, 'results') &&
741
+ _hasOwnProperty(data.results[0], 'address_components') &&
742
+ undefined !== data.results[0].address_components[0]
743
+ ) {
744
+ postal = data.results[0]
745
+ .address_components[data.results[0].address_components.length - 1]
746
+ .long_name;
747
+ if (postal) {
748
+ self.wrap.zipcode.val(postal.toString()).trigger('blur');
749
+ }
750
+ }
751
+ });
752
+ }
332
753
  },
333
- //reset values
334
- reset: function () {
335
- return this.each(function () {
336
- $(this).find('select:first').children('option:first').prop('selected', true).trigger('change');
337
- });
754
+ function(error) {
755
+ //console.error(error);
338
756
  },
757
+ options
758
+ );
759
+ },
339
760
 
340
- //serialize result
341
- serialize: function () {
342
- var result = [], obj = {}, s = {}, sel = {}, ele = {};
343
- this.each(function () {
344
- obj = $(this), sel = obj.find('select,input');
345
- if (sel.length) {
346
- sel.each(function () {
347
- ele = $(this);
348
- result.push(ele.attr('name') + '=' + ele.val());
349
- });
350
- } else {
351
- $(this).children().each(function () {
352
- s = $(this);
353
- result.push(s.attr('name') + '=' + s.val());
354
- });
355
- }
356
- });
357
- return result.join('&');
358
- }
359
- };
761
+ /**
762
+ * twzipcode Initialize
763
+ * @this {twzipcode}
764
+ */
765
+ init: function() {
360
766
 
361
- // main
362
- $.fn.twzipcode = function (method) {
363
- return 'string' === typeof method ? methods[method].apply(this, Array.prototype.slice.call(arguments, 1)) : methods.init.apply(this, arguments);
364
- };
767
+ var self = this,
768
+ container = self.container,
769
+ opts = self.options,
770
+ role = {
771
+ county: container.find('[data-role=county]:first'),
772
+ district: container.find('[data-role=district]:first'),
773
+ zipcode: container.find('[data-role=zipcode]:first')
774
+ },
775
+ countyName = role.county.data('name') || opts.countyName,
776
+ districtName = role.district.data('name') || opts.districtName,
777
+ zipcodeName = role.zipcode.data('name') || opts.zipcodeName,
778
+ readonly = role.zipcode.data('readonly') || opts.readonly;
779
+
780
+ // Elements create
781
+ $('<select/>')
782
+ .attr('name', countyName)
783
+ .addClass(role.county.data('style') || (undefined !== opts.css[0] ? opts.css[0] : ''))
784
+ .appendTo(role.county.length ? role.county : container);
785
+
786
+ $('<select/>')
787
+ .attr('name', districtName)
788
+ .addClass(role.district.data('style') || (undefined !== opts.css[1] ? opts.css[1] : ''))
789
+ .appendTo(role.district.length ? role.district : container);
790
+
791
+ $('<input/>')
792
+ .attr({
793
+ 'type': 'text',
794
+ 'name': zipcodeName
795
+ })
796
+ .prop('readonly', readonly)
797
+ .addClass(role.zipcode.data('style') || (undefined !== opts.css[2] ? opts.css[2] : ''))
798
+ .appendTo(role.zipcode.length ? role.zipcode : container);
799
+
800
+ self.wrap = {
801
+ 'county': container.find('select[name="' + countyName + '"]:first'),
802
+ 'district': container.find('select[name="' + districtName + '"]:first'),
803
+ 'zipcode': container.find('input[type=text][name="' + zipcodeName + '"]:first')
804
+ };
805
+
806
+ if (true === opts.zipcodeIntoDistrict) {
807
+ self.wrap.zipcode.hide();
808
+ }
809
+
810
+ self.role = role;
811
+ // Reset the elements
812
+ self.reset();
813
+ // Elements events binding
814
+ self.bindings();
815
+ // Geolocation
816
+ if (true === opts.detect) {
817
+ self.geoLocation();
818
+ }
819
+ }
820
+ };
821
+
822
+ /**
823
+ * jQuery twzipcode instance
824
+ * @param {Object} options Plugin settings
825
+ * @public
826
+ */
827
+ $.fn.twzipcode = function(options) {
828
+ if ('string' === typeof options) {
829
+ switch (options) {
830
+ case 'data':
831
+ case 'destroy':
832
+ case 'reset':
833
+ case 'serialize':
834
+ var result = {},
835
+ instance = {};
836
+ this.each(function() {
837
+ instance = $.data(this, 'twzipcode');
838
+ if (instance instanceof TWzipcode && 'function' === typeof instance[options]) {
839
+ result = instance[options].apply(instance, Array.prototype.slice.call(arguments, 1));
840
+ }
841
+ });
842
+ break;
843
+ }
844
+ return undefined !== result ? result : this;
845
+ } else {
846
+ return this.each(function() {
847
+ if (!$.data(this, 'twzipcode')) {
848
+ $.data(this, 'twzipcode', new TWzipcode(this, options));
849
+ }
850
+ });
851
+ }
852
+ };
365
853
 
366
- }(jQuery));
854
+ }(jQuery, window));