internationalization bug fixes
[openemr.git] / library / textformat.js
blob18bb675018717f360ee083d8c7152dc98706038b
1 // Copyright (C) 2005 Rod Roark <rod@sunsetsystems.com>
2 //
3 // This program is free software; you can redistribute it and/or
4 // modify it under the terms of the GNU General Public License
5 // as published by the Free Software Foundation; either version 2
6 // of the License, or (at your option) any later version.
8 // Onkeyup handler for dates.  Converts dates that are keyed in to a
9 // consistent format, and helps to reduce typing errors.
11 function datekeyup(e, defcc, withtime) {
12  if (typeof(withtime) == 'undefined') withtime = false;
14  while(true) {
15   var delim = '';
16   var arr = new Array(0, 0, 0, 0, 0, 0);
17   var ix = 0;
18   var v = e.value;
20   // Build an array to facilitate error checking.
21   for (var i = 0; i < v.length; ++i) {
22    var c = v.charAt(i);
23    if (c >= '0' && c <= '9') {
24     ++arr[ix];
25    } else if (ix < 2 && (c == '-' || c == '/')) {
26     arr[++ix] = 0;
27    } else if (withtime && ix == 2 && c == ' ') {
28     arr[++ix] = 0;
29    } else if (withtime && (ix == 3 || ix == 4) && c == ':') {
30     arr[++ix] = 0;
31    } else {
32     e.value = v.substring(0, i);
33     return;
34    }
35   }
37   // We have finished scanning the string.  If there is a problem,
38   // drop the last character and repeat the loop.
39   if ((ix > 5) ||
40       (!withtime && ix > 2)   ||
41       (ix > 4 && arr[4] == 0) ||
42       (ix > 3 && arr[3] == 0) ||
43       (ix > 2 && arr[2] == 0) ||
44       (ix > 1 && arr[1] == 0) ||
45       (ix > 0 && arr[0] == 0) ||
46       (arr[0] > 8) ||
47       (ix > 0 && arr[0] > 2 && (arr[0] != 4 || arr[1] > 2 || arr[2] > 2)) ||
48       (arr[2] > 2 && (arr[2] > 4 || arr[0] > 2 || arr[1] > 2)))
49   {
50    e.value = v.substring(0, v.length - 1);
51   } else {
52    break;
53   }
54  }
56  // The remainder does reformatting if there is enough data for that.
57  if (arr[2] == 4 && defcc == '1') { // mm/dd/yyyy
58   e.value  = v.substring(arr[0] + arr[1] + 2, arr[0] + arr[1] + 6) + '-'; // year
59   if (arr[0] == 1) e.value += '0';
60   e.value += v.substring(0, arr[0]) + '-'; // month
61   if (arr[1] == 1) e.value += '0';
62   e.value += v.substring(arr[0] + 1, arr[0] + 1 + arr[1]); // day
63  }
64  else if (arr[2] == 4) { // dd-mm-yyyy
65   e.value  = v.substring(arr[0] + arr[1] + 2, arr[0] + arr[1] + 6) + '-'; // year
66   if (arr[1] == 1) e.value += '0';
67   e.value += v.substring(arr[0] + 1, arr[0] + 1 + arr[1]) + '-'; // month
68   if (arr[0] == 1) e.value += '0';
69   e.value += v.substring(0, arr[0]); // day
70  }
71  else if (arr[0] == 4 && arr[2] > 0) { // yyyy-mm-dd
72   e.value  = v.substring(0, arr[0]) + '-'; // year
73   if (arr[1] == 1) e.value += '0';
74   e.value += v.substring(arr[0] + 1, arr[0] + 1 + arr[1]) + '-'; // month
75   e.value += v.substring(arr[0] + arr[1] + 2, arr[0] + arr[1] + 2 + arr[2]); // day (may be 1 digit)
76  }
77  else if (arr[0] == 8 && defcc == '1') { // yyyymmdd
78   e.value  = v.substring(0, 4) + '-'; // year
79   e.value += v.substring(4, 6) + '-'; // month
80   e.value += v.substring(6, 8); // day
81  }
82  else if (arr[0] == 8) { // ddmmyyyy
83   e.value  = v.substring(4, 8) + '-'; // year
84   e.value += v.substring(2, 4) + '-'; // month
85   e.value += v.substring(0, 2); // day
86  }
87  else {
88   return;
89  }
90  if (withtime) {
91   e.value += v.substring(arr[0] + arr[1] + arr[2] + 2);
92  }
95 // Onblur handler to avoid incomplete entry of dates.
97 function dateblur(e, defcc, withtime) {
98  if (typeof(withtime) == 'undefined') withtime = false;
100  var v = e.value;
101  if (v.length == 0) return;
103  var arr = new Array(0, 0, 0, 0, 0);
104  var ix = 0;
105  for (var i = 0; i < v.length; ++i) {
106   var c = v.charAt(i);
107   if (c >= '0' && c <= '9') {
108    ++arr[ix];
109   } else if (c == '-' || c == '/' || c == ' ' || c == ':') {
110    arr[++ix] = 0;
111   } else {
112    alert('Invalid character in date!');
113    return;
114   }
117  if ((!withtime && ix != 2) || (withtime && ix < 2) || arr[0] != 4 || arr[1] != 2 || arr[2] < 1) {
118   if (confirm('Date entry is incomplete! Try again?'))
119    e.focus();
120   else
121    e.value = '';
122   return;
125  if (arr[2] == 1) {
126   e.value = v.substring(0, 8) + '0' + v.substring(8);
130 // Private subroutine for US phone number formatting.
131 function usphone(v) {
132  if (v.length > 0 && v.charAt(0) == '-') v = v.substring(1);
133  var oldlen = v.length;
134  for (var i = 0; i < v.length; ++i) {
135   var c = v.charAt(i);
136   if (c < '0' || c > '9') {
137    v = v.substring(0, i) + v.substring(i + 1);
138    --i;
139   }
141  if (oldlen > 3 && v.length >= 3) {
142   v = v.substring(0, 3) + '-' + v.substring(3);
143   if (oldlen > 7 && v.length >= 7) {
144    v = v.substring(0, 7) + '-' + v.substring(7);
145    if (v.length > 12) v = v.substring(0, 12);
146   }
148  return v;
151 // Private subroutine for non-US phone number formatting.
152 function nonusphone(v) {
153  for (var i = 0; i < v.length; ++i) {
154   var c = v.charAt(i);
155   if (c < '0' || c > '9') {
156    v = v.substring(0, i) + v.substring(i + 1);
157    --i;
158   }
160  return v;
163 // Telephone country codes that are exactly 2 digits.
164 var twodigitccs = '/20/30/31/32/33/34/36/39/40/41/43/44/45/46/47/48/49/51/52/53/54/55/56/57/58/60/61/62/63/64/65/66/81/82/84/86/90/91/92/93/94/95/98/';
166 // Onkeyup handler for phone numbers.  Helps to ensure a consistent
167 // format and to reduce typing errors.  defcc is the default telephone
168 // country code as a string.
170 function phonekeyup(e, defcc) {
171  var v = e.value;
172  var oldlen = v.length;
174  // Deal with international formatting.
175  if (v.length > 0 && v.charAt(0) == '+') {
176   var cc = '';
177   for (var i = 1; i < v.length; ++i) {
178    var c = v.charAt(i);
179    if (c < '0' || c > '9') {
180     v = v.substring(0, i) + v.substring(i + i);
181     --i;
182     continue;
183    }
184    cc += c;
185    if (i == 1 && oldlen > 2) {
186     if (cc == '1') { // USA
187      e.value = '+1-' + usphone(v.substring(2));
188      return;
189     }
190     if (cc == '7') { // USSR
191      e.value = '+7-' + nonusphone(v.substring(2));
192      return;
193     }
194    }
195    else if (i == 2 && oldlen > 3) {
196     if (twodigitccs.indexOf(cc) >= 0) {
197      e.value = v.substring(0, 3) + '-' + nonusphone(v.substring(3));
198      return;
199     }
200    }
201    else if (i == 3 && oldlen > 4) {
202     e.value = v.substring(0, 4) + '-' + nonusphone(v.substring(4));
203     return;
204    }
205   }
206   e.value = v;
207   return;
210  if (defcc == '1') {
211   e.value = usphone(v);
212  } else {
213   e.value = nonusphone(v);
216  return;