low hanging fruit: improvement in tax location selection RT#6000
[freeside.git] / httemplate / edit / cust_main / bottomfixup.js
1 function bottomfixup(what) {
2
3 %# ../cust_main.cgi
4   var layervars = new Array(
5     'payauto',
6     'payinfo', 'payinfo1', 'payinfo2', 'paytype',
7     'payname', 'paystate', 'exp_month', 'exp_year', 'paycvv',
8     'paystart_month', 'paystart_year', 'payissue',
9     'payip',
10     'paid'
11   );
12
13   var cf = document.CustomerForm;
14   var payby = cf.payby.options[cf.payby.selectedIndex].value;
15   for ( f=0; f < layervars.length; f++ ) {
16     var field = layervars[f];
17     copyelement( cf.elements[payby + '_' + field],
18                  cf.elements[field]
19                );
20   }
21
22   //this part does USPS address correction
23
24   // XXX should this be first and should we update the form fields that are
25   // displayed???
26
27   var cf = document.CustomerForm;
28
29   var state_el      = cf.elements['state'];
30   var ship_state_el = cf.elements['ship_state'];
31
32   //address_standardize(
33   var cust_main = new Array(
34     'company',  cf.elements['company'].value,
35     'address1', cf.elements['address1'].value,
36     'address2', cf.elements['address2'].value,
37     'city',     cf.elements['city'].value,
38     'state',    state_el.options[ state_el.selectedIndex ].value,
39     'zip',      cf.elements['zip'].value,
40
41     'ship_company',  cf.elements['ship_company'].value,
42     'ship_address1', cf.elements['ship_address1'].value,
43     'ship_address2', cf.elements['ship_address2'].value,
44     'ship_city',     cf.elements['ship_city'].value,
45     'ship_state',    ship_state_el.options[ ship_state_el.selectedIndex ].value,
46     'ship_zip',      cf.elements['ship_zip'].value
47   );
48
49   address_standardize( cust_main, update_address );
50
51 }
52
53 var standardize_address;
54
55 function update_address(arg) {
56
57   var argsHash = eval('(' + arg + ')');
58
59   var changed  = argsHash['address_standardized'];
60   var ship_changed = argsHash['ship_address_standardized'];
61   var error = argsHash['error'];
62   var ship_error = argsHash['ship_error'];
63   
64
65   //yay closures
66   standardize_address = function () {
67
68     var cf = document.CustomerForm;
69     var state_el      = cf.elements['state'];
70     var ship_state_el = cf.elements['ship_state'];
71
72     if ( changed ) {
73       cf.elements['company'].value  = argsHash['new_company'];
74       cf.elements['address1'].value = argsHash['new_address1'];
75       cf.elements['address2'].value = argsHash['new_address2'];
76       cf.elements['city'].value     = argsHash['new_city'];
77       setselect(cf.elements['state'], argsHash['new_state']);
78       cf.elements['zip'].value      = argsHash['new_zip'];
79     }
80
81     if ( ship_changed ) {
82       cf.elements['ship_company'].value  = argsHash['new_ship_company'];
83       cf.elements['ship_address1'].value = argsHash['new_ship_address1'];
84       cf.elements['ship_address2'].value = argsHash['new_ship_address2'];
85       cf.elements['ship_city'].value     = argsHash['new_ship_city'];
86       setselect(cf.elements['ship_state'], argsHash['new_ship_state']);
87       cf.elements['ship_zip'].value      = argsHash['new_ship_zip'];
88     }
89
90     post_standardization();
91
92   }
93
94
95
96   if ( changed || ship_changed ) {
97
98 %   if ( $conf->exists('cust_main-auto_standardize_address') ) {
99
100     standardize_address();
101
102 %   } else {
103
104     // popup a confirmation popup
105
106     var confirm_change =
107       '<CENTER><BR><B>Confirm address standardization</B><BR><BR>' +
108       '<TABLE>';
109     
110     if ( changed ) {
111
112       confirm_change = confirm_change + 
113         '<TR><TH>Entered billing address</TH>' +
114           '<TH>Standardized billing address</TH></TR>';
115         // + '<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
116       
117       if ( argsHash['company'] || argsHash['new_company'] ) {
118         confirm_change = confirm_change +
119         '<TR><TD>' + argsHash['company'] +
120           '</TD><TD>' + argsHash['new_company'] + '</TD></TR>';
121       }
122       
123       confirm_change = confirm_change +
124         '<TR><TD>' + argsHash['address1'] +
125           '</TD><TD>' + argsHash['new_address1'] + '</TD></TR>' +
126         '<TR><TD>' + argsHash['address2'] +
127           '</TD><TD>' + argsHash['new_address2'] + '</TD></TR>' +
128         '<TR><TD>' + argsHash['city'] + ', ' + argsHash['state'] + '  ' + argsHash['zip'] +
129           '</TD><TD>' + argsHash['new_city'] + ', ' + argsHash['new_state'] + '  ' + argsHash['new_zip'] + '</TD></TR>' +
130           '<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
131
132     }
133
134     if ( ship_changed ) {
135
136       confirm_change = confirm_change + 
137         '<TR><TH>Entered service address</TH>' +
138           '<TH>Standardized service address</TH></TR>';
139         // + '<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
140       
141       if ( argsHash['ship_company'] || argsHash['new_ship_company'] ) {
142         confirm_change = confirm_change +
143         '<TR><TD>' + argsHash['ship_company'] +
144           '</TD><TD>' + argsHash['new_ship_company'] + '</TD></TR>';
145       }
146       
147       confirm_change = confirm_change +
148         '<TR><TD>' + argsHash['ship_address1'] +
149           '</TD><TD>' + argsHash['new_ship_address1'] + '</TD></TR>' +
150         '<TR><TD>' + argsHash['ship_address2'] +
151           '</TD><TD>' + argsHash['new_ship_address2'] + '</TD></TR>' +
152         '<TR><TD>' + argsHash['ship_city'] + ', ' + argsHash['ship_state'] + '  ' + argsHash['ship_zip'] +
153           '</TD><TD>' + argsHash['new_ship_city'] + ', ' + argsHash['new_ship_state'] + '  ' + argsHash['new_ship_zip'] + '</TD></TR>' +
154         '<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
155
156     }
157
158     var addresses = 'address';
159     var height = 268;
160     if ( changed && ship_changed ) {
161       addresses = 'addresses';
162       height = 396; // #what
163     }
164
165     confirm_change = confirm_change +
166       '<TR><TD>' +
167         '<BUTTON TYPE="button" onClick="post_standardization();"><IMG SRC="<%$p%>images/error.png" ALT=""> Use entered ' + addresses + '</BUTTON>' + 
168       '</TD><TD>' +
169         '<BUTTON TYPE="button" onClick="standardize_address();"><IMG SRC="<%$p%>images/tick.png" ALT=""> Use standardized ' + addresses + '</BUTTON>' + 
170       '</TD></TR>' +
171       '<TR><TD COLSPAN=2 ALIGN="center">' +
172         '<BUTTON TYPE="button" onClick="document.CustomerForm.submitButton.disabled=false; parent.cClick();"><IMG SRC="<%$p%>images/cross.png" ALT=""> Cancel submission</BUTTON></TD></TR>' +
173         
174       '</TABLE></CENTER>';
175
176     overlib( confirm_change, CAPTION, 'Confirm address standardization', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, 576, HEIGHT, height, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 );
177
178 %   }
179
180   } else {
181
182     post_standardization();
183
184   }
185
186
187 }
188
189 function post_standardization() {
190
191   var cf = document.CustomerForm;
192
193 % if ( $conf->exists('enable_taxproducts') ) {
194
195   if ( new String(cf.elements['<% $taxpre %>zip'].value).length < 10 )
196   {
197
198     var country_el = cf.elements['<% $taxpre %>country'];
199     var country = country_el.options[ country_el.selectedIndex ].value;
200     var geocode = cf.elements['geocode'].value;
201
202     if ( country == 'CA' || country == 'US' ) {
203
204       var state_el = cf.elements['<% $taxpre %>state'];
205       var state = state_el.options[ state_el.selectedIndex ].value;
206
207       var url = "cust_main/choose_tax_location.html" +
208                   "?data_vendor=cch-zip" + 
209                   ";city="    + cf.elements['<% $taxpre %>city'].value +
210                   ";state="   + state + 
211                   ";zip="     + cf.elements['<% $taxpre %>zip'].value +
212                   ";country=" + country +
213                   ";geocode=" + geocode +
214                   ";";
215
216       // popup a chooser
217       OLgetAJAX( url, update_geocode, 300 );
218
219     } else {
220
221       cf.elements['geocode'].value = 'DEFAULT';
222       post_geocode();
223
224     }
225
226   } else {
227
228     post_geocode();
229
230   }
231
232 % } else {
233
234   post_geocode();
235
236 % }
237
238 }
239
240 function post_geocode() {
241
242 % if ( $conf->exists('cust_main-require_censustract') ) {
243
244   //alert('fetch census tract data');
245   var cf = document.CustomerForm;
246   var state_el = cf.elements['ship_state'];
247   var census_data = new Array(
248     'year',   <% $conf->config('census_year') || '2009' %>,
249     'address', cf.elements['ship_address1'].value,
250     'city',    cf.elements['ship_city'].value,
251     'state',   state_el.options[ state_el.selectedIndex ].value,
252     'zip',     cf.elements['ship_zip'].value
253   );
254
255   censustract( census_data, update_censustract );
256
257 % }else{
258
259   document.CustomerForm.submit();
260
261 % }
262
263 }
264
265 function update_geocode() {
266
267   //yay closures
268   set_geocode = function (what) {
269
270     var cf = document.CustomerForm;
271
272     //alert(what.options[what.selectedIndex].value);
273     var argsHash = eval('(' + what.options[what.selectedIndex].value + ')');
274     cf.elements['<% $taxpre %>city'].value     = argsHash['city'];
275     setselect(cf.elements['<% $taxpre %>state'], argsHash['state']);
276     cf.elements['<% $taxpre %>zip'].value      = argsHash['zip'];
277     cf.elements['geocode'].value  = argsHash['geocode'];
278     post_geocode();
279
280   }
281
282   // popup a chooser
283
284   overlib( OLresponseAJAX, CAPTION, 'Select tax location', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 );
285
286 }
287
288 var set_censustract;
289
290 function update_censustract(arg) {
291
292   var argsHash = eval('(' + arg + ')');
293
294   var cf = document.CustomerForm;
295
296   var msacode    = argsHash['msacode'];
297   var statecode  = argsHash['statecode'];
298   var countycode = argsHash['countycode'];
299   var tractcode  = argsHash['tractcode'];
300   var error      = argsHash['error'];
301   
302   var newcensus = 
303     new String(statecode)  +
304     new String(countycode) +
305     new String(tractcode).replace(/\s$/, '');  // JSON 1 workaround
306
307   set_censustract = function () {
308
309     cf.elements['censustract'].value = newcensus
310     cf.submit();
311
312   }
313
314   if (error || cf.elements['censustract'].value != newcensus) {
315     // popup an entry dialog
316
317     if (error) { newcensus = error; }
318     newcensus.replace(/.*ndefined.*/, 'Not found');
319
320     var choose_censustract =
321       '<CENTER><BR><B>Confirm censustract</B><BR>' +
322       '<A href="http://maps.ffiec.gov/FFIECMapper/TGMapSrv.aspx?' +
323       'census_year=<% $conf->config('census_year') || '2008' %>' +
324       '&latitude=' + cf.elements['latitude'].value +
325       '&longitude=' + cf.elements['longitude'].value +
326       '" target="_blank">Map service module location</A><BR>' +
327       '<A href="http://maps.ffiec.gov/FFIECMapper/TGMapSrv.aspx?' +
328       'census_year=<% $conf->config('census_year') || '2008' %>' +
329       '&zip_code=' + cf.elements['ship_zip'].value +
330       '" target="_blank">Map zip code center</A><BR><BR>' +
331       '<TABLE>';
332     
333     choose_censustract = choose_censustract + 
334       '<TR><TH style="width:50%">Entered census tract</TH>' +
335         '<TH style="width:50%">Calculated census tract</TH></TR>' +
336       '<TR><TD>' + cf.elements['censustract'].value +
337         '</TD><TD>' + newcensus + '</TD></TR>' +
338         '<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
339
340     choose_censustract = choose_censustract +
341       '<TR><TD ALIGN="center">' +
342         '<BUTTON TYPE="button" onClick="document.CustomerForm.submit();"><IMG SRC="<%$p%>images/error.png" ALT=""> Use entered census tract </BUTTON>' + 
343       '</TD><TD ALIGN="center">' +
344         '<BUTTON TYPE="button" onClick="set_censustract();"><IMG SRC="<%$p%>images/tick.png" ALT=""> Use calculated census tract </BUTTON>' + 
345       '</TD></TR>' +
346       '<TR><TD COLSPAN=2 ALIGN="center">' +
347         '<BUTTON TYPE="button" onClick="document.CustomerForm.submitButton.disabled=false; parent.cClick();"><IMG SRC="<%$p%>images/cross.png" ALT=""> Cancel submission</BUTTON></TD></TR>' +
348         
349       '</TABLE></CENTER>';
350
351     overlib( choose_censustract, CAPTION, 'Confirm censustract', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 );
352
353   } else {
354
355     cf.submit();
356
357   }
358
359 }
360
361 function copyelement(from, to) {
362   if ( from == undefined ) {
363     to.value = '';
364   } else if ( from.type == 'select-one' ) {
365     to.value = from.options[from.selectedIndex].value;
366     //alert(from + " (" + from.type + "): " + to.name + " => (" + from.selectedIndex + ") " + to.value);
367   } else if ( from.type == 'checkbox' ) {
368     if ( from.checked ) {
369       to.value = from.value;
370     } else {
371       to.value = '';
372     }
373   } else {
374     if ( from.value == undefined ) {
375       to.value = '';
376     } else {
377       to.value = from.value;
378     }
379   }
380   //alert(from + " (" + from.type + "): " + to.name + " => " + to.value);
381 }
382
383 function setselect(el, value) {
384
385   for ( var s = 0; s < el.options.length; s++ ) {
386      if ( el.options[s].value == value ) {
387        el.selectedIndex = s;
388      }
389   }
390
391 }
392 <%init>
393
394 my $conf = new FS::Conf;
395
396 my $taxpre = $conf->exists('tax-ship_address') ? 'ship_' : '';
397
398 </%init>