Merge branch 'bug_8931' into 3.12-master
[koha.git] / koha-tmpl / intranet-tmpl / prog / en / js / cataloging.js
1 /*
2  * Unified file for catalogue edition
3  */
4
5 /* Functions developed for addbiblio.tt and authorities.tt */
6
7 // returns the fieldcode based upon tag div id
8 function getFieldCode(tagDivId){
9     // format : tag_<tagnumber>_...
10     return tagDivId.substr(3+1,3);
11 }
12
13 //returns the field and subfieldcode based upon subfield div id
14 function getFieldAndSubfieldCode(subfieldDivId){
15  // format : subfield<tagnumber><subfieldnumber>...
16     return subfieldDivId.substr(8,3+1);
17 }
18
19 //returns the subfieldcode based upon subfieldid writing
20 function getSubfieldCode(tagsubfieldid){
21     // 3 : tag +3 : tagnumber +4 : number of _ +8 subfield -1 begins at 0
22     return tagsubfieldid.substr(3+3+4+8-1,1);
23 }
24
25 // Take the base of tagsubfield information (removing the subfieldcodes and subfieldindexes)
26 // returns the filter
27 function getTagInputnameFilter(tagsubfieldid){
28     var tagsubfield=tagsubfieldid.substr(0,tagsubfieldid.lastIndexOf("_"));
29     var tagcode=tagsubfield.substr(tagsubfield.lastIndexOf("_"));
30     tagsubfield=tagsubfield.substr(0,tagsubfield.lastIndexOf("_"));
31     tagsubfield=tagsubfield.substr(0,tagsubfield.lastIndexOf("_"));
32     tagsubfield=tagsubfield+"_."+tagcode;
33     return tagsubfield;
34 }
35
36 // if source is "auth", we are editing an authority otherwise it is a biblio
37 function openAuth(tagsubfieldid,authtype,source) {
38     // let's take the base of tagsubfield information (removing the indexes and the codes
39     var element=document.getElementById(tagsubfieldid);
40     var tagsubfield=getTagInputnameFilter(tagsubfieldid);
41     var elementsubfcode=getSubfieldCode(element.name);
42     var mainmainstring=element.value;
43     var mainstring="";
44     var inputs = element.parentNode.parentNode.getElementsByTagName("input");
45
46     for (var myindex =0; myindex<inputs.length;myindex++){
47         if (inputs[myindex].name && inputs[myindex].name.match(tagsubfield)){
48             var subfieldcode=getSubfieldCode(inputs[myindex].name);
49             if (isNaN(parseInt(subfieldcode)) && inputs[myindex].value != "" && subfieldcode!=elementsubfcode){
50                 mainstring=inputs[myindex].value+" "+mainstring;
51             }
52         }
53     }
54     newin=window.open("../authorities/auth_finder.pl?source="+source+"&authtypecode="+authtype+"&index="+tagsubfieldid+"&value_mainstr="+encodeURI(mainmainstring)+"&value_main="+encodeURI(mainstring), "_blank",'width=700,height=550,toolbar=false,scrollbars=yes');
55 }
56
57 function ExpandField(index) {
58     var original = document.getElementById(index); //original <div>
59     var divs = original.getElementsByTagName('div');
60     for(var i=0,divslen = divs.length ; i<divslen ; i++){   // foreach div
61         if(divs[i].getAttribute('id').match(/^subfield/)){  // if it s a subfield
62             if (!divs[i].style.display) {
63                 // first time => show all subfields
64                 divs[i].style.display = 'block';
65             } else if (divs[i].style.display == 'none') {
66                 // show
67                 divs[i].style.display = 'block';
68             } else {
69                 // hide
70                 divs[i].style.display = 'none';
71             }
72         }
73     }
74 }
75 /**
76  * To clone a field
77  * @param hideMarc '0' for false, '1' for true
78  * @param advancedMARCEditor '0' for false, '1' for true
79  */
80 function CloneField(index, hideMarc, advancedMARCEditor) {
81     var original = document.getElementById(index); //original <div>
82     var clone = original.cloneNode(true);
83     var new_key = CreateKey();
84     var new_id  = original.getAttribute('id')+new_key;
85
86     clone.setAttribute('id',new_id); // setting a new id for the parent div
87
88     var divs = clone.getElementsByTagName('div');
89
90     // if hide_marc, indicators are hidden fields
91     // setting a new name for the new indicator
92     for(var i=0; i < 2; i++) {
93         var indicator = clone.getElementsByTagName('input')[i];
94         indicator.setAttribute('name',indicator.getAttribute('name')+new_key);
95     }
96
97     // settings all subfields
98     for(var i=0,divslen = divs.length ; i<divslen ; i++){      // foreach div
99         if(divs[i].getAttribute("id").match(/^subfield/)){  // if it s a subfield
100
101             // set the attribute for the new 'div' subfields
102             divs[i].setAttribute('id',divs[i].getAttribute('id')+new_key);
103
104             var inputs   = divs[i].getElementsByTagName('input');
105             var id_input = "";
106
107             for( j = 0 ; j < inputs.length ; j++ ) {
108                 if(inputs[j].getAttribute("id") && inputs[j].getAttribute("id").match(/^tag_/) ){
109                     inputs[j].value = "";
110                 }
111             }
112
113             inputs[0].setAttribute('id',inputs[0].getAttribute('id')+new_key);
114             inputs[0].setAttribute('name',inputs[0].getAttribute('name')+new_key);
115             var id_input;
116             try {
117                 id_input = inputs[1].getAttribute('id')+new_key;
118                 inputs[1].setAttribute('id',id_input);
119                 inputs[1].setAttribute('name',inputs[1].getAttribute('name')+new_key);
120             } catch(e) {
121                 try{ // it s a select if it is not an input
122                     var selects = divs[i].getElementsByTagName('select');
123                     id_input = selects[0].getAttribute('id')+new_key;
124                     selects[0].setAttribute('id',id_input);
125                     selects[0].setAttribute('name',selects[0].getAttribute('name')+new_key);
126                 }catch(e2){ // it is a textarea if it s not a select or an input
127                     var textaeras = divs[i].getElementsByTagName('textarea');
128                     id_input = textaeras[0].getAttribute('id')+new_key;
129                     textaeras[0].setAttribute('id',id_input);
130                     textaeras[0].setAttribute('name',textaeras[0].getAttribute('name')+new_key);
131                 }
132             }
133
134             if (advancedMARCEditor == '0') {
135                 // when cloning a subfield, re set its label too.
136                 var labels = divs[i].getElementsByTagName('label');
137                 labels[0].setAttribute('for',id_input);
138             }
139
140             if(hideMarc == '0') {
141                 // updating javascript parameters on button up
142                 var imgs = divs[i].getElementsByTagName('img');
143                 imgs[0].setAttribute('onclick',"upSubfield(\'"+divs[i].getAttribute('id')+"\');");
144             }
145
146             // setting its '+' and '-' buttons
147             try {
148                 var anchors = divs[i].getElementsByTagName('a');
149                 for (var j = 0; j < anchors.length; j++) {
150                     if(anchors[j].getAttribute('class') == 'buttonPlus'){
151                         anchors[j].setAttribute('onclick',"CloneSubfield('" + divs[i].getAttribute('id') + "','" + advancedMARCEditor + "'); return false;");
152                     } else if (anchors[j].getAttribute('class') == 'buttonMinus') {
153                         anchors[j].setAttribute('onclick',"UnCloneField('" + divs[i].getAttribute('id') + "'); return false;");
154                     }
155                 }
156             }
157             catch(e){
158                 // do nothig if ButtonPlus & CloneButtonPlus don t exist.
159             }
160
161             // button ...
162             var spans=0;
163             try {
164                 spans = divs[i].getElementsByTagName('a');
165             } catch(e) {
166                 // no spans
167             }
168             if(spans){
169                 var buttonDot;
170                 if(!CloneButtonPlus){ // it s impossible to have  + ... (buttonDot AND buttonPlus)
171                     buttonDot = spans[0];
172                     if(buttonDot){
173                         // 2 possibilities :
174                         try{
175                             var buttonDotOnClick = buttonDot.getAttribute('onclick');
176                             if(buttonDotOnClick.match('Clictag')){   // -1- It s a plugin
177                                 var re = /\('.*'\)/i;
178                                 buttonDotOnClick = buttonDotOnClick.replace(re,"('"+inputs[1].getAttribute('id')+"')");
179                                 if(buttonDotOnClick){
180                                     buttonDot.setAttribute('onclick',buttonDotOnClick);
181                                 }
182                             } else {
183                                 if(buttonDotOnClick.match('Dopop')) {  // -2- It's a auth value
184                                     var re1 = /&index=.*',/;
185                                     var re2 = /,.*\)/;
186
187                                     buttonDotOnClick = buttonDotOnClick.replace(re1,"&index="+inputs[1].getAttribute('id')+"',");
188                                     buttonDotOnClick = buttonDotOnClick.replace(re2,",'"+inputs[1].getAttribute('id')+"')");
189
190                                     if(buttonDotOnClick){
191                                             buttonDot.setAttribute('onclick',buttonDotOnClick);
192                                     }
193                                 }
194                             }
195                             try {
196                                 // do not copy the script section.
197                                 var script = spans[0].getElementsByTagName('script')[0];
198                                 spans[0].removeChild(script);
199                             } catch(e) {
200                                 // do nothing if there is no script
201                             }
202                         }catch(e){}
203                     }
204                 }
205             }
206             if(hideMarc == '0') {
207                 var buttonUp = divs[i].getElementsByTagName('img')[0];
208                 buttonUp.setAttribute('onclick',"upSubfield('" + divs[i].getAttribute('id') + "')");
209             }
210
211         } else { // it's a indicator div
212             if(divs[i].getAttribute('id').match(/^div_indicator/)){
213
214                 // setting a new id for the indicator div
215                 divs[i].setAttribute('id',divs[i].getAttribute('id')+new_key);
216
217                 var inputs = divs[i].getElementsByTagName('input');
218                 inputs[0].setAttribute('id',inputs[0].getAttribute('id')+new_key);
219                 inputs[1].setAttribute('id',inputs[1].getAttribute('id')+new_key);
220
221                 var CloneButtonPlus;
222                 try {
223                     var anchors = divs[i].getElementsByTagName('a');
224                     for (var j = 0; j < anchors.length; j++) {
225                         if (anchors[j].getAttribute('class') == 'buttonPlus') {
226                             anchors[j].setAttribute('onclick',"CloneField('" + new_id + "','" + hideMarc + "','" + advancedMARCEditor + "'); return false;");
227                         } else if (anchors[j].getAttribute('class') == 'buttonMinus') {
228                             anchors[j].setAttribute('onclick',"UnCloneField('" + new_id + "'); return false;");
229                         } else if (anchors[j].getAttribute('class') == 'expandfield') {
230                             anchors[j].setAttribute('onclick',"ExpandField('" + new_id + "'); return false;");
231                         }
232                     }
233                 }
234                 catch(e){
235                     // do nothig CloneButtonPlus doesn't exist.
236                 }
237
238             }
239         }
240     }
241
242     // insert this line on the page
243     original.parentNode.insertBefore(clone,original.nextSibling);
244 }
245
246 /**
247  * To clone a subfield
248  * @param index
249  * @param advancedMARCEditor '0' for false, '1' for true
250  */
251 function CloneSubfield(index, advancedMARCEditor){
252     var original = document.getElementById(index); //original <div>
253     var clone = original.cloneNode(true);
254     var new_key = CreateKey();
255
256     // set the attribute for the new 'div' subfields
257     var inputs     = clone.getElementsByTagName('input');
258     var selects    = clone.getElementsByTagName('select');
259     var textareas  = clone.getElementsByTagName('textarea');
260     var linkid;
261
262     // input
263     var id_input = "";
264     for(var i=0,len=inputs.length; i<len ; i++ ){
265         id_input = inputs[i].getAttribute('id')+new_key;
266         inputs[i].setAttribute('id',id_input);
267         inputs[i].setAttribute('name',inputs[i].getAttribute('name')+new_key);
268         linkid = id_input;
269     }
270
271     // select
272     for(var i=0,len=selects.length; i<len ; i++ ){
273         id_input = selects[i].getAttribute('id')+new_key;
274         selects[i].setAttribute('id',selects[i].getAttribute('id')+new_key);
275         selects[i].setAttribute('name',selects[i].getAttribute('name')+new_key);
276     }
277
278     // textarea
279     for(var i=0,len=textareas.length; i<len ; i++ ){
280         id_input = textareas[i].getAttribute('id')+new_key;
281         textareas[i].setAttribute('id',textareas[i].getAttribute('id')+new_key);
282         textareas[i].setAttribute('name',textareas[i].getAttribute('name')+new_key);
283     }
284
285     // Changing the "..." link's onclick attribute for plugin callback
286     var links  = clone.getElementsByTagName('a');
287     var link = links[0];
288     var buttonDotOnClick = link.getAttribute('onclick');
289     if(buttonDotOnClick.match('Clictag')){   // -1- It s a plugin
290     var re = /\('.*'\)/i;
291         buttonDotOnClick = buttonDotOnClick.replace(re,"('"+linkid+"')");
292         if(buttonDotOnClick){
293         link.setAttribute('onclick',buttonDotOnClick);
294         }
295     }
296
297     if(advancedMARCEditor == '0') {
298         // when cloning a subfield, reset its label too.
299         var label = clone.getElementsByTagName('label')[0];
300         label.setAttribute('for',id_input);
301     }
302
303     // setting a new id for the parent div
304     var new_id  = original.getAttribute('id')+new_key;
305     clone.setAttribute('id',new_id);
306
307     try {
308         var buttonUp = clone.getElementsByTagName('img')[0];
309         buttonUp.setAttribute('onclick',"upSubfield('" + new_id + "')");
310         var anchors = clone.getElementsByTagName('a');
311         if(anchors.length){
312             for(var i = 0 ,lenanchors = anchors.length ; i < lenanchors ; i++){
313                 if(anchors[i].getAttribute('class') == 'buttonPlus'){
314                     anchors[i].setAttribute('onclick',"CloneSubfield('" + new_id + "','" + advancedMARCEditor + "'); return false;");
315                 } else if (anchors[i].getAttribute('class') == 'buttonMinus') {
316                     anchors[i].setAttribute('onclick',"UnCloneField('" + new_id + "'); return false;");
317                 }
318             }
319         }
320     }
321     catch(e){
322         // do nothig if ButtonPlus & CloneButtonPlus don't exist.
323     }
324     // insert this line on the page
325     original.parentNode.insertBefore(clone,original.nextSibling);
326 }
327
328  /**
329  * This function removes or clears unwanted subfields
330  */
331 function UnCloneField(index) {
332     var original = document.getElementById(index);
333     var canUnclone = false;
334     if ($(original).hasClass("tag")) {
335         // unclone a field, check if there will remain one field
336         var fieldCode = getFieldCode(index);
337         // tag divs with id begining with original field code
338         var cloneFields = $('.tag[id^="tag_'+fieldCode+'"]');
339         if (cloneFields.length > 1) {
340             canUnclone = true;
341         }
342     } else {
343         // unclone a subfield, check if there will remain one subfield
344         var subfieldCode = getFieldAndSubfieldCode(index);
345         // subfield divs with id begining with original field and subfield field code
346         var cloneSubfields = $('.subfield_line[id^="subfield'+subfieldCode+'"]');
347         if (cloneSubfields.length > 1) {
348             canUnclone = true;
349         }
350     }
351     if (canUnclone) {
352         // remove clone
353         original.parentNode.removeChild(original);
354     } else {
355         // clear inputs, but don't delete
356         $(":input.input_marceditor", original).each(function(){
357             // thanks to http://www.learningjquery.com/2007/08/clearing-form-data for
358             // hint about clearing selects correctly
359             var type = this.type;
360             var tag = this.tagName.toLowerCase();
361             if (type == 'text' || type == 'password' || tag == 'textarea') {
362                 this.value = "";
363             } else if (type == 'checkbox' || type == 'radio') {
364                 this.checked = false;
365             } else if (tag == 'select') {
366                 this.selectedIndex = -1;
367             }
368         });
369         $(":input.indicator", original).val("");
370     }
371 }
372
373 /**
374  * This function create a random number
375  */
376 function CreateKey(){
377     return parseInt(Math.random() * 100000);
378 }
379
380 /**
381  * This function allows to move a subfield up by clickink on the 'up' button .
382  */
383 function upSubfield(index) {
384     try{
385         var line = document.getElementById(index); // get the line where the user has clicked.
386     } catch(e) {
387         return; // this line doesn't exist...
388     }
389     var tag = line.parentNode; // get the dad of this line. (should be "<div id='tag_...'>")
390
391     // getting all subfields for this tag
392     var subfields = tag.getElementsByTagName('div');
393     var subfieldsLength = subfields.length;
394
395     if(subfieldsLength<=1) return; // nothing to do if there is just one subfield.
396
397     // among all subfields
398     for(var i=0;i<subfieldsLength;i++){
399         if(subfields[i].getAttribute('id') == index){ //looking for the subfield which is clicked :
400             if(i==1){ // if the clicked subfield is on the top
401                 tag.appendChild(subfields[1]);
402                 return;
403             } else {
404                 var lineAbove = subfields[i-1];
405                 tag.insertBefore(line,lineAbove);
406                 return;
407             }
408         }
409     }
410 }
411
412 // FIXME :: is it used ?
413 function unHideSubfield(index,labelindex) {
414     subfield = document.getElementById(index);
415     subfield.style.display = 'block';
416     label = document.getElementById(labelindex);
417     label.style.display='none';
418 }
419
420 /* Functions developed for additem.tt */
421
422 /**
423  * To clone a subfield.<br>
424  * @param original subfield div to clone
425  */
426 function CloneItemSubfield(original){
427     var clone = original.cloneNode(true);
428     var new_key = CreateKey();
429
430     // set the attribute for the new 'div' subfields
431     var inputs     = clone.getElementsByTagName('input');
432     var selects    = clone.getElementsByTagName('select');
433     var textareas  = clone.getElementsByTagName('textarea');
434
435     // input (except hidden type)
436     var id_input = "";
437     for(var i=0,len=inputs.length; i<len ; i++ ){
438         if (inputs[i].getAttribute('type') != 'hidden') {
439             id_input = inputs[i].getAttribute('id')+new_key;
440             inputs[i].setAttribute('id',id_input);
441         }
442     }
443
444     // select
445     for(var i=0,len=selects.length; i<len ; i++ ){
446         id_input = selects[i].getAttribute('id')+new_key;
447         selects[i].setAttribute('id',selects[i].getAttribute('id')+new_key);
448     }
449
450     // textarea
451     for(var i=0,len=textareas.length; i<len ; i++ ){
452         id_input = textareas[i].getAttribute('id')+new_key;
453         textareas[i].setAttribute('id',textareas[i].getAttribute('id')+new_key);
454     }
455
456     // when cloning a subfield, reset its label too.
457     var label = clone.getElementsByTagName('label')[0];
458     label.setAttribute('for',id_input);
459
460     // setting a new if for the parent div
461     var new_id = original.getAttribute('id')+new_key;
462     clone.setAttribute('id',new_id);
463
464     // insert this line on the page
465     original.parentNode.insertBefore(clone,original.nextSibling);
466 }