Eye Form tweaks
[openemr.git] / library / options.js.php
blobf5c352545b2d8a4eb9811541a8584f989af5fa3b
1 <?php
2 // Copyright (C) 2014-2016 Rod Roark <rod@sunsetsystems.com>
3 //
4 // This program is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU General Public License
6 // as published by the Free Software Foundation; either version 2
7 // of the License, or (at your option) any later version.
8 //
9 // This is the place to put JavaScript functions that are needed to support
10 // options.inc.php. Include this in the <head> section of relevant modules.
11 // It's a .php module so that translation can be supported.
13 <script type="text/javascript">
15 // JavaScript support for date types when the A or B edit option is used.
16 // Called to recompute displayed age dynamically when the corresponding date is
17 // changed. Must generate the same age formats as the oeFormatAge() function.
19 function updateAgeString(fieldid, asof, format) {
20 var datefld = document.getElementById('form_' + fieldid);
21 var f = datefld.form;
22 var age = '';
23 var date1 = new Date(datefld.value);
24 var date2 = asof ? new Date(asof) : new Date();
25 if (format == 3) {
26 // Gestational age.
27 var msecs = date2.getTime() - date1.getTime();
28 var days = Math.round(msecs / (24 * 60 * 60 * 1000));
29 var weeks = Math.floor(days / 7);
30 days = days % 7;
31 age = '<?php echo xls('Gest age') ?> ' +
32 weeks + (weeks == 1 ? ' <?php echo xls('week') ?>' : ' <?php echo xls('weeks') ?>') + ' ' +
33 days + (days == 1 ? ' <?php echo xls('day' ) ?>' : ' <?php echo xls('days' ) ?>');
35 else {
36 // Years or months.
37 var dayDiff = date2.getDate() - date1.getDate();
38 var monthDiff = date2.getMonth() - date1.getMonth();
39 var yearDiff = date2.getFullYear() - date1.getFullYear();
40 var ageInMonths = yearDiff * 12 + monthDiff;
41 if (dayDiff < 0) --ageInMonths;
42 if (format == 1 || (format == 0 && ageInMonths >= 24)) {
43 age = yearDiff;
44 if (monthDiff < 0 || (monthDiff == 0 && dayDiff < 0)) --age;
45 age = '' + age;
47 else {
48 age = '' + ageInMonths;
49 if (format == 0) {
50 age = age + ' ' + (ageInMonths == 1 ? '<?php echo xls('month') ?>' : '<?php echo xls('months') ?>');
53 if (age != '') age = '<?php echo xls('Age') ?> ' + age;
55 document.getElementById('span_' + fieldid).innerHTML = age;
58 // Function to show or hide form fields (and their labels) depending on "skip conditions"
59 // defined in the layout.
61 var cskerror = false; // to avoid repeating error messages
62 function checkSkipConditions() {
64 var myerror = cskerror;
65 var prevandor = '';
66 var prevcond = false;
67 for (var i = 0; i < skipArray.length; ++i) {
68 var target = skipArray[i].target;
69 var id = skipArray[i].id;
70 var itemid = skipArray[i].itemid;
71 var operator = skipArray[i].operator;
72 var value = skipArray[i].value;
73 var is_radio = false;
74 var tofind = id;
76 if (itemid) tofind += '[' + itemid + ']';
77 // Some different source IDs are possible depending on the data type.
78 var srcelem = document.getElementById('check_' + tofind);
79 var radio_id='form_' + tofind + '[' + value + ']';
80 if(typeof document.getElementById(radio_id)!=="undefined"){
81 srcelem = document.getElementById(radio_id);
82 if(srcelem != null){
83 is_radio = true;
86 if (srcelem == null) srcelem = document.getElementById('radio_' + tofind);
87 if (srcelem == null) srcelem = document.getElementById('form_' + tofind) ;
89 if (srcelem == null) srcelem = document.getElementById('text_' + tofind);
91 if (srcelem == null) {
92 if (!cskerror) alert('<?php echo xls('Cannot find a skip source field for'); ?> "' + tofind + '"');
93 myerror = true;
94 continue;
97 var condition = false;
98 var is_multiple = false;
99 var elem_val;
100 if ( is_radio){
101 for (var k = 0; k < document.getElementsByName('form_' + tofind).length; k++){
102 if (document.getElementsByName('form_' + tofind)[k].checked){
103 elem_val= document.getElementsByName('form_' + tofind)[k].value;
106 }else if( typeof srcelem.options!=="undefined" && srcelem.type == 'select-one' ){
107 elem_val=srcelem.options[srcelem.selectedIndex].value;
109 }else if( srcelem.type == 'select-multiple' ) {
110 elem_val = new Array();
111 is_multiple = true;
112 for (var k = 0; k < srcelem.length; k++) {
113 if (srcelem.options[k].selected) {
114 if( elem_val.indexOf(srcelem.options[k].value)<0) {
115 elem_val.push(srcelem.options[k].value);
119 } else {
120 elem_val=srcelem.value;
122 if(elem_val == null) {
123 elem_val = srcelem.getAttribute("data-value");
124 if( elem_val !== null && elem_val.indexOf("|") !== -1 ) {
125 elem_val = elem_val.split("|");
126 is_multiple = true;
129 if(elem_val == null) elem_val = srcelem.innerText;
131 //this is a feature fix for the multiple select list option
132 //collect all the multiselect control values:
133 if( is_multiple ) {
134 switch(operator) {
135 case 'eq':
136 condition = (-1 !== elem_val.indexOf(value));break;
137 case 'ne':
138 condition = (-1 == elem_val.indexOf(value)); break;
139 case 'se':
140 condition = srcelem.checked ; break; // doesn't make sense?
141 case 'ns':
142 condition = !srcelem.checked; break;
145 } else {
146 if (operator == 'eq') condition = elem_val == value; else
147 if (operator == 'ne') condition = elem_val != value; else
148 if (operator == 'se') condition = srcelem.checked ; else
149 if (operator == 'ns') condition = !srcelem.checked;
152 // Logic to accumulate multiple conditions for the same target.
153 // alert('target = ' + target + ' prevandor = ' + prevandor + ' prevcond = ' + prevcond); // debugging
154 if (prevandor == 'and') condition = condition && prevcond; else
155 if (prevandor == 'or' ) condition = condition || prevcond;
156 prevandor = skipArray[i].andor;
157 prevcond = condition;
158 var j = i + 1;
159 if (j < skipArray.length && skipArray[j].target == target) continue;
161 // At this point condition indicates if the target should be hidden.
163 var trgelem1 = document.getElementById('label_id_' + target);
164 var trgelem2 = document.getElementById('value_id_' + target);
166 if (trgelem1 == null && trgelem2 == null) {
167 var trgelem1 = document.getElementById('label_' + target);
168 var trgelem2 = document.getElementById('text_' + target);
169 if(trgelem2 == null){
170 trgelem2 = document.getElementById('form_' + target);
172 if (trgelem1 == null && trgelem2 == null) {
173 if (!cskerror) alert('<?php echo xls('Cannot find a skip target field for'); ?> "' + target + '"');
174 myerror = true;
175 continue;
178 // If the item occupies a whole row then undisplay its row, otherwise hide its cells.
179 var colspan = 0;
180 if (trgelem1 && trgelem1.colSpan !=undefined )
181 colspan += trgelem1.colSpan;
182 if (trgelem2 && trgelem2.colSpan !=undefined)
183 colspan += trgelem2.colSpan;
184 if (colspan < 4) {
185 if (trgelem1) trgelem1.style.visibility = condition ? 'hidden' : 'visible';
186 if (trgelem2) trgelem2.style.visibility = condition ? 'hidden' : 'visible';
188 else {
189 if (trgelem1) trgelem1.parentNode.style.display = condition ? 'none' : '';
190 else trgelem2.parentNode.style.display = condition ? 'none' : '';
193 // If any errors, all show in the first pass and none in subsequent passes.
194 cskerror = cskerror || myerror;
197 ///////////////////////////////////////////////////////////////////////
198 // Image canvas support starts here.
199 ///////////////////////////////////////////////////////////////////////
201 var lbfCanvases = {}; // contains the LC instance for each canvas.
203 // Initialize the drawing widget.
204 // canid is the id of the div that will contain the canvas, and the image
205 // element used for initialization should have an id of canid + '_img'.
207 function lbfCanvasSetup(canid, canWidth, canHeight) {
208 LC.localize({
209 "stroke" : "<?php echo xls('stroke' ); ?>",
210 "fill" : "<?php echo xls('fill' ); ?>",
211 "bg" : "<?php echo xls('bg' ); ?>",
212 "Clear" : "<?php echo xls('Clear' ); ?>",
213 // The following are tooltip translations, however they do not work due to
214 // a bug in LiterallyCanvas 0.4.13. We'll leave them here pending a fix.
215 "Eraser" : "<?php echo xls('Eraser' ); ?>",
216 "Pencil" : "<?php echo xls('Pencil' ); ?>",
217 "Line" : "<?php echo xls('Line' ); ?>",
218 "Rectangle" : "<?php echo xls('Rectangle' ); ?>",
219 "Ellipse" : "<?php echo xls('Ellipse' ); ?>",
220 "Text" : "<?php echo xls('Text' ); ?>",
221 "Polygon" : "<?php echo xls('Polygon' ); ?>",
222 "Pan" : "<?php echo xls('Pan' ); ?>",
223 "Eyedropper": "<?php echo xls('Eyedropper'); ?>",
224 "Undo" : "<?php echo xls('Undo' ); ?>",
225 "Redo" : "<?php echo xls('Redo' ); ?>",
226 "Zoom out" : "<?php echo xls('Zoom out' ); ?>",
227 "Zoom in" : "<?php echo xls('Zoom in' ); ?>",
229 var tmpImage = document.getElementById(canid + '_img');
230 var shape = LC.createShape('Image', {x: 0, y: 0, image: tmpImage});
231 var lc = LC.init(document.getElementById(canid), {
232 imageSize: {width: canWidth, height: canHeight},
233 strokeWidths: [1, 2, 3, 5, 8, 12],
234 defaultStrokeWidth: 2,
235 backgroundShapes: [shape],
236 imageURLPrefix: '<?php echo $GLOBALS['assets_static_relative'] ?>/literallycanvas-0-4-13/img'
238 if (canHeight > 261) {
239 // TBD: Do something to make the widget bigger?
240 // Look for some help with this in the next LC release.
242 // lc.saveShape(shape); // alternative to the above backgroundShapes
243 lbfCanvases[canid] = lc;
246 // This returns a standard "Data URL" string representing the image data.
247 // It will typically be a few kilobytes. Here's a truncated example:
248 // data:image/png;base64,iVBORw0K ...
250 function lbfCanvasGetData(canid) {
251 return lbfCanvases[canid].getImage().toDataURL();
254 </script>