internationalized units in vitals form - supports both us and metric units
[openemr.git] / library / textformat.js
blob45a503cc2b308f94eba60e51a1758dbf23d3115a
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) {
12  while(true) {
13   var delim = '';
14   var arr = new Array(0, 0, 0);
15   var ix = 0;
16   var v = e.value;
18   // Build an array to facilitate error checking.
19   for (var i = 0; i < v.length; ++i) {
20    var c = v.charAt(i);
21    if (c >= '0' && c <= '9') {
22     ++arr[ix];
23    } else if (c == '-' || c == '/') {
24     arr[++ix] = 0;
25    } else {
26     e.value = v.substring(0, i);
27     return;
28    }
29   }
31   // We have finished scanning the string.  If there is a problem,
32   // drop the last character and repeat the loop.
33   if ((ix > 2) ||
34       (ix > 1 && arr[1] == 0) ||
35       (ix > 0 && arr[0] == 0) ||
36       (arr[0] > 8) ||
37       (ix > 0 && arr[0] > 2 && (arr[0] != 4 || arr[1] > 2 || arr[2] > 2)) ||
38       (arr[2] > 2 && (arr[2] > 4 || arr[0] > 2 || arr[1] > 2)))
39   {
40    e.value = v.substring(0, v.length - 1);
41   } else {
42    break;
43   }
44  }
46  if (arr[2] == 4 && defcc == '1') { // mm/dd/yyyy
47   e.value  = v.substring(arr[0] + arr[1] + 2) + '-'; // year
48   if (arr[0] == 1) e.value += '0';
49   e.value += v.substring(0, arr[0]) + '-'; // month
50   if (arr[1] == 1) e.value += '0';
51   e.value += v.substring(arr[0] + 1, arr[0] + 1 + arr[1]); // day
52  }
53  else if (arr[2] == 4) { // dd-mm-yyyy
54   e.value  = v.substring(arr[0] + arr[1] + 2) + '-'; // year
55   if (arr[1] == 1) e.value += '0';
56   e.value += v.substring(arr[0] + 1, arr[0] + 1 + arr[1]) + '-'; // month
57   if (arr[0] == 1) e.value += '0';
58   e.value += v.substring(0, arr[0]); // day
59  }
60  else if (arr[0] == 4 && arr[2] > 0) { // yyyy-mm-dd
61   e.value  = v.substring(0, arr[0]) + '-'; // year
62   if (arr[1] == 1) e.value += '0';
63   e.value += v.substring(arr[0] + 1, arr[0] + 1 + arr[1]) + '-'; // month
64   e.value += v.substring(arr[0] + arr[1] + 2); // day (may be 1 digit)
65  }
66  else if (arr[0] == 8 && defcc == '1') { // yyyymmdd
67   e.value  = v.substring(0, 4) + '-'; // year
68   e.value += v.substring(4, 6) + '-'; // month
69   e.value += v.substring(6); // day
70  }
71  else if (arr[0] == 8) { // ddmmyyyy
72   e.value  = v.substring(4) + '-'; // year
73   e.value += v.substring(2, 4) + '-'; // month
74   e.value += v.substring(0, 2); // day
75  }
78 // Private subroutine for US phone number formatting.
79 function usphone(v) {
80  if (v.length > 0 && v.charAt(0) == '-') v = v.substring(1);
81  var oldlen = v.length;
82  for (var i = 0; i < v.length; ++i) {
83   var c = v.charAt(i);
84   if (c < '0' || c > '9') {
85    v = v.substring(0, i) + v.substring(i + 1);
86    --i;
87   }
88  }
89  if (oldlen > 3 && v.length >= 3) {
90   v = v.substring(0, 3) + '-' + v.substring(3);
91   if (oldlen > 7 && v.length >= 7) {
92    v = v.substring(0, 7) + '-' + v.substring(7);
93    if (v.length > 12) v = v.substring(0, 12);
94   }
95  }
96  return v;
99 // Private subroutine for non-US phone number formatting.
100 function nonusphone(v) {
101  for (var i = 0; i < v.length; ++i) {
102   var c = v.charAt(i);
103   if (c < '0' || c > '9') {
104    v = v.substring(0, i) + v.substring(i + 1);
105    --i;
106   }
108  return v;
111 // Telephone country codes that are exactly 2 digits.
112 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/';
114 // Onkeyup handler for phone numbers.  Helps to ensure a consistent
115 // format and to reduce typing errors.  defcc is the default telephone
116 // country code as a string.
118 function phonekeyup(e, defcc) {
119  var v = e.value;
120  var oldlen = v.length;
122  // Deal with international formatting.
123  if (v.length > 0 && v.charAt(0) == '+') {
124   var cc = '';
125   for (var i = 1; i < v.length; ++i) {
126    var c = v.charAt(i);
127    if (c < '0' || c > '9') {
128     v = v.substring(0, i) + v.substring(i + i);
129     --i;
130     continue;
131    }
132    cc += c;
133    if (i == 1 && oldlen > 2) {
134     if (cc == '1') { // USA
135      e.value = '+1-' + usphone(v.substring(2));
136      return;
137     }
138     if (cc == '7') { // USSR
139      e.value = '+7-' + nonusphone(v.substring(2));
140      return;
141     }
142    }
143    else if (i == 2 && oldlen > 3) {
144     if (twodigitccs.indexOf(cc) >= 0) {
145      e.value = v.substring(0, 3) + '-' + nonusphone(v.substring(3));
146      return;
147     }
148    }
149    else if (i == 3 && oldlen > 4) {
150     e.value = v.substring(0, 4) + '-' + nonusphone(v.substring(4));
151     return;
152    }
153   }
154   e.value = v;
155   return;
158  if (defcc == '1') {
159   e.value = usphone(v);
160  } else {
161   e.value = nonusphone(v);
164  return;