korean_zipcode_finder 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,4 @@
1
+ *.gem
2
+ .bundle
3
+ Gemfile.lock
4
+ pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "http://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in korean_zipcode_finder.gemspec
4
+ gemspec
data/README.mkd ADDED
@@ -0,0 +1,67 @@
1
+ Korean Zipcode Finder
2
+ =====================
3
+
4
+ * 인터넷 우체국 제공 우편번호 찾기 API를 사용한 우편번호 찾기 gem
5
+ * http://biz.epost.go.kr/eportal/custom/custom_10.jsp?subGubun=sub_4&subGubun_1=cum_20
6
+
7
+
8
+ 사용법 (Usage)
9
+ -----------
10
+
11
+ * 아직 gem으로 publish되어 있지 않음.
12
+ * 인터넷우체국에서 api_key를 발급
13
+ * api_key config설정에 추가
14
+
15
+ ``` ruby
16
+ KoreanZipcodeFinder.configure do |config|
17
+ config.api_key = "#{YOUR_API_KEY}"
18
+ end
19
+
20
+ KoreanZipcodeFinder.find_zipcode('망원동')
21
+ ```
22
+
23
+
24
+ Rails 3 Engine
25
+ --------------
26
+
27
+ **기본 설정**
28
+
29
+ * Gemfile에 추가
30
+ * Rails config 폴더에 api_key config 추가 (위의 경우와 동일)
31
+ * application.js / application.css.scss 에서 파일 로드
32
+
33
+ ``` javascript
34
+ //= require korean_zipcode_finder/core
35
+ ```
36
+
37
+ ``` css
38
+ *= require korean_zipcode_finder/core
39
+ ```
40
+
41
+ **twitter bootstrap 호환**
42
+ * twitter bootstrap를 사용하는 경우에는 css파일을 include할 필요 없음.
43
+ * core.css 파일은 twitter bootstrap의 기본 설정 중 필요한 것만 가져온 파일임.
44
+ * (팝업용 스크립트는 bootstrap것을 사용하지 않음)
45
+
46
+ **html 마크업**
47
+
48
+ * ".address" class를 가진 wrapper 속에 ".zipcode_01", ".zipcode_02", ".address_01" 클라스를 가진 text_area 생성
49
+ * ".find_zipcode_btn" class를 가진 우편번호 찾기 링크
50
+
51
+ ``` html
52
+ <div class="address_area">
53
+ <%= f.label :address %> <br />
54
+ <%= f.text_field :zipcode_01, :class => "zipcode_01" %> - <%= f.text_field :zipcode_02, :class => "zipcode_02" %> <%= link_to '우편번호 찾기', '#', :class => "find_zipcode_btn" %><br />
55
+ <%= f.text_field :address_01, :class => "address_01" %> <br />
56
+ <%= f.text_field :address_02, :class => "address_02" %>
57
+ </div>
58
+ ```
59
+
60
+ **적용하기**
61
+
62
+ ``` javascript
63
+ $(function() {
64
+ new KoreanZipcodeFinder;
65
+ });
66
+ ```
67
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,69 @@
1
+ var KoreanZipcodeFinder;
2
+
3
+ KoreanZipcodeFinder = (function() {
4
+ // constructor
5
+ function KoreanZipcodeFinder() {
6
+ this.init = $.proxy(this.init, this);
7
+ this.zipcode_selected_handler = $.proxy(this.zipcode_selected_handler, this);
8
+ this.find_zipcode_handler = $.proxy(this.find_zipcode_handler, this);
9
+ this.close_modal_handler = $.proxy(this.close_modal_handler, this);
10
+ this.escape_pressed_handler = $.proxy(this.escape_pressed_handler, this);
11
+
12
+ $(document).on("focus", ".address_area .zipcode_01", this.init);
13
+ $(document).on("focus", ".address_area .zipcode_02", this.init);
14
+ $(document).on("click", ".address_area .find_zipcode_btn", this.init);
15
+
16
+ $(document).on("submit", ".korean_zipcode_finder_modal_wrapper .find_zipcode_form", this.find_zipcode_handler);
17
+ $(document).on("click", ".korean_zipcode_finder_modal_wrapper .zipcode_select", this.zipcode_selected_handler);
18
+ $(document).on("click", ".korean_zipcode_finder_modal_wrapper .close_modal_popup", this.close_modal_handler);
19
+ }
20
+
21
+ KoreanZipcodeFinder.prototype.init = function(e) {
22
+ // address_ares 등록
23
+ this.current_address_area = $(e.target).closest(".address_area");
24
+
25
+ // zipcode modal 띄우기
26
+ $('body').append( $('<div/>', {'class': 'modal-backdrop'}) );
27
+ $.get("/korean_zipcode_finder/zipcodes/new", function(html) { $("body").append(html) });
28
+ $("#dong").focus();
29
+
30
+ // escape key handler
31
+ $(document).on('keydown', this.escape_pressed_handler );
32
+ e.preventDefault();
33
+ }
34
+
35
+ // modal event handers
36
+ KoreanZipcodeFinder.prototype.close_modal_handler = function(e) {
37
+ $(".modal-backdrop").remove();
38
+ $(".korean_zipcode_finder_modal_wrapper").remove();
39
+ $(document).off('keydown');
40
+ e.preventDefault();
41
+ }
42
+
43
+ KoreanZipcodeFinder.prototype.escape_pressed_handler = function(e) {
44
+ if (e.keyCode == 27 ) { this.close_modal_handler(e) }
45
+ }
46
+
47
+ KoreanZipcodeFinder.prototype.find_zipcode_handler = function(e) {
48
+ $.get($(e.target).attr('action'), $(e.target).serialize(), function(html) {
49
+ $(".zipcode_list_box").empty().append(html);
50
+ });
51
+ e.preventDefault();
52
+ }
53
+
54
+ KoreanZipcodeFinder.prototype.zipcode_selected_handler = function(e) {
55
+ // .data() method를 사용할 경우 zipcode값이 integer로 들어온다. 001이 1로 들어옴zipcode
56
+ var zipcode_01 = $(e.target).attr('data-zipcode01');
57
+ var zipcode_02 = $(e.target).attr('data-zipcode02');
58
+ var address_01 = $(e.target).data('address01');
59
+
60
+ this.current_address_area.find(".zipcode_01").val(zipcode_01);
61
+ this.current_address_area.find(".zipcode_02").val(zipcode_02);
62
+ this.current_address_area.find(".address_01").val(address_01);
63
+
64
+ this.close_modal_handler(e);
65
+ }
66
+
67
+ return KoreanZipcodeFinder;
68
+ })();
69
+
@@ -0,0 +1,288 @@
1
+ /*!
2
+ * Bootstrap v2.0.4
3
+ *
4
+ * Copyright 2012 Twitter, Inc
5
+ * Licensed under the Apache License v2.0
6
+ * http://www.apache.org/licenses/LICENSE-2.0
7
+ *
8
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
+ */
10
+
11
+ .korean_zipcode_finder_modal_wrapper {
12
+ font-size: 13px;
13
+
14
+ .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";}
15
+ .clearfix:after{clear:both;}
16
+ .hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;}
17
+ .input-block-level{display:block;width:100%;min-height:28px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-ms-box-sizing:border-box;box-sizing:border-box;}
18
+ article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;}
19
+ audio,canvas,video{display:inline-block;*display:inline;*zoom:1;}
20
+ audio:not([controls]){display:none;}
21
+ html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;}
22
+ a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
23
+ a:hover,a:active{outline:0;}
24
+ sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;}
25
+ sup{top:-0.5em;}
26
+ sub{bottom:-0.25em;}
27
+ img{max-width:100%;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;}
28
+ #map_canvas img{max-width:none;}
29
+ button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;}
30
+ button,input{*overflow:visible;line-height:normal;}
31
+ button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;}
32
+ button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;}
33
+ input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;}
34
+ input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;}
35
+ textarea{overflow:auto;vertical-align:top;}
36
+ body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;}
37
+ a{color:#0088cc;text-decoration:none;}
38
+ a:hover{color:#005580;text-decoration:underline;}
39
+ .container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";}
40
+ .container:after{clear:both;}
41
+ .container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";}
42
+ .container-fluid:after{clear:both;}
43
+ p{margin:0 0 9px;}p small{font-size:11px;color:#999999;}
44
+ .lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;}
45
+ h1,h2,h3,h4,h5,h6{margin:0;font-family:inherit;font-weight:bold;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;}
46
+ h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;}
47
+ h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;}
48
+ h3{font-size:18px;line-height:27px;}h3 small{font-size:14px;}
49
+ h4,h5,h6{line-height:18px;}
50
+ h4{font-size:14px;}h4 small{font-size:12px;}
51
+ h5{font-size:12px;}
52
+ h6{font-size:11px;color:#999999;text-transform:uppercase;}
53
+ .page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;}
54
+ .page-header h1{line-height:1;}
55
+ ul,ol{padding:0;margin:0 0 9px 25px;}
56
+ ul ul,ul ol,ol ol,ol ul{margin-bottom:0;}
57
+ ul{list-style:disc;}
58
+ ol{list-style:decimal;}
59
+ li{line-height:18px;}
60
+ ul.unstyled,ol.unstyled{margin-left:0;list-style:none;}
61
+ dl{margin-bottom:18px;}
62
+ dt,dd{line-height:18px;}
63
+ dt{font-weight:bold;line-height:17px;}
64
+ dd{margin-left:9px;}
65
+ .dl-horizontal dt{float:left;width:120px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
66
+ .dl-horizontal dd{margin-left:130px;}
67
+ hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;}
68
+ strong{font-weight:bold;}
69
+ em{font-style:italic;}
70
+ .muted{color:#999999;}
71
+ abbr[title]{cursor:help;border-bottom:1px dotted #999999;}
72
+ abbr.initialism{font-size:90%;text-transform:uppercase;}
73
+ blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;}
74
+ blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';}
75
+ blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;}
76
+ q:before,q:after,blockquote:before,blockquote:after{content:"";}
77
+ address{display:block;margin-bottom:18px;font-style:normal;line-height:18px;}
78
+ small{font-size:100%;}
79
+ cite{font-style:normal;}
80
+ .label,.badge{font-size:10.998px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;}
81
+ .label{padding:1px 4px 2px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
82
+ .badge{padding:1px 9px 2px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;}
83
+ a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;}
84
+ .label-important,.badge-important{background-color:#b94a48;}
85
+ .label-important[href],.badge-important[href]{background-color:#953b39;}
86
+ .label-warning,.badge-warning{background-color:#f89406;}
87
+ .label-warning[href],.badge-warning[href]{background-color:#c67605;}
88
+ .label-success,.badge-success{background-color:#468847;}
89
+ .label-success[href],.badge-success[href]{background-color:#356635;}
90
+ .label-info,.badge-info{background-color:#3a87ad;}
91
+ .label-info[href],.badge-info[href]{background-color:#2d6987;}
92
+ .label-inverse,.badge-inverse{background-color:#333333;}
93
+ .label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;}
94
+ table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;}
95
+ .table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;}
96
+ .table th{font-weight:bold;}
97
+ .table thead th{vertical-align:bottom;}
98
+ .table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;}
99
+ .table tbody+tbody{border-top:2px solid #dddddd;}
100
+ .table-condensed th,.table-condensed td{padding:4px 5px;}
101
+ .table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapsed;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;}
102
+ .table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;}
103
+ .table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;}
104
+ .table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;}
105
+ .table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;}
106
+ .table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;}
107
+ .table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;}
108
+ .table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;}
109
+ table .span1{float:none;width:44px;margin-left:0;}
110
+ table .span2{float:none;width:124px;margin-left:0;}
111
+ table .span3{float:none;width:204px;margin-left:0;}
112
+ table .span4{float:none;width:284px;margin-left:0;}
113
+ table .span5{float:none;width:364px;margin-left:0;}
114
+ table .span6{float:none;width:444px;margin-left:0;}
115
+ table .span7{float:none;width:524px;margin-left:0;}
116
+ table .span8{float:none;width:604px;margin-left:0;}
117
+ table .span9{float:none;width:684px;margin-left:0;}
118
+ table .span10{float:none;width:764px;margin-left:0;}
119
+ table .span11{float:none;width:844px;margin-left:0;}
120
+ table .span12{float:none;width:924px;margin-left:0;}
121
+ table .span13{float:none;width:1004px;margin-left:0;}
122
+ table .span14{float:none;width:1084px;margin-left:0;}
123
+ table .span15{float:none;width:1164px;margin-left:0;}
124
+ table .span16{float:none;width:1244px;margin-left:0;}
125
+ table .span17{float:none;width:1324px;margin-left:0;}
126
+ table .span18{float:none;width:1404px;margin-left:0;}
127
+ table .span19{float:none;width:1484px;margin-left:0;}
128
+ table .span20{float:none;width:1564px;margin-left:0;}
129
+ table .span21{float:none;width:1644px;margin-left:0;}
130
+ table .span22{float:none;width:1724px;margin-left:0;}
131
+ table .span23{float:none;width:1804px;margin-left:0;}
132
+ table .span24{float:none;width:1884px;margin-left:0;}
133
+ form{margin:0 0 18px;}
134
+ fieldset{padding:0;margin:0;border:0;}
135
+ legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:13.5px;color:#999999;}
136
+ label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;}
137
+ input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;}
138
+ label{display:block;margin-bottom:5px;}
139
+ select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;}
140
+ input,textarea{width:210px;}
141
+ textarea{height:auto;}
142
+ textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);}
143
+ input[type="radio"],input[type="checkbox"]{margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;}
144
+ input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;}
145
+ .uneditable-textarea{width:auto;height:auto;}
146
+ select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;}
147
+ select{width:220px;border:1px solid #bbb;}
148
+ select[multiple],select[size]{height:auto;}
149
+ select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
150
+ .radio,.checkbox{min-height:18px;padding-left:18px;}
151
+ .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;}
152
+ .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;}
153
+ .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;}
154
+ .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;}
155
+ .input-mini{width:60px;}
156
+ .input-small{width:90px;}
157
+ .input-medium{width:150px;}
158
+ .input-large{width:210px;}
159
+ .input-xlarge{width:270px;}
160
+ .input-xxlarge{width:530px;}
161
+ input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;}
162
+ .input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;}
163
+ input,textarea,.uneditable-input{margin-left:0;}
164
+ input.span12, textarea.span12, .uneditable-input.span12{width:930px;}
165
+ input.span11, textarea.span11, .uneditable-input.span11{width:850px;}
166
+ input.span10, textarea.span10, .uneditable-input.span10{width:770px;}
167
+ input.span9, textarea.span9, .uneditable-input.span9{width:690px;}
168
+ input.span8, textarea.span8, .uneditable-input.span8{width:610px;}
169
+ input.span7, textarea.span7, .uneditable-input.span7{width:530px;}
170
+ input.span6, textarea.span6, .uneditable-input.span6{width:450px;}
171
+ input.span5, textarea.span5, .uneditable-input.span5{width:370px;}
172
+ input.span4, textarea.span4, .uneditable-input.span4{width:290px;}
173
+ input.span3, textarea.span3, .uneditable-input.span3{width:210px;}
174
+ input.span2, textarea.span2, .uneditable-input.span2{width:130px;}
175
+ input.span1, textarea.span1, .uneditable-input.span1{width:50px;}
176
+ input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;border-color:#ddd;}
177
+ input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;}
178
+ .control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;}
179
+ .control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning .checkbox:focus,.control-group.warning .radio:focus,.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;}
180
+ .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;}
181
+ .control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;}
182
+ .control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error .checkbox:focus,.control-group.error .radio:focus,.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;}
183
+ .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;}
184
+ .control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;}
185
+ .control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success .checkbox:focus,.control-group.success .radio:focus,.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;}
186
+ .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;}
187
+ input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;}
188
+ .form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";}
189
+ .form-actions:after{clear:both;}
190
+ .uneditable-input{overflow:hidden;white-space:nowrap;cursor:not-allowed;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);}
191
+ :-moz-placeholder{color:#999999;}
192
+ :-ms-input-placeholder{color:#999999;}
193
+ ::-webkit-input-placeholder{color:#999999;}
194
+ .help-block,.help-inline{color:#555555;}
195
+ .help-block{display:block;margin-bottom:9px;}
196
+ .help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;}
197
+ .input-prepend,.input-append{margin-bottom:5px;}.input-prepend input,.input-append input,.input-prepend select,.input-append select,.input-prepend .uneditable-input,.input-append .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:middle;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend select:focus,.input-append select:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{z-index:2;}
198
+ .input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;}
199
+ .input-prepend .add-on,.input-append .add-on{display:inline-block;width:auto;height:18px;min-width:16px;padding:4px 5px;font-weight:normal;line-height:18px;text-align:center;text-shadow:0 1px 0 #ffffff;vertical-align:middle;background-color:#eeeeee;border:1px solid #ccc;}
200
+ .input-prepend .add-on,.input-append .add-on,.input-prepend .btn,.input-append .btn{margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
201
+ .input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;}
202
+ .input-prepend .add-on,.input-prepend .btn{margin-right:-1px;}
203
+ .input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
204
+ .input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
205
+ .input-append .uneditable-input{border-right-color:#ccc;border-left-color:#eee;}
206
+ .input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
207
+ .input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}
208
+ .input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;}
209
+ .input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}
210
+ .search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;}
211
+ .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;}
212
+ .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;}
213
+ .form-search label,.form-inline label{display:inline-block;}
214
+ .form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;}
215
+ .form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;}
216
+ .form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;}
217
+ .control-group{margin-bottom:9px;}
218
+ legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;}
219
+ .form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";}
220
+ .form-horizontal .control-group:after{clear:both;}
221
+ .form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;}
222
+ .form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:160px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:160px;}
223
+ .form-horizontal .help-block{margin-top:9px;margin-bottom:0;}
224
+ .form-horizontal .form-actions{padding-left:160px;}
225
+ .btn{display:inline-block;*display:inline;*zoom:1;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;*line-height:20px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;cursor:pointer;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;*background-color:#d9d9d9;}
226
+ .btn:active,.btn.active{background-color:#cccccc \9;}
227
+ .btn:first-child{*margin-left:0;}
228
+ .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;}
229
+ .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;}
230
+ .btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);}
231
+ .btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
232
+ .btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
233
+ .btn-large [class^="icon-"]{margin-top:1px;}
234
+ .btn-small{padding:5px 9px;font-size:11px;line-height:16px;}
235
+ .btn-small [class^="icon-"]{margin-top:-1px;}
236
+ .btn-mini{padding:2px 6px;font-size:11px;line-height:14px;}
237
+ .btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}
238
+ .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);}
239
+ .btn{border-color:#ccc;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);}
240
+ .btn-primary{background-color:#0074cc;background-image:-moz-linear-gradient(top, #0088cc, #0055cc);background-image:-ms-linear-gradient(top, #0088cc, #0055cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));background-image:-webkit-linear-gradient(top, #0088cc, #0055cc);background-image:-o-linear-gradient(top, #0088cc, #0055cc);background-image:linear-gradient(top, #0088cc, #0055cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);border-color:#0055cc #0055cc #003580;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0055cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0055cc;*background-color:#004ab3;}
241
+ .btn-primary:active,.btn-primary.active{background-color:#004099 \9;}
242
+ .btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;*background-color:#df8505;}
243
+ .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;}
244
+ .btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;*background-color:#a9302a;}
245
+ .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;}
246
+ .btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;*background-color:#499249;}
247
+ .btn-success:active,.btn-success.active{background-color:#408140 \9;}
248
+ .btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;*background-color:#2a85a0;}
249
+ .btn-info:active,.btn-info.active{background-color:#24748c \9;}
250
+ .btn-inverse{background-color:#414141;background-image:-moz-linear-gradient(top, #555555, #222222);background-image:-ms-linear-gradient(top, #555555, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));background-image:-webkit-linear-gradient(top, #555555, #222222);background-image:-o-linear-gradient(top, #555555, #222222);background-image:linear-gradient(top, #555555, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#222222;*background-color:#151515;}
251
+ .btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;}
252
+ button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;}
253
+ button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;}
254
+ button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;}
255
+ button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;}
256
+ .modal-open .dropdown-menu{z-index:2050;}
257
+ .modal-open .dropdown.open{*z-index:2050;}
258
+ .modal-open .popover{z-index:2060;}
259
+ .modal-open .tooltip{z-index:2070;}
260
+ .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;}
261
+ .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);}
262
+ .modal{position:fixed;top:50%;left:50%;z-index:1050;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;}
263
+ .modal.fade.in{top:50%;}
264
+ .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;}
265
+ .modal-body{overflow-y:auto;max-height:400px;padding:15px;}
266
+ .modal-form{margin-bottom:0;}
267
+ .modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";}
268
+ .modal-footer:after{clear:both;}
269
+ .modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;}
270
+ .modal-footer .btn-group .btn+.btn{margin-left:-1px;}
271
+ .close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);}
272
+ button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;}
273
+ .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);}
274
+ .well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
275
+ .well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
276
+ }
277
+
278
+ .modal-backdrop {
279
+ background-color: #000000;
280
+ opacity: 0.7;
281
+ filter: alpha(opacity=50);
282
+ bottom: 0;
283
+ left: 0;
284
+ position: fixed;
285
+ right: 0;
286
+ top: 0;
287
+ z-index: 1040;
288
+ }
@@ -0,0 +1,16 @@
1
+ # encoding: utf-8
2
+
3
+ module KoreanZipcodeFinder
4
+ class ZipcodesController < ApplicationController
5
+ layout false
6
+
7
+ def new
8
+ render 'new'
9
+ end
10
+
11
+ def search
12
+ @zipcodes = KoreanZipcodeFinder.find_zipcode(params[:dong])
13
+ end
14
+ end
15
+ end
16
+
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ module KoreanZipcodeFinder
4
+ class Zipcode
5
+ def test
6
+ "test"
7
+ end
8
+
9
+ def self.test
10
+ "self.test"
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ <div class="korean_zipcode_finder_modal_wrapper">
2
+ <div class="zipcode_box modal">
3
+ <div class="modal-header">
4
+ <button class="close_modal_popup close" data-dismiss="modal" type="button">×</button>
5
+ <h3>우편번호 찾기</h3>
6
+ <%= form_tag("/korean_zipcode_finder/zipcodes/search", :method => 'get', :class => "find_zipcode_form well form-inline") do %>
7
+ <%= label_tag "동/읍/면" %>
8
+ <%= text_field_tag "dong" %>
9
+ <%= submit_tag '우편번호 찾기', :class => "btn btn-primary find_zipcode_submit" %>
10
+ <% end %>
11
+ </div>
12
+
13
+ <div class="modal-body">
14
+ <table class="table table-striped">
15
+ <tbody class="zipcode_list_box">
16
+ <%#= 'place for search list' %>
17
+ </tbody>
18
+ </table>
19
+ </div>
20
+
21
+ <div class="modal-footer">
22
+ <a class="btn close_modal_popup" data-dismiss="modal" href="#">닫기</a>
23
+ </div>
24
+ </div>
25
+ </div>
@@ -0,0 +1,24 @@
1
+ <% if @zipcodes.present? %>
2
+
3
+ <% @zipcodes.each_with_index do |zipcode, i| %>
4
+ <tr class="zipcode_node">
5
+ <td>
6
+ [<%= zipcode.zipcode_01 %>-<%= zipcode.zipcode_02 %>]
7
+ </td>
8
+ <td>
9
+ <%= link_to zipcode.original_address, '#', :class => 'zipcode_select', "data-zipcode01" => zipcode.zipcode_01, "data-zipcode02" => zipcode.zipcode_02, "data-address01" => zipcode.address %>
10
+ </td>
11
+ </tr>
12
+ <% end %>
13
+
14
+ <% else %>
15
+
16
+ <tr class="no_zipcode_found">
17
+ <td>
18
+ 검색된 우편번호가 없습니다.
19
+ </td>
20
+ </tr>
21
+
22
+ <% end %>
23
+
24
+
data/config/routes.rb ADDED
@@ -0,0 +1,5 @@
1
+ Rails.application.routes.draw do
2
+ match '/korean_zipcode_finder/zipcodes/new' => 'korean_zipcode_finder/zipcodes#new'
3
+ match '/korean_zipcode_finder/zipcodes/search' => 'korean_zipcode_finder/zipcodes#search'
4
+ match '/korean_zipcode_finder/add_bootstrap_css' => 'korean_zipcode_finder/zipcodes#add_bootstrap_css'
5
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "korean_zipcode_finder/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "korean_zipcode_finder"
7
+ s.version = KoreanZipcodeFinder::VERSION
8
+ s.authors = ["KunHa"]
9
+ s.email = ["potato9@gmail.com"]
10
+ s.homepage = ""
11
+ s.summary = %q{Korean zipcode finder}
12
+ s.description = %q{Korean zipcode finder}
13
+
14
+ s.rubyforge_project = "korean_zipcode_finder"
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_runtime_dependency 'nokogiri'
22
+ end
data/lib/engine.rb ADDED
@@ -0,0 +1,6 @@
1
+ # encoding: utf-8
2
+
3
+ module KoreanZipcodeFinder
4
+ class Engine < Rails::Engine
5
+ end
6
+ end
@@ -0,0 +1,13 @@
1
+ # encoding: utf-8
2
+
3
+ module KoreanZipcodeFinder
4
+ module Configuration
5
+ URL = "http://biz.epost.go.kr/KpostPortal/openapi"
6
+
7
+ attr_accessor :api_key
8
+
9
+ def configure
10
+ yield self
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module KoreanZipcodeFinder
2
+ VERSION = "0.1.0"
3
+ end
@@ -0,0 +1,32 @@
1
+ require "korean_zipcode_finder/version"
2
+ require 'korean_zipcode_finder/configuration'
3
+ require 'engine' if defined?(Rails)
4
+
5
+ require 'net/http'
6
+ require 'open-uri'
7
+ require 'iconv'
8
+ require 'nokogiri'
9
+
10
+
11
+ module KoreanZipcodeFinder
12
+ extend Configuration
13
+ Struct.new("KoreanZipcodeFinder", "zipcode", "zipcode_01", "zipcode_02", "address", "original_address")
14
+
15
+ def self.find_zipcode(dong_name)
16
+ iconv = Iconv.new("euc-kr", "utf-8//IGNORE")
17
+ keyword = iconv.conv(dong_name.strip)
18
+
19
+ response = Net::HTTP.post_form URI.parse(Configuration::URL), {'regkey' => api_key, 'target' => 'post', 'query' => keyword}
20
+ nodes = Nokogiri::XML(response.body).css("item")
21
+
22
+ nodes.map do |node|
23
+ original_address = node.css("address").text
24
+ address = original_address.strip.sub(/\s(\d+)(~?)(\d+)\z/, "")
25
+ zipcode = node.css("postcd").text
26
+ zipcode_01 = zipcode[0..2]
27
+ zipcode_02 = zipcode[-3..-1]
28
+
29
+ Struct::KoreanZipcodeFinder.new(zipcode, zipcode_01, zipcode_02, address, original_address)
30
+ end
31
+ end
32
+ end
metadata ADDED
@@ -0,0 +1,73 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: korean_zipcode_finder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - KunHa
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-09 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: nokogiri
16
+ requirement: &70296376698940 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70296376698940
25
+ description: Korean zipcode finder
26
+ email:
27
+ - potato9@gmail.com
28
+ executables: []
29
+ extensions: []
30
+ extra_rdoc_files: []
31
+ files:
32
+ - .gitignore
33
+ - Gemfile
34
+ - README.mkd
35
+ - Rakefile
36
+ - app/assets/javascripts/korean_zipcode_finder/core.js
37
+ - app/assets/stylesheets/korean_zipcode_finder/core.css.scss
38
+ - app/controllers/korean_zipcode_finder/zipcodes_controller.rb
39
+ - app/models/korean_zipcode_finder/zipcode.rb
40
+ - app/views/korean_zipcode_finder/zipcodes/new.html.erb
41
+ - app/views/korean_zipcode_finder/zipcodes/search.html.erb
42
+ - config/routes.rb
43
+ - korean_zipcode_finder.gemspec
44
+ - lib/engine.rb
45
+ - lib/korean_zipcode_finder.rb
46
+ - lib/korean_zipcode_finder/configuration.rb
47
+ - lib/korean_zipcode_finder/version.rb
48
+ homepage: ''
49
+ licenses: []
50
+ post_install_message:
51
+ rdoc_options: []
52
+ require_paths:
53
+ - lib
54
+ required_ruby_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ! '>='
58
+ - !ruby/object:Gem::Version
59
+ version: '0'
60
+ required_rubygems_version: !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ requirements: []
67
+ rubyforge_project: korean_zipcode_finder
68
+ rubygems_version: 1.8.10
69
+ signing_key:
70
+ specification_version: 3
71
+ summary: Korean zipcode finder
72
+ test_files: []
73
+ has_rdoc: