barometer 0.1.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +1 -1
- data/README.rdoc +53 -7
- data/VERSION.yml +2 -2
- data/bin/barometer +405 -53
- data/lib/barometer/data/geo.rb +3 -1
- data/lib/barometer/extensions/graticule.rb +3 -2
- data/lib/barometer/query.rb +57 -8
- data/lib/barometer/services/wunderground.rb +3 -2
- data/lib/barometer/weather.rb +45 -42
- data/lib/webometer/public/css/master.css +254 -0
- data/lib/webometer/public/css/print.css +90 -0
- data/lib/webometer/public/css/syntax.css +60 -0
- data/lib/webometer/public/images/go.png +0 -0
- data/lib/webometer/public/images/link-out.gif +0 -0
- data/lib/webometer/views/contributing.erb +32 -0
- data/lib/webometer/views/forecast.erb +14 -0
- data/lib/webometer/views/index.erb +66 -0
- data/lib/webometer/views/layout.erb +38 -0
- data/lib/webometer/views/measurement.erb +88 -0
- data/lib/webometer/views/readme.erb +338 -0
- data/lib/webometer/webometer.rb +34 -0
- data/spec/barometer_spec.rb +1 -1
- data/spec/data_geo_spec.rb +4 -0
- data/spec/fixtures/geocode_ksfo.xml +1 -0
- data/spec/query_spec.rb +49 -5
- data/spec/service_wunderground_spec.rb +1 -1
- data/spec/spec_helper.rb +25 -0
- data/spec/weather_spec.rb +168 -0
- metadata +20 -2
data/lib/barometer/data/geo.rb
CHANGED
@@ -8,7 +8,7 @@ module Barometer
|
|
8
8
|
class Geo
|
9
9
|
|
10
10
|
attr_accessor :latitude, :longitude
|
11
|
-
attr_accessor :locality, :region, :country, :country_code
|
11
|
+
attr_accessor :locality, :region, :country, :country_code, :address
|
12
12
|
|
13
13
|
#
|
14
14
|
# this will take a Location object (either generated by Graticule
|
@@ -60,6 +60,7 @@ module Barometer
|
|
60
60
|
@region = location.region
|
61
61
|
@country = location.country
|
62
62
|
@country_code = location.country_code
|
63
|
+
@address = location.address_line
|
63
64
|
end
|
64
65
|
|
65
66
|
def build_from_httparty(location=nil)
|
@@ -87,6 +88,7 @@ module Barometer
|
|
87
88
|
end
|
88
89
|
@country = placemark["AddressDetails"]["Country"]["CountryName"]
|
89
90
|
@country_code = placemark["AddressDetails"]["Country"]["CountryNameCode"]
|
91
|
+
@address = placemark["AddressDetails"]["Country"]["AddressLine"]
|
90
92
|
end
|
91
93
|
end
|
92
94
|
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module Graticule
|
2
2
|
class Location
|
3
3
|
|
4
|
-
attr_accessor :country_code
|
4
|
+
attr_accessor :country_code, :address_line
|
5
5
|
|
6
6
|
def attributes
|
7
|
-
[:latitude, :longitude, :street, :locality, :region, :postal_code, :country, :precision, :cuntry_code].inject({}) do |result,attr|
|
7
|
+
[:latitude, :longitude, :street, :locality, :region, :postal_code, :country, :precision, :cuntry_code, :address_line].inject({}) do |result,attr|
|
8
8
|
result[attr] = self.send(attr) unless self.send(attr).blank?
|
9
9
|
result
|
10
10
|
end
|
@@ -39,6 +39,7 @@ module Graticule
|
|
39
39
|
l.postal_code = value(address.elements['.//PostalCodeNumber/text()'])
|
40
40
|
l.country = value(address.elements['.//CountryName/text()'])
|
41
41
|
l.country_code = value(address.elements['.//CountryNameCode/text()'])
|
42
|
+
l.address_line = value(address.elements['.//AddressLine/text()'])
|
42
43
|
l.precision = PRECISION[address.attribute('Accuracy').value.to_i] || :unknown
|
43
44
|
end
|
44
45
|
end
|
data/lib/barometer/query.rb
CHANGED
@@ -31,20 +31,23 @@ module Barometer
|
|
31
31
|
self.analyze!
|
32
32
|
end
|
33
33
|
|
34
|
-
# analyze the saved query to determine the format.
|
35
|
-
# :zipcode and :postalcode the country_code can also be set
|
34
|
+
# analyze the saved query to determine the format.
|
36
35
|
def analyze!
|
37
36
|
return unless @q
|
38
37
|
if Barometer::Query.is_us_zipcode?(@q)
|
39
38
|
@format = :zipcode
|
39
|
+
@country_code = Barometer::Query.format_to_country_code(@format)
|
40
40
|
elsif Barometer::Query.is_canadian_postcode?(@q)
|
41
41
|
@format = :postalcode
|
42
|
+
@country_code = Barometer::Query.format_to_country_code(@format)
|
42
43
|
elsif Barometer::Query.is_coordinates?(@q)
|
43
44
|
@format = :coordinates
|
45
|
+
elsif Barometer::Query.is_icao?(@q)
|
46
|
+
@format = :icao
|
47
|
+
# @country_code = Barometer::Query.icao_to_country_code(@q)
|
44
48
|
else
|
45
49
|
@format = :geocode
|
46
50
|
end
|
47
|
-
@country_code = Barometer::Query.format_to_country_code(@format)
|
48
51
|
end
|
49
52
|
|
50
53
|
# take a list of acceptable (and ordered by preference) formats and convert
|
@@ -93,6 +96,7 @@ module Barometer
|
|
93
96
|
def postalcode?; @format == :postalcode; end
|
94
97
|
def coordinates?; @format == :coordinates; end
|
95
98
|
def geocode?; @format == :geocode; end
|
99
|
+
def icao?; @format == :icao; end
|
96
100
|
|
97
101
|
def self.is_us_zipcode?(query)
|
98
102
|
us_zipcode_regex = /(^[0-9]{5}$)|(^[0-9]{5}-[0-9]{4}$)/
|
@@ -112,12 +116,25 @@ module Barometer
|
|
112
116
|
return !(query =~ coordinates_regex).nil?
|
113
117
|
end
|
114
118
|
|
119
|
+
def self.is_icao?(query)
|
120
|
+
# allow any 3 or 4 letter word ... unfortunately this means some locations
|
121
|
+
# (ie Utah, Goa, Kiev, etc) will be detected as ICAO. This won't matter for
|
122
|
+
# returning weather results ... it will just effect what happens to the query.
|
123
|
+
# For example, wunderground will accept :icao above :coordinates and :geocode,
|
124
|
+
# which means that a city like Kiev would normally get converted to :coordinates
|
125
|
+
# but in this case it will be detected as :icao so it will be passed as is.
|
126
|
+
# Currently, only wunderground accepts ICAO, and they process ICAO the same as a
|
127
|
+
# city name, so it doesn't matter.
|
128
|
+
icao_regex = /^[A-Za-z]{3,4}$/
|
129
|
+
return !(query =~ icao_regex).nil?
|
130
|
+
end
|
131
|
+
|
115
132
|
#
|
116
133
|
# CONVERTERS
|
117
134
|
#
|
118
135
|
|
119
136
|
# this will take all query formats and convert them to coordinates
|
120
|
-
# accepts- :zipcode, :postalcode, :geocode
|
137
|
+
# accepts- :zipcode, :postalcode, :geocode, :icao
|
121
138
|
# returns- :coordinates
|
122
139
|
# if the conversion fails, return nil
|
123
140
|
def self.to_coordinates(query, format)
|
@@ -129,7 +146,7 @@ module Barometer
|
|
129
146
|
end
|
130
147
|
|
131
148
|
# this will take all query formats and convert them to coorinates
|
132
|
-
# accepts- :zipcode, :postalcode, :coordinates
|
149
|
+
# accepts- :zipcode, :postalcode, :coordinates, :icao
|
133
150
|
# returns- :geocode
|
134
151
|
def self.to_geocode(query, format)
|
135
152
|
perform_geocode = false
|
@@ -143,8 +160,17 @@ module Barometer
|
|
143
160
|
if perform_geocode
|
144
161
|
geo = self.geocode(query, country_code)
|
145
162
|
country_code ||= geo.country_code if geo
|
146
|
-
|
147
|
-
|
163
|
+
# different formats have different acceptance criteria
|
164
|
+
q = nil
|
165
|
+
case format
|
166
|
+
when :icao
|
167
|
+
return nil unless geo && geo.address && geo.country
|
168
|
+
q = "#{geo.address}, #{geo.country}"
|
169
|
+
else
|
170
|
+
return nil unless geo && geo.locality && geo.region && geo.country
|
171
|
+
q = "#{geo.locality}, #{geo.region}, #{geo.country}"
|
172
|
+
end
|
173
|
+
return [q, country_code, geo]
|
148
174
|
else
|
149
175
|
# without geocoding, the best we can do is just make use the given query as
|
150
176
|
# the query for the "geocode" format
|
@@ -207,7 +233,6 @@ module Barometer
|
|
207
233
|
},
|
208
234
|
:format => :xml
|
209
235
|
)['kml']['Response']
|
210
|
-
#puts location.inspect
|
211
236
|
geo = Barometer::Geo.new(location)
|
212
237
|
end
|
213
238
|
|
@@ -223,6 +248,30 @@ module Barometer
|
|
223
248
|
end
|
224
249
|
country_code
|
225
250
|
end
|
251
|
+
|
252
|
+
# todo, the fist letter in a 4-letter icao can designate country:
|
253
|
+
# c=canada
|
254
|
+
# k=usa
|
255
|
+
# etc...
|
256
|
+
# def self.icao_to_country_code(icao_code)
|
257
|
+
# return unless icao_code.is_a?(String)
|
258
|
+
# country_code = nil
|
259
|
+
# if icao_code.size == 4
|
260
|
+
# case icao_code.first_letter
|
261
|
+
# when "C"
|
262
|
+
# country_code = "CA"
|
263
|
+
# when "K"
|
264
|
+
# country_code = "US"
|
265
|
+
# end
|
266
|
+
# if coutry_code.nil?
|
267
|
+
# case icao_code.first_two_letters
|
268
|
+
# when "ET"
|
269
|
+
# country_code = "GERMANY"
|
270
|
+
# end
|
271
|
+
# end
|
272
|
+
# end
|
273
|
+
# country_code
|
274
|
+
# end
|
226
275
|
|
227
276
|
end
|
228
277
|
end
|
@@ -39,7 +39,7 @@ module Barometer
|
|
39
39
|
class Wunderground < Service
|
40
40
|
|
41
41
|
def self.accepted_formats
|
42
|
-
[:zipcode, :postalcode, :coordinates, :geocode]
|
42
|
+
[:zipcode, :postalcode, :icao, :coordinates, :geocode]
|
43
43
|
end
|
44
44
|
|
45
45
|
def self.source_name
|
@@ -48,8 +48,9 @@ module Barometer
|
|
48
48
|
|
49
49
|
# these are the icon codes that indicate "wet", used by wet? function
|
50
50
|
def self.wet_icon_codes
|
51
|
-
%w(flurries rain sleet snow tstorms nt_flurries nt_rain nt_sleet nt_snow nt_tstorms)
|
51
|
+
%w(flurries rain sleet snow tstorms nt_flurries nt_rain nt_sleet nt_snow nt_tstorms chancerain)
|
52
52
|
end
|
53
|
+
# these are the icon codes that indicate "sun", used by sunny? function
|
53
54
|
def self.sunny_icon_codes
|
54
55
|
%w(clear mostlysunny partlysunny sunny partlycloudy)
|
55
56
|
end
|
data/lib/barometer/weather.rb
CHANGED
@@ -34,17 +34,9 @@ module Barometer
|
|
34
34
|
# Quick access methods
|
35
35
|
#
|
36
36
|
|
37
|
-
def current
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
def forecast
|
42
|
-
(default = self.default) ? default.forecast : nil
|
43
|
-
end
|
44
|
-
|
45
|
-
def now
|
46
|
-
self.current
|
47
|
-
end
|
37
|
+
def current; (default = self.default) ? default.current : nil; end
|
38
|
+
def forecast; (default = self.default) ? default.forecast : nil; end
|
39
|
+
def now; self.current; end
|
48
40
|
|
49
41
|
def today
|
50
42
|
default = self.default
|
@@ -72,37 +64,48 @@ module Barometer
|
|
72
64
|
# averages
|
73
65
|
#
|
74
66
|
|
75
|
-
#
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
#
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
67
|
+
# TODO: not tested (except via averages)
|
68
|
+
def metric?
|
69
|
+
self.default ? self.default.metric? : true
|
70
|
+
end
|
71
|
+
|
72
|
+
# TODO: not tested (except via averages)
|
73
|
+
# this assumes calculating for current, and that "to_f" for a value
|
74
|
+
# will return the value needed
|
75
|
+
# value_name = the name of the value we are averaging
|
76
|
+
def current_average(value_name)
|
77
|
+
values = []
|
78
|
+
@measurements.each do |measurement|
|
79
|
+
values << measurement.current.send(value_name).to_f if measurement.success?
|
80
|
+
end
|
81
|
+
return nil unless values && values.size > 0
|
82
|
+
values.inject(0.0) { |sum,v| sum += v } / values.size
|
83
|
+
end
|
84
|
+
|
85
|
+
# TODO: not tested (except via averages)
|
86
|
+
def average(value_name, do_average=true, class_name=nil)
|
87
|
+
if class_name
|
88
|
+
if do_average
|
89
|
+
avg = Barometer.const_get(class_name).new(self.metric?)
|
90
|
+
avg << self.current_average(value_name)
|
91
|
+
else
|
92
|
+
avg = self.now.send(value_name)
|
93
|
+
end
|
94
|
+
else
|
95
|
+
avg = (do_average ? self.current_average(value_name) : self.now.send(value_name))
|
96
|
+
end
|
97
|
+
avg
|
98
|
+
end
|
99
|
+
|
100
|
+
# average of all values
|
101
|
+
def humidity(do_average=true); average("humidity",do_average); end
|
102
|
+
def temperature(do_average=true); average("temperature",do_average,"Temperature"); end
|
103
|
+
def wind(do_average=true); average("wind",do_average,"Speed"); end
|
104
|
+
def pressure(do_average=true); average("pressure",do_average,"Pressure"); end
|
105
|
+
def dew_point(do_average=true); average("dew_point",do_average,"Temperature"); end
|
106
|
+
def heat_index(do_average=true); average("heat_index",do_average,"Temperature"); end
|
107
|
+
def wind_chill(do_average=true); average("wind_chill",do_average,"Temperature"); end
|
108
|
+
def visibility(do_average=true); average("visibility",do_average,"Distance"); end
|
106
109
|
|
107
110
|
#
|
108
111
|
# quick access methods
|
@@ -0,0 +1,254 @@
|
|
1
|
+
body {
|
2
|
+
color:#000;
|
3
|
+
font-family:'lucida grande', 'lucida sans unicade', sans-serif;
|
4
|
+
font-size:100%;
|
5
|
+
line-height:1.3;
|
6
|
+
background-color:#fff;
|
7
|
+
margin:0;
|
8
|
+
padding:0;
|
9
|
+
}
|
10
|
+
|
11
|
+
/* HEADER */
|
12
|
+
#head {
|
13
|
+
text-align:center;
|
14
|
+
}
|
15
|
+
#head img {
|
16
|
+
vertical-align:middle;
|
17
|
+
margin:-10px 0 0 -82px;
|
18
|
+
padding:0 15px 0 0;
|
19
|
+
border:0;
|
20
|
+
}
|
21
|
+
#head h1 {
|
22
|
+
color:#000;
|
23
|
+
font-family:'georgia', 'bitstream vera serif', serif;
|
24
|
+
font-size:4em;
|
25
|
+
font-weight:normal;
|
26
|
+
letter-spacing:-3px;
|
27
|
+
line-height:1;
|
28
|
+
margin:0;
|
29
|
+
padding:20px 0 8px 0;
|
30
|
+
}
|
31
|
+
#head h1 a, #head h1 a:link, #head h1 a:visited, #head h1 a:hover {
|
32
|
+
color:#100;
|
33
|
+
text-decoration:none;
|
34
|
+
}
|
35
|
+
#head ul {
|
36
|
+
font-size:1.1em;
|
37
|
+
font-family:"lucida console", "monaco", "andale mono", "bitstream vera sans mono",
|
38
|
+
"consolas", monospace;
|
39
|
+
font-weight:normal;
|
40
|
+
text-transform:uppercase;
|
41
|
+
letter-spacing:2px;
|
42
|
+
text-align:center;
|
43
|
+
margin:0;
|
44
|
+
padding:0 40px 0.25em 40px;
|
45
|
+
}
|
46
|
+
#head ul li {
|
47
|
+
display:inline;
|
48
|
+
list-style-type:none;
|
49
|
+
padding:0 0.5em 0 0;
|
50
|
+
}
|
51
|
+
#head ul a, #head ul a:link, #head ul a:visited {
|
52
|
+
color:#56534f;
|
53
|
+
text-decoration:none;
|
54
|
+
}
|
55
|
+
#head ul a:hover {
|
56
|
+
color:#000;
|
57
|
+
text-decoration:underline
|
58
|
+
}
|
59
|
+
|
60
|
+
/* CONTENT */
|
61
|
+
|
62
|
+
#content {
|
63
|
+
color:#333;
|
64
|
+
font-size:1.1em;
|
65
|
+
max-width:44em;
|
66
|
+
min-width:27em;
|
67
|
+
margin:7px auto;
|
68
|
+
border-top:2px solid #837d7c;
|
69
|
+
}
|
70
|
+
strong {
|
71
|
+
font-weight:bold;
|
72
|
+
}
|
73
|
+
|
74
|
+
/* HEADINGS */
|
75
|
+
|
76
|
+
h1, h2, h3, h4, h5, h6 {
|
77
|
+
color:#000;
|
78
|
+
}
|
79
|
+
h1, h2 {
|
80
|
+
color:#211d1f;
|
81
|
+
font-family:'georgia', 'bitstream vera serif', serif;
|
82
|
+
font-weight:normal;
|
83
|
+
}
|
84
|
+
h1 a, h2 a { color:#222 }
|
85
|
+
h1 {
|
86
|
+
font-size:2.25em;
|
87
|
+
letter-spacing:-1px;
|
88
|
+
margin-bottom:0;
|
89
|
+
}
|
90
|
+
h2 {
|
91
|
+
font-size:1.5em;
|
92
|
+
letter-spacing:-1px;
|
93
|
+
margin:1.25em 0 -0.32em 0;
|
94
|
+
}
|
95
|
+
h3 {
|
96
|
+
color:#211d1f;
|
97
|
+
font-size:1.02em;
|
98
|
+
font-weight:bold;
|
99
|
+
margin:1.8em 0 -0.25em 0;
|
100
|
+
letter-spacing:-1px;
|
101
|
+
}
|
102
|
+
h3 a {
|
103
|
+
color:#000;
|
104
|
+
text-decoration:underline;
|
105
|
+
}
|
106
|
+
|
107
|
+
/* LINKS */
|
108
|
+
a {
|
109
|
+
color:#000;
|
110
|
+
text-decoration:underline;
|
111
|
+
}
|
112
|
+
a:hover {
|
113
|
+
color:#910;
|
114
|
+
text-decoration:underline;
|
115
|
+
}
|
116
|
+
a img {
|
117
|
+
border:none;
|
118
|
+
}
|
119
|
+
a.out {
|
120
|
+
background: url('/images/link-out.gif') center right no-repeat;
|
121
|
+
padding-right: 12px;
|
122
|
+
}
|
123
|
+
|
124
|
+
|
125
|
+
/* CODE */
|
126
|
+
|
127
|
+
code, pre, textarea, tt {
|
128
|
+
font-family:"lucida console", "monaco", "andale mono", "bitstream vera sans mono",
|
129
|
+
"consolas", monospace;
|
130
|
+
}
|
131
|
+
pre {
|
132
|
+
font-size:0.85em;
|
133
|
+
background:#f4f5f5;
|
134
|
+
border:2px solid #d5d0d2;
|
135
|
+
padding:0.5em;
|
136
|
+
line-height:1.15;
|
137
|
+
color:#222;
|
138
|
+
}
|
139
|
+
code, tt {
|
140
|
+
font-size:0.85em;
|
141
|
+
color:#444;
|
142
|
+
}
|
143
|
+
h1 code, h2 code, h3 code, h4 code {
|
144
|
+
color:#333;
|
145
|
+
}
|
146
|
+
pre code {
|
147
|
+
font-size:1em;
|
148
|
+
color:#222;
|
149
|
+
}
|
150
|
+
|
151
|
+
/* MISC */
|
152
|
+
|
153
|
+
hr {
|
154
|
+
margin:3em 0;
|
155
|
+
padding:0;
|
156
|
+
color:#eee;
|
157
|
+
}
|
158
|
+
|
159
|
+
/* HOME */
|
160
|
+
|
161
|
+
body#home {
|
162
|
+
background: #fff url(../images/legend.gif) no-repeat fixed right 130px;
|
163
|
+
}
|
164
|
+
#home #content {
|
165
|
+
font-size:1.05em;
|
166
|
+
margin:20px 0 0 0;
|
167
|
+
padding:0 20px;
|
168
|
+
border-width:0;
|
169
|
+
}
|
170
|
+
#home #head, #home #foot {
|
171
|
+
display:none;
|
172
|
+
}
|
173
|
+
.pipe {
|
174
|
+
clear:both;
|
175
|
+
padding:50px 0;
|
176
|
+
}
|
177
|
+
.pipe p {
|
178
|
+
color:#000;
|
179
|
+
font-size:62px;
|
180
|
+
font-family:'georgia', 'bitstream vera serif', serif;
|
181
|
+
letter-spacing:-3px;
|
182
|
+
line-height:1;
|
183
|
+
text-align:right;
|
184
|
+
margin:0em 43% 0 0;
|
185
|
+
padding:0 60px 0 0;
|
186
|
+
}
|
187
|
+
.pipe pre {
|
188
|
+
float:right;
|
189
|
+
background:transparent;
|
190
|
+
font-size:28px;
|
191
|
+
margin:0;
|
192
|
+
padding:5px 0 0 0;
|
193
|
+
width:42%;
|
194
|
+
border-width:0;
|
195
|
+
}
|
196
|
+
.pipe pre code {
|
197
|
+
color:#666;
|
198
|
+
background:transparent;
|
199
|
+
}
|
200
|
+
.pipe.shell p {
|
201
|
+
font-size:56px;
|
202
|
+
}
|
203
|
+
.pipe.shell pre {
|
204
|
+
font-size:18px;
|
205
|
+
}
|
206
|
+
.pipe.nav p {
|
207
|
+
font-size:100px;
|
208
|
+
letter-spacing:-6px;
|
209
|
+
}
|
210
|
+
.pipe.nav pre {
|
211
|
+
font-size:36px;
|
212
|
+
padding-top:20px;
|
213
|
+
text-transform:uppercase;
|
214
|
+
letter-spacing:4px;
|
215
|
+
line-height:1.25;
|
216
|
+
}
|
217
|
+
.pipe.nav {
|
218
|
+
padding:25px 0 50px 0;
|
219
|
+
}
|
220
|
+
.pipe.nav a, .pipe.nav a:link, .pipe.nav a:visited {
|
221
|
+
color:#444;
|
222
|
+
text-decoration:none;
|
223
|
+
}
|
224
|
+
.pipe.nav a:hover {
|
225
|
+
color:#000;
|
226
|
+
text-decoration:underline;
|
227
|
+
}
|
228
|
+
|
229
|
+
form {
|
230
|
+
text-align: center;
|
231
|
+
}
|
232
|
+
|
233
|
+
form .text-input input {
|
234
|
+
font-family: "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Helvetica, Arial, sans-serif;
|
235
|
+
margin: 10px 0 5px 10px;
|
236
|
+
color: #686868;
|
237
|
+
font-size: 40px;
|
238
|
+
text-align: left;
|
239
|
+
text-transform: lowercase;
|
240
|
+
}
|
241
|
+
|
242
|
+
form .submit-input input {
|
243
|
+
position: relative;
|
244
|
+
margin: 0 7% 0 0;
|
245
|
+
float: right;
|
246
|
+
}
|
247
|
+
|
248
|
+
form .options-input {
|
249
|
+
position: relative;
|
250
|
+
margin: 0 7% 0 0;
|
251
|
+
float: left;
|
252
|
+
text-align: left;
|
253
|
+
}
|
254
|
+
|