dolores-cml 0.4.0 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.2
data/cml.gemspec CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{cml}
5
- s.version = "0.4.0"
5
+ s.version = "0.5.2"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Chris Van Pelt"]
9
- s.date = %q{2009-09-02}
9
+ s.date = %q{2009-09-07}
10
10
  s.description = %q{CML let's you easily create form elements and custom interfaces for the CrowdFlower Croud Labor platform}
11
11
  s.email = %q{vanpelt@doloreslabs.com}
12
12
  s.extra_rdoc_files = [
@@ -44,7 +44,9 @@ Gem::Specification.new do |s|
44
44
  "spec/fixtures/complex.cml",
45
45
  "spec/fixtures/html.cml",
46
46
  "spec/fixtures/invalid.cml",
47
+ "spec/fixtures/segfault.cml",
47
48
  "spec/meta_spec.rb",
49
+ "spec/normalize_spec.rb",
48
50
  "spec/sorta_match.rb",
49
51
  "spec/spec_helper.rb",
50
52
  "spec/tags/checkbox_spec.rb",
@@ -68,6 +70,7 @@ Gem::Specification.new do |s|
68
70
  "spec/complex_spec.rb",
69
71
  "spec/converters/jsawesome_spec.rb",
70
72
  "spec/meta_spec.rb",
73
+ "spec/normalize_spec.rb",
71
74
  "spec/sorta_match.rb",
72
75
  "spec/spec_helper.rb",
73
76
  "spec/tags/checkbox_spec.rb",
@@ -42,7 +42,7 @@ module CML
42
42
  label = label(parts[0])
43
43
  parts << key if label != key.capitalize.gsub(/_/,' ') || opts[:meta]
44
44
  attrs = opts[:meta] ? [] : ["label=\"#{label}\""]
45
- attrs << "name=\"#{parts[1]}\"" if parts[1]
45
+ attrs << "#{opts[:nested] ? "value" : "name"}=\"#{parts[1]}\"" if parts[1]
46
46
  attrs << "checked=\"true\"" if val[1]
47
47
  attrs << "validates=\"required\"" if @labels[key] && @labels[key]["required"]
48
48
  opts.reject {|k,v| v.to_s.strip.length == 0 || k.is_a?(Symbol) }.each do |k,v|
@@ -81,7 +81,7 @@ module CML
81
81
  parent = "select"
82
82
  child = "option"
83
83
  end
84
- tag(parent, k, {:children => v.map { |c| [child, c]}, :parent => true })
84
+ tag(parent, k, {:children => v.map { |c| [child, c, {:nested => child}]}, :parent => parent })
85
85
  #Multiple hidden fields...
86
86
  elsif(k =~ /^_/)
87
87
  v.map { |c| tag("hidden", c, :parent => true)}.join("\n")
data/lib/cml/parser.rb CHANGED
@@ -5,22 +5,24 @@ module CML
5
5
  def initialize(content, opts = {})
6
6
  @opts = opts
7
7
  #Because nokogiri is munging my CDATA sections, we parse it out ahead of time
8
- @cdata = content.scan(/(<(?:script|style)[^>]*>)(.+?)</m)
8
+ @cdata = content.scan(/(<(script|style)[^>]*>)(.+?)(<\/\2)/m)
9
9
  @doc = Parser.parse(content)
10
10
  @cftags = @doc.xpath("//cml:*[not(ancestor::cml:*)]")
11
+ normalize if opts[:normalize]
11
12
  @tags = @cftags.map do |t|
12
13
  Parser.tag_class(t.name).new(t, @opts)
13
14
  end
14
15
  end
15
16
 
16
17
  def self.parse(content)
17
- #This sucks, we remove scripts, styles, and close brs
18
- xhtml = content.gsub(/(<(?:script|style)[^>]*>)(.+?)</m, "\\1<").gsub(/(<(b|h)r[^\/]*?)>/,'\1/>')
18
+ #This sucks, we remove scripts, styles, and close non self closed tags
19
+ #We could potentially add CDATA clauses to them, but this is "easier"
20
+ xhtml = content.gsub(/(<(script|style)[^>]*>)(.+?)(<\/\2)/m, "\\1\\4").gsub(/(<(input|link|img|br|hr).*?)>/,'\1/>') #base, basefont, area, meta
19
21
  Nokogiri::XML("<root xmlns:cml=\"http://crowdflower.com\">#{xhtml}</root>")
20
22
  end
21
23
 
22
24
  def convert(opts = nil)
23
- @opts = opts if opts
25
+ @opts.merge!(opts) if opts
24
26
  cloned = @doc.dup
25
27
  cloned.xpath("//cml:*[not(ancestor::cml:*)]").each_with_index do |t,i|
26
28
  t.replace(@tags[i].convert(opts))
@@ -28,6 +30,18 @@ module CML
28
30
  cloned
29
31
  end
30
32
 
33
+ def normalize
34
+ @cftags.each do |t|
35
+ if ["radios", "select"].include?(t.name)
36
+ child = t.name == "radios" ? "radio" : "option"
37
+ t.name = "checkboxes"
38
+ t.xpath("cml:#{child}").each { |c| c.name = "checkbox" }
39
+ elsif t.name == "meta"
40
+ t.name = "text"
41
+ end
42
+ end
43
+ end
44
+
31
45
  def fields
32
46
  @fields = {}
33
47
  @tags.each do |g|
@@ -83,7 +97,7 @@ module CML
83
97
 
84
98
  def wrap(content)
85
99
  #This has to happen if we are outputing html, can go away if we use xhtml
86
- content = content.gsub(/%7B%7B/,'{{').gsub(/%7D%7D/,'}}')
100
+ #content = content.gsub(/%7B%7B/,'{{').gsub(/%7D%7D/,'}}')
87
101
  @opts[:no_wrap] ? content : "<div class=\"cml#{" "+@opts[:class] if @opts[:class]}\" id=\"#{@opts[:prefix]}\">#{content}</div>"
88
102
  end
89
103
 
@@ -93,9 +107,9 @@ module CML
93
107
 
94
108
  def to_html(opts = nil)
95
109
  #We are going to html because xhtml is crazy with the encoding
96
- html = convert(opts).at("root").children.to_html
110
+ html = convert(opts).at("root").children.to_xhtml
97
111
  #Let's re-insert that CDATA
98
- @cdata.each { |s,c| html.sub!(/(<(?:script|style)[^>]*>)</m, "\\1#{c}<") }
112
+ @cdata.each { |matches| html.sub!(/(<(?:script|style)[^>]*>)</m, "\\1#{matches[2]}<") }
99
113
  wrap(html)
100
114
  end
101
115
 
data/lib/cml/tag.rb CHANGED
@@ -80,14 +80,18 @@ module CML
80
80
  @cml.to_s
81
81
  end
82
82
 
83
- def label(label, tag = "label")
83
+ def raw_label
84
+ label = @attrs["label"]
84
85
  label ||= @attrs["name"].to_s.capitalize
86
+ end
87
+
88
+ def label(tag = "label")
85
89
  required = " <span class=\"required\">(required)</span>" if validations.include?("required")
86
- "<#{tag} class=\"legend\">#{label}#{required}</#{tag.split(" ")[0]}>" if label.to_s != ""
90
+ "<#{tag} class=\"legend\">#{raw_label}#{required}</#{tag.split(" ")[0]}>" if raw_label.to_s != ""
87
91
  end
88
92
 
89
- def legend(label)
90
- label(label, "h2") if label
93
+ def legend
94
+ label("h2")
91
95
  end
92
96
 
93
97
  def to_liquid
@@ -124,8 +128,8 @@ module CML
124
128
  def data
125
129
  (@opts[:data] || {}).merge({
126
130
  "name" => prefix(name),
127
- "label" => label(@attrs["label"]),
128
- "legend" => legend(@attrs["label"]),
131
+ "label" => label,
132
+ "legend" => legend,
129
133
  "classes" => classes,
130
134
  "value" => value
131
135
  })
data/spec/complex_spec.rb CHANGED
@@ -59,11 +59,12 @@ describe "CML Complex" do
59
59
 
60
60
  it "parses scripts and styles" do
61
61
  @p = Parser.new(File.read(File.dirname(__FILE__) + "/fixtures/html.cml"), {:prefix => "u12345"})
62
- @p.to_html.length.should > 1000
62
+ @p.to_html.length.should > 900
63
+ #puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
64
+
63
65
  @p.to_html.should sorta_match(<<-HTML)
64
- <div class="cml" id="u12345">
65
- <hr>
66
- <a href="#" class="toggle" target="_blank">toggle series description</a>
66
+ <div class="cml" id="u12345"><hr />
67
+ <a target="_blank" class="toggle" href="#">toggle series description</a>
67
68
  <div style="display:none">
68
69
  {{seriesdescription | textilize}}
69
70
  </div>
@@ -73,155 +74,25 @@ describe "CML Complex" do
73
74
  <img src="{{url}}/{{image}}" style="width:110px" /></div>
74
75
  {% endfor %}
75
76
  <br style="clear:both" />
76
- <div class="text">
77
- <label class="legend">Cool dude</label>
77
+ <div class="text"><label class="legend">Cool dude</label>
78
78
  <input name="u12345[cool_dude]" class="cool_dude" value="" type="text" />
79
79
  </div>
80
- <style type="text/css" media="screen">
81
-
80
+ <style media="screen" type="text/css">
82
81
  div.wrap {
83
82
  position:relative;
84
83
  float:left;
85
84
  margin:5px 5px 0 0;
86
85
  }
87
- div.wrap span {
88
- font-size:430%;
89
- text-align:center;
90
- color:#111;
91
- background:#CCC;
92
- opacity:0.65;
93
- width:110px;
94
- font-weight:bold;
95
- position:absolute;
96
- left:0;
97
- z-index:1;
98
- }
99
-
100
86
  </style>
101
87
  <script type="text/javascript" charset="utf-8">
102
88
  var ranking = [null]
103
- var rank = new Element('ul', {'class':'rank'}).adopt(['✓'].map(function(n,i){
104
- return new Element('li').grab(new Element('a', {
105
- html:n,
106
- 'class': "_"+(i+1),
107
- events: {
108
- click: function(e){
109
- if(document.location.href.test(/ASSIGNMENT_ID_NOT_AVAILABLE/))
110
- return alert('Please accept the hit before proceeding.')
111
- var ul = this.getParent('ul')
112
- var i = ul.retrieve('i')
113
- var rank = this.get('class').replace(/\D/g,'')
114
- var cur = i.getPrevious('span')
115
- if(cur) {
116
- var cur_rank = cur.get('class').replace(/\D/g,'')
117
- ranking[cur_rank.toInt() - 1] = null
118
- cur.destroy()
119
- if(cur_rank == rank) {
120
- i.retrieve('i').fireEvent('mouseleave')
121
- return
122
- }
123
- }
124
- var old = ranking[rank.toInt() - 1]
125
- if(old)
126
- old.getPrevious().destroy()
127
- ranking[rank.toInt() - 1] = i
128
- $$('input.ranking').destroy()
129
- this.getParent('form').getElement('.jsawesome').adopt(ranking.map(function(r){
130
- if(r) {
131
- return new Element('input', {
132
- type:'hidden',
133
- name:'u{{_unit_id}}[ranking][]',
134
- 'class':'ranking',
135
- value: r.get('src')
136
- }).store('custom', function(right, inform){
137
- right.each(function(url){
138
- $$('img[src='+url+']').each(function(img){
139
- img.getParent().setStyles({
140
- background: 'green'
141
- })
142
- img.set('opacity', 0.7)
143
- })
144
- })
145
- new Fx.Scroll(window, {onComplete:function(){
146
- alert('The only acceptable images for this show are shown below in green. Please be more careful!')
147
- inform()
148
- }, offset:{x:0,y:-50}}).toElement($$('.wrap')[0])
149
- })
150
- }
151
- }).clean())
152
- new Element('span', {
153
- html:this.get('html'),
154
- styles: {
155
- 'line-height': i.getHeight()
156
- },
157
- 'class':this.get('class'),
158
- opacity: 0.65,
159
- events: {
160
- 'mouseenter': function(e){
161
- this.getNext().fireEvent('mouseenter', [e, rank])
162
- },
163
- 'mouseleave': function(e){
164
- this.getNext().fireEvent('mouseleave', [e, rank])
165
- }
166
- }
167
- }).inject(i,'before')
168
- i.retrieve('i').fireEvent('mouseleave')
169
- }
170
- }
171
- }))
172
- }))
173
- window.addEvent('domready', function(){
174
- $$('form').addEvent('submit', function(e){
175
- if($$('input.any_problems').some(function(i){return i.checked}))
176
- return true
177
- var needed = ranking.indexOf(null)
178
- if(needed > -1) {
179
- var suf;
180
-
181
- switch (needed){
182
- case 0: suf = 'st'; break;
183
- case 1: suf = 'nd'; break;
184
- case 2: suf = 'rd'; break;
185
- default: suf = 'th'
186
- }
187
- alert('You must choose '+ranking.length+' image or select no good images.')
188
- e.stop()
189
- }
190
- })
191
- $$('a.toggle').addEvent('click', function(e){
192
- e.stop()
193
- this.getNext().setStyle('display', (this.getNext().getStyle('display') == 'none' ? '' : 'none'))
194
- })
195
- $$('.wrap img').addEvent('mouseenter', function(e, cur){
196
- this.store('cur', cur)
197
- if(!this.retrieve('i')) {
198
- var thumb = this
199
- this.store('i', this.clone(true).setStyles({width:400}).addEvent('mouseenter', function(e){
200
- rank.getElements('a').removeClass('cur')
201
- var cur = thumb.retrieve('cur')
202
- if(cur)
203
- rank.getElement('a._'+cur).addClass('cur')
204
- rank.store('i', thumb).setStyles({top:this.getTop() + 40, left:this.getLeft() + 160}).inject(this, 'after').fade('hide').fade(0.7)
205
- }).addEvent('mouseleave', function(e){
206
- //Don't know why the ul goes missing sometime..
207
- if(this.getNext('ul') && (!e || !e.relatedTarget || !(e.relatedTarget.get('tag') == "ul" || e.relatedTarget.getParent('ul.rank')))) {
208
- this.getNext('ul').dispose();
209
- this.dispose()
210
- }
211
- }).addEvent('click', function(){this.fireEvent('mouseleave')}).addClass('zoomed'))
89
+ //Some really long comment that doesn't get borked by libxml... don't you dare insert a new line.
90
+ //Why are my && disapearing?
91
+ if(ranking && !false) {
92
+ //Preserve my curlies
93
+ var unit_id = {{_unit_id}};
94
+ var rad = "even inside strings {{awesome}}"
212
95
  }
213
- //Cleanup
214
- $$('.zoomed').dispose()
215
- var i = this.retrieve('i')
216
- s = this.getParent('.wrap')
217
- i.setStyles({position:'absolute',zIndex:2,top:s.getTop() + 40, left:s.getLeft() - 145})
218
- i.inject(s,'after').fade('hide').fade('in')
219
- }).addEvent('mouseleave', function(e){
220
- var i = this.retrieve('i')
221
- if(e.relatedTarget != i)
222
- i.dispose()
223
- })
224
- })
225
96
  </script></div>
226
97
  HTML
227
98
  end
@@ -6,9 +6,9 @@ describe "JSAwesome Converter" do
6
6
  json = "[[
7
7
  [\"text_field\", \"default value\"],
8
8
  [\"#text_area\", \"\"],
9
- [\"single_select\", [\"boo\", \"~yah\"]],
9
+ [\"single_select\", [\"boo|moo\", \"~yah\"]],
10
10
  [\"^check\", [\"One|totally_rad\", [\"two\",true], \"three\"]],
11
- [\"*radio\", [\"a\", \"b\", [\"c\", true]]],
11
+ [\"*radio\", [\"a\", \"b|D\", [\"c\", true]]],
12
12
  [\"_hidden\",\"hot\"],
13
13
  [[\"^single_check\"],[\"^Edge|edge_case\", false]]
14
14
  ],
@@ -35,17 +35,17 @@ describe "JSAwesome Converter" do
35
35
  </cml:text>
36
36
  <cml:textarea name="text_area" validates="required" label="Input some text with atleast one digit" />
37
37
  <cml:select label="Single select" validates="required">
38
- <cml:option label="Boo" />
38
+ <cml:option label="Boo" value="moo" />
39
39
  <cml:option label="Yah" />
40
40
  </cml:select>
41
41
  <cml:checkboxes label="Check" gold="true">
42
- <cml:checkbox label="One" name="totally_rad" />
42
+ <cml:checkbox label="One" value="totally_rad" />
43
43
  <cml:checkbox label="Two" checked="true" />
44
44
  <cml:checkbox label="Three" />
45
45
  </cml:checkboxes>
46
46
  <cml:radios label="Radio">
47
47
  <cml:radio label="A" />
48
- <cml:radio label="B" />
48
+ <cml:radio label="B" value="D" />
49
49
  <cml:radio label="C" checked="true" />
50
50
  </cml:radios>
51
51
  <cml:hidden label="Hidden" value="hot" />
@@ -11,148 +11,74 @@
11
11
  <br style="clear:both">
12
12
  <cml:text label="Cool dude"/>
13
13
  <style media="screen" type="text/css">
14
-
15
- div.wrap {
16
- position:relative;
17
- float:left;
18
- margin:5px 5px 0 0;
19
- }
20
- div.wrap span {
21
- font-size:430%;
22
- text-align:center;
23
- color:#111;
24
- background:#CCC;
25
- opacity:0.65;
26
- width:110px;
27
- font-weight:bold;
28
- position:absolute;
29
- left:0;
30
- z-index:1;
31
- }
32
-
14
+ div.wrap {
15
+ position:relative;
16
+ float:left;
17
+ margin:5px 5px 0 0;
18
+ }
33
19
  </style>
34
20
  <script type="text/javascript" charset="utf-8">
35
- var ranking = [null]
36
- var rank = new Element('ul', {'class':'rank'}).adopt(['✓'].map(function(n,i){
37
- return new Element('li').grab(new Element('a', {
38
- html:n,
39
- 'class': "_"+(i+1),
40
- events: {
41
- click: function(e){
42
- if(document.location.href.test(/ASSIGNMENT_ID_NOT_AVAILABLE/))
43
- return alert('Please accept the hit before proceeding.')
44
- var ul = this.getParent('ul')
45
- var i = ul.retrieve('i')
46
- var rank = this.get('class').replace(/\D/g,'')
47
- var cur = i.getPrevious('span')
48
- if(cur) {
49
- var cur_rank = cur.get('class').replace(/\D/g,'')
50
- ranking[cur_rank.toInt() - 1] = null
51
- cur.destroy()
52
- if(cur_rank == rank) {
53
- i.retrieve('i').fireEvent('mouseleave')
54
- return
55
- }
56
- }
57
- var old = ranking[rank.toInt() - 1]
58
- if(old)
59
- old.getPrevious().destroy()
60
- ranking[rank.toInt() - 1] = i
61
- $$('input.ranking').destroy()
62
- this.getParent('form').getElement('.jsawesome').adopt(ranking.map(function(r){
63
- if(r) {
64
- return new Element('input', {
65
- type:'hidden',
66
- name:'u{{_unit_id}}[ranking][]',
67
- 'class':'ranking',
68
- value: r.get('src')
69
- }).store('custom', function(right, inform){
70
- right.each(function(url){
71
- $$('img[src='+url+']').each(function(img){
72
- img.getParent().setStyles({
73
- background: 'green'
74
- })
75
- img.set('opacity', 0.7)
76
- })
77
- })
78
- new Fx.Scroll(window, {onComplete:function(){
79
- alert('The only acceptable images for this show are shown below in green. Please be more careful!')
80
- inform()
81
- }, offset:{x:0,y:-50}}).toElement($$('.wrap')[0])
82
- })
83
- }
84
- }).clean())
85
- new Element('span', {
86
- html:this.get('html'),
87
- styles: {
88
- 'line-height': i.getHeight()
89
- },
90
- 'class':this.get('class'),
91
- opacity: 0.65,
92
- events: {
93
- 'mouseenter': function(e){
94
- this.getNext().fireEvent('mouseenter', [e, rank])
95
- },
96
- 'mouseleave': function(e){
97
- this.getNext().fireEvent('mouseleave', [e, rank])
98
- }
99
- }
100
- }).inject(i,'before')
101
- i.retrieve('i').fireEvent('mouseleave')
102
- }
103
- }
104
- }))
105
- }))
106
- window.addEvent('domready', function(){
107
- $$('form').addEvent('submit', function(e){
108
- if($$('input.any_problems').some(function(i){return i.checked}))
109
- return true
110
- var needed = ranking.indexOf(null)
111
- if(needed > -1) {
112
- var suf;
113
-
114
- switch (needed){
115
- case 0: suf = 'st'; break;
116
- case 1: suf = 'nd'; break;
117
- case 2: suf = 'rd'; break;
118
- default: suf = 'th'
119
- }
120
- alert('You must choose '+ranking.length+' image or select no good images.')
121
- e.stop()
21
+ // query1 = 'compare'
22
+ // query2 = 'base'
23
+ document.addEvent('domready', function() {
24
+
25
+ var inFrame = ($$('body.in_frame').length > 0);
26
+ var onWarningPage = ($$('div.missed', 'h3.tainted').length > 0);
27
+
28
+ var results = $('u{{_unit_id}}_div').getElements('.searchresult');
29
+ var rand = Math.floor(Math.random()*2);
30
+ var inputValues = ['compare_is_much_better', 'compare_is_a_little_better', 'base_is_a_little_better', 'base_is_much_better']
31
+ var htmlValues = [
32
+ 'The <b>top</b> result is <b>much better</b> than the bottom one',
33
+ 'The <b>top</b> result is <b>a little better</b> than the bottom one',
34
+ 'The <b>bottom</b> result is <b>a little better</b> than the top one',
35
+ 'The <b>bottom</b> result is <b>much better</b> than the top one',
36
+ '<b>Both</b> results are <b>not relevant</b> to the search terms <b>at all</b>'
37
+ ];
38
+
39
+ if (inFrame && !onWarningPage) {
40
+ if (rand == 0) {
41
+ // Put base on top
42
+ results[0].inject(results[1], 'after');
43
+ inputValues.reverse();
122
44
  }
123
- })
124
- $$('a.toggle').addEvent('click', function(e){
125
- e.stop()
126
- this.getNext().setStyle('display', (this.getNext().getStyle('display') == 'none' ? '' : 'none'))
127
- })
128
- $$('.wrap img').addEvent('mouseenter', function(e, cur){
129
- this.store('cur', cur)
130
- if(!this.retrieve('i')) {
131
- var thumb = this
132
- this.store('i', this.clone(true).setStyles({width:400}).addEvent('mouseenter', function(e){
133
- rank.getElements('a').removeClass('cur')
134
- var cur = thumb.retrieve('cur')
135
- if(cur)
136
- rank.getElement('a._'+cur).addClass('cur')
137
- rank.store('i', thumb).setStyles({top:this.getTop() + 40, left:this.getLeft() + 160}).inject(this, 'after').fade('hide').fade(0.7)
138
- }).addEvent('mouseleave', function(e){
139
- //Don't know why the ul goes missing sometime..
140
- if(this.getNext('ul') && (!e || !e.relatedTarget || !(e.relatedTarget.get('tag') == "ul" || e.relatedTarget.getParent('ul.rank')))) {
141
- this.getNext('ul').dispose();
142
- this.dispose()
143
- }
144
- }).addEvent('click', function(){this.fireEvent('mouseleave')}).addClass('zoomed'))
45
+ } else {
46
+ // Fix the text a bit
47
+ $$('div.missed span').each(function(el) {
48
+ el.set('text', el.get('text').replace('Compare', 'The top result'));
49
+ el.set('text', el.get('text').replace('Base', 'The bottom result'));
50
+ el.set('text', el.get('text').replace(' compare', ' or the top result'));
51
+ el.set('text', el.get('text').replace(' base', ' or the bottom result'));
52
+ });
53
+ }
54
+
55
+ // Fix the input values and labels
56
+ if ($('u{{_unit_id}}')) {
57
+ $('u{{_unit_id}}').getElements('input.result_is_better').each(function(input, i) {
58
+ if (i < inputValues.length) input.set('value', inputValues[i]);
59
+ input.inject(input.getParent().set('html', htmlValues[i]), 'top');
60
+ });
61
+ }
62
+
63
+ $('u{{_unit_id}}_div').getElements('table.srchresult').each(function(el, i) {
64
+ // Fix a weird bug that got introduced in some circumstances way back in the scraping process
65
+ var bid_buy = el.getElement('td.bid_buy');
66
+ if (bid_buy.getChildren().length < 1) {
67
+ var numBids = Math.floor(Math.random()*15);
68
+ new Element('p', {'text': numBids+' bids'}).inject(bid_buy);
145
69
  }
146
- //Cleanup
147
- $$('.zoomed').dispose()
148
- var i = this.retrieve('i')
149
- s = this.getParent('.wrap')
150
- i.setStyles({position:'absolute',zIndex:2,top:s.getTop() + 40, left:s.getLeft() - 145})
151
- i.inject(s,'after').fade('hide').fade('in')
152
- }).addEvent('mouseleave', function(e){
153
- var i = this.retrieve('i')
154
- if(e.relatedTarget != i)
155
- i.dispose()
156
- })
157
- })
70
+ });
71
+
72
+ // Show the input form
73
+ $('u{{_unit_id}}_div').setStyle('display', 'block');
74
+ });
75
+
76
+ var ranking = [null]
77
+ //Some really long comment that doesn't get borked by libxml... don't you dare insert a new line.
78
+ //Why are my && disapearing?
79
+ if (ranking && !onSomeWarningpage) {
80
+ //Preserve my curlies
81
+ var unit_id = {{_unit_id}};
82
+ var rad = "even inside strings {{awesome}}"
83
+ }
158
84
  </script>
@@ -0,0 +1 @@
1
+ &lt;script type="text/javascript" src="http://api.maps.yahoo.com/ajaxymap?v=3.8&amp;appid=Knx84fDV34H2VnhVU1DoD7chT1wjJ2r36uf4dZW7Vc5si9sqQRAYU_g8fo7zV.wF"&gt;&lt;/script&gt;<br>&lt;script src="/javascripts/upload.js" type="text/javascript" charset="utf-8"&gt;&lt;/script&gt;<br>&lt;script type="text/javascript"&gt;<br>&nbsp;&nbsp; &nbsp;mapInterface=new Object();//Wrapper for all info we will store;<br>&nbsp;&nbsp; &nbsp;mapInterface.baseCrowdflowerUrl='http://crowdflower.com';//'http://www.crowdflower.com';<br>&nbsp;&nbsp; &nbsp;mapInterface.debug=false;<br>&nbsp;&nbsp; &nbsp;mapInterface.jobId=1059;<br>&nbsp;&nbsp; &nbsp;mapInterface.accepted=new Object();<br>&nbsp;&nbsp; &nbsp;mapInterface.accepted.unit=null;<br>&nbsp;&nbsp; &nbsp;mapInterface.accepted.unitId=null;<br>&nbsp;&nbsp; &nbsp;mapInterface.accepted.cart=new Object();//Contains all units selected<br>&nbsp;&nbsp; &nbsp;//Consider using cookie for this<br>&nbsp;&nbsp; &nbsp;mapInterface.accepted.cond=false; //Bool thatrepresents whether the user has accepted a task yet<br>&nbsp;&nbsp; &nbsp;mapInterface.imageBaseUrl='http://a1.doloreslabs.com/q82/images/';<br>&nbsp;&nbsp; &nbsp;mapInterface.startingZoom=15;<br>&nbsp;&nbsp; &nbsp;mapInterface.addressZoom=10;<br>&nbsp;&nbsp; &nbsp;mapInterface.searchBox=new Object();<br>&nbsp;&nbsp; &nbsp;mapInterface.searchBox.lonRange=10;<br>&nbsp;&nbsp; &nbsp;mapInterface.searchBox.latRange=10;<br>&nbsp;&nbsp; &nbsp;mapInterface.maxDistance=160900;//100 miles in meters<br>&nbsp;&nbsp; &nbsp;mapInterface.maxPoints=300; //Max points to display on the screen<br>&nbsp;&nbsp; &nbsp;mapInterface.formAwesome=new Object();&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;mapInterface.formAwesome.form = [["*the_specified_location",["yes","no"]],["#and_the_situation","For example, \"This is a new road and there is no paint.\""],["#specified_latitudelongitude_location",""],["*the_road_paved",["yes","no"]],["*road_private_access",["yes","no"]],["*road_one_way",["yes","no"]],["*on_the_road",["yes","no"]],["in_the_map",""],["in_the_map_2",""],["of_the_road",""],["the_new_road",""],["of_the_map",""],["#residential_development_etc","For example, \"This is a new road in a developing neighborhood.\""],["*in_the_future",["yes","no"]],["#please_elaborate",""],["#about_the_task",""]];<br>&nbsp;&nbsp; &nbsp;mapInterface.formAwesome.labels={"in_the_map_2":{"label":"What is the number of lanes in the south or west-ward direction of travel in the map? ","required":true},"of_the_road":{"label":"What is the speed limit on the initial section of the road? ","required":true},"the_road_paved":{"label":"Is the road paved? ","required":true},"road_one_way":{"label":"Is the road one way? ","required":true},"about_the_task":{"label":"Any comments about the task?"},"the_new_road":{"label":"Are there any turn restrictions turning on to the new road, or turning off the new road? ","required":true},"the_specified_location":{"label":"Does a road exist at the specified location? ","required":true},"on_the_road":{"label":"Is there a divider on the road? ","required":true},"and_the_situation":{"label":"Describe the road and the situation. ","required":true},"road_private_access":{"label":"Is the road private access? ","required":true},"in_the_map":{"label":"What is the number of lanes in the north or east-ward direction of travel in the map? ","required":true},"of_the_map":{"label":"What are the minimum and maximum address numbers on the road within the range of the map? ","required":true},"residential_development_etc":{"label":"Please provide a general description of the road and area. Note whether the road is still under construction, leads to hotels, if it is in the residential development, etc. ","required":true},"in_the_future":{"label":"Would you be willing to do this task again in the future?","required":true},"please_elaborate":{"label":"Please elaborate"},"specified_latitudelongitude_location":{"label":"If the road did not exist at the specified latitude/longitude location but was nearby, please describe its actual location. What was at the specified latitude/longitude location?"}};<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;mapInterface.points=new Object();<br>&nbsp;&nbsp; &nbsp;//mapInterface.points.data=&lt;?=file_get_contents('units.json')?&gt;;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;//Returns an array of units that fit in the appropriate location<br>&nbsp;&nbsp; &nbsp;mapInterface.points.filterByLoc=function(userLoc){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var filtUnits=new Array();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var counter=0;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(var unitId in mapInterface.points.data){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var unit=mapInterface.points.data[unitId];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Check distance<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( great_circle_distance(userLoc,unit)&gt;=mapInterface.maxDistance){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;continue;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else if(counter &gt;= mapInterface.maxPoints){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;filtUnits[unitId]=unit;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;counter++;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//*/<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return filtUnits;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Calculates Euclidean distance between two points<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;function checkDistance(point1,point2){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return Math.pow (<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; Math.pow( (point2.Lat-point1.Lat), 2)+Math.pow( (point2.Lon-point1.Lon), 2)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; , .5);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Gabe smed's true distance calc<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;function great_circle_distance(point_a, point_b) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var lat1 = point_a.Lat;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var lat2 = point_b.Lat;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var lon1 = point_a.Lon;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var lon2 = point_b.Lon;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var R = 6378140; // meters<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var dLat = deg_to_rad(lat2-lat1)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var dLon = deg_to_rad(lon2-lon1)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var a = Math.sin(dLat/2) * Math.sin(dLat/2) +<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Math.cos(deg_to_rad(lat1)) * Math.cos(deg_to_rad(lat2)) *<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Math.sin(dLon/2) * Math.sin(dLon/2);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var d = R * c;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return d<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;function deg_to_rad(deg) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return deg * Math.PI / 180.0<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;mapInterface.points.draw=function(userLoc, map){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//AJAX GET request to pull units in a large bounding box<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Then we use method .filterByLoc to reduce the search further<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//(function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var dataRequest=new Request.JSON({<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;url: mapInterface.baseCrowdflowerUrl+'/jobs/'+mapInterface.jobId+'/units/custom.json',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onSuccess: function(responseJSON, responseText){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//console.log(responseJSON);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.points.data=new Object();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(var unitId in responseJSON){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.points.data[unitId]= mapInterface.formatUnit(responseJSON[unitId], unitId);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;afterDataUpdated();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.loading').setStyle('visibility','hidden');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onFailure: function(xhr){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('Error loading data.&nbsp; Please try refreshing the page or send an email to info@doloreslabs.com');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var searchBoxLonSize=mapInterface.searchBox.lonRange;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var searchBoxLatSize=mapInterface.searchBox.latRange;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var params={&nbsp;&nbsp; &nbsp;c1_key:'long'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;,c1_val: (userLoc.Lon-searchBoxLonSize).toString()+','+(userLoc.Lon+searchBoxLonSize).toString()<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;,c1_op: 'bt'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;,c2_key:'lat'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;,c2_val: (userLoc.Lat-searchBoxLatSize).toString()+','+(userLoc.Lat+searchBoxLatSize).toString()<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;,c2_op: 'bt'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;dataRequest.get(params);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//})();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;function afterDataUpdated(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.removeMarkersAll();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(typeof(userLoc)=='undefined'){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var units=mapInterface.points.filterByLoc(userLoc);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if ( units.length===0){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('Sorry, no results found!&nbsp; Try another address.');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for(var unitId in units){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit=units[unitId];<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(typeof(unit['file1'])=='undefined'<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; || typeof(unit['file2'])=='undefined'){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//For some reason some of the unit objects are malformed<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//console.log(unit);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;continue;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var sMarker=new YMarker(new YGeoPoint( unit.Lat,unit.Lon ));<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sMarker.unitId=unitId;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sMarker.unit=unit;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Add onclick event to the markers<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;YEvent.Capture(sMarker,EventsList.MouseClick,function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(mapInterface.accepted.cond===true){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.confirmReturnUnit.bind(this, [this.unit, this.unitId])();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.simpleUnit.bind(this, [this.unit, this.unitId])();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.addOverlay(sMarker);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;};//*/<br>&nbsp;&nbsp; &nbsp;//Adds some custom properties to the unit<br>&nbsp;&nbsp; &nbsp;mapInterface.formatUnit=function(unit, unitId){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.Lat=unit.lat;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.Lon=unit.long;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.image1Url=mapInterface.imageBaseUrl+unit.file1.trim();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.image2Url=mapInterface.imageBaseUrl+unit.file2.trim();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.unitMapLink="&lt;a href=\"http://maps.yahoo.com/#mvt=m&amp;lat="+unit.Lat+"&amp;lon="+unit.Lon+"&amp;zoom=14&amp;q1="+unit.Lat+"%252C%2520"+unit.Lon+"\" target=\"_blank\"&gt;Click here to get driving instructions&lt;/a&gt;";<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.img1html='&lt;a target="_blank" href="'+unit.image1Url+'"&gt;&lt;img src="'+unit.image1Url+'"/&gt;&lt;/a&gt;';<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.img2html='&lt;a target="_blank" href="'+unit.image2Url+'"&gt;&lt;img src="'+unit.image2Url+'"/&gt;&lt;/a&gt;';<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;unit.unitId=unitId;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return unit;<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;mapInterface.popup=new Object();<br>&nbsp;&nbsp; &nbsp;//Used for callback on click of a YAHOO map marker.<br>&nbsp;&nbsp; &nbsp;//Pops up a new window with a simple unit view <br>&nbsp;&nbsp; &nbsp;mapInterface.popup.simpleUnit=function(unit, unitId){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Kill any existing window div<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.popup').dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Create a new popup div window (popup) using template found in div.popupContent<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var divText=$(document.body)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.getElement('div.popupContent div.simpleUnitView')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.get('html')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.substitute(unit);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Inject into DOM<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var newDiv=new Element('div', {"class": "popup", "id":"popupU"})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.set('html',divText)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( $(document.body) )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.store('unit',unit)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.store('unitId',unitId);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up accept button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(mapInterface.previewMode===true){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.viewMore').dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.simpleUnitView div.previewInstructions').setStyle('display','block');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up "View More Details" button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.viewMore').addEvent('click',mapInterface.popup.advUnit);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Make div popup and transparent while dragging<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var movableDiv=new Drag.Move(newDiv,{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onStart:function(el){el.addClass('dragging').set('opacity','.5');},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onComplete: function(el){el.removeClass('dragging').set('opacity','1.0');}&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;//Used as callback for when someone clicks "View more info" on the unit popup div<br>&nbsp;&nbsp; &nbsp;//Fullscreens an existing unit<br>&nbsp;&nbsp; &nbsp;mapInterface.popup.advUnit=function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Move window to upper left, Add a class that will include styles to maximize div to full screen<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var popupDiv=this.getParent().position({x:'left',y:'top'}).addClass('fullscreen');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var unitId=this.getParent().retrieve('unitId');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var unit=this.getParent().retrieve('unit');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var divText=$(document.body)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.getElement('div.popupContent div.advUnitView')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.get('html')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.substitute(unit);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().set('html',divText);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('div.accept').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Lock in unit through AJAX request<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var acceptRequest=new Request.JSON({<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;url:'/jobs/'+mapInterface.jobId+'/units/'+unitId+'/custom',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;method: 'put',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;data: {unit:{state:'judging'}},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onSuccess: function(responseJSON, responseText){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.unitId=unitId;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.unit=unit;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.cond=true;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.printableForm.bind( this )();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.acceptedTaskLink').setStyle('display','block');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}.bind(this.getParent().getParent()),<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onFailure: function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('Sorry, it seems a network problem is preventing you from accepting the task.&nbsp; Please try again later or email admin@doloreslabs.com');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Params<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;acceptRequest.send();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;//Pops up a new window at the beginning of task<br>&nbsp;&nbsp; &nbsp;mapInterface.popup.splash=function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var content=$(document.body).getElement('div.popupContent div.splash').get('html');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var newDiv=new Element('div', {"class": "splash popup fullscreen"})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.set('html',content)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( $(document.body) );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up returning button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.returning').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.checkUnitId();&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up new button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.new').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;//Pops up a new window at the beginning of task<br>&nbsp;&nbsp; &nbsp;mapInterface.popup.preview=function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var content=$(document.body).getElement('div.popupContent div.preview').get('html');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var newDiv=new Element('div', {"class": "preview popup"})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.set('html',content)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( $(document.body) );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up returning button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.preview.clickable').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Undisable search box (which is by default disabled in PREVIEW mode)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(mapInterface.previewMode===true){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$('userAddress').set('disabled',false);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Make div popup and transparent while dragging<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var movableDiv=new Drag.Move(newDiv,{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onStart:function(el){el.addClass('dragging').set('opacity','.5');},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onComplete: function(el){el.removeClass('dragging').set('opacity','1.0');}&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;//Allow user to enter in existing unit id<br>&nbsp;&nbsp; &nbsp;mapInterface.popup.checkUnitId=function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var content=$(document.body).getElement('div.popupContent div.checkUnitId').get('html');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var popupDiv=&nbsp;&nbsp; &nbsp;new Element('div', {"class": "popup checkUnitId fullscreen"})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.set('html',content)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( $(document.body) );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//So we can distinguish this div from the hidden one<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('input.unitId').addClass('real');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up submit button&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('div.checkUnitId').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Grab unitId<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var unitId=Number( $(document.body).getElement('input.unitId.real').value.trim() );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(typeof(unitId)!='number' || !isFinite(unitId) || unitId&lt;=0 ){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('The unit ID must be a number in the format 9999999');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var request=new Request.JSON({<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;url: mapInterface.baseCrowdflowerUrl+'/jobs/'+mapInterface.jobId+'/units/'+unitId+'/custom.json',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;method: 'get',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onSuccess: function(responseText, responseXML){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.unitId=unitId;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.unit=mapInterface.formatUnit(responseText.data, unitId);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.cond=true;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//console.log(responseText);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.submittableForm();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onFailure: function(xhr){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('The entered unit ID is not valid.&nbsp; Please ensure you entered it correctly and try again.');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;request.send();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up cancel button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('div.cancel').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.dispose();&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up input box so that hitting enter submits form<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('input.unitId').addEvent('keypress',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(e.key=='enter'){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.stop(); //Prevent form from submitting<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;popupDiv.getElement('div.checkUnitId').fireEvent('click');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;//Now actually display the form<br>&nbsp;&nbsp; &nbsp;mapInterface.popup.submittableForm=function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Kill existing popups<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.popup').dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Grab HTML from hidden div on page<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var html=$(document.body).getElement('div.popupContent div.submittableForm').get('html').substitute(mapInterface.accepted.unit);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Create the windowed div<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var newDiv=new Element('div', {"class": "submittableForm popup fullscreen"})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.set('html',html)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( $(document.body) );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Add form<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var jsaDivId='u'+mapInterface.accepted.unitId;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var jsaDiv=new Element('div', {"class": "submittableForm", id: jsaDivId} )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( newDiv.getElement('div.content form'), 'bottom' );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//JSawesome creates the form elements<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var myJSAwesome=new JSAwesome(jsaDivId,mapInterface.formAwesome.form, mapInterface.formAwesome.labels);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;myJSAwesome.to_html();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;myJSAwesome.addValidation();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Submit button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var submitButton=new Element('input', {type: "submit", name: "submit", value: "Submit"}).inject(newDiv.getElement('div.content form'), 'bottom');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Add some validation when submitting<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;submitButton.addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( $$('.files').length &gt; 0 ){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var myCookie=Cookie.write('submittedForm','yes',{duration: 30}); //save for a month)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return true;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.stop();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('You didn\'t upload any files!&nbsp; You must upload an image of the street to submit this task.&nbsp; Make sure you click the "Upload Images" button to upload the files after you have selected them from your computer.');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('input.upload').addClass('real');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.uploadStatus').addClass('real');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('ul.list').addClass('real');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('a.browse').addClass('real');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.uploader.wireUp(newDiv);<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;mapInterface.popup.printableForm=function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Kill existing popups<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.popup').dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Grab HTML from hidden div on page<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var html=$(document.body).getElement('div.popupContent div.printableForm').get('html').substitute(mapInterface.accepted.unit);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Create the windowed div<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var newDiv=new Element('div', {"class": "printableForm popup fullscreen"})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.set('html',html)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( $(document.body) );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var form=new Element('form', {"class": "printableForm", id: "printableForm" } )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( newDiv.getElement('div.content') );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;new JSAwesome('printableForm',mapInterface.formAwesome.form, mapInterface.formAwesome.labels).to_html();<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;mapInterface.uploader=new Object();<br>&nbsp;&nbsp; &nbsp;mapInterface.uploader.wireUp=function(newDiv){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('input.upload').addEvent('click', function(){mapInterface.uploader.swiffy.upload()})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var unit_id = mapInterface.accepted.unitId;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var worker_id = "{{_worker_id}}"<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.uploader.swiffy = new FancyUpload2(newDiv.getElement('div.uploadStatus'), newDiv.getElement('ul.list'), {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; url: 'http://crowdflower_upload.s3.amazonaws.com/',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; typeFilter: {'Data (*.jpg, *.jpeg)': '*.jpg; *.jpeg'},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; fieldName: 'file',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; path: '/Swiff.Uploader.swf',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; limitSize: 5 * 1024 * 1024, // 5Mb<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; multiple: true,<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; mergeData: true,<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; autoStart: false,<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; method: 'post',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; passStatus:[201],<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; data: {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;'key': 'uploads/'+unit_id+'-'+worker_id+'_1.jpg',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;'AWSAccessKeyId': "00NZJT8HNJ5H6N5MGP02",<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;'success_action_status' : 201,<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;'acl': 'private',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;'policy': "eyJleHBpcmF0aW9uIjogIjIwMTAtMDEtMDFUMDA6MDA6MDBaIiwKICAiY29uZGl0aW9ucyI6IFsgCiAgICB7ImJ1Y2tldCI6ICJjcm93ZGZsb3dlcl91cGxvYWQifSwgCiAgICBbInN0YXJ0cy13aXRoIiwgIiRrZXkiLCAidXBsb2Fkcy8iXSwKICAgIFsic3RhcnRzLXdpdGgiLCAiJEZpbGVuYW1lIiwgIiJdLAogICAgeyJhY2wiOiAicHJpdmF0ZSJ9LAogICAgWyJjb250ZW50LWxlbmd0aC1yYW5nZSIsIDAsIDEwNDg1NzZdLAogICAgWydlcScsICckc3VjY2Vzc19hY3Rpb25fc3RhdHVzJywgJzIwMSddCiAgXQp9Cg==",<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;'signature': "RUrMBFa13RBYm4HQ5zGfE0BXFIY="&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; },<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; fileInvalid: function(e) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; flash("File must be less than 10MB", "error")<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; },<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; onComplete: function(res){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $$('input.upload.real').set({'value': 'Upload complete!'})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; this.fileList.each(function(file,i){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(file.element.hasClass('completed'))<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file.element.addClass('completed').getElement('.file-remove').dispose()<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new Element('input', {type:'hidden', 'class':'files', name:'u'+unit_id+'[_files][]', value:unit_id+'-'+worker_id+'_'+(i+1)+'.'+file.extension}).inject(this.status)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }, this)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; var later = function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.size = this.uploading = this.bytesLoaded = this.percentLoaded = 0;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; later.delay(500,this)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $$('input.upload.real').set({disabled:false, value:'Upload these images', style:'display:none'})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; },<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; onFileRemove: function(w){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; if(this.fileList.length == 0) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $$('a.browse.real').set('html', 'Choose images of the road')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $$('input.upload.real').setStyle('display', 'none')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; },<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; onBeforeStart: function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $$('input.upload.real').set({'disabled':true, 'value': 'Uploading...'})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; },<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; onSelectSuccess: function(files){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; this.overallProgress.set(0);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; this.currentProgress.set(0);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; var offset = this.fileList.length - files.length + 1<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; files.each(function(f,i){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var data = mapInterface.uploader.swiffy.options.data<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; data.key = data.key.replace(/_(\d+)\.jpg/,'_'+(offset + i)+'.'+f.extension)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.setOptions({data:data})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; })<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $$('a.browse.real').set('html', 'Choose more images of the road')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; $$('input.upload.real').setStyle('display','')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; },<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; onFail: function(error) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; switch (error) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'hidden': // works after enabling the movie and clicking refresh<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('To enable the embedded uploader, unblock it in your browser and refresh (see Adblock).');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'blocked': // This no *full* fail, it works after the user clicks the button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('To enable the embedded uploader, enable the blocked Flash movie (see Flashblock).');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'empty': // Oh oh, wrong path<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('A required file was not found, please be patient and we\'ll fix this.');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;break;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 'flash': // no flash 9+ :(<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('To enable the embedded uploader, install the latest Adobe Flash plugin.')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; },<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; target: ($$('a.browse.real')[0])<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;};<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;mapInterface.popup.confirmReturnUnit=function(unit, unitId){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Kill any existing window div<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.popup').dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Create a new popup div window (popup) using template found in div.popupContent<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var divText=$(document.body)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.getElement('div.popupContent div.confirmReturnUnit')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.get('html');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Inject into DOM<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var newDiv=new Element('div', {"class": "popup confirmReturnUnit"})<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.set('html',divText)<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;.inject( $(document.body) )<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up close button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('span.close').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.getParent().getParent().dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up "View More Details" button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.confirm').addEvent('click',function(unit, unitId){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.simpleUnit(unit, unitId);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;/*<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//If task is already accepted, we need to first revoke the original task<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(mapInterface.accepted.cond===true){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//AJAX call to set state of the unit back to unjudged<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var returnRequest=new Request.JSON({<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;url:'/jobs/'+mapInterface.jobId+'/units/'+mapInterface.accepted.unitId+'/custom',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;method: 'put',<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;data: {unit:{state:'judgable'}},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onSuccess: function(responseJSON, responseText){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.unitId=null;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.unit=null;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.accepted.cond=false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.acceptedTaskLink').setStyle('display','none');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.popup').dispose();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onFailure: function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('Error connecting to server: could not return task.&nbsp; If you continue to receive this error, please send an email to admin@doloreslabs.com');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Params<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;returnRequest.send();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//*/<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}.bind(this, [unit, unitId]) );<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;newDiv.getElement('div.cancel').addEvent('click',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.printableForm(); <br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Make div popup and transparent while dragging<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var movableDiv=new Drag.Move(newDiv,{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onStart:function(el){el.addClass('dragging').set('opacity','.5');},<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;onComplete: function(el){el.removeClass('dragging').set('opacity','1.0');}&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;// Create a Map that will be placed in the "map" div.<br>&nbsp;&nbsp; &nbsp;window.addEvent('domready',function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( Cookie.read('submittedForm') === 'yes'){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Cookie.write('submittedForm','no');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;alert('Thanks for submitting the task!&nbsp; Now you can select a new task or submit answers to another one.');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Hide existing submit button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('input[type=submit]').addClass('invisible');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Check if this is preview in AMT or not<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if( $$('input[type=submit]')[0].get('disabled') ){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.previewMode=true;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.linkToSubmitPage.clickable').setStyle('visibility','hidden');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.preview();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Only display splash screen if we're not in preview mode<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;else{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.previewMode=false;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.splash();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var map = new YMap($('map')); <br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Add the ability to change between Sat, Hybrid, and Regular Maps<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.addTypeControl(); &nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Add the zoom control. Long specifies a Slider versus a "+" and "-" zoom control<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.addZoomLong();&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Add the Pan control to have North, South, East and West directional control<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.addPanControl(); &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;// Specifying the Map starting location and zoom level<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.drawZoomAndCenter("San Francisco", mapInterface.startingZoom);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.acceptedTaskLink').addEvent('click',function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.printableForm();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up the user address submit button<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('span#submitUserForm').addEvent('click',function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.loading').setStyle('visibility','visible');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;var userAddress=$('userAddress').value;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.geoCodeAddress(userAddress);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;YEvent.Capture(map, EventsList.onEndGeoCode, function(geoCode) {<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map.drawZoomAndCenter(geoCode.GeoPoint,mapInterface.addressZoom);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (geoCode.success){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Clear points<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.points.draw(geoCode.GeoPoint,map);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; });<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Wire up take me back to home page link<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('div.linkToSubmitPage').addEvent('click',function(){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;mapInterface.popup.checkUnitId();<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//Change default action of hitting enter on the input element<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('input#userAddress').addEvent('keypress',function(e){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if(e.key=='enter'){<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;e.stop(); //Prevent form from submitting<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;$$('span#submitUserForm').fireEvent('click');<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;});<br>&nbsp;&nbsp; &nbsp;});<br>&lt;/script&gt;<br>&lt;style type="text/css"&gt;<br>.invisible{<br>&nbsp;&nbsp; &nbsp;display:none;<br>}<br>input{<br>&nbsp;&nbsp; &nbsp;margin-right:15px;<br>}<br>div#map{<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;height:400px;<br>&nbsp;&nbsp; &nbsp;width:700px;<br>}<br>div.loading{<br>&nbsp;&nbsp; &nbsp;background-color:yellow;<br>&nbsp;&nbsp; &nbsp;width:8em;<br>&nbsp;&nbsp; &nbsp;font-size:130%;<br>&nbsp;&nbsp; &nbsp;visibility:hidden;<br>}<br>div.loadingTop{<br>&nbsp;&nbsp; &nbsp;position:fixed;<br>&nbsp;&nbsp; &nbsp;left:0px;<br>&nbsp;&nbsp; &nbsp;top:0px;<br>&nbsp;&nbsp; &nbsp;z-index:1000;<br>&nbsp;&nbsp; &nbsp;background-color:yellow;<br>&nbsp;&nbsp; &nbsp;width:8em;<br>&nbsp;&nbsp; &nbsp;font-size:130%;<br>&nbsp;&nbsp; &nbsp;display:none;<br>}<br>div.acceptedTaskLink{<br>&nbsp;&nbsp; &nbsp;margin-top:5px;<br>&nbsp;&nbsp; &nbsp;display:none;<br>&nbsp;&nbsp; &nbsp;<br>}<br>div.userLocation{<br>&nbsp;&nbsp; &nbsp;padding-top:30px;<br>}<br>span#submitUserForm{<br>&nbsp;&nbsp; &nbsp;cursor:pointer;<br>&nbsp;&nbsp; &nbsp;background-color:#5D9732;<br>&nbsp;&nbsp; &nbsp;padding:4px;<br>&nbsp;&nbsp; &nbsp;color:white;<br>}<br>input#userAddress{<br>&nbsp;&nbsp; &nbsp;width:50em;<br>}<br>/*Styling for div/span buttons*/<br>div.clickable{<br>&nbsp;&nbsp; &nbsp;background-color:#27572A;<br>&nbsp;&nbsp; &nbsp;padding:5px;<br>&nbsp;&nbsp; &nbsp;cursor:pointer;<br>&nbsp;&nbsp; &nbsp;text-align:center;<br>&nbsp;&nbsp; &nbsp;font-size:120%;<br>&nbsp;&nbsp; &nbsp;color:white;<br>}<br>div.clickable.small{<br>&nbsp;&nbsp; &nbsp;width:10em;<br>}<br>div.popup{<br>&nbsp;&nbsp; &nbsp;background-color:white;<br>&nbsp;&nbsp; &nbsp;border-width:5px;<br>&nbsp;&nbsp; &nbsp;border-style:solid;<br>&nbsp;&nbsp; &nbsp;border-color:black;<br>&nbsp;&nbsp; &nbsp;width:400px;<br>&nbsp;&nbsp; &nbsp;z-index:255;<br>&nbsp;&nbsp; &nbsp;position:fixed;<br>&nbsp;&nbsp; &nbsp;top:10%;<br>&nbsp;&nbsp; &nbsp;left:10%;<br>&nbsp;&nbsp; &nbsp;cursor:-moz-grab;<br>&nbsp;&nbsp; &nbsp;cursor:grab;<br>}<br>div.popup.preview{<br>&nbsp;&nbsp; &nbsp;width:540px;<br>}<br>div.dragging{<br>&nbsp;&nbsp; &nbsp;cursor:-moz-grabbing;<br>&nbsp;&nbsp; &nbsp;cursor:grabbing;<br>}<br>div.popup.fullscreen{<br>&nbsp;&nbsp; &nbsp;width:96%;<br>&nbsp;&nbsp; &nbsp;height:96%;<br>&nbsp;&nbsp; &nbsp;position:absolute;<br>&nbsp;&nbsp; &nbsp;left:2px;<br>&nbsp;&nbsp; &nbsp;top:2px;<br>}<br>div.popup div.topBar{<br>&nbsp;&nbsp; &nbsp;width:100%;<br>&nbsp;&nbsp; &nbsp;text-align:right;<br>&nbsp;&nbsp; &nbsp;background-color:#5D9732;<br>}<br>div.popup.fullscreen{<br>&nbsp;&nbsp; &nbsp;cursor:default;<br>}<br>/*Close button*/<br>div.popup span.popupButton{<br>&nbsp;&nbsp; &nbsp;padding-left:5px;<br>&nbsp;&nbsp; &nbsp;padding-right:5px;<br>&nbsp;&nbsp; &nbsp;background-color:black;<br>&nbsp;&nbsp; &nbsp;color:white;<br>&nbsp;&nbsp; &nbsp;cursor:pointer;<br>}<br>div.popup span.popupButtonSpacer{<br>&nbsp;&nbsp; &nbsp;background-color:inherit;<br>&nbsp;&nbsp; &nbsp;padding:0px;<br>&nbsp;&nbsp; &nbsp;padding-left:3px;<br>}<br>div.popup div.content{<br>&nbsp;&nbsp; &nbsp;background-color:white;<br>&nbsp;&nbsp; &nbsp;padding:20px;<br>}<br>div.popup div.content div.image1{<br>&nbsp;&nbsp; &nbsp;width:300px;<br>}<br>div.popup div.content div.image2{<br>&nbsp;&nbsp; &nbsp;width:300px;<br>}<br>div.popup.fullscreen div.content div.imageHolder{<br>&nbsp;&nbsp; &nbsp;float:right;<br>&nbsp;&nbsp; &nbsp;width:60%;<br>}<br>div.popup.fullscreen div.content div.image1{<br>&nbsp;&nbsp; &nbsp;height:40%;<br>&nbsp;&nbsp; &nbsp;float:right;<br>}<br>div.popup.fullscreen div.content div.image2{<br>&nbsp;&nbsp; &nbsp;height:40%;<br>&nbsp;&nbsp; &nbsp;float:right;<br>}<br>div.popup.fullscreen div.text{<br>&nbsp;&nbsp; &nbsp;padding:40px;<br>}<br>div.popup div.content img{<br>&nbsp;&nbsp; &nbsp;width:100%;<br>}<br>div.popupContent{<br>&nbsp;&nbsp; &nbsp;display:none;<br>}<br>div.popup.splash{<br>&nbsp;&nbsp; &nbsp;cursor:default;<br>&nbsp;&nbsp; &nbsp;position:fixed;<br>&nbsp;&nbsp; &nbsp;top:2px;<br>&nbsp;&nbsp; &nbsp;left:2px;<br>&nbsp;&nbsp; &nbsp;bottom:2px;<br>&nbsp;&nbsp; &nbsp;right:2px;<br>}<br>div.popup.splash div.returning{<br>&nbsp;&nbsp; &nbsp;width:60%;<br>&nbsp;&nbsp; &nbsp;margin-top:20%;<br>&nbsp;&nbsp; &nbsp;margin-left:15%;<br>}<br>div.popup.splash div.new{<br>&nbsp;&nbsp; &nbsp;margin-top:1em;<br>&nbsp;&nbsp; &nbsp;margin-left:15%;<br>&nbsp;&nbsp; &nbsp;width:60%;<br>}<br>div.popup.checkUnitId input{<br>&nbsp;&nbsp; &nbsp;width:10em;<br>&nbsp;&nbsp; &nbsp;margin-top:5%;<br>&nbsp;&nbsp; &nbsp;margin-bottom:5px;<br>}<br>div#formAwesome{<br>&nbsp;&nbsp; &nbsp;width:95%;<br>&nbsp;&nbsp; &nbsp;height:95%;<br>&nbsp;&nbsp; &nbsp;margin-top:5%;<br>}<br>div.linkToSubmitPage{<br>&nbsp;&nbsp; &nbsp;margin-top:3px;<br>&nbsp;&nbsp; &nbsp;width:45em;<br>&nbsp;&nbsp; &nbsp;font-size:80%;<br>}<br>div.popup.fullscreen.printableForm{<br>&nbsp;&nbsp; &nbsp;height:auto;<br>&nbsp;&nbsp; &nbsp;cursor:default;<br>}<br>div.popup.fullscreen.submittableForm{<br>&nbsp;&nbsp; &nbsp;height:auto;<br>&nbsp;&nbsp; &nbsp;cursor:default;<br>}<br>div.popup div.previewInstructions{<br>&nbsp;&nbsp; &nbsp;display:none;<br>&nbsp;&nbsp; &nbsp;padding:10px;<br>}<br>div.vertPadding{<br>&nbsp;&nbsp; &nbsp;margin-top:5px;<br>}<br>&lt;/style&gt;<br>&lt;style type="text/css" media="screen"&gt;<br>/*Uploader styles*/<br>div.uploader{<br>&nbsp;&nbsp; &nbsp;margin-left:10px;<br>&nbsp;&nbsp; &nbsp;width:auto;<br>}<br>div.uploader img{<br>&nbsp;&nbsp; &nbsp;width:auto !important;<br>}<br>div#status{<br>&nbsp;&nbsp; &nbsp;display:hidden;<br>}<br>.progress {<br>&nbsp; background: white url(/images/progress-bar/progress.gif) no-repeat +50% 0;<br>&nbsp; margin-right: 0.5em;<br>}<br>.progress-text{<br>&nbsp; font-size: 0.9em;<br>&nbsp; font-weight: bold;<br>}<br>.file-remove {<br>&nbsp; font-size:0.9em;<br>&nbsp; padding:5px;<br>&nbsp; color:#ad1a2c;<br>}<br>.file-info {<br>&nbsp; margin-left:8px;<br>}<br>.file-name {<br>&nbsp; margin-left:5px;<br>}<br>.completed {<br>&nbsp; color:#CCC;<br>}<br>&lt;/style&gt;<br>&lt;div class="loadingTop"&gt;Loading&lt;/div&gt;<br>&lt;div class="linkToSubmitPage clickable"&gt;<br>&nbsp;&nbsp; &nbsp;I've already driven to a location and completed a task.&nbsp; Let me submit my answers!<br>&lt;/div&gt;<br>&lt;div class="userLocation"&gt;<br>&nbsp;&nbsp; &nbsp;&lt;form name="userLocationForm"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h3&gt;Enter your city to find nearby tasks (e.g. San Francisco, CA or Melbourne, Australia): &lt;/h3&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;input type="text" name="address" id="userAddress"/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;span id="submitUserForm"&gt;Search&lt;/span&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/form&gt;<br>&lt;/div&gt;<br>&lt;div class="acceptedTaskLink clickable"&gt;You have already accepted a task!&nbsp; Click here to view instructions&lt;/div&gt;<br>&lt;div class="mapInstructions"&gt;&lt;h3&gt;Click on an orange flag to preview a task.&lt;/h3&gt;&lt;/div&gt;<br>&lt;div class="loading"&gt;Loading&lt;/div&gt;<br>&lt;div id="map"&gt;&lt;/div&gt;<br>&lt;!--Stores the actual content of the popup divs--&gt;<br>&lt;div class="popupContent"&gt;<br>&nbsp;&nbsp; &nbsp;&lt;div class="splash"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;In this task, you will drive to a given location and answer questions about the area.&nbsp; To perform this task, you must:<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ol&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Choose a location from the map interface&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Print out or write down a short form containing questions about the physical location&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Within 24 hours, &lt;b&gt;drive to the chosen location&lt;/b&gt; and answer the questions about the location&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Take pictures of the area &lt;b&gt;using a digital camera&lt;/b&gt;&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Return to this task, enter in the information you collected, and upload your photos&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Submit the task&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ol&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;You've now accepted the Task through Mechanical Turk, but you now need to accept a particular location in our map interface.<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;To continue, please select one of the following:&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="buttons"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="clickable returning"&gt;I previously accepted a task here and just need to submit my answer&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="clickable new"&gt;I need to browse through the available tasks&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&lt;div class="preview"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h3&gt;IMPORTANT: After accepting this task AND accepting a location, you will have 24 hours to drive to the location, take photos, and return to your computer to submit the answers.&lt;/h3&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h3&gt;It may take up to 48 hours to approve your results.&lt;/h3&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;In this task, you will drive to a given location and answer questions about the area.&nbsp; To perform this task, you must:<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ol&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Choose a location from the map interface&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Print out or write down a short form containing questions about the physical location&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Within 24 hours, &lt;b&gt;drive to the chosen location&lt;/b&gt; and answer the questions about the location&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Take pictures of the area &lt;b&gt;using a digital camera&lt;/b&gt;&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Return to this task, enter in the information you collected, and upload your photos&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Submit the task&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ol&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;Before you accept this task, you should see if any tasks are available in your location.&nbsp; Click the Preview button below to search for tasks in your area.<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;If you find a task that you want to accept, you need to then click the yellow Accept button in the Mechanical Turk inteface (above this frame).&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="clickable preview small"&gt;Preview&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&lt;div class="confirmReturnUnit"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;You've already accepted a task!&nbsp; Are you sure you want to also accept another one?&nbsp; Make sure you've printed out details of the first task before you accept the next one!<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="buttons"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="confirm clickable"&gt;I've already printed out details of my last task and want &lt;b&gt;also&lt;/b&gt; to accept another one&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="vertPadding"&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="cancel clickable"&gt;Never mind, bring me back to the last task I accepted&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&lt;div class="simpleUnitView"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="image1"&gt;{img1html}&lt;/div&gt;&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Address:&lt;/b&gt; {address}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;City:&lt;/b&gt; {city}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;State:&lt;/b&gt; {state}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Country:&lt;/b&gt; {country}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{unitMapLink}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="previewInstructions"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;You must accept the task by pressing the yellow "Accept" button above this frame (in the Amazon interface) before you can choose this location for your task.<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="viewMore clickable small"&gt;Proceed&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;div class="advUnitView"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="imageHolder"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="image1"&gt;{img1html}&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="image2"&gt;{img2html}&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="text"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Lat:&lt;/b&gt; {Lat}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Lon:&lt;/b&gt; {Lon}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Street Name:&lt;/b&gt; {address}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;City:&lt;/b&gt; {city}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;State:&lt;/b&gt; {state}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Country:&lt;/b&gt; {country}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{unitMapLink}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="instructions"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;To complete this task, you will need to drive to the specified location with a digital camera and a printout of a short (one-page) questionnaire about the area.<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;To accept the task and display a printable questionnaire to answer about the location, click the button below.&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;&lt;b&gt;DISCLAIMER: You need to drive to the location and take and upload a JPEG digital photo of the specified location to complete this task.&lt;/b&gt;&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="accept clickable small"&gt;Accept this task&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&lt;div class="checkUnitId"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h1&gt;Enter in the UNIT ID code given to you earlier.&nbsp; You must have the UNIT ID to continue with the task:&lt;/h1&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Unit Id: &lt;input type="text" name="unitId" class="unitId hidden"/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;table&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;tr&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;td&gt; &lt;div class="clickable small checkUnitId"&gt;Proceed&lt;/div&gt; &lt;/td&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;td&gt; &lt;div class="clickable small cancel"&gt;Cancel&lt;/div&gt; &lt;/td&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/tr&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/table&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&lt;div class="submittableForm"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="instructions"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h1&gt;Before submitting the form, make sure that the below information is the correct location (the one that you drove to).&lt;/h1&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h2&gt;Unit ID:{unitId}&lt;/h2&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Lat:&lt;/b&gt; {Lat}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Lon:&lt;/b&gt; {Lon}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Street Name:&lt;/b&gt; {address}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;City:&lt;/b&gt; {city}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;State:&lt;/b&gt; {state}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Country:&lt;/b&gt; {country}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;Please be &lt;b&gt;as descriptive as possible&lt;/b&gt; in your answers!&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;Note that it may take up to 48 hours before your work is approved and you are paid.&nbsp; Your work will be manually verified.&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;form method="POST"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;input type="hidden" name="started_at" class="started_at" value=""/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="uploader"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h3&gt;File upload&lt;/h3&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="uploadStatus"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;a href="#" class="browse"&gt;Choose images of the road&lt;/a&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;div class="current-title"&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;img src="/images/progress-bar/bar.gif" class="progress current-progress" /&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="current-text" style="display:none"&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;div class="overall-title"&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;img src="/images/progress-bar/bar.gif" class="progress overall-progress" /&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;ul class="list"&gt;&lt;/ul&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;input type="button" class="upload" value="Upload these images" style="display:none"/&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="vertPadding"&gt;&lt;/div&gt;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/form&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&lt;div class="printableForm"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="topBar"&gt;&lt;span class="close popupButton"&gt;x&lt;/span&gt;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="instructions"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h1&gt;Print out a copy of these questions.&nbsp; Make sure you write down the UNIT ID, or you will not be able to submit your answers and get paid.&nbsp; Read and follow the instructions carefully!&lt;/h1&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h2&gt;Unit ID:{unitId}&lt;/h2&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;h3&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Instructions:<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ol&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Drive to the location shown in the map and specified in the below details.&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Bring a digital camera and a copy of these questions.&nbsp; A digital camera that geotags images (stores the location where they were taken) is preferred, if you have access to one (don't worry--you'll still get paid if you use a regular digital camera).&nbsp; Please use the highest resolution and quality possible on your camera.&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;See if there is a street at the location shown in the map with the name given below.&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;If so, take a picture of the street and the corresponding street sign containing the name of the street&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;EITHER WAY, take &lt;b&gt;at least 4 pictures&lt;/b&gt; of the area around the latitude/longtitude position given.&nbsp; Take one photo in each direction (North, East, South, West).&nbsp; &lt;b&gt;IMPORTANT:&lt;/b&gt; When taking these four photos, please write on a piece of paper the direction (North, East, etc.) in which you are taking the given photo and then hold this label in the picture.&nbsp; For an example, &lt;a href="http://a1.doloreslabs.com/q82/examples/ex_img_map.JPG"&gt;click here&lt;/a&gt;.&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;If the street mentioned in the task is nearby but not at the latitude/longitude specified, please take a picture of the street sign and make note of the location in as much detail as possible.&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Take as many other pictures as possible to fully provide an understanding of the location and the streets there.&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;Answer the questions below for the street and the area around it (the area to consider for this task extends to the edges of the first map image given)&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;li&gt;After you have the answers and photos of the street, refresh the page and choose the option, "I previously accepted a task here and just need to submit my answer".<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Then enter in the Unit ID ({unitId}).&lt;/li&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ol&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;After you've printed the instructions for the task, if you'd like to accept another location in addition to this one (and do both), click the black X on the right side of the green bar above.&nbsp; Then choose another location by clicking an orange marker.<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/p&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/h3&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Lat:&lt;/b&gt; {Lat}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Lon:&lt;/b&gt; {Lon}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Street Name:&lt;/b&gt; {address}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;City:&lt;/b&gt; {city}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;State:&lt;/b&gt; {state}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;b&gt;Country:&lt;/b&gt; {country}&lt;br&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{unitMapLink}<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="imageHolder"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="image1"&gt;{img1html}&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="image2"&gt;{img2html}&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;div class="content"&gt;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&nbsp;&nbsp; &nbsp;&lt;/div&gt;<br>&lt;/div&gt;<cml:text label="Text"/>
@@ -0,0 +1,47 @@
1
+
2
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
3
+
4
+ describe "CML Normalize" do
5
+ it "normalizes everything to checkboxes or text inputs" do
6
+ @p = Parser.new(<<-HTML, {:prefix => "u12345", :normalize => true})
7
+ <cml:select label="Awesome" validates="required" default="Choose an option" instructions="Just be cool about it">
8
+ <cml:gold src="awesome_gold" regex="\\.asdf\\." flags="i" strict="true" />
9
+ <cml:option label="Awesome" />
10
+ <cml:option label="Cool" />
11
+ <cml:option label="Rad" />
12
+ <cml:option label="Neat" />
13
+ </cml:select>
14
+ <cml:text label="Opinion" validates="minLength:30" class="large" />
15
+ <cml:radios label="Hot">
16
+ <cml:radio label="For sure"/>
17
+ <cml:radio label="Not" />
18
+ </cml:radios>
19
+ <cml:meta label="Neat" gold="true"/>
20
+ HTML
21
+ #puts Parser.escape(@p.to_html).gsub(/\n/,"<br/>")
22
+ @p.to_html.should sorta_match(<<-HTML)
23
+ <div class="cml" id="u12345">
24
+ <div class="checkboxes">
25
+ <h2 class="legend">Awesome</h2>
26
+ <label><input name="u12345[awesome][]" class="awesome validates-required" value="Awesome" type="checkbox" /> Awesome</label>
27
+ <label><input name="u12345[awesome][]" class="awesome validates-required" value="Cool" type="checkbox" /> Cool</label>
28
+ <label><input name="u12345[awesome][]" class="awesome validates-required" value="Rad" type="checkbox" /> Rad</label>
29
+ <label><input name="u12345[awesome][]" class="awesome validates-required" value="Neat" type="checkbox" /> Neat</label>
30
+ <p class="instructions">Just be cool about it</p>
31
+ </div>
32
+ <div class="text"><label class="legend">Opinion</label>
33
+ <input name="u12345[opinion]" class="opinion validates-minLength:30 large" value="" type="text" />
34
+ </div>
35
+ <div class="checkboxes">
36
+ <h2 class="legend">Hot</h2>
37
+ <label><input name="u12345[hot][]" class="hot" value="For sure" type="checkbox" /> For sure</label>
38
+ <label><input name="u12345[hot][]" class="hot" value="Not" type="checkbox" /> Not</label>
39
+ </div>
40
+ <div class="text">
41
+ <label class="legend">Neat</label>
42
+ <input name="u12345[neat]" class="neat" value="" type="text" />
43
+ </div>
44
+ </div>
45
+ HTML
46
+ end
47
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dolores-cml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris Van Pelt
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-02 00:00:00 -07:00
12
+ date: 2009-09-07 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -82,7 +82,9 @@ files:
82
82
  - spec/fixtures/complex.cml
83
83
  - spec/fixtures/html.cml
84
84
  - spec/fixtures/invalid.cml
85
+ - spec/fixtures/segfault.cml
85
86
  - spec/meta_spec.rb
87
+ - spec/normalize_spec.rb
86
88
  - spec/sorta_match.rb
87
89
  - spec/spec_helper.rb
88
90
  - spec/tags/checkbox_spec.rb
@@ -98,7 +100,6 @@ files:
98
100
  - spec/validation_spec.rb
99
101
  has_rdoc: false
100
102
  homepage: http://github.com/dolores/cml
101
- licenses:
102
103
  post_install_message:
103
104
  rdoc_options:
104
105
  - --charset=UTF-8
@@ -119,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
119
120
  requirements: []
120
121
 
121
122
  rubyforge_project:
122
- rubygems_version: 1.3.5
123
+ rubygems_version: 1.2.0
123
124
  signing_key:
124
125
  specification_version: 3
125
126
  summary: CML is CrowdFlower Markup Language
@@ -127,6 +128,7 @@ test_files:
127
128
  - spec/complex_spec.rb
128
129
  - spec/converters/jsawesome_spec.rb
129
130
  - spec/meta_spec.rb
131
+ - spec/normalize_spec.rb
130
132
  - spec/sorta_match.rb
131
133
  - spec/spec_helper.rb
132
134
  - spec/tags/checkbox_spec.rb