Bug 8215 - Add Course Reserves - QA Followup
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / additem.js
1 function addItem( node, unique_item_fields ) {
2     var index = $(node).parent().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("a[name='buttonPlus']").text("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 = '<a name="buttonPlus" style="cursor:pointer; margin:0 1em;" onclick="addItem(this,\'' + unique_item_fields + '\')">Add</a>';
138             var buttonClear = '<a name="buttonClear" style="cursor:pointer;" onclick="clearItemBlock(this)">' + (window.MSG_ADDITEM_JS_CLEAR || 'Clear') + '</a>';
139             $(clone).append(buttonPlus).append(buttonClear);
140             /* Copy values from the original block (input) */
141             $(original).find("input[name='field_value']").each(function(){
142                 var kohafield = $(this).siblings("input[name='kohafield']").val();
143                 if($(this).val() && dont_copy_fields.indexOf(kohafield) == -1) {
144                     $(this).parent("div").attr("id").match(/^(subfield.)/);
145                     var id = RegExp.$1;
146                     var value = $(this).val();
147                     $(clone).find("div[id^='"+id+"'] input[name='field_value']").val(value);
148                 }
149             });
150             /* Copy values from the original block (select) */
151             $(original).find("select[name='field_value']").each(function(){
152                 var kohafield = $(this).siblings("input[name='kohafield']").val();
153                 if($(this).val() && dont_copy_fields.indexOf(kohafield) == -1) {
154                     $(this).parent("div").attr("id").match(/^(subfield.)/);
155                     var id = RegExp.$1;
156                     var value = $(this).val();
157                     $(clone).find("div[id^='"+id+"'] select[name='field_value']").val(value);
158                 }
159             });
160
161             $("#outeritemblock").append(clone);
162         }
163     });
164 }
165
166 function clearItemBlock(node) {
167     var index = $(node).parent().attr('id');
168     var block = $("#"+index);
169     $(block).find("input[type='text']").each(function(){
170         $(this).val("");
171     });
172     $(block).find("select").each(function(){
173         $(this).find("option:first").attr("selected", true);
174     });
175 }
176
177 function check_additem(unique_item_fields) {
178     var success = true;
179     var data = new Object();
180     data['field'] = new Array();
181     data['value'] = new Array();
182     var array_fields = unique_item_fields.split(' ');
183     $(".error").empty(); // Clear error div
184
185     // Check if a value is duplicated in form
186     for ( field in array_fields ) {
187         var fieldname = array_fields[field];
188         if (fieldname == '') {
189             continue;
190         }
191         var values = new Array();
192         $("[name='kohafield'][value='items."+ fieldname +"']").each(function(){
193             var input = $(this).prevAll("input[name='field_value']")[0];
194             if($(input).val()) {
195                 values.push($(input).val());
196                 data['field'].push(fieldname);
197                 data['value'].push($(input).val());
198             }
199         });
200
201         var sorted_arr = values.sort();
202         for (var i = 0; i < sorted_arr.length - 1; i += 1) {
203             if (sorted_arr[i + 1] == sorted_arr[i]) {
204                 $(".error").append(
205                     fieldname + " '" + sorted_arr[i] + "' "
206                     + (window.MSG_ADDITEM_JS_IS_DUPLICATE || "is duplicated")
207                     + "<br/>");
208                 success = false;
209             }
210         }
211     }
212
213     // If there is a duplication, we raise an error
214     if ( success == false ) {
215         $(".error").show();
216         return false;
217     }
218
219     $.ajax({
220         url: '/cgi-bin/koha/acqui/check_uniqueness.pl',
221         async: false,
222         dataType: 'json',
223         data: data,
224         success: function(data) {
225             for (field in data) {
226                 success = false;
227                 for (var i=0; i < data[field].length; i++) {
228                     var value = data[field][i];
229                     $(".error").append(
230                         field + " '" + value + "' "
231                         + (window.MSG_ADDITEM_JS_ALREADY_EXISTS_IN_DB
232                             || "already exists in database")
233                         + "<br />"
234                     );
235                 }
236             }
237         }
238     });
239
240     if ( success == false ) {
241         $(".error").show();
242     }
243     return success;
244 }
245