This commit was manufactured by cvs2svn to create tag 'freeside_2_1_1'.
[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     cf.elements['geocode'].value = '';
229     post_geocode();
230
231   }
232
233 % } else {
234
235   post_geocode();
236
237 % }
238
239 }
240
241 function post_geocode() {
242
243 % if ( $conf->exists('cust_main-require_censustract') ) {
244
245   //alert('fetch census tract data');
246   var cf = document.CustomerForm;
247   var state_el = cf.elements['ship_state'];
248   var census_data = new Array(
249     'year',   <% $conf->config('census_year') || '2009' %>,
250     'address', cf.elements['ship_address1'].value,
251     'city',    cf.elements['ship_city'].value,
252     'state',   state_el.options[ state_el.selectedIndex ].value,
253     'zip',     cf.elements['ship_zip'].value
254   );
255
256   censustract( census_data, update_censustract );
257
258 % }else{
259
260   document.CustomerForm.submit();
261
262 % }
263
264 }
265
266 function update_geocode() {
267
268   //yay closures
269   set_geocode = function (what) {
270
271     var cf = document.CustomerForm;
272
273     //alert(what.options[what.selectedIndex].value);
274     var argsHash = eval('(' + what.options[what.selectedIndex].value + ')');
275     cf.elements['<% $taxpre %>city'].value     = argsHash['city'];
276     setselect(cf.elements['<% $taxpre %>state'], argsHash['state']);
277     cf.elements['<% $taxpre %>zip'].value      = argsHash['zip'];
278     cf.elements['geocode'].value  = argsHash['geocode'];
279     post_geocode();
280
281   }
282
283   // popup a chooser
284
285   overlib( OLresponseAJAX, CAPTION, 'Select tax location', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 );
286
287 }
288
289 var set_censustract;
290
291 function update_censustract(arg) {
292
293   var argsHash = eval('(' + arg + ')');
294
295   var cf = document.CustomerForm;
296
297   var msacode    = argsHash['msacode'];
298   var statecode  = argsHash['statecode'];
299   var countycode = argsHash['countycode'];
300   var tractcode  = argsHash['tractcode'];
301   var error      = argsHash['error'];
302   
303   var newcensus = 
304     new String(statecode)  +
305     new String(countycode) +
306     new String(tractcode).replace(/\s$/, '');  // JSON 1 workaround
307
308   set_censustract = function () {
309
310     cf.elements['censustract'].value = newcensus
311     cf.submit();
312
313   }
314
315   if (error || cf.elements['censustract'].value != newcensus) {
316     // popup an entry dialog
317
318     if (error) { newcensus = error; }
319     newcensus.replace(/.*ndefined.*/, 'Not found');
320
321     var choose_censustract =
322       '<CENTER><BR><B>Confirm censustract</B><BR>' +
323       '<A href="http://maps.ffiec.gov/FFIECMapper/TGMapSrv.aspx?' +
324       'census_year=<% $conf->config('census_year') || '2008' %>' +
325       '&latitude=' + cf.elements['latitude'].value +
326       '&longitude=' + cf.elements['longitude'].value +
327       '" target="_blank">Map service module location</A><BR>' +
328       '<A href="http://maps.ffiec.gov/FFIECMapper/TGMapSrv.aspx?' +
329       'census_year=<% $conf->config('census_year') || '2008' %>' +
330       '&zip_code=' + cf.elements['ship_zip'].value +
331       '" target="_blank">Map zip code center</A><BR><BR>' +
332       '<TABLE>';
333     
334     choose_censustract = choose_censustract + 
335       '<TR><TH style="width:50%">Entered census tract</TH>' +
336         '<TH style="width:50%">Calculated census tract</TH></TR>' +
337       '<TR><TD>' + cf.elements['censustract'].value +
338         '</TD><TD>' + newcensus + '</TD></TR>' +
339         '<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>';
340
341     choose_censustract = choose_censustract +
342       '<TR><TD ALIGN="center">' +
343         '<BUTTON TYPE="button" onClick="document.CustomerForm.submit();"><IMG SRC="<%$p%>images/error.png" ALT=""> Use entered census tract </BUTTON>' + 
344       '</TD><TD ALIGN="center">' +
345         '<BUTTON TYPE="button" onClick="set_censustract();"><IMG SRC="<%$p%>images/tick.png" ALT=""> Use calculated census tract </BUTTON>' + 
346       '</TD></TR>' +
347       '<TR><TD COLSPAN=2 ALIGN="center">' +
348         '<BUTTON TYPE="button" onClick="document.CustomerForm.submitButton.disabled=false; parent.cClick();"><IMG SRC="<%$p%>images/cross.png" ALT=""> Cancel submission</BUTTON></TD></TR>' +
349         
350       '</TABLE></CENTER>';
351
352     overlib( choose_censustract, CAPTION, 'Confirm censustract', STICKY, AUTOSTATUSCAP, CLOSETEXT, '', MIDX, 0, MIDY, 0, DRAGGABLE, WIDTH, 576, HEIGHT, 268, BGCOLOR, '#333399', CGCOLOR, '#333399', TEXTSIZE, 3 );
353
354   } else {
355
356     cf.submit();
357
358   }
359
360 }
361
362 function copyelement(from, to) {
363   if ( from == undefined ) {
364     to.value = '';
365   } else if ( from.type == 'select-one' ) {
366     to.value = from.options[from.selectedIndex].value;
367     //alert(from + " (" + from.type + "): " + to.name + " => (" + from.selectedIndex + ") " + to.value);
368   } else if ( from.type == 'checkbox' ) {
369     if ( from.checked ) {
370       to.value = from.value;
371     } else {
372       to.value = '';
373     }
374   } else {
375     if ( from.value == undefined ) {
376       to.value = '';
377     } else {
378       to.value = from.value;
379     }
380   }
381   //alert(from + " (" + from.type + "): " + to.name + " => " + to.value);
382 }
383
384 function setselect(el, value) {
385
386   for ( var s = 0; s < el.options.length; s++ ) {
387      if ( el.options[s].value == value ) {
388        el.selectedIndex = s;
389      }
390   }
391
392 }
393 <%init>
394
395 my $conf = new FS::Conf;
396
397 my $taxpre = $conf->exists('tax-ship_address') ? 'ship_' : '';
398
399 </%init>