2 /* This include is just a HTML and JS *fragment* it CANNOT stand alone
4 * This file is used to include the capability to have a pop-up DIV in which
5 * a user can add a new option to a list box. Primarily this is for the
6 * demographics, history, and referral screens. This code could be used elsewhere
7 * as long as it had the required supporting HTML and JS
9 * REQUIRED to make work:
11 * - form element with the class '.addtolist'
12 * - be used in a file that already includes globals.php
17 <!-- hidden DIV used for creating new list items -->
18 <div id="newlistitem" class="body_top" style="border: 2px outset #666; display:none; position:absolute; padding:5px; ">
19 <input type="hidden" name="newlistitem_listid" id="newlistitem_listid" value="">
20 <input type="hidden" name="newlistitem_fieldid" id="newlistitem_fieldid" value="">
21 <div id="specificForm">
23 <div style = 'text-align:center;'>
24 <div style='margin:0.5em 0 0 0;'>
25 <input type='button' name='newlistitem_submit' id='newlistitem_submit' value='<?php xl('Add','e'); ?>'>
26 <input type='button' name='newlistitem_cancel' id='newlistitem_cancel' value='<?php xl('Cancel','e'); ?>'>
32 <script language="javascript">
34 // collect the custom state widget flag
35 var stateCustomFlag = "<?php echo $GLOBALS['state_custom_addlist_widget']; ?>"
37 // generic form for input box
38 var generic = "<input type='textbox' name='newlistitem_value' id='newlistitem_value' size='20' maxlength='50'>"
40 // state form for input box
42 <ul style='list-style-type:none; margin:0; padding:0;'>\
43 <li style='font-weight:bold; font-size:120%; text-align:center;'>\
44 <?php echo htmlspecialchars(xl('Enter new State'),ENT_NOQUOTES); ?></li>\
45 <li style='margin:0.5em 0 0 0; padding:0;'>\
46 <?php echo htmlspecialchars(xl('Full Name', '', '', ':'),ENT_NOQUOTES); ?>\
47 <input type='textbox' name='newlistitem_value' id='newlistitem_value' size='20' maxlength='50'><li>\
48 <li style='margin:0.5em 0 0 0; padding:0;'>\
49 <?php echo htmlspecialchars(xl('Abbreviation', '', '', ':'),ENT_NOQUOTES); ?>\
50 <input type='textbox' name='newlistitem_abbr' id='newlistitem_abbr' size='10' maxlength='50'><li>\
54 // jQuery makes life easier (sometimes)
56 $(document).ready(function(){
58 /********************************************************/
59 /************ List-box modification functions ***********/
60 /********************************************************/
62 $("#newlistitem").keypress(function(evt) { if (evt.keyCode == 13) { SaveNewListItem(this, evt); return false; }});
63 $(".addtolist").click(function(evt) { AddToList(this, evt); });
64 $("#newlistitem_submit").click(function(evt) { SaveNewListItem(this, evt); });
65 $("#newlistitem_cancel").click(function(evt) { CancelAddToList(this, evt); });
67 // display the 'new list item' DIV at the mouse position
68 var AddToList = function(btnObj, e) {
69 // capture the ID of the list and specific field being modified from the object's ID
70 $('#newlistitem_listid').val($(btnObj).attr("id").replace(/^addtolistid_/g, ""));
71 $('#newlistitem_fieldid').val($(btnObj).attr("fieldid"));
73 // REMOVE previous form
74 $("#specificForm").empty();
76 // INSERT the selected form
77 if (($("#newlistitem_listid").val() == "state") && (stateCustomFlag)) {
78 // insert state form and clear values
79 $("#specificForm").append(state);
80 $('#newlistitem_value').val("");
81 $('#newlistitem_abbr').val("");
84 // insert generic form and clear values
85 $("#specificForm").append(generic);
86 $('#newlistitem_value').val("");
89 // make the item visible before setting its x,y location
90 $('#newlistitem').css('display', 'inline');
91 //getting height and width of the message box
92 var height = $('#newlistitem').height();
93 var width = $('#newlistitem').width();
94 //calculating offset for displaying popup message
95 leftVal=e.pageX-(width/2)+"px";
96 topVal=e.pageY-(height/2)+"px";
97 //show the DIV and set cursor focus
98 $('#newlistitem').css({left:leftVal,top:topVal}).show();
99 $('#newlistitem_value').focus();
102 // hide the add-to-list DIV and clear its textbox
103 var CancelAddToList = function(btnObj, e) {
104 $('#newlistitem').hide();
107 // save the new list item to the given list
108 var SaveNewListItem = function(btnObj, e) {
109 // VALIDATE the selected form
110 // Don't allow a number as first character
111 // Don't allow illegal characters (' and " for now) - still developing
112 // First, validate fields common to all forms
113 if ($("#newlistitem_value").val().match(/^\d/)) {
114 alert("<?php echo htmlspecialchars(xl('List items can not start with a number.'),ENT_QUOTES); ?>");
115 $("#newlistitem_value").focus();
118 if ($("#newlistitem_value").val().match(/[\'\"]/)) {
119 alert("<?php echo htmlspecialchars(xl('List items contains illegal character(s).'),ENT_QUOTES); ?>");
120 $("#newlistitem_value").focus();
123 // Second, validate form specific fields
124 if (($("#newlistitem_listid").val() == "state") && (stateCustomFlag)) {
125 // state forms specific validation
126 if ($("#newlistitem_abbr").val().match(/^\d/)) {
127 alert("<?php echo htmlspecialchars(xl('List items can not start with a number.'),ENT_QUOTES); ?>");
128 $("#newlistitem_abbr").focus();
131 if ($("#newlistitem_abbr").val().match(/[\'\"]/)) {
132 alert("<?php echo htmlspecialchars(xl('List items contains illegal character(s).'),ENT_QUOTES); ?>");
133 $("#newlistitem_abbr").focus();
138 // PROCESS the selected form
139 if (($("#newlistitem_listid").val() == "state") && (stateCustomFlag)) {
140 // process state form
141 // (note we have collected a title and abbreviation)
142 var listid = $("#newlistitem_listid").val();
143 var newitem = $('#newlistitem_value').val();
144 var newitem_abbr = $('#newlistitem_abbr').val();
148 // process generic form
149 // (note we have only collected the title, so will make
150 // abbreviation same as title)
151 var listid = $("#newlistitem_listid").val();
152 var newitem = $('#newlistitem_value').val();
153 var newitem_abbr = $('#newlistitem_value').val();
156 // make the AJAX call to save the new value to the specified list
157 // upon returning successfully, refresh the list box and select
159 $.getJSON("<?php echo $GLOBALS['webroot']; ?>/library/ajax/addlistitem.php",
162 newitem_abbr: newitem_abbr},
163 function(jsondata, txtresponse) {
164 if( jsondata.error == '' ){
165 //process each widget with the same list
166 $("select.addtolistclass_"+listid).each(function(){
167 var pointer = $(this);
168 var currentselected = pointer.val();
169 var listboxfield = pointer.attr("id");
170 var listbox = document.getElementById(listboxfield);
171 while (listbox.options.length > 0) { listbox.options[0] = null; }
172 $.each(jsondata.options, function () {
173 if (listboxfield == $('#newlistitem_fieldid').val()) {
174 // build select for the chosen widget field
175 listbox.options[listbox.options.length] = new Option(this.title, this.id);
176 if (this.id == newitem_abbr) {
177 pointer.val(this.id);
181 // build select for the other widgets using the same list
182 listbox.options[listbox.options.length] = new Option(this.title, this.id);
183 if (this.id == currentselected) {
184 pointer.val(currentselected);
191 $('#newlistitem').hide();
194 alert( jsondata.error );
199 } // end SaveNewListItem
201 }); // end jQuery .ready