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