Bug 10541: enable cross-browser AJAX in additem.js
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / additem.js
1 function addItem( node, unique_item_fields ) {
2     var index = $(node).closest("div").attr('id');
3     var current_qty = parseInt($("#quantity").val());
4     var max_qty;
5     if($("#quantity_to_receive").length != 0){
6         max_qty = parseInt($("#quantity_to_receive").val());
7     } else  {
8         max_qty = 99999;
9     }
10     if ( $("#items_list table").find('tr[idblock="' + index + '"]').length == 0 ) {
11         if ( current_qty < max_qty ) {
12             if ( current_qty < max_qty - 1 )
13                 cloneItemBlock(index, unique_item_fields);
14             addItemInList(index, unique_item_fields);
15             $("#" + index).find("input[name='buttonPlus']").val("Update");
16             $("#quantity").val(current_qty + 1).change();
17         } else if ( current_qty >= max_qty ) {
18             alert(window.MSG_ADDITEM_JS_CANT_RECEIVE_MORE_ITEMS
19                 || "You can't receive any more items.");
20         }
21     } else {
22         if ( current_qty < max_qty )
23             cloneItemBlock(index, unique_item_fields);
24         var tr = constructTrNode(index);
25         $("#items_list table").find('tr[idblock="' + index + '"]:first').replaceWith(tr);
26     }
27     $("#" + index).hide();
28 }
29
30 function showItem(index) {
31     $("#outeritemblock").children("div").each(function(){
32         if ( $(this).attr('id') == index ) {
33             $(this).show();
34         } else {
35             if ( $("#items_list table").find('tr[idblock="' + $(this).attr('id') + '"]').length == 0 ) {
36                 $(this).remove();
37             } else {
38                 $(this).hide();
39             }
40         }
41     });
42 }
43
44 function constructTrNode(index, unique_item_fields) {
45     var fields = ['barcode', 'homebranch', 'holdingbranch', 'notforloan',
46         'restricted', 'location', 'itemcallnumber', 'copynumber',
47         'stocknumber', 'ccode', 'itype', 'materials', 'itemnotes'];
48
49     var result = "<tr idblock='" + index + "'>";
50     var edit_link = "<a href='#itemfieldset' style='text-decoration:none' onclick='showItem(\"" + index + "\");'>"
51         + (window.MSG_ADDITEM_JS_EDIT || "Edit") + "</a>";
52     var del_link = "<a style='cursor:pointer' "
53         + "onclick='deleteItemBlock(this, \"" + index + "\", \"" + unique_item_fields + "\");'>"
54         + (window.MSG_ADDITEM_JS_DELETE || "Delete") + "</a>";
55     result += "<td>" + edit_link + "</td>";
56     result += "<td>" + del_link + "</td>";
57     for(i in fields) {
58         var field = fields[i];
59         var field_elt = $("#" + index)
60             .find("[name='kohafield'][value='items."+field+"']")
61             .prevAll("[name='field_value']")[0];
62         var field_value;
63         if($(field_elt).is('select')) {
64             field_value = $(field_elt).find("option:selected").text();
65         } else {
66             field_value = $(field_elt).val();
67         }
68         if (field_value == undefined) {
69             field_value = '';
70         }
71         result += "<td>" + field_value + "</td>";
72     }
73     result += "</tr>";
74
75     return result;
76 }
77
78 function addItemInList(index, unique_item_fields) {
79     $("#items_list").show();
80     var tr = constructTrNode(index, unique_item_fields);
81     $("#items_list table tbody").append(tr);
82 }
83
84 function deleteItemBlock(node_a, index, unique_item_fields) {
85     $("#" + index).remove();
86     var current_qty = parseInt($("#quantity").val());
87     var max_qty;
88     if($("#quantity_to_receive").length != 0) {
89         max_qty = parseInt($("#quantity_to_receive").val());
90     } else {
91         max_qty = 99999;
92     }
93     $("#quantity").val(current_qty - 1).change();
94     $(node_a).parents('tr').remove();
95     if(current_qty - 1 == 0)
96         $("#items_list").hide();
97
98     if ( $("#quantity").val() <= max_qty - 1) {
99         if ( $("#outeritemblock").children("div :visible").length == 0 ) {
100             $("#outeritemblock").children("div:last").show();
101         }
102     }
103     if ( $("#quantity").val() == 0 && $("#outeritemblock > div").length == 0) {
104         cloneItemBlock(0, unique_item_fields);
105     }
106 }
107
108 function cloneItemBlock(index, unique_item_fields) {
109     var original;
110     if(index) {
111         original = $("#" + index); //original <div>
112     }
113     var dont_copy_fields = new Array();
114     if(unique_item_fields) {
115         var dont_copy_fields = unique_item_fields.split(' ');
116         for(i in dont_copy_fields) {
117             dont_copy_fields[i] = "items." + dont_copy_fields[i];
118         }
119     }
120
121     var random = Math.floor(Math.random()*100000); // get a random itemid.
122     var clone = $("<div id='itemblock"+random+"'></div>")
123     $.ajax({
124         url: "/cgi-bin/koha/services/itemrecorddisplay.pl",
125         dataType: 'html',
126         data: {
127             frameworkcode: 'ACQ'
128         },
129         success: function(data, textStatus, jqXHR) {
130             /* Create the item block */
131             $(clone).append(data);
132             /* Change all itemid fields value */
133             $(clone).find("input[name='itemid']").each(function(){
134                 $(this).val(random);
135             });
136             /* Add buttons + and Clear */
137             var buttonPlus = "<fieldset class=\"action\">";
138             var buttonPlusText = _("Add item");
139                 buttonPlus += '<input type="button" class="addItemControl" name="buttonPlus" style="cursor:pointer; margin:0 1em;" onclick="addItem(this,\'' + unique_item_fields + '\')" value="' + buttonPlusText + '" />';
140                 buttonPlus += '<a class="addItemControl cancel" name="buttonClear" style="cursor:pointer;" onclick="clearItemBlock(this)">' + (window.MSG_ADDITEM_JS_CLEAR || 'Clear') + '</a>';
141                 buttonPlus += "</fieldset>";
142             $(clone).append(buttonPlus);
143             /* Copy values from the original block (input) */
144             $(original).find("input[name='field_value']").each(function(){
145                 var kohafield = $(this).siblings("input[name='kohafield']").val();
146                 if($(this).val() && $.inArray(kohafield,dont_copy_fields) == -1) {
147                     $(this).parent("div").attr("id").match(/^(subfield.)/);
148                     var id = RegExp.$1;
149                     var value = $(this).val();
150                     $(clone).find("div[id^='"+id+"'] input[name='field_value']").val(value);
151                 }
152             });
153             /* Copy values from the original block (select) */
154             $(original).find("select[name='field_value']").each(function(){
155                 var kohafield = $(this).siblings("input[name='kohafield']").val();
156                 if($(this).val() && $.inArray(kohafield,dont_copy_fields) == -1) {
157                     $(this).parent("div").attr("id").match(/^(subfield.)/);
158                     var id = RegExp.$1;
159                     var value = $(this).val();
160                     $(clone).find("div[id^='"+id+"'] select[name='field_value']").val(value);
161                 }
162             });
163
164             $("#outeritemblock").append(clone);
165         }
166     });
167 }
168
169 function clearItemBlock(node) {
170     var index = $(node).closest("div").attr('id');
171     var block = $("#"+index);
172     $(block).find("input[type='text']").each(function(){
173         $(this).val("");
174     });
175     $(block).find("select").each(function(){
176         $(this).find("option:first").attr("selected", true);
177     });
178 }
179
180 function check_additem(unique_item_fields) {
181     var success = true;
182     var data = new Object();
183     data['field'] = new Array();
184     data['value'] = new Array();
185     var array_fields = unique_item_fields.split(' ');
186     $(".error").empty(); // Clear error div
187
188     // Check if a value is duplicated in form
189     for ( field in array_fields ) {
190         var fieldname = array_fields[field];
191         if (fieldname == '') {
192             continue;
193         }
194         var values = new Array();
195         $("[name='kohafield'][value='items."+ fieldname +"']").each(function(){
196             var input = $(this).prevAll("input[name='field_value']")[0];
197             if($(input).val()) {
198                 values.push($(input).val());
199                 data['field'].push(fieldname);
200                 data['value'].push($(input).val());
201             }
202         });
203
204         var sorted_arr = values.sort();
205         for (var i = 0; i < sorted_arr.length - 1; i += 1) {
206             if (sorted_arr[i + 1] == sorted_arr[i]) {
207                 $(".error").append(
208                     fieldname + " '" + sorted_arr[i] + "' "
209                     + (window.MSG_ADDITEM_JS_IS_DUPLICATE || "is duplicated")
210                     + "<br/>");
211                 success = false;
212             }
213         }
214     }
215
216     // If there is a duplication, we raise an error
217     if ( success == false ) {
218         $(".error").show();
219         return false;
220     }
221
222     $.ajax({
223         url: '/cgi-bin/koha/acqui/check_uniqueness.pl',
224         async: false,
225         dataType: 'json',
226         data: data,
227         success: function(data) {
228             for (field in data) {
229                 success = false;
230                 for (var i=0; i < data[field].length; i++) {
231                     var value = data[field][i];
232                     $(".error").append(
233                         field + " '" + value + "' "
234                         + (window.MSG_ADDITEM_JS_ALREADY_EXISTS_IN_DB
235                             || "already exists in database")
236                         + "<br />"
237                     );
238                 }
239             }
240         }
241     });
242
243     if ( success == false ) {
244         $(".error").show();
245     }
246     return success;
247 }
248