dolores-cml 0.4.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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